@dxos/functions-runtime-cloudflare 0.8.4-main.3c1ae3b → 0.8.4-main.40e3dcdf1b

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.
Files changed (39) hide show
  1. package/dist/lib/browser/index.mjs +523 -233
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +523 -233
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/functions-client.d.ts +1 -0
  8. package/dist/types/src/functions-client.d.ts.map +1 -1
  9. package/dist/types/src/internal/data-service-impl.d.ts +8 -7
  10. package/dist/types/src/internal/data-service-impl.d.ts.map +1 -1
  11. package/dist/types/src/internal/query-service-impl.d.ts +3 -9
  12. package/dist/types/src/internal/query-service-impl.d.ts.map +1 -1
  13. package/dist/types/src/internal/queue-service-impl.d.ts +8 -9
  14. package/dist/types/src/internal/queue-service-impl.d.ts.map +1 -1
  15. package/dist/types/src/internal/service-container.d.ts +8 -8
  16. package/dist/types/src/internal/service-container.d.ts.map +1 -1
  17. package/dist/types/src/internal/utils.d.ts +2 -0
  18. package/dist/types/src/internal/utils.d.ts.map +1 -0
  19. package/dist/types/src/logger.d.ts.map +1 -1
  20. package/dist/types/src/queues-api.d.ts +6 -6
  21. package/dist/types/src/queues-api.d.ts.map +1 -1
  22. package/dist/types/src/space-proxy.d.ts +3 -2
  23. package/dist/types/src/space-proxy.d.ts.map +1 -1
  24. package/dist/types/src/wrap-handler-for-cloudflare.d.ts.map +1 -1
  25. package/dist/types/tsconfig.tsbuildinfo +1 -1
  26. package/package.json +20 -16
  27. package/src/functions-client.ts +9 -2
  28. package/src/internal/data-service-impl.ts +28 -11
  29. package/src/internal/query-service-impl.ts +8 -58
  30. package/src/internal/queue-service-impl.ts +37 -22
  31. package/src/internal/service-container.ts +46 -11
  32. package/src/internal/utils.ts +5 -0
  33. package/src/logger.ts +2 -0
  34. package/src/queues-api.ts +6 -6
  35. package/src/space-proxy.ts +4 -3
  36. package/src/wrap-handler-for-cloudflare.ts +3 -3
  37. package/dist/types/src/internal/adapter.d.ts +0 -12
  38. package/dist/types/src/internal/adapter.d.ts.map +0 -1
  39. package/src/internal/adapter.ts +0 -48
@@ -3,7 +3,7 @@ import { createRequire } from 'node:module';const require = createRequire(import
3
3
  // src/functions-client.ts
4
4
  import { Resource as Resource2 } from "@dxos/context";
5
5
  import { EchoClient } from "@dxos/echo-db";
6
- import { invariant as invariant5 } from "@dxos/invariant";
6
+ import { invariant as invariant3 } from "@dxos/invariant";
7
7
 
8
8
  // src/internal/data-service-impl.ts
9
9
  import { Stream } from "@dxos/codec-protobuf/stream";
@@ -12,6 +12,76 @@ import { NotImplementedError, RuntimeServiceError } from "@dxos/errors";
12
12
  import { invariant } from "@dxos/invariant";
13
13
  import { SpaceId } from "@dxos/keys";
14
14
  import { log } from "@dxos/log";
15
+
16
+ // src/internal/utils.ts
17
+ var copyUint8Array = (value) => new Uint8Array(value);
18
+
19
+ // src/internal/data-service-impl.ts
20
+ function _ts_add_disposable_resource(env, value, async) {
21
+ if (value !== null && value !== void 0) {
22
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
23
+ var dispose, inner;
24
+ if (async) {
25
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
26
+ dispose = value[Symbol.asyncDispose];
27
+ }
28
+ if (dispose === void 0) {
29
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
30
+ dispose = value[Symbol.dispose];
31
+ if (async) inner = dispose;
32
+ }
33
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
34
+ if (inner) dispose = function() {
35
+ try {
36
+ inner.call(this);
37
+ } catch (e) {
38
+ return Promise.reject(e);
39
+ }
40
+ };
41
+ env.stack.push({
42
+ value,
43
+ dispose,
44
+ async
45
+ });
46
+ } else if (async) {
47
+ env.stack.push({
48
+ async: true
49
+ });
50
+ }
51
+ return value;
52
+ }
53
+ function _ts_dispose_resources(env) {
54
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
55
+ var e = new Error(message);
56
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
57
+ };
58
+ return (_ts_dispose_resources = function _ts_dispose_resources5(env2) {
59
+ function fail(e) {
60
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
61
+ env2.hasError = true;
62
+ }
63
+ var r, s = 0;
64
+ function next() {
65
+ while (r = env2.stack.pop()) {
66
+ try {
67
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
68
+ if (r.dispose) {
69
+ var result = r.dispose.call(r.value);
70
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
71
+ fail(e);
72
+ return next();
73
+ });
74
+ } else s |= 1;
75
+ } catch (e) {
76
+ fail(e);
77
+ }
78
+ }
79
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
80
+ if (env2.hasError) throw env2.error;
81
+ }
82
+ return next();
83
+ })(env);
84
+ }
15
85
  var __dxlog_file = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/data-service-impl.ts";
16
86
  var DataServiceImpl = class {
17
87
  _executionContext;
@@ -25,7 +95,7 @@ var DataServiceImpl = class {
25
95
  return new Stream(({ next }) => {
26
96
  invariant(SpaceId.isValid(spaceId), void 0, {
27
97
  F: __dxlog_file,
28
- L: 35,
98
+ L: 39,
29
99
  S: this,
30
100
  A: [
31
101
  "SpaceId.isValid(spaceId)",
@@ -41,7 +111,7 @@ var DataServiceImpl = class {
41
111
  };
42
112
  });
43
113
  }
44
- async updateSubscription({ subscriptionId, addIds, removeIds }) {
114
+ async updateSubscription({ subscriptionId, addIds }) {
45
115
  const sub = this.dataSubscriptions.get(subscriptionId) ?? raise(new RuntimeServiceError({
46
116
  message: "Subscription not found.",
47
117
  context: {
@@ -53,44 +123,79 @@ var DataServiceImpl = class {
53
123
  count: addIds.length
54
124
  }, {
55
125
  F: __dxlog_file,
56
- L: 55,
126
+ L: 59,
57
127
  S: this,
58
128
  C: (f, a) => f(...a)
59
129
  });
60
130
  for (const documentId of addIds) {
61
- const document = await this._dataService.getDocument(this._executionContext, sub.spaceId, documentId);
62
- log.info("document loaded", {
63
- documentId,
64
- spaceId: sub.spaceId,
65
- found: !!document
66
- }, {
67
- F: __dxlog_file,
68
- L: 59,
69
- S: this,
70
- C: (f, a) => f(...a)
71
- });
72
- if (!document) {
73
- log.warn("not found", {
74
- documentId
131
+ const env = {
132
+ stack: [],
133
+ error: void 0,
134
+ hasError: false
135
+ };
136
+ try {
137
+ const document = _ts_add_disposable_resource(env, await this._dataService.getDocument(this._executionContext, sub.spaceId, documentId), false);
138
+ log.info("document loaded", {
139
+ documentId,
140
+ spaceId: sub.spaceId,
141
+ found: !!document
75
142
  }, {
76
143
  F: __dxlog_file,
77
- L: 61,
144
+ L: 63,
78
145
  S: this,
79
146
  C: (f, a) => f(...a)
80
147
  });
81
- continue;
148
+ if (!document) {
149
+ log.warn("not found", {
150
+ documentId
151
+ }, {
152
+ F: __dxlog_file,
153
+ L: 65,
154
+ S: this,
155
+ C: (f, a) => f(...a)
156
+ });
157
+ continue;
158
+ }
159
+ sub.next({
160
+ updates: [
161
+ {
162
+ documentId,
163
+ // Copy returned object to avoid hanging RPC stub
164
+ // See https://developers.cloudflare.com/workers/runtime-apis/rpc/lifecycle/
165
+ mutation: copyUint8Array(document.data)
166
+ }
167
+ ]
168
+ });
169
+ } catch (e) {
170
+ env.error = e;
171
+ env.hasError = true;
172
+ } finally {
173
+ _ts_dispose_resources(env);
82
174
  }
83
- sub.next({
84
- updates: [
85
- {
86
- documentId,
87
- mutation: document.data
88
- }
89
- ]
90
- });
91
175
  }
92
176
  }
93
177
  }
178
+ async createDocument({ spaceId, initialValue }) {
179
+ const env = {
180
+ stack: [],
181
+ error: void 0,
182
+ hasError: false
183
+ };
184
+ try {
185
+ const response = _ts_add_disposable_resource(env, await this._dataService.createDocument(this._executionContext, {
186
+ spaceId,
187
+ initialValue
188
+ }), false);
189
+ return {
190
+ documentId: response.documentId
191
+ };
192
+ } catch (e) {
193
+ env.error = e;
194
+ env.hasError = true;
195
+ } finally {
196
+ _ts_dispose_resources(env);
197
+ }
198
+ }
94
199
  async update({ updates, subscriptionId }) {
95
200
  const sub = this.dataSubscriptions.get(subscriptionId) ?? raise(new RuntimeServiceError({
96
201
  message: "Subscription not found.",
@@ -114,27 +219,30 @@ var DataServiceImpl = class {
114
219
  }
115
220
  async flush() {
116
221
  }
117
- subscribeSpaceSyncState(request, options) {
222
+ subscribeSpaceSyncState(_request, _options) {
118
223
  throw new NotImplementedError({
119
224
  message: "subscribeSpaceSyncState is not implemented."
120
225
  });
121
226
  }
122
- async getDocumentHeads({ documentIds }) {
227
+ async getDocumentHeads({ documentIds: _documentIds }) {
123
228
  throw new NotImplementedError({
124
229
  message: "getDocumentHeads is not implemented."
125
230
  });
126
231
  }
127
- async reIndexHeads({ documentIds }) {
232
+ async reIndexHeads({ documentIds: _documentIds }) {
128
233
  throw new NotImplementedError({
129
234
  message: "reIndexHeads is not implemented."
130
235
  });
131
236
  }
132
237
  async updateIndexes() {
133
- throw new NotImplementedError({
134
- message: "updateIndexes is not implemented."
238
+ log.error("updateIndexes is not available in EDGE env.", void 0, {
239
+ F: __dxlog_file,
240
+ L: 133,
241
+ S: this,
242
+ C: (f, a) => f(...a)
135
243
  });
136
244
  }
137
- async waitUntilHeadsReplicated({ heads }) {
245
+ async waitUntilHeadsReplicated({ heads: _heads }) {
138
246
  throw new NotImplementedError({
139
247
  message: "waitUntilHeadsReplicated is not implemented."
140
248
  });
@@ -142,84 +250,75 @@ var DataServiceImpl = class {
142
250
  };
143
251
 
144
252
  // src/internal/query-service-impl.ts
145
- import * as Schema from "effect/Schema";
146
253
  import { Stream as Stream2 } from "@dxos/codec-protobuf/stream";
147
- import { QueryAST } from "@dxos/echo-protocol";
148
254
  import { NotImplementedError as NotImplementedError2, RuntimeServiceError as RuntimeServiceError2 } from "@dxos/errors";
149
- import { invariant as invariant3 } from "@dxos/invariant";
150
- import { PublicKey } from "@dxos/keys";
151
- import { SpaceId as SpaceId3 } from "@dxos/keys";
152
255
  import { log as log2 } from "@dxos/log";
153
-
154
- // src/internal/adapter.ts
155
- import { failUndefined } from "@dxos/debug";
156
- import { invariant as invariant2 } from "@dxos/invariant";
157
- import { SpaceId as SpaceId2 } from "@dxos/keys";
158
- var __dxlog_file2 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/adapter.ts";
159
- var queryToDataServiceRequest = (query) => {
160
- const { filter, options } = isSimpleSelectionQuery(query) ?? failUndefined();
161
- invariant2(options?.spaceIds?.length === 1, "Only one space is supported", {
162
- F: __dxlog_file2,
163
- L: 13,
164
- S: void 0,
165
- A: [
166
- "options?.spaceIds?.length === 1",
167
- "'Only one space is supported'"
168
- ]
169
- });
170
- invariant2(filter.type === "object", "Only object filters are supported", {
171
- F: __dxlog_file2,
172
- L: 14,
173
- S: void 0,
174
- A: [
175
- "filter.type === 'object'",
176
- "'Only object filters are supported'"
177
- ]
178
- });
179
- const spaceId = options.spaceIds[0];
180
- invariant2(SpaceId2.isValid(spaceId), void 0, {
181
- F: __dxlog_file2,
182
- L: 17,
183
- S: void 0,
184
- A: [
185
- "SpaceId.isValid(spaceId)",
186
- ""
187
- ]
188
- });
189
- return {
190
- spaceId,
191
- type: filter.typename ?? void 0,
192
- objectIds: [
193
- ...filter.id ?? []
194
- ]
195
- };
196
- };
197
- var isSimpleSelectionQuery = (query) => {
198
- switch (query.type) {
199
- case "options": {
200
- const maybeFilter = isSimpleSelectionQuery(query.query);
201
- if (!maybeFilter) {
202
- return null;
203
- }
204
- return {
205
- filter: maybeFilter.filter,
206
- options: query.options
207
- };
208
- }
209
- case "select": {
210
- return {
211
- filter: query.filter,
212
- options: void 0
213
- };
256
+ function _ts_add_disposable_resource2(env, value, async) {
257
+ if (value !== null && value !== void 0) {
258
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
259
+ var dispose, inner;
260
+ if (async) {
261
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
262
+ dispose = value[Symbol.asyncDispose];
214
263
  }
215
- default: {
216
- return null;
264
+ if (dispose === void 0) {
265
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
266
+ dispose = value[Symbol.dispose];
267
+ if (async) inner = dispose;
217
268
  }
269
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
270
+ if (inner) dispose = function() {
271
+ try {
272
+ inner.call(this);
273
+ } catch (e) {
274
+ return Promise.reject(e);
275
+ }
276
+ };
277
+ env.stack.push({
278
+ value,
279
+ dispose,
280
+ async
281
+ });
282
+ } else if (async) {
283
+ env.stack.push({
284
+ async: true
285
+ });
218
286
  }
219
- };
220
-
221
- // src/internal/query-service-impl.ts
222
- var __dxlog_file3 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/query-service-impl.ts";
287
+ return value;
288
+ }
289
+ function _ts_dispose_resources2(env) {
290
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
291
+ var e = new Error(message);
292
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
293
+ };
294
+ return (_ts_dispose_resources2 = function _ts_dispose_resources5(env2) {
295
+ function fail(e) {
296
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
297
+ env2.hasError = true;
298
+ }
299
+ var r, s = 0;
300
+ function next() {
301
+ while (r = env2.stack.pop()) {
302
+ try {
303
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
304
+ if (r.dispose) {
305
+ var result = r.dispose.call(r.value);
306
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
307
+ fail(e);
308
+ return next();
309
+ });
310
+ } else s |= 1;
311
+ } catch (e) {
312
+ fail(e);
313
+ }
314
+ }
315
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
316
+ if (env2.hasError) throw env2.error;
317
+ }
318
+ return next();
319
+ })(env);
320
+ }
321
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/query-service-impl.ts";
223
322
  var QueryServiceImpl = class {
224
323
  _executionContext;
225
324
  _dataService;
@@ -232,69 +331,56 @@ var QueryServiceImpl = class {
232
331
  log2.info("execQuery", {
233
332
  request
234
333
  }, {
235
- F: __dxlog_file3,
236
- L: 33,
334
+ F: __dxlog_file2,
335
+ L: 20,
237
336
  S: this,
238
337
  C: (f, a) => f(...a)
239
338
  });
240
- const query = QueryAST.Query.pipe(Schema.decodeUnknownSync)(JSON.parse(request.query));
241
- const requestedSpaceIds = getTargetSpacesForQuery(query);
242
- invariant3(requestedSpaceIds.length === 1, "Only one space is supported", {
243
- F: __dxlog_file3,
244
- L: 36,
245
- S: this,
246
- A: [
247
- "requestedSpaceIds.length === 1",
248
- "'Only one space is supported'"
249
- ]
250
- });
251
- const spaceId = requestedSpaceIds[0];
252
339
  return Stream2.fromPromise((async () => {
253
340
  try {
254
- this._queryCount++;
255
- log2.info("begin query", {
256
- spaceId
257
- }, {
258
- F: __dxlog_file3,
259
- L: 43,
260
- S: this,
261
- C: (f, a) => f(...a)
262
- });
263
- const queryResponse = await this._dataService.queryDocuments(this._executionContext, queryToDataServiceRequest(query));
264
- log2.info("query response", {
265
- spaceId,
266
- filter: request.filter,
267
- resultCount: queryResponse.results.length
268
- }, {
269
- F: __dxlog_file3,
270
- L: 48,
271
- S: this,
272
- C: (f, a) => f(...a)
273
- });
274
- return {
275
- results: queryResponse.results.map((object) => ({
276
- id: object.objectId,
277
- spaceId,
278
- spaceKey: PublicKey.ZERO,
279
- documentId: object.document.documentId,
280
- rank: 0,
281
- documentAutomerge: object.document.data
282
- }))
341
+ const env = {
342
+ stack: [],
343
+ error: void 0,
344
+ hasError: false
283
345
  };
346
+ try {
347
+ this._queryCount++;
348
+ log2.info("begin query", {
349
+ request
350
+ }, {
351
+ F: __dxlog_file2,
352
+ L: 26,
353
+ S: this,
354
+ C: (f, a) => f(...a)
355
+ });
356
+ const queryResponse = _ts_add_disposable_resource2(env, await this._dataService.execQuery(this._executionContext, request), false);
357
+ log2.info("query response", {
358
+ resultCount: queryResponse.results?.length
359
+ }, {
360
+ F: __dxlog_file2,
361
+ L: 28,
362
+ S: this,
363
+ C: (f, a) => f(...a)
364
+ });
365
+ return structuredClone(queryResponse);
366
+ } catch (e) {
367
+ env.error = e;
368
+ env.hasError = true;
369
+ } finally {
370
+ _ts_dispose_resources2(env);
371
+ }
284
372
  } catch (error) {
285
373
  log2.error("query failed", {
286
374
  err: error
287
375
  }, {
288
- F: __dxlog_file3,
289
- L: 62,
376
+ F: __dxlog_file2,
377
+ L: 31,
290
378
  S: this,
291
379
  C: (f, a) => f(...a)
292
380
  });
293
381
  throw new RuntimeServiceError2({
294
382
  message: `Query execution failed (queryCount=${this._queryCount})`,
295
383
  context: {
296
- spaceId,
297
- filter: request.filter,
298
384
  queryCount: this._queryCount
299
385
  },
300
386
  cause: error
@@ -313,25 +399,74 @@ var QueryServiceImpl = class {
313
399
  });
314
400
  }
315
401
  };
316
- var getTargetSpacesForQuery = (query) => {
317
- const spaces = /* @__PURE__ */ new Set();
318
- const visitor = (node) => {
319
- if (node.type === "options") {
320
- if (node.options.spaceIds) {
321
- for (const spaceId of node.options.spaceIds) {
322
- spaces.add(SpaceId3.make(spaceId));
402
+
403
+ // src/internal/queue-service-impl.ts
404
+ import { RuntimeServiceError as RuntimeServiceError3 } from "@dxos/errors";
405
+ function _ts_add_disposable_resource3(env, value, async) {
406
+ if (value !== null && value !== void 0) {
407
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
408
+ var dispose, inner;
409
+ if (async) {
410
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
411
+ dispose = value[Symbol.asyncDispose];
412
+ }
413
+ if (dispose === void 0) {
414
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
415
+ dispose = value[Symbol.dispose];
416
+ if (async) inner = dispose;
417
+ }
418
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
419
+ if (inner) dispose = function() {
420
+ try {
421
+ inner.call(this);
422
+ } catch (e) {
423
+ return Promise.reject(e);
424
+ }
425
+ };
426
+ env.stack.push({
427
+ value,
428
+ dispose,
429
+ async
430
+ });
431
+ } else if (async) {
432
+ env.stack.push({
433
+ async: true
434
+ });
435
+ }
436
+ return value;
437
+ }
438
+ function _ts_dispose_resources3(env) {
439
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
440
+ var e = new Error(message);
441
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
442
+ };
443
+ return (_ts_dispose_resources3 = function _ts_dispose_resources5(env2) {
444
+ function fail(e) {
445
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
446
+ env2.hasError = true;
447
+ }
448
+ var r, s = 0;
449
+ function next() {
450
+ while (r = env2.stack.pop()) {
451
+ try {
452
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
453
+ if (r.dispose) {
454
+ var result = r.dispose.call(r.value);
455
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
456
+ fail(e);
457
+ return next();
458
+ });
459
+ } else s |= 1;
460
+ } catch (e) {
461
+ fail(e);
323
462
  }
324
463
  }
464
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
465
+ if (env2.hasError) throw env2.error;
325
466
  }
326
- };
327
- QueryAST.visit(query, visitor);
328
- return [
329
- ...spaces
330
- ];
331
- };
332
-
333
- // src/internal/queue-service-impl.ts
334
- import { NotImplementedError as NotImplementedError3, RuntimeServiceError as RuntimeServiceError3 } from "@dxos/errors";
467
+ return next();
468
+ })(env);
469
+ }
335
470
  var QueueServiceImpl = class {
336
471
  _ctx;
337
472
  _queueService;
@@ -339,13 +474,58 @@ var QueueServiceImpl = class {
339
474
  this._ctx = _ctx;
340
475
  this._queueService = _queueService;
341
476
  }
342
- async queryQueue(subspaceTag, spaceId, { queueId, ...query }) {
477
+ async queryQueue(request) {
343
478
  try {
344
- const result = await this._queueService.query(this._ctx, `dxn:queue:${subspaceTag}:${spaceId}:${queueId}`, query);
345
- return result;
479
+ const env = {
480
+ stack: [],
481
+ error: void 0,
482
+ hasError: false
483
+ };
484
+ try {
485
+ const result = _ts_add_disposable_resource3(env, await this._queueService.queryQueue(this._ctx, request), false);
486
+ return {
487
+ objects: structuredClone(result.objects),
488
+ nextCursor: result.nextCursor,
489
+ prevCursor: result.prevCursor
490
+ };
491
+ } catch (e) {
492
+ env.error = e;
493
+ env.hasError = true;
494
+ } finally {
495
+ _ts_dispose_resources3(env);
496
+ }
346
497
  } catch (error) {
498
+ const { query } = request;
347
499
  throw RuntimeServiceError3.wrap({
348
500
  message: "Queue query failed.",
501
+ context: {
502
+ subspaceTag: query?.queuesNamespace,
503
+ spaceId: query?.spaceId,
504
+ queueId: query?.queueIds?.[0]
505
+ },
506
+ ifTypeDiffers: true
507
+ })(error);
508
+ }
509
+ }
510
+ async insertIntoQueue(request) {
511
+ try {
512
+ const env = {
513
+ stack: [],
514
+ error: void 0,
515
+ hasError: false
516
+ };
517
+ try {
518
+ const _ = _ts_add_disposable_resource3(env, await this._queueService.insertIntoQueue(this._ctx, request), false);
519
+ } catch (e) {
520
+ env.error = e;
521
+ env.hasError = true;
522
+ } finally {
523
+ _ts_dispose_resources3(env);
524
+ }
525
+ } catch (error) {
526
+ const { subspaceTag, spaceId, queueId } = request;
527
+ throw RuntimeServiceError3.wrap({
528
+ message: "Queue append failed.",
349
529
  context: {
350
530
  subspaceTag,
351
531
  spaceId,
@@ -355,13 +535,25 @@ var QueueServiceImpl = class {
355
535
  })(error);
356
536
  }
357
537
  }
358
- async insertIntoQueue(subspaceTag, spaceId, queueId, objects) {
538
+ async deleteFromQueue(request) {
359
539
  try {
360
- const result = await this._queueService.append(this._ctx, `dxn:queue:${subspaceTag}:${spaceId}:${queueId}`, objects);
361
- return result;
540
+ const env = {
541
+ stack: [],
542
+ error: void 0,
543
+ hasError: false
544
+ };
545
+ try {
546
+ const _ = _ts_add_disposable_resource3(env, await this._queueService.deleteFromQueue(this._ctx, request), false);
547
+ } catch (e) {
548
+ env.error = e;
549
+ env.hasError = true;
550
+ } finally {
551
+ _ts_dispose_resources3(env);
552
+ }
362
553
  } catch (error) {
554
+ const { subspaceTag, spaceId, queueId } = request;
363
555
  throw RuntimeServiceError3.wrap({
364
- message: "Queue append failed.",
556
+ message: "Queue delete failed.",
365
557
  context: {
366
558
  subspaceTag,
367
559
  spaceId,
@@ -371,30 +563,105 @@ var QueueServiceImpl = class {
371
563
  })(error);
372
564
  }
373
565
  }
374
- deleteFromQueue(subspaceTag, spaceId, queueId, _objectIds) {
375
- throw new NotImplementedError3({
376
- message: "Deleting from queue is not supported.",
377
- context: {
378
- subspaceTag,
379
- spaceId,
380
- queueId
381
- }
382
- });
566
+ async syncQueue(_) {
383
567
  }
384
568
  };
385
569
 
386
570
  // src/internal/service-container.ts
571
+ function _ts_add_disposable_resource4(env, value, async) {
572
+ if (value !== null && value !== void 0) {
573
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
574
+ var dispose, inner;
575
+ if (async) {
576
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
577
+ dispose = value[Symbol.asyncDispose];
578
+ }
579
+ if (dispose === void 0) {
580
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
581
+ dispose = value[Symbol.dispose];
582
+ if (async) inner = dispose;
583
+ }
584
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
585
+ if (inner) dispose = function() {
586
+ try {
587
+ inner.call(this);
588
+ } catch (e) {
589
+ return Promise.reject(e);
590
+ }
591
+ };
592
+ env.stack.push({
593
+ value,
594
+ dispose,
595
+ async
596
+ });
597
+ } else if (async) {
598
+ env.stack.push({
599
+ async: true
600
+ });
601
+ }
602
+ return value;
603
+ }
604
+ function _ts_dispose_resources4(env) {
605
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
606
+ var e = new Error(message);
607
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
608
+ };
609
+ return (_ts_dispose_resources4 = function _ts_dispose_resources5(env2) {
610
+ function fail(e) {
611
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
612
+ env2.hasError = true;
613
+ }
614
+ var r, s = 0;
615
+ function next() {
616
+ while (r = env2.stack.pop()) {
617
+ try {
618
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
619
+ if (r.dispose) {
620
+ var result = r.dispose.call(r.value);
621
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
622
+ fail(e);
623
+ return next();
624
+ });
625
+ } else s |= 1;
626
+ } catch (e) {
627
+ fail(e);
628
+ }
629
+ }
630
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
631
+ if (env2.hasError) throw env2.error;
632
+ }
633
+ return next();
634
+ })(env);
635
+ }
387
636
  var ServiceContainer = class {
388
637
  _executionContext;
389
638
  _dataService;
390
639
  _queueService;
391
- constructor(_executionContext, _dataService, _queueService) {
640
+ _functionsService;
641
+ constructor(_executionContext, _dataService, _queueService, _functionsService) {
392
642
  this._executionContext = _executionContext;
393
643
  this._dataService = _dataService;
394
644
  this._queueService = _queueService;
645
+ this._functionsService = _functionsService;
395
646
  }
396
647
  async getSpaceMeta(spaceId) {
397
- return this._dataService.getSpaceMeta(this._executionContext, spaceId);
648
+ const env = {
649
+ stack: [],
650
+ error: void 0,
651
+ hasError: false
652
+ };
653
+ try {
654
+ const result = _ts_add_disposable_resource4(env, await this._dataService.getSpaceMeta(this._executionContext, spaceId), false);
655
+ return result ? {
656
+ spaceKey: result.spaceKey,
657
+ rootDocumentId: result.rootDocumentId
658
+ } : void 0;
659
+ } catch (e) {
660
+ env.error = e;
661
+ env.hasError = true;
662
+ } finally {
663
+ _ts_dispose_resources4(env);
664
+ }
398
665
  }
399
666
  async createServices() {
400
667
  const dataService = new DataServiceImpl(this._executionContext, this._dataService);
@@ -403,21 +670,50 @@ var ServiceContainer = class {
403
670
  return {
404
671
  dataService,
405
672
  queryService,
406
- queueService
673
+ queueService,
674
+ functionsAiService: this._functionsService
407
675
  };
408
676
  }
409
- queryQueue(queue) {
410
- return this._queueService.query({}, queue.toString(), {});
677
+ async queryQueue(queue) {
678
+ const parts = queue.asQueueDXN();
679
+ if (!parts) {
680
+ throw new Error("Invalid queue DXN");
681
+ }
682
+ const { subspaceTag, spaceId, queueId } = parts;
683
+ const result = await this._queueService.queryQueue(this._executionContext, {
684
+ query: {
685
+ spaceId,
686
+ queuesNamespace: subspaceTag,
687
+ queueIds: [
688
+ queueId
689
+ ]
690
+ }
691
+ });
692
+ return {
693
+ objects: structuredClone(result.objects),
694
+ nextCursor: result.nextCursor ?? null,
695
+ prevCursor: result.prevCursor ?? null
696
+ };
411
697
  }
412
- insertIntoQueue(queue, objects) {
413
- return this._queueService.append({}, queue.toString(), objects);
698
+ async insertIntoQueue(queue, objects) {
699
+ const parts = queue.asQueueDXN();
700
+ if (!parts) {
701
+ throw new Error("Invalid queue DXN");
702
+ }
703
+ const { subspaceTag, spaceId, queueId } = parts;
704
+ await this._queueService.insertIntoQueue(this._executionContext, {
705
+ subspaceTag,
706
+ spaceId,
707
+ queueId,
708
+ objects
709
+ });
414
710
  }
415
711
  };
416
712
 
417
713
  // src/space-proxy.ts
418
714
  import { Resource } from "@dxos/context";
419
- import { invariant as invariant4 } from "@dxos/invariant";
420
- import { PublicKey as PublicKey2 } from "@dxos/keys";
715
+ import { invariant as invariant2 } from "@dxos/invariant";
716
+ import { PublicKey } from "@dxos/keys";
421
717
 
422
718
  // src/queues-api.ts
423
719
  var QueuesAPIImpl = class {
@@ -436,7 +732,7 @@ var QueuesAPIImpl = class {
436
732
  };
437
733
 
438
734
  // src/space-proxy.ts
439
- var __dxlog_file4 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/space-proxy.ts";
735
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/space-proxy.ts";
440
736
  var SpaceProxy = class extends Resource {
441
737
  _serviceContainer;
442
738
  _echoClient;
@@ -451,9 +747,9 @@ var SpaceProxy = class extends Resource {
451
747
  return this._id;
452
748
  }
453
749
  get db() {
454
- invariant4(this._db, void 0, {
455
- F: __dxlog_file4,
456
- L: 34,
750
+ invariant2(this._db, void 0, {
751
+ F: __dxlog_file3,
752
+ L: 35,
457
753
  S: this,
458
754
  A: [
459
755
  "this._db",
@@ -466,9 +762,9 @@ var SpaceProxy = class extends Resource {
466
762
  * @deprecated Use db API.
467
763
  */
468
764
  get crud() {
469
- invariant4(this._db, void 0, {
470
- F: __dxlog_file4,
471
- L: 42,
765
+ invariant2(this._db, void 0, {
766
+ F: __dxlog_file3,
767
+ L: 43,
472
768
  S: this,
473
769
  A: [
474
770
  "this._db",
@@ -487,7 +783,7 @@ var SpaceProxy = class extends Resource {
487
783
  }
488
784
  this._db = this._echoClient.constructDatabase({
489
785
  spaceId: this._id,
490
- spaceKey: PublicKey2.from(meta.spaceKey),
786
+ spaceKey: PublicKey.from(meta.spaceKey),
491
787
  reactiveSchemaQuery: false,
492
788
  owningObject: this
493
789
  });
@@ -498,7 +794,7 @@ var SpaceProxy = class extends Resource {
498
794
  };
499
795
 
500
796
  // src/functions-client.ts
501
- var __dxlog_file5 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/functions-client.ts";
797
+ var __dxlog_file4 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/functions-client.ts";
502
798
  var FunctionsClient = class extends Resource2 {
503
799
  _serviceContainer;
504
800
  _echoClient;
@@ -506,25 +802,25 @@ var FunctionsClient = class extends Resource2 {
506
802
  _spaces = /* @__PURE__ */ new Map();
507
803
  constructor(services) {
508
804
  super();
509
- invariant5(typeof services.dataService !== "undefined", "DataService is required", {
510
- F: __dxlog_file5,
511
- L: 32,
805
+ invariant3(typeof services.dataService !== "undefined", "DataService is required", {
806
+ F: __dxlog_file4,
807
+ L: 33,
512
808
  S: this,
513
809
  A: [
514
810
  "typeof services.dataService !== 'undefined'",
515
811
  "'DataService is required'"
516
812
  ]
517
813
  });
518
- invariant5(typeof services.queueService !== "undefined", "QueueService is required", {
519
- F: __dxlog_file5,
520
- L: 33,
814
+ invariant3(typeof services.queueService !== "undefined", "QueueService is required", {
815
+ F: __dxlog_file4,
816
+ L: 34,
521
817
  S: this,
522
818
  A: [
523
819
  "typeof services.queueService !== 'undefined'",
524
820
  "'QueueService is required'"
525
821
  ]
526
822
  });
527
- this._serviceContainer = new ServiceContainer(this._executionContext, services.dataService, services.queueService);
823
+ this._serviceContainer = new ServiceContainer(this._executionContext, services.dataService, services.queueService, services.functionsAiService);
528
824
  this._echoClient = new EchoClient({});
529
825
  }
530
826
  get echo() {
@@ -558,7 +854,8 @@ var FunctionsClient = class extends Resource2 {
558
854
  var createClientFromEnv = async (env) => {
559
855
  const client = new FunctionsClient({
560
856
  dataService: env.DATA_SERVICE,
561
- queueService: env.QUEUE_SERVICE
857
+ queueService: env.QUEUE_SERVICE,
858
+ functionsAiService: env.FUNCTIONS_AI_SERVICE
562
859
  });
563
860
  await client.open();
564
861
  return client;
@@ -572,34 +869,26 @@ var FunctionRouteValue = /* @__PURE__ */ (function(FunctionRouteValue2) {
572
869
  })({});
573
870
 
574
871
  // src/wrap-handler-for-cloudflare.ts
575
- import { invariant as invariant6 } from "@dxos/invariant";
576
- import { SpaceId as SpaceId4 } from "@dxos/keys";
872
+ import { invariant as invariant4 } from "@dxos/invariant";
873
+ import { SpaceId as SpaceId2 } from "@dxos/keys";
577
874
  import { log as log3 } from "@dxos/log";
578
875
  import { EdgeResponse } from "@dxos/protocols";
579
- var __dxlog_file6 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/wrap-handler-for-cloudflare.ts";
876
+ var __dxlog_file5 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/wrap-handler-for-cloudflare.ts";
580
877
  var wrapHandlerForCloudflare = (func) => {
581
878
  return async (request, env) => {
582
879
  if (request.headers.get(FUNCTION_ROUTE_HEADER) === FunctionRouteValue.Meta) {
583
- log3.info(">>> meta", {
584
- func
585
- }, {
586
- F: __dxlog_file6,
587
- L: 25,
588
- S: void 0,
589
- C: (f, a) => f(...a)
590
- });
591
880
  return handleFunctionMetaCall(func, request);
592
881
  }
593
882
  try {
594
883
  const spaceId = new URL(request.url).searchParams.get("spaceId");
595
884
  if (spaceId) {
596
- if (!SpaceId4.isValid(spaceId)) {
885
+ if (!SpaceId2.isValid(spaceId)) {
597
886
  return new Response("Invalid spaceId", {
598
887
  status: 400
599
888
  });
600
889
  }
601
890
  }
602
- const serviceContainer = new ServiceContainer({}, env.DATA_SERVICE, env.QUEUE_SERVICE);
891
+ const serviceContainer = new ServiceContainer({}, env.DATA_SERVICE, env.QUEUE_SERVICE, env.FUNCTIONS_AI_SERVICE);
603
892
  const context = await createFunctionContext({
604
893
  serviceContainer,
605
894
  contextSpaceId: spaceId
@@ -610,8 +899,8 @@ var wrapHandlerForCloudflare = (func) => {
610
899
  error,
611
900
  stack: error.stack
612
901
  }, {
613
- F: __dxlog_file6,
614
- L: 45,
902
+ F: __dxlog_file5,
903
+ L: 44,
615
904
  S: void 0,
616
905
  C: (f, a) => f(...a)
617
906
  });
@@ -648,8 +937,8 @@ var decodeRequest = async (request) => {
648
937
  };
649
938
  } catch (err) {
650
939
  log3.catch(err, void 0, {
651
- F: __dxlog_file6,
652
- L: 80,
940
+ F: __dxlog_file5,
941
+ L: 79,
653
942
  S: void 0,
654
943
  C: (f, a) => f(...a)
655
944
  });
@@ -676,7 +965,7 @@ var handleFunctionMetaCall = (functionDefinition, request) => {
676
965
  });
677
966
  };
678
967
  var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
679
- const { dataService, queryService, queueService } = await serviceContainer.createServices();
968
+ const { dataService, queryService, queueService, functionsAiService } = await serviceContainer.createServices();
680
969
  let spaceKey;
681
970
  let rootUrl;
682
971
  if (contextSpaceId) {
@@ -685,9 +974,9 @@ var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
685
974
  throw new Error(`Space not found: ${contextSpaceId}`);
686
975
  }
687
976
  spaceKey = meta.spaceKey;
688
- invariant6(!meta.rootDocumentId.startsWith("automerge:"), void 0, {
689
- F: __dxlog_file6,
690
- L: 118,
977
+ invariant4(!meta.rootDocumentId.startsWith("automerge:"), void 0, {
978
+ F: __dxlog_file5,
979
+ L: 117,
691
980
  S: void 0,
692
981
  A: [
693
982
  "!meta.rootDocumentId.startsWith('automerge:')",
@@ -700,7 +989,8 @@ var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
700
989
  services: {
701
990
  dataService,
702
991
  queryService,
703
- queueService
992
+ queueService,
993
+ functionsAiService
704
994
  },
705
995
  spaceId: contextSpaceId,
706
996
  spaceKey,