proto.io 0.0.222 → 0.0.224
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/file/aliyun-oss.d.ts +3 -3
- package/dist/adapters/file/database.d.ts +2 -2
- package/dist/adapters/file/database.js +1 -1
- package/dist/adapters/file/database.mjs +1 -1
- package/dist/adapters/file/filesystem.d.ts +3 -3
- package/dist/adapters/file/google-cloud-storage.d.ts +3 -3
- package/dist/adapters/storage/progres.d.ts +1 -1
- package/dist/adapters/storage/progres.js +3 -3
- package/dist/adapters/storage/progres.js.map +1 -1
- package/dist/adapters/storage/progres.mjs +3 -3
- package/dist/adapters/storage/progres.mjs.map +1 -1
- package/dist/client.d.ts +3 -3
- package/dist/client.js +1 -1
- package/dist/client.mjs +2 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.js +171 -130
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +172 -131
- package/dist/index.mjs.map +1 -1
- package/dist/internals/{base-C1uAg1dD.d.ts → base-NZIvB1zK.d.ts} +2 -2
- package/dist/internals/base-NZIvB1zK.d.ts.map +1 -0
- package/dist/internals/{chunk-CpgqvFNO.d.ts → chunk-B9i8NMB_.d.ts} +3 -3
- package/dist/internals/chunk-B9i8NMB_.d.ts.map +1 -0
- package/dist/internals/{index-82GLvDiN.d.ts → index-BOboD1oK.d.ts} +121 -61
- package/dist/internals/index-BOboD1oK.d.ts.map +1 -0
- package/dist/internals/{index-CsclRNTO.mjs → index-BZ79Ljis.mjs} +60 -1
- package/dist/internals/index-BZ79Ljis.mjs.map +1 -0
- package/dist/internals/{index-Cc-yXi8f.d.ts → index-BcNiVp-e.d.ts} +3 -2
- package/dist/internals/index-BcNiVp-e.d.ts.map +1 -0
- package/dist/internals/index-CLKTEIj0.js.map +1 -1
- package/dist/internals/index-gWcE22mf.mjs.map +1 -1
- package/dist/internals/{index-dk8iIkyr.js → index-vOFh8pVc.js} +60 -1
- package/dist/internals/index-vOFh8pVc.js.map +1 -0
- package/dist/internals/{validator-DX2nXeQo.mjs → validator-0I1kvhsL.mjs} +42 -10
- package/dist/internals/validator-0I1kvhsL.mjs.map +1 -0
- package/dist/internals/{validator-B5yHpyvb.js → validator-Bc1jRJfA.js} +42 -10
- package/dist/internals/validator-Bc1jRJfA.js.map +1 -0
- package/package.json +1 -1
- package/dist/internals/base-C1uAg1dD.d.ts.map +0 -1
- package/dist/internals/chunk-CpgqvFNO.d.ts.map +0 -1
- package/dist/internals/index-82GLvDiN.d.ts.map +0 -1
- package/dist/internals/index-Cc-yXi8f.d.ts.map +0 -1
- package/dist/internals/index-CsclRNTO.mjs.map +0 -1
- package/dist/internals/index-dk8iIkyr.js.map +0 -1
- package/dist/internals/validator-B5yHpyvb.js.map +0 -1
- package/dist/internals/validator-DX2nXeQo.mjs.map +0 -1
package/dist/index.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import _ from 'lodash';
|
|
2
2
|
import { Server } from '@o2ter/server-js';
|
|
3
|
-
import { Q as QueryValidator, a as QueryExpression, r as resolveColumn, b as resolveDataType, c as QuerySelector } from './internals/validator-
|
|
3
|
+
import { Q as QueryValidator, a as QueryExpression, r as resolveColumn, b as resolveDataType, c as QuerySelector } from './internals/validator-0I1kvhsL.mjs';
|
|
4
4
|
import { P as PVK } from './internals/private-CNw40LZ7.mjs';
|
|
5
5
|
import { prototypes, asyncStream, isBinaryData, base64ToBuffer } from '@o2ter/utils-js';
|
|
6
|
-
import { L as LiveQuerySubscription, T as TQuery, d as deserialize, s as serialize, a as TUser, P as ProtoType, _ as _logLevels } from './internals/index-
|
|
7
|
-
export { b as ProtoClient, c as classExtends } from './internals/index-
|
|
6
|
+
import { L as LiveQuerySubscription, T as TQuery, d as deserialize, s as serialize, a as TUser, P as ProtoType, _ as _logLevels } from './internals/index-BZ79Ljis.mjs';
|
|
7
|
+
export { b as ProtoClient, c as classExtends } from './internals/index-BZ79Ljis.mjs';
|
|
8
8
|
import { i as isPointer, a as isRelation, T as TObject, b as isShape, d as defaultObjectKeyTypes, c as isPrimitive } from './internals/index-gWcE22mf.mjs';
|
|
9
9
|
import jwt from 'jsonwebtoken';
|
|
10
10
|
import { Blob } from 'node:buffer';
|
|
@@ -324,7 +324,7 @@ class _ProtoQuery extends TQuery {
|
|
|
324
324
|
yield self._objectMethods(object);
|
|
325
325
|
});
|
|
326
326
|
}
|
|
327
|
-
|
|
327
|
+
_on_upsert_traggers(objects) {
|
|
328
328
|
const createTraggers = this._proto[PVK].triggers[this.className]?.create ?? [];
|
|
329
329
|
const updateTraggers = this._proto[PVK].triggers[this.className]?.update ?? [];
|
|
330
330
|
for (const obj of objects) {
|
|
@@ -339,6 +339,8 @@ class _ProtoQuery extends TQuery {
|
|
|
339
339
|
})();
|
|
340
340
|
}
|
|
341
341
|
}
|
|
342
|
+
}
|
|
343
|
+
_on_upsert(objects) {
|
|
342
344
|
if (this._proto.schema[this.className]?.liveQuery) {
|
|
343
345
|
(async () => {
|
|
344
346
|
try {
|
|
@@ -351,7 +353,7 @@ class _ProtoQuery extends TQuery {
|
|
|
351
353
|
})();
|
|
352
354
|
}
|
|
353
355
|
}
|
|
354
|
-
|
|
356
|
+
_on_delete_traggers(objects) {
|
|
355
357
|
const traggers = this._proto[PVK].triggers[this.className]?.delete ?? [];
|
|
356
358
|
for (const obj of objects) {
|
|
357
359
|
for (const tragger of traggers) {
|
|
@@ -365,6 +367,8 @@ class _ProtoQuery extends TQuery {
|
|
|
365
367
|
})();
|
|
366
368
|
}
|
|
367
369
|
}
|
|
370
|
+
}
|
|
371
|
+
_on_delete(objects) {
|
|
368
372
|
if (this._proto.schema[this.className]?.liveQuery) {
|
|
369
373
|
(async () => {
|
|
370
374
|
try {
|
|
@@ -383,26 +387,30 @@ class _ProtoQuery extends TQuery {
|
|
|
383
387
|
matches: this[PVK].options.matches,
|
|
384
388
|
groupMatches: this[PVK].options.groupMatches,
|
|
385
389
|
}, values));
|
|
386
|
-
|
|
387
|
-
|
|
390
|
+
this._on_upsert(objs);
|
|
391
|
+
if (!options?.silent || !options.master)
|
|
392
|
+
this._on_upsert_traggers(objs);
|
|
388
393
|
return objs;
|
|
389
394
|
}
|
|
390
395
|
async updateMany(update, options) {
|
|
391
396
|
const objs = this._objectMethods(await this._dispatcher(options).update(this._queryOptions, update));
|
|
392
|
-
|
|
393
|
-
|
|
397
|
+
this._on_upsert(objs);
|
|
398
|
+
if (!options?.silent || !options.master)
|
|
399
|
+
this._on_upsert_traggers(objs);
|
|
394
400
|
return objs;
|
|
395
401
|
}
|
|
396
402
|
async upsertMany(update, setOnInsert, options) {
|
|
397
403
|
const objs = this._objectMethods(await this._dispatcher(options).upsert(this._queryOptions, update, setOnInsert));
|
|
398
|
-
|
|
399
|
-
|
|
404
|
+
this._on_upsert(objs);
|
|
405
|
+
if (!options?.silent || !options.master)
|
|
406
|
+
this._on_upsert_traggers(objs);
|
|
400
407
|
return objs;
|
|
401
408
|
}
|
|
402
409
|
async deleteMany(options) {
|
|
403
410
|
const objs = this._objectMethods(await this._dispatcher(options).delete(this._queryOptions));
|
|
404
|
-
|
|
405
|
-
|
|
411
|
+
this._on_delete(objs);
|
|
412
|
+
if (!options?.silent || !options.master)
|
|
413
|
+
this._on_delete_traggers(objs);
|
|
406
414
|
return objs;
|
|
407
415
|
}
|
|
408
416
|
}
|
|
@@ -470,6 +478,30 @@ class ProtoRelationQuery extends _ProtoQuery {
|
|
|
470
478
|
// THE SOFTWARE.
|
|
471
479
|
//
|
|
472
480
|
const defaultSchema = {
|
|
481
|
+
'_Session': {
|
|
482
|
+
fields: {
|
|
483
|
+
token: 'string',
|
|
484
|
+
user: { type: 'pointer', target: 'User' },
|
|
485
|
+
loginedAt: 'date',
|
|
486
|
+
},
|
|
487
|
+
classLevelPermissions: {
|
|
488
|
+
find: [],
|
|
489
|
+
count: [],
|
|
490
|
+
create: [],
|
|
491
|
+
update: [],
|
|
492
|
+
delete: [],
|
|
493
|
+
},
|
|
494
|
+
fieldLevelPermissions: {
|
|
495
|
+
token: { update: [] },
|
|
496
|
+
_expired_at: { create: [], update: [] },
|
|
497
|
+
},
|
|
498
|
+
indexes: [
|
|
499
|
+
{
|
|
500
|
+
keys: { token: 1 },
|
|
501
|
+
unique: true,
|
|
502
|
+
},
|
|
503
|
+
],
|
|
504
|
+
},
|
|
473
505
|
'User': {
|
|
474
506
|
fields: {
|
|
475
507
|
password: 'object',
|
|
@@ -1048,14 +1080,14 @@ class ProtoInternal {
|
|
|
1048
1080
|
});
|
|
1049
1081
|
}
|
|
1050
1082
|
listen(proto, callback) {
|
|
1051
|
-
const isMaster = proto.isMaster;
|
|
1052
|
-
const roles = isMaster ? [] : this._perms(proto);
|
|
1053
1083
|
return {
|
|
1054
1084
|
remove: this.options.pubsub.subscribe(PROTO_NOTY_MSG, payload => {
|
|
1055
1085
|
const { _rperm } = payload;
|
|
1056
1086
|
(async () => {
|
|
1057
1087
|
try {
|
|
1058
|
-
|
|
1088
|
+
const isMaster = proto.isMaster;
|
|
1089
|
+
const roles = isMaster ? [] : await this._perms(proto);
|
|
1090
|
+
if (!isMaster && !_.some(roles, x => _.includes(_rperm, x)))
|
|
1059
1091
|
return;
|
|
1060
1092
|
await callback(payload);
|
|
1061
1093
|
}
|
|
@@ -1072,18 +1104,17 @@ class ProtoInternal {
|
|
|
1072
1104
|
return this.options.pubsub.publish(PROTO_LIVEQUERY_MSG, JSON.parse(serialize({ event, objects }, { objAttrs: TObject.defaultKeys })));
|
|
1073
1105
|
}
|
|
1074
1106
|
_liveQuery(proto, callback) {
|
|
1075
|
-
const isMaster = proto.isMaster;
|
|
1076
|
-
const roles = isMaster ? [] : this._perms(proto);
|
|
1077
1107
|
return {
|
|
1078
1108
|
remove: this.options.pubsub.subscribe(PROTO_LIVEQUERY_MSG, payload => {
|
|
1079
1109
|
const { event, objects } = deserialize(JSON.stringify(payload));
|
|
1080
1110
|
(async () => {
|
|
1081
1111
|
try {
|
|
1082
|
-
const
|
|
1112
|
+
const isMaster = proto.isMaster;
|
|
1113
|
+
const roles = isMaster ? [] : await this._perms(proto);
|
|
1083
1114
|
const payload = proto.rebind(isMaster ? objects : _.filter(objects, object => {
|
|
1084
1115
|
const acl = object.acl();
|
|
1085
1116
|
const clp = proto.schema[object.className].classLevelPermissions?.get ?? ['*'];
|
|
1086
|
-
return _.some(
|
|
1117
|
+
return _.some(roles, x => _.includes(clp, x) && _.includes(acl.read, x));
|
|
1087
1118
|
}));
|
|
1088
1119
|
if (!_.isEmpty(payload))
|
|
1089
1120
|
await callback(event, payload);
|
|
@@ -1278,98 +1309,102 @@ class JobRunner {
|
|
|
1278
1309
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
1279
1310
|
// THE SOFTWARE.
|
|
1280
1311
|
//
|
|
1281
|
-
const
|
|
1282
|
-
const _sessionWithToken = (proto, token) => {
|
|
1312
|
+
const _sessionWithToken = async (proto, token) => {
|
|
1283
1313
|
if (_.isEmpty(token))
|
|
1284
1314
|
return;
|
|
1285
|
-
const payload = proto[PVK].jwtVarify(token, 'login');
|
|
1286
|
-
if (!_.
|
|
1315
|
+
const payload = proto[PVK].jwtVarify(token, 'login') ?? {};
|
|
1316
|
+
if (!_.isString(payload.sessionId) || _.isEmpty(payload.sessionId))
|
|
1317
|
+
return;
|
|
1318
|
+
const session = await proto.Query('_Session')
|
|
1319
|
+
.equalTo('token', payload.sessionId)
|
|
1320
|
+
.includes('user')
|
|
1321
|
+
.first({ master: true });
|
|
1322
|
+
if (!session)
|
|
1287
1323
|
return;
|
|
1324
|
+
return { payload, session };
|
|
1325
|
+
};
|
|
1326
|
+
const userCacheMap = new WeakMap();
|
|
1327
|
+
const fetchUserRole = async (proto, user) => {
|
|
1328
|
+
if (!userCacheMap.has(proto[PVK]))
|
|
1329
|
+
userCacheMap.set(proto[PVK], {});
|
|
1330
|
+
const cache = userCacheMap.get(proto[PVK]);
|
|
1331
|
+
if (_.isNil(user?.id))
|
|
1332
|
+
return {};
|
|
1333
|
+
if (_.isNil(cache[user.id]))
|
|
1334
|
+
cache[user.id] = (async () => {
|
|
1335
|
+
const _roles = user instanceof TUser ? _.filter(await proto.userRoles(user), x => !_.isEmpty(x.name)) : [];
|
|
1336
|
+
cache[user.id] = undefined;
|
|
1337
|
+
return _roles;
|
|
1338
|
+
})();
|
|
1339
|
+
const _roles = await cache[user.id];
|
|
1288
1340
|
return {
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
createdAt: payload.createdAt && _.isSafeInteger(payload.createdAt) ? new Date(payload.createdAt) : new Date,
|
|
1292
|
-
loginedAt: payload.loginedAt && _.isSafeInteger(payload.loginedAt) ? new Date(payload.loginedAt) : new Date,
|
|
1341
|
+
user: user?.clone(),
|
|
1342
|
+
_roles: _.map(_roles, x => x.clone()),
|
|
1293
1343
|
};
|
|
1294
1344
|
};
|
|
1295
|
-
const
|
|
1345
|
+
const sessionMap = new WeakMap();
|
|
1346
|
+
const _session = async (proto, request) => {
|
|
1296
1347
|
const cached = sessionMap.get(request);
|
|
1297
1348
|
if (cached)
|
|
1298
|
-
return
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
throw Error('Invalid jwt token');
|
|
1349
|
+
return {
|
|
1350
|
+
sessionId: cached.session.sessionId,
|
|
1351
|
+
createdAt: cached.session.createdAt,
|
|
1352
|
+
updatedAt: cached.session.updatedAt,
|
|
1353
|
+
loginedAt: cached.session.loginedAt,
|
|
1354
|
+
user: cached.session.user,
|
|
1355
|
+
cookieOptions: cached.payload.cookieOptions,
|
|
1356
|
+
};
|
|
1307
1357
|
const cookieKey = _.last(_.castArray(request.headers[AUTH_ALT_COOKIE_KEY] || [])) || AUTH_COOKIE_KEY;
|
|
1308
|
-
let
|
|
1358
|
+
let sessionId = '';
|
|
1309
1359
|
if (request.headers.authorization) {
|
|
1310
1360
|
const parts = request.headers.authorization.split(' ');
|
|
1311
1361
|
if (parts.length === 2 && parts[0] === 'Bearer')
|
|
1312
|
-
|
|
1362
|
+
sessionId = parts[1];
|
|
1313
1363
|
}
|
|
1314
1364
|
else if (request.cookies[cookieKey]) {
|
|
1315
|
-
|
|
1365
|
+
sessionId = request.cookies[cookieKey];
|
|
1316
1366
|
}
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
const session = _sessionWithToken(proto, authorization);
|
|
1320
|
-
if (!_.isObject(session))
|
|
1367
|
+
const { payload, session } = await _sessionWithToken(proto, sessionId) ?? {};
|
|
1368
|
+
if (!session)
|
|
1321
1369
|
return;
|
|
1322
|
-
sessionMap.set(request, session);
|
|
1323
|
-
return session;
|
|
1324
|
-
};
|
|
1325
|
-
const sessionId = (proto, request) => {
|
|
1326
|
-
const session = _session(proto, request);
|
|
1327
|
-
return sessionMap.get(request)?.sessionId ?? session?.sessionId;
|
|
1328
|
-
};
|
|
1329
|
-
const userCacheMap = new WeakMap;
|
|
1330
|
-
const fetchSessionInfo = async (proto, userId = '') => {
|
|
1331
|
-
if (!userCacheMap.has(proto[PVK]))
|
|
1332
|
-
userCacheMap.set(proto[PVK], {});
|
|
1333
|
-
const cache = userCacheMap.get(proto[PVK]);
|
|
1334
|
-
if (_.isNil(cache[userId]))
|
|
1335
|
-
cache[userId] = (async () => {
|
|
1336
|
-
const _user = userId ? await proto.Query('User').get(userId, { master: true }) : undefined;
|
|
1337
|
-
const user = proto.req ? await proto[PVK].options.userResolver(proto, _user) : _user;
|
|
1338
|
-
const _roles = user instanceof TUser ? _.filter(await proto.userRoles(user), x => !_.isEmpty(x.name)) : [];
|
|
1339
|
-
cache[userId] = undefined;
|
|
1340
|
-
return { user, _roles };
|
|
1341
|
-
})();
|
|
1342
|
-
const { user, _roles } = await cache[userId];
|
|
1370
|
+
sessionMap.set(request, { payload, session });
|
|
1343
1371
|
return {
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
const info = await fetchSessionInfo(proto, session?.user);
|
|
1351
|
-
return {
|
|
1352
|
-
...session ?? {},
|
|
1353
|
-
...info,
|
|
1354
|
-
loginedAt: info?.user ? session?.loginedAt : undefined,
|
|
1372
|
+
sessionId: session.sessionId,
|
|
1373
|
+
createdAt: session.createdAt,
|
|
1374
|
+
updatedAt: session.updatedAt,
|
|
1375
|
+
loginedAt: session.loginedAt,
|
|
1376
|
+
user: session.user,
|
|
1377
|
+
cookieOptions: payload.cookieOptions,
|
|
1355
1378
|
};
|
|
1356
1379
|
};
|
|
1357
|
-
const
|
|
1380
|
+
const userRoleMap = new WeakMap();
|
|
1358
1381
|
const session = async (proto, request) => {
|
|
1359
|
-
const session = _session(proto, request);
|
|
1360
|
-
const cached =
|
|
1382
|
+
const session = await _session(proto, request);
|
|
1383
|
+
const cached = userRoleMap.get(request);
|
|
1361
1384
|
if (cached)
|
|
1362
1385
|
return {
|
|
1363
1386
|
...session ?? {},
|
|
1364
1387
|
...cached,
|
|
1365
|
-
loginedAt: cached?.user ? session?.loginedAt : undefined,
|
|
1366
1388
|
};
|
|
1367
|
-
const info = await
|
|
1368
|
-
|
|
1389
|
+
const info = await fetchUserRole(proto, session?.user);
|
|
1390
|
+
userRoleMap.set(request, info);
|
|
1369
1391
|
return {
|
|
1370
1392
|
...session ?? {},
|
|
1371
1393
|
...info,
|
|
1372
|
-
|
|
1394
|
+
};
|
|
1395
|
+
};
|
|
1396
|
+
const sessionWithToken = async (proto, token) => {
|
|
1397
|
+
const { payload, session } = await _sessionWithToken(proto, token) ?? {};
|
|
1398
|
+
if (!session)
|
|
1399
|
+
return;
|
|
1400
|
+
const info = await fetchUserRole(proto, session?.user);
|
|
1401
|
+
return {
|
|
1402
|
+
sessionId: session.sessionId,
|
|
1403
|
+
createdAt: session.createdAt,
|
|
1404
|
+
updatedAt: session.updatedAt,
|
|
1405
|
+
loginedAt: session.loginedAt,
|
|
1406
|
+
cookieOptions: payload.cookieOptions,
|
|
1407
|
+
...info,
|
|
1373
1408
|
};
|
|
1374
1409
|
};
|
|
1375
1410
|
const sessionIsMaster = (proto, request) => {
|
|
@@ -1382,18 +1417,30 @@ const sessionIsMaster = (proto, request) => {
|
|
|
1382
1417
|
const signUser = async (proto, res, user, options) => {
|
|
1383
1418
|
if (_.isNil(proto[PVK].options.jwtToken))
|
|
1384
1419
|
return;
|
|
1385
|
-
const session = _session(proto, res.req);
|
|
1420
|
+
const session = await _session(proto, res.req);
|
|
1386
1421
|
const cookieOptions = options?.cookieOptions ?? session?.cookieOptions ?? proto[PVK].options.cookieOptions;
|
|
1422
|
+
const sessionId = session?.sessionId ?? randomUUID();
|
|
1423
|
+
const expiredAt = cookieOptions?.expires ?? (cookieOptions?.maxAge ? new Date(Date.now() + cookieOptions.maxAge) : undefined);
|
|
1424
|
+
const loginedAt = user ? session?.loginedAt ?? new Date() : undefined;
|
|
1425
|
+
await proto.Query('_Session')
|
|
1426
|
+
.equalTo('token', sessionId)
|
|
1427
|
+
.upsertOne({
|
|
1428
|
+
loginedAt: { $set: loginedAt },
|
|
1429
|
+
user: { $set: user },
|
|
1430
|
+
_expired_at: { $set: expiredAt },
|
|
1431
|
+
}, {
|
|
1432
|
+
token: sessionId,
|
|
1433
|
+
loginedAt: loginedAt,
|
|
1434
|
+
user,
|
|
1435
|
+
_expired_at: expiredAt,
|
|
1436
|
+
}, { master: true });
|
|
1387
1437
|
const token = proto[PVK].jwtSign({
|
|
1388
|
-
sessionId
|
|
1389
|
-
createdAt: session?.createdAt?.getTime() ?? Date.now(),
|
|
1390
|
-
loginedAt: user ? session?.loginedAt?.getTime() ?? Date.now() : undefined,
|
|
1391
|
-
user: user?.id,
|
|
1438
|
+
sessionId,
|
|
1392
1439
|
cookieOptions,
|
|
1393
1440
|
}, options?.jwtSignOptions ?? 'login');
|
|
1394
1441
|
const cookieKey = _.last(_.castArray(res.req.headers[AUTH_ALT_COOKIE_KEY] || [])) || AUTH_COOKIE_KEY;
|
|
1395
1442
|
res.cookie(cookieKey, token, cookieOptions);
|
|
1396
|
-
|
|
1443
|
+
userRoleMap.set(res.req, user ? await fetchUserRole(proto, user) : {});
|
|
1397
1444
|
};
|
|
1398
1445
|
|
|
1399
1446
|
//
|
|
@@ -1488,7 +1535,6 @@ class ProtoService extends ProtoType {
|
|
|
1488
1535
|
constructor(options) {
|
|
1489
1536
|
super();
|
|
1490
1537
|
this[PVK] = new ProtoInternal({
|
|
1491
|
-
userResolver: (_req, user) => user,
|
|
1492
1538
|
roleResolver: {},
|
|
1493
1539
|
objectIdSize: 10,
|
|
1494
1540
|
maxFetchLimit: 1000,
|
|
@@ -1555,11 +1601,6 @@ class ProtoService extends ProtoType {
|
|
|
1555
1601
|
InsecureQuery(className) {
|
|
1556
1602
|
return new ProtoQuery(className, this, { insecure: true });
|
|
1557
1603
|
}
|
|
1558
|
-
get sessionId() {
|
|
1559
|
-
if (this.session)
|
|
1560
|
-
return this.session.sessionId;
|
|
1561
|
-
return this.req ? sessionId(this, this.req) : undefined;
|
|
1562
|
-
}
|
|
1563
1604
|
async sessionInfo() {
|
|
1564
1605
|
if (this.session)
|
|
1565
1606
|
return this.session;
|
|
@@ -1589,8 +1630,14 @@ class ProtoService extends ProtoType {
|
|
|
1589
1630
|
}
|
|
1590
1631
|
async connectWithSessionToken(token, attrs) {
|
|
1591
1632
|
const session = _.isString(token) ? await sessionWithToken(this, token) : undefined;
|
|
1592
|
-
|
|
1593
|
-
|
|
1633
|
+
if (Object.getPrototypeOf(this) instanceof ProtoService) {
|
|
1634
|
+
this.session = session;
|
|
1635
|
+
return _.assign(this, _.isFunction(attrs) ? attrs(this) : attrs);
|
|
1636
|
+
}
|
|
1637
|
+
else {
|
|
1638
|
+
const payload = _.create(this, { session });
|
|
1639
|
+
return _.assign(payload, _.isFunction(attrs) ? attrs(payload) : attrs);
|
|
1640
|
+
}
|
|
1594
1641
|
}
|
|
1595
1642
|
async userRoles(user) {
|
|
1596
1643
|
const self = this;
|
|
@@ -2590,43 +2637,37 @@ const ProtoRoute = async (options) => {
|
|
|
2590
2637
|
const registerProtoSocket = (proto, server, endpoint) => {
|
|
2591
2638
|
const io = endpoint ? server.socket().of(endpoint) : server.socket();
|
|
2592
2639
|
io.on('connection', async (socket) => {
|
|
2640
|
+
let { token } = socket.handshake.auth;
|
|
2641
|
+
const service = await proto.connectWithSessionToken(token);
|
|
2642
|
+
socket.on('auth', (t) => {
|
|
2643
|
+
token = t;
|
|
2644
|
+
service.connectWithSessionToken(t);
|
|
2645
|
+
});
|
|
2593
2646
|
let events = {};
|
|
2594
2647
|
let queries = {};
|
|
2595
|
-
const
|
|
2596
|
-
const
|
|
2597
|
-
const
|
|
2598
|
-
|
|
2599
|
-
|
|
2600
|
-
|
|
2601
|
-
|
|
2602
|
-
}
|
|
2603
|
-
const
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
const payload = JSON.parse(serialize(_.filter(objs, obj => !_.isEmpty(ids[obj.id]))));
|
|
2615
|
-
socket.emit('ON_EV_LIVEQUERY', { ids, data: payload });
|
|
2616
|
-
});
|
|
2617
|
-
return () => {
|
|
2618
|
-
remove_basic();
|
|
2619
|
-
remove_livequery();
|
|
2620
|
-
};
|
|
2621
|
-
};
|
|
2622
|
-
const { token } = socket.handshake.auth;
|
|
2623
|
-
let remove = connect(token);
|
|
2624
|
-
socket.on('auth', (token) => {
|
|
2625
|
-
remove.then(rm => rm());
|
|
2626
|
-
remove = connect(token);
|
|
2648
|
+
const { remove: remove_basic } = service.listen(data => {
|
|
2649
|
+
const ids = _.keys(_.pickBy(events, v => v instanceof QuerySelector ? v.eval(data) : v));
|
|
2650
|
+
const payload = JSON.parse(serialize(data));
|
|
2651
|
+
if (!_.isEmpty(ids))
|
|
2652
|
+
socket.emit('ON_EV_NOTIFY', { ids, data: payload });
|
|
2653
|
+
});
|
|
2654
|
+
const { remove: remove_livequery } = service[PVK]._liveQuery(service, (ev, objs) => {
|
|
2655
|
+
const ids = {};
|
|
2656
|
+
for (const obj of objs) {
|
|
2657
|
+
ids[obj.id] = _.keys(_.pickBy(queries, v => {
|
|
2658
|
+
if (v.event !== ev || v.className !== obj.className)
|
|
2659
|
+
return false;
|
|
2660
|
+
return v.filter instanceof QuerySelector ? v.filter.eval(obj) : v.filter;
|
|
2661
|
+
}));
|
|
2662
|
+
}
|
|
2663
|
+
if (_.isEmpty(ids))
|
|
2664
|
+
return;
|
|
2665
|
+
const payload = JSON.parse(serialize(_.filter(objs, obj => !_.isEmpty(ids[obj.id]))));
|
|
2666
|
+
socket.emit('ON_EV_LIVEQUERY', { ids, data: payload });
|
|
2627
2667
|
});
|
|
2628
2668
|
socket.on('disconnect', () => {
|
|
2629
|
-
|
|
2669
|
+
remove_basic();
|
|
2670
|
+
remove_livequery();
|
|
2630
2671
|
});
|
|
2631
2672
|
socket.on('EV_NOTIFY', (payload) => {
|
|
2632
2673
|
events = _.mapValues(payload, v => {
|