@dxos/functions 0.5.3-next.57eca40 → 0.5.3-next.63cdcad
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-366QG6IX.mjs → chunk-4D4I3YMJ.mjs} +16 -11
- package/dist/lib/browser/chunk-4D4I3YMJ.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +206 -133
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/types.mjs +3 -1
- package/dist/lib/node/{chunk-3VSJ57ZZ.cjs → chunk-3UYUR5N5.cjs} +19 -13
- package/dist/lib/node/chunk-3UYUR5N5.cjs.map +7 -0
- package/dist/lib/node/index.cjs +216 -139
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/types.cjs +6 -4
- package/dist/lib/node/types.cjs.map +2 -2
- 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 +46 -33
- package/dist/types/src/types.d.ts.map +1 -1
- package/package.json +14 -14
- 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 +3 -3
- 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 +42 -30
- package/dist/lib/browser/chunk-366QG6IX.mjs.map +0 -7
- package/dist/lib/node/chunk-3VSJ57ZZ.cjs.map +0 -7
- 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,10 +1,11 @@
|
|
|
1
1
|
import "@dxos/node-std/globals";
|
|
2
2
|
import {
|
|
3
|
+
FUNCTION_SCHEMA,
|
|
3
4
|
FunctionDef,
|
|
4
5
|
FunctionManifestSchema,
|
|
5
6
|
FunctionTrigger,
|
|
6
7
|
__require
|
|
7
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-4D4I3YMJ.mjs";
|
|
8
9
|
|
|
9
10
|
// packages/core/functions/src/function/function-registry.ts
|
|
10
11
|
import { Event } from "@dxos/async";
|
|
@@ -12,32 +13,7 @@ import { create, Filter } from "@dxos/client/echo";
|
|
|
12
13
|
import { Resource } from "@dxos/context";
|
|
13
14
|
import { PublicKey } from "@dxos/keys";
|
|
14
15
|
import { log } from "@dxos/log";
|
|
15
|
-
import { ComplexMap } from "@dxos/util";
|
|
16
|
-
|
|
17
|
-
// packages/core/functions/src/util.ts
|
|
18
|
-
var diff = (previous, next, comparator) => {
|
|
19
|
-
const remaining = [
|
|
20
|
-
...previous
|
|
21
|
-
];
|
|
22
|
-
const result = {
|
|
23
|
-
added: [],
|
|
24
|
-
updated: [],
|
|
25
|
-
removed: remaining
|
|
26
|
-
};
|
|
27
|
-
for (const object of next) {
|
|
28
|
-
const index = remaining.findIndex((item) => comparator(item, object));
|
|
29
|
-
if (index === -1) {
|
|
30
|
-
result.added.push(object);
|
|
31
|
-
} else {
|
|
32
|
-
result.updated.push(remaining[index]);
|
|
33
|
-
remaining.splice(index, 1);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return result;
|
|
37
|
-
};
|
|
38
|
-
var intersection = (a, b, comparator) => a.filter((a2) => b.find((b2) => comparator(a2, b2)) !== void 0);
|
|
39
|
-
|
|
40
|
-
// packages/core/functions/src/function/function-registry.ts
|
|
16
|
+
import { ComplexMap, diff } from "@dxos/util";
|
|
41
17
|
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/functions/src/function/function-registry.ts";
|
|
42
18
|
var FunctionRegistry = class extends Resource {
|
|
43
19
|
constructor(_client) {
|
|
@@ -59,7 +35,7 @@ var FunctionRegistry = class extends Resource {
|
|
|
59
35
|
functions: functions?.length ?? 0
|
|
60
36
|
}, {
|
|
61
37
|
F: __dxlog_file,
|
|
62
|
-
L:
|
|
38
|
+
L: 38,
|
|
63
39
|
S: this,
|
|
64
40
|
C: (f, a) => f(...a)
|
|
65
41
|
});
|
|
@@ -70,11 +46,16 @@ var FunctionRegistry = class extends Resource {
|
|
|
70
46
|
space.db.graph.runtimeSchemaRegistry.registerSchema(FunctionDef);
|
|
71
47
|
}
|
|
72
48
|
const { objects: existing } = await space.db.query(Filter.schema(FunctionDef)).run();
|
|
73
|
-
const { added
|
|
49
|
+
const { added } = diff(existing, functions, (a, b) => a.uri === b.uri);
|
|
74
50
|
added.forEach((def) => space.db.add(create(FunctionDef, def)));
|
|
75
|
-
removed.forEach((def) => space.db.remove(def));
|
|
76
51
|
}
|
|
77
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
|
+
});
|
|
78
59
|
const spacesSubscription = this._client.spaces.subscribe(async (spaces) => {
|
|
79
60
|
for (const space of spaces) {
|
|
80
61
|
if (this._functionBySpaceKey.has(space.key)) {
|
|
@@ -101,6 +82,12 @@ var FunctionRegistry = class extends Resource {
|
|
|
101
82
|
this._ctx.onDispose(() => spacesSubscription.unsubscribe());
|
|
102
83
|
}
|
|
103
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
|
+
});
|
|
104
91
|
this._functionBySpaceKey.clear();
|
|
105
92
|
}
|
|
106
93
|
};
|
|
@@ -174,7 +161,7 @@ var DevServer = class {
|
|
|
174
161
|
added
|
|
175
162
|
}, {
|
|
176
163
|
F: __dxlog_file3,
|
|
177
|
-
L:
|
|
164
|
+
L: 53,
|
|
178
165
|
S: this,
|
|
179
166
|
C: (f, a) => f(...a)
|
|
180
167
|
});
|
|
@@ -188,7 +175,7 @@ var DevServer = class {
|
|
|
188
175
|
get endpoint() {
|
|
189
176
|
invariant(this._port, void 0, {
|
|
190
177
|
F: __dxlog_file3,
|
|
191
|
-
L:
|
|
178
|
+
L: 64,
|
|
192
179
|
S: this,
|
|
193
180
|
A: [
|
|
194
181
|
"this._port",
|
|
@@ -206,7 +193,7 @@ var DevServer = class {
|
|
|
206
193
|
async start() {
|
|
207
194
|
invariant(!this._server, void 0, {
|
|
208
195
|
F: __dxlog_file3,
|
|
209
|
-
L:
|
|
196
|
+
L: 77,
|
|
210
197
|
S: this,
|
|
211
198
|
A: [
|
|
212
199
|
"!this._server",
|
|
@@ -215,7 +202,7 @@ var DevServer = class {
|
|
|
215
202
|
});
|
|
216
203
|
log3.info("starting...", void 0, {
|
|
217
204
|
F: __dxlog_file3,
|
|
218
|
-
L:
|
|
205
|
+
L: 78,
|
|
219
206
|
S: this,
|
|
220
207
|
C: (f, a) => f(...a)
|
|
221
208
|
});
|
|
@@ -229,7 +216,7 @@ var DevServer = class {
|
|
|
229
216
|
path: path2
|
|
230
217
|
}, {
|
|
231
218
|
F: __dxlog_file3,
|
|
232
|
-
L:
|
|
219
|
+
L: 88,
|
|
233
220
|
S: this,
|
|
234
221
|
C: (f, a) => f(...a)
|
|
235
222
|
});
|
|
@@ -242,7 +229,7 @@ var DevServer = class {
|
|
|
242
229
|
} catch (err) {
|
|
243
230
|
log3.catch(err, void 0, {
|
|
244
231
|
F: __dxlog_file3,
|
|
245
|
-
L:
|
|
232
|
+
L: 98,
|
|
246
233
|
S: this,
|
|
247
234
|
C: (f, a) => f(...a)
|
|
248
235
|
});
|
|
@@ -267,7 +254,7 @@ var DevServer = class {
|
|
|
267
254
|
endpoint
|
|
268
255
|
}, {
|
|
269
256
|
F: __dxlog_file3,
|
|
270
|
-
L:
|
|
257
|
+
L: 113,
|
|
271
258
|
S: this,
|
|
272
259
|
C: (f, a) => f(...a)
|
|
273
260
|
});
|
|
@@ -282,7 +269,7 @@ var DevServer = class {
|
|
|
282
269
|
port: this._port
|
|
283
270
|
}, {
|
|
284
271
|
F: __dxlog_file3,
|
|
285
|
-
L:
|
|
272
|
+
L: 124,
|
|
286
273
|
S: this,
|
|
287
274
|
C: (f, a) => f(...a)
|
|
288
275
|
});
|
|
@@ -290,7 +277,7 @@ var DevServer = class {
|
|
|
290
277
|
async stop() {
|
|
291
278
|
invariant(this._server, void 0, {
|
|
292
279
|
F: __dxlog_file3,
|
|
293
|
-
L:
|
|
280
|
+
L: 128,
|
|
294
281
|
S: this,
|
|
295
282
|
A: [
|
|
296
283
|
"this._server",
|
|
@@ -299,7 +286,7 @@ var DevServer = class {
|
|
|
299
286
|
});
|
|
300
287
|
log3.info("stopping...", void 0, {
|
|
301
288
|
F: __dxlog_file3,
|
|
302
|
-
L:
|
|
289
|
+
L: 129,
|
|
303
290
|
S: this,
|
|
304
291
|
C: (f, a) => f(...a)
|
|
305
292
|
});
|
|
@@ -307,7 +294,7 @@ var DevServer = class {
|
|
|
307
294
|
this._server.close(async () => {
|
|
308
295
|
log3.info("server stopped", void 0, {
|
|
309
296
|
F: __dxlog_file3,
|
|
310
|
-
L:
|
|
297
|
+
L: 133,
|
|
311
298
|
S: this,
|
|
312
299
|
C: (f, a) => f(...a)
|
|
313
300
|
});
|
|
@@ -315,7 +302,7 @@ var DevServer = class {
|
|
|
315
302
|
if (this._functionServiceRegistration) {
|
|
316
303
|
invariant(this._client.services.services.FunctionRegistryService, void 0, {
|
|
317
304
|
F: __dxlog_file3,
|
|
318
|
-
L:
|
|
305
|
+
L: 136,
|
|
319
306
|
S: this,
|
|
320
307
|
A: [
|
|
321
308
|
"this._client.services.services.FunctionRegistryService",
|
|
@@ -329,7 +316,7 @@ var DevServer = class {
|
|
|
329
316
|
registrationId: this._functionServiceRegistration
|
|
330
317
|
}, {
|
|
331
318
|
F: __dxlog_file3,
|
|
332
|
-
L:
|
|
319
|
+
L: 141,
|
|
333
320
|
S: this,
|
|
334
321
|
C: (f, a) => f(...a)
|
|
335
322
|
});
|
|
@@ -346,7 +333,7 @@ var DevServer = class {
|
|
|
346
333
|
this._server = void 0;
|
|
347
334
|
log3.info("stopped", void 0, {
|
|
348
335
|
F: __dxlog_file3,
|
|
349
|
-
L:
|
|
336
|
+
L: 155,
|
|
350
337
|
S: this,
|
|
351
338
|
C: (f, a) => f(...a)
|
|
352
339
|
});
|
|
@@ -362,7 +349,7 @@ var DevServer = class {
|
|
|
362
349
|
force
|
|
363
350
|
}, {
|
|
364
351
|
F: __dxlog_file3,
|
|
365
|
-
L:
|
|
352
|
+
L: 164,
|
|
366
353
|
S: this,
|
|
367
354
|
C: (f, a) => f(...a)
|
|
368
355
|
});
|
|
@@ -383,7 +370,7 @@ var DevServer = class {
|
|
|
383
370
|
async _safeUpdateRegistration() {
|
|
384
371
|
invariant(this._functionServiceRegistration, void 0, {
|
|
385
372
|
F: __dxlog_file3,
|
|
386
|
-
L:
|
|
373
|
+
L: 186,
|
|
387
374
|
S: this,
|
|
388
375
|
A: [
|
|
389
376
|
"this._functionServiceRegistration",
|
|
@@ -398,10 +385,10 @@ var DevServer = class {
|
|
|
398
385
|
route
|
|
399
386
|
}))
|
|
400
387
|
});
|
|
401
|
-
} catch (
|
|
402
|
-
log3.catch(
|
|
388
|
+
} catch (err) {
|
|
389
|
+
log3.catch(err, void 0, {
|
|
403
390
|
F: __dxlog_file3,
|
|
404
|
-
L:
|
|
391
|
+
L: 193,
|
|
405
392
|
S: this,
|
|
406
393
|
C: (f, a) => f(...a)
|
|
407
394
|
});
|
|
@@ -418,7 +405,7 @@ var DevServer = class {
|
|
|
418
405
|
path: path2
|
|
419
406
|
}, {
|
|
420
407
|
F: __dxlog_file3,
|
|
421
|
-
L:
|
|
408
|
+
L: 204,
|
|
422
409
|
S: this,
|
|
423
410
|
C: (f, a) => f(...a)
|
|
424
411
|
});
|
|
@@ -432,7 +419,7 @@ var DevServer = class {
|
|
|
432
419
|
duration: Date.now() - now
|
|
433
420
|
}, {
|
|
434
421
|
F: __dxlog_file3,
|
|
435
|
-
L:
|
|
422
|
+
L: 207,
|
|
436
423
|
S: this,
|
|
437
424
|
C: (f, a) => f(...a)
|
|
438
425
|
});
|
|
@@ -443,7 +430,7 @@ var DevServer = class {
|
|
|
443
430
|
const { handler } = this._handlers[path2] ?? {};
|
|
444
431
|
invariant(handler, `invalid path: ${path2}`, {
|
|
445
432
|
F: __dxlog_file3,
|
|
446
|
-
L:
|
|
433
|
+
L: 214,
|
|
447
434
|
S: this,
|
|
448
435
|
A: [
|
|
449
436
|
"handler",
|
|
@@ -485,7 +472,7 @@ var Scheduler = class {
|
|
|
485
472
|
this.triggers = triggers;
|
|
486
473
|
this._options = _options;
|
|
487
474
|
this._ctx = createContext2();
|
|
488
|
-
this.
|
|
475
|
+
this._functionUriToCallMutex = /* @__PURE__ */ new Map();
|
|
489
476
|
this.functions.registered.on(async ({ space, added }) => {
|
|
490
477
|
await this._safeActivateTriggers(space, this.triggers.getInactiveTriggers(space), added);
|
|
491
478
|
});
|
|
@@ -515,11 +502,11 @@ var Scheduler = class {
|
|
|
515
502
|
});
|
|
516
503
|
await Promise.all(mountTasks).catch(log4.catch);
|
|
517
504
|
}
|
|
518
|
-
async activate(space, functions,
|
|
519
|
-
const definition = functions.find((def) => def.uri ===
|
|
505
|
+
async activate(space, functions, trigger) {
|
|
506
|
+
const definition = functions.find((def) => def.uri === trigger.function);
|
|
520
507
|
if (!definition) {
|
|
521
508
|
log4.info("function is not found for trigger", {
|
|
522
|
-
|
|
509
|
+
trigger
|
|
523
510
|
}, {
|
|
524
511
|
F: __dxlog_file4,
|
|
525
512
|
L: 78,
|
|
@@ -528,12 +515,28 @@ var Scheduler = class {
|
|
|
528
515
|
});
|
|
529
516
|
return;
|
|
530
517
|
}
|
|
531
|
-
await this.triggers.activate({
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
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 ?? {},
|
|
537
540
|
data: {
|
|
538
541
|
...args,
|
|
539
542
|
spaceKey: space.key
|
|
@@ -543,10 +546,10 @@ var Scheduler = class {
|
|
|
543
546
|
});
|
|
544
547
|
log4("activated trigger", {
|
|
545
548
|
space: space.key,
|
|
546
|
-
trigger
|
|
549
|
+
trigger
|
|
547
550
|
}, {
|
|
548
551
|
F: __dxlog_file4,
|
|
549
|
-
L:
|
|
552
|
+
L: 96,
|
|
550
553
|
S: this,
|
|
551
554
|
C: (f, a) => f(...a)
|
|
552
555
|
});
|
|
@@ -566,7 +569,7 @@ var Scheduler = class {
|
|
|
566
569
|
triggerType: trigger.spec.type
|
|
567
570
|
}, {
|
|
568
571
|
F: __dxlog_file4,
|
|
569
|
-
L:
|
|
572
|
+
L: 113,
|
|
570
573
|
S: this,
|
|
571
574
|
C: (f, a) => f(...a)
|
|
572
575
|
});
|
|
@@ -583,7 +586,7 @@ var Scheduler = class {
|
|
|
583
586
|
function: def.uri
|
|
584
587
|
}, {
|
|
585
588
|
F: __dxlog_file4,
|
|
586
|
-
L:
|
|
589
|
+
L: 124,
|
|
587
590
|
S: this,
|
|
588
591
|
C: (f, a) => f(...a)
|
|
589
592
|
});
|
|
@@ -597,7 +600,7 @@ var Scheduler = class {
|
|
|
597
600
|
status
|
|
598
601
|
}, {
|
|
599
602
|
F: __dxlog_file4,
|
|
600
|
-
L:
|
|
603
|
+
L: 134,
|
|
601
604
|
S: this,
|
|
602
605
|
C: (f, a) => f(...a)
|
|
603
606
|
});
|
|
@@ -607,7 +610,7 @@ var Scheduler = class {
|
|
|
607
610
|
error: err.message
|
|
608
611
|
}, {
|
|
609
612
|
F: __dxlog_file4,
|
|
610
|
-
L:
|
|
613
|
+
L: 136,
|
|
611
614
|
S: this,
|
|
612
615
|
C: (f, a) => f(...a)
|
|
613
616
|
});
|
|
@@ -624,19 +627,20 @@ var createContext2 = () => new Context2({
|
|
|
624
627
|
import { Event as Event3 } from "@dxos/async";
|
|
625
628
|
import { create as create2, Filter as Filter3, getMeta } from "@dxos/client/echo";
|
|
626
629
|
import { Context as Context3, Resource as Resource2 } from "@dxos/context";
|
|
627
|
-
import { ECHO_ATTR_META, foreignKey
|
|
630
|
+
import { compareForeignKeys, ECHO_ATTR_META, foreignKey } from "@dxos/echo-schema";
|
|
628
631
|
import { invariant as invariant2 } from "@dxos/invariant";
|
|
629
632
|
import { PublicKey as PublicKey3 } from "@dxos/keys";
|
|
630
633
|
import { log as log9 } from "@dxos/log";
|
|
631
|
-
import { ComplexMap as ComplexMap2 } from "@dxos/util";
|
|
634
|
+
import { ComplexMap as ComplexMap2, diff as diff2 } from "@dxos/util";
|
|
632
635
|
|
|
633
636
|
// packages/core/functions/src/trigger/type/subscription-trigger.ts
|
|
634
637
|
import { TextV0Type } from "@braneframe/types";
|
|
635
638
|
import { debounce, UpdateScheduler } from "@dxos/async";
|
|
636
|
-
import {
|
|
639
|
+
import { Filter as Filter2 } from "@dxos/client/echo";
|
|
640
|
+
import { createSubscription, getAutomergeObjectCore } from "@dxos/echo-db";
|
|
637
641
|
import { log as log5 } from "@dxos/log";
|
|
638
642
|
var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/subscription-trigger.ts";
|
|
639
|
-
var createSubscriptionTrigger = async (ctx,
|
|
643
|
+
var createSubscriptionTrigger = async (ctx, space, spec, callback) => {
|
|
640
644
|
const objectIds = /* @__PURE__ */ new Set();
|
|
641
645
|
const task = new UpdateScheduler(ctx, async () => {
|
|
642
646
|
if (objectIds.size > 0) {
|
|
@@ -664,7 +668,7 @@ var createSubscriptionTrigger = async (ctx, triggerCtx, spec, callback) => {
|
|
|
664
668
|
updated: updated.length
|
|
665
669
|
}, {
|
|
666
670
|
F: __dxlog_file5,
|
|
667
|
-
L:
|
|
671
|
+
L: 47,
|
|
668
672
|
S: void 0,
|
|
669
673
|
C: (f, a) => f(...a)
|
|
670
674
|
});
|
|
@@ -674,16 +678,16 @@ var createSubscriptionTrigger = async (ctx, triggerCtx, spec, callback) => {
|
|
|
674
678
|
subscriptions.push(() => subscription.unsubscribe());
|
|
675
679
|
const { filter, options: { deep, delay } = {} } = spec;
|
|
676
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
|
+
});
|
|
677
689
|
subscription.update(objects);
|
|
678
690
|
if (deep) {
|
|
679
|
-
log5.info("update", {
|
|
680
|
-
objects: objects.length
|
|
681
|
-
}, {
|
|
682
|
-
F: __dxlog_file5,
|
|
683
|
-
L: 59,
|
|
684
|
-
S: void 0,
|
|
685
|
-
C: (f, a) => f(...a)
|
|
686
|
-
});
|
|
687
691
|
for (const object of objects) {
|
|
688
692
|
const content = object.content;
|
|
689
693
|
if (content instanceof TextV0Type) {
|
|
@@ -694,8 +698,18 @@ var createSubscriptionTrigger = async (ctx, triggerCtx, spec, callback) => {
|
|
|
694
698
|
}
|
|
695
699
|
}
|
|
696
700
|
};
|
|
697
|
-
|
|
698
|
-
|
|
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
|
+
}
|
|
699
713
|
ctx.onDispose(() => {
|
|
700
714
|
subscriptions.forEach((unsubscribe) => unsubscribe());
|
|
701
715
|
});
|
|
@@ -706,7 +720,7 @@ import { CronJob } from "cron";
|
|
|
706
720
|
import { DeferredTask } from "@dxos/async";
|
|
707
721
|
import { log as log6 } from "@dxos/log";
|
|
708
722
|
var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/timer-trigger.ts";
|
|
709
|
-
var createTimerTrigger = async (ctx,
|
|
723
|
+
var createTimerTrigger = async (ctx, space, spec, callback) => {
|
|
710
724
|
const task = new DeferredTask(ctx, async () => {
|
|
711
725
|
await callback({});
|
|
712
726
|
});
|
|
@@ -721,12 +735,12 @@ var createTimerTrigger = async (ctx, triggerContext, spec, callback) => {
|
|
|
721
735
|
last = now;
|
|
722
736
|
run++;
|
|
723
737
|
log6.info("tick", {
|
|
724
|
-
space:
|
|
738
|
+
space: space.key.truncate(),
|
|
725
739
|
count: run,
|
|
726
740
|
delta
|
|
727
741
|
}, {
|
|
728
742
|
F: __dxlog_file6,
|
|
729
|
-
L:
|
|
743
|
+
L: 38,
|
|
730
744
|
S: void 0,
|
|
731
745
|
C: (f, a) => f(...a)
|
|
732
746
|
});
|
|
@@ -742,7 +756,7 @@ import { getPort as getPort2 } from "get-port-please";
|
|
|
742
756
|
import http from "@dxos/node-std/http";
|
|
743
757
|
import { log as log7 } from "@dxos/log";
|
|
744
758
|
var __dxlog_file7 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/webhook-trigger.ts";
|
|
745
|
-
var createWebhookTrigger = async (ctx,
|
|
759
|
+
var createWebhookTrigger = async (ctx, space, spec, callback) => {
|
|
746
760
|
const server = http.createServer(async (req, res) => {
|
|
747
761
|
if (req.method !== spec.method) {
|
|
748
762
|
res.statusCode = 405;
|
|
@@ -759,7 +773,7 @@ var createWebhookTrigger = async (ctx, _, spec, callback) => {
|
|
|
759
773
|
port
|
|
760
774
|
}, {
|
|
761
775
|
F: __dxlog_file7,
|
|
762
|
-
L:
|
|
776
|
+
L: 41,
|
|
763
777
|
S: void 0,
|
|
764
778
|
C: (f, a) => f(...a)
|
|
765
779
|
});
|
|
@@ -775,7 +789,7 @@ import WebSocket from "ws";
|
|
|
775
789
|
import { sleep, Trigger as Trigger2 } from "@dxos/async";
|
|
776
790
|
import { log as log8 } from "@dxos/log";
|
|
777
791
|
var __dxlog_file8 = "/home/runner/work/dxos/dxos/packages/core/functions/src/trigger/type/websocket-trigger.ts";
|
|
778
|
-
var createWebsocketTrigger = async (ctx,
|
|
792
|
+
var createWebsocketTrigger = async (ctx, space, spec, callback, options = {
|
|
779
793
|
retryDelay: 2,
|
|
780
794
|
maxAttempts: 5
|
|
781
795
|
}) => {
|
|
@@ -790,7 +804,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
|
|
|
790
804
|
url
|
|
791
805
|
}, {
|
|
792
806
|
F: __dxlog_file8,
|
|
793
|
-
L:
|
|
807
|
+
L: 40,
|
|
794
808
|
S: void 0,
|
|
795
809
|
C: (f, a) => f(...a)
|
|
796
810
|
});
|
|
@@ -805,7 +819,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
|
|
|
805
819
|
code: event.code
|
|
806
820
|
}, {
|
|
807
821
|
F: __dxlog_file8,
|
|
808
|
-
L:
|
|
822
|
+
L: 49,
|
|
809
823
|
S: void 0,
|
|
810
824
|
C: (f, a) => f(...a)
|
|
811
825
|
});
|
|
@@ -815,11 +829,11 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
|
|
|
815
829
|
url
|
|
816
830
|
}, {
|
|
817
831
|
F: __dxlog_file8,
|
|
818
|
-
L:
|
|
832
|
+
L: 54,
|
|
819
833
|
S: void 0,
|
|
820
834
|
C: (f, a) => f(...a)
|
|
821
835
|
});
|
|
822
|
-
await createWebsocketTrigger(ctx,
|
|
836
|
+
await createWebsocketTrigger(ctx, space, spec, callback, options);
|
|
823
837
|
}, options.retryDelay * 1e3);
|
|
824
838
|
}
|
|
825
839
|
open.wake(false);
|
|
@@ -829,7 +843,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
|
|
|
829
843
|
url
|
|
830
844
|
}, {
|
|
831
845
|
F: __dxlog_file8,
|
|
832
|
-
L:
|
|
846
|
+
L: 63,
|
|
833
847
|
S: void 0,
|
|
834
848
|
C: (f, a) => f(...a)
|
|
835
849
|
});
|
|
@@ -838,7 +852,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
|
|
|
838
852
|
try {
|
|
839
853
|
log8.info("message", void 0, {
|
|
840
854
|
F: __dxlog_file8,
|
|
841
|
-
L:
|
|
855
|
+
L: 68,
|
|
842
856
|
S: void 0,
|
|
843
857
|
C: (f, a) => f(...a)
|
|
844
858
|
});
|
|
@@ -851,7 +865,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
|
|
|
851
865
|
url
|
|
852
866
|
}, {
|
|
853
867
|
F: __dxlog_file8,
|
|
854
|
-
L:
|
|
868
|
+
L: 72,
|
|
855
869
|
S: void 0,
|
|
856
870
|
C: (f, a) => f(...a)
|
|
857
871
|
});
|
|
@@ -868,7 +882,7 @@ var createWebsocketTrigger = async (ctx, triggerCtx, spec, callback, options = {
|
|
|
868
882
|
attempt
|
|
869
883
|
}, {
|
|
870
884
|
F: __dxlog_file8,
|
|
871
|
-
L:
|
|
885
|
+
L: 83,
|
|
872
886
|
S: void 0,
|
|
873
887
|
C: (f, a) => f(...a)
|
|
874
888
|
});
|
|
@@ -904,24 +918,24 @@ var TriggerRegistry = class extends Resource2 {
|
|
|
904
918
|
getInactiveTriggers(space) {
|
|
905
919
|
return this._getTriggers(space, (t) => t.activationCtx == null);
|
|
906
920
|
}
|
|
907
|
-
async activate(
|
|
921
|
+
async activate(space, trigger, callback) {
|
|
908
922
|
log9("activate", {
|
|
909
|
-
space:
|
|
923
|
+
space: space.key,
|
|
910
924
|
trigger
|
|
911
925
|
}, {
|
|
912
926
|
F: __dxlog_file9,
|
|
913
|
-
L:
|
|
927
|
+
L: 72,
|
|
914
928
|
S: this,
|
|
915
929
|
C: (f, a) => f(...a)
|
|
916
930
|
});
|
|
917
931
|
const activationCtx = new Context3({
|
|
918
|
-
name: `
|
|
932
|
+
name: `FunctionTrigger-${trigger.function}`
|
|
919
933
|
});
|
|
920
934
|
this._ctx.onDispose(() => activationCtx.dispose());
|
|
921
|
-
const registeredTrigger = this._triggersBySpaceKey.get(
|
|
935
|
+
const registeredTrigger = this._triggersBySpaceKey.get(space.key)?.find((reg) => reg.trigger.id === trigger.id);
|
|
922
936
|
invariant2(registeredTrigger, `Trigger is not registered: ${trigger.function}`, {
|
|
923
937
|
F: __dxlog_file9,
|
|
924
|
-
L:
|
|
938
|
+
L: 77,
|
|
925
939
|
S: this,
|
|
926
940
|
A: [
|
|
927
941
|
"registeredTrigger",
|
|
@@ -931,7 +945,7 @@ var TriggerRegistry = class extends Resource2 {
|
|
|
931
945
|
registeredTrigger.activationCtx = activationCtx;
|
|
932
946
|
try {
|
|
933
947
|
const options = this._options?.[trigger.spec.type];
|
|
934
|
-
await triggerHandlers[trigger.spec.type](activationCtx,
|
|
948
|
+
await triggerHandlers[trigger.spec.type](activationCtx, space, trigger.spec, callback, options);
|
|
935
949
|
} catch (err) {
|
|
936
950
|
delete registeredTrigger.activationCtx;
|
|
937
951
|
throw err;
|
|
@@ -945,7 +959,7 @@ var TriggerRegistry = class extends Resource2 {
|
|
|
945
959
|
space: space.key
|
|
946
960
|
}, {
|
|
947
961
|
F: __dxlog_file9,
|
|
948
|
-
L:
|
|
962
|
+
L: 93,
|
|
949
963
|
S: this,
|
|
950
964
|
C: (f, a) => f(...a)
|
|
951
965
|
});
|
|
@@ -955,23 +969,45 @@ var TriggerRegistry = class extends Resource2 {
|
|
|
955
969
|
if (!space.db.graph.runtimeSchemaRegistry.hasSchema(FunctionTrigger)) {
|
|
956
970
|
space.db.graph.runtimeSchemaRegistry.registerSchema(FunctionTrigger);
|
|
957
971
|
}
|
|
958
|
-
const
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
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
|
+
});
|
|
967
986
|
});
|
|
987
|
+
const { objects: existing } = await space.db.query(Filter3.schema(FunctionTrigger)).run();
|
|
988
|
+
const { added } = diff2(existing, manifestTriggers, compareForeignKeys);
|
|
968
989
|
added.forEach((trigger) => {
|
|
969
|
-
|
|
970
|
-
|
|
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
|
+
});
|
|
971
999
|
});
|
|
972
|
-
|
|
1000
|
+
if (added.length > 0) {
|
|
1001
|
+
await space.db.flush();
|
|
1002
|
+
}
|
|
973
1003
|
}
|
|
974
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
|
+
});
|
|
975
1011
|
const spaceListSubscription = this._client.spaces.subscribe(async (spaces) => {
|
|
976
1012
|
for (const space of spaces) {
|
|
977
1013
|
if (this._triggersBySpaceKey.has(space.key)) {
|
|
@@ -983,46 +1019,73 @@ var TriggerRegistry = class extends Resource2 {
|
|
|
983
1019
|
if (this._ctx.disposed) {
|
|
984
1020
|
break;
|
|
985
1021
|
}
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
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
|
+
}));
|
|
991
1036
|
}
|
|
992
1037
|
});
|
|
993
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
|
+
});
|
|
994
1045
|
}
|
|
995
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
|
+
});
|
|
996
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
|
+
});
|
|
997
1060
|
}
|
|
998
|
-
_handleNewTriggers(space,
|
|
999
|
-
const
|
|
1000
|
-
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;
|
|
1001
1064
|
});
|
|
1002
|
-
if (
|
|
1003
|
-
const newRegisteredTriggers =
|
|
1065
|
+
if (added.length > 0) {
|
|
1066
|
+
const newRegisteredTriggers = added.map((trigger) => ({
|
|
1004
1067
|
trigger
|
|
1005
1068
|
}));
|
|
1006
1069
|
registered.push(...newRegisteredTriggers);
|
|
1007
|
-
log9("
|
|
1070
|
+
log9.info("added", () => ({
|
|
1008
1071
|
spaceKey: space.key,
|
|
1009
|
-
|
|
1072
|
+
triggers: added.map((trigger) => trigger.function)
|
|
1010
1073
|
}), {
|
|
1011
1074
|
F: __dxlog_file9,
|
|
1012
|
-
L:
|
|
1075
|
+
L: 172,
|
|
1013
1076
|
S: this,
|
|
1014
1077
|
C: (f, a) => f(...a)
|
|
1015
1078
|
});
|
|
1016
1079
|
this.registered.emit({
|
|
1017
1080
|
space,
|
|
1018
|
-
triggers:
|
|
1081
|
+
triggers: added
|
|
1019
1082
|
});
|
|
1020
1083
|
}
|
|
1021
1084
|
}
|
|
1022
|
-
async _handleRemovedTriggers(space,
|
|
1085
|
+
async _handleRemovedTriggers(space, current, registered) {
|
|
1023
1086
|
const removed = [];
|
|
1024
1087
|
for (let i = registered.length - 1; i >= 0; i--) {
|
|
1025
|
-
const wasRemoved =
|
|
1088
|
+
const wasRemoved = current.filter((trigger) => trigger.enabled).find((trigger) => trigger.id === registered[i].trigger.id) == null;
|
|
1026
1089
|
if (wasRemoved) {
|
|
1027
1090
|
const unregistered = registered.splice(i, 1)[0];
|
|
1028
1091
|
await unregistered.activationCtx?.dispose();
|
|
@@ -1030,6 +1093,15 @@ var TriggerRegistry = class extends Resource2 {
|
|
|
1030
1093
|
}
|
|
1031
1094
|
}
|
|
1032
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
|
+
});
|
|
1033
1105
|
this.removed.emit({
|
|
1034
1106
|
space,
|
|
1035
1107
|
triggers: removed
|
|
@@ -1043,6 +1115,7 @@ var TriggerRegistry = class extends Resource2 {
|
|
|
1043
1115
|
};
|
|
1044
1116
|
export {
|
|
1045
1117
|
DevServer,
|
|
1118
|
+
FUNCTION_SCHEMA,
|
|
1046
1119
|
FunctionDef,
|
|
1047
1120
|
FunctionManifestSchema,
|
|
1048
1121
|
FunctionRegistry,
|