@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.
- package/dist/src/api/brains.js +1003 -0
- package/dist/src/api/bundle.js +204 -0
- package/dist/src/api/index.js +149 -0
- package/dist/src/api/pages.js +681 -0
- package/dist/src/api/resources.js +778 -0
- package/dist/src/api/secrets.js +707 -0
- package/dist/src/api/types.js +1 -0
- package/dist/src/api/webhooks/coordination.js +267 -0
- package/dist/src/api/webhooks/index.js +277 -0
- package/dist/src/api/webhooks/system.js +248 -0
- package/dist/src/brain-runner-do.js +5 -5
- package/dist/src/dev-server.js +206 -10
- package/dist/src/index.js +2 -4
- package/dist/src/monitor-do.js +23 -7
- package/dist/types/api/brains.d.ts +7 -0
- package/dist/types/api/brains.d.ts.map +1 -0
- package/dist/types/api/bundle.d.ts +7 -0
- package/dist/types/api/bundle.d.ts.map +1 -0
- package/dist/types/api/index.d.ts +8 -0
- package/dist/types/api/index.d.ts.map +1 -0
- package/dist/types/api/pages.d.ts +7 -0
- package/dist/types/api/pages.d.ts.map +1 -0
- package/dist/types/api/resources.d.ts +7 -0
- package/dist/types/api/resources.d.ts.map +1 -0
- package/dist/types/api/secrets.d.ts +7 -0
- package/dist/types/api/secrets.d.ts.map +1 -0
- package/dist/types/{api.d.ts → api/types.d.ts} +15 -9
- package/dist/types/api/types.d.ts.map +1 -0
- package/dist/types/api/webhooks/coordination.d.ts +32 -0
- package/dist/types/api/webhooks/coordination.d.ts.map +1 -0
- package/dist/types/api/webhooks/index.d.ts +7 -0
- package/dist/types/api/webhooks/index.d.ts.map +1 -0
- package/dist/types/api/webhooks/system.d.ts +7 -0
- package/dist/types/api/webhooks/system.d.ts.map +1 -0
- package/dist/types/dev-server.d.ts +5 -0
- package/dist/types/dev-server.d.ts.map +1 -1
- package/dist/types/index.d.ts +3 -5
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/monitor-do.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/src/api.js +0 -2839
- 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;
|