@dxos/functions 0.3.7 → 0.3.8-main.36d5c2a
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/README.md +2 -2
- package/dist/lib/browser/index.mjs +112 -61
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +127 -75
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/types/src/{function.d.ts → handler.d.ts} +8 -23
- package/dist/types/src/handler.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +2 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/manifest.d.ts +24 -0
- package/dist/types/src/manifest.d.ts.map +1 -0
- package/dist/types/src/runtime/dev-server.d.ts +11 -5
- package/dist/types/src/runtime/dev-server.d.ts.map +1 -1
- package/dist/types/src/runtime/trigger-manager.d.ts +4 -5
- package/dist/types/src/runtime/trigger-manager.d.ts.map +1 -1
- package/package.json +10 -10
- package/src/handler.ts +29 -0
- package/src/index.ts +2 -1
- package/src/manifest.ts +36 -0
- package/src/runtime/dev-server.ts +50 -32
- package/src/runtime/trigger-manager.ts +9 -10
- package/dist/types/src/function.d.ts.map +0 -1
- package/src/function.ts +0 -51
package/README.md
CHANGED
|
@@ -50,7 +50,7 @@ runtime:
|
|
|
50
50
|
Start functions in dev mode (from the related package):
|
|
51
51
|
|
|
52
52
|
```bash
|
|
53
|
-
dx function dev
|
|
53
|
+
dx function dev -r ts-node/register --verbose
|
|
54
54
|
```
|
|
55
55
|
|
|
56
56
|
> NOTE: `-r ts-node/register` configures native TypesScript support.
|
|
@@ -61,7 +61,7 @@ Install `nodemon` to support live reloading:
|
|
|
61
61
|
npm i -g nodemon
|
|
62
62
|
|
|
63
63
|
nodemon -w ./src -e ts --exec $(git rev-parse --show-toplevel)/packages/devtools/cli/bin/dev \
|
|
64
|
-
function dev
|
|
64
|
+
function dev -r ts-node/register --verbose
|
|
65
65
|
```
|
|
66
66
|
|
|
67
67
|
## Invoking functions
|
|
@@ -9,12 +9,12 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
9
9
|
|
|
10
10
|
// packages/core/functions/src/runtime/dev-server.ts
|
|
11
11
|
import express from "express";
|
|
12
|
+
import { getPort } from "get-port-please";
|
|
12
13
|
import { join } from "@dxos/node-std/path";
|
|
13
|
-
import { getPortPromise } from "portfinder";
|
|
14
14
|
import { Trigger } from "@dxos/async";
|
|
15
|
+
import { invariant } from "@dxos/invariant";
|
|
15
16
|
import { log } from "@dxos/log";
|
|
16
|
-
var __dxlog_file = "/home/
|
|
17
|
-
var DEFAULT_PORT = 7e3;
|
|
17
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/functions/src/runtime/dev-server.ts";
|
|
18
18
|
var DevServer = class {
|
|
19
19
|
// prettier-ignore
|
|
20
20
|
constructor(_client, _options) {
|
|
@@ -22,28 +22,49 @@ var DevServer = class {
|
|
|
22
22
|
this._options = _options;
|
|
23
23
|
this._handlers = {};
|
|
24
24
|
}
|
|
25
|
-
get port() {
|
|
26
|
-
return this._port;
|
|
27
|
-
}
|
|
28
25
|
get endpoint() {
|
|
29
|
-
|
|
26
|
+
invariant(this._port, void 0, {
|
|
27
|
+
F: __dxlog_file,
|
|
28
|
+
L: 43,
|
|
29
|
+
S: this,
|
|
30
|
+
A: [
|
|
31
|
+
"this._port",
|
|
32
|
+
""
|
|
33
|
+
]
|
|
34
|
+
});
|
|
35
|
+
return `http://localhost:${this._port}`;
|
|
36
|
+
}
|
|
37
|
+
get proxy() {
|
|
38
|
+
return this._proxy;
|
|
30
39
|
}
|
|
31
40
|
get functions() {
|
|
32
|
-
return Object.
|
|
41
|
+
return Object.values(this._handlers);
|
|
33
42
|
}
|
|
34
43
|
async initialize() {
|
|
35
|
-
for (const
|
|
44
|
+
for (const def of this._options.manifest.functions) {
|
|
45
|
+
const { id, path, handler: dir } = def;
|
|
36
46
|
try {
|
|
37
|
-
const module = __require(join(this._options.directory,
|
|
47
|
+
const module = __require(join(this._options.directory, dir));
|
|
38
48
|
const handler = module.default;
|
|
39
49
|
if (typeof handler !== "function") {
|
|
40
50
|
throw new Error(`Handler must export default function: ${id}`);
|
|
41
51
|
}
|
|
42
|
-
this._handlers[
|
|
52
|
+
if (this._handlers[path]) {
|
|
53
|
+
log.warn(`Function already registered: ${id}`, void 0, {
|
|
54
|
+
F: __dxlog_file,
|
|
55
|
+
L: 67,
|
|
56
|
+
S: this,
|
|
57
|
+
C: (f, a) => f(...a)
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
this._handlers[path] = {
|
|
61
|
+
def,
|
|
62
|
+
handler
|
|
63
|
+
};
|
|
43
64
|
} catch (err) {
|
|
44
|
-
log.error("parsing function (check
|
|
65
|
+
log.error("parsing function (check manifest)", err, {
|
|
45
66
|
F: __dxlog_file,
|
|
46
|
-
L:
|
|
67
|
+
L: 72,
|
|
47
68
|
S: this,
|
|
48
69
|
C: (f, a) => f(...a)
|
|
49
70
|
});
|
|
@@ -53,36 +74,42 @@ var DevServer = class {
|
|
|
53
74
|
async start() {
|
|
54
75
|
const app = express();
|
|
55
76
|
app.use(express.json());
|
|
56
|
-
app.post("/:
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
function: functionName,
|
|
60
|
-
data: req.body
|
|
61
|
-
}, {
|
|
62
|
-
F: __dxlog_file,
|
|
63
|
-
L: 74,
|
|
64
|
-
S: this,
|
|
65
|
-
C: (f, a) => f(...a)
|
|
66
|
-
});
|
|
67
|
-
const builder = {
|
|
77
|
+
app.post("/:name", async (req, res) => {
|
|
78
|
+
const { name } = req.params;
|
|
79
|
+
const response = {
|
|
68
80
|
status: (code) => {
|
|
69
81
|
res.statusCode = code;
|
|
70
|
-
return
|
|
82
|
+
return response;
|
|
71
83
|
},
|
|
72
84
|
succeed: (result = {}) => {
|
|
73
85
|
res.end(JSON.stringify(result));
|
|
74
|
-
return
|
|
86
|
+
return response;
|
|
75
87
|
}
|
|
76
88
|
};
|
|
77
89
|
const context = {
|
|
78
90
|
client: this._client,
|
|
79
|
-
status:
|
|
91
|
+
status: response.status.bind(response)
|
|
80
92
|
};
|
|
81
93
|
void (async () => {
|
|
82
94
|
try {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
95
|
+
log(`invoking: ${name}`, void 0, {
|
|
96
|
+
F: __dxlog_file,
|
|
97
|
+
L: 103,
|
|
98
|
+
S: this,
|
|
99
|
+
C: (f, a) => f(...a)
|
|
100
|
+
});
|
|
101
|
+
const { handler } = this._handlers[name];
|
|
102
|
+
const response2 = await handler({
|
|
103
|
+
context,
|
|
104
|
+
event: req.body
|
|
105
|
+
});
|
|
106
|
+
log("done", {
|
|
107
|
+
response: response2
|
|
108
|
+
}, {
|
|
109
|
+
F: __dxlog_file,
|
|
110
|
+
L: 106,
|
|
111
|
+
S: this,
|
|
112
|
+
C: (f, a) => f(...a)
|
|
86
113
|
});
|
|
87
114
|
} catch (err) {
|
|
88
115
|
res.statusCode = 500;
|
|
@@ -90,21 +117,35 @@ var DevServer = class {
|
|
|
90
117
|
}
|
|
91
118
|
})();
|
|
92
119
|
});
|
|
93
|
-
this._port = await
|
|
94
|
-
|
|
120
|
+
this._port = await getPort({
|
|
121
|
+
port: 7200,
|
|
122
|
+
portRange: [
|
|
123
|
+
7200,
|
|
124
|
+
7299
|
|
125
|
+
]
|
|
95
126
|
});
|
|
96
127
|
this._server = app.listen(this._port);
|
|
97
128
|
try {
|
|
98
|
-
const { registrationId } = await this._client.services.services.FunctionRegistryService.register({
|
|
129
|
+
const { registrationId, endpoint } = await this._client.services.services.FunctionRegistryService.register({
|
|
99
130
|
endpoint: this.endpoint,
|
|
100
|
-
functions: this.functions.map((
|
|
101
|
-
name
|
|
131
|
+
functions: this.functions.map(({ def: { path } }) => ({
|
|
132
|
+
name: path
|
|
102
133
|
}))
|
|
103
134
|
});
|
|
135
|
+
log.info("registered", {
|
|
136
|
+
registrationId,
|
|
137
|
+
endpoint
|
|
138
|
+
}, {
|
|
139
|
+
F: __dxlog_file,
|
|
140
|
+
L: 126,
|
|
141
|
+
S: this,
|
|
142
|
+
C: (f, a) => f(...a)
|
|
143
|
+
});
|
|
104
144
|
this._registrationId = registrationId;
|
|
145
|
+
this._proxy = endpoint;
|
|
105
146
|
} catch (err) {
|
|
106
147
|
await this.stop();
|
|
107
|
-
throw new Error("FunctionRegistryService not available
|
|
148
|
+
throw new Error("FunctionRegistryService not available (check plugin is configured).");
|
|
108
149
|
}
|
|
109
150
|
}
|
|
110
151
|
async stop() {
|
|
@@ -114,13 +155,22 @@ var DevServer = class {
|
|
|
114
155
|
await this._client.services.services.FunctionRegistryService.unregister({
|
|
115
156
|
registrationId: this._registrationId
|
|
116
157
|
});
|
|
158
|
+
log.info("unregistered", {
|
|
159
|
+
registrationId: this._registrationId
|
|
160
|
+
}, {
|
|
161
|
+
F: __dxlog_file,
|
|
162
|
+
L: 143,
|
|
163
|
+
S: this,
|
|
164
|
+
C: (f, a) => f(...a)
|
|
165
|
+
});
|
|
117
166
|
this._registrationId = void 0;
|
|
167
|
+
this._proxy = void 0;
|
|
118
168
|
}
|
|
119
169
|
trigger.wake();
|
|
120
170
|
});
|
|
121
171
|
await trigger.wait();
|
|
122
|
-
this._server = void 0;
|
|
123
172
|
this._port = void 0;
|
|
173
|
+
this._server = void 0;
|
|
124
174
|
}
|
|
125
175
|
};
|
|
126
176
|
|
|
@@ -128,14 +178,14 @@ var DevServer = class {
|
|
|
128
178
|
import { DeferredTask } from "@dxos/async";
|
|
129
179
|
import { Context } from "@dxos/context";
|
|
130
180
|
import { Filter, createSubscription } from "@dxos/echo-schema";
|
|
131
|
-
import { invariant } from "@dxos/invariant";
|
|
181
|
+
import { invariant as invariant2 } from "@dxos/invariant";
|
|
132
182
|
import { log as log2 } from "@dxos/log";
|
|
133
183
|
import { ComplexMap } from "@dxos/util";
|
|
134
|
-
var __dxlog_file2 = "/home/
|
|
184
|
+
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/functions/src/runtime/trigger-manager.ts";
|
|
135
185
|
var TriggerManager = class {
|
|
136
|
-
constructor(_client,
|
|
186
|
+
constructor(_client, _manifest, _invokeOptions) {
|
|
137
187
|
this._client = _client;
|
|
138
|
-
this.
|
|
188
|
+
this._manifest = _manifest;
|
|
139
189
|
this._invokeOptions = _invokeOptions;
|
|
140
190
|
this._mounts = new ComplexMap(({ name, spaceKey }) => `${spaceKey.toHex()}:${name}`);
|
|
141
191
|
this._queries = /* @__PURE__ */ new Set();
|
|
@@ -144,7 +194,7 @@ var TriggerManager = class {
|
|
|
144
194
|
this._client.spaces.subscribe(async (spaces) => {
|
|
145
195
|
for (const space of spaces) {
|
|
146
196
|
await space.waitUntilReady();
|
|
147
|
-
for (const trigger of this.
|
|
197
|
+
for (const trigger of this._manifest.triggers ?? []) {
|
|
148
198
|
await this.mount(new Context(), space, trigger);
|
|
149
199
|
}
|
|
150
200
|
}
|
|
@@ -160,6 +210,16 @@ var TriggerManager = class {
|
|
|
160
210
|
name: trigger.function,
|
|
161
211
|
spaceKey: space.key
|
|
162
212
|
};
|
|
213
|
+
const config = this._manifest.functions.find((config2) => config2.id === trigger.function);
|
|
214
|
+
invariant2(config, `Function not found: ${trigger.function}`, {
|
|
215
|
+
F: __dxlog_file2,
|
|
216
|
+
L: 57,
|
|
217
|
+
S: this,
|
|
218
|
+
A: [
|
|
219
|
+
"config",
|
|
220
|
+
"`Function not found: ${trigger.function}`"
|
|
221
|
+
]
|
|
222
|
+
});
|
|
163
223
|
const exists = this._mounts.get(key);
|
|
164
224
|
if (!exists) {
|
|
165
225
|
this._mounts.set(key, {
|
|
@@ -171,7 +231,7 @@ var TriggerManager = class {
|
|
|
171
231
|
trigger
|
|
172
232
|
}, {
|
|
173
233
|
F: __dxlog_file2,
|
|
174
|
-
L:
|
|
234
|
+
L: 61,
|
|
175
235
|
S: this,
|
|
176
236
|
C: (f, a) => f(...a)
|
|
177
237
|
});
|
|
@@ -180,7 +240,7 @@ var TriggerManager = class {
|
|
|
180
240
|
}
|
|
181
241
|
const objectIds = /* @__PURE__ */ new Set();
|
|
182
242
|
const task = new DeferredTask(ctx, async () => {
|
|
183
|
-
await this.
|
|
243
|
+
await this.execFunction(this._invokeOptions, config.path, {
|
|
184
244
|
space: space.key,
|
|
185
245
|
objects: Array.from(objectIds)
|
|
186
246
|
});
|
|
@@ -230,9 +290,9 @@ var TriggerManager = class {
|
|
|
230
290
|
await ctx.dispose();
|
|
231
291
|
}
|
|
232
292
|
}
|
|
233
|
-
async
|
|
234
|
-
const { endpoint
|
|
235
|
-
|
|
293
|
+
async execFunction(options, functionName, data) {
|
|
294
|
+
const { endpoint } = options;
|
|
295
|
+
invariant2(endpoint, "Missing endpoint", {
|
|
236
296
|
F: __dxlog_file2,
|
|
237
297
|
L: 120,
|
|
238
298
|
S: this,
|
|
@@ -241,25 +301,16 @@ var TriggerManager = class {
|
|
|
241
301
|
"'Missing endpoint'"
|
|
242
302
|
]
|
|
243
303
|
});
|
|
244
|
-
invariant(runtime, "Missing runtime", {
|
|
245
|
-
F: __dxlog_file2,
|
|
246
|
-
L: 121,
|
|
247
|
-
S: this,
|
|
248
|
-
A: [
|
|
249
|
-
"runtime",
|
|
250
|
-
"'Missing runtime'"
|
|
251
|
-
]
|
|
252
|
-
});
|
|
253
304
|
try {
|
|
254
305
|
log2("invoke", {
|
|
255
306
|
function: functionName
|
|
256
307
|
}, {
|
|
257
308
|
F: __dxlog_file2,
|
|
258
|
-
L:
|
|
309
|
+
L: 123,
|
|
259
310
|
S: this,
|
|
260
311
|
C: (f, a) => f(...a)
|
|
261
312
|
});
|
|
262
|
-
const url = `${endpoint}/${
|
|
313
|
+
const url = `${endpoint}/${functionName}`;
|
|
263
314
|
const res = await fetch(url, {
|
|
264
315
|
method: "POST",
|
|
265
316
|
body: JSON.stringify(data),
|
|
@@ -272,7 +323,7 @@ var TriggerManager = class {
|
|
|
272
323
|
result: await res.json()
|
|
273
324
|
}, {
|
|
274
325
|
F: __dxlog_file2,
|
|
275
|
-
L:
|
|
326
|
+
L: 133,
|
|
276
327
|
S: this,
|
|
277
328
|
C: (f, a) => f(...a)
|
|
278
329
|
});
|
|
@@ -282,7 +333,7 @@ var TriggerManager = class {
|
|
|
282
333
|
error: err.message
|
|
283
334
|
}, {
|
|
284
335
|
F: __dxlog_file2,
|
|
285
|
-
L:
|
|
336
|
+
L: 135,
|
|
286
337
|
S: this,
|
|
287
338
|
C: (f, a) => f(...a)
|
|
288
339
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/runtime/dev-server.ts", "../../../src/runtime/trigger-manager.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport express from 'express';\nimport type http from 'http';\nimport { join } from 'node:path';\nimport {
|
|
5
|
-
"mappings": ";;;;;;;;;;AAIA,OAAOA,aAAa;
|
|
6
|
-
"names": ["express", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport express from 'express';\nimport { getPort } from 'get-port-please';\nimport type http from 'http';\nimport { join } from 'node:path';\n\nimport { Trigger } from '@dxos/async';\nimport { type Client } from '@dxos/client';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport { type FunctionContext, type FunctionHandler, type Response } from '../handler';\nimport { type FunctionDef, type FunctionManifest } from '../manifest';\n\nexport type DevServerOptions = {\n port?: number;\n directory: string;\n manifest: FunctionManifest;\n};\n\n/**\n * Functions dev server provides a local HTTP server for testing functions.\n */\n// TODO(burdon): Reconcile with agent/functions dev dispatcher.\nexport class DevServer {\n private readonly _handlers: Record<string, { def: FunctionDef; handler: FunctionHandler<any> }> = {};\n\n private _server?: http.Server;\n private _port?: number;\n private _registrationId?: string;\n private _proxy?: string;\n\n // prettier-ignore\n constructor(\n private readonly _client: Client,\n private readonly _options: DevServerOptions,\n ) {}\n\n get endpoint() {\n invariant(this._port);\n return `http://localhost:${this._port}`;\n }\n\n get proxy() {\n return this._proxy;\n }\n\n get functions() {\n return Object.values(this._handlers);\n }\n\n async initialize() {\n for (const def of this._options.manifest.functions) {\n const { id, path, handler: dir } = def;\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const module = require(join(this._options.directory, dir));\n const handler = module.default;\n if (typeof handler !== 'function') {\n throw new Error(`Handler must export default function: ${id}`);\n }\n\n if (this._handlers[path]) {\n log.warn(`Function already registered: ${id}`);\n }\n\n this._handlers[path] = { def, handler };\n } catch (err) {\n log.error('parsing function (check manifest)', err);\n }\n }\n }\n\n async start() {\n const app = express();\n app.use(express.json());\n\n app.post('/:name', async (req, res) => {\n const { name } = req.params;\n\n const response: Response = {\n status: (code: number) => {\n res.statusCode = code;\n return response;\n },\n\n succeed: (result = {}) => {\n res.end(JSON.stringify(result));\n return response;\n },\n };\n\n const context: FunctionContext = {\n client: this._client,\n status: response.status.bind(response),\n };\n\n void (async () => {\n try {\n log(`invoking: ${name}`);\n const { handler } = this._handlers[name];\n const response = await handler({ context, event: req.body });\n log('done', { response });\n } catch (err: any) {\n res.statusCode = 500;\n res.end(err.message);\n }\n })();\n });\n\n // TODO(burdon): Push down port management to agent.\n this._port = await getPort({ port: 7200, portRange: [7200, 7299] });\n this._server = app.listen(this._port);\n\n // TODO(burdon): Test during initialization.\n try {\n // Register functions.\n const { registrationId, endpoint } = await this._client.services.services.FunctionRegistryService!.register({\n endpoint: this.endpoint,\n functions: this.functions.map(({ def: { path } }) => ({ name: path })),\n });\n\n log.info('registered', { registrationId, endpoint });\n this._registrationId = registrationId;\n this._proxy = endpoint;\n } catch (err: any) {\n await this.stop();\n throw new Error('FunctionRegistryService not available (check plugin is configured).');\n }\n }\n\n async stop() {\n const trigger = new Trigger();\n this._server?.close(async () => {\n if (this._registrationId) {\n await this._client.services.services.FunctionRegistryService!.unregister({\n registrationId: this._registrationId,\n });\n\n log.info('unregistered', { registrationId: this._registrationId });\n this._registrationId = undefined;\n this._proxy = undefined;\n }\n\n trigger.wake();\n });\n\n await trigger.wait();\n this._port = undefined;\n this._server = undefined;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { DeferredTask } from '@dxos/async';\nimport { type Client, type PublicKey } from '@dxos/client';\nimport type { Query, Space } from '@dxos/client/echo';\nimport { Context } from '@dxos/context';\nimport { Filter, createSubscription } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { ComplexMap } from '@dxos/util';\n\nimport { type FunctionManifest, type FunctionTrigger } from '../manifest';\n\n// TODO(burdon): Rename.\nexport type InvokeOptions = {\n endpoint: string;\n};\n\nexport class TriggerManager {\n private readonly _mounts = new ComplexMap<\n { name: string; spaceKey: PublicKey },\n { ctx: Context; trigger: FunctionTrigger }\n >(({ name, spaceKey }) => `${spaceKey.toHex()}:${name}`);\n\n private readonly _queries = new Set<Query>();\n\n constructor(\n private readonly _client: Client,\n private readonly _manifest: FunctionManifest,\n private readonly _invokeOptions: InvokeOptions,\n ) {}\n\n async start() {\n // TODO(burdon): Make runtime configurable (via CLI)?\n this._client.spaces.subscribe(async (spaces) => {\n for (const space of spaces) {\n await space.waitUntilReady();\n for (const trigger of this._manifest.triggers ?? []) {\n // TODO(burdon): New context? Shared?\n await this.mount(new Context(), space, trigger);\n }\n }\n });\n }\n\n async stop() {\n for (const { name, spaceKey } of this._mounts.keys()) {\n await this.unmount(name, spaceKey);\n }\n }\n\n private async mount(ctx: Context, space: Space, trigger: FunctionTrigger) {\n const key = { name: trigger.function, spaceKey: space.key };\n const config = this._manifest.functions.find((config) => config.id === trigger.function);\n invariant(config, `Function not found: ${trigger.function}`);\n const exists = this._mounts.get(key);\n if (!exists) {\n this._mounts.set(key, { ctx, trigger });\n log('mount', { space: space.key, trigger });\n if (ctx.disposed) {\n return;\n }\n\n // TODO(burdon): Why DeferredTask? How to pass objectIds to function?\n const objectIds = new Set<string>();\n const task = new DeferredTask(ctx, async () => {\n await this.execFunction(this._invokeOptions, config.path, {\n space: space.key,\n objects: Array.from(objectIds),\n });\n });\n\n let count = 0;\n const subscription = createSubscription(({ added, updated }) => {\n for (const object of added) {\n objectIds.add(object.id);\n }\n for (const object of updated) {\n objectIds.add(object.id);\n }\n\n log('updated', {\n trigger,\n space: space.key,\n objects: objectIds.size,\n count,\n });\n\n task.schedule();\n count++;\n });\n // TODO(burdon): DSL for query (replace props).\n const query = space.db.query(Filter.typename(trigger.subscription.type, trigger.subscription.props));\n this._queries.add(query);\n const unsubscribe = query.subscribe(({ objects }) => {\n subscription.update(objects);\n }, true);\n\n ctx.onDispose(() => {\n subscription.unsubscribe();\n unsubscribe();\n this._queries.delete(query);\n });\n }\n }\n\n private async unmount(name: string, spaceKey: PublicKey) {\n const key = { name, spaceKey };\n const { ctx } = this._mounts.get(key) ?? {};\n if (ctx) {\n this._mounts.delete(key);\n await ctx.dispose();\n }\n }\n\n private async execFunction(options: InvokeOptions, functionName: string, data: any) {\n const { endpoint } = options;\n invariant(endpoint, 'Missing endpoint');\n\n try {\n log('invoke', { function: functionName });\n const url = `${endpoint}/${functionName}`;\n const res = await fetch(url, {\n method: 'POST',\n body: JSON.stringify(data),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n log('result', { function: functionName, result: await res.json() });\n } catch (err: any) {\n log.error('error', { function: functionName, error: err.message });\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["express", "getPort", "join", "Trigger", "invariant", "log", "DevServer", "constructor", "_client", "_options", "_handlers", "endpoint", "invariant", "_port", "proxy", "_proxy", "functions", "Object", "values", "initialize", "def", "manifest", "id", "path", "handler", "dir", "module", "require", "join", "directory", "default", "Error", "log", "warn", "err", "error", "start", "app", "express", "use", "json", "post", "req", "res", "name", "params", "response", "status", "code", "statusCode", "succeed", "result", "end", "JSON", "stringify", "context", "client", "bind", "event", "body", "message", "getPort", "port", "portRange", "_server", "listen", "registrationId", "services", "FunctionRegistryService", "register", "map", "info", "_registrationId", "stop", "trigger", "Trigger", "close", "unregister", "undefined", "wake", "wait", "DeferredTask", "Context", "Filter", "createSubscription", "invariant", "log", "ComplexMap", "TriggerManager", "constructor", "_client", "_manifest", "_invokeOptions", "_mounts", "name", "spaceKey", "toHex", "_queries", "Set", "start", "spaces", "subscribe", "space", "waitUntilReady", "trigger", "triggers", "mount", "stop", "keys", "unmount", "ctx", "key", "function", "config", "functions", "find", "id", "exists", "get", "set", "disposed", "objectIds", "task", "execFunction", "path", "objects", "Array", "from", "count", "subscription", "added", "updated", "object", "add", "size", "schedule", "query", "db", "typename", "type", "props", "unsubscribe", "update", "onDispose", "delete", "dispose", "options", "functionName", "data", "endpoint", "url", "res", "fetch", "method", "body", "JSON", "stringify", "headers", "result", "json", "err", "error", "message"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/core/functions/src/
|
|
1
|
+
{"inputs":{"packages/core/functions/src/handler.ts":{"bytes":1109,"imports":[],"format":"esm"},"packages/core/functions/src/manifest.ts":{"bytes":1346,"imports":[],"format":"esm"},"packages/core/functions/src/runtime/dev-server.ts":{"bytes":17196,"imports":[{"path":"express","kind":"import-statement","external":true},{"path":"get-port-please","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"<runtime>","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/trigger-manager.ts":{"bytes":16867,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"packages/core/functions/src/runtime/index.ts":{"bytes":584,"imports":[{"path":"packages/core/functions/src/runtime/dev-server.ts","kind":"import-statement","original":"./dev-server"},{"path":"packages/core/functions/src/runtime/trigger-manager.ts","kind":"import-statement","original":"./trigger-manager"}],"format":"esm"},"packages/core/functions/src/index.ts":{"bytes":637,"imports":[{"path":"packages/core/functions/src/handler.ts","kind":"import-statement","original":"./handler"},{"path":"packages/core/functions/src/manifest.ts","kind":"import-statement","original":"./manifest"},{"path":"packages/core/functions/src/runtime/index.ts","kind":"import-statement","original":"./runtime"}],"format":"esm"}},"outputs":{"packages/core/functions/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":15788},"packages/core/functions/dist/lib/browser/index.mjs":{"imports":[{"path":"express","kind":"import-statement","external":true},{"path":"get-port-please","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/echo-schema","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["DevServer","TriggerManager"],"entryPoint":"packages/core/functions/src/index.ts","inputs":{"packages/core/functions/src/index.ts":{"bytesInOutput":0},"packages/core/functions/src/runtime/dev-server.ts":{"bytesInOutput":4383},"packages/core/functions/src/runtime/index.ts":{"bytesInOutput":0},"packages/core/functions/src/runtime/trigger-manager.ts":{"bytesInOutput":4463}},"bytes":9438}}}
|