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/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-DX2nXeQo.mjs';
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-CsclRNTO.mjs';
7
- export { b as ProtoClient, c as classExtends } from './internals/index-CsclRNTO.mjs';
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
- _on_upsert(objects) {
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
- _on_delete(objects) {
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
- if (!options?.silent)
387
- this._on_upsert(objs);
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
- if (!options?.silent)
393
- this._on_upsert(objs);
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
- if (!options?.silent)
399
- this._on_upsert(objs);
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
- if (!options?.silent)
405
- this._on_delete(objs);
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
- if (!isMaster && !_.some(await roles, x => _.includes(_rperm, x)))
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 _roles = await roles;
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(_roles, x => _.includes(clp, x) && _.includes(acl.read, x));
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 sessionMap = new WeakMap();
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 (!_.isObject(payload))
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
- ...payload,
1290
- sessionId: payload.sessionId ?? randomUUID(),
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 _session = (proto, request) => {
1345
+ const sessionMap = new WeakMap();
1346
+ const _session = async (proto, request) => {
1296
1347
  const cached = sessionMap.get(request);
1297
1348
  if (cached)
1298
- return cached;
1299
- sessionMap.set(request, {
1300
- sessionId: randomUUID(),
1301
- createdAt: new Date,
1302
- loginedAt: new Date,
1303
- });
1304
- const jwtToken = proto[PVK].options.jwtToken;
1305
- if (_.isEmpty(jwtToken))
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 authorization = '';
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
- authorization = parts[1];
1362
+ sessionId = parts[1];
1313
1363
  }
1314
1364
  else if (request.cookies[cookieKey]) {
1315
- authorization = request.cookies[cookieKey];
1365
+ sessionId = request.cookies[cookieKey];
1316
1366
  }
1317
- if (_.isEmpty(authorization))
1318
- return;
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
- user: user?.clone(),
1345
- _roles: _.map(_roles, x => x.clone()),
1346
- };
1347
- };
1348
- const sessionWithToken = async (proto, token) => {
1349
- const session = _sessionWithToken(proto, token);
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 sessionInfoMap = new WeakMap();
1380
+ const userRoleMap = new WeakMap();
1358
1381
  const session = async (proto, request) => {
1359
- const session = _session(proto, request);
1360
- const cached = sessionInfoMap.get(request);
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 fetchSessionInfo(proto, session?.user);
1368
- sessionInfoMap.set(request, info);
1389
+ const info = await fetchUserRole(proto, session?.user);
1390
+ userRoleMap.set(request, info);
1369
1391
  return {
1370
1392
  ...session ?? {},
1371
1393
  ...info,
1372
- loginedAt: info?.user ? session?.loginedAt : undefined,
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: session?.sessionId ?? randomUUID(),
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
- sessionInfoMap.set(res.req, user ? await fetchSessionInfo(proto, user.id) : {});
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
- const payload = _.create(this, { session });
1593
- return _.assign(payload, _.isFunction(attrs) ? attrs(payload) : attrs);
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 connect = async (token) => {
2596
- const payload = await proto.connectWithSessionToken(token);
2597
- const { remove: remove_basic } = payload.listen(data => {
2598
- const ids = _.keys(_.pickBy(events, v => v instanceof QuerySelector ? v.eval(data) : v));
2599
- const payload = JSON.parse(serialize(data));
2600
- if (!_.isEmpty(ids))
2601
- socket.emit('ON_EV_NOTIFY', { ids, data: payload });
2602
- });
2603
- const { remove: remove_livequery } = payload[PVK]._liveQuery(payload, (ev, objs) => {
2604
- const ids = {};
2605
- for (const obj of objs) {
2606
- ids[obj.id] = _.keys(_.pickBy(queries, v => {
2607
- if (v.event !== ev || v.className !== obj.className)
2608
- return false;
2609
- return v.filter instanceof QuerySelector ? v.filter.eval(obj) : v.filter;
2610
- }));
2611
- }
2612
- if (_.isEmpty(ids))
2613
- return;
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
- remove.then(rm => rm());
2669
+ remove_basic();
2670
+ remove_livequery();
2630
2671
  });
2631
2672
  socket.on('EV_NOTIFY', (payload) => {
2632
2673
  events = _.mapValues(payload, v => {