@flowerforce/flowerbase 1.7.5-beta.2 → 1.7.5-beta.4
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/features/functions/controller.d.ts +2 -0
- package/dist/features/functions/controller.d.ts.map +1 -1
- package/dist/features/functions/controller.js +244 -19
- package/dist/services/api/index.d.ts +4 -0
- package/dist/services/api/index.d.ts.map +1 -1
- package/dist/services/api/utils.d.ts +1 -0
- package/dist/services/api/utils.d.ts.map +1 -1
- package/dist/services/index.d.ts +4 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/mongodb-atlas/utils.d.ts.map +1 -1
- package/dist/services/mongodb-atlas/utils.js +17 -1
- package/dist/utils/context/helpers.d.ts +12 -0
- package/dist/utils/context/helpers.d.ts.map +1 -1
- package/dist/utils/roles/helpers.d.ts.map +1 -1
- package/dist/utils/roles/helpers.js +19 -4
- package/dist/utils/roles/interface.d.ts +10 -6
- package/dist/utils/roles/interface.d.ts.map +1 -1
- package/dist/utils/roles/machines/commonValidators.js +2 -2
- package/dist/utils/roles/machines/fieldPermissions.d.ts +8 -0
- package/dist/utils/roles/machines/fieldPermissions.d.ts.map +1 -0
- package/dist/utils/roles/machines/fieldPermissions.js +67 -0
- package/dist/utils/roles/machines/read/A/index.d.ts.map +1 -1
- package/dist/utils/roles/machines/read/A/index.js +4 -3
- package/dist/utils/roles/machines/read/C/index.d.ts.map +1 -1
- package/dist/utils/roles/machines/read/C/index.js +16 -16
- package/dist/utils/roles/machines/read/C/validators.js +2 -2
- package/dist/utils/roles/machines/read/D/index.js +1 -1
- package/dist/utils/roles/machines/read/D/validators.d.ts +1 -1
- package/dist/utils/roles/machines/read/D/validators.d.ts.map +1 -1
- package/dist/utils/roles/machines/read/D/validators.js +19 -21
- package/dist/utils/roles/machines/write/B/index.d.ts.map +1 -1
- package/dist/utils/roles/machines/write/B/index.js +12 -9
- package/dist/utils/roles/machines/write/C/index.js +1 -1
- package/dist/utils/roles/machines/write/C/validators.d.ts +1 -1
- package/dist/utils/roles/machines/write/C/validators.d.ts.map +1 -1
- package/dist/utils/roles/machines/write/C/validators.js +16 -21
- package/package.json +1 -1
- package/src/features/functions/__tests__/watch-filter.test.ts +116 -0
- package/src/features/functions/controller.ts +282 -22
- package/src/features/triggers/__tests__/index.test.ts +2 -2
- package/src/services/mongodb-atlas/__tests__/findOneAndUpdate.test.ts +1 -1
- package/src/services/mongodb-atlas/utils.ts +19 -4
- package/src/utils/__tests__/STEP_A_STATES.test.ts +24 -2
- package/src/utils/__tests__/STEP_C_STATES.test.ts +61 -27
- package/src/utils/__tests__/STEP_D_STATES.test.ts +9 -9
- package/src/utils/__tests__/WRITE_STEP_B_STATES.test.ts +184 -0
- package/src/utils/__tests__/checkAdditionalFieldsFn.test.ts +2 -2
- package/src/utils/__tests__/checkFieldsPropertyExists.test.ts +13 -0
- package/src/utils/__tests__/checkIsValidFieldNameFn.test.ts +52 -121
- package/src/utils/__tests__/evaluateTopLevelReadFn.test.ts +10 -1
- package/src/utils/__tests__/evaluateTopLevelWriteFn.test.ts +21 -5
- package/src/utils/roles/helpers.ts +18 -4
- package/src/utils/roles/interface.ts +13 -6
- package/src/utils/roles/machines/commonValidators.ts +1 -1
- package/src/utils/roles/machines/fieldPermissions.ts +86 -0
- package/src/utils/roles/machines/read/A/index.ts +4 -3
- package/src/utils/roles/machines/read/C/index.ts +18 -18
- package/src/utils/roles/machines/read/C/validators.ts +2 -2
- package/src/utils/roles/machines/read/D/index.ts +1 -1
- package/src/utils/roles/machines/read/D/validators.ts +12 -25
- package/src/utils/roles/machines/write/B/index.ts +12 -9
- package/src/utils/roles/machines/write/C/index.ts +1 -1
- package/src/utils/roles/machines/write/C/validators.ts +9 -26
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { FunctionController } from './interface';
|
|
2
|
+
export declare const mapWatchFilterToChangeStreamMatch: (value: unknown) => unknown;
|
|
3
|
+
export declare const mapWatchFilterToDocumentQuery: (value: unknown) => unknown;
|
|
2
4
|
/**
|
|
3
5
|
* > Creates a pre handler for every query
|
|
4
6
|
* @param app -> the fastify instance
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/features/functions/controller.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/features/functions/controller.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAmHhD,eAAO,MAAM,iCAAiC,GAAI,OAAO,OAAO,KAAG,OA0BlE,CAAA;AAID,eAAO,MAAM,6BAA6B,GAAI,OAAO,OAAO,KAAG,OAgD9D,CAAA;AAqHD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,kBAuRjC,CAAA"}
|
|
@@ -20,7 +20,7 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
20
20
|
return t;
|
|
21
21
|
};
|
|
22
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
-
exports.functionsController = void 0;
|
|
23
|
+
exports.functionsController = exports.mapWatchFilterToDocumentQuery = exports.mapWatchFilterToChangeStreamMatch = void 0;
|
|
24
24
|
const bson_1 = require("bson");
|
|
25
25
|
const services_1 = require("../../services");
|
|
26
26
|
const context_1 = require("../../utils/context");
|
|
@@ -58,14 +58,205 @@ const isReturnedError = (value) => {
|
|
|
58
58
|
};
|
|
59
59
|
const serializeEjson = (value) => JSON.stringify(bson_1.EJSON.serialize(value, { relaxed: false }));
|
|
60
60
|
const isRecord = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
|
|
61
|
+
const isPlainRecord = (value) => {
|
|
62
|
+
if (!isRecord(value))
|
|
63
|
+
return false;
|
|
64
|
+
const prototype = Object.getPrototypeOf(value);
|
|
65
|
+
return prototype === Object.prototype || prototype === null;
|
|
66
|
+
};
|
|
67
|
+
const isCursorLike = (value) => {
|
|
68
|
+
if (!value || typeof value !== 'object')
|
|
69
|
+
return false;
|
|
70
|
+
return typeof value.toArray === 'function';
|
|
71
|
+
};
|
|
72
|
+
const normalizeFunctionResult = (value) => __awaiter(void 0, void 0, void 0, function* () {
|
|
73
|
+
if (!isCursorLike(value))
|
|
74
|
+
return value;
|
|
75
|
+
return yield value.toArray();
|
|
76
|
+
});
|
|
61
77
|
const sharedWatchStreams = new Map();
|
|
62
78
|
let watchSubscriberCounter = 0;
|
|
79
|
+
const maxSharedWatchStreams = Number(process.env.MAX_SHARED_WATCH_STREAMS || 200);
|
|
80
|
+
const debugWatchStreams = process.env.DEBUG_FUNCTIONS === 'true';
|
|
81
|
+
const changeEventRootKeys = new Set([
|
|
82
|
+
'_id',
|
|
83
|
+
'operationType',
|
|
84
|
+
'clusterTime',
|
|
85
|
+
'txnNumber',
|
|
86
|
+
'lsid',
|
|
87
|
+
'ns',
|
|
88
|
+
'documentKey',
|
|
89
|
+
'fullDocument',
|
|
90
|
+
'updateDescription'
|
|
91
|
+
]);
|
|
92
|
+
const isChangeEventPath = (key) => {
|
|
93
|
+
if (changeEventRootKeys.has(key))
|
|
94
|
+
return true;
|
|
95
|
+
return (key.startsWith('ns.') ||
|
|
96
|
+
key.startsWith('documentKey.') ||
|
|
97
|
+
key.startsWith('fullDocument.') ||
|
|
98
|
+
key.startsWith('updateDescription.'));
|
|
99
|
+
};
|
|
100
|
+
const isOpaqueChangeEventObjectKey = (key) => key === 'ns' || key === 'documentKey' || key === 'fullDocument' || key === 'updateDescription';
|
|
101
|
+
const mapWatchFilterToChangeStreamMatch = (value) => {
|
|
102
|
+
if (Array.isArray(value)) {
|
|
103
|
+
return value.map((item) => (0, exports.mapWatchFilterToChangeStreamMatch)(item));
|
|
104
|
+
}
|
|
105
|
+
if (!isPlainRecord(value))
|
|
106
|
+
return value;
|
|
107
|
+
return Object.entries(value).reduce((acc, [key, current]) => {
|
|
108
|
+
if (key.startsWith('$')) {
|
|
109
|
+
acc[key] = (0, exports.mapWatchFilterToChangeStreamMatch)(current);
|
|
110
|
+
return acc;
|
|
111
|
+
}
|
|
112
|
+
if (isOpaqueChangeEventObjectKey(key)) {
|
|
113
|
+
acc[key] = current;
|
|
114
|
+
return acc;
|
|
115
|
+
}
|
|
116
|
+
if (isChangeEventPath(key)) {
|
|
117
|
+
acc[key] = (0, exports.mapWatchFilterToChangeStreamMatch)(current);
|
|
118
|
+
return acc;
|
|
119
|
+
}
|
|
120
|
+
acc[`fullDocument.${key}`] = (0, exports.mapWatchFilterToChangeStreamMatch)(current);
|
|
121
|
+
return acc;
|
|
122
|
+
}, {});
|
|
123
|
+
};
|
|
124
|
+
exports.mapWatchFilterToChangeStreamMatch = mapWatchFilterToChangeStreamMatch;
|
|
125
|
+
const isLogicalOperator = (key) => key === '$and' || key === '$or' || key === '$nor';
|
|
126
|
+
const mapWatchFilterToDocumentQuery = (value) => {
|
|
127
|
+
if (Array.isArray(value)) {
|
|
128
|
+
const mapped = value
|
|
129
|
+
.map((item) => (0, exports.mapWatchFilterToDocumentQuery)(item))
|
|
130
|
+
.filter((item) => !(isRecord(item) && Object.keys(item).length === 0));
|
|
131
|
+
return mapped;
|
|
132
|
+
}
|
|
133
|
+
if (!isPlainRecord(value))
|
|
134
|
+
return value;
|
|
135
|
+
return Object.entries(value).reduce((acc, [key, current]) => {
|
|
136
|
+
if (key.startsWith('$')) {
|
|
137
|
+
const mapped = (0, exports.mapWatchFilterToDocumentQuery)(current);
|
|
138
|
+
if (isLogicalOperator(key) && Array.isArray(mapped)) {
|
|
139
|
+
if (mapped.length > 0) {
|
|
140
|
+
acc[key] = mapped;
|
|
141
|
+
}
|
|
142
|
+
return acc;
|
|
143
|
+
}
|
|
144
|
+
if (typeof mapped !== 'undefined') {
|
|
145
|
+
acc[key] = mapped;
|
|
146
|
+
}
|
|
147
|
+
return acc;
|
|
148
|
+
}
|
|
149
|
+
if (key === 'fullDocument') {
|
|
150
|
+
if (!isPlainRecord(current))
|
|
151
|
+
return acc;
|
|
152
|
+
const mapped = (0, exports.mapWatchFilterToDocumentQuery)(current);
|
|
153
|
+
if (isRecord(mapped)) {
|
|
154
|
+
Object.assign(acc, mapped);
|
|
155
|
+
}
|
|
156
|
+
return acc;
|
|
157
|
+
}
|
|
158
|
+
if (key.startsWith('fullDocument.')) {
|
|
159
|
+
const docKey = key.slice('fullDocument.'.length);
|
|
160
|
+
if (!docKey)
|
|
161
|
+
return acc;
|
|
162
|
+
acc[docKey] = (0, exports.mapWatchFilterToDocumentQuery)(current);
|
|
163
|
+
return acc;
|
|
164
|
+
}
|
|
165
|
+
if (isChangeEventPath(key)) {
|
|
166
|
+
return acc;
|
|
167
|
+
}
|
|
168
|
+
acc[key] = (0, exports.mapWatchFilterToDocumentQuery)(current);
|
|
169
|
+
return acc;
|
|
170
|
+
}, {});
|
|
171
|
+
};
|
|
172
|
+
exports.mapWatchFilterToDocumentQuery = mapWatchFilterToDocumentQuery;
|
|
173
|
+
const toStableValue = (value) => {
|
|
174
|
+
if (Array.isArray(value)) {
|
|
175
|
+
return value.map((item) => toStableValue(item));
|
|
176
|
+
}
|
|
177
|
+
if (!isPlainRecord(value))
|
|
178
|
+
return value;
|
|
179
|
+
const sortedEntries = Object.entries(value).sort(([left], [right]) => left.localeCompare(right));
|
|
180
|
+
return sortedEntries.reduce((acc, [key, current]) => {
|
|
181
|
+
acc[key] = toStableValue(current);
|
|
182
|
+
return acc;
|
|
183
|
+
}, {});
|
|
184
|
+
};
|
|
185
|
+
const stableSerialize = (value) => {
|
|
186
|
+
const serialized = bson_1.EJSON.serialize(value, { relaxed: false });
|
|
187
|
+
return JSON.stringify(toStableValue(serialized));
|
|
188
|
+
};
|
|
189
|
+
const getWatchPermissionContext = (user) => ({
|
|
190
|
+
role: user.role,
|
|
191
|
+
roles: user.roles,
|
|
192
|
+
data: user.data,
|
|
193
|
+
custom_data: user.custom_data,
|
|
194
|
+
user_data: user.user_data
|
|
195
|
+
});
|
|
196
|
+
const resolveWatchStream = (database, collection, watchArgs, user) => {
|
|
197
|
+
const keys = Object.keys(watchArgs);
|
|
198
|
+
const hasOnlyAllowedKeys = keys.every((key) => key === 'filter' || key === 'ids');
|
|
199
|
+
if (!hasOnlyAllowedKeys) {
|
|
200
|
+
throw new Error('watch options support only "filter" or "ids"');
|
|
201
|
+
}
|
|
202
|
+
const extraFilter = parseWatchFilter(watchArgs);
|
|
203
|
+
const ids = watchArgs.ids;
|
|
204
|
+
if (extraFilter && typeof ids !== 'undefined') {
|
|
205
|
+
throw new Error('watch options cannot include both "ids" and "filter"');
|
|
206
|
+
}
|
|
207
|
+
const pipeline = [];
|
|
208
|
+
if (extraFilter) {
|
|
209
|
+
pipeline.push({ $match: (0, exports.mapWatchFilterToChangeStreamMatch)(extraFilter) });
|
|
210
|
+
}
|
|
211
|
+
if (typeof ids !== 'undefined') {
|
|
212
|
+
if (!Array.isArray(ids)) {
|
|
213
|
+
throw new Error('watch ids must be an array');
|
|
214
|
+
}
|
|
215
|
+
pipeline.push({
|
|
216
|
+
$match: {
|
|
217
|
+
$or: [
|
|
218
|
+
{ 'documentKey._id': { $in: ids } },
|
|
219
|
+
{ 'fullDocument._id': { $in: ids } }
|
|
220
|
+
]
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
const options = { fullDocument: 'updateLookup' };
|
|
225
|
+
const streamKey = stableSerialize({
|
|
226
|
+
database,
|
|
227
|
+
collection,
|
|
228
|
+
pipeline,
|
|
229
|
+
options,
|
|
230
|
+
permissionContext: getWatchPermissionContext(user)
|
|
231
|
+
});
|
|
232
|
+
return { extraFilter, options, pipeline, streamKey };
|
|
233
|
+
};
|
|
234
|
+
const getWatchStats = () => {
|
|
235
|
+
let subscribers = 0;
|
|
236
|
+
for (const hub of sharedWatchStreams.values()) {
|
|
237
|
+
subscribers += hub.subscribers.size;
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
hubs: sharedWatchStreams.size,
|
|
241
|
+
subscribers
|
|
242
|
+
};
|
|
243
|
+
};
|
|
244
|
+
const logWatchStats = (event, details) => {
|
|
245
|
+
if (!debugWatchStreams)
|
|
246
|
+
return;
|
|
247
|
+
const stats = getWatchStats();
|
|
248
|
+
console.log('[watch-pool]', event, Object.assign({ hubs: stats.hubs, subscribers: stats.subscribers }, details));
|
|
249
|
+
};
|
|
63
250
|
const parseWatchFilter = (args) => {
|
|
64
|
-
var _a;
|
|
65
251
|
if (!isRecord(args))
|
|
66
252
|
return undefined;
|
|
67
|
-
const candidate =
|
|
68
|
-
|
|
253
|
+
const candidate = isRecord(args.filter) ? args.filter : undefined;
|
|
254
|
+
if (!candidate)
|
|
255
|
+
return undefined;
|
|
256
|
+
if ('$match' in candidate) {
|
|
257
|
+
throw new Error('watch filter must be a query object, not a $match stage');
|
|
258
|
+
}
|
|
259
|
+
return candidate;
|
|
69
260
|
};
|
|
70
261
|
const isReadableDocumentResult = (value) => !!value &&
|
|
71
262
|
typeof value === 'object' &&
|
|
@@ -136,12 +327,13 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
|
|
|
136
327
|
functionsList,
|
|
137
328
|
services: services_1.services
|
|
138
329
|
});
|
|
139
|
-
|
|
330
|
+
const normalizedResult = yield normalizeFunctionResult(result);
|
|
331
|
+
if (isReturnedError(normalizedResult)) {
|
|
140
332
|
res.type('application/json');
|
|
141
|
-
return JSON.stringify({ message:
|
|
333
|
+
return JSON.stringify({ message: normalizedResult.message, name: normalizedResult.name });
|
|
142
334
|
}
|
|
143
335
|
res.type('application/json');
|
|
144
|
-
return serializeEjson(
|
|
336
|
+
return serializeEjson(normalizedResult);
|
|
145
337
|
}
|
|
146
338
|
catch (error) {
|
|
147
339
|
res.status(400);
|
|
@@ -165,7 +357,9 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
|
|
|
165
357
|
const { baas_request, stitch_request } = query;
|
|
166
358
|
const decodedConfig = JSON.parse(Buffer.from(baas_request || stitch_request || '', 'base64').toString('utf8'));
|
|
167
359
|
const config = bson_1.EJSON.deserialize(decodedConfig);
|
|
168
|
-
const [_a] = config.arguments, { database, collection } = _a,
|
|
360
|
+
const [_a] = config.arguments, { database, collection } = _a, watchArgsInput = __rest(_a, ["database", "collection"]);
|
|
361
|
+
const watchArgs = isRecord(watchArgsInput) ? watchArgsInput : {};
|
|
362
|
+
console.log("🚀 ~ functionsController ~ watchArgs:", watchArgs);
|
|
169
363
|
const headers = {
|
|
170
364
|
'Content-Type': 'text/event-stream',
|
|
171
365
|
'Cache-Control': 'no-cache',
|
|
@@ -174,17 +368,27 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
|
|
|
174
368
|
"access-control-allow-origin": '*',
|
|
175
369
|
"access-control-allow-headers": "X-Stitch-Location, X-Baas-Location, Location",
|
|
176
370
|
};
|
|
177
|
-
res.raw.writeHead(200, headers);
|
|
178
|
-
res.raw.flushHeaders();
|
|
179
|
-
const streamKey = `${database}::${collection}`;
|
|
180
371
|
const subscriberId = `${Date.now()}-${watchSubscriberCounter++}`;
|
|
181
|
-
const extraFilter =
|
|
182
|
-
const mongoClient = app.mongo.client;
|
|
372
|
+
const { streamKey, extraFilter, options: watchOptions, pipeline: watchPipeline } = resolveWatchStream(database, collection, watchArgs, user);
|
|
183
373
|
let hub = sharedWatchStreams.get(streamKey);
|
|
184
374
|
if (!hub) {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
375
|
+
if (sharedWatchStreams.size >= maxSharedWatchStreams) {
|
|
376
|
+
res.status(503);
|
|
377
|
+
return JSON.stringify({
|
|
378
|
+
error: JSON.stringify({
|
|
379
|
+
message: 'Watch stream limit reached',
|
|
380
|
+
name: 'WatchStreamLimitError'
|
|
381
|
+
}),
|
|
382
|
+
error_code: 'WatchStreamLimitError'
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
const stream = services_1.services['mongodb-atlas'](app, {
|
|
386
|
+
user,
|
|
387
|
+
rules
|
|
388
|
+
})
|
|
389
|
+
.db(database)
|
|
390
|
+
.collection(collection)
|
|
391
|
+
.watch(watchPipeline, watchOptions);
|
|
188
392
|
hub = {
|
|
189
393
|
database,
|
|
190
394
|
collection,
|
|
@@ -192,7 +396,13 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
|
|
|
192
396
|
subscribers: new Map()
|
|
193
397
|
};
|
|
194
398
|
sharedWatchStreams.set(streamKey, hub);
|
|
399
|
+
logWatchStats('hub-created', { streamKey, database, collection });
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
logWatchStats('hub-reused', { streamKey, database, collection });
|
|
195
403
|
}
|
|
404
|
+
res.raw.writeHead(200, headers);
|
|
405
|
+
res.raw.flushHeaders();
|
|
196
406
|
const ensureHubListeners = (currentHub) => {
|
|
197
407
|
if (currentHub.listenersBound) {
|
|
198
408
|
return;
|
|
@@ -201,6 +411,7 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
|
|
|
201
411
|
currentHub.stream.off('change', onHubChange);
|
|
202
412
|
currentHub.stream.off('error', onHubError);
|
|
203
413
|
sharedWatchStreams.delete(streamKey);
|
|
414
|
+
logWatchStats('hub-closed', { streamKey, database, collection });
|
|
204
415
|
try {
|
|
205
416
|
yield currentHub.stream.close();
|
|
206
417
|
}
|
|
@@ -209,19 +420,21 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
|
|
|
209
420
|
}
|
|
210
421
|
});
|
|
211
422
|
const onHubChange = (change) => __awaiter(void 0, void 0, void 0, function* () {
|
|
423
|
+
console.log("🚀 ~ onHubChange ~ change:", change);
|
|
212
424
|
const subscribers = Array.from(currentHub.subscribers.values());
|
|
213
425
|
yield Promise.all(subscribers.map((subscriber) => __awaiter(void 0, void 0, void 0, function* () {
|
|
214
426
|
var _a, _b, _c;
|
|
215
427
|
const subscriberRes = subscriber.response;
|
|
216
428
|
if (subscriberRes.writableEnded || subscriberRes.destroyed) {
|
|
217
429
|
currentHub.subscribers.delete(subscriber.id);
|
|
430
|
+
logWatchStats('subscriber-auto-removed', { streamKey, subscriberId: subscriber.id });
|
|
218
431
|
return;
|
|
219
432
|
}
|
|
220
433
|
const docId = (_b = (_a = change === null || change === void 0 ? void 0 : change.documentKey) === null || _a === void 0 ? void 0 : _a._id) !== null && _b !== void 0 ? _b : (_c = change === null || change === void 0 ? void 0 : change.fullDocument) === null || _c === void 0 ? void 0 : _c._id;
|
|
221
434
|
if (typeof docId === 'undefined')
|
|
222
435
|
return;
|
|
223
|
-
const readQuery = subscriber.
|
|
224
|
-
? { $and: [subscriber.
|
|
436
|
+
const readQuery = subscriber.documentFilter
|
|
437
|
+
? { $and: [subscriber.documentFilter, { _id: docId }] }
|
|
225
438
|
: { _id: docId };
|
|
226
439
|
try {
|
|
227
440
|
const readableDoc = yield services_1.services['mongodb-atlas'](app, {
|
|
@@ -231,6 +444,7 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
|
|
|
231
444
|
.db(currentHub.database)
|
|
232
445
|
.collection(currentHub.collection)
|
|
233
446
|
.findOne(readQuery);
|
|
447
|
+
console.log("🚀 ~ onHubChange ~ readableDoc:", readableDoc);
|
|
234
448
|
if (!isReadableDocumentResult(readableDoc))
|
|
235
449
|
return;
|
|
236
450
|
subscriberRes.write(`data: ${serializeEjson(change)}\n\n`);
|
|
@@ -239,6 +453,7 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
|
|
|
239
453
|
subscriberRes.write(`event: error\ndata: ${formatFunctionExecutionError(error)}\n\n`);
|
|
240
454
|
subscriberRes.end();
|
|
241
455
|
currentHub.subscribers.delete(subscriber.id);
|
|
456
|
+
logWatchStats('subscriber-error-removed', { streamKey, subscriberId: subscriber.id });
|
|
242
457
|
}
|
|
243
458
|
})));
|
|
244
459
|
if (!currentHub.subscribers.size) {
|
|
@@ -265,17 +480,27 @@ const functionsController = (app_1, _a) => __awaiter(void 0, [app_1, _a], void 0
|
|
|
265
480
|
id: subscriberId,
|
|
266
481
|
user,
|
|
267
482
|
response: res.raw,
|
|
268
|
-
|
|
483
|
+
documentFilter: (() => {
|
|
484
|
+
if (!extraFilter)
|
|
485
|
+
return undefined;
|
|
486
|
+
const mapped = (0, exports.mapWatchFilterToDocumentQuery)(extraFilter);
|
|
487
|
+
if (!isRecord(mapped) || Object.keys(mapped).length === 0)
|
|
488
|
+
return undefined;
|
|
489
|
+
return mapped;
|
|
490
|
+
})()
|
|
269
491
|
};
|
|
270
492
|
hub.subscribers.set(subscriberId, subscriber);
|
|
493
|
+
logWatchStats('subscriber-added', { streamKey, subscriberId });
|
|
271
494
|
req.raw.on('close', () => {
|
|
272
495
|
const currentHub = sharedWatchStreams.get(streamKey);
|
|
273
496
|
if (!currentHub)
|
|
274
497
|
return;
|
|
275
498
|
currentHub.subscribers.delete(subscriberId);
|
|
499
|
+
logWatchStats('subscriber-closed', { streamKey, subscriberId });
|
|
276
500
|
if (!currentHub.subscribers.size) {
|
|
277
501
|
void currentHub.stream.close();
|
|
278
502
|
sharedWatchStreams.delete(streamKey);
|
|
503
|
+
logWatchStats('hub-empty-closed', { streamKey });
|
|
279
504
|
}
|
|
280
505
|
});
|
|
281
506
|
}));
|
|
@@ -30,6 +30,7 @@ declare const Api: (_app?: unknown, opt?: {
|
|
|
30
30
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
31
31
|
};
|
|
32
32
|
statusCode: number;
|
|
33
|
+
statusText: string;
|
|
33
34
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
34
35
|
trailers: Record<string, string>;
|
|
35
36
|
opaque: T;
|
|
@@ -58,6 +59,7 @@ declare const Api: (_app?: unknown, opt?: {
|
|
|
58
59
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
59
60
|
};
|
|
60
61
|
statusCode: number;
|
|
62
|
+
statusText: string;
|
|
61
63
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
62
64
|
trailers: Record<string, string>;
|
|
63
65
|
opaque: T;
|
|
@@ -86,6 +88,7 @@ declare const Api: (_app?: unknown, opt?: {
|
|
|
86
88
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
87
89
|
};
|
|
88
90
|
statusCode: number;
|
|
91
|
+
statusText: string;
|
|
89
92
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
90
93
|
trailers: Record<string, string>;
|
|
91
94
|
opaque: T;
|
|
@@ -114,6 +117,7 @@ declare const Api: (_app?: unknown, opt?: {
|
|
|
114
117
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
115
118
|
};
|
|
116
119
|
statusCode: number;
|
|
120
|
+
statusText: string;
|
|
117
121
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
118
122
|
trailers: Record<string, string>;
|
|
119
123
|
opaque: T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/api/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAGxE;;GAEG;AACH,QAAA,MAAM,GAAG,GAAI,OAAO,OAAO,EAAE,MAAM;IAAE,UAAU,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE;UAG5D,CAAC,wCAAoD,SAAS
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/api/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAGxE;;GAEG;AACH,QAAA,MAAM,GAAG,GAAI,OAAO,OAAO,EAAE,MAAM;IAAE,UAAU,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE;UAG5D,CAAC,wCAAoD,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAuB7D,CAAC,gGASX,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA+BD,CAAC,gGASV,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA+BG,CAAC,wEAOb,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyBlB,CAAA;AAED,eAAe,GAAG,CAAA"}
|
|
@@ -29,6 +29,7 @@ export declare const makeRequest: <T = null>({ method, url, headers, body, resol
|
|
|
29
29
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
30
30
|
};
|
|
31
31
|
statusCode: number;
|
|
32
|
+
statusText: string;
|
|
32
33
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
33
34
|
trailers: Record<string, string>;
|
|
34
35
|
opaque: T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/services/api/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAS,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAgBlD;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAU,CAAC,GAAG,IAAI,EAAE,6CAMzC,iBAAiB
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/services/api/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAS,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAgBlD;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAU,CAAC,GAAG,IAAI,EAAE,6CAMzC,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBnB,CAAA"}
|
package/dist/services/index.d.ts
CHANGED
|
@@ -27,6 +27,7 @@ export declare const services: {
|
|
|
27
27
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
28
28
|
};
|
|
29
29
|
statusCode: number;
|
|
30
|
+
statusText: string;
|
|
30
31
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
31
32
|
trailers: Record<string, string>;
|
|
32
33
|
opaque: T;
|
|
@@ -55,6 +56,7 @@ export declare const services: {
|
|
|
55
56
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
56
57
|
};
|
|
57
58
|
statusCode: number;
|
|
59
|
+
statusText: string;
|
|
58
60
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
59
61
|
trailers: Record<string, string>;
|
|
60
62
|
opaque: T;
|
|
@@ -83,6 +85,7 @@ export declare const services: {
|
|
|
83
85
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
84
86
|
};
|
|
85
87
|
statusCode: number;
|
|
88
|
+
statusText: string;
|
|
86
89
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
87
90
|
trailers: Record<string, string>;
|
|
88
91
|
opaque: T;
|
|
@@ -111,6 +114,7 @@ export declare const services: {
|
|
|
111
114
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
112
115
|
};
|
|
113
116
|
statusCode: number;
|
|
117
|
+
statusText: string;
|
|
114
118
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
115
119
|
trailers: Record<string, string>;
|
|
116
120
|
opaque: T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,QAAQ;;kBAMoG,CAAC;uBAAe,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,QAAQ;;kBAMoG,CAAC;uBAAe,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAA2hB,CAAC;uBAAe,CAAC;;;;;;;;;;;;;;;;sBAA0/F,CAAC;yBAAa,CAAC;;;;;;;;;;;CAD9rH,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/services/mongodb-atlas/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,SAAS,CAAA;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,EACL,mBAAmB,EAEnB,MAAM,EAEN,UAAU,EACV,KAAK,EAGN,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;AAGlD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAE7D,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,IAAI,GAAG,MAAM,EAAE,2BAInD,kBAAkB,CAAC,CAAC,CAAC,QA8BvB,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,UAAS,MAAM,EAAO,EACtB,QAAQ,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EACtD,OAAO,IAAI,8BAcZ,CAAA;AAED,eAAO,MAAM,sBAAsB,GACjC,UAAS,MAAM,EAAO,EACtB,OAAO,IAAI,KACV,UAAU,GAAG,IAaf,CAAA;AAED,eAAO,MAAM,4BAA4B,GACvC,UAAU,mBAAmB,EAC7B,OAAO,MAAM,CACX,MAAM,EACN;IACE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;CACf,CACF,EACD,MAAM,IAAI,EACV,gBAAgB,MAAM,EACtB,UAAU;IACR,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,KACA,mBA6GF,CAAA;AAED,eAAO,MAAM,kBAAkB,GAC7B,OAAO,KAAK,EACZ,gBAAgB,MAAM,EACtB,WAAW,eAAe,SAM3B,CAAA;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE;;;;;;;;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/services/mongodb-atlas/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,SAAS,CAAA;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,EACL,mBAAmB,EAEnB,MAAM,EAEN,UAAU,EACV,KAAK,EAGN,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;AAGlD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAE7D,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,IAAI,GAAG,MAAM,EAAE,2BAInD,kBAAkB,CAAC,CAAC,CAAC,QA8BvB,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,UAAS,MAAM,EAAO,EACtB,QAAQ,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EACtD,OAAO,IAAI,8BAcZ,CAAA;AAED,eAAO,MAAM,sBAAsB,GACjC,UAAS,MAAM,EAAO,EACtB,OAAO,IAAI,KACV,UAAU,GAAG,IAaf,CAAA;AAED,eAAO,MAAM,4BAA4B,GACvC,UAAU,mBAAmB,EAC7B,OAAO,MAAM,CACX,MAAM,EACN;IACE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;CACf,CACF,EACD,MAAM,IAAI,EACV,gBAAgB,MAAM,EACtB,UAAU;IACR,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,KACA,mBA6GF,CAAA;AAED,eAAO,MAAM,kBAAkB,GAC7B,OAAO,KAAK,EACZ,gBAAgB,MAAM,EACtB,WAAW,eAAe,SAM3B,CAAA;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE;;;;;;;;iBA0I8iqS,CAAC;sBAAgC,CAAC;2BAAsC,CAAC;;;;IAlIrrqS;AAED,eAAO,MAAM,0BAA0B,GAAI,UAAU,QAAQ,EAAE,aAgC9D,CAAA;AAYD,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,mBAAmB,QA+BvE;AAED,wBAAgB,8BAA8B,CAAC,WAAW,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;CAAE,YAK9E;AAwCD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,EAAE,uBAKtF"}
|
|
@@ -217,6 +217,7 @@ function getHiddenFieldsFromRulesConfig(rulesConfig) {
|
|
|
217
217
|
}
|
|
218
218
|
function collectHiddenFieldsFromRoles(roles = []) {
|
|
219
219
|
const hiddenFields = new Set();
|
|
220
|
+
const isFieldPermissionObject = (value) => !!value && typeof value === 'object' && ('read' in value || 'write' in value);
|
|
220
221
|
const collectFromFields = (fields) => {
|
|
221
222
|
if (!fields)
|
|
222
223
|
return;
|
|
@@ -227,9 +228,24 @@ function collectHiddenFieldsFromRoles(roles = []) {
|
|
|
227
228
|
}
|
|
228
229
|
});
|
|
229
230
|
};
|
|
231
|
+
const collectFromAdditionalFields = (fields) => {
|
|
232
|
+
if (!fields || typeof fields !== 'object')
|
|
233
|
+
return;
|
|
234
|
+
// Global additional_fields permissions (read/write) apply to unknown fields and cannot be mapped.
|
|
235
|
+
if (isFieldPermissionObject(fields))
|
|
236
|
+
return;
|
|
237
|
+
Object.entries(fields).forEach(([fieldName, permissions]) => {
|
|
238
|
+
if (!isFieldPermissionObject(permissions))
|
|
239
|
+
return;
|
|
240
|
+
const canRead = Boolean(permissions.read || permissions.write);
|
|
241
|
+
if (!canRead) {
|
|
242
|
+
hiddenFields.add(fieldName);
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
};
|
|
230
246
|
roles.forEach((role) => {
|
|
231
247
|
collectFromFields(role.fields);
|
|
232
|
-
|
|
248
|
+
collectFromAdditionalFields(role.additional_fields);
|
|
233
249
|
});
|
|
234
250
|
return Array.from(hiddenFields);
|
|
235
251
|
}
|
|
@@ -82,6 +82,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
|
|
|
82
82
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
83
83
|
};
|
|
84
84
|
statusCode: number;
|
|
85
|
+
statusText: string;
|
|
85
86
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
86
87
|
trailers: Record<string, string>;
|
|
87
88
|
opaque: T;
|
|
@@ -110,6 +111,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
|
|
|
110
111
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
111
112
|
};
|
|
112
113
|
statusCode: number;
|
|
114
|
+
statusText: string;
|
|
113
115
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
114
116
|
trailers: Record<string, string>;
|
|
115
117
|
opaque: T;
|
|
@@ -138,6 +140,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
|
|
|
138
140
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
139
141
|
};
|
|
140
142
|
statusCode: number;
|
|
143
|
+
statusText: string;
|
|
141
144
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
142
145
|
trailers: Record<string, string>;
|
|
143
146
|
opaque: T;
|
|
@@ -166,6 +169,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
|
|
|
166
169
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
167
170
|
};
|
|
168
171
|
statusCode: number;
|
|
172
|
+
statusText: string;
|
|
169
173
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
170
174
|
trailers: Record<string, string>;
|
|
171
175
|
opaque: T;
|
|
@@ -230,6 +234,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
|
|
|
230
234
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
231
235
|
};
|
|
232
236
|
statusCode: number;
|
|
237
|
+
statusText: string;
|
|
233
238
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
234
239
|
trailers: Record<string, string>;
|
|
235
240
|
opaque: T;
|
|
@@ -258,6 +263,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
|
|
|
258
263
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
259
264
|
};
|
|
260
265
|
statusCode: number;
|
|
266
|
+
statusText: string;
|
|
261
267
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
262
268
|
trailers: Record<string, string>;
|
|
263
269
|
opaque: T;
|
|
@@ -286,6 +292,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
|
|
|
286
292
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
287
293
|
};
|
|
288
294
|
statusCode: number;
|
|
295
|
+
statusText: string;
|
|
289
296
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
290
297
|
trailers: Record<string, string>;
|
|
291
298
|
opaque: T;
|
|
@@ -314,6 +321,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
|
|
|
314
321
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
315
322
|
};
|
|
316
323
|
statusCode: number;
|
|
324
|
+
statusText: string;
|
|
317
325
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
318
326
|
trailers: Record<string, string>;
|
|
319
327
|
opaque: T;
|
|
@@ -377,6 +385,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
|
|
|
377
385
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
378
386
|
};
|
|
379
387
|
statusCode: number;
|
|
388
|
+
statusText: string;
|
|
380
389
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
381
390
|
trailers: Record<string, string>;
|
|
382
391
|
opaque: T;
|
|
@@ -405,6 +414,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
|
|
|
405
414
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
406
415
|
};
|
|
407
416
|
statusCode: number;
|
|
417
|
+
statusText: string;
|
|
408
418
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
409
419
|
trailers: Record<string, string>;
|
|
410
420
|
opaque: T;
|
|
@@ -433,6 +443,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
|
|
|
433
443
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
434
444
|
};
|
|
435
445
|
statusCode: number;
|
|
446
|
+
statusText: string;
|
|
436
447
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
437
448
|
trailers: Record<string, string>;
|
|
438
449
|
opaque: T;
|
|
@@ -461,6 +472,7 @@ export declare const generateContextData: ({ user, services, app, rules, current
|
|
|
461
472
|
bytes: () => Uint8Array<ArrayBuffer>;
|
|
462
473
|
};
|
|
463
474
|
statusCode: number;
|
|
475
|
+
statusText: string;
|
|
464
476
|
headers: import("undici/types/header").IncomingHttpHeaders;
|
|
465
477
|
trailers: Record<string, string>;
|
|
466
478
|
opaque: T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/context/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAG1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAEvD,KAAK,QAAQ,GAAG;IACd,MAAM,EAAE,CACN,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACzC,MAAM,CAAA;IACX,MAAM,EAAE,CACN,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GAAG,MAAM,EACpB,YAAY,CAAC,EAAE,OAAO,EACtB,sBAAsB,CAAC,EAAE,MAAM,EAAE,KAC9B,OAAO,CAAA;CACb,CAAA;AAgFD;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,GAAI,4GAUjC,yBAAyB;;;;;;;;;;;;;uBA4DP,SAAS;yBAGP,SAAS;;;;;;;;;;;;;;;;;;uBAcb,MAAM;;;;;;+BA5CU,MAAM,OAAO,QAAQ;;;;sCA1HrC,CAAC
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/context/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAG1C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAEvD,KAAK,QAAQ,GAAG;IACd,MAAM,EAAE,CACN,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACzC,MAAM,CAAA;IACX,MAAM,EAAE,CACN,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GAAG,MAAM,EACpB,YAAY,CAAC,EAAE,OAAO,EACtB,sBAAsB,CAAC,EAAE,MAAM,EAAE,KAC9B,OAAO,CAAA;CACb,CAAA;AAgFD;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,GAAI,4GAUjC,yBAAyB;;;;;;;;;;;;;uBA4DP,SAAS;yBAGP,SAAS;;;;;;;;;;;;;;;;;;uBAcb,MAAM;;;;;;+BA5CU,MAAM,OAAO,QAAQ;;;;sCA1HrC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BAsGT,CAAC;iCAAa,CAAC;;;;;;;;;;;;;;;;;;;kCAtGP,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAsGT,CAAC;6BAAa,CAAC;;;;;;;;;;;;;;;;;;kCAtGP,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAsGT,CAAC;6BAAa,CAAC;;;;;;;;;;;;;;;4BAyEF,MAAM,OAAO,aAAa,WAAW,SAAS;;;CAiBrE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/roles/helpers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/roles/helpers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAgBrD,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,cAAc,CAAC,QAAQ,CAAC,EAChC,aAAa,oBAAoB,EACjC,OAAO,cAAc,CAAC,MAAM,CAAC,KAC5B,OAAO,CAAC,OAAO,CAiBjB,CAAA"}
|