@pellux/goodvibes-sdk 0.25.20 → 0.25.21
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/hostnames.d.ts +14 -0
- package/dist/_internal/platform/cloudflare/hostnames.d.ts.map +1 -0
- package/dist/_internal/platform/cloudflare/hostnames.js +47 -0
- package/dist/_internal/platform/cloudflare/manager.d.ts.map +1 -1
- package/dist/_internal/platform/cloudflare/manager.js +18 -5
- package/dist/_internal/platform/cloudflare/resources.d.ts +1 -0
- package/dist/_internal/platform/cloudflare/resources.d.ts.map +1 -1
- package/dist/_internal/platform/cloudflare/resources.js +31 -3
- package/dist/_internal/platform/cloudflare/utils.d.ts +5 -0
- package/dist/_internal/platform/cloudflare/utils.d.ts.map +1 -1
- package/dist/_internal/platform/cloudflare/utils.js +33 -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.21",
|
|
5
5
|
"operatorMethodCount": 224,
|
|
6
6
|
"operatorEventCount": 30,
|
|
7
7
|
"peerEndpointCount": 6
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CloudflareProvisionStep } from './types.js';
|
|
2
|
+
export declare function normalizeProvisionHostnames(input: {
|
|
3
|
+
readonly zoneName: string;
|
|
4
|
+
readonly workerName: string;
|
|
5
|
+
readonly daemonHostname: string;
|
|
6
|
+
readonly workerHostname: string;
|
|
7
|
+
readonly needsDaemonHostname: boolean;
|
|
8
|
+
readonly needsWorkerHostname: boolean;
|
|
9
|
+
readonly steps: CloudflareProvisionStep[];
|
|
10
|
+
}): {
|
|
11
|
+
readonly daemonHostname: string;
|
|
12
|
+
readonly workerHostname: string;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=hostnames.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostnames.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/cloudflare/hostnames.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAS1D,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,EAAE,CAAC;CAC3C,GAAG;IAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CA8CvE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { deriveZoneHostname, hostnameBelongsToZone, isLocalHostname, isPlaceholderHostname, normalizeHostname, } from './utils.js';
|
|
2
|
+
export function normalizeProvisionHostnames(input) {
|
|
3
|
+
let daemonHostname = normalizeHostname(input.daemonHostname);
|
|
4
|
+
let workerHostname = normalizeHostname(input.workerHostname);
|
|
5
|
+
const zoneName = normalizeHostname(input.zoneName);
|
|
6
|
+
if (zoneName && input.needsDaemonHostname) {
|
|
7
|
+
const derivedDaemon = deriveZoneHostname('daemon', zoneName);
|
|
8
|
+
const daemonBelongsToZone = hostnameBelongsToZone(daemonHostname, zoneName);
|
|
9
|
+
const daemonSourceIsNotUsable = !daemonHostname ||
|
|
10
|
+
isLocalHostname(daemonHostname) ||
|
|
11
|
+
(isPlaceholderHostname(daemonHostname) && !daemonBelongsToZone);
|
|
12
|
+
if (daemonSourceIsNotUsable) {
|
|
13
|
+
if (daemonHostname && daemonHostname !== derivedDaemon) {
|
|
14
|
+
input.steps.push({ name: 'daemon-hostname', status: 'ok', message: `Using ${derivedDaemon} instead of placeholder/local daemon hostname ${daemonHostname} for selected zone ${zoneName}.` });
|
|
15
|
+
}
|
|
16
|
+
else if (!daemonHostname) {
|
|
17
|
+
input.steps.push({ name: 'daemon-hostname', status: 'ok', message: `Using ${derivedDaemon} as the Cloudflare-managed daemon hostname for selected zone ${zoneName}.` });
|
|
18
|
+
}
|
|
19
|
+
daemonHostname = derivedDaemon;
|
|
20
|
+
}
|
|
21
|
+
else if (!daemonBelongsToZone) {
|
|
22
|
+
input.steps.push({ name: 'daemon-hostname', status: 'warning', message: `Configured daemonHostname ${daemonHostname} does not belong to selected zone ${zoneName}; Tunnel, DNS, and Access hostname automation for the daemon will be skipped.` });
|
|
23
|
+
daemonHostname = '';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (zoneName && input.needsWorkerHostname && workerHostname) {
|
|
27
|
+
const derivedWorker = deriveZoneHostname(input.workerName, zoneName);
|
|
28
|
+
const workerBelongsToZone = hostnameBelongsToZone(workerHostname, zoneName);
|
|
29
|
+
if (isPlaceholderHostname(workerHostname) && !workerBelongsToZone) {
|
|
30
|
+
input.steps.push({ name: 'worker-hostname', status: 'ok', message: `Using ${derivedWorker} instead of placeholder Worker hostname ${workerHostname} for selected zone ${zoneName}.` });
|
|
31
|
+
workerHostname = derivedWorker;
|
|
32
|
+
}
|
|
33
|
+
else if (!workerBelongsToZone) {
|
|
34
|
+
input.steps.push({ name: 'worker-hostname', status: 'warning', message: `Configured workerHostname ${workerHostname} does not belong to selected zone ${zoneName}; Worker DNS automation will be skipped.` });
|
|
35
|
+
workerHostname = '';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (!zoneName && input.needsDaemonHostname && isPlaceholderHostname(daemonHostname)) {
|
|
39
|
+
input.steps.push({ name: 'daemon-hostname', status: 'warning', message: `Configured daemonHostname ${daemonHostname} is a placeholder; Cloudflare daemon hostname automation will be skipped until a real zone hostname is configured.` });
|
|
40
|
+
daemonHostname = '';
|
|
41
|
+
}
|
|
42
|
+
if (!zoneName && input.needsWorkerHostname && isPlaceholderHostname(workerHostname)) {
|
|
43
|
+
input.steps.push({ name: 'worker-hostname', status: 'warning', message: `Configured workerHostname ${workerHostname} is a placeholder; Worker DNS automation will be skipped until a real zone hostname is configured.` });
|
|
44
|
+
workerHostname = '';
|
|
45
|
+
}
|
|
46
|
+
return { daemonHostname, workerHostname };
|
|
47
|
+
}
|
|
@@ -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":"AAiCA,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;AAoBpB,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;IA8T9E,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;CAKlB"}
|
|
@@ -3,11 +3,12 @@ import { summarizeError } from '../utils/error-display.js';
|
|
|
3
3
|
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
|
-
import { discoverZones, resolveZone, selectDiscoveredZone, tryDiscover
|
|
6
|
+
import { discoverZones, resolveZone, selectDiscoveredZone, tryDiscover } from './discovery.js';
|
|
7
|
+
import { normalizeProvisionHostnames } from './hostnames.js';
|
|
7
8
|
import { configureDns, ensureAccess, ensureKvNamespace, ensureQueue, ensureQueueConsumer, ensureR2Bucket, ensureSecretsStore, ensureTunnel, findDurableObjectNamespace, } from './resources.js';
|
|
8
9
|
import { CloudflareControlPlaneError } from './types.js';
|
|
9
|
-
import { buildTokenPolicies, buildTokenRequirements, clean, collectAsync, collectSingleAccount, hostnameFromUrl, requireKvNamespaceId, requireQueueId, resolveComponents, resolvePermissionGroups, safeResponseText, stripTrailingSlash, verifyCreatedTokenPolicies, } from './utils.js';
|
|
10
|
-
import { configureWorkerSchedule, configureWorkerSubdomain, describeWorkerUploadDurableObjectMigration, disableWorkerSchedule, disableWorkerSubdomain, uploadWorker
|
|
10
|
+
import { buildTokenPolicies, buildTokenRequirements, clean, collectAsync, collectSingleAccount, hostnameFromUrl, normalizeHostname, requireKvNamespaceId, requireQueueId, resolveComponents, resolvePermissionGroups, safeResponseText, stripTrailingSlash, verifyCreatedTokenPolicies, } from './utils.js';
|
|
11
|
+
import { configureWorkerSchedule, configureWorkerSubdomain, describeWorkerUploadDurableObjectMigration, disableWorkerSchedule, disableWorkerSubdomain, uploadWorker } from './worker-settings.js';
|
|
11
12
|
export class CloudflareControlPlaneManager {
|
|
12
13
|
options;
|
|
13
14
|
createClient;
|
|
@@ -240,8 +241,8 @@ export class CloudflareControlPlaneManager {
|
|
|
240
241
|
const queueName = clean(input.queueName) || config.queueName || DEFAULT_QUEUE_NAME;
|
|
241
242
|
const deadLetterQueueName = clean(input.deadLetterQueueName) || config.deadLetterQueueName || DEFAULT_DLQ_NAME;
|
|
242
243
|
const daemonBaseUrl = stripTrailingSlash(clean(input.daemonBaseUrl) || config.daemonBaseUrl);
|
|
243
|
-
|
|
244
|
-
|
|
244
|
+
let daemonHostname = normalizeHostname(clean(input.daemonHostname) || config.daemonHostname || hostnameFromUrl(daemonBaseUrl));
|
|
245
|
+
let workerHostname = normalizeHostname(clean(input.workerHostname) || config.workerHostname);
|
|
245
246
|
const workerCron = clean(input.workerCron) || config.workerCron || DEFAULT_WORKER_CRON;
|
|
246
247
|
const queueJobPayloads = input.queueJobPayloads === true;
|
|
247
248
|
if (components.workers && !daemonBaseUrl) {
|
|
@@ -276,6 +277,17 @@ export class CloudflareControlPlaneManager {
|
|
|
276
277
|
else if (components.dns) {
|
|
277
278
|
steps.push({ name: 'zone', status: 'warning', message: 'No Cloudflare zone was selected; DNS hostname automation was skipped.' });
|
|
278
279
|
}
|
|
280
|
+
const normalizedHostnames = normalizeProvisionHostnames({
|
|
281
|
+
zoneName: zone?.name ?? '',
|
|
282
|
+
workerName,
|
|
283
|
+
daemonHostname,
|
|
284
|
+
workerHostname,
|
|
285
|
+
needsDaemonHostname: components.zeroTrustTunnel || components.zeroTrustAccess || components.dns,
|
|
286
|
+
needsWorkerHostname: components.dns,
|
|
287
|
+
steps,
|
|
288
|
+
});
|
|
289
|
+
daemonHostname = normalizedHostnames.daemonHostname;
|
|
290
|
+
workerHostname = normalizedHostnames.workerHostname;
|
|
279
291
|
let deadLetterQueue;
|
|
280
292
|
let queue;
|
|
281
293
|
let deadLetterQueueId = '';
|
|
@@ -424,6 +436,7 @@ export class CloudflareControlPlaneManager {
|
|
|
424
436
|
accessAppId: clean(input.accessAppId) || config.accessAppId,
|
|
425
437
|
accessServiceTokenId: clean(input.accessServiceTokenId) || config.accessServiceTokenId,
|
|
426
438
|
accessServiceTokenRef: clean(input.accessServiceTokenRef) || config.accessServiceTokenRef,
|
|
439
|
+
...(zone ? { zone } : {}),
|
|
427
440
|
persist,
|
|
428
441
|
returnGeneratedSecrets: input.returnGeneratedSecrets === true,
|
|
429
442
|
steps,
|
|
@@ -30,6 +30,7 @@ export declare function ensureAccess(context: CloudflareProvisioningContext, cli
|
|
|
30
30
|
readonly accessAppId: string;
|
|
31
31
|
readonly accessServiceTokenId: string;
|
|
32
32
|
readonly accessServiceTokenRef: string;
|
|
33
|
+
readonly zone?: CloudflareZoneLike;
|
|
33
34
|
readonly persist: boolean;
|
|
34
35
|
readonly returnGeneratedSecrets: boolean;
|
|
35
36
|
readonly steps: CloudflareProvisionStep[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/cloudflare/resources.ts"],"names":[],"mappings":"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
|
|
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;AAMrD,OAAO,KAAK,EAGV,mBAAmB,EACnB,sBAAsB,EACtB,4BAA4B,EAC5B,uBAAuB,EACvB,oCAAoC,EACpC,yBAAyB,EACzB,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAE1B,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,4BAA4B,CAAC;IACxD,QAAQ,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/E,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,mBAAmB,EAC3B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,uBAAuB,EAAE,EAChC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,mBAAmB,CAAC,CAkB9B;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,6BAA6B,EACtC,MAAM,EAAE,mBAAmB,EAC3B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,qBAAqB,EAAE,MAAM,EAC7B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,uBAAuB,EAAE,GAC/B,OAAO,CAAC,yBAAyB,CAAC,CA8BpC;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,6BAA6B,EACtC,MAAM,EAAE,mBAAmB,EAC3B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,uBAAuB,EAAE,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CAwBjC;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,6BAA6B,EACtC,MAAM,EAAE,mBAAmB,EAC3B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,EACzB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,uBAAuB,EAAE,GAC/B,OAAO,CAAC,0BAA0B,CAAC,CAgCrC;AAED,wBAAsB,YAAY,CAChC,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,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,EAAE,CAAC;CAC3C,GACA,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqD9G;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,6BAA6B,EACtC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE;IACL,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,EAAE,CAAC;CAC3C,GACA,OAAO,CAAC;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiHvK;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE;IACL,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,uBAAuB,EAAE,CAAC;CAC3C,GACA,OAAO,CAAC,SAAS,uBAAuB,EAAE,CAAC,CA2B7C;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,6BAA6B,EACtC,MAAM,EAAE,mBAAmB,EAC3B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,uBAAuB,EAAE,GAC/B,OAAO,CAAC,oCAAoC,GAAG,SAAS,CAAC,CAe3D;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE;IACL,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,EAAE,CAAC;CAC3C,GACA,OAAO,CAAC,sBAAsB,CAAC,CA2CjC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { summarizeError } from '../utils/error-display.js';
|
|
2
2
|
import { CLOUDFLARE_ACCESS_SERVICE_TOKEN_KEY, CLOUDFLARE_TUNNEL_TOKEN_KEY, } from './constants.js';
|
|
3
3
|
import { CloudflareControlPlaneError } from './types.js';
|
|
4
|
-
import { clean, collectAsync, hostnameFromUrl } from './utils.js';
|
|
4
|
+
import { clean, collectAsync, hostnameBelongsToZone, hostnameFromUrl, isPlaceholderHostname } from './utils.js';
|
|
5
5
|
export async function ensureQueue(client, accountId, queueName, steps, stepName) {
|
|
6
6
|
const existing = await findQueueByName(client, accountId, queueName);
|
|
7
7
|
if (existing) {
|
|
@@ -227,6 +227,24 @@ export async function ensureAccess(context, client, input) {
|
|
|
227
227
|
...(serviceToken.client_secret && input.returnGeneratedSecrets ? { clientSecret: serviceToken.client_secret } : {}),
|
|
228
228
|
};
|
|
229
229
|
}
|
|
230
|
+
if (!input.zone && isPlaceholderHostname(input.daemonHostname)) {
|
|
231
|
+
input.steps.push({ name: 'zero-trust-access-app', status: 'warning', message: `Access application was skipped because daemonHostname ${input.daemonHostname} is a placeholder hostname.` });
|
|
232
|
+
return {
|
|
233
|
+
...(serviceToken.id ? { serviceTokenId: serviceToken.id } : {}),
|
|
234
|
+
...(serviceTokenRef ? { serviceTokenRef } : {}),
|
|
235
|
+
...(serviceToken.client_id && input.returnGeneratedSecrets ? { clientId: serviceToken.client_id } : {}),
|
|
236
|
+
...(serviceToken.client_secret && input.returnGeneratedSecrets ? { clientSecret: serviceToken.client_secret } : {}),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
if (input.zone && !hostnameBelongsToZone(input.daemonHostname, input.zone.name)) {
|
|
240
|
+
input.steps.push({ name: 'zero-trust-access-app', status: 'warning', message: `Access application was skipped because daemonHostname ${input.daemonHostname} does not belong to selected zone ${input.zone.name}.` });
|
|
241
|
+
return {
|
|
242
|
+
...(serviceToken.id ? { serviceTokenId: serviceToken.id } : {}),
|
|
243
|
+
...(serviceTokenRef ? { serviceTokenRef } : {}),
|
|
244
|
+
...(serviceToken.client_id && input.returnGeneratedSecrets ? { clientId: serviceToken.client_id } : {}),
|
|
245
|
+
...(serviceToken.client_secret && input.returnGeneratedSecrets ? { clientSecret: serviceToken.client_secret } : {}),
|
|
246
|
+
};
|
|
247
|
+
}
|
|
230
248
|
let app = input.accessAppId ? { id: input.accessAppId } : undefined;
|
|
231
249
|
if (!app) {
|
|
232
250
|
for await (const existing of api.applications.list({ account_id: input.accountId, domain: input.daemonHostname, exact: true })) {
|
|
@@ -288,11 +306,21 @@ export async function configureDns(client, input) {
|
|
|
288
306
|
}
|
|
289
307
|
const records = [];
|
|
290
308
|
if (input.daemonHostname && input.tunnelId) {
|
|
291
|
-
|
|
309
|
+
if (hostnameBelongsToZone(input.daemonHostname, input.zone.name)) {
|
|
310
|
+
records.push(await ensureCnameRecord(client, input.zone.id, input.daemonHostname, `${input.tunnelId}.cfargotunnel.com`, input.steps, 'dns-daemon-hostname'));
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
input.steps.push({ name: 'dns-daemon-hostname', status: 'warning', message: `Skipped daemon DNS record because ${input.daemonHostname} does not belong to selected zone ${input.zone.name}.` });
|
|
314
|
+
}
|
|
292
315
|
}
|
|
293
316
|
const workerTarget = hostnameFromUrl(input.workerBaseUrl);
|
|
294
317
|
if (input.workerHostname && workerTarget) {
|
|
295
|
-
|
|
318
|
+
if (hostnameBelongsToZone(input.workerHostname, input.zone.name)) {
|
|
319
|
+
records.push(await ensureCnameRecord(client, input.zone.id, input.workerHostname, workerTarget, input.steps, 'dns-worker-hostname'));
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
input.steps.push({ name: 'dns-worker-hostname', status: 'warning', message: `Skipped Worker DNS record because ${input.workerHostname} does not belong to selected zone ${input.zone.name}.` });
|
|
323
|
+
}
|
|
296
324
|
}
|
|
297
325
|
if (records.length === 0)
|
|
298
326
|
input.steps.push({ name: 'dns', status: 'skipped', message: 'No daemonHostname/tunnelId or workerHostname/workerBaseUrl pair was available for DNS automation.' });
|
|
@@ -17,6 +17,11 @@ export declare function collectAsync<T>(iterable: AsyncIterable<T>, limit?: numb
|
|
|
17
17
|
export declare function clean(value: string | undefined): string;
|
|
18
18
|
export declare function stripTrailingSlash(value: string): string;
|
|
19
19
|
export declare function hostnameFromUrl(value: string): string;
|
|
20
|
+
export declare function normalizeHostname(value: string | undefined): string;
|
|
21
|
+
export declare function hostnameBelongsToZone(hostname: string, zoneName: string): boolean;
|
|
22
|
+
export declare function isPlaceholderHostname(hostname: string): boolean;
|
|
23
|
+
export declare function isLocalHostname(hostname: string): boolean;
|
|
24
|
+
export declare function deriveZoneHostname(label: string, zoneName: string): string;
|
|
20
25
|
export declare function requireQueueId(queue: CloudflareQueueLike, queueName: string): string;
|
|
21
26
|
export declare function requireKvNamespaceId(namespace: CloudflareKvNamespaceLike): string;
|
|
22
27
|
export declare function safeResponseText(response: Response): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/cloudflare/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,4BAA4B,EAC5B,yBAAyB,EACzB,6BAA6B,EAC7B,mBAAmB,EACnB,iCAAiC,EACjC,oCAAoC,EACpC,0BAA0B,EAE1B,iCAAiC,EAClC,MAAM,YAAY,CAAC;AAGpB,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,4BAA4B,GAAG,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAKrI;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC,EAC1D,gBAAgB,EAAE,OAAO,GACxB,SAAS,oCAAoC,EAAE,CAkHjD;AAED,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,SAAS,oCAAoC,EAAE,EAC7D,MAAM,EAAE,SAAS,6BAA6B,EAAE,GAC/C,SAAS,MAAM,EAAE,CAmBnB;AAED,wBAAsB,yBAAyB,CAC7C,YAAY,EAAE,SAAS,oCAAoC,EAAE,EAC7D,oBAAoB,EAAE,CAAC,MAAM,CAAC,EAAE;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,aAAa,CAAC,6BAA6B,CAAC,GACnI,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAE5B;AAED,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,SAAS,oCAAoC,EAAE,EAC7D,oBAAoB,EAAE,CAAC,MAAM,CAAC,EAAE;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,aAAa,CAAC,6BAA6B,CAAC,GACnI,OAAO,CAAC,SAAS,iCAAiC,EAAE,CAAC,CA4DvD;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,SAAS,iCAAiC,EAAE,GACnD,SAAS,0BAA0B,EAAE,CAmBvC;AAED,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,iCAAiC,EACxC,cAAc,EAAE,SAAS,iCAAiC,EAAE,EAC5D,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,iCAAiC,CAAC,GAC1E,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,mBAAmB,EAC3B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,SAAS,qBAAqB,EAAE,CAAC,CAW3C;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAOpG;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEvD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGpF;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,yBAAyB,GAAG,MAAM,CAGjF;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAM1E"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/_internal/platform/cloudflare/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -265,6 +265,39 @@ export function hostnameFromUrl(value) {
|
|
|
265
265
|
return '';
|
|
266
266
|
}
|
|
267
267
|
}
|
|
268
|
+
export function normalizeHostname(value) {
|
|
269
|
+
const trimmed = clean(value).replace(/\.+$/, '');
|
|
270
|
+
if (!trimmed)
|
|
271
|
+
return '';
|
|
272
|
+
if (/^https?:\/\//i.test(trimmed))
|
|
273
|
+
return hostnameFromUrl(trimmed).toLowerCase();
|
|
274
|
+
const withoutPath = trimmed.split('/')[0] ?? '';
|
|
275
|
+
return withoutPath.split(':')[0]?.toLowerCase() ?? '';
|
|
276
|
+
}
|
|
277
|
+
export function hostnameBelongsToZone(hostname, zoneName) {
|
|
278
|
+
const normalizedHostname = normalizeHostname(hostname);
|
|
279
|
+
const normalizedZone = normalizeHostname(zoneName);
|
|
280
|
+
return normalizedHostname === normalizedZone || normalizedHostname.endsWith(`.${normalizedZone}`);
|
|
281
|
+
}
|
|
282
|
+
export function isPlaceholderHostname(hostname) {
|
|
283
|
+
const normalized = normalizeHostname(hostname);
|
|
284
|
+
return normalized === 'example.com' ||
|
|
285
|
+
normalized.endsWith('.example.com') ||
|
|
286
|
+
normalized.endsWith('.example.net') ||
|
|
287
|
+
normalized.endsWith('.example.org') ||
|
|
288
|
+
normalized.endsWith('.example.test');
|
|
289
|
+
}
|
|
290
|
+
export function isLocalHostname(hostname) {
|
|
291
|
+
const normalized = normalizeHostname(hostname);
|
|
292
|
+
return normalized === 'localhost' ||
|
|
293
|
+
normalized === '127.0.0.1' ||
|
|
294
|
+
normalized === '::1' ||
|
|
295
|
+
normalized.endsWith('.localhost');
|
|
296
|
+
}
|
|
297
|
+
export function deriveZoneHostname(label, zoneName) {
|
|
298
|
+
const normalizedLabel = clean(label).toLowerCase().replace(/[^a-z0-9-]+/g, '-').replace(/^-+|-+$/g, '') || 'goodvibes';
|
|
299
|
+
return `${normalizedLabel}.${normalizeHostname(zoneName)}`;
|
|
300
|
+
}
|
|
268
301
|
export function requireQueueId(queue, queueName) {
|
|
269
302
|
if (queue.queue_id)
|
|
270
303
|
return queue.queue_id;
|
|
@@ -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.21';
|
|
4
4
|
try {
|
|
5
5
|
const pkg = JSON.parse(readFileSync(join(import.meta.dir, '..', '..', 'package.json'), 'utf-8'));
|
|
6
6
|
version = pkg.version ?? version;
|