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.
Files changed (46) hide show
  1. package/dist/adapters/file/aliyun-oss.d.ts +3 -3
  2. package/dist/adapters/file/database.d.ts +2 -2
  3. package/dist/adapters/file/database.js +1 -1
  4. package/dist/adapters/file/database.mjs +1 -1
  5. package/dist/adapters/file/filesystem.d.ts +3 -3
  6. package/dist/adapters/file/google-cloud-storage.d.ts +3 -3
  7. package/dist/adapters/storage/progres.d.ts +1 -1
  8. package/dist/adapters/storage/progres.js +3 -3
  9. package/dist/adapters/storage/progres.js.map +1 -1
  10. package/dist/adapters/storage/progres.mjs +3 -3
  11. package/dist/adapters/storage/progres.mjs.map +1 -1
  12. package/dist/client.d.ts +3 -3
  13. package/dist/client.js +1 -1
  14. package/dist/client.mjs +2 -2
  15. package/dist/index.d.ts +3 -3
  16. package/dist/index.js +171 -130
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.mjs +172 -131
  19. package/dist/index.mjs.map +1 -1
  20. package/dist/internals/{base-C1uAg1dD.d.ts → base-NZIvB1zK.d.ts} +2 -2
  21. package/dist/internals/base-NZIvB1zK.d.ts.map +1 -0
  22. package/dist/internals/{chunk-CpgqvFNO.d.ts → chunk-B9i8NMB_.d.ts} +3 -3
  23. package/dist/internals/chunk-B9i8NMB_.d.ts.map +1 -0
  24. package/dist/internals/{index-82GLvDiN.d.ts → index-BOboD1oK.d.ts} +121 -61
  25. package/dist/internals/index-BOboD1oK.d.ts.map +1 -0
  26. package/dist/internals/{index-CsclRNTO.mjs → index-BZ79Ljis.mjs} +60 -1
  27. package/dist/internals/index-BZ79Ljis.mjs.map +1 -0
  28. package/dist/internals/{index-Cc-yXi8f.d.ts → index-BcNiVp-e.d.ts} +3 -2
  29. package/dist/internals/index-BcNiVp-e.d.ts.map +1 -0
  30. package/dist/internals/index-CLKTEIj0.js.map +1 -1
  31. package/dist/internals/index-gWcE22mf.mjs.map +1 -1
  32. package/dist/internals/{index-dk8iIkyr.js → index-vOFh8pVc.js} +60 -1
  33. package/dist/internals/index-vOFh8pVc.js.map +1 -0
  34. package/dist/internals/{validator-DX2nXeQo.mjs → validator-0I1kvhsL.mjs} +42 -10
  35. package/dist/internals/validator-0I1kvhsL.mjs.map +1 -0
  36. package/dist/internals/{validator-B5yHpyvb.js → validator-Bc1jRJfA.js} +42 -10
  37. package/dist/internals/validator-Bc1jRJfA.js.map +1 -0
  38. package/package.json +1 -1
  39. package/dist/internals/base-C1uAg1dD.d.ts.map +0 -1
  40. package/dist/internals/chunk-CpgqvFNO.d.ts.map +0 -1
  41. package/dist/internals/index-82GLvDiN.d.ts.map +0 -1
  42. package/dist/internals/index-Cc-yXi8f.d.ts.map +0 -1
  43. package/dist/internals/index-CsclRNTO.mjs.map +0 -1
  44. package/dist/internals/index-dk8iIkyr.js.map +0 -1
  45. package/dist/internals/validator-B5yHpyvb.js.map +0 -1
  46. package/dist/internals/validator-DX2nXeQo.mjs.map +0 -1
package/dist/client.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { P as ProtoClient } from './internals/index-Cc-yXi8f.js';
2
- export { c as classExtends } from './internals/index-Cc-yXi8f.js';
3
- export { D as DeserializeOptions, S as SerializeOptions, e as TNumber, f as TSerializable, g as deserialize, s as serialize } from './internals/index-82GLvDiN.js';
1
+ import { P as ProtoClient } from './internals/index-BcNiVp-e.js';
2
+ export { c as classExtends } from './internals/index-BcNiVp-e.js';
3
+ export { D as DeserializeOptions, S as SerializeOptions, e as TNumber, f as TSerializable, g as deserialize, s as serialize } from './internals/index-BOboD1oK.js';
4
4
  export { Decimal } from 'decimal.js';
5
5
  import '@o2ter/utils-js';
6
6
  import 'socket.io-client';
package/dist/client.js CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var index = require('./internals/index-dk8iIkyr.js');
5
+ var index = require('./internals/index-vOFh8pVc.js');
6
6
  var Decimal = require('decimal.js');
7
7
  require('@o2ter/utils-js');
8
8
  require('./internals/private-Ciddhure.js');
package/dist/client.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { b as ProtoClient } from './internals/index-CsclRNTO.mjs';
2
- export { c as classExtends, d as deserialize, s as serialize } from './internals/index-CsclRNTO.mjs';
1
+ import { b as ProtoClient } from './internals/index-BZ79Ljis.mjs';
2
+ export { c as classExtends, d as deserialize, s as serialize } from './internals/index-BZ79Ljis.mjs';
3
3
  export { Decimal } from 'decimal.js';
4
4
  import '@o2ter/utils-js';
5
5
  import './internals/private-CNw40LZ7.mjs';
package/dist/index.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  import * as socket_io from 'socket.io';
2
2
  import { Router } from 'express';
3
3
  import { Server } from '@o2ter/server-js';
4
- import { T as TSchema, a as TValueWithoutObject, P as ProtoService, b as ProtoServiceOptions, c as ProtoServiceKeyOptions } from './internals/index-82GLvDiN.js';
5
- export { D as DeserializeOptions, S as SerializeOptions, d as TFileStorage, e as TNumber, f as TSerializable, g as deserialize, s as serialize } from './internals/index-82GLvDiN.js';
4
+ import { T as TSchema, a as TValueWithoutObject, P as ProtoService, b as ProtoServiceOptions, c as ProtoServiceKeyOptions } from './internals/index-BOboD1oK.js';
5
+ export { D as DeserializeOptions, S as SerializeOptions, d as TFileStorage, e as TNumber, f as TSerializable, g as deserialize, s as serialize } from './internals/index-BOboD1oK.js';
6
6
  import Decimal from 'decimal.js';
7
7
  export { Decimal } from 'decimal.js';
8
- export { P as ProtoClient, c as classExtends } from './internals/index-Cc-yXi8f.js';
8
+ export { P as ProtoClient, c as classExtends } from './internals/index-BcNiVp-e.js';
9
9
  import '@o2ter/utils-js';
10
10
  import 'jsonwebtoken';
11
11
  import 'lodash';
package/dist/index.js CHANGED
@@ -4,10 +4,10 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var _ = require('lodash');
6
6
  var serverJs = require('@o2ter/server-js');
7
- var validator = require('./internals/validator-B5yHpyvb.js');
7
+ var validator = require('./internals/validator-Bc1jRJfA.js');
8
8
  var _private = require('./internals/private-Ciddhure.js');
9
9
  var utilsJs = require('@o2ter/utils-js');
10
- var index = require('./internals/index-dk8iIkyr.js');
10
+ var index = require('./internals/index-vOFh8pVc.js');
11
11
  var index$1 = require('./internals/index-CLKTEIj0.js');
12
12
  var jwt = require('jsonwebtoken');
13
13
  var node_buffer = require('node:buffer');
@@ -327,7 +327,7 @@ class _ProtoQuery extends index.TQuery {
327
327
  yield self._objectMethods(object);
328
328
  });
329
329
  }
330
- _on_upsert(objects) {
330
+ _on_upsert_traggers(objects) {
331
331
  const createTraggers = this._proto[_private.PVK].triggers[this.className]?.create ?? [];
332
332
  const updateTraggers = this._proto[_private.PVK].triggers[this.className]?.update ?? [];
333
333
  for (const obj of objects) {
@@ -342,6 +342,8 @@ class _ProtoQuery extends index.TQuery {
342
342
  })();
343
343
  }
344
344
  }
345
+ }
346
+ _on_upsert(objects) {
345
347
  if (this._proto.schema[this.className]?.liveQuery) {
346
348
  (async () => {
347
349
  try {
@@ -354,7 +356,7 @@ class _ProtoQuery extends index.TQuery {
354
356
  })();
355
357
  }
356
358
  }
357
- _on_delete(objects) {
359
+ _on_delete_traggers(objects) {
358
360
  const traggers = this._proto[_private.PVK].triggers[this.className]?.delete ?? [];
359
361
  for (const obj of objects) {
360
362
  for (const tragger of traggers) {
@@ -368,6 +370,8 @@ class _ProtoQuery extends index.TQuery {
368
370
  })();
369
371
  }
370
372
  }
373
+ }
374
+ _on_delete(objects) {
371
375
  if (this._proto.schema[this.className]?.liveQuery) {
372
376
  (async () => {
373
377
  try {
@@ -386,26 +390,30 @@ class _ProtoQuery extends index.TQuery {
386
390
  matches: this[_private.PVK].options.matches,
387
391
  groupMatches: this[_private.PVK].options.groupMatches,
388
392
  }, values));
389
- if (!options?.silent)
390
- this._on_upsert(objs);
393
+ this._on_upsert(objs);
394
+ if (!options?.silent || !options.master)
395
+ this._on_upsert_traggers(objs);
391
396
  return objs;
392
397
  }
393
398
  async updateMany(update, options) {
394
399
  const objs = this._objectMethods(await this._dispatcher(options).update(this._queryOptions, update));
395
- if (!options?.silent)
396
- this._on_upsert(objs);
400
+ this._on_upsert(objs);
401
+ if (!options?.silent || !options.master)
402
+ this._on_upsert_traggers(objs);
397
403
  return objs;
398
404
  }
399
405
  async upsertMany(update, setOnInsert, options) {
400
406
  const objs = this._objectMethods(await this._dispatcher(options).upsert(this._queryOptions, update, setOnInsert));
401
- if (!options?.silent)
402
- this._on_upsert(objs);
407
+ this._on_upsert(objs);
408
+ if (!options?.silent || !options.master)
409
+ this._on_upsert_traggers(objs);
403
410
  return objs;
404
411
  }
405
412
  async deleteMany(options) {
406
413
  const objs = this._objectMethods(await this._dispatcher(options).delete(this._queryOptions));
407
- if (!options?.silent)
408
- this._on_delete(objs);
414
+ this._on_delete(objs);
415
+ if (!options?.silent || !options.master)
416
+ this._on_delete_traggers(objs);
409
417
  return objs;
410
418
  }
411
419
  }
@@ -473,6 +481,30 @@ class ProtoRelationQuery extends _ProtoQuery {
473
481
  // THE SOFTWARE.
474
482
  //
475
483
  const defaultSchema = {
484
+ '_Session': {
485
+ fields: {
486
+ token: 'string',
487
+ user: { type: 'pointer', target: 'User' },
488
+ loginedAt: 'date',
489
+ },
490
+ classLevelPermissions: {
491
+ find: [],
492
+ count: [],
493
+ create: [],
494
+ update: [],
495
+ delete: [],
496
+ },
497
+ fieldLevelPermissions: {
498
+ token: { update: [] },
499
+ _expired_at: { create: [], update: [] },
500
+ },
501
+ indexes: [
502
+ {
503
+ keys: { token: 1 },
504
+ unique: true,
505
+ },
506
+ ],
507
+ },
476
508
  'User': {
477
509
  fields: {
478
510
  password: 'object',
@@ -1051,14 +1083,14 @@ class ProtoInternal {
1051
1083
  });
1052
1084
  }
1053
1085
  listen(proto, callback) {
1054
- const isMaster = proto.isMaster;
1055
- const roles = isMaster ? [] : this._perms(proto);
1056
1086
  return {
1057
1087
  remove: this.options.pubsub.subscribe(_const.PROTO_NOTY_MSG, payload => {
1058
1088
  const { _rperm } = payload;
1059
1089
  (async () => {
1060
1090
  try {
1061
- if (!isMaster && !_.some(await roles, x => _.includes(_rperm, x)))
1091
+ const isMaster = proto.isMaster;
1092
+ const roles = isMaster ? [] : await this._perms(proto);
1093
+ if (!isMaster && !_.some(roles, x => _.includes(_rperm, x)))
1062
1094
  return;
1063
1095
  await callback(payload);
1064
1096
  }
@@ -1075,18 +1107,17 @@ class ProtoInternal {
1075
1107
  return this.options.pubsub.publish(_const.PROTO_LIVEQUERY_MSG, JSON.parse(index.serialize({ event, objects }, { objAttrs: index$1.TObject.defaultKeys })));
1076
1108
  }
1077
1109
  _liveQuery(proto, callback) {
1078
- const isMaster = proto.isMaster;
1079
- const roles = isMaster ? [] : this._perms(proto);
1080
1110
  return {
1081
1111
  remove: this.options.pubsub.subscribe(_const.PROTO_LIVEQUERY_MSG, payload => {
1082
1112
  const { event, objects } = index.deserialize(JSON.stringify(payload));
1083
1113
  (async () => {
1084
1114
  try {
1085
- const _roles = await roles;
1115
+ const isMaster = proto.isMaster;
1116
+ const roles = isMaster ? [] : await this._perms(proto);
1086
1117
  const payload = proto.rebind(isMaster ? objects : _.filter(objects, object => {
1087
1118
  const acl = object.acl();
1088
1119
  const clp = proto.schema[object.className].classLevelPermissions?.get ?? ['*'];
1089
- return _.some(_roles, x => _.includes(clp, x) && _.includes(acl.read, x));
1120
+ return _.some(roles, x => _.includes(clp, x) && _.includes(acl.read, x));
1090
1121
  }));
1091
1122
  if (!_.isEmpty(payload))
1092
1123
  await callback(event, payload);
@@ -1281,98 +1312,102 @@ class JobRunner {
1281
1312
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1282
1313
  // THE SOFTWARE.
1283
1314
  //
1284
- const sessionMap = new WeakMap();
1285
- const _sessionWithToken = (proto, token) => {
1315
+ const _sessionWithToken = async (proto, token) => {
1286
1316
  if (_.isEmpty(token))
1287
1317
  return;
1288
- const payload = proto[_private.PVK].jwtVarify(token, 'login');
1289
- if (!_.isObject(payload))
1318
+ const payload = proto[_private.PVK].jwtVarify(token, 'login') ?? {};
1319
+ if (!_.isString(payload.sessionId) || _.isEmpty(payload.sessionId))
1320
+ return;
1321
+ const session = await proto.Query('_Session')
1322
+ .equalTo('token', payload.sessionId)
1323
+ .includes('user')
1324
+ .first({ master: true });
1325
+ if (!session)
1290
1326
  return;
1327
+ return { payload, session };
1328
+ };
1329
+ const userCacheMap = new WeakMap();
1330
+ const fetchUserRole = async (proto, user) => {
1331
+ if (!userCacheMap.has(proto[_private.PVK]))
1332
+ userCacheMap.set(proto[_private.PVK], {});
1333
+ const cache = userCacheMap.get(proto[_private.PVK]);
1334
+ if (_.isNil(user?.id))
1335
+ return {};
1336
+ if (_.isNil(cache[user.id]))
1337
+ cache[user.id] = (async () => {
1338
+ const _roles = user instanceof index.TUser ? _.filter(await proto.userRoles(user), x => !_.isEmpty(x.name)) : [];
1339
+ cache[user.id] = undefined;
1340
+ return _roles;
1341
+ })();
1342
+ const _roles = await cache[user.id];
1291
1343
  return {
1292
- ...payload,
1293
- sessionId: payload.sessionId ?? cryptoJs.randomUUID(),
1294
- createdAt: payload.createdAt && _.isSafeInteger(payload.createdAt) ? new Date(payload.createdAt) : new Date,
1295
- loginedAt: payload.loginedAt && _.isSafeInteger(payload.loginedAt) ? new Date(payload.loginedAt) : new Date,
1344
+ user: user?.clone(),
1345
+ _roles: _.map(_roles, x => x.clone()),
1296
1346
  };
1297
1347
  };
1298
- const _session = (proto, request) => {
1348
+ const sessionMap = new WeakMap();
1349
+ const _session = async (proto, request) => {
1299
1350
  const cached = sessionMap.get(request);
1300
1351
  if (cached)
1301
- return cached;
1302
- sessionMap.set(request, {
1303
- sessionId: cryptoJs.randomUUID(),
1304
- createdAt: new Date,
1305
- loginedAt: new Date,
1306
- });
1307
- const jwtToken = proto[_private.PVK].options.jwtToken;
1308
- if (_.isEmpty(jwtToken))
1309
- throw Error('Invalid jwt token');
1352
+ return {
1353
+ sessionId: cached.session.sessionId,
1354
+ createdAt: cached.session.createdAt,
1355
+ updatedAt: cached.session.updatedAt,
1356
+ loginedAt: cached.session.loginedAt,
1357
+ user: cached.session.user,
1358
+ cookieOptions: cached.payload.cookieOptions,
1359
+ };
1310
1360
  const cookieKey = _.last(_.castArray(request.headers[_const.AUTH_ALT_COOKIE_KEY] || [])) || _const.AUTH_COOKIE_KEY;
1311
- let authorization = '';
1361
+ let sessionId = '';
1312
1362
  if (request.headers.authorization) {
1313
1363
  const parts = request.headers.authorization.split(' ');
1314
1364
  if (parts.length === 2 && parts[0] === 'Bearer')
1315
- authorization = parts[1];
1365
+ sessionId = parts[1];
1316
1366
  }
1317
1367
  else if (request.cookies[cookieKey]) {
1318
- authorization = request.cookies[cookieKey];
1368
+ sessionId = request.cookies[cookieKey];
1319
1369
  }
1320
- if (_.isEmpty(authorization))
1321
- return;
1322
- const session = _sessionWithToken(proto, authorization);
1323
- if (!_.isObject(session))
1370
+ const { payload, session } = await _sessionWithToken(proto, sessionId) ?? {};
1371
+ if (!session)
1324
1372
  return;
1325
- sessionMap.set(request, session);
1326
- return session;
1327
- };
1328
- const sessionId = (proto, request) => {
1329
- const session = _session(proto, request);
1330
- return sessionMap.get(request)?.sessionId ?? session?.sessionId;
1331
- };
1332
- const userCacheMap = new WeakMap;
1333
- const fetchSessionInfo = async (proto, userId = '') => {
1334
- if (!userCacheMap.has(proto[_private.PVK]))
1335
- userCacheMap.set(proto[_private.PVK], {});
1336
- const cache = userCacheMap.get(proto[_private.PVK]);
1337
- if (_.isNil(cache[userId]))
1338
- cache[userId] = (async () => {
1339
- const _user = userId ? await proto.Query('User').get(userId, { master: true }) : undefined;
1340
- const user = proto.req ? await proto[_private.PVK].options.userResolver(proto, _user) : _user;
1341
- const _roles = user instanceof index.TUser ? _.filter(await proto.userRoles(user), x => !_.isEmpty(x.name)) : [];
1342
- cache[userId] = undefined;
1343
- return { user, _roles };
1344
- })();
1345
- const { user, _roles } = await cache[userId];
1373
+ sessionMap.set(request, { payload, session });
1346
1374
  return {
1347
- user: user?.clone(),
1348
- _roles: _.map(_roles, x => x.clone()),
1349
- };
1350
- };
1351
- const sessionWithToken = async (proto, token) => {
1352
- const session = _sessionWithToken(proto, token);
1353
- const info = await fetchSessionInfo(proto, session?.user);
1354
- return {
1355
- ...session ?? {},
1356
- ...info,
1357
- loginedAt: info?.user ? session?.loginedAt : undefined,
1375
+ sessionId: session.sessionId,
1376
+ createdAt: session.createdAt,
1377
+ updatedAt: session.updatedAt,
1378
+ loginedAt: session.loginedAt,
1379
+ user: session.user,
1380
+ cookieOptions: payload.cookieOptions,
1358
1381
  };
1359
1382
  };
1360
- const sessionInfoMap = new WeakMap();
1383
+ const userRoleMap = new WeakMap();
1361
1384
  const session = async (proto, request) => {
1362
- const session = _session(proto, request);
1363
- const cached = sessionInfoMap.get(request);
1385
+ const session = await _session(proto, request);
1386
+ const cached = userRoleMap.get(request);
1364
1387
  if (cached)
1365
1388
  return {
1366
1389
  ...session ?? {},
1367
1390
  ...cached,
1368
- loginedAt: cached?.user ? session?.loginedAt : undefined,
1369
1391
  };
1370
- const info = await fetchSessionInfo(proto, session?.user);
1371
- sessionInfoMap.set(request, info);
1392
+ const info = await fetchUserRole(proto, session?.user);
1393
+ userRoleMap.set(request, info);
1372
1394
  return {
1373
1395
  ...session ?? {},
1374
1396
  ...info,
1375
- loginedAt: info?.user ? session?.loginedAt : undefined,
1397
+ };
1398
+ };
1399
+ const sessionWithToken = async (proto, token) => {
1400
+ const { payload, session } = await _sessionWithToken(proto, token) ?? {};
1401
+ if (!session)
1402
+ return;
1403
+ const info = await fetchUserRole(proto, session?.user);
1404
+ return {
1405
+ sessionId: session.sessionId,
1406
+ createdAt: session.createdAt,
1407
+ updatedAt: session.updatedAt,
1408
+ loginedAt: session.loginedAt,
1409
+ cookieOptions: payload.cookieOptions,
1410
+ ...info,
1376
1411
  };
1377
1412
  };
1378
1413
  const sessionIsMaster = (proto, request) => {
@@ -1385,18 +1420,30 @@ const sessionIsMaster = (proto, request) => {
1385
1420
  const signUser = async (proto, res, user, options) => {
1386
1421
  if (_.isNil(proto[_private.PVK].options.jwtToken))
1387
1422
  return;
1388
- const session = _session(proto, res.req);
1423
+ const session = await _session(proto, res.req);
1389
1424
  const cookieOptions = options?.cookieOptions ?? session?.cookieOptions ?? proto[_private.PVK].options.cookieOptions;
1425
+ const sessionId = session?.sessionId ?? cryptoJs.randomUUID();
1426
+ const expiredAt = cookieOptions?.expires ?? (cookieOptions?.maxAge ? new Date(Date.now() + cookieOptions.maxAge) : undefined);
1427
+ const loginedAt = user ? session?.loginedAt ?? new Date() : undefined;
1428
+ await proto.Query('_Session')
1429
+ .equalTo('token', sessionId)
1430
+ .upsertOne({
1431
+ loginedAt: { $set: loginedAt },
1432
+ user: { $set: user },
1433
+ _expired_at: { $set: expiredAt },
1434
+ }, {
1435
+ token: sessionId,
1436
+ loginedAt: loginedAt,
1437
+ user,
1438
+ _expired_at: expiredAt,
1439
+ }, { master: true });
1390
1440
  const token = proto[_private.PVK].jwtSign({
1391
- sessionId: session?.sessionId ?? cryptoJs.randomUUID(),
1392
- createdAt: session?.createdAt?.getTime() ?? Date.now(),
1393
- loginedAt: user ? session?.loginedAt?.getTime() ?? Date.now() : undefined,
1394
- user: user?.id,
1441
+ sessionId,
1395
1442
  cookieOptions,
1396
1443
  }, options?.jwtSignOptions ?? 'login');
1397
1444
  const cookieKey = _.last(_.castArray(res.req.headers[_const.AUTH_ALT_COOKIE_KEY] || [])) || _const.AUTH_COOKIE_KEY;
1398
1445
  res.cookie(cookieKey, token, cookieOptions);
1399
- sessionInfoMap.set(res.req, user ? await fetchSessionInfo(proto, user.id) : {});
1446
+ userRoleMap.set(res.req, user ? await fetchUserRole(proto, user) : {});
1400
1447
  };
1401
1448
 
1402
1449
  //
@@ -1491,7 +1538,6 @@ class ProtoService extends index.ProtoType {
1491
1538
  constructor(options) {
1492
1539
  super();
1493
1540
  this[_private.PVK] = new ProtoInternal({
1494
- userResolver: (_req, user) => user,
1495
1541
  roleResolver: {},
1496
1542
  objectIdSize: 10,
1497
1543
  maxFetchLimit: 1000,
@@ -1558,11 +1604,6 @@ class ProtoService extends index.ProtoType {
1558
1604
  InsecureQuery(className) {
1559
1605
  return new ProtoQuery(className, this, { insecure: true });
1560
1606
  }
1561
- get sessionId() {
1562
- if (this.session)
1563
- return this.session.sessionId;
1564
- return this.req ? sessionId(this, this.req) : undefined;
1565
- }
1566
1607
  async sessionInfo() {
1567
1608
  if (this.session)
1568
1609
  return this.session;
@@ -1592,8 +1633,14 @@ class ProtoService extends index.ProtoType {
1592
1633
  }
1593
1634
  async connectWithSessionToken(token, attrs) {
1594
1635
  const session = _.isString(token) ? await sessionWithToken(this, token) : undefined;
1595
- const payload = _.create(this, { session });
1596
- return _.assign(payload, _.isFunction(attrs) ? attrs(payload) : attrs);
1636
+ if (Object.getPrototypeOf(this) instanceof ProtoService) {
1637
+ this.session = session;
1638
+ return _.assign(this, _.isFunction(attrs) ? attrs(this) : attrs);
1639
+ }
1640
+ else {
1641
+ const payload = _.create(this, { session });
1642
+ return _.assign(payload, _.isFunction(attrs) ? attrs(payload) : attrs);
1643
+ }
1597
1644
  }
1598
1645
  async userRoles(user) {
1599
1646
  const self = this;
@@ -2593,43 +2640,37 @@ const ProtoRoute = async (options) => {
2593
2640
  const registerProtoSocket = (proto, server, endpoint) => {
2594
2641
  const io = endpoint ? server.socket().of(endpoint) : server.socket();
2595
2642
  io.on('connection', async (socket) => {
2643
+ let { token } = socket.handshake.auth;
2644
+ const service = await proto.connectWithSessionToken(token);
2645
+ socket.on('auth', (t) => {
2646
+ token = t;
2647
+ service.connectWithSessionToken(t);
2648
+ });
2596
2649
  let events = {};
2597
2650
  let queries = {};
2598
- const connect = async (token) => {
2599
- const payload = await proto.connectWithSessionToken(token);
2600
- const { remove: remove_basic } = payload.listen(data => {
2601
- const ids = _.keys(_.pickBy(events, v => v instanceof validator.QuerySelector ? v.eval(data) : v));
2602
- const payload = JSON.parse(index.serialize(data));
2603
- if (!_.isEmpty(ids))
2604
- socket.emit('ON_EV_NOTIFY', { ids, data: payload });
2605
- });
2606
- const { remove: remove_livequery } = payload[_private.PVK]._liveQuery(payload, (ev, objs) => {
2607
- const ids = {};
2608
- for (const obj of objs) {
2609
- ids[obj.id] = _.keys(_.pickBy(queries, v => {
2610
- if (v.event !== ev || v.className !== obj.className)
2611
- return false;
2612
- return v.filter instanceof validator.QuerySelector ? v.filter.eval(obj) : v.filter;
2613
- }));
2614
- }
2615
- if (_.isEmpty(ids))
2616
- return;
2617
- const payload = JSON.parse(index.serialize(_.filter(objs, obj => !_.isEmpty(ids[obj.id]))));
2618
- socket.emit('ON_EV_LIVEQUERY', { ids, data: payload });
2619
- });
2620
- return () => {
2621
- remove_basic();
2622
- remove_livequery();
2623
- };
2624
- };
2625
- const { token } = socket.handshake.auth;
2626
- let remove = connect(token);
2627
- socket.on('auth', (token) => {
2628
- remove.then(rm => rm());
2629
- remove = connect(token);
2651
+ const { remove: remove_basic } = service.listen(data => {
2652
+ const ids = _.keys(_.pickBy(events, v => v instanceof validator.QuerySelector ? v.eval(data) : v));
2653
+ const payload = JSON.parse(index.serialize(data));
2654
+ if (!_.isEmpty(ids))
2655
+ socket.emit('ON_EV_NOTIFY', { ids, data: payload });
2656
+ });
2657
+ const { remove: remove_livequery } = service[_private.PVK]._liveQuery(service, (ev, objs) => {
2658
+ const ids = {};
2659
+ for (const obj of objs) {
2660
+ ids[obj.id] = _.keys(_.pickBy(queries, v => {
2661
+ if (v.event !== ev || v.className !== obj.className)
2662
+ return false;
2663
+ return v.filter instanceof validator.QuerySelector ? v.filter.eval(obj) : v.filter;
2664
+ }));
2665
+ }
2666
+ if (_.isEmpty(ids))
2667
+ return;
2668
+ const payload = JSON.parse(index.serialize(_.filter(objs, obj => !_.isEmpty(ids[obj.id]))));
2669
+ socket.emit('ON_EV_LIVEQUERY', { ids, data: payload });
2630
2670
  });
2631
2671
  socket.on('disconnect', () => {
2632
- remove.then(rm => rm());
2672
+ remove_basic();
2673
+ remove_livequery();
2633
2674
  });
2634
2675
  socket.on('EV_NOTIFY', (payload) => {
2635
2676
  events = _.mapValues(payload, v => {