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/client.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { P as ProtoClient } from './internals/index-
|
|
2
|
-
export { c as classExtends } from './internals/index-
|
|
3
|
-
export { D as DeserializeOptions, S as SerializeOptions, e as TNumber, f as TSerializable, g as deserialize, s as serialize } from './internals/index-
|
|
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-
|
|
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-
|
|
2
|
-
export { c as classExtends, d as deserialize, s as serialize } from './internals/index-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
390
|
-
|
|
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
|
-
|
|
396
|
-
|
|
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
|
-
|
|
402
|
-
|
|
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
|
-
|
|
408
|
-
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
|
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 (!_.
|
|
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
|
-
|
|
1293
|
-
|
|
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
|
|
1348
|
+
const sessionMap = new WeakMap();
|
|
1349
|
+
const _session = async (proto, request) => {
|
|
1299
1350
|
const cached = sessionMap.get(request);
|
|
1300
1351
|
if (cached)
|
|
1301
|
-
return
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
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
|
|
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
|
-
|
|
1365
|
+
sessionId = parts[1];
|
|
1316
1366
|
}
|
|
1317
1367
|
else if (request.cookies[cookieKey]) {
|
|
1318
|
-
|
|
1368
|
+
sessionId = request.cookies[cookieKey];
|
|
1319
1369
|
}
|
|
1320
|
-
|
|
1321
|
-
|
|
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
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
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
|
|
1383
|
+
const userRoleMap = new WeakMap();
|
|
1361
1384
|
const session = async (proto, request) => {
|
|
1362
|
-
const session = _session(proto, request);
|
|
1363
|
-
const cached =
|
|
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
|
|
1371
|
-
|
|
1392
|
+
const info = await fetchUserRole(proto, session?.user);
|
|
1393
|
+
userRoleMap.set(request, info);
|
|
1372
1394
|
return {
|
|
1373
1395
|
...session ?? {},
|
|
1374
1396
|
...info,
|
|
1375
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
1596
|
-
|
|
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
|
|
2599
|
-
const
|
|
2600
|
-
const
|
|
2601
|
-
|
|
2602
|
-
|
|
2603
|
-
|
|
2604
|
-
|
|
2605
|
-
}
|
|
2606
|
-
const
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
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
|
-
|
|
2672
|
+
remove_basic();
|
|
2673
|
+
remove_livequery();
|
|
2633
2674
|
});
|
|
2634
2675
|
socket.on('EV_NOTIFY', (payload) => {
|
|
2635
2676
|
events = _.mapValues(payload, v => {
|