@dxos/functions-runtime-cloudflare 0.8.4-main.7ace549 → 0.8.4-main.937b3ca

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 (40) hide show
  1. package/dist/lib/browser/index.mjs +628 -128
  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 +628 -128
  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/index.d.ts +1 -0
  10. package/dist/types/src/index.d.ts.map +1 -1
  11. package/dist/types/src/internal/data-service-impl.d.ts +7 -6
  12. package/dist/types/src/internal/data-service-impl.d.ts.map +1 -1
  13. package/dist/types/src/internal/query-service-impl.d.ts +1 -0
  14. package/dist/types/src/internal/query-service-impl.d.ts.map +1 -1
  15. package/dist/types/src/internal/queue-service-impl.d.ts +4 -5
  16. package/dist/types/src/internal/queue-service-impl.d.ts.map +1 -1
  17. package/dist/types/src/internal/service-container.d.ts +5 -3
  18. package/dist/types/src/internal/service-container.d.ts.map +1 -1
  19. package/dist/types/src/internal/utils.d.ts +2 -0
  20. package/dist/types/src/internal/utils.d.ts.map +1 -0
  21. package/dist/types/src/logger.d.ts +2 -0
  22. package/dist/types/src/logger.d.ts.map +1 -0
  23. package/dist/types/src/queues-api.d.ts +3 -3
  24. package/dist/types/src/queues-api.d.ts.map +1 -1
  25. package/dist/types/src/space-proxy.d.ts +3 -2
  26. package/dist/types/src/space-proxy.d.ts.map +1 -1
  27. package/dist/types/src/wrap-handler-for-cloudflare.d.ts.map +1 -1
  28. package/dist/types/tsconfig.tsbuildinfo +1 -1
  29. package/package.json +20 -15
  30. package/src/functions-client.ts +8 -1
  31. package/src/index.ts +1 -0
  32. package/src/internal/data-service-impl.ts +66 -17
  33. package/src/internal/query-service-impl.ts +24 -8
  34. package/src/internal/queue-service-impl.ts +54 -8
  35. package/src/internal/service-container.ts +25 -6
  36. package/src/internal/utils.ts +5 -0
  37. package/src/logger.ts +42 -0
  38. package/src/queues-api.ts +3 -3
  39. package/src/space-proxy.ts +4 -3
  40. package/src/wrap-handler-for-cloudflare.ts +3 -3
@@ -3,14 +3,85 @@ 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 invariant6 } from "@dxos/invariant";
7
7
 
8
8
  // src/internal/data-service-impl.ts
9
9
  import { Stream } from "@dxos/codec-protobuf/stream";
10
10
  import { raise } from "@dxos/debug";
11
+ import { NotImplementedError, RuntimeServiceError } from "@dxos/errors";
11
12
  import { invariant } from "@dxos/invariant";
12
13
  import { SpaceId } from "@dxos/keys";
13
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
+ }
14
85
  var __dxlog_file = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/data-service-impl.ts";
15
86
  var DataServiceImpl = class {
16
87
  _executionContext;
@@ -24,7 +95,7 @@ var DataServiceImpl = class {
24
95
  return new Stream(({ next }) => {
25
96
  invariant(SpaceId.isValid(spaceId), void 0, {
26
97
  F: __dxlog_file,
27
- L: 34,
98
+ L: 39,
28
99
  S: this,
29
100
  A: [
30
101
  "SpaceId.isValid(spaceId)",
@@ -40,74 +111,141 @@ var DataServiceImpl = class {
40
111
  };
41
112
  });
42
113
  }
43
- async updateSubscription({ subscriptionId, addIds, removeIds }) {
44
- const sub = this.dataSubscriptions.get(subscriptionId) ?? raise(new Error("Subscription not found"));
114
+ async updateSubscription({ subscriptionId, addIds }) {
115
+ const sub = this.dataSubscriptions.get(subscriptionId) ?? raise(new RuntimeServiceError({
116
+ message: "Subscription not found.",
117
+ context: {
118
+ subscriptionId
119
+ }
120
+ }));
45
121
  if (addIds) {
46
122
  log.info("request documents", {
47
123
  count: addIds.length
48
124
  }, {
49
125
  F: __dxlog_file,
50
- L: 47,
126
+ L: 59,
51
127
  S: this,
52
128
  C: (f, a) => f(...a)
53
129
  });
54
130
  for (const documentId of addIds) {
55
- const document = await this._dataService.getDocument(this._executionContext, sub.spaceId, documentId);
56
- log.info("document loaded", {
57
- documentId,
58
- spaceId: sub.spaceId,
59
- found: !!document
60
- }, {
61
- F: __dxlog_file,
62
- L: 51,
63
- S: this,
64
- C: (f, a) => f(...a)
65
- });
66
- if (!document) {
67
- log.warn("not found", {
68
- 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
69
142
  }, {
70
143
  F: __dxlog_file,
71
- L: 53,
144
+ L: 63,
72
145
  S: this,
73
146
  C: (f, a) => f(...a)
74
147
  });
75
- 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);
76
174
  }
77
- sub.next({
78
- updates: [
79
- {
80
- documentId,
81
- mutation: document.data
82
- }
83
- ]
84
- });
85
175
  }
86
176
  }
87
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
+ }
88
199
  async update({ updates, subscriptionId }) {
89
- const sub = this.dataSubscriptions.get(subscriptionId) ?? raise(new Error("Subscription not found"));
90
- for (const update of updates ?? []) {
91
- await this._dataService.changeDocument(this._executionContext, sub.spaceId, update.documentId, update.mutation);
200
+ const sub = this.dataSubscriptions.get(subscriptionId) ?? raise(new RuntimeServiceError({
201
+ message: "Subscription not found.",
202
+ context: {
203
+ subscriptionId
204
+ }
205
+ }));
206
+ try {
207
+ for (const update of updates ?? []) {
208
+ await this._dataService.changeDocument(this._executionContext, sub.spaceId, update.documentId, update.mutation);
209
+ }
210
+ } catch (error) {
211
+ throw RuntimeServiceError.wrap({
212
+ message: "Failed to apply document updates.",
213
+ context: {
214
+ subscriptionId
215
+ },
216
+ ifTypeDiffers: true
217
+ })(error);
92
218
  }
93
- throw new Error("Method not implemented.");
94
219
  }
95
220
  async flush() {
96
221
  }
97
- subscribeSpaceSyncState(request, options) {
98
- throw new Error("Method not implemented.");
222
+ subscribeSpaceSyncState(_request, _options) {
223
+ throw new NotImplementedError({
224
+ message: "subscribeSpaceSyncState is not implemented."
225
+ });
99
226
  }
100
- async getDocumentHeads({ documentIds }) {
101
- throw new Error("Method not implemented.");
227
+ async getDocumentHeads({ documentIds: _documentIds }) {
228
+ throw new NotImplementedError({
229
+ message: "getDocumentHeads is not implemented."
230
+ });
102
231
  }
103
- async reIndexHeads({ documentIds }) {
104
- throw new Error("Method not implemented.");
232
+ async reIndexHeads({ documentIds: _documentIds }) {
233
+ throw new NotImplementedError({
234
+ message: "reIndexHeads is not implemented."
235
+ });
105
236
  }
106
237
  async updateIndexes() {
107
- throw new Error("Method 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)
243
+ });
108
244
  }
109
- async waitUntilHeadsReplicated({ heads }) {
110
- throw new Error("Method not implemented.");
245
+ async waitUntilHeadsReplicated({ heads: _heads }) {
246
+ throw new NotImplementedError({
247
+ message: "waitUntilHeadsReplicated is not implemented."
248
+ });
111
249
  }
112
250
  };
113
251
 
@@ -115,6 +253,7 @@ var DataServiceImpl = class {
115
253
  import * as Schema from "effect/Schema";
116
254
  import { Stream as Stream2 } from "@dxos/codec-protobuf/stream";
117
255
  import { QueryAST } from "@dxos/echo-protocol";
256
+ import { NotImplementedError as NotImplementedError2, RuntimeServiceError as RuntimeServiceError2 } from "@dxos/errors";
118
257
  import { invariant as invariant3 } from "@dxos/invariant";
119
258
  import { PublicKey } from "@dxos/keys";
120
259
  import { SpaceId as SpaceId3 } from "@dxos/keys";
@@ -188,10 +327,76 @@ var isSimpleSelectionQuery = (query) => {
188
327
  };
189
328
 
190
329
  // src/internal/query-service-impl.ts
330
+ function _ts_add_disposable_resource2(env, value, async) {
331
+ if (value !== null && value !== void 0) {
332
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
333
+ var dispose, inner;
334
+ if (async) {
335
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
336
+ dispose = value[Symbol.asyncDispose];
337
+ }
338
+ if (dispose === void 0) {
339
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
340
+ dispose = value[Symbol.dispose];
341
+ if (async) inner = dispose;
342
+ }
343
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
344
+ if (inner) dispose = function() {
345
+ try {
346
+ inner.call(this);
347
+ } catch (e) {
348
+ return Promise.reject(e);
349
+ }
350
+ };
351
+ env.stack.push({
352
+ value,
353
+ dispose,
354
+ async
355
+ });
356
+ } else if (async) {
357
+ env.stack.push({
358
+ async: true
359
+ });
360
+ }
361
+ return value;
362
+ }
363
+ function _ts_dispose_resources2(env) {
364
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
365
+ var e = new Error(message);
366
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
367
+ };
368
+ return (_ts_dispose_resources2 = function _ts_dispose_resources5(env2) {
369
+ function fail(e) {
370
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
371
+ env2.hasError = true;
372
+ }
373
+ var r, s = 0;
374
+ function next() {
375
+ while (r = env2.stack.pop()) {
376
+ try {
377
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
378
+ if (r.dispose) {
379
+ var result = r.dispose.call(r.value);
380
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
381
+ fail(e);
382
+ return next();
383
+ });
384
+ } else s |= 1;
385
+ } catch (e) {
386
+ fail(e);
387
+ }
388
+ }
389
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
390
+ if (env2.hasError) throw env2.error;
391
+ }
392
+ return next();
393
+ })(env);
394
+ }
191
395
  var __dxlog_file3 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/query-service-impl.ts";
192
396
  var QueryServiceImpl = class {
193
397
  _executionContext;
194
398
  _dataService;
399
+ _queryCount = 0;
195
400
  constructor(_executionContext, _dataService) {
196
401
  this._executionContext = _executionContext;
197
402
  this._dataService = _dataService;
@@ -201,7 +406,7 @@ var QueryServiceImpl = class {
201
406
  request
202
407
  }, {
203
408
  F: __dxlog_file3,
204
- L: 30,
409
+ L: 34,
205
410
  S: this,
206
411
  C: (f, a) => f(...a)
207
412
  });
@@ -209,7 +414,7 @@ var QueryServiceImpl = class {
209
414
  const requestedSpaceIds = getTargetSpacesForQuery(query);
210
415
  invariant3(requestedSpaceIds.length === 1, "Only one space is supported", {
211
416
  F: __dxlog_file3,
212
- L: 33,
417
+ L: 37,
213
418
  S: this,
214
419
  A: [
215
420
  "requestedSpaceIds.length === 1",
@@ -219,53 +424,81 @@ var QueryServiceImpl = class {
219
424
  const spaceId = requestedSpaceIds[0];
220
425
  return Stream2.fromPromise((async () => {
221
426
  try {
222
- log2.info("begin query", {
223
- spaceId
224
- }, {
225
- F: __dxlog_file3,
226
- L: 39,
227
- S: this,
228
- C: (f, a) => f(...a)
229
- });
230
- const queryResponse = await this._dataService.queryDocuments(this._executionContext, queryToDataServiceRequest(query));
231
- log2.info("query response", {
232
- spaceId,
233
- filter: request.filter,
234
- resultCount: queryResponse.results.length
235
- }, {
236
- F: __dxlog_file3,
237
- L: 44,
238
- S: this,
239
- C: (f, a) => f(...a)
240
- });
241
- return {
242
- results: queryResponse.results.map((object) => ({
243
- id: object.objectId,
244
- spaceId,
245
- spaceKey: PublicKey.ZERO,
246
- documentId: object.document.documentId,
247
- rank: 0,
248
- documentAutomerge: object.document.data
249
- }))
427
+ const env = {
428
+ stack: [],
429
+ error: void 0,
430
+ hasError: false
250
431
  };
251
- } catch (err) {
432
+ try {
433
+ this._queryCount++;
434
+ log2.info("begin query", {
435
+ spaceId
436
+ }, {
437
+ F: __dxlog_file3,
438
+ L: 44,
439
+ S: this,
440
+ C: (f, a) => f(...a)
441
+ });
442
+ const queryResponse = _ts_add_disposable_resource2(env, await this._dataService.queryDocuments(this._executionContext, queryToDataServiceRequest(query)), false);
443
+ log2.info("query response", {
444
+ spaceId,
445
+ filter: request.filter,
446
+ resultCount: queryResponse.results.length
447
+ }, {
448
+ F: __dxlog_file3,
449
+ L: 49,
450
+ S: this,
451
+ C: (f, a) => f(...a)
452
+ });
453
+ return {
454
+ results: queryResponse.results.map((object) => ({
455
+ id: object.objectId,
456
+ spaceId,
457
+ spaceKey: PublicKey.ZERO,
458
+ documentId: object.document.documentId,
459
+ // Rank 1 for predicate matches where ranking is not determined.
460
+ rank: 1,
461
+ // Copy returned object to avoid hanging RPC stub.
462
+ // See https://developers.cloudflare.com/workers/runtime-apis/rpc/lifecycle/
463
+ documentAutomerge: copyUint8Array(object.document.data)
464
+ }))
465
+ };
466
+ } catch (e) {
467
+ env.error = e;
468
+ env.hasError = true;
469
+ } finally {
470
+ _ts_dispose_resources2(env);
471
+ }
472
+ } catch (error) {
252
473
  log2.error("query failed", {
253
- err
474
+ err: error
254
475
  }, {
255
476
  F: __dxlog_file3,
256
- L: 58,
477
+ L: 66,
257
478
  S: this,
258
479
  C: (f, a) => f(...a)
259
480
  });
260
- throw err;
481
+ throw new RuntimeServiceError2({
482
+ message: `Query execution failed (queryCount=${this._queryCount})`,
483
+ context: {
484
+ spaceId,
485
+ filter: request.filter,
486
+ queryCount: this._queryCount
487
+ },
488
+ cause: error
489
+ });
261
490
  }
262
491
  })());
263
492
  }
264
493
  async reindex() {
265
- throw new Error("Method not implemented.");
494
+ throw new NotImplementedError2({
495
+ message: "Reindex is not implemented."
496
+ });
266
497
  }
267
498
  async setConfig() {
268
- throw new Error("Method not implemented.");
499
+ throw new NotImplementedError2({
500
+ message: "SetConfig is not implemented."
501
+ });
269
502
  }
270
503
  };
271
504
  var getTargetSpacesForQuery = (query) => {
@@ -286,6 +519,74 @@ var getTargetSpacesForQuery = (query) => {
286
519
  };
287
520
 
288
521
  // src/internal/queue-service-impl.ts
522
+ import { NotImplementedError as NotImplementedError3, RuntimeServiceError as RuntimeServiceError3 } from "@dxos/errors";
523
+ import { invariant as invariant4 } from "@dxos/invariant";
524
+ function _ts_add_disposable_resource3(env, value, async) {
525
+ if (value !== null && value !== void 0) {
526
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
527
+ var dispose, inner;
528
+ if (async) {
529
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
530
+ dispose = value[Symbol.asyncDispose];
531
+ }
532
+ if (dispose === void 0) {
533
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
534
+ dispose = value[Symbol.dispose];
535
+ if (async) inner = dispose;
536
+ }
537
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
538
+ if (inner) dispose = function() {
539
+ try {
540
+ inner.call(this);
541
+ } catch (e) {
542
+ return Promise.reject(e);
543
+ }
544
+ };
545
+ env.stack.push({
546
+ value,
547
+ dispose,
548
+ async
549
+ });
550
+ } else if (async) {
551
+ env.stack.push({
552
+ async: true
553
+ });
554
+ }
555
+ return value;
556
+ }
557
+ function _ts_dispose_resources3(env) {
558
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
559
+ var e = new Error(message);
560
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
561
+ };
562
+ return (_ts_dispose_resources3 = function _ts_dispose_resources5(env2) {
563
+ function fail(e) {
564
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
565
+ env2.hasError = true;
566
+ }
567
+ var r, s = 0;
568
+ function next() {
569
+ while (r = env2.stack.pop()) {
570
+ try {
571
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
572
+ if (r.dispose) {
573
+ var result = r.dispose.call(r.value);
574
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
575
+ fail(e);
576
+ return next();
577
+ });
578
+ } else s |= 1;
579
+ } catch (e) {
580
+ fail(e);
581
+ }
582
+ }
583
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
584
+ if (env2.hasError) throw env2.error;
585
+ }
586
+ return next();
587
+ })(env);
588
+ }
589
+ var __dxlog_file4 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/internal/queue-service-impl.ts";
289
590
  var QueueServiceImpl = class {
290
591
  _ctx;
291
592
  _queueService;
@@ -293,29 +594,177 @@ var QueueServiceImpl = class {
293
594
  this._ctx = _ctx;
294
595
  this._queueService = _queueService;
295
596
  }
296
- queryQueue(subspaceTag, spaceId, { queueId, ...query }) {
297
- return this._queueService.query(this._ctx, `dxn:queue:${subspaceTag}:${spaceId}:${queueId}`, query);
597
+ async queryQueue(request) {
598
+ const { query } = request;
599
+ const { queueIds, ...filter } = query;
600
+ const spaceId = query.spaceId;
601
+ const queueId = queueIds?.[0];
602
+ invariant4(request.query.queuesNamespace, void 0, {
603
+ F: __dxlog_file4,
604
+ L: 26,
605
+ S: this,
606
+ A: [
607
+ "request.query.queuesNamespace",
608
+ ""
609
+ ]
610
+ });
611
+ try {
612
+ const env = {
613
+ stack: [],
614
+ error: void 0,
615
+ hasError: false
616
+ };
617
+ try {
618
+ const result = _ts_add_disposable_resource3(env, await this._queueService.query(this._ctx, `dxn:queue:${request.query.queuesNamespace}:${spaceId}:${queueId}`, filter), false);
619
+ return {
620
+ // Copy returned object to avoid hanging RPC stub
621
+ // See https://developers.cloudflare.com/workers/runtime-apis/rpc/lifecycle/
622
+ objects: structuredClone(result.objects),
623
+ nextCursor: result.nextCursor,
624
+ prevCursor: result.prevCursor
625
+ };
626
+ } catch (e) {
627
+ env.error = e;
628
+ env.hasError = true;
629
+ } finally {
630
+ _ts_dispose_resources3(env);
631
+ }
632
+ } catch (error) {
633
+ throw RuntimeServiceError3.wrap({
634
+ message: "Queue query failed.",
635
+ context: {
636
+ subspaceTag: request.query.queuesNamespace,
637
+ spaceId,
638
+ queueId
639
+ },
640
+ ifTypeDiffers: true
641
+ })(error);
642
+ }
298
643
  }
299
- insertIntoQueue(subspaceTag, spaceId, queueId, objects) {
300
- return this._queueService.append(this._ctx, `dxn:queue:${subspaceTag}:${spaceId}:${queueId}`, objects);
644
+ async insertIntoQueue(request) {
645
+ const { subspaceTag, spaceId, queueId, objects } = request;
646
+ try {
647
+ await this._queueService.append(this._ctx, `dxn:queue:${subspaceTag}:${spaceId}:${queueId}`, objects ?? []);
648
+ } catch (error) {
649
+ throw RuntimeServiceError3.wrap({
650
+ message: "Queue append failed.",
651
+ context: {
652
+ subspaceTag,
653
+ spaceId,
654
+ queueId
655
+ },
656
+ ifTypeDiffers: true
657
+ })(error);
658
+ }
301
659
  }
302
- deleteFromQueue(subspaceTag, spaceId, queueId, objectIds) {
303
- throw new Error("Deleting from queue is not supported.");
660
+ deleteFromQueue(request) {
661
+ const { subspaceTag, spaceId, queueId } = request;
662
+ throw new NotImplementedError3({
663
+ message: "Deleting from queue is not supported.",
664
+ context: {
665
+ subspaceTag,
666
+ spaceId,
667
+ queueId
668
+ }
669
+ });
304
670
  }
305
671
  };
306
672
 
307
673
  // src/internal/service-container.ts
674
+ function _ts_add_disposable_resource4(env, value, async) {
675
+ if (value !== null && value !== void 0) {
676
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
677
+ var dispose, inner;
678
+ if (async) {
679
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
680
+ dispose = value[Symbol.asyncDispose];
681
+ }
682
+ if (dispose === void 0) {
683
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
684
+ dispose = value[Symbol.dispose];
685
+ if (async) inner = dispose;
686
+ }
687
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
688
+ if (inner) dispose = function() {
689
+ try {
690
+ inner.call(this);
691
+ } catch (e) {
692
+ return Promise.reject(e);
693
+ }
694
+ };
695
+ env.stack.push({
696
+ value,
697
+ dispose,
698
+ async
699
+ });
700
+ } else if (async) {
701
+ env.stack.push({
702
+ async: true
703
+ });
704
+ }
705
+ return value;
706
+ }
707
+ function _ts_dispose_resources4(env) {
708
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
709
+ var e = new Error(message);
710
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
711
+ };
712
+ return (_ts_dispose_resources4 = function _ts_dispose_resources5(env2) {
713
+ function fail(e) {
714
+ env2.error = env2.hasError ? new _SuppressedError(e, env2.error, "An error was suppressed during disposal.") : e;
715
+ env2.hasError = true;
716
+ }
717
+ var r, s = 0;
718
+ function next() {
719
+ while (r = env2.stack.pop()) {
720
+ try {
721
+ if (!r.async && s === 1) return s = 0, env2.stack.push(r), Promise.resolve().then(next);
722
+ if (r.dispose) {
723
+ var result = r.dispose.call(r.value);
724
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
725
+ fail(e);
726
+ return next();
727
+ });
728
+ } else s |= 1;
729
+ } catch (e) {
730
+ fail(e);
731
+ }
732
+ }
733
+ if (s === 1) return env2.hasError ? Promise.reject(env2.error) : Promise.resolve();
734
+ if (env2.hasError) throw env2.error;
735
+ }
736
+ return next();
737
+ })(env);
738
+ }
308
739
  var ServiceContainer = class {
309
740
  _executionContext;
310
741
  _dataService;
311
742
  _queueService;
312
- constructor(_executionContext, _dataService, _queueService) {
743
+ _functionsService;
744
+ constructor(_executionContext, _dataService, _queueService, _functionsService) {
313
745
  this._executionContext = _executionContext;
314
746
  this._dataService = _dataService;
315
747
  this._queueService = _queueService;
748
+ this._functionsService = _functionsService;
316
749
  }
317
750
  async getSpaceMeta(spaceId) {
318
- return this._dataService.getSpaceMeta(this._executionContext, spaceId);
751
+ const env = {
752
+ stack: [],
753
+ error: void 0,
754
+ hasError: false
755
+ };
756
+ try {
757
+ const result = _ts_add_disposable_resource4(env, await this._dataService.getSpaceMeta(this._executionContext, spaceId), false);
758
+ return result ? {
759
+ spaceKey: result.spaceKey,
760
+ rootDocumentId: result.rootDocumentId
761
+ } : void 0;
762
+ } catch (e) {
763
+ env.error = e;
764
+ env.hasError = true;
765
+ } finally {
766
+ _ts_dispose_resources4(env);
767
+ }
319
768
  }
320
769
  async createServices() {
321
770
  const dataService = new DataServiceImpl(this._executionContext, this._dataService);
@@ -324,20 +773,41 @@ var ServiceContainer = class {
324
773
  return {
325
774
  dataService,
326
775
  queryService,
327
- queueService
776
+ queueService,
777
+ functionsAiService: this._functionsService
328
778
  };
329
779
  }
330
- queryQueue(queue) {
331
- return this._queueService.query({}, queue.toString(), {});
780
+ async queryQueue(queue) {
781
+ const env = {
782
+ stack: [],
783
+ error: void 0,
784
+ hasError: false
785
+ };
786
+ try {
787
+ const { spaceId } = queue.asQueueDXN() ?? {};
788
+ const result = _ts_add_disposable_resource4(env, await this._queueService.query({}, queue.toString(), {
789
+ spaceId
790
+ }), false);
791
+ return {
792
+ objects: structuredClone(result.objects),
793
+ nextCursor: result.nextCursor ?? null,
794
+ prevCursor: result.prevCursor ?? null
795
+ };
796
+ } catch (e) {
797
+ env.error = e;
798
+ env.hasError = true;
799
+ } finally {
800
+ _ts_dispose_resources4(env);
801
+ }
332
802
  }
333
- insertIntoQueue(queue, objects) {
334
- return this._queueService.append({}, queue.toString(), objects);
803
+ async insertIntoQueue(queue, objects) {
804
+ await this._queueService.append({}, queue.toString(), objects);
335
805
  }
336
806
  };
337
807
 
338
808
  // src/space-proxy.ts
339
809
  import { Resource } from "@dxos/context";
340
- import { invariant as invariant4 } from "@dxos/invariant";
810
+ import { invariant as invariant5 } from "@dxos/invariant";
341
811
  import { PublicKey as PublicKey2 } from "@dxos/keys";
342
812
 
343
813
  // src/queues-api.ts
@@ -357,7 +827,7 @@ var QueuesAPIImpl = class {
357
827
  };
358
828
 
359
829
  // src/space-proxy.ts
360
- var __dxlog_file4 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/space-proxy.ts";
830
+ var __dxlog_file5 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/space-proxy.ts";
361
831
  var SpaceProxy = class extends Resource {
362
832
  _serviceContainer;
363
833
  _echoClient;
@@ -372,9 +842,9 @@ var SpaceProxy = class extends Resource {
372
842
  return this._id;
373
843
  }
374
844
  get db() {
375
- invariant4(this._db, void 0, {
376
- F: __dxlog_file4,
377
- L: 34,
845
+ invariant5(this._db, void 0, {
846
+ F: __dxlog_file5,
847
+ L: 35,
378
848
  S: this,
379
849
  A: [
380
850
  "this._db",
@@ -387,9 +857,9 @@ var SpaceProxy = class extends Resource {
387
857
  * @deprecated Use db API.
388
858
  */
389
859
  get crud() {
390
- invariant4(this._db, void 0, {
391
- F: __dxlog_file4,
392
- L: 42,
860
+ invariant5(this._db, void 0, {
861
+ F: __dxlog_file5,
862
+ L: 43,
393
863
  S: this,
394
864
  A: [
395
865
  "this._db",
@@ -419,7 +889,7 @@ var SpaceProxy = class extends Resource {
419
889
  };
420
890
 
421
891
  // src/functions-client.ts
422
- var __dxlog_file5 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/functions-client.ts";
892
+ var __dxlog_file6 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/functions-client.ts";
423
893
  var FunctionsClient = class extends Resource2 {
424
894
  _serviceContainer;
425
895
  _echoClient;
@@ -427,25 +897,25 @@ var FunctionsClient = class extends Resource2 {
427
897
  _spaces = /* @__PURE__ */ new Map();
428
898
  constructor(services) {
429
899
  super();
430
- invariant5(typeof services.dataService !== "undefined", "DataService is required", {
431
- F: __dxlog_file5,
432
- L: 32,
900
+ invariant6(typeof services.dataService !== "undefined", "DataService is required", {
901
+ F: __dxlog_file6,
902
+ L: 33,
433
903
  S: this,
434
904
  A: [
435
905
  "typeof services.dataService !== 'undefined'",
436
906
  "'DataService is required'"
437
907
  ]
438
908
  });
439
- invariant5(typeof services.queueService !== "undefined", "QueueService is required", {
440
- F: __dxlog_file5,
441
- L: 33,
909
+ invariant6(typeof services.queueService !== "undefined", "QueueService is required", {
910
+ F: __dxlog_file6,
911
+ L: 34,
442
912
  S: this,
443
913
  A: [
444
914
  "typeof services.queueService !== 'undefined'",
445
915
  "'QueueService is required'"
446
916
  ]
447
917
  });
448
- this._serviceContainer = new ServiceContainer(this._executionContext, services.dataService, services.queueService);
918
+ this._serviceContainer = new ServiceContainer(this._executionContext, services.dataService, services.queueService, services.functionsAiService);
449
919
  this._echoClient = new EchoClient({});
450
920
  }
451
921
  get echo() {
@@ -479,7 +949,8 @@ var FunctionsClient = class extends Resource2 {
479
949
  var createClientFromEnv = async (env) => {
480
950
  const client = new FunctionsClient({
481
951
  dataService: env.DATA_SERVICE,
482
- queueService: env.QUEUE_SERVICE
952
+ queueService: env.QUEUE_SERVICE,
953
+ functionsAiService: env.FUNCTIONS_AI_SERVICE
483
954
  });
484
955
  await client.open();
485
956
  return client;
@@ -493,22 +964,14 @@ var FunctionRouteValue = /* @__PURE__ */ (function(FunctionRouteValue2) {
493
964
  })({});
494
965
 
495
966
  // src/wrap-handler-for-cloudflare.ts
496
- import { invariant as invariant6 } from "@dxos/invariant";
967
+ import { invariant as invariant7 } from "@dxos/invariant";
497
968
  import { SpaceId as SpaceId4 } from "@dxos/keys";
498
969
  import { log as log3 } from "@dxos/log";
499
970
  import { EdgeResponse } from "@dxos/protocols";
500
- var __dxlog_file6 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/wrap-handler-for-cloudflare.ts";
971
+ var __dxlog_file7 = "/__w/dxos/dxos/packages/core/functions-runtime-cloudflare/src/wrap-handler-for-cloudflare.ts";
501
972
  var wrapHandlerForCloudflare = (func) => {
502
973
  return async (request, env) => {
503
974
  if (request.headers.get(FUNCTION_ROUTE_HEADER) === FunctionRouteValue.Meta) {
504
- log3.info(">>> meta", {
505
- func
506
- }, {
507
- F: __dxlog_file6,
508
- L: 25,
509
- S: void 0,
510
- C: (f, a) => f(...a)
511
- });
512
975
  return handleFunctionMetaCall(func, request);
513
976
  }
514
977
  try {
@@ -520,7 +983,7 @@ var wrapHandlerForCloudflare = (func) => {
520
983
  });
521
984
  }
522
985
  }
523
- const serviceContainer = new ServiceContainer({}, env.DATA_SERVICE, env.QUEUE_SERVICE);
986
+ const serviceContainer = new ServiceContainer({}, env.DATA_SERVICE, env.QUEUE_SERVICE, env.FUNCTIONS_AI_SERVICE);
524
987
  const context = await createFunctionContext({
525
988
  serviceContainer,
526
989
  contextSpaceId: spaceId
@@ -531,8 +994,8 @@ var wrapHandlerForCloudflare = (func) => {
531
994
  error,
532
995
  stack: error.stack
533
996
  }, {
534
- F: __dxlog_file6,
535
- L: 45,
997
+ F: __dxlog_file7,
998
+ L: 44,
536
999
  S: void 0,
537
1000
  C: (f, a) => f(...a)
538
1001
  });
@@ -569,8 +1032,8 @@ var decodeRequest = async (request) => {
569
1032
  };
570
1033
  } catch (err) {
571
1034
  log3.catch(err, void 0, {
572
- F: __dxlog_file6,
573
- L: 80,
1035
+ F: __dxlog_file7,
1036
+ L: 79,
574
1037
  S: void 0,
575
1038
  C: (f, a) => f(...a)
576
1039
  });
@@ -597,7 +1060,7 @@ var handleFunctionMetaCall = (functionDefinition, request) => {
597
1060
  });
598
1061
  };
599
1062
  var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
600
- const { dataService, queryService, queueService } = await serviceContainer.createServices();
1063
+ const { dataService, queryService, queueService, functionsAiService } = await serviceContainer.createServices();
601
1064
  let spaceKey;
602
1065
  let rootUrl;
603
1066
  if (contextSpaceId) {
@@ -606,9 +1069,9 @@ var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
606
1069
  throw new Error(`Space not found: ${contextSpaceId}`);
607
1070
  }
608
1071
  spaceKey = meta.spaceKey;
609
- invariant6(!meta.rootDocumentId.startsWith("automerge:"), void 0, {
610
- F: __dxlog_file6,
611
- L: 118,
1072
+ invariant7(!meta.rootDocumentId.startsWith("automerge:"), void 0, {
1073
+ F: __dxlog_file7,
1074
+ L: 117,
612
1075
  S: void 0,
613
1076
  A: [
614
1077
  "!meta.rootDocumentId.startsWith('automerge:')",
@@ -621,19 +1084,56 @@ var createFunctionContext = async ({ serviceContainer, contextSpaceId }) => {
621
1084
  services: {
622
1085
  dataService,
623
1086
  queryService,
624
- queueService
1087
+ queueService,
1088
+ functionsAiService
625
1089
  },
626
1090
  spaceId: contextSpaceId,
627
1091
  spaceKey,
628
1092
  spaceRootUrl: rootUrl
629
1093
  };
630
1094
  };
1095
+
1096
+ // src/logger.ts
1097
+ import { LogLevel, log as log4, shouldLog } from "@dxos/log";
1098
+ var setupFunctionsLogger = () => {
1099
+ log4.runtimeConfig.processors.length = 0;
1100
+ log4.runtimeConfig.processors.push(functionLogProcessor);
1101
+ };
1102
+ var functionLogProcessor = (config, entry) => {
1103
+ if (!shouldLog(entry, config.filters)) {
1104
+ return;
1105
+ }
1106
+ switch (entry.level) {
1107
+ case LogLevel.DEBUG:
1108
+ console.debug(entry.message, entry.context);
1109
+ break;
1110
+ case LogLevel.TRACE:
1111
+ console.debug(entry.message, entry.context);
1112
+ break;
1113
+ case LogLevel.VERBOSE:
1114
+ console.log(entry.message, entry.context);
1115
+ break;
1116
+ case LogLevel.INFO:
1117
+ console.info(entry.message, entry.context);
1118
+ break;
1119
+ case LogLevel.WARN:
1120
+ console.warn(entry.message, entry.context);
1121
+ break;
1122
+ case LogLevel.ERROR:
1123
+ console.error(entry.message, entry.context);
1124
+ break;
1125
+ default:
1126
+ console.log(entry.message, entry.context);
1127
+ break;
1128
+ }
1129
+ };
631
1130
  export {
632
1131
  FUNCTION_ROUTE_HEADER,
633
1132
  FunctionRouteValue,
634
1133
  FunctionsClient,
635
1134
  ServiceContainer,
636
1135
  createClientFromEnv,
1136
+ setupFunctionsLogger,
637
1137
  wrapHandlerForCloudflare
638
1138
  };
639
1139
  //# sourceMappingURL=index.mjs.map