@dxos/functions 0.5.3-main.79e0565 → 0.5.3-main.7e64682
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/lib/browser/chunk-CMMH5BA6.mjs +86 -0
- package/dist/lib/browser/chunk-CMMH5BA6.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +211 -204
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/types.mjs +14 -0
- package/dist/lib/browser/types.mjs.map +7 -0
- package/dist/lib/node/chunk-3C2FP4J4.cjs +103 -0
- package/dist/lib/node/chunk-3C2FP4J4.cjs.map +7 -0
- package/dist/lib/node/index.cjs +218 -203
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/types.cjs +35 -0
- package/dist/lib/node/types.cjs.map +7 -0
- package/dist/types/src/browser/index.d.ts +2 -0
- package/dist/types/src/browser/index.d.ts.map +1 -0
- package/dist/types/src/function/function-registry.d.ts.map +1 -1
- package/dist/types/src/handler.d.ts.map +1 -1
- package/dist/types/src/runtime/dev-server.d.ts.map +1 -1
- package/dist/types/src/runtime/scheduler.d.ts +1 -1
- package/dist/types/src/runtime/scheduler.d.ts.map +1 -1
- package/dist/types/src/testing/setup.d.ts.map +1 -1
- package/dist/types/src/trigger/trigger-registry.d.ts +2 -5
- package/dist/types/src/trigger/trigger-registry.d.ts.map +1 -1
- package/dist/types/src/trigger/type/subscription-trigger.d.ts.map +1 -1
- package/dist/types/src/trigger/type/timer-trigger.d.ts.map +1 -1
- package/dist/types/src/trigger/type/webhook-trigger.d.ts.map +1 -1
- package/dist/types/src/trigger/type/websocket-trigger.d.ts.map +1 -1
- package/dist/types/src/types.d.ts +43 -33
- package/dist/types/src/types.d.ts.map +1 -1
- package/package.json +30 -16
- package/schema/functions.json +5 -0
- package/src/browser/index.ts +5 -0
- package/src/function/function-registry.ts +5 -5
- package/src/runtime/dev-server.ts +4 -4
- package/src/runtime/scheduler.test.ts +14 -9
- package/src/runtime/scheduler.ts +14 -9
- package/src/testing/functions-integration.test.ts +1 -0
- package/src/testing/setup.ts +8 -10
- package/src/trigger/trigger-registry.test.ts +30 -13
- package/src/trigger/trigger-registry.ts +59 -37
- package/src/trigger/type/subscription-trigger.ts +13 -7
- package/src/trigger/type/timer-trigger.ts +4 -3
- package/src/trigger/type/webhook-trigger.ts +3 -2
- package/src/trigger/type/websocket-trigger.ts +4 -3
- package/src/types.ts +39 -30
- package/dist/types/src/util.d.ts +0 -15
- package/dist/types/src/util.d.ts.map +0 -1
- package/dist/types/src/util.test.d.ts +0 -2
- package/dist/types/src/util.test.d.ts.map +0 -1
- package/src/util.test.ts +0 -43
- package/src/util.ts +0 -48
|
@@ -1,18 +1,11 @@
|
|
|
1
1
|
import "@dxos/node-std/globals";
|
|
2
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
3
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
4
|
-
}) : x)(function(x) {
|
|
5
|
-
if (typeof require !== "undefined")
|
|
6
|
-
return require.apply(this, arguments);
|
|
7
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
// inject-globals:@inject-globals
|
|
11
2
|
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
3
|
+
FUNCTION_SCHEMA,
|
|
4
|
+
FunctionDef,
|
|
5
|
+
FunctionManifestSchema,
|
|
6
|
+
FunctionTrigger,
|
|
7
|
+
__require
|
|
8
|
+
} from "./chunk-CMMH5BA6.mjs";
|
|
16
9
|
|
|
17
10
|
// packages/core/functions/src/function/function-registry.ts
|
|
18
11
|
import { Event } from "@dxos/async";
|
|
@@ -20,90 +13,7 @@ import { create, Filter } from "@dxos/client/echo";
|
|
|
20
13
|
import { Resource } from "@dxos/context";
|
|
21
14
|
import { PublicKey } from "@dxos/keys";
|
|
22
15
|
import { log } from "@dxos/log";
|
|
23
|
-
import { ComplexMap } from "@dxos/util";
|
|
24
|
-
|
|
25
|
-
// packages/core/functions/src/types.ts
|
|
26
|
-
import { RawObject, S, TypedObject } from "@dxos/echo-schema";
|
|
27
|
-
var SubscriptionTriggerSchema = S.struct({
|
|
28
|
-
type: S.literal("subscription"),
|
|
29
|
-
// TODO(burdon): Define query DSL (from ECHO).
|
|
30
|
-
filter: S.array(S.struct({
|
|
31
|
-
type: S.string,
|
|
32
|
-
props: S.optional(S.record(S.string, S.any))
|
|
33
|
-
})),
|
|
34
|
-
options: S.optional(S.struct({
|
|
35
|
-
// Watch changes to object (not just creation).
|
|
36
|
-
deep: S.optional(S.boolean),
|
|
37
|
-
// Debounce changes (delay in ms).
|
|
38
|
-
delay: S.optional(S.number)
|
|
39
|
-
}))
|
|
40
|
-
});
|
|
41
|
-
var TimerTriggerSchema = S.struct({
|
|
42
|
-
type: S.literal("timer"),
|
|
43
|
-
cron: S.string
|
|
44
|
-
});
|
|
45
|
-
var WebhookTriggerSchema = S.mutable(S.struct({
|
|
46
|
-
type: S.literal("webhook"),
|
|
47
|
-
method: S.string,
|
|
48
|
-
// Assigned port.
|
|
49
|
-
port: S.optional(S.number)
|
|
50
|
-
}));
|
|
51
|
-
var WebsocketTriggerSchema = S.struct({
|
|
52
|
-
type: S.literal("websocket"),
|
|
53
|
-
url: S.string,
|
|
54
|
-
init: S.optional(S.record(S.string, S.any))
|
|
55
|
-
});
|
|
56
|
-
var TriggerSpecSchema = S.union(TimerTriggerSchema, WebhookTriggerSchema, WebsocketTriggerSchema, SubscriptionTriggerSchema);
|
|
57
|
-
var FunctionDef = class extends TypedObject({
|
|
58
|
-
typename: "dxos.org/type/FunctionDef",
|
|
59
|
-
version: "0.1.0"
|
|
60
|
-
})({
|
|
61
|
-
uri: S.string,
|
|
62
|
-
description: S.optional(S.string),
|
|
63
|
-
route: S.string,
|
|
64
|
-
// TODO(burdon): NPM/GitHub/Docker/CF URL?
|
|
65
|
-
handler: S.string
|
|
66
|
-
}) {
|
|
67
|
-
};
|
|
68
|
-
var FunctionTrigger = class extends TypedObject({
|
|
69
|
-
typename: "dxos.org/type/FunctionTrigger",
|
|
70
|
-
version: "0.1.0"
|
|
71
|
-
})({
|
|
72
|
-
function: S.string.pipe(S.description("Function URI.")),
|
|
73
|
-
// Context is merged into the event data passed to the function.
|
|
74
|
-
meta: S.optional(S.object),
|
|
75
|
-
spec: TriggerSpecSchema
|
|
76
|
-
}) {
|
|
77
|
-
};
|
|
78
|
-
var FunctionManifestSchema = S.struct({
|
|
79
|
-
functions: S.optional(S.mutable(S.array(RawObject(FunctionDef)))),
|
|
80
|
-
triggers: S.optional(S.mutable(S.array(RawObject(FunctionTrigger))))
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
// packages/core/functions/src/util.ts
|
|
84
|
-
var diff = (previous, next, comparator) => {
|
|
85
|
-
const remaining = [
|
|
86
|
-
...previous
|
|
87
|
-
];
|
|
88
|
-
const result = {
|
|
89
|
-
added: [],
|
|
90
|
-
updated: [],
|
|
91
|
-
removed: remaining
|
|
92
|
-
};
|
|
93
|
-
for (const object of next) {
|
|
94
|
-
const index = remaining.findIndex((item) => comparator(item, object));
|
|
95
|
-
if (index === -1) {
|
|
96
|
-
result.added.push(object);
|
|
97
|
-
} else {
|
|
98
|
-
result.updated.push(remaining[index]);
|
|
99
|
-
remaining.splice(index, 1);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return result;
|
|
103
|
-
};
|
|
104
|
-
var intersection = (a, b, comparator) => a.filter((a2) => b.find((b2) => comparator(a2, b2)) !== void 0);
|
|
105
|
-
|
|
106
|
-
// packages/core/functions/src/function/function-registry.ts
|
|
16
|
+
import { ComplexMap, diff } from "@dxos/util";
|
|
107
17
|
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/functions/src/function/function-registry.ts";
|
|
108
18
|
var FunctionRegistry = class extends Resource {
|
|
109
19
|
constructor(_client) {
|
|
@@ -125,7 +35,7 @@ var FunctionRegistry = class extends Resource {
|
|
|
125
35
|
functions: functions?.length ?? 0
|
|
126
36
|
}, {
|
|
127
37
|
F: __dxlog_file,
|
|
128
|
-
L:
|
|
38
|
+
L: 38,
|
|
129
39
|
S: this,
|
|
130
40
|
C: (f, a) => f(...a)
|
|
131
41
|
});
|
|
@@ -136,11 +46,16 @@ var FunctionRegistry = class extends Resource {
|
|
|
136
46
|
space.db.graph.runtimeSchemaRegistry.registerSchema(FunctionDef);
|
|
137
47
|
}
|
|
138
48
|
const { objects: existing } = await space.db.query(Filter.schema(FunctionDef)).run();
|
|
139
|
-
const { added
|
|
49
|
+
const { added } = diff(existing, functions, (a, b) => a.uri === b.uri);
|
|
140
50
|
added.forEach((def) => space.db.add(create(FunctionDef, def)));
|
|
141
|
-
removed.forEach((def) => space.db.remove(def));
|
|
142
51
|
}
|
|
143
52
|
async _open() {
|
|
53
|
+
log.info("opening...", void 0, {
|
|
54
|
+
F: __dxlog_file,
|
|
55
|
+
L: 54,
|
|
56
|
+
S: this,
|
|
57
|
+
C: (f, a) => f(...a)
|
|
58
|
+
});
|
|
144
59
|
const spacesSubscription = this._client.spaces.subscribe(async (spaces) => {
|
|
145
60
|
for (const space of spaces) {
|
|
146
61
|
if (this._functionBySpaceKey.has(space.key)) {
|
|
@@ -167,6 +82,12 @@ var FunctionRegistry = class extends Resource {
|
|
|
167
82
|
this._ctx.onDispose(() => spacesSubscription.unsubscribe());
|
|
168
83
|
}
|
|
169
84
|
async _close(_) {
|
|
85
|
+
log.info("closing...", void 0, {
|
|
86
|
+
F: __dxlog_file,
|
|
87
|
+
L: 87,
|
|
88
|
+
S: this,
|
|
89
|
+
C: (f, a) => f(...a)
|
|
90
|
+
});
|
|
170
91
|
this._functionBySpaceKey.clear();
|
|
171
92
|
}
|
|
172
93
|
};
|
|
@@ -240,7 +161,7 @@ var DevServer = class {
|
|
|
240
161
|
added
|
|
241
162
|
}, {
|
|
242
163
|
F: __dxlog_file3,
|
|
243
|
-
L:
|
|
164
|
+
L: 53,
|
|
244
165
|
S: this,
|
|
245
166
|
C: (f, a) => f(...a)
|
|
246
167
|
});
|
|
@@ -254,7 +175,7 @@ var DevServer = class {
|
|
|
254
175
|
get endpoint() {
|
|
255
176
|
invariant(this._port, void 0, {
|
|
256
177
|
F: __dxlog_file3,
|
|
257
|
-
L:
|
|
178
|
+
L: 64,
|
|
258
179
|
S: this,
|
|
259
180
|
A: [
|
|
260
181
|
"this._port",
|
|
@@ -272,7 +193,7 @@ var DevServer = class {
|
|
|
272
193
|
async start() {
|
|
273
194
|
invariant(!this._server, void 0, {
|
|
274
195
|
F: __dxlog_file3,
|
|
275
|
-
L:
|
|
196
|
+
L: 77,
|
|
276
197
|
S: this,
|
|
277
198
|
A: [
|
|
278
199
|
"!this._server",
|
|
@@ -281,7 +202,7 @@ var DevServer = class {
|
|
|
281
202
|
});
|
|
282
203
|
log3.info("starting...", void 0, {
|
|
283
204
|
F: __dxlog_file3,
|
|
284
|
-
L:
|
|
205
|
+
L: 78,
|
|
285
206
|
S: this,
|
|
286
207
|
C: (f, a) => f(...a)
|
|
287
208
|
});
|
|
@@ -295,7 +216,7 @@ var DevServer = class {
|
|
|
295
216
|
path: path2
|
|
296
217
|
}, {
|
|
297
218
|
F: __dxlog_file3,
|
|
298
|
-
L:
|
|
219
|
+
L: 88,
|
|
299
220
|
S: this,
|
|
300
221
|
C: (f, a) => f(...a)
|
|
301
222
|
});
|
|
@@ -308,7 +229,7 @@ var DevServer = class {
|
|
|
308
229
|
} catch (err) {
|
|
309
230
|
log3.catch(err, void 0, {
|
|
310
231
|
F: __dxlog_file3,
|
|
311
|
-
L:
|
|
232
|
+
L: 98,
|
|
312
233
|
S: this,
|
|
313
234
|
C: (f, a) => f(...a)
|
|
314
235
|
});
|
|
@@ -333,7 +254,7 @@ var DevServer = class {
|
|
|
333
254
|
endpoint
|
|
334
255
|
}, {
|
|
335
256
|
F: __dxlog_file3,
|
|
336
|
-
L:
|
|
257
|
+
L: 113,
|
|
337
258
|
S: this,
|
|
338
259
|
C: (f, a) => f(...a)
|
|
339
260
|
});
|
|
@@ -348,7 +269,7 @@ var DevServer = class {
|
|
|
348
269
|
port: this._port
|
|
349
270
|
}, {
|
|
350
271
|
F: __dxlog_file3,
|
|
351
|
-
L:
|
|
272
|
+
L: 124,
|
|
352
273
|
S: this,
|
|
353
274
|
C: (f, a) => f(...a)
|
|
354
275
|
});
|
|
@@ -356,7 +277,7 @@ var DevServer = class {
|
|
|
356
277
|
async stop() {
|
|
357
278
|
invariant(this._server, void 0, {
|
|
358
279
|
F: __dxlog_file3,
|
|
359
|
-
L:
|
|
280
|
+
L: 128,
|
|
360
281
|
S: this,
|
|
361
282
|
A: [
|
|
362
283
|
"this._server",
|
|
@@ -365,7 +286,7 @@ var DevServer = class {
|
|
|
365
286
|
});
|
|
366
287
|
log3.info("stopping...", void 0, {
|
|
367
288
|
F: __dxlog_file3,
|
|
368
|
-
L:
|
|
289
|
+
L: 129,
|
|
369
290
|
S: this,
|
|
370
291
|
C: (f, a) => f(...a)
|
|
371
292
|
});
|
|
@@ -373,7 +294,7 @@ var DevServer = class {
|
|
|
373
294
|
this._server.close(async () => {
|
|
374
295
|
log3.info("server stopped", void 0, {
|
|
375
296
|
F: __dxlog_file3,
|
|
376
|
-
L:
|
|
297
|
+
L: 133,
|
|
377
298
|
S: this,
|
|
378
299
|
C: (f, a) => f(...a)
|
|
379
300
|
});
|
|
@@ -381,7 +302,7 @@ var DevServer = class {
|
|
|
381
302
|
if (this._functionServiceRegistration) {
|
|
382
303
|
invariant(this._client.services.services.FunctionRegistryService, void 0, {
|
|
383
304
|
F: __dxlog_file3,
|
|
384
|
-
L:
|
|
305
|
+
L: 136,
|
|
385
306
|
S: this,
|
|
386
307
|
A: [
|
|
387
308
|
"this._client.services.services.FunctionRegistryService",
|
|
@@ -395,7 +316,7 @@ var DevServer = class {
|
|
|
395
316
|
registrationId: this._functionServiceRegistration
|
|
396
317
|
}, {
|
|
397
318
|
F: __dxlog_file3,
|
|
398
|
-
L:
|
|
319
|
+
L: 141,
|
|
399
320
|
S: this,
|
|
400
321
|
C: (f, a) => f(...a)
|
|
401
322
|
});
|
|
@@ -412,7 +333,7 @@ var DevServer = class {
|
|
|
412
333
|
this._server = void 0;
|
|
413
334
|
log3.info("stopped", void 0, {
|
|
414
335
|
F: __dxlog_file3,
|
|
415
|
-
L:
|
|
336
|
+
L: 155,
|
|
416
337
|
S: this,
|
|
417
338
|
C: (f, a) => f(...a)
|
|
418
339
|
});
|
|
@@ -420,7 +341,7 @@ var DevServer = class {
|
|
|
420
341
|
/**
|
|
421
342
|
* Load function.
|
|
422
343
|
*/
|
|
423
|
-
async _load(def, force
|
|
344
|
+
async _load(def, force) {
|
|
424
345
|
const { uri, route, handler } = def;
|
|
425
346
|
const filePath = join(this._options.baseDir, handler);
|
|
426
347
|
log3.info("loading", {
|
|
@@ -428,7 +349,7 @@ var DevServer = class {
|
|
|
428
349
|
force
|
|
429
350
|
}, {
|
|
430
351
|
F: __dxlog_file3,
|
|
431
|
-
L:
|
|
352
|
+
L: 164,
|
|
432
353
|
S: this,
|
|
433
354
|
C: (f, a) => f(...a)
|
|
434
355
|
});
|
|
@@ -449,7 +370,7 @@ var DevServer = class {
|
|
|
449
370
|
async _safeUpdateRegistration() {
|
|
450
371
|
invariant(this._functionServiceRegistration, void 0, {
|
|
451
372
|
F: __dxlog_file3,
|
|
452
|
-
L:
|
|
373
|
+
L: 186,
|
|
453
374
|
S: this,
|
|
454
375
|
A: [
|
|
455
376
|
"this._functionServiceRegistration",
|
|
@@ -464,10 +385,10 @@ var DevServer = class {
|
|
|
464
385
|
route
|
|
465
386
|
}))
|
|
466
387
|
});
|
|
467
|
-
} catch (
|
|
468
|
-
log3.catch(
|
|
388
|
+
} catch (err) {
|
|
389
|
+
log3.catch(err, void 0, {
|
|
469
390
|
F: __dxlog_file3,
|
|
470
|
-
L:
|
|
391
|
+
L: 193,
|
|
471
392
|
S: this,
|
|
472
393
|
C: (f, a) => f(...a)
|
|
473
394
|
});
|
|
@@ -484,7 +405,7 @@ var DevServer = class {
|
|
|
484
405
|
path: path2
|
|
485
406
|
}, {
|
|
486
407
|
F: __dxlog_file3,
|
|
487
|
-
L:
|
|
408
|
+
L: 204,
|
|
488
409
|
S: this,
|
|
489
410
|
C: (f, a) => f(...a)
|
|
490
411
|
});
|
|
@@ -498,7 +419,7 @@ var DevServer = class {
|
|
|
498
419
|
duration: Date.now() - now
|
|
499
420
|
}, {
|
|
500
421
|
F: __dxlog_file3,
|
|
501
|
-
L:
|
|
422
|
+
L: 207,
|
|
502
423
|
S: this,
|
|
503
424
|
C: (f, a) => f(...a)
|
|
504
425
|
});
|
|
@@ -509,7 +430,7 @@ var DevServer = class {
|
|
|
509
430
|
const { handler } = this._handlers[path2] ?? {};
|
|
510
431
|
invariant(handler, `invalid path: ${path2}`, {
|
|
511
432
|
F: __dxlog_file3,
|
|
512
|
-
L:
|
|
433
|
+
L: 214,
|
|
513
434
|
S: this,
|
|
514
435
|
A: [
|
|
515
436
|
"handler",
|
|
@@ -551,7 +472,7 @@ var Scheduler = class {
|
|
|
551
472
|
this.triggers = triggers;
|
|
552
473
|
this._options = _options;
|
|
553
474
|
this._ctx = createContext2();
|
|
554
|
-
this.
|
|
475
|
+
this._functionUriToCallMutex = /* @__PURE__ */ new Map();
|
|
555
476
|
this.functions.registered.on(async ({ space, added }) => {
|
|
556
477
|
await this._safeActivateTriggers(space, this.triggers.getInactiveTriggers(space), added);
|
|
557
478
|
});
|
|
@@ -581,11 +502,11 @@ var Scheduler = class {
|
|
|
581
502
|
});
|
|
582
503
|
await Promise.all(mountTasks).catch(log4.catch);
|
|
583
504
|
}
|
|
584
|
-
async activate(space, functions,
|
|
585
|
-
const definition = functions.find((def) => def.uri ===
|
|
505
|
+
async activate(space, functions, trigger) {
|
|
506
|
+
const definition = functions.find((def) => def.uri === trigger.function);
|
|
586
507
|
if (!definition) {
|
|
587
508
|
log4.info("function is not found for trigger", {
|
|
588
|
-
|
|
509
|
+
trigger
|
|
589
510
|
}, {
|
|
590
511
|
F: __dxlog_file4,
|
|
591
512
|
L: 78,
|
|
@@ -594,12 +515,28 @@ var Scheduler = class {
|
|
|
594
515
|
});
|
|
595
516
|
return;
|
|
596
517
|
}
|
|
597
|
-
await this.triggers.activate({
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
518
|
+
await this.triggers.activate(space, trigger, async (args) => {
|
|
519
|
+
const mutex = this._functionUriToCallMutex.get(definition.uri) ?? new Mutex();
|
|
520
|
+
this._functionUriToCallMutex.set(definition.uri, mutex);
|
|
521
|
+
log4.info("function triggered, waiting for mutex", {
|
|
522
|
+
uri: definition.uri
|
|
523
|
+
}, {
|
|
524
|
+
F: __dxlog_file4,
|
|
525
|
+
L: 86,
|
|
526
|
+
S: this,
|
|
527
|
+
C: (f, a) => f(...a)
|
|
528
|
+
});
|
|
529
|
+
return mutex.executeSynchronized(() => {
|
|
530
|
+
log4.info("mutex acquired", {
|
|
531
|
+
uri: definition.uri
|
|
532
|
+
}, {
|
|
533
|
+
F: __dxlog_file4,
|
|
534
|
+
L: 88,
|
|
535
|
+
S: this,
|
|
536
|
+
C: (f, a) => f(...a)
|
|
537
|
+
});
|
|
538
|
+
return this._execFunction(definition, trigger, {
|
|
539
|
+
meta: trigger.meta ?? {},
|
|
603
540
|
data: {
|
|
604
541
|
...args,
|
|
605
542
|
spaceKey: space.key
|
|
@@ -609,10 +546,10 @@ var Scheduler = class {
|
|
|
609
546
|
});
|
|
610
547
|
log4("activated trigger", {
|
|
611
548
|
space: space.key,
|
|
612
|
-
trigger
|
|
549
|
+
trigger
|
|
613
550
|
}, {
|
|
614
551
|
F: __dxlog_file4,
|
|
615
|
-
L:
|
|
552
|
+
L: 96,
|
|
616
553
|
S: this,
|
|
617
554
|
C: (f, a) => f(...a)
|
|
618
555
|
});
|
|
@@ -632,7 +569,7 @@ var Scheduler = class {
|
|
|
632
569
|
triggerType: trigger.spec.type
|
|
633
570
|
}, {
|
|
634
571
|
F: __dxlog_file4,
|
|
635
|
-
L:
|
|
572
|
+
L: 113,
|
|
636
573
|
S: this,
|
|
637
574
|
C: (f, a) => f(...a)
|
|
638
575
|
});
|
|
@@ -649,7 +586,7 @@ var Scheduler = class {
|
|
|
649
586
|
function: def.uri
|
|
650
587
|
}, {
|
|
651
588
|
F: __dxlog_file4,
|
|
652
|
-
L:
|
|
589
|
+
L: 124,
|
|
653
590
|
S: this,
|
|
654
591
|
C: (f, a) => f(...a)
|
|
655
592
|
});
|
|
@@ -663,7 +600,7 @@ var Scheduler = class {
|
|
|
663
600
|
status
|
|
664
601
|
}, {
|
|
665
602
|
F: __dxlog_file4,
|
|
666
|
-
L:
|
|
603
|
+
L: 134,
|
|
667
604
|
S: this,
|
|
668
605
|
C: (f, a) => f(...a)
|
|
669
606
|
});
|
|
@@ -673,7 +610,7 @@ var Scheduler = class {
|
|
|
673
610
|
error: err.message
|
|
674
611
|
}, {
|
|
675
612
|
F: __dxlog_file4,
|
|
676
|
-
L:
|
|
613
|
+
L: 136,
|
|
677
614
|
S: this,
|
|
678
615
|
C: (f, a) => f(...a)
|
|
679
616
|
});
|
|
@@ -690,19 +627,20 @@ var createContext2 = () => new Context2({
|
|
|
690
627
|
import { Event as Event3 } from "@dxos/async";
|
|
691
628
|
import { create as create2, Filter as Filter3, getMeta } from "@dxos/client/echo";
|
|
692
629
|
import { Context as Context3, Resource as Resource2 } from "@dxos/context";
|
|
693
|
-
import { ECHO_ATTR_META, foreignKey
|
|
630
|
+
import { compareForeignKeys, ECHO_ATTR_META, foreignKey } from "@dxos/echo-schema";
|
|
694
631
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
695
632
|
import { PublicKey as PublicKey3 } from "@dxos/keys";
|
|
696
633
|
import { log as log9 } from "@dxos/log";
|
|
697
|
-
import { ComplexMap as ComplexMap2 } from "@dxos/util";
|
|
634
|
+
import { ComplexMap as ComplexMap2, diff as diff2 } from "@dxos/util";
|
|
698
635
|
|
|
699
636
|
// packages/core/functions/src/trigger/type/subscription-trigger.ts
|
|
700
637
|
import { TextV0Type } from "@braneframe/types";
|
|
701
638
|
import { debounce, UpdateScheduler } from "@dxos/async";
|
|
702
|
-
import {
|
|
639
|
+
import { Filter as Filter2 } from "@dxos/client/echo";
|
|
640
|
+
import { createSubscription, getAutomergeObjectCore } from "@dxos/echo-db";
|
|
703
641
|
import { log as log5 } from "@dxos/log";
|
|
704
642
|
var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/subscription-trigger.ts";
|
|
705
|
-
var createSubscriptionTrigger = async (ctx,
|
|
643
|
+
var createSubscriptionTrigger = async (ctx, space, spec, callback) => {
|
|
706
644
|
const objectIds = /* @__PURE__ */ new Set();
|
|
707
645
|
const task = new UpdateScheduler(ctx, async () => {
|
|
708
646
|
if (objectIds.size > 0) {
|
|
@@ -730,7 +668,7 @@ var createSubscriptionTrigger = async (ctx, triggerCtx, spec, callback) => {
|
|
|
730
668
|
updated: updated.length
|
|
731
669
|
}, {
|
|
732
670
|
F: __dxlog_file5,
|
|
733
|
-
L:
|
|
671
|
+
L: 47,
|
|
734
672
|
S: void 0,
|
|
735
673
|
C: (f, a) => f(...a)
|
|
736
674
|
});
|
|
@@ -740,16 +678,16 @@ var createSubscriptionTrigger = async (ctx, triggerCtx, spec, callback) => {
|
|
|
740
678
|
subscriptions.push(() => subscription.unsubscribe());
|
|
741
679
|
const { filter, options: { deep, delay } = {} } = spec;
|
|
742
680
|
const update = ({ objects }) => {
|
|
681
|
+
log5.info("update", {
|
|
682
|
+
objects: objects.length
|
|
683
|
+
}, {
|
|
684
|
+
F: __dxlog_file5,
|
|
685
|
+
L: 57,
|
|
686
|
+
S: void 0,
|
|
687
|
+
C: (f, a) => f(...a)
|
|
688
|
+
});
|
|
743
689
|
subscription.update(objects);
|
|
744
690
|
if (deep) {
|
|
745
|
-
log5.info("update", {
|
|
746
|
-
objects: objects.length
|
|
747
|
-
}, {
|
|
748
|
-
F: __dxlog_file5,
|
|
749
|
-
L: 59,
|
|
750
|
-
S: void 0,
|
|
751
|
-
C: (f, a) => f(...a)
|
|
752
|
-
});
|
|
753
691
|
for (const object of objects) {
|
|
754
692
|
const content = object.content;
|
|
755
693
|
if (content instanceof TextV0Type) {
|
|
@@ -760,8 +698,18 @@ var createSubscriptionTrigger = async (ctx, triggerCtx, spec, callback) => {
|
|
|
760
698
|
}
|
|
761
699
|
}
|
|
762
700
|
};
|
|
763
|
-
|
|
764
|
-
|
|
701
|
+
log5.info("subscription", {
|
|
702
|
+
filter
|
|
703
|
+
}, {
|
|
704
|
+
F: __dxlog_file5,
|
|
705
|
+
L: 76,
|
|
706
|
+
S: void 0,
|
|
707
|
+
C: (f, a) => f(...a)
|
|
708
|
+
});
|
|
709
|
+
if (filter) {
|
|
710
|
+
const query = space.db.query(Filter2.typename(filter[0].type, filter[0].props));
|
|
711
|
+
subscriptions.push(query.subscribe(delay ? debounce(update, delay) : update));
|
|
712
|
+
}
|
|
765
713
|
ctx.onDispose(() => {
|
|
766
714
|
subscriptions.forEach((unsubscribe) => unsubscribe());
|
|
767
715
|
});
|
|
@@ -772,7 +720,7 @@ import { CronJob } from "cron";
|
|
|
772
720
|
import { DeferredTask } from "@dxos/async";
|
|
773
721
|
import { log as log6 } from "@dxos/log";
|
|
774
722
|
var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/timer-trigger.ts";
|
|
775
|
-
var createTimerTrigger = async (ctx,
|
|
723
|
+
var createTimerTrigger = async (ctx, space, spec, callback) => {
|
|
776
724
|
const task = new DeferredTask(ctx, async () => {
|
|
777
725
|
await callback({});
|
|
778
726
|
});
|
|
@@ -787,12 +735,12 @@ var createTimerTrigger = async (ctx, triggerContext, spec, callback) => {
|
|
|
787
735
|
last = now;
|
|
788
736
|
run++;
|
|
789
737
|
log6.info("tick", {
|
|
790
|
-
space:
|
|
738
|
+
space: space.key.truncate(),
|
|
791
739
|
count: run,
|
|
792
740
|
delta
|
|
793
741
|
}, {
|
|
794
742
|
F: __dxlog_file6,
|
|
795
|
-
L:
|
|
743
|
+
L: 38,
|
|
796
744
|
S: void 0,
|
|
797
745
|
C: (f, a) => f(...a)
|
|
798
746
|
});
|
|
@@ -808,7 +756,7 @@ import { getPort as getPort2 } from "get-port-please";
|
|
|
808
756
|
import http from "@dxos/node-std/http";
|
|
809
757
|
import { log as log7 } from "@dxos/log";
|
|
810
758
|
var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/webhook-trigger.ts";
|
|
811
|
-
var createWebhookTrigger = async (ctx,
|
|
759
|
+
var createWebhookTrigger = async (ctx, space, spec, callback) => {
|
|
812
760
|
const server = http.createServer(async (req, res) => {
|
|
813
761
|
if (req.method !== spec.method) {
|
|
814
762
|
res.statusCode = 405;
|
|
@@ -825,7 +773,7 @@ var createWebhookTrigger = async (ctx, _, spec, callback) => {
|
|
|
825
773
|
port
|
|
826
774
|
}, {
|
|
827
775
|
F: __dxlog_file7,
|
|
828
|
-
L:
|
|
776
|
+
L: 41,
|
|
829
777
|
S: void 0,
|
|
830
778
|
C: (f, a) => f(...a)
|
|
831
779
|
});
|
|
@@ -841,7 +789,7 @@ import WebSocket from "ws";
|
|
|
841
789
|
import { sleep, Trigger as Trigger2 } from "@dxos/async";
|
|
842
790
|
import { log as log8 } from "@dxos/log";
|
|
843
791
|
var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/websocket-trigger.ts";
|
|
844
|
-
var createWebsocketTrigger = async (ctx,
|
|
792
|
+
var createWebsocketTrigger = async (ctx, space, spec, callback, options = {
|
|
845
793
|
retryDelay: 2,
|
|
846
794
|
maxAttempts: 5
|
|
847
795
|
}) => {
|
|
@@ -856,7 +804,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
|
|
|
856
804
|
url
|
|
857
805
|
}, {
|
|
858
806
|
F: __dxlog_file8,
|
|
859
|
-
L:
|
|
807
|
+
L: 40,
|
|
860
808
|
S: void 0,
|
|
861
809
|
C: (f, a) => f(...a)
|
|
862
810
|
});
|
|
@@ -871,7 +819,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
|
|
|
871
819
|
code: event.code
|
|
872
820
|
}, {
|
|
873
821
|
F: __dxlog_file8,
|
|
874
|
-
L:
|
|
822
|
+
L: 49,
|
|
875
823
|
S: void 0,
|
|
876
824
|
C: (f, a) => f(...a)
|
|
877
825
|
});
|
|
@@ -881,11 +829,11 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
|
|
|
881
829
|
url
|
|
882
830
|
}, {
|
|
883
831
|
F: __dxlog_file8,
|
|
884
|
-
L:
|
|
832
|
+
L: 54,
|
|
885
833
|
S: void 0,
|
|
886
834
|
C: (f, a) => f(...a)
|
|
887
835
|
});
|
|
888
|
-
await createWebsocketTrigger(ctx,
|
|
836
|
+
await createWebsocketTrigger(ctx, space, spec, callback, options);
|
|
889
837
|
}, options.retryDelay * 1e3);
|
|
890
838
|
}
|
|
891
839
|
open.wake(false);
|
|
@@ -895,7 +843,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
|
|
|
895
843
|
url
|
|
896
844
|
}, {
|
|
897
845
|
F: __dxlog_file8,
|
|
898
|
-
L:
|
|
846
|
+
L: 63,
|
|
899
847
|
S: void 0,
|
|
900
848
|
C: (f, a) => f(...a)
|
|
901
849
|
});
|
|
@@ -904,7 +852,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
|
|
|
904
852
|
try {
|
|
905
853
|
log8.info("message", void 0, {
|
|
906
854
|
F: __dxlog_file8,
|
|
907
|
-
L:
|
|
855
|
+
L: 68,
|
|
908
856
|
S: void 0,
|
|
909
857
|
C: (f, a) => f(...a)
|
|
910
858
|
});
|
|
@@ -917,7 +865,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
|
|
|
917
865
|
url
|
|
918
866
|
}, {
|
|
919
867
|
F: __dxlog_file8,
|
|
920
|
-
L:
|
|
868
|
+
L: 72,
|
|
921
869
|
S: void 0,
|
|
922
870
|
C: (f, a) => f(...a)
|
|
923
871
|
});
|
|
@@ -934,7 +882,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
|
|
|
934
882
|
attempt
|
|
935
883
|
}, {
|
|
936
884
|
F: __dxlog_file8,
|
|
937
|
-
L:
|
|
885
|
+
L: 83,
|
|
938
886
|
S: void 0,
|
|
939
887
|
C: (f, a) => f(...a)
|
|
940
888
|
});
|
|
@@ -970,24 +918,24 @@ var TriggerRegistry = class extends Resource2 {
|
|
|
970
918
|
getInactiveTriggers(space) {
|
|
971
919
|
return this._getTriggers(space, (t) => t.activationCtx == null);
|
|
972
920
|
}
|
|
973
|
-
async activate(
|
|
921
|
+
async activate(space, trigger, callback) {
|
|
974
922
|
log9("activate", {
|
|
975
|
-
space:
|
|
923
|
+
space: space.key,
|
|
976
924
|
trigger
|
|
977
925
|
}, {
|
|
978
926
|
F: __dxlog_file9,
|
|
979
|
-
L:
|
|
927
|
+
L: 72,
|
|
980
928
|
S: this,
|
|
981
929
|
C: (f, a) => f(...a)
|
|
982
930
|
});
|
|
983
931
|
const activationCtx = new Context3({
|
|
984
|
-
name: `
|
|
932
|
+
name: `FunctionTrigger-${trigger.function}`
|
|
985
933
|
});
|
|
986
934
|
this._ctx.onDispose(() => activationCtx.dispose());
|
|
987
|
-
const registeredTrigger = this._triggersBySpaceKey.get(
|
|
935
|
+
const registeredTrigger = this._triggersBySpaceKey.get(space.key)?.find((reg) => reg.trigger.id === trigger.id);
|
|
988
936
|
invariant2(registeredTrigger, `Trigger is not registered: ${trigger.function}`, {
|
|
989
937
|
F: __dxlog_file9,
|
|
990
|
-
L:
|
|
938
|
+
L: 77,
|
|
991
939
|
S: this,
|
|
992
940
|
A: [
|
|
993
941
|
"registeredTrigger",
|
|
@@ -997,7 +945,7 @@ var TriggerRegistry = class extends Resource2 {
|
|
|
997
945
|
registeredTrigger.activationCtx = activationCtx;
|
|
998
946
|
try {
|
|
999
947
|
const options = this._options?.[trigger.spec.type];
|
|
1000
|
-
await triggerHandlers[trigger.spec.type](activationCtx,
|
|
948
|
+
await triggerHandlers[trigger.spec.type](activationCtx, space, trigger.spec, callback, options);
|
|
1001
949
|
} catch (err) {
|
|
1002
950
|
delete registeredTrigger.activationCtx;
|
|
1003
951
|
throw err;
|
|
@@ -1011,7 +959,7 @@ var TriggerRegistry = class extends Resource2 {
|
|
|
1011
959
|
space: space.key
|
|
1012
960
|
}, {
|
|
1013
961
|
F: __dxlog_file9,
|
|
1014
|
-
L:
|
|
962
|
+
L: 93,
|
|
1015
963
|
S: this,
|
|
1016
964
|
C: (f, a) => f(...a)
|
|
1017
965
|
});
|
|
@@ -1021,23 +969,45 @@ var TriggerRegistry = class extends Resource2 {
|
|
|
1021
969
|
if (!space.db.graph.runtimeSchemaRegistry.hasSchema(FunctionTrigger)) {
|
|
1022
970
|
space.db.graph.runtimeSchemaRegistry.registerSchema(FunctionTrigger);
|
|
1023
971
|
}
|
|
1024
|
-
const
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
972
|
+
const manifestTriggers = manifest.triggers.map((trigger) => {
|
|
973
|
+
let keys = trigger[ECHO_ATTR_META]?.keys;
|
|
974
|
+
delete trigger[ECHO_ATTR_META];
|
|
975
|
+
if (!keys?.length) {
|
|
976
|
+
keys = [
|
|
977
|
+
foreignKey("manifest", [
|
|
978
|
+
trigger.function,
|
|
979
|
+
trigger.spec.type
|
|
980
|
+
].join(":"))
|
|
981
|
+
];
|
|
982
|
+
}
|
|
983
|
+
return create2(FunctionTrigger, trigger, {
|
|
984
|
+
keys
|
|
985
|
+
});
|
|
1033
986
|
});
|
|
987
|
+
const { objects: existing } = await space.db.query(Filter3.schema(FunctionTrigger)).run();
|
|
988
|
+
const { added } = diff2(existing, manifestTriggers, compareForeignKeys);
|
|
1034
989
|
added.forEach((trigger) => {
|
|
1035
|
-
|
|
1036
|
-
|
|
990
|
+
space.db.add(trigger);
|
|
991
|
+
log9.info("added", {
|
|
992
|
+
meta: getMeta(trigger)
|
|
993
|
+
}, {
|
|
994
|
+
F: __dxlog_file9,
|
|
995
|
+
L: 120,
|
|
996
|
+
S: this,
|
|
997
|
+
C: (f, a) => f(...a)
|
|
998
|
+
});
|
|
1037
999
|
});
|
|
1038
|
-
|
|
1000
|
+
if (added.length > 0) {
|
|
1001
|
+
await space.db.flush();
|
|
1002
|
+
}
|
|
1039
1003
|
}
|
|
1040
1004
|
async _open() {
|
|
1005
|
+
log9.info("open...", void 0, {
|
|
1006
|
+
F: __dxlog_file9,
|
|
1007
|
+
L: 129,
|
|
1008
|
+
S: this,
|
|
1009
|
+
C: (f, a) => f(...a)
|
|
1010
|
+
});
|
|
1041
1011
|
const spaceListSubscription = this._client.spaces.subscribe(async (spaces) => {
|
|
1042
1012
|
for (const space of spaces) {
|
|
1043
1013
|
if (this._triggersBySpaceKey.has(space.key)) {
|
|
@@ -1049,46 +1019,73 @@ var TriggerRegistry = class extends Resource2 {
|
|
|
1049
1019
|
if (this._ctx.disposed) {
|
|
1050
1020
|
break;
|
|
1051
1021
|
}
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1022
|
+
this._ctx.onDispose(space.db.query(Filter3.schema(FunctionTrigger)).subscribe(async ({ objects: current }) => {
|
|
1023
|
+
log9.info("update", {
|
|
1024
|
+
space: space.key,
|
|
1025
|
+
registered: registered.length,
|
|
1026
|
+
current: current.length
|
|
1027
|
+
}, {
|
|
1028
|
+
F: __dxlog_file9,
|
|
1029
|
+
L: 146,
|
|
1030
|
+
S: this,
|
|
1031
|
+
C: (f, a) => f(...a)
|
|
1032
|
+
});
|
|
1033
|
+
await this._handleRemovedTriggers(space, current, registered);
|
|
1034
|
+
this._handleNewTriggers(space, current, registered);
|
|
1035
|
+
}));
|
|
1057
1036
|
}
|
|
1058
1037
|
});
|
|
1059
1038
|
this._ctx.onDispose(() => spaceListSubscription.unsubscribe());
|
|
1039
|
+
log9.info("opened", void 0, {
|
|
1040
|
+
F: __dxlog_file9,
|
|
1041
|
+
L: 155,
|
|
1042
|
+
S: this,
|
|
1043
|
+
C: (f, a) => f(...a)
|
|
1044
|
+
});
|
|
1060
1045
|
}
|
|
1061
1046
|
async _close(_) {
|
|
1047
|
+
log9.info("close...", void 0, {
|
|
1048
|
+
F: __dxlog_file9,
|
|
1049
|
+
L: 159,
|
|
1050
|
+
S: this,
|
|
1051
|
+
C: (f, a) => f(...a)
|
|
1052
|
+
});
|
|
1062
1053
|
this._triggersBySpaceKey.clear();
|
|
1054
|
+
log9.info("closed", void 0, {
|
|
1055
|
+
F: __dxlog_file9,
|
|
1056
|
+
L: 161,
|
|
1057
|
+
S: this,
|
|
1058
|
+
C: (f, a) => f(...a)
|
|
1059
|
+
});
|
|
1063
1060
|
}
|
|
1064
|
-
_handleNewTriggers(space,
|
|
1065
|
-
const
|
|
1066
|
-
return registered.find((reg) => reg.trigger.id === candidate.id) == null;
|
|
1061
|
+
_handleNewTriggers(space, current, registered) {
|
|
1062
|
+
const added = current.filter((candidate) => {
|
|
1063
|
+
return candidate.enabled && registered.find((reg) => reg.trigger.id === candidate.id) == null;
|
|
1067
1064
|
});
|
|
1068
|
-
if (
|
|
1069
|
-
const newRegisteredTriggers =
|
|
1065
|
+
if (added.length > 0) {
|
|
1066
|
+
const newRegisteredTriggers = added.map((trigger) => ({
|
|
1070
1067
|
trigger
|
|
1071
1068
|
}));
|
|
1072
1069
|
registered.push(...newRegisteredTriggers);
|
|
1073
|
-
log9("
|
|
1070
|
+
log9.info("added", () => ({
|
|
1074
1071
|
spaceKey: space.key,
|
|
1075
|
-
|
|
1072
|
+
triggers: added.map((trigger) => trigger.function)
|
|
1076
1073
|
}), {
|
|
1077
1074
|
F: __dxlog_file9,
|
|
1078
|
-
L:
|
|
1075
|
+
L: 172,
|
|
1079
1076
|
S: this,
|
|
1080
1077
|
C: (f, a) => f(...a)
|
|
1081
1078
|
});
|
|
1082
1079
|
this.registered.emit({
|
|
1083
1080
|
space,
|
|
1084
|
-
triggers:
|
|
1081
|
+
triggers: added
|
|
1085
1082
|
});
|
|
1086
1083
|
}
|
|
1087
1084
|
}
|
|
1088
|
-
async _handleRemovedTriggers(space,
|
|
1085
|
+
async _handleRemovedTriggers(space, current, registered) {
|
|
1089
1086
|
const removed = [];
|
|
1090
1087
|
for (let i = registered.length - 1; i >= 0; i--) {
|
|
1091
|
-
const wasRemoved =
|
|
1088
|
+
const wasRemoved = current.filter((trigger) => trigger.enabled).find((trigger) => trigger.id === registered[i].trigger.id) == null;
|
|
1092
1089
|
if (wasRemoved) {
|
|
1093
1090
|
const unregistered = registered.splice(i, 1)[0];
|
|
1094
1091
|
await unregistered.activationCtx?.dispose();
|
|
@@ -1096,6 +1093,15 @@ var TriggerRegistry = class extends Resource2 {
|
|
|
1096
1093
|
}
|
|
1097
1094
|
}
|
|
1098
1095
|
if (removed.length > 0) {
|
|
1096
|
+
log9.info("removed", () => ({
|
|
1097
|
+
spaceKey: space.key,
|
|
1098
|
+
triggers: removed.map((trigger) => trigger.function)
|
|
1099
|
+
}), {
|
|
1100
|
+
F: __dxlog_file9,
|
|
1101
|
+
L: 198,
|
|
1102
|
+
S: this,
|
|
1103
|
+
C: (f, a) => f(...a)
|
|
1104
|
+
});
|
|
1099
1105
|
this.removed.emit({
|
|
1100
1106
|
space,
|
|
1101
1107
|
triggers: removed
|
|
@@ -1109,6 +1115,7 @@ var TriggerRegistry = class extends Resource2 {
|
|
|
1109
1115
|
};
|
|
1110
1116
|
export {
|
|
1111
1117
|
DevServer,
|
|
1118
|
+
FUNCTION_SCHEMA,
|
|
1112
1119
|
FunctionDef,
|
|
1113
1120
|
FunctionManifestSchema,
|
|
1114
1121
|
FunctionRegistry,
|