@pellux/goodvibes-sdk 0.25.18 → 0.25.19
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/_internal/contracts/artifacts/operator-contract.json +1 -1
- package/dist/_internal/contracts/generated/foundation-metadata.d.ts +1 -1
- package/dist/_internal/contracts/generated/foundation-metadata.js +1 -1
- package/dist/_internal/contracts/generated/operator-contract.js +1 -1
- package/dist/_internal/platform/cloudflare/manager.d.ts.map +1 -1
- package/dist/_internal/platform/cloudflare/manager.js +5 -10
- package/dist/_internal/platform/cloudflare/resources.d.ts +0 -18
- package/dist/_internal/platform/cloudflare/resources.d.ts.map +1 -1
- package/dist/_internal/platform/cloudflare/resources.js +1 -77
- package/dist/_internal/platform/cloudflare/worker-settings.d.ts +29 -0
- package/dist/_internal/platform/cloudflare/worker-settings.d.ts.map +1 -0
- package/dist/_internal/platform/cloudflare/worker-settings.js +146 -0
- package/dist/_internal/platform/version.js +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Synced from packages/contracts/src/generated/foundation-metadata.ts
|
|
2
2
|
export const FOUNDATION_METADATA = {
|
|
3
3
|
"productId": "goodvibes",
|
|
4
|
-
"productVersion": "0.25.
|
|
4
|
+
"productVersion": "0.25.19",
|
|
5
5
|
"operatorMethodCount": 224,
|
|
6
6
|
"operatorEventCount": 30,
|
|
7
7
|
"peerEndpointCount": 6
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/cloudflare/manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/cloudflare/manager.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAIV,6BAA6B,EAC7B,4BAA4B,EAC5B,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,uBAAuB,EAGvB,+BAA+B,EAC/B,gCAAgC,EAChC,wBAAwB,EACxB,yBAAyB,EAMzB,gCAAgC,EAChC,iCAAiC,EAEjC,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAyBpB,qBAAa,6BAA6B;IAI5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqD;IAClF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAEZ,OAAO,EAAE,6BAA6B;IAK7D,cAAc,IAAI,OAAO,CAAC,4BAA4B,CAAC;IA0C7D,iBAAiB,CAAC,KAAK,GAAE,gCAAqC,GAAG,iCAAiC;IAkB5F,sBAAsB,CAAC,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,gCAAgC,CAAC;IAqEzG,QAAQ,CAAC,KAAK,GAAE,uBAA4B,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAuEhF,QAAQ,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAuB3E,SAAS,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IA0S9E,MAAM,CAAC,KAAK,GAAE,qBAA0B,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAe1E,OAAO,CAAC,KAAK,GAAE,sBAA2B,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAwBnF,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,iBAAiB;YAYX,eAAe;YAaf,oBAAoB;YAapB,wBAAwB;YAaxB,gBAAgB;YAahB,WAAW;IAOzB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,yBAAyB;YAQnB,WAAW;IAazB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,SAAS;CAMlB"}
|
|
@@ -4,9 +4,10 @@ import { createCloudflareApiClient } from './client.js';
|
|
|
4
4
|
import { readCloudflareConfig } from './config.js';
|
|
5
5
|
import { CLOUDFLARE_API_TOKEN_KEY, CLOUDFLARE_WORKER_CLIENT_TOKEN_KEY, CLOUDFLARE_WORKER_OPERATOR_TOKEN_KEY, DEFAULT_DLQ_NAME, DEFAULT_DO_NAMESPACE_NAME, DEFAULT_KV_NAMESPACE_NAME, DEFAULT_QUEUE_NAME, DEFAULT_R2_BUCKET_NAME, DEFAULT_SECRETS_STORE_NAME, DEFAULT_TUNNEL_NAME, DEFAULT_WORKER_CRON, DEFAULT_WORKER_NAME, } from './constants.js';
|
|
6
6
|
import { discoverZones, resolveZone, selectDiscoveredZone, tryDiscover, } from './discovery.js';
|
|
7
|
-
import { configureDns,
|
|
7
|
+
import { configureDns, ensureAccess, ensureKvNamespace, ensureQueue, ensureQueueConsumer, ensureR2Bucket, ensureSecretsStore, ensureTunnel, findDurableObjectNamespace, } from './resources.js';
|
|
8
8
|
import { CloudflareControlPlaneError } from './types.js';
|
|
9
9
|
import { buildTokenPolicies, buildTokenRequirements, clean, collectAsync, collectSingleAccount, hostnameFromUrl, requireKvNamespaceId, requireQueueId, resolveComponents, resolvePermissionGroups, safeResponseText, stripTrailingSlash, verifyCreatedTokenPolicies, } from './utils.js';
|
|
10
|
+
import { configureWorkerSchedule, configureWorkerSubdomain, disableWorkerSchedule, disableWorkerSubdomain, uploadWorker, } from './worker-settings.js';
|
|
10
11
|
export class CloudflareControlPlaneManager {
|
|
11
12
|
options;
|
|
12
13
|
createClient;
|
|
@@ -378,11 +379,7 @@ export class CloudflareControlPlaneManager {
|
|
|
378
379
|
});
|
|
379
380
|
}
|
|
380
381
|
if (workerCron) {
|
|
381
|
-
await client
|
|
382
|
-
account_id: accountId,
|
|
383
|
-
body: [{ cron: workerCron }],
|
|
384
|
-
});
|
|
385
|
-
steps.push({ name: 'configure-cron', status: 'ok', message: `Configured Worker cron ${workerCron}.` });
|
|
382
|
+
await configureWorkerSchedule(client, { accountId, workerName, workerCron, steps });
|
|
386
383
|
}
|
|
387
384
|
else {
|
|
388
385
|
steps.push({ name: 'configure-cron', status: 'skipped', message: 'No Worker cron configured.' });
|
|
@@ -528,12 +525,10 @@ export class CloudflareControlPlaneManager {
|
|
|
528
525
|
if (apiToken.value && accountId) {
|
|
529
526
|
const client = await this.createClient(apiToken.value);
|
|
530
527
|
if (input.disableCron !== false) {
|
|
531
|
-
await client
|
|
532
|
-
steps.push({ name: 'disable-cron', status: 'ok', message: `Removed Worker cron schedules from ${workerName}.` });
|
|
528
|
+
await disableWorkerSchedule(client, accountId, workerName, steps);
|
|
533
529
|
}
|
|
534
530
|
if (input.disableWorkerSubdomain) {
|
|
535
|
-
await client
|
|
536
|
-
steps.push({ name: 'disable-worker-subdomain', status: 'ok', message: `Disabled workers.dev route for ${workerName}.` });
|
|
531
|
+
await disableWorkerSubdomain(client, accountId, workerName, steps);
|
|
537
532
|
}
|
|
538
533
|
}
|
|
539
534
|
else {
|
|
@@ -50,24 +50,6 @@ export declare function configureDns(client: CloudflareApiClient, input: {
|
|
|
50
50
|
readonly steps: CloudflareProvisionStep[];
|
|
51
51
|
}): Promise<readonly CloudflareDnsRecordLike[]>;
|
|
52
52
|
export declare function findDurableObjectNamespace(context: CloudflareProvisioningContext, client: CloudflareApiClient, accountId: string, namespaceName: string, persist: boolean, steps: CloudflareProvisionStep[]): Promise<CloudflareDurableObjectNamespaceLike | undefined>;
|
|
53
|
-
export declare function uploadWorker(client: CloudflareApiClient, input: {
|
|
54
|
-
readonly accountId: string;
|
|
55
|
-
readonly workerName: string;
|
|
56
|
-
readonly queueName: string;
|
|
57
|
-
readonly daemonBaseUrl: string;
|
|
58
|
-
readonly queueJobPayloads: boolean;
|
|
59
|
-
readonly kvNamespaceId: string;
|
|
60
|
-
readonly r2BucketName: string;
|
|
61
|
-
readonly durableObject: boolean;
|
|
62
|
-
}): Promise<void>;
|
|
63
|
-
export declare function configureWorkerSubdomain(context: CloudflareProvisioningContext, client: CloudflareApiClient, input: {
|
|
64
|
-
readonly accountId: string;
|
|
65
|
-
readonly workerName: string;
|
|
66
|
-
readonly requestedSubdomain?: string;
|
|
67
|
-
readonly enableWorkersDev: boolean;
|
|
68
|
-
readonly steps: CloudflareProvisionStep[];
|
|
69
|
-
readonly persist: boolean;
|
|
70
|
-
}): Promise<string>;
|
|
71
53
|
export declare function ensureQueueConsumer(client: CloudflareApiClient, input: {
|
|
72
54
|
readonly accountId: string;
|
|
73
55
|
readonly queueId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/cloudflare/resources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/cloudflare/resources.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { summarizeError } from '../utils/error-display.js';
|
|
2
|
-
import { CLOUDFLARE_ACCESS_SERVICE_TOKEN_KEY, CLOUDFLARE_TUNNEL_TOKEN_KEY,
|
|
2
|
+
import { CLOUDFLARE_ACCESS_SERVICE_TOKEN_KEY, CLOUDFLARE_TUNNEL_TOKEN_KEY, } from './constants.js';
|
|
3
3
|
import { CloudflareControlPlaneError } from './types.js';
|
|
4
4
|
import { clean, collectAsync, hostnameFromUrl } from './utils.js';
|
|
5
|
-
import { GOODVIBES_CLOUDFLARE_WORKER_MODULE } from './worker-source.js';
|
|
6
5
|
export async function ensureQueue(client, accountId, queueName, steps, stepName) {
|
|
7
6
|
const existing = await findQueueByName(client, accountId, queueName);
|
|
8
7
|
if (existing) {
|
|
@@ -316,81 +315,6 @@ export async function findDurableObjectNamespace(context, client, accountId, nam
|
|
|
316
315
|
steps.push({ name: 'durable-object-namespace', status: 'warning', message: 'Durable Object migration was included, but the namespace was not visible yet during confirmation.' });
|
|
317
316
|
return { name: namespaceName };
|
|
318
317
|
}
|
|
319
|
-
export async function uploadWorker(client, input) {
|
|
320
|
-
const file = new File([GOODVIBES_CLOUDFLARE_WORKER_MODULE], 'goodvibes-cloudflare-worker.mjs', { type: 'application/javascript+module' });
|
|
321
|
-
const bindings = [
|
|
322
|
-
...(input.queueName ? [{ type: 'queue', name: 'GOODVIBES_BATCH_QUEUE', queue_name: input.queueName }] : []),
|
|
323
|
-
{ type: 'plain_text', name: 'GOODVIBES_DAEMON_URL', text: input.daemonBaseUrl },
|
|
324
|
-
{ type: 'plain_text', name: 'GOODVIBES_QUEUE_JOB_PAYLOADS', text: input.queueJobPayloads ? 'true' : 'false' },
|
|
325
|
-
...(input.kvNamespaceId ? [{ type: 'kv_namespace', name: 'GOODVIBES_KV', namespace_id: input.kvNamespaceId }] : []),
|
|
326
|
-
...(input.r2BucketName ? [{ type: 'r2_bucket', name: 'GOODVIBES_ARTIFACTS', bucket_name: input.r2BucketName }] : []),
|
|
327
|
-
...(input.durableObject ? [{ type: 'durable_object_namespace', name: 'GOODVIBES_COORDINATOR', class_name: DEFAULT_DO_NAMESPACE_NAME }] : []),
|
|
328
|
-
];
|
|
329
|
-
await client.workers.scripts.update(input.workerName, {
|
|
330
|
-
account_id: input.accountId,
|
|
331
|
-
metadata: {
|
|
332
|
-
main_module: 'goodvibes-cloudflare-worker.mjs',
|
|
333
|
-
compatibility_date: '2026-04-25',
|
|
334
|
-
bindings,
|
|
335
|
-
...(input.durableObject ? { migrations: { tag: 'goodvibes-coordinator-v1', new_sqlite_classes: [DEFAULT_DO_NAMESPACE_NAME] } } : {}),
|
|
336
|
-
keep_bindings: ['secret_text'],
|
|
337
|
-
},
|
|
338
|
-
files: [file],
|
|
339
|
-
});
|
|
340
|
-
}
|
|
341
|
-
export async function configureWorkerSubdomain(context, client, input) {
|
|
342
|
-
if (!input.enableWorkersDev) {
|
|
343
|
-
input.steps.push({ name: 'worker-subdomain', status: 'skipped', message: 'workers.dev subdomain enablement was skipped.' });
|
|
344
|
-
return clean(input.requestedSubdomain) || context.readConfig().workerSubdomain;
|
|
345
|
-
}
|
|
346
|
-
let accountSubdomain = clean(input.requestedSubdomain) || context.readConfig().workerSubdomain;
|
|
347
|
-
if (accountSubdomain) {
|
|
348
|
-
const updated = await client.workers.subdomains.update({ account_id: input.accountId, subdomain: accountSubdomain });
|
|
349
|
-
accountSubdomain = updated.subdomain;
|
|
350
|
-
context.setConfig('cloudflare.workerSubdomain', accountSubdomain, input.persist);
|
|
351
|
-
input.steps.push({ name: 'account-worker-subdomain', status: 'ok', message: `Configured account workers.dev subdomain ${accountSubdomain}.` });
|
|
352
|
-
}
|
|
353
|
-
else {
|
|
354
|
-
try {
|
|
355
|
-
const existing = await client.workers.subdomains.get({ account_id: input.accountId });
|
|
356
|
-
accountSubdomain = existing.subdomain;
|
|
357
|
-
context.setConfig('cloudflare.workerSubdomain', accountSubdomain, input.persist);
|
|
358
|
-
input.steps.push({ name: 'account-worker-subdomain', status: 'ok', message: `Using account workers.dev subdomain ${accountSubdomain}.` });
|
|
359
|
-
}
|
|
360
|
-
catch (error) {
|
|
361
|
-
input.steps.push({
|
|
362
|
-
name: 'account-worker-subdomain',
|
|
363
|
-
status: 'warning',
|
|
364
|
-
message: `Could not read account workers.dev subdomain: ${summarizeError(error)}`,
|
|
365
|
-
});
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
try {
|
|
369
|
-
const existing = await client.workers.scripts.subdomain.get(input.workerName, { account_id: input.accountId });
|
|
370
|
-
if (existing.enabled) {
|
|
371
|
-
input.steps.push({ name: 'worker-subdomain', status: 'ok', message: `Using existing workers.dev route for ${input.workerName}.` });
|
|
372
|
-
return accountSubdomain;
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
catch {
|
|
376
|
-
// Older accounts may not return script-level subdomain state before it is enabled.
|
|
377
|
-
}
|
|
378
|
-
try {
|
|
379
|
-
await client.workers.scripts.subdomain.create(input.workerName, {
|
|
380
|
-
account_id: input.accountId,
|
|
381
|
-
enabled: true,
|
|
382
|
-
previews_enabled: false,
|
|
383
|
-
});
|
|
384
|
-
input.steps.push({ name: 'worker-subdomain', status: 'ok', message: `Enabled workers.dev route for ${input.workerName}.` });
|
|
385
|
-
}
|
|
386
|
-
catch (error) {
|
|
387
|
-
const recovered = await client.workers.scripts.subdomain.get(input.workerName, { account_id: input.accountId });
|
|
388
|
-
if (!recovered.enabled)
|
|
389
|
-
throw error;
|
|
390
|
-
input.steps.push({ name: 'worker-subdomain', status: 'ok', message: `Using existing workers.dev route for ${input.workerName} after enable retry: ${summarizeError(error)}` });
|
|
391
|
-
}
|
|
392
|
-
return accountSubdomain;
|
|
393
|
-
}
|
|
394
318
|
export async function ensureQueueConsumer(client, input) {
|
|
395
319
|
const settings = {
|
|
396
320
|
batch_size: 10,
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { CloudflareApiClient, CloudflareProvisionStep } from './types.js';
|
|
2
|
+
import type { CloudflareProvisioningContext } from './resources.js';
|
|
3
|
+
export declare function uploadWorker(client: CloudflareApiClient, input: {
|
|
4
|
+
readonly accountId: string;
|
|
5
|
+
readonly workerName: string;
|
|
6
|
+
readonly queueName: string;
|
|
7
|
+
readonly daemonBaseUrl: string;
|
|
8
|
+
readonly queueJobPayloads: boolean;
|
|
9
|
+
readonly kvNamespaceId: string;
|
|
10
|
+
readonly r2BucketName: string;
|
|
11
|
+
readonly durableObject: boolean;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
export declare function configureWorkerSubdomain(context: CloudflareProvisioningContext, client: CloudflareApiClient, input: {
|
|
14
|
+
readonly accountId: string;
|
|
15
|
+
readonly workerName: string;
|
|
16
|
+
readonly requestedSubdomain?: string;
|
|
17
|
+
readonly enableWorkersDev: boolean;
|
|
18
|
+
readonly steps: CloudflareProvisionStep[];
|
|
19
|
+
readonly persist: boolean;
|
|
20
|
+
}): Promise<string>;
|
|
21
|
+
export declare function configureWorkerSchedule(client: CloudflareApiClient, input: {
|
|
22
|
+
readonly accountId: string;
|
|
23
|
+
readonly workerName: string;
|
|
24
|
+
readonly workerCron: string;
|
|
25
|
+
readonly steps: CloudflareProvisionStep[];
|
|
26
|
+
}): Promise<void>;
|
|
27
|
+
export declare function disableWorkerSchedule(client: CloudflareApiClient, accountId: string, workerName: string, steps: CloudflareProvisionStep[]): Promise<void>;
|
|
28
|
+
export declare function disableWorkerSubdomain(client: CloudflareApiClient, accountId: string, workerName: string, steps: CloudflareProvisionStep[]): Promise<void>;
|
|
29
|
+
//# sourceMappingURL=worker-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-settings.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/cloudflare/worker-settings.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAGpB,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAEpE,wBAAsB,YAAY,CAChC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE;IACL,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC,GACA,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,6BAA6B,EACtC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE;IACL,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,EAAE,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,GACA,OAAO,CAAC,MAAM,CAAC,CA4DjB;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE;IACL,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,uBAAuB,EAAE,CAAC;CAC3C,GACA,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,mBAAmB,EAC3B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,uBAAuB,EAAE,GAC/B,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,mBAAmB,EAC3B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,uBAAuB,EAAE,GAC/B,OAAO,CAAC,IAAI,CAAC,CAYf"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { summarizeError } from '../utils/error-display.js';
|
|
2
|
+
import { DEFAULT_DO_NAMESPACE_NAME } from './constants.js';
|
|
3
|
+
import { clean } from './utils.js';
|
|
4
|
+
import { GOODVIBES_CLOUDFLARE_WORKER_MODULE } from './worker-source.js';
|
|
5
|
+
export async function uploadWorker(client, input) {
|
|
6
|
+
const file = new File([GOODVIBES_CLOUDFLARE_WORKER_MODULE], 'goodvibes-cloudflare-worker.mjs', { type: 'application/javascript+module' });
|
|
7
|
+
const bindings = [
|
|
8
|
+
...(input.queueName ? [{ type: 'queue', name: 'GOODVIBES_BATCH_QUEUE', queue_name: input.queueName }] : []),
|
|
9
|
+
{ type: 'plain_text', name: 'GOODVIBES_DAEMON_URL', text: input.daemonBaseUrl },
|
|
10
|
+
{ type: 'plain_text', name: 'GOODVIBES_QUEUE_JOB_PAYLOADS', text: input.queueJobPayloads ? 'true' : 'false' },
|
|
11
|
+
...(input.kvNamespaceId ? [{ type: 'kv_namespace', name: 'GOODVIBES_KV', namespace_id: input.kvNamespaceId }] : []),
|
|
12
|
+
...(input.r2BucketName ? [{ type: 'r2_bucket', name: 'GOODVIBES_ARTIFACTS', bucket_name: input.r2BucketName }] : []),
|
|
13
|
+
...(input.durableObject ? [{ type: 'durable_object_namespace', name: 'GOODVIBES_COORDINATOR', class_name: DEFAULT_DO_NAMESPACE_NAME }] : []),
|
|
14
|
+
];
|
|
15
|
+
await client.workers.scripts.update(input.workerName, {
|
|
16
|
+
account_id: input.accountId,
|
|
17
|
+
metadata: {
|
|
18
|
+
main_module: 'goodvibes-cloudflare-worker.mjs',
|
|
19
|
+
compatibility_date: '2026-04-25',
|
|
20
|
+
bindings,
|
|
21
|
+
...(input.durableObject ? { migrations: { tag: 'goodvibes-coordinator-v1', new_sqlite_classes: [DEFAULT_DO_NAMESPACE_NAME] } } : {}),
|
|
22
|
+
keep_bindings: ['secret_text'],
|
|
23
|
+
},
|
|
24
|
+
files: [file],
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export async function configureWorkerSubdomain(context, client, input) {
|
|
28
|
+
const requested = clean(input.requestedSubdomain) || context.readConfig().workerSubdomain;
|
|
29
|
+
if (!input.enableWorkersDev) {
|
|
30
|
+
input.steps.push({ name: 'worker-subdomain', status: 'skipped', message: 'workers.dev subdomain enablement was skipped.' });
|
|
31
|
+
return requested;
|
|
32
|
+
}
|
|
33
|
+
let accountSubdomain = await readAccountWorkerSubdomain(client, input.accountId);
|
|
34
|
+
if (accountSubdomain) {
|
|
35
|
+
context.setConfig('cloudflare.workerSubdomain', accountSubdomain, input.persist);
|
|
36
|
+
input.steps.push({
|
|
37
|
+
name: 'account-worker-subdomain',
|
|
38
|
+
status: requested && requested !== accountSubdomain ? 'warning' : 'ok',
|
|
39
|
+
message: requested && requested !== accountSubdomain
|
|
40
|
+
? `Using existing account workers.dev subdomain ${accountSubdomain}; requested ${requested} was ignored because the account already has an associated subdomain.`
|
|
41
|
+
: `Using account workers.dev subdomain ${accountSubdomain}.`,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
else if (requested) {
|
|
45
|
+
try {
|
|
46
|
+
const updated = await client.workers.subdomains.update({ account_id: input.accountId, subdomain: requested });
|
|
47
|
+
accountSubdomain = clean(updated.subdomain) || requested;
|
|
48
|
+
context.setConfig('cloudflare.workerSubdomain', accountSubdomain, input.persist);
|
|
49
|
+
input.steps.push({ name: 'account-worker-subdomain', status: 'ok', message: `Configured account workers.dev subdomain ${accountSubdomain}.` });
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
const recovered = await readAccountWorkerSubdomain(client, input.accountId);
|
|
53
|
+
if (!recovered)
|
|
54
|
+
throw error;
|
|
55
|
+
accountSubdomain = recovered;
|
|
56
|
+
context.setConfig('cloudflare.workerSubdomain', accountSubdomain, input.persist);
|
|
57
|
+
input.steps.push({
|
|
58
|
+
name: 'account-worker-subdomain',
|
|
59
|
+
status: requested === recovered ? 'ok' : 'warning',
|
|
60
|
+
message: `Using existing account workers.dev subdomain ${accountSubdomain} after configure retry: ${summarizeError(error)}`,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
input.steps.push({ name: 'account-worker-subdomain', status: 'warning', message: 'No account workers.dev subdomain is configured.' });
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
const existing = await client.workers.scripts.subdomain.get(input.workerName, { account_id: input.accountId });
|
|
69
|
+
if (existing.enabled) {
|
|
70
|
+
input.steps.push({ name: 'worker-subdomain', status: 'ok', message: `Using existing workers.dev route for ${input.workerName}.` });
|
|
71
|
+
return accountSubdomain;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Older accounts may not return script-level subdomain state before it is enabled.
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
await client.workers.scripts.subdomain.create(input.workerName, {
|
|
79
|
+
account_id: input.accountId,
|
|
80
|
+
enabled: true,
|
|
81
|
+
previews_enabled: false,
|
|
82
|
+
});
|
|
83
|
+
input.steps.push({ name: 'worker-subdomain', status: 'ok', message: `Enabled workers.dev route for ${input.workerName}.` });
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
const recovered = await client.workers.scripts.subdomain.get(input.workerName, { account_id: input.accountId });
|
|
87
|
+
if (!recovered.enabled)
|
|
88
|
+
throw error;
|
|
89
|
+
input.steps.push({ name: 'worker-subdomain', status: 'ok', message: `Using existing workers.dev route for ${input.workerName} after enable retry: ${summarizeError(error)}` });
|
|
90
|
+
}
|
|
91
|
+
return accountSubdomain;
|
|
92
|
+
}
|
|
93
|
+
export async function configureWorkerSchedule(client, input) {
|
|
94
|
+
const body = [{ cron: input.workerCron }];
|
|
95
|
+
try {
|
|
96
|
+
const existing = await client.workers.scripts.schedules.get(input.workerName, { account_id: input.accountId });
|
|
97
|
+
if (sameSchedules(existing.schedules, body)) {
|
|
98
|
+
input.steps.push({ name: 'configure-cron', status: 'ok', message: `Using existing Worker cron ${input.workerCron}.` });
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Some accounts return 404 until the script has its first schedule.
|
|
104
|
+
}
|
|
105
|
+
await client.workers.scripts.schedules.update(input.workerName, { account_id: input.accountId, body });
|
|
106
|
+
input.steps.push({ name: 'configure-cron', status: 'ok', message: `Configured Worker cron ${input.workerCron}.` });
|
|
107
|
+
}
|
|
108
|
+
export async function disableWorkerSchedule(client, accountId, workerName, steps) {
|
|
109
|
+
try {
|
|
110
|
+
const existing = await client.workers.scripts.schedules.get(workerName, { account_id: accountId });
|
|
111
|
+
if (existing.schedules.length === 0) {
|
|
112
|
+
steps.push({ name: 'disable-cron', status: 'skipped', message: `No Worker cron schedules were configured for ${workerName}.` });
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Keep disable best-effort: if state cannot be read, clear schedules anyway.
|
|
118
|
+
}
|
|
119
|
+
await client.workers.scripts.schedules.update(workerName, { account_id: accountId, body: [] });
|
|
120
|
+
steps.push({ name: 'disable-cron', status: 'ok', message: `Removed Worker cron schedules from ${workerName}.` });
|
|
121
|
+
}
|
|
122
|
+
export async function disableWorkerSubdomain(client, accountId, workerName, steps) {
|
|
123
|
+
try {
|
|
124
|
+
const existing = await client.workers.scripts.subdomain.get(workerName, { account_id: accountId });
|
|
125
|
+
if (!existing.enabled) {
|
|
126
|
+
steps.push({ name: 'disable-worker-subdomain', status: 'skipped', message: `workers.dev route was already disabled for ${workerName}.` });
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// Keep disable best-effort: if state cannot be read, attempt deletion.
|
|
132
|
+
}
|
|
133
|
+
await client.workers.scripts.subdomain.delete(workerName, { account_id: accountId });
|
|
134
|
+
steps.push({ name: 'disable-worker-subdomain', status: 'ok', message: `Disabled workers.dev route for ${workerName}.` });
|
|
135
|
+
}
|
|
136
|
+
async function readAccountWorkerSubdomain(client, accountId) {
|
|
137
|
+
try {
|
|
138
|
+
return clean((await client.workers.subdomains.get({ account_id: accountId })).subdomain);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return '';
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function sameSchedules(actual, expected) {
|
|
145
|
+
return actual.length === expected.length && actual.every((schedule, index) => schedule.cron === expected[index]?.cron);
|
|
146
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
let version = '0.25.
|
|
3
|
+
let version = '0.25.19';
|
|
4
4
|
try {
|
|
5
5
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', '..', 'package.json'), 'utf-8'));
|
|
6
6
|
version = pkg.version ?? version;
|