@positronic/cloudflare 0.0.51 → 0.0.53

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 (42) hide show
  1. package/dist/src/api/brains.js +1003 -0
  2. package/dist/src/api/bundle.js +204 -0
  3. package/dist/src/api/index.js +149 -0
  4. package/dist/src/api/pages.js +681 -0
  5. package/dist/src/api/resources.js +778 -0
  6. package/dist/src/api/secrets.js +707 -0
  7. package/dist/src/api/types.js +1 -0
  8. package/dist/src/api/webhooks/coordination.js +267 -0
  9. package/dist/src/api/webhooks/index.js +277 -0
  10. package/dist/src/api/webhooks/system.js +248 -0
  11. package/dist/src/brain-runner-do.js +5 -5
  12. package/dist/src/dev-server.js +206 -10
  13. package/dist/src/index.js +2 -4
  14. package/dist/src/monitor-do.js +23 -7
  15. package/dist/types/api/brains.d.ts +7 -0
  16. package/dist/types/api/brains.d.ts.map +1 -0
  17. package/dist/types/api/bundle.d.ts +7 -0
  18. package/dist/types/api/bundle.d.ts.map +1 -0
  19. package/dist/types/api/index.d.ts +8 -0
  20. package/dist/types/api/index.d.ts.map +1 -0
  21. package/dist/types/api/pages.d.ts +7 -0
  22. package/dist/types/api/pages.d.ts.map +1 -0
  23. package/dist/types/api/resources.d.ts +7 -0
  24. package/dist/types/api/resources.d.ts.map +1 -0
  25. package/dist/types/api/secrets.d.ts +7 -0
  26. package/dist/types/api/secrets.d.ts.map +1 -0
  27. package/dist/types/{api.d.ts → api/types.d.ts} +15 -9
  28. package/dist/types/api/types.d.ts.map +1 -0
  29. package/dist/types/api/webhooks/coordination.d.ts +32 -0
  30. package/dist/types/api/webhooks/coordination.d.ts.map +1 -0
  31. package/dist/types/api/webhooks/index.d.ts +7 -0
  32. package/dist/types/api/webhooks/index.d.ts.map +1 -0
  33. package/dist/types/api/webhooks/system.d.ts +7 -0
  34. package/dist/types/api/webhooks/system.d.ts.map +1 -0
  35. package/dist/types/dev-server.d.ts +5 -0
  36. package/dist/types/dev-server.d.ts.map +1 -1
  37. package/dist/types/index.d.ts +3 -5
  38. package/dist/types/index.d.ts.map +1 -1
  39. package/dist/types/monitor-do.d.ts.map +1 -1
  40. package/package.json +4 -4
  41. package/dist/src/api.js +0 -2839
  42. package/dist/types/api.d.ts.map +0 -1
@@ -0,0 +1,681 @@
1
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
2
+ try {
3
+ var info = gen[key](arg);
4
+ var value = info.value;
5
+ } catch (error) {
6
+ reject(error);
7
+ return;
8
+ }
9
+ if (info.done) {
10
+ resolve(value);
11
+ } else {
12
+ Promise.resolve(value).then(_next, _throw);
13
+ }
14
+ }
15
+ function _async_to_generator(fn) {
16
+ return function() {
17
+ var self = this, args = arguments;
18
+ return new Promise(function(resolve, reject) {
19
+ var gen = fn.apply(self, args);
20
+ function _next(value) {
21
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
22
+ }
23
+ function _throw(err) {
24
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
25
+ }
26
+ _next(undefined);
27
+ });
28
+ };
29
+ }
30
+ function _define_property(obj, key, value) {
31
+ if (key in obj) {
32
+ Object.defineProperty(obj, key, {
33
+ value: value,
34
+ enumerable: true,
35
+ configurable: true,
36
+ writable: true
37
+ });
38
+ } else {
39
+ obj[key] = value;
40
+ }
41
+ return obj;
42
+ }
43
+ function _instanceof(left, right) {
44
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
45
+ return !!right[Symbol.hasInstance](left);
46
+ } else {
47
+ return left instanceof right;
48
+ }
49
+ }
50
+ function _object_spread(target) {
51
+ for(var i = 1; i < arguments.length; i++){
52
+ var source = arguments[i] != null ? arguments[i] : {};
53
+ var ownKeys = Object.keys(source);
54
+ if (typeof Object.getOwnPropertySymbols === "function") {
55
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
56
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
57
+ }));
58
+ }
59
+ ownKeys.forEach(function(key) {
60
+ _define_property(target, key, source[key]);
61
+ });
62
+ }
63
+ return target;
64
+ }
65
+ function ownKeys(object, enumerableOnly) {
66
+ var keys = Object.keys(object);
67
+ if (Object.getOwnPropertySymbols) {
68
+ var symbols = Object.getOwnPropertySymbols(object);
69
+ if (enumerableOnly) {
70
+ symbols = symbols.filter(function(sym) {
71
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
72
+ });
73
+ }
74
+ keys.push.apply(keys, symbols);
75
+ }
76
+ return keys;
77
+ }
78
+ function _object_spread_props(target, source) {
79
+ source = source != null ? source : {};
80
+ if (Object.getOwnPropertyDescriptors) {
81
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
82
+ } else {
83
+ ownKeys(Object(source)).forEach(function(key) {
84
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
85
+ });
86
+ }
87
+ return target;
88
+ }
89
+ function _ts_generator(thisArg, body) {
90
+ var f, y, t, _ = {
91
+ label: 0,
92
+ sent: function() {
93
+ if (t[0] & 1) throw t[1];
94
+ return t[1];
95
+ },
96
+ trys: [],
97
+ ops: []
98
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
99
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
100
+ return this;
101
+ }), g;
102
+ function verb(n) {
103
+ return function(v) {
104
+ return step([
105
+ n,
106
+ v
107
+ ]);
108
+ };
109
+ }
110
+ function step(op) {
111
+ if (f) throw new TypeError("Generator is already executing.");
112
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
113
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
114
+ if (y = 0, t) op = [
115
+ op[0] & 2,
116
+ t.value
117
+ ];
118
+ switch(op[0]){
119
+ case 0:
120
+ case 1:
121
+ t = op;
122
+ break;
123
+ case 4:
124
+ _.label++;
125
+ return {
126
+ value: op[1],
127
+ done: false
128
+ };
129
+ case 5:
130
+ _.label++;
131
+ y = op[1];
132
+ op = [
133
+ 0
134
+ ];
135
+ continue;
136
+ case 7:
137
+ op = _.ops.pop();
138
+ _.trys.pop();
139
+ continue;
140
+ default:
141
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
142
+ _ = 0;
143
+ continue;
144
+ }
145
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
146
+ _.label = op[1];
147
+ break;
148
+ }
149
+ if (op[0] === 6 && _.label < t[1]) {
150
+ _.label = t[1];
151
+ t = op;
152
+ break;
153
+ }
154
+ if (t && _.label < t[2]) {
155
+ _.label = t[2];
156
+ _.ops.push(op);
157
+ break;
158
+ }
159
+ if (t[2]) _.ops.pop();
160
+ _.trys.pop();
161
+ continue;
162
+ }
163
+ op = body.call(thisArg, _);
164
+ } catch (e) {
165
+ op = [
166
+ 6,
167
+ e
168
+ ];
169
+ y = 0;
170
+ } finally{
171
+ f = t = 0;
172
+ }
173
+ if (op[0] & 5) throw op[1];
174
+ return {
175
+ value: op[0] ? op[1] : void 0,
176
+ done: true
177
+ };
178
+ }
179
+ }
180
+ import { Hono } from 'hono';
181
+ /**
182
+ * Get the origin URL for constructing page URLs.
183
+ * Uses WORKER_URL env var if set, otherwise falls back to request URL.
184
+ */ function getOrigin(context) {
185
+ if (context.env.WORKER_URL) {
186
+ return context.env.WORKER_URL;
187
+ }
188
+ var url = new URL(context.req.url);
189
+ return "".concat(url.protocol, "//").concat(url.host);
190
+ }
191
+ /**
192
+ * Generates a unique slug for pages that don't provide one.
193
+ * Uses brainRunId prefix + random suffix for uniqueness.
194
+ */ function generateUniqueSlug(brainRunId) {
195
+ var shortId = brainRunId.slice(0, 8);
196
+ var random = Math.random().toString(36).substring(2, 10);
197
+ return "page-".concat(shortId, "-").concat(random);
198
+ }
199
+ var pages = new Hono();
200
+ // Create a new page
201
+ pages.post('/', function(context) {
202
+ return _async_to_generator(function() {
203
+ var body, slug, html, brainRunId, _body_persist, persist, ttl, bucket, key, createdAt, monitorId, monitorStub, pageUrl, error;
204
+ return _ts_generator(this, function(_state) {
205
+ switch(_state.label){
206
+ case 0:
207
+ _state.trys.push([
208
+ 0,
209
+ 4,
210
+ ,
211
+ 5
212
+ ]);
213
+ return [
214
+ 4,
215
+ context.req.json()
216
+ ];
217
+ case 1:
218
+ body = _state.sent();
219
+ slug = body.slug, html = body.html, brainRunId = body.brainRunId, _body_persist = body.persist, persist = _body_persist === void 0 ? false : _body_persist, ttl = body.ttl;
220
+ if (!html) {
221
+ return [
222
+ 2,
223
+ context.json({
224
+ error: 'Missing required field "html"'
225
+ }, 400)
226
+ ];
227
+ }
228
+ if (!brainRunId) {
229
+ return [
230
+ 2,
231
+ context.json({
232
+ error: 'Missing required field "brainRunId"'
233
+ }, 400)
234
+ ];
235
+ }
236
+ // Generate slug if not provided
237
+ if (!slug) {
238
+ slug = generateUniqueSlug(brainRunId);
239
+ } else {
240
+ // Validate slug format (alphanumeric, hyphens, underscores only)
241
+ if (!/^[a-zA-Z0-9_-]+$/.test(slug)) {
242
+ return [
243
+ 2,
244
+ context.json({
245
+ error: 'Slug must contain only alphanumeric characters, hyphens, and underscores'
246
+ }, 400)
247
+ ];
248
+ }
249
+ }
250
+ bucket = context.env.RESOURCES_BUCKET;
251
+ key = "pages/".concat(slug, ".html");
252
+ createdAt = new Date().toISOString();
253
+ return [
254
+ 4,
255
+ bucket.put(key, html, {
256
+ httpMetadata: {
257
+ contentType: 'text/html; charset=utf-8'
258
+ },
259
+ customMetadata: _object_spread({
260
+ slug: slug,
261
+ brainRunId: brainRunId,
262
+ persist: persist === true ? 'true' : 'false',
263
+ createdAt: createdAt
264
+ }, ttl !== undefined && {
265
+ ttl: String(ttl)
266
+ })
267
+ })
268
+ ];
269
+ case 2:
270
+ _state.sent();
271
+ // Register the page with MonitorDO for cleanup tracking
272
+ monitorId = context.env.MONITOR_DO.idFromName('singleton');
273
+ monitorStub = context.env.MONITOR_DO.get(monitorId);
274
+ return [
275
+ 4,
276
+ monitorStub.registerPage(slug, brainRunId, persist === true)
277
+ ];
278
+ case 3:
279
+ _state.sent();
280
+ // Build the public URL for this page
281
+ pageUrl = "".concat(getOrigin(context), "/pages/").concat(slug);
282
+ return [
283
+ 2,
284
+ context.json(_object_spread_props(_object_spread({
285
+ slug: slug,
286
+ url: pageUrl,
287
+ brainRunId: brainRunId,
288
+ persist: persist === true
289
+ }, ttl !== undefined && {
290
+ ttl: Number(ttl)
291
+ }), {
292
+ createdAt: createdAt
293
+ }), 201)
294
+ ];
295
+ case 4:
296
+ error = _state.sent();
297
+ console.error('Error creating page:', error);
298
+ return [
299
+ 2,
300
+ context.json({
301
+ error: "Failed to create page: ".concat(_instanceof(error, Error) ? error.message : 'Unknown error')
302
+ }, 500)
303
+ ];
304
+ case 5:
305
+ return [
306
+ 2
307
+ ];
308
+ }
309
+ });
310
+ })();
311
+ });
312
+ // List all pages
313
+ pages.get('/', function(context) {
314
+ return _async_to_generator(function() {
315
+ var bucket, listed, pageList, validPages, error;
316
+ return _ts_generator(this, function(_state) {
317
+ switch(_state.label){
318
+ case 0:
319
+ bucket = context.env.RESOURCES_BUCKET;
320
+ _state.label = 1;
321
+ case 1:
322
+ _state.trys.push([
323
+ 1,
324
+ 4,
325
+ ,
326
+ 5
327
+ ]);
328
+ return [
329
+ 4,
330
+ bucket.list({
331
+ prefix: 'pages/'
332
+ })
333
+ ];
334
+ case 2:
335
+ listed = _state.sent();
336
+ return [
337
+ 4,
338
+ Promise.all(listed.objects.map(function(object) {
339
+ return _async_to_generator(function() {
340
+ var r2Object, metadata, slug, pageUrl;
341
+ return _ts_generator(this, function(_state) {
342
+ switch(_state.label){
343
+ case 0:
344
+ return [
345
+ 4,
346
+ bucket.head(object.key)
347
+ ];
348
+ case 1:
349
+ r2Object = _state.sent();
350
+ if (!r2Object) {
351
+ return [
352
+ 2,
353
+ null
354
+ ];
355
+ }
356
+ metadata = r2Object.customMetadata || {};
357
+ slug = metadata.slug || object.key.replace('pages/', '').replace('.html', '');
358
+ // Build the public URL
359
+ pageUrl = "".concat(getOrigin(context), "/pages/").concat(slug);
360
+ return [
361
+ 2,
362
+ _object_spread_props(_object_spread({
363
+ slug: slug,
364
+ url: pageUrl,
365
+ brainRunId: metadata.brainRunId || '',
366
+ persist: metadata.persist === 'true'
367
+ }, metadata.ttl && {
368
+ ttl: Number(metadata.ttl)
369
+ }), {
370
+ createdAt: metadata.createdAt || object.uploaded.toISOString(),
371
+ size: object.size
372
+ })
373
+ ];
374
+ }
375
+ });
376
+ })();
377
+ }))
378
+ ];
379
+ case 3:
380
+ pageList = _state.sent();
381
+ // Filter out any null entries
382
+ validPages = pageList.filter(function(page) {
383
+ return page !== null;
384
+ });
385
+ return [
386
+ 2,
387
+ context.json({
388
+ pages: validPages,
389
+ count: validPages.length
390
+ })
391
+ ];
392
+ case 4:
393
+ error = _state.sent();
394
+ console.error('Error listing pages:', error);
395
+ return [
396
+ 2,
397
+ context.json({
398
+ error: "Failed to list pages: ".concat(_instanceof(error, Error) ? error.message : 'Unknown error')
399
+ }, 500)
400
+ ];
401
+ case 5:
402
+ return [
403
+ 2
404
+ ];
405
+ }
406
+ });
407
+ })();
408
+ });
409
+ // Get page metadata (without content)
410
+ pages.get('/:slug/meta', function(context) {
411
+ return _async_to_generator(function() {
412
+ var slug, bucket, key, r2Object, metadata, error;
413
+ return _ts_generator(this, function(_state) {
414
+ switch(_state.label){
415
+ case 0:
416
+ slug = context.req.param('slug');
417
+ bucket = context.env.RESOURCES_BUCKET;
418
+ key = "pages/".concat(slug, ".html");
419
+ _state.label = 1;
420
+ case 1:
421
+ _state.trys.push([
422
+ 1,
423
+ 3,
424
+ ,
425
+ 4
426
+ ]);
427
+ return [
428
+ 4,
429
+ bucket.head(key)
430
+ ];
431
+ case 2:
432
+ r2Object = _state.sent();
433
+ if (!r2Object) {
434
+ return [
435
+ 2,
436
+ context.json({
437
+ error: 'Page not found'
438
+ }, 404)
439
+ ];
440
+ }
441
+ metadata = r2Object.customMetadata || {};
442
+ return [
443
+ 2,
444
+ context.json(_object_spread_props(_object_spread({
445
+ slug: metadata.slug || slug,
446
+ brainRunId: metadata.brainRunId || '',
447
+ persist: metadata.persist === 'true'
448
+ }, metadata.ttl && {
449
+ ttl: Number(metadata.ttl)
450
+ }), {
451
+ createdAt: metadata.createdAt || r2Object.uploaded.toISOString(),
452
+ size: r2Object.size
453
+ }))
454
+ ];
455
+ case 3:
456
+ error = _state.sent();
457
+ console.error("Error getting page metadata for ".concat(slug, ":"), error);
458
+ return [
459
+ 2,
460
+ context.json({
461
+ error: "Failed to get page metadata: ".concat(_instanceof(error, Error) ? error.message : 'Unknown error')
462
+ }, 500)
463
+ ];
464
+ case 4:
465
+ return [
466
+ 2
467
+ ];
468
+ }
469
+ });
470
+ })();
471
+ });
472
+ // Get page HTML content
473
+ pages.get('/:slug', function(context) {
474
+ return _async_to_generator(function() {
475
+ var slug, bucket, key, r2Object, html, error;
476
+ return _ts_generator(this, function(_state) {
477
+ switch(_state.label){
478
+ case 0:
479
+ slug = context.req.param('slug');
480
+ bucket = context.env.RESOURCES_BUCKET;
481
+ key = "pages/".concat(slug, ".html");
482
+ _state.label = 1;
483
+ case 1:
484
+ _state.trys.push([
485
+ 1,
486
+ 4,
487
+ ,
488
+ 5
489
+ ]);
490
+ return [
491
+ 4,
492
+ bucket.get(key)
493
+ ];
494
+ case 2:
495
+ r2Object = _state.sent();
496
+ if (!r2Object) {
497
+ return [
498
+ 2,
499
+ context.json({
500
+ error: 'Page not found'
501
+ }, 404)
502
+ ];
503
+ }
504
+ return [
505
+ 4,
506
+ r2Object.text()
507
+ ];
508
+ case 3:
509
+ html = _state.sent();
510
+ return [
511
+ 2,
512
+ new Response(html, {
513
+ status: 200,
514
+ headers: {
515
+ 'Content-Type': 'text/html; charset=utf-8'
516
+ }
517
+ })
518
+ ];
519
+ case 4:
520
+ error = _state.sent();
521
+ console.error("Error getting page ".concat(slug, ":"), error);
522
+ return [
523
+ 2,
524
+ context.json({
525
+ error: "Failed to get page: ".concat(_instanceof(error, Error) ? error.message : 'Unknown error')
526
+ }, 500)
527
+ ];
528
+ case 5:
529
+ return [
530
+ 2
531
+ ];
532
+ }
533
+ });
534
+ })();
535
+ });
536
+ // Update page HTML content
537
+ pages.put('/:slug', function(context) {
538
+ return _async_to_generator(function() {
539
+ var slug, bucket, key, existingObject, body, html, existingMetadata, pageUrl, error;
540
+ return _ts_generator(this, function(_state) {
541
+ switch(_state.label){
542
+ case 0:
543
+ slug = context.req.param('slug');
544
+ bucket = context.env.RESOURCES_BUCKET;
545
+ key = "pages/".concat(slug, ".html");
546
+ _state.label = 1;
547
+ case 1:
548
+ _state.trys.push([
549
+ 1,
550
+ 5,
551
+ ,
552
+ 6
553
+ ]);
554
+ return [
555
+ 4,
556
+ bucket.head(key)
557
+ ];
558
+ case 2:
559
+ existingObject = _state.sent();
560
+ if (!existingObject) {
561
+ return [
562
+ 2,
563
+ context.json({
564
+ error: 'Page not found'
565
+ }, 404)
566
+ ];
567
+ }
568
+ return [
569
+ 4,
570
+ context.req.json()
571
+ ];
572
+ case 3:
573
+ body = _state.sent();
574
+ html = body.html;
575
+ if (!html) {
576
+ return [
577
+ 2,
578
+ context.json({
579
+ error: 'Missing required field "html"'
580
+ }, 400)
581
+ ];
582
+ }
583
+ // Preserve existing metadata
584
+ existingMetadata = existingObject.customMetadata || {};
585
+ // Update with new HTML, preserving metadata
586
+ return [
587
+ 4,
588
+ bucket.put(key, html, {
589
+ httpMetadata: {
590
+ contentType: 'text/html; charset=utf-8'
591
+ },
592
+ customMetadata: existingMetadata
593
+ })
594
+ ];
595
+ case 4:
596
+ _state.sent();
597
+ // Build the public URL
598
+ pageUrl = "".concat(getOrigin(context), "/pages/").concat(slug);
599
+ return [
600
+ 2,
601
+ context.json({
602
+ slug: slug,
603
+ url: pageUrl,
604
+ updatedAt: new Date().toISOString()
605
+ })
606
+ ];
607
+ case 5:
608
+ error = _state.sent();
609
+ console.error("Error updating page ".concat(slug, ":"), error);
610
+ return [
611
+ 2,
612
+ context.json({
613
+ error: "Failed to update page: ".concat(_instanceof(error, Error) ? error.message : 'Unknown error')
614
+ }, 500)
615
+ ];
616
+ case 6:
617
+ return [
618
+ 2
619
+ ];
620
+ }
621
+ });
622
+ })();
623
+ });
624
+ // Delete a page
625
+ pages.delete('/:slug', function(context) {
626
+ return _async_to_generator(function() {
627
+ var slug, bucket, key, monitorId, monitorStub, error;
628
+ return _ts_generator(this, function(_state) {
629
+ switch(_state.label){
630
+ case 0:
631
+ slug = context.req.param('slug');
632
+ bucket = context.env.RESOURCES_BUCKET;
633
+ key = "pages/".concat(slug, ".html");
634
+ _state.label = 1;
635
+ case 1:
636
+ _state.trys.push([
637
+ 1,
638
+ 4,
639
+ ,
640
+ 5
641
+ ]);
642
+ // R2 delete is idempotent - no error if object doesn't exist
643
+ return [
644
+ 4,
645
+ bucket.delete(key)
646
+ ];
647
+ case 2:
648
+ _state.sent();
649
+ // Also remove from MonitorDO tracking
650
+ monitorId = context.env.MONITOR_DO.idFromName('singleton');
651
+ monitorStub = context.env.MONITOR_DO.get(monitorId);
652
+ return [
653
+ 4,
654
+ monitorStub.unregisterPage(slug)
655
+ ];
656
+ case 3:
657
+ _state.sent();
658
+ return [
659
+ 2,
660
+ new Response(null, {
661
+ status: 204
662
+ })
663
+ ];
664
+ case 4:
665
+ error = _state.sent();
666
+ console.error("Error deleting page ".concat(slug, ":"), error);
667
+ return [
668
+ 2,
669
+ context.json({
670
+ error: "Failed to delete page: ".concat(_instanceof(error, Error) ? error.message : 'Unknown error')
671
+ }, 500)
672
+ ];
673
+ case 5:
674
+ return [
675
+ 2
676
+ ];
677
+ }
678
+ });
679
+ })();
680
+ });
681
+ export default pages;