Skip to content

Commit eecc1ac

Browse files
committed
✨ Add realtime hook define function
1 parent 4cc4c34 commit eecc1ac

8 files changed

Lines changed: 38 additions & 81 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
- **不兼容改动** `AV.Insight.on` 注册的回调函数改为只接受一个 `result` 参数(去掉了 err 参数,请从 `result.status` 判断成功或失败)。
1313
- **不兼容改动** 一些错误提示被调整过,如果你依赖于对错误信息进行字符串匹配,请注意测试你的错误处理逻辑。
1414
- 新增 TypeScript 类型定义文件,位于 `leanengine.d.ts`
15+
- 新增 `AV.Cloud.onIMMessageReceived` 系列方法,用于更方便地定义实时通讯 Hook 函数。
1516

1617
**新增云函数、Class Hook 和 User Hook 的 Promise 模式**,会使用 Promise 的值作为响应内容。如果在 Promise 中抛了使用新增的 `AV.Cloud.Error` 构造的异常则作为错误返回给客户端,`AV.Cloud.Error` 的第二个参数可以指定 HTTP Status Code 和 Error Code(`AV.Cloud.Error('posts is empty', {status: 422, code: 422})`);如果抛出了其他错误类型则视作服务器端错误,返回 500 响应并打印错误到标准输出。
1718

leanengine.d.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,14 @@ declare module 'leanengine' {
115115
export function onVerified(handler: UserHookFunction): void;
116116
export function onLogin(handler: UserHookFunction): void;
117117

118+
export function onIMMessageReceived(handler: CloudFunction): void;
119+
export function onIMReceiversOffline(handler: CloudFunction): void;
120+
export function onIMMessageSent(handler: CloudFunction): void;
121+
export function onIMConversationStart(handler: CloudFunction): void;
122+
export function onIMConversationStarted(handler: CloudFunction): void;
123+
export function onIMConversationAdd(handler: CloudFunction): void;
124+
export function onIMConversationUpdate(handler: CloudFunction): void;
125+
118126
export function LeanCloudHeaders(options?: MiddlewareOptions): RequestHandler;
119127
export function CookieSession(options?: CookieSessionOptions): RequestHandler;
120128
export function HttpsRedirect(options?: MiddlewareOptions): RequestHandler;

lib/cloud.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ Cloud.onLogin = function(func) {
112112
Cloud.define('__on_login__User', func);
113113
};
114114

115+
_.each(utils.realtimeHookMapping, (metadataName, hookName) => {
116+
Cloud[hookName] = Cloud.define.bind(null, metadataName);
117+
});
118+
115119
if (!AV.Insight) {
116120
AV.Insight = {};
117121
}
@@ -168,7 +172,7 @@ function defineClassHook(className, hook, func) {
168172
}
169173

170174
function className(clazz) {
171-
if (utils.typeOf(clazz) === 'string') {
175+
if (_.isString(clazz)) {
172176
return clazz;
173177
} else if (clazz.className) {
174178
return clazz.className;

lib/leanengine.js

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,6 @@ var utils = require('./utils');
1111

1212
var NODE_ENV = process.env.NODE_ENV || 'development';
1313

14-
const REALTIME_HOOKS = [
15-
'_messageReceived', '_receiversOffline', '_messageSent', '_conversationStart',
16-
'_conversationStarted', '_conversationAdd', '_conversationRemove', '_conversationUpdate'
17-
];
18-
19-
const hookNameMapping = {
20-
beforeSave: '__before_save_for_',
21-
beforeUpdate: '__before_update_for_',
22-
afterSave: '__after_save_for_',
23-
afterUpdate: '__after_update_for_',
24-
beforeDelete: '__before_delete_for_',
25-
afterDelete: '__after_delete_for_',
26-
onVerified: '__on_verified_',
27-
onLogin: '__on_login_'
28-
};
29-
3014
AV.express = function(options) {
3115
var router = connect();
3216

@@ -170,7 +154,7 @@ function callCloudFunction(req, funcName) {
170154
throw new Cloud.Error(`No such cloud function '${funcName}'`, {status: 404, printToLog: true, printFullStack: false});
171155
}
172156

173-
if (_.contains(REALTIME_HOOKS, funcName)) {
157+
if (_.contains(_.values(utils.realtimeHookMapping), funcName)) {
174158
checkHookKey(req);
175159
}
176160

@@ -212,7 +196,7 @@ function callCloudFunction(req, funcName) {
212196
}
213197

214198
function callClassHook(req, className, hookName) {
215-
const hookFunction = Cloud.functions[hookNameMapping[hookName] + className];
199+
const hookFunction = Cloud.functions[utils.hookNameMapping[hookName] + className];
216200
const hookType = hookName.indexOf('before') === 0 ? 'before' : 'after';
217201

218202
checkHookKey(req);
@@ -263,7 +247,7 @@ function callClassHook(req, className, hookName) {
263247
}
264248

265249
function callUserHook(req, hookName, verifType) {
266-
const userHookFunction = Cloud.functions[hookNameMapping[hookName] + verifType];
250+
const userHookFunction = Cloud.functions[utils.hookNameMapping[hookName] + verifType];
267251

268252
checkHookKey(req);
269253

lib/utils.js

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,25 @@
22

33
var crypto = require('crypto');
44

5-
exports.typeOf = function(obj) {
6-
var classToType;
7-
if (obj === void 0 || obj === null) {
8-
return String(obj);
9-
}
10-
classToType = {
11-
'[object Boolean]': 'boolean',
12-
'[object Number]': 'number',
13-
'[object String]': 'string',
14-
'[object Function]': 'function',
15-
'[object Array]': 'array',
16-
'[object Date]': 'date',
17-
'[object RegExp]': 'regexp',
18-
'[object Object]': 'object'
19-
};
20-
return classToType[Object.prototype.toString.call(obj)];
5+
exports.hookNameMapping = {
6+
beforeSave: '__before_save_for_',
7+
beforeUpdate: '__before_update_for_',
8+
afterSave: '__after_save_for_',
9+
afterUpdate: '__after_update_for_',
10+
beforeDelete: '__before_delete_for_',
11+
afterDelete: '__after_delete_for_',
12+
onVerified: '__on_verified_',
13+
onLogin: '__on_login_'
14+
};
15+
16+
exports.realtimeHookMapping = {
17+
onIMMessageReceived: '_messageReceived',
18+
onIMReceiversOffline: '_receiversOffline',
19+
onIMMessageSent: '_messageSent',
20+
onIMConversationStart: '_conversationStart',
21+
onIMConversationStarted: '_conversationStarted',
22+
onIMConversationAdd: '_conversationAdd',
23+
onIMConversationUpdate: '_conversationUpdate'
2124
};
2225

2326
exports.unauthResp = function(res) {
@@ -26,18 +29,6 @@ exports.unauthResp = function(res) {
2629
return res.end(JSON.stringify({ code: 401, error: 'Unauthorized.' }));
2730
};
2831

29-
exports.signHook = function(masterKey, hookName, ts) {
30-
return ts + ',' + crypto.createHmac('sha1', masterKey).update(hookName + ':' + ts).digest('hex');
31-
};
32-
33-
exports.verifyHookSign = function(masterKey, hookName, sign) {
34-
if (sign) {
35-
return exports.signHook(masterKey, hookName, sign.split(',')[0]) === sign;
36-
} else {
37-
return false;
38-
}
39-
};
40-
4132
/* options: req, user, params, object*/
4233
exports.prepareRequestObject = function(options) {
4334
var req = options.req;

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "leanengine",
3-
"version": "2.0.0-rc.0",
3+
"version": "2.0.0-beta",
44
"description": "LeanCloud LeanEngine Node.js SDK.",
55
"repository": {
66
"type": "git",

test/helpers/functions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,6 @@ AV.Cloud.define('testTimeout', function(req, res) {
223223
}, req.params.delay);
224224
});
225225

226-
AV.Cloud.define('_messageReceived', function(request, response) {
226+
AV.Cloud.onIMMessageReceived(function(request, response) {
227227
response.success('ok');
228228
});

test/storage-extra-test.js

Lines changed: 0 additions & 31 deletions
This file was deleted.

0 commit comments

Comments
 (0)