@withandeo/cli 0.19.5 → 0.19.6
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/api.d.ts +4 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js.map +1 -1
- package/dist/errors.d.ts +2 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +3 -1
- package/dist/errors.js.map +1 -1
- package/dist/git-outcome.d.ts +12 -0
- package/dist/git-outcome.d.ts.map +1 -1
- package/dist/git-outcome.js +54 -14
- package/dist/git-outcome.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +15 -6
- package/dist/main.js.map +1 -1
- package/dist/workflow-config.d.ts +2 -0
- package/dist/workflow-config.d.ts.map +1 -1
- package/dist/workflow-config.js +15 -4
- package/dist/workflow-config.js.map +1 -1
- package/dist/workflow-contract.d.ts +14 -2
- package/dist/workflow-contract.d.ts.map +1 -1
- package/dist/workflow-contract.js +47 -3
- package/dist/workflow-contract.js.map +1 -1
- package/dist/workflow-dev-host.d.ts +1 -1
- package/dist/workflow-dev-host.d.ts.map +1 -1
- package/dist/workflow-dev-host.js +10 -5
- package/dist/workflow-dev-host.js.map +1 -1
- package/dist/workflow-dev.d.ts.map +1 -1
- package/dist/workflow-dev.js +16 -12
- package/dist/workflow-dev.js.map +1 -1
- package/dist/workflow-egress.d.ts +10 -0
- package/dist/workflow-egress.d.ts.map +1 -0
- package/dist/workflow-egress.js +96 -0
- package/dist/workflow-egress.js.map +1 -0
- package/dist/workflow-package.d.ts.map +1 -1
- package/dist/workflow-package.js +3 -2
- package/dist/workflow-package.js.map +1 -1
- package/package.json +1 -1
- package/skill/tender-accounts/references/workflows.md +16 -1
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { type AppWorkflowDeclaration } from "./workflow-contract.js";
|
|
2
|
+
import type { WorkflowPublicEgress } from "./workflow-contract.js";
|
|
2
3
|
export interface WorkflowConfig {
|
|
3
4
|
declarations: AppWorkflowDeclaration[];
|
|
4
5
|
compatibilityDate: string;
|
|
5
6
|
vars: Record<string, string>;
|
|
7
|
+
egress: Record<string, WorkflowPublicEgress>;
|
|
6
8
|
}
|
|
7
9
|
export declare function parseWorkflowConfig(text: string, format: "jsonc" | "toml", environment?: string): WorkflowConfig;
|
|
8
10
|
export declare function readWorkflowConfig(root: string, environment?: string): Promise<WorkflowConfig | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-config.d.ts","sourceRoot":"","sources":["../src/workflow-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6C,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAIhH,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,sBAAsB,EAAE,CAAC;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow-config.d.ts","sourceRoot":"","sources":["../src/workflow-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6C,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAIhH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,sBAAsB,EAAE,CAAC;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAC,oBAAoB,CAAC,CAAC;CAC7C;AACD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,cAAc,CA0ChH;AACD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAoB3G"}
|
package/dist/workflow-config.js
CHANGED
|
@@ -3,6 +3,7 @@ import { parse as parseToml } from "smol-toml";
|
|
|
3
3
|
import { parseWorkflowDeclarations, workflowRecord } from "./workflow-contract.js";
|
|
4
4
|
import { readBoundedFile, pathExists } from "./files.js";
|
|
5
5
|
import { resolve } from "node:path";
|
|
6
|
+
import { parseWorkflowEgressConfig, WORKFLOW_EGRESS_CONFIG } from "./workflow-egress.js";
|
|
6
7
|
export function parseWorkflowConfig(text, format, environment) {
|
|
7
8
|
const errors = [];
|
|
8
9
|
const base = format === "toml" ? parseToml(text) : parseJsonc(text, errors, { allowTrailingComma: true });
|
|
@@ -10,7 +11,7 @@ export function parseWorkflowConfig(text, format, environment) {
|
|
|
10
11
|
throw new Error("app_workflow_config_invalid");
|
|
11
12
|
if (base.workflows === undefined && (!workflowRecord(base.env)
|
|
12
13
|
|| Object.values(base.env).every(value => !workflowRecord(value) || value.workflows === undefined))) {
|
|
13
|
-
return { declarations: [], compatibilityDate: "", vars: {} };
|
|
14
|
+
return { declarations: [], compatibilityDate: "", vars: {}, egress: {} };
|
|
14
15
|
}
|
|
15
16
|
let config = base;
|
|
16
17
|
if (environment) {
|
|
@@ -22,7 +23,7 @@ export function parseWorkflowConfig(text, format, environment) {
|
|
|
22
23
|
}
|
|
23
24
|
const declarations = parseWorkflowDeclarations(config.workflows);
|
|
24
25
|
if (!declarations.length)
|
|
25
|
-
return { declarations, compatibilityDate: "", vars: {} };
|
|
26
|
+
return { declarations, compatibilityDate: "", vars: {}, egress: {} };
|
|
26
27
|
if (typeof config.compatibility_date !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(config.compatibility_date)) {
|
|
27
28
|
throw new Error("app_workflow_compatibility_date_required");
|
|
28
29
|
}
|
|
@@ -54,7 +55,7 @@ export function parseWorkflowConfig(text, format, environment) {
|
|
|
54
55
|
}
|
|
55
56
|
if (declarations.some(d => names.has(d.binding)))
|
|
56
57
|
throw new Error("app_workflow_binding_collision");
|
|
57
|
-
return { declarations, compatibilityDate: config.compatibility_date, vars };
|
|
58
|
+
return { declarations, compatibilityDate: config.compatibility_date, vars, egress: {} };
|
|
58
59
|
}
|
|
59
60
|
export async function readWorkflowConfig(root, environment) {
|
|
60
61
|
const candidates = [];
|
|
@@ -71,6 +72,16 @@ export async function readWorkflowConfig(root, environment) {
|
|
|
71
72
|
return null;
|
|
72
73
|
throw new Error("app_workflow_config_ambiguous: keep one Wrangler configuration");
|
|
73
74
|
}
|
|
74
|
-
|
|
75
|
+
const result = parsed[0];
|
|
76
|
+
let policy;
|
|
77
|
+
if (await pathExists(resolve(root, WORKFLOW_EGRESS_CONFIG))) {
|
|
78
|
+
try {
|
|
79
|
+
policy = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(await readBoundedFile(resolve(root, WORKFLOW_EGRESS_CONFIG), 64 * 1024)));
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
throw new Error("app_workflow_egress_config_invalid");
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return { ...result, egress: parseWorkflowEgressConfig(policy, result.declarations.map(item => item.name)) };
|
|
75
86
|
}
|
|
76
87
|
//# sourceMappingURL=workflow-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-config.js","sourceRoot":"","sources":["../src/workflow-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,UAAU,EAAmB,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAA+B,MAAM,wBAAwB,CAAC;AAChH,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow-config.js","sourceRoot":"","sources":["../src/workflow-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,14 +6,24 @@ export interface AppWorkflowDeclaration {
|
|
|
6
6
|
binding: string;
|
|
7
7
|
class_name: string;
|
|
8
8
|
}
|
|
9
|
+
export interface WorkflowHttpsDestination {
|
|
10
|
+
hostname: string;
|
|
11
|
+
port: 443;
|
|
12
|
+
}
|
|
13
|
+
export interface WorkflowPublicEgress {
|
|
14
|
+
https: WorkflowHttpsDestination[];
|
|
15
|
+
}
|
|
16
|
+
export interface AppWorkflowDeclarationV2 extends AppWorkflowDeclaration {
|
|
17
|
+
publicEgress: WorkflowPublicEgress;
|
|
18
|
+
}
|
|
9
19
|
export interface WorkflowFile {
|
|
10
20
|
path: "workflow.mjs" | "workflow.mjs.map";
|
|
11
21
|
sha256: string;
|
|
12
22
|
bytes: number;
|
|
13
23
|
}
|
|
14
24
|
export interface AppWorkflowArtifact {
|
|
15
|
-
schema: "andeo.app-workflows/
|
|
16
|
-
declarations:
|
|
25
|
+
schema: "andeo.app-workflows/v2";
|
|
26
|
+
declarations: AppWorkflowDeclarationV2[];
|
|
17
27
|
module: WorkflowFile & {
|
|
18
28
|
path: "workflow.mjs";
|
|
19
29
|
contentType: "application/javascript+module";
|
|
@@ -30,5 +40,7 @@ export declare function workflowRecord(value: unknown): value is Record<string,
|
|
|
30
40
|
export declare function workflowBindingName(value: unknown): value is string;
|
|
31
41
|
export declare function parseWorkflowDeclarations(value: unknown): AppWorkflowDeclaration[];
|
|
32
42
|
export declare function parseWorkflowArtifact(value: unknown): AppWorkflowArtifact | undefined;
|
|
43
|
+
export declare function parseWorkflowDeclarationsV2(value: unknown): AppWorkflowDeclarationV2[];
|
|
44
|
+
export declare function parseWorkflowPublicEgress(value: unknown): WorkflowPublicEgress;
|
|
33
45
|
export declare function workflowFiles(value: AppWorkflowArtifact | undefined): WorkflowFile[];
|
|
34
46
|
//# sourceMappingURL=workflow-contract.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-contract.d.ts","sourceRoot":"","sources":["../src/workflow-contract.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,eAAO,MAAM,qBAAqB,QAAmB,CAAC;AACtD,eAAO,MAAM,gCAAgC,QAAmB,CAAC;AACjE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AACD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,cAAc,GAAG,kBAAkB,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,wBAAwB,CAAC;IACjC,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"workflow-contract.d.ts","sourceRoot":"","sources":["../src/workflow-contract.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,eAAO,MAAM,qBAAqB,QAAmB,CAAC;AACtD,eAAO,MAAM,gCAAgC,QAAmB,CAAC;AACjE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AACD,MAAM,WAAW,wBAAwB;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC;CAAE;AAC1E,MAAM,WAAW,oBAAoB;IAAG,KAAK,EAAE,wBAAwB,EAAE,CAAC;CAAE;AAC5E,MAAM,WAAW,wBAAyB,SAAQ,sBAAsB;IACtE,YAAY,EAAE,oBAAoB,CAAC;CACpC;AACD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,cAAc,GAAG,kBAAkB,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,wBAAwB,CAAC;IACjC,YAAY,EAAE,wBAAwB,EAAE,CAAC;IACzC,MAAM,EAAE,YAAY,GAAG;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,WAAW,EAAE,+BAA+B,CAAA;KAAE,CAAC;IAC9F,SAAS,CAAC,EAAE,YAAY,GAAG;QAAE,IAAI,EAAE,kBAAkB,CAAA;KAAE,CAAC;IACxD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,CAAC,eAAe,CAAC,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AACD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE/E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAGnE;AACD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,EAAE,CAgBlF;AACD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,GAAG,SAAS,CAoCrF;AACD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,wBAAwB,EAAE,CAUtF;AACD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAgB9E;AAWD,wBAAgB,aAAa,CAAC,KAAK,EAAE,mBAAmB,GAAG,SAAS,GAAG,YAAY,EAAE,CAEpF"}
|
|
@@ -38,11 +38,11 @@ export function parseWorkflowDeclarations(value) {
|
|
|
38
38
|
export function parseWorkflowArtifact(value) {
|
|
39
39
|
if (value === undefined)
|
|
40
40
|
return undefined;
|
|
41
|
-
if (!workflowRecord(value) || value.schema !== "andeo.app-workflows/
|
|
41
|
+
if (!workflowRecord(value) || value.schema !== "andeo.app-workflows/v2"
|
|
42
42
|
|| Object.keys(value).some(key => !["schema", "declarations", "module", "sourceMap",
|
|
43
43
|
"compatibilityDate", "compatibilityFlags", "vars", "services"].includes(key)))
|
|
44
44
|
fail("invalid artifact shape");
|
|
45
|
-
const declarations =
|
|
45
|
+
const declarations = parseWorkflowDeclarationsV2(value.declarations);
|
|
46
46
|
if (!declarations.length)
|
|
47
47
|
fail("empty coordinator artifact");
|
|
48
48
|
if (typeof value.compatibilityDate !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(value.compatibilityDate)
|
|
@@ -78,11 +78,55 @@ export function parseWorkflowArtifact(value) {
|
|
|
78
78
|
fail("invalid module type");
|
|
79
79
|
const sourceMap = value.sourceMap === undefined ? undefined
|
|
80
80
|
: workflowFile(value.sourceMap, "workflow.mjs.map", MAX_COORDINATOR_SOURCE_MAP_BYTES);
|
|
81
|
-
return { schema: "andeo.app-workflows/
|
|
81
|
+
return { schema: "andeo.app-workflows/v2", declarations,
|
|
82
82
|
module: { ...module, contentType: "application/javascript+module" },
|
|
83
83
|
...(sourceMap ? { sourceMap } : {}), compatibilityDate: value.compatibilityDate,
|
|
84
84
|
compatibilityFlags: ["nodejs_compat"], vars, services: services.sort() };
|
|
85
85
|
}
|
|
86
|
+
export function parseWorkflowDeclarationsV2(value) {
|
|
87
|
+
if (!Array.isArray(value) || value.length > MAX_APP_WORKFLOWS)
|
|
88
|
+
fail("expected at most eight workflows");
|
|
89
|
+
const base = parseWorkflowDeclarations(value.map(item => workflowRecord(item)
|
|
90
|
+
? Object.fromEntries(Object.entries(item).filter(([key]) => key !== "publicEgress")) : item));
|
|
91
|
+
const policies = new Map();
|
|
92
|
+
for (const item of value) {
|
|
93
|
+
if (!workflowRecord(item) || Object.keys(item).some(key => !["name", "binding", "class_name", "publicEgress"].includes(key)))
|
|
94
|
+
fail("invalid v2 workflow declaration");
|
|
95
|
+
policies.set(String(item.name), parseWorkflowPublicEgress(item.publicEgress));
|
|
96
|
+
}
|
|
97
|
+
return base.map(item => ({ ...item, publicEgress: policies.get(item.name) }));
|
|
98
|
+
}
|
|
99
|
+
export function parseWorkflowPublicEgress(value) {
|
|
100
|
+
if (!workflowRecord(value) || Object.keys(value).some(key => key !== "https") || !Array.isArray(value.https)
|
|
101
|
+
|| value.https.length > 32)
|
|
102
|
+
fail("invalid public egress policy");
|
|
103
|
+
const destinations = value.https.map(item => {
|
|
104
|
+
if (!workflowRecord(item) || Object.keys(item).some(key => !["hostname", "port"].includes(key)) || item.port !== 443
|
|
105
|
+
|| typeof item.hostname !== "string")
|
|
106
|
+
fail("invalid HTTPS destination");
|
|
107
|
+
let url;
|
|
108
|
+
try {
|
|
109
|
+
url = new URL(`https://${item.hostname}/`);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
fail("invalid HTTPS hostname");
|
|
113
|
+
}
|
|
114
|
+
const hostname = url.hostname.toLowerCase().replace(/\.$/u, "");
|
|
115
|
+
if (!hostname || hostname.endsWith(".") || hostname.includes("..")
|
|
116
|
+
|| url.username || url.password || url.port || url.pathname !== "/" || url.search || url.hash
|
|
117
|
+
|| isForbiddenWorkflowHostname(hostname))
|
|
118
|
+
fail("unsafe HTTPS hostname");
|
|
119
|
+
return { hostname, port: 443 };
|
|
120
|
+
}).sort((a, b) => a.hostname.localeCompare(b.hostname));
|
|
121
|
+
if (new Set(destinations.map(item => item.hostname)).size !== destinations.length)
|
|
122
|
+
fail("duplicate HTTPS destination");
|
|
123
|
+
return { https: destinations };
|
|
124
|
+
}
|
|
125
|
+
function isForbiddenWorkflowHostname(hostname) {
|
|
126
|
+
if (hostname.startsWith("[") || /^(?:\d{1,3}\.){3}\d{1,3}$/u.test(hostname))
|
|
127
|
+
return true;
|
|
128
|
+
return ["localhost", "local", "internal", "invalid", "test", "example"].some(suffix => hostname === suffix || hostname.endsWith(`.${suffix}`));
|
|
129
|
+
}
|
|
86
130
|
function workflowFile(value, path, max) {
|
|
87
131
|
if (!workflowRecord(value) || value.path !== path || typeof value.sha256 !== "string"
|
|
88
132
|
|| !/^[a-f0-9]{64}$/.test(value.sha256) || typeof value.bytes !== "number"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-contract.js","sourceRoot":"","sources":["../src/workflow-contract.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,qEAAqE;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACtD,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow-contract.js","sourceRoot":"","sources":["../src/workflow-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const LOCAL_WORKFLOW_HOST = "import {WorkerEntrypoint,RpcTarget} from \"cloudflare:workers\";\nimport {createDynamicWorkflowEntrypoint,wrapWorkflowBinding} from \"@cloudflare/dynamic-workflows\";\nexport {DynamicWorkflowBinding} from \"@cloudflare/dynamic-workflows\";\nasync function physical(name,id){return \"local_\"+Array.from(new Uint8Array(await crypto.subtle.digest(\"SHA-256\",new TextEncoder().encode(name+\":\"+id))),b=>b.toString(16).padStart(2,\"0\")).join(\"\");}\nclass Instance extends RpcTarget {\n #native; #id;\n constructor(native,id){super();this.#native=native;this.#id=id;}\n get id(){return this.#id;}\n async status(){const result=await this.#native.status();return {id:this.#id,status:result.status,...(result.error?{error:{code:\"app_workflow_execution_failed\"}}:{})};}\n sendEvent(event){return this.#native.sendEvent(event);}\n pause(){return this.#native.pause();} resume(){return this.#native.resume();} terminate(){return this.#native.terminate();} restart(){return this.#native.restart();}\n}\nexport class AppWorkflowBinding extends WorkerEntrypoint {\n async create(options={}) {const id=options.id??crypto.randomUUID();const native=await wrapWorkflowBinding({name:this.ctx.props.name,localId:id}).create({id:await physical(this.ctx.props.name,id),params:options.params??{}});return new Instance(native,id);}\n async get(id){return new Instance(await this.env.WORKFLOWS.get(await physical(this.ctx.props.name,id)),id);}\n async createBatch(items){const results=[];for(const item of items){try{const run=await this.create(item);results.push({id:await run.id,accepted:true});}catch{results.push({id:item.id,accepted:false,error:\"app_workflow_operation_failed\"});}}return results;}\n}\nclass Services extends RpcTarget {\n #env; #names;\n constructor(env,names){super();this.#env=env;this.#names=names;}\n async observeStep() {}\n invoke(name,request){if(!this.#names.includes(name))throw new Error(\"app_workflow_service_not_authorized\");return this.#env[name].fetch(request);}\n}\nexport const DynamicWorkflow=createDynamicWorkflowEntrypoint(async({env,metadata})=>{\n const config=JSON.parse(env.CONFIG),declaration=config.artifact.declarations.find(d=>d.name===metadata.name);\n if(!declaration)throw new Error(\"app_workflow_scope_invalid\");\n // Match hosted
|
|
1
|
+
export declare const LOCAL_WORKFLOW_HOST = "import {WorkerEntrypoint,RpcTarget} from \"cloudflare:workers\";\nimport {createDynamicWorkflowEntrypoint,wrapWorkflowBinding} from \"@cloudflare/dynamic-workflows\";\nexport {DynamicWorkflowBinding} from \"@cloudflare/dynamic-workflows\";\nimport {workflowEgressFetch} from \"./workflow-egress.js\";\nasync function physical(name,id){return \"local_\"+Array.from(new Uint8Array(await crypto.subtle.digest(\"SHA-256\",new TextEncoder().encode(name+\":\"+id))),b=>b.toString(16).padStart(2,\"0\")).join(\"\");}\nclass Instance extends RpcTarget {\n #native; #id;\n constructor(native,id){super();this.#native=native;this.#id=id;}\n get id(){return this.#id;}\n async status(){const result=await this.#native.status();return {id:this.#id,status:result.status,\n ...(result.output!==undefined?{output:result.output}:{}),...(result.error?{error:{code:\"app_workflow_execution_failed\"}}:{})};}\n sendEvent(event){return this.#native.sendEvent(event);}\n pause(){return this.#native.pause();} resume(){return this.#native.resume();} terminate(){return this.#native.terminate();} restart(){return this.#native.restart();}\n}\nexport class AppWorkflowBinding extends WorkerEntrypoint {\n async create(options={}) {const id=options.id??crypto.randomUUID();const native=await wrapWorkflowBinding({name:this.ctx.props.name,localId:id}).create({id:await physical(this.ctx.props.name,id),params:options.params??{}});return new Instance(native,id);}\n async get(id){return new Instance(await this.env.WORKFLOWS.get(await physical(this.ctx.props.name,id)),id);}\n async createBatch(items){const results=[];for(const item of items){try{const run=await this.create(item);results.push({id:await run.id,accepted:true});}catch{results.push({id:item.id,accepted:false,error:\"app_workflow_operation_failed\"});}}return results;}\n}\nclass Services extends RpcTarget {\n #env; #names;\n constructor(env,names){super();this.#env=env;this.#names=names;}\n async observeStep() {}\n invoke(name,request){if(!this.#names.includes(name))throw new Error(\"app_workflow_service_not_authorized\");return this.#env[name].fetch(request);}\n}\nexport class WorkflowOutbound extends WorkerEntrypoint {fetch(request){return workflowEgressFetch(request,this.ctx.props.policy);}}\nexport const DynamicWorkflow=createDynamicWorkflowEntrypoint(async({env,metadata,ctx})=>{\n const config=JSON.parse(env.CONFIG),declaration=config.artifact.declarations.find(d=>d.name===metadata.name);\n if(!declaration)throw new Error(\"app_workflow_scope_invalid\");\n // Match hosted deny-by-default policy; never expose host env/bindings.\n const policy=declaration.publicEgress;\n const network=policy.https.length?ctx.exports.WorkflowOutbound({props:{policy}}):null;\n const worker=env.LOADER.get(\"public-internet-v4-policy:\"+config.artifact.module.sha256+\":\"+declaration.name+\":\"+JSON.stringify(policy),()=>({compatibilityDate:config.artifact.compatibilityDate,compatibilityFlags:config.artifact.compatibilityFlags,\n mainModule:\"coordinator.mjs\",modules:{\"coordinator.mjs\":{js:config.wrappers[declaration.name]},\"workflow.mjs\":{js:config.code}},env:config.artifact.vars,limits:{cpuMs:50,subRequests:50},globalOutbound:network}));\n return {run(event,step){return worker.getEntrypoint(\"AndeoCoordinator\").run({...event,instanceId:metadata.localId},step,new Services(env,config.artifact.services));}};\n});\nexport default {fetch(){return new Response(\"Not found\",{status:404});}};";
|
|
2
2
|
//# sourceMappingURL=workflow-dev-host.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-dev-host.d.ts","sourceRoot":"","sources":["../src/workflow-dev-host.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,mBAAmB,
|
|
1
|
+
{"version":3,"file":"workflow-dev-host.d.ts","sourceRoot":"","sources":["../src/workflow-dev-host.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,mBAAmB,44GAoC0C,CAAC"}
|
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
export const LOCAL_WORKFLOW_HOST = `import {WorkerEntrypoint,RpcTarget} from "cloudflare:workers";
|
|
3
3
|
import {createDynamicWorkflowEntrypoint,wrapWorkflowBinding} from "@cloudflare/dynamic-workflows";
|
|
4
4
|
export {DynamicWorkflowBinding} from "@cloudflare/dynamic-workflows";
|
|
5
|
+
import {workflowEgressFetch} from "./workflow-egress.js";
|
|
5
6
|
async function physical(name,id){return "local_"+Array.from(new Uint8Array(await crypto.subtle.digest("SHA-256",new TextEncoder().encode(name+":"+id))),b=>b.toString(16).padStart(2,"0")).join("");}
|
|
6
7
|
class Instance extends RpcTarget {
|
|
7
8
|
#native; #id;
|
|
8
9
|
constructor(native,id){super();this.#native=native;this.#id=id;}
|
|
9
10
|
get id(){return this.#id;}
|
|
10
|
-
async status(){const result=await this.#native.status();return {id:this.#id,status:result.status
|
|
11
|
+
async status(){const result=await this.#native.status();return {id:this.#id,status:result.status,
|
|
12
|
+
...(result.output!==undefined?{output:result.output}:{}),...(result.error?{error:{code:"app_workflow_execution_failed"}}:{})};}
|
|
11
13
|
sendEvent(event){return this.#native.sendEvent(event);}
|
|
12
14
|
pause(){return this.#native.pause();} resume(){return this.#native.resume();} terminate(){return this.#native.terminate();} restart(){return this.#native.restart();}
|
|
13
15
|
}
|
|
@@ -22,12 +24,15 @@ class Services extends RpcTarget {
|
|
|
22
24
|
async observeStep() {}
|
|
23
25
|
invoke(name,request){if(!this.#names.includes(name))throw new Error("app_workflow_service_not_authorized");return this.#env[name].fetch(request);}
|
|
24
26
|
}
|
|
25
|
-
export
|
|
27
|
+
export class WorkflowOutbound extends WorkerEntrypoint {fetch(request){return workflowEgressFetch(request,this.ctx.props.policy);}}
|
|
28
|
+
export const DynamicWorkflow=createDynamicWorkflowEntrypoint(async({env,metadata,ctx})=>{
|
|
26
29
|
const config=JSON.parse(env.CONFIG),declaration=config.artifact.declarations.find(d=>d.name===metadata.name);
|
|
27
30
|
if(!declaration)throw new Error("app_workflow_scope_invalid");
|
|
28
|
-
// Match hosted
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
+
// Match hosted deny-by-default policy; never expose host env/bindings.
|
|
32
|
+
const policy=declaration.publicEgress;
|
|
33
|
+
const network=policy.https.length?ctx.exports.WorkflowOutbound({props:{policy}}):null;
|
|
34
|
+
const worker=env.LOADER.get("public-internet-v4-policy:"+config.artifact.module.sha256+":"+declaration.name+":"+JSON.stringify(policy),()=>({compatibilityDate:config.artifact.compatibilityDate,compatibilityFlags:config.artifact.compatibilityFlags,
|
|
35
|
+
mainModule:"coordinator.mjs",modules:{"coordinator.mjs":{js:config.wrappers[declaration.name]},"workflow.mjs":{js:config.code}},env:config.artifact.vars,limits:{cpuMs:50,subRequests:50},globalOutbound:network}));
|
|
31
36
|
return {run(event,step){return worker.getEntrypoint("AndeoCoordinator").run({...event,instanceId:metadata.localId},step,new Services(env,config.artifact.services));}};
|
|
32
37
|
});
|
|
33
38
|
export default {fetch(){return new Response("Not found",{status:404});}};`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-dev-host.js","sourceRoot":"","sources":["../src/workflow-dev-host.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,CAAC,MAAM,mBAAmB,GAAG
|
|
1
|
+
{"version":3,"file":"workflow-dev-host.js","sourceRoot":"","sources":["../src/workflow-dev-host.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0EAoCuC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-dev.d.ts","sourceRoot":"","sources":["../src/workflow-dev.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAqC,MAAM,WAAW,CAAC;AASzE;mFACmF;AACnF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,SAAO,
|
|
1
|
+
{"version":3,"file":"workflow-dev.d.ts","sourceRoot":"","sources":["../src/workflow-dev.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAqC,MAAM,WAAW,CAAC;AASzE;mFACmF;AACnF,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,SAAO,sBAwElF"}
|
package/dist/workflow-dev.js
CHANGED
|
@@ -39,19 +39,23 @@ export async function startWorkflowDev(root, directory, port = 8787) {
|
|
|
39
39
|
async function appEnv(appDirectory, scope) {
|
|
40
40
|
const { envelope: { manifest } } = await verifyArtifact(appDirectory);
|
|
41
41
|
const bindings = Object.fromEntries(Object.entries(manifest.vars ?? {}).map(([name, value]) => [name, text(String(value))]));
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
42
|
+
const localNames = [...(manifest.runtimeVars ?? []), ...(manifest.secrets ?? [])];
|
|
43
|
+
let localValues = {};
|
|
44
|
+
try {
|
|
45
|
+
localValues = parseEnv(await readFile(resolve(appDirectory, ".dev.vars"), "utf8"));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
if (localNames.length)
|
|
48
49
|
throw new Error("Put local-only declared secrets in .dev.vars beside its artifact. Secret values are never printed.");
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
50
|
+
}
|
|
51
|
+
for (const [name, value] of Object.entries(localValues)) {
|
|
52
|
+
if (/^[A-Za-z][A-Za-z0-9_]*$/u.test(name) && !(name in bindings) && value !== undefined)
|
|
53
|
+
bindings[name] = text(value);
|
|
54
|
+
}
|
|
55
|
+
for (const name of localNames) {
|
|
56
|
+
if (!(name in localValues))
|
|
57
|
+
throw new Error(manifest.secrets?.includes(name) ? "app_workflow_dev_secret_missing" : "app_workflow_dev_runtime_var_missing");
|
|
58
|
+
bindings[name] = text(localValues[name]);
|
|
55
59
|
}
|
|
56
60
|
for (const resource of manifest.resources) {
|
|
57
61
|
if (!workflowRecord(resource) || typeof resource.name !== "string")
|
package/dist/workflow-dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-dev.js","sourceRoot":"","sources":["../src/workflow-dev.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"workflow-dev.js","sourceRoot":"","sources":["../src/workflow-dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAsB,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAI7D;mFACmF;AACnF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,SAAiB,EAAE,IAAI,GAAG,IAAI;IACjF,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;IACnG,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACrE,IAAI,QAAQ,GAA0B,EAAE,CAAC;IACzC,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,eAAe,CAAC,OAAO,CAAC,IAAI,EAAC,yBAAyB,CAAC,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QAC3H,MAAM,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,4GAA4G,CAAC,CAAC;QAAC,CAAC;QACxI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAChJ,QAAQ,GAAG,KAA8B,CAAC;QAC1C,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC5G,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,GAAa,EAAE,MAAc,EAAE,iBAAyB,EAAE,MAAe,EAAiB,EAAE,CAAC,CAAC,EAAC,MAAM,EAAC;YAClI,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAC,iBAAiB,EAAC,kBAAkB,EAAC,CAAC,eAAe,CAAC,EAAC,GAAG;YAC7E,QAAQ,EAAC,EAAC,UAAU,EAAC,WAAW,EAAC,WAAW,EAAC,IAAI,EAAC,OAAO,EAAC,EAAC,WAAW,EAAC,EAAC,IAAI,EAAC,KAAK,EAAC,QAAQ,EAAC,MAAM,EAAC,EAAC,EAAC;YACrG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAC,MAAM,EAAC,EAAC,SAAS,EAAC,MAAM,EAAC,cAAc,EAAC,IAAI,EAAC,aAAa,EAAC,IAAI,EAAC,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACtF,EAAC,CAAC,CAAC;IACJ,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,EAAC,IAAI,EAAC,MAAe,EAAC,KAAK,EAAC,CAAC,CAAC;IAC/D,KAAK,UAAU,MAAM,CAAC,YAAoB,EAAE,KAAa;QACvD,MAAM,EAAC,QAAQ,EAAC,EAAC,QAAQ,EAAC,EAAC,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAa,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrI,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAClF,IAAI,WAAW,GAAsC,EAAE,CAAC;QACxD,IAAI,CAAC;YAAC,WAAW,GAAG,QAAQ,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAC,WAAW,CAAC,EAAC,MAAM,CAAC,CAAC,CAAC;QAAC,CAAC;QACzF,MAAM,CAAC;YAAC,IAAI,UAAU,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,oGAAoG,CAAC,CAAC;QAAC,CAAC;QACvJ,KAAK,MAAM,CAAC,IAAI,EAAC,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACvD,IAAI,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,SAAS;gBAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxH,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,IAAI,IAAI,WAAW,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC;YAC3J,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAE,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACzH,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI;gBAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAC,CAAC;iBAC5F,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI;gBAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAC,CAAC;iBACjG,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI;gBAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,GAAG,KAAK,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAC,CAAC;;gBACnG,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAChE,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACxC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACjJ,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAC,IAAI,EAAC,QAAQ,EAAC,MAAM,EAAC,WAAW,OAAO,CAAC,IAAI,EAAE,EAAC,CAAC;QAC5E,CAAC;QACD,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM;YAAE,QAAQ,CAAC,MAAM,GAAG,EAAC,IAAI,EAAC,QAAQ,EAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,SAAS,EAAC,KAAK,CAAC,CAAC;IAClD,KAAK,MAAM,WAAW,IAAI,SAAS,CAAC,YAAY;QAAE,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG;YACnF,IAAI,EAAC,QAAQ,EAAC,MAAM,EAAC,eAAe,EAAC,UAAU,EAAC,oBAAoB,EAAC,KAAK,EAAC,EAAC,IAAI,EAAC,WAAW,CAAC,IAAI,EAAC;SACnG,CAAC;IACF,MAAM,OAAO,GAAa,EAAC,MAAM,EAAC,EAAC,IAAI,EAAC,eAAe,EAAC,EAAC,SAAS,EAAC,EAAC,IAAI,EAAC,UAAU,EAAC,IAAI,EAAC,uBAAuB,EAAC,MAAM,EAAC,eAAe,EAAC,UAAU,EAAC,iBAAiB,EAAC;QACnK,MAAM,EAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,QAAQ,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAC,cAAc,CAAC,EAAC,MAAM,CAAC;YAC1G,QAAQ,EAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAC,yBAAyB,CAAC,CAAC,CAAC,UAAU,EAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC;KACvI,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,EAAC,WAAW,EAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAC,YAAY,CAAC,EAAC,MAAM,CAAC,EAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAC3J,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACtF,KAAK,MAAM,CAAC,IAAI,EAAC,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAC/F,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAC,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QAC1E,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAC3H,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,EAAC,MAAM,MAAM,CAAC,MAAM,EAAC,WAAW,IAAI,EAAE,CAAC,EAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAC,YAAY,CAAC,EAAC,MAAM,CAAC,EAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAC1L,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,GAAG,EAAC,IAAI,EAAC,QAAQ,EAAC,MAAM,EAAC,WAAW,IAAI,EAAE,EAAC,CAAC;IAC3D,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAC,KAAK,EAAC,EAAC,QAAQ,EAAC,mBAAmB,EAAC,UAAU,EAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAC;QAChH,MAAM,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,QAAQ,EAAC,SAAS,EAAC,KAAK,EAAC,KAAK,EAAC,QAAQ,EAAC,CAAC,cAAc,EAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;IACrH,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAC,OAAO,EAAC,IAAI,EAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAC,yBAAyB,CAAC,CAAC;IACtD,MAAM,KAAK,CAAC,KAAK,EAAC,EAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,EAAC,IAAI,EAAC,WAAW,EAAC,IAAI,EAAC,EAAE,EAAC,KAAK,EAAC,SAAS,EAAC,EAAC,OAAO,EAAC,KAAK,EAAC,EAAC,GAAG,EAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAC,WAAW,EAAC,KAAK;QAClI,uBAAuB,EAAC,KAAK,EAAC,eAAe,EAAC,OAAO,CAAC,KAAK,EAAC,KAAK,CAAC,EAAC,OAAO,EAAC,CAAC,CAAC;IAC/E,IAAI,CAAC;QAAC,MAAM,OAAO,CAAC,KAAK,CAAC;QAAC,OAAO,OAAO,CAAC;IAAC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;AACtG,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type WorkflowPublicEgress } from "./workflow-contract.js";
|
|
2
|
+
export declare const WORKFLOW_EGRESS_CONFIG = "andeo.workflow-egress.json";
|
|
3
|
+
export declare const WORKFLOW_EGRESS_SCHEMA = "andeo.workflow-egress/v1";
|
|
4
|
+
export declare class WorkflowEgressError extends Error {
|
|
5
|
+
readonly code: string;
|
|
6
|
+
constructor(code: string);
|
|
7
|
+
}
|
|
8
|
+
export declare function parseWorkflowEgressConfig(value: unknown, workflowNames: string[]): Record<string, WorkflowPublicEgress>;
|
|
9
|
+
export declare function workflowEgressFetch(request: Request, policy: WorkflowPublicEgress, fetcher?: (request: Request) => Promise<Response>): Promise<Response>;
|
|
10
|
+
//# sourceMappingURL=workflow-egress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-egress.d.ts","sourceRoot":"","sources":["../src/workflow-egress.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9G,eAAO,MAAM,sBAAsB,+BAA+B,CAAC;AACnE,eAAO,MAAM,sBAAsB,6BAA6B,CAAC;AACjE,qBAAa,mBAAoB,SAAQ,KAAK;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAjC,YAAqB,IAAI,EAAE,MAAM,EAAkB;CACpD;AACD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAC,oBAAoB,CAAC,CAQtH;AACD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EACtF,OAAO,GAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAA6B,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoBjG"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { parseWorkflowPublicEgress, workflowRecord } from "./workflow-contract.js";
|
|
2
|
+
export const WORKFLOW_EGRESS_CONFIG = "andeo.workflow-egress.json";
|
|
3
|
+
export const WORKFLOW_EGRESS_SCHEMA = "andeo.workflow-egress/v1";
|
|
4
|
+
export class WorkflowEgressError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
constructor(code) {
|
|
7
|
+
super(code);
|
|
8
|
+
this.code = code;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function parseWorkflowEgressConfig(value, workflowNames) {
|
|
12
|
+
if (value === undefined)
|
|
13
|
+
return Object.fromEntries(workflowNames.map(name => [name, { https: [] }]));
|
|
14
|
+
if (!workflowRecord(value) || value.schema !== WORKFLOW_EGRESS_SCHEMA || !workflowRecord(value.workflows)
|
|
15
|
+
|| Object.keys(value).some(key => !["schema", "workflows"].includes(key)))
|
|
16
|
+
throw new Error("app_workflow_egress_config_invalid");
|
|
17
|
+
const workflows = value.workflows;
|
|
18
|
+
const expected = [...workflowNames].sort(), actual = Object.keys(workflows).sort();
|
|
19
|
+
if (JSON.stringify(expected) !== JSON.stringify(actual))
|
|
20
|
+
throw new Error("app_workflow_egress_config_mismatch");
|
|
21
|
+
return Object.fromEntries(expected.map(name => [name, parseWorkflowPublicEgress(workflows[name])]));
|
|
22
|
+
}
|
|
23
|
+
export async function workflowEgressFetch(request, policy, fetcher = request => fetch(request)) {
|
|
24
|
+
let retainedPolicy;
|
|
25
|
+
try {
|
|
26
|
+
retainedPolicy = parseWorkflowPublicEgress(policy);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
throw new WorkflowEgressError("app_workflow_egress_denied");
|
|
30
|
+
}
|
|
31
|
+
let url = validate(request.url, retainedPolicy), method = request.method.toUpperCase();
|
|
32
|
+
let current = safeRequest(url, request);
|
|
33
|
+
for (let hop = 0; hop <= 5; hop++) {
|
|
34
|
+
const response = await fetcher(current);
|
|
35
|
+
if (![301, 302, 303, 307, 308].includes(response.status))
|
|
36
|
+
return response;
|
|
37
|
+
if (hop === 5) {
|
|
38
|
+
await response.body?.cancel();
|
|
39
|
+
throw new WorkflowEgressError("app_workflow_egress_redirect_limit");
|
|
40
|
+
}
|
|
41
|
+
const location = response.headers.get("location");
|
|
42
|
+
if (!location)
|
|
43
|
+
return response;
|
|
44
|
+
if (method !== "GET" && method !== "HEAD") {
|
|
45
|
+
await response.body?.cancel();
|
|
46
|
+
throw new WorkflowEgressError("app_workflow_egress_redirect_denied");
|
|
47
|
+
}
|
|
48
|
+
let next;
|
|
49
|
+
try {
|
|
50
|
+
next = new URL(location, url);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
await response.body?.cancel();
|
|
54
|
+
throw new WorkflowEgressError("app_workflow_egress_redirect_denied");
|
|
55
|
+
}
|
|
56
|
+
await response.body?.cancel();
|
|
57
|
+
url = validate(next.href, retainedPolicy);
|
|
58
|
+
current = safeRequest(url, new Request(current, { method, body: null }));
|
|
59
|
+
}
|
|
60
|
+
throw new WorkflowEgressError("app_workflow_egress_redirect_limit");
|
|
61
|
+
}
|
|
62
|
+
function validate(value, policy) {
|
|
63
|
+
let url;
|
|
64
|
+
try {
|
|
65
|
+
url = new URL(value);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
throw new WorkflowEgressError("app_workflow_egress_denied");
|
|
69
|
+
}
|
|
70
|
+
const hostname = url.hostname.toLowerCase().replace(/\.$/u, "");
|
|
71
|
+
if (url.protocol !== "https:" || url.username || url.password || url.hash || (url.port && url.port !== "443")
|
|
72
|
+
|| !hostname || hostname.endsWith(".") || hostname.includes("..")
|
|
73
|
+
|| !policy.https.some(item => item.hostname === hostname && item.port === 443))
|
|
74
|
+
throw new WorkflowEgressError("app_workflow_egress_denied");
|
|
75
|
+
url.hostname = hostname;
|
|
76
|
+
url.port = "";
|
|
77
|
+
return url;
|
|
78
|
+
}
|
|
79
|
+
function safeRequest(url, request) {
|
|
80
|
+
const headers = new Headers(request.headers);
|
|
81
|
+
for (const name of [...headers.keys()])
|
|
82
|
+
if (unsafeHeader(name))
|
|
83
|
+
headers.delete(name);
|
|
84
|
+
const noBody = ["GET", "HEAD"].includes(request.method.toUpperCase());
|
|
85
|
+
const init = { method: request.method, headers, body: noBody ? null : request.body,
|
|
86
|
+
redirect: "manual", signal: request.signal };
|
|
87
|
+
if (!noBody && request.body)
|
|
88
|
+
init.duplex = "half";
|
|
89
|
+
return new Request(url, init);
|
|
90
|
+
}
|
|
91
|
+
function unsafeHeader(name) {
|
|
92
|
+
const key = name.toLowerCase();
|
|
93
|
+
return ["authorization", "cookie", "host", "proxy-authorization", "forwarded", "connection", "keep-alive", "te", "trailer", "transfer-encoding", "upgrade", "via", "x-real-ip"].includes(key)
|
|
94
|
+
|| key.startsWith("cf-") || key.startsWith("x-forwarded-") || key.startsWith("proxy-");
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=workflow-egress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-egress.js","sourceRoot":"","sources":["../src/workflow-egress.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-package.d.ts","sourceRoot":"","sources":["../src/workflow-package.ts"],"names":[],"mappings":"AAUA;;kEAEkE;AAClE,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"workflow-package.d.ts","sourceRoot":"","sources":["../src/workflow-package.ts"],"names":[],"mappings":"AAUA;;kEAEkE;AAClE,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkGtH"}
|
package/dist/workflow-package.js
CHANGED
|
@@ -24,7 +24,8 @@ export async function packageAppWorkflows(root, artifactDirectory, environment)
|
|
|
24
24
|
}));
|
|
25
25
|
if (verified.envelope.manifest.workflows) {
|
|
26
26
|
const retained = verified.envelope.manifest.workflows;
|
|
27
|
-
|
|
27
|
+
const declarations = config.declarations.map(item => ({ ...item, publicEgress: config.egress[item.name] }));
|
|
28
|
+
if (retained.schema !== "andeo.app-workflows/v2" || JSON.stringify(retained.declarations) !== JSON.stringify(declarations)
|
|
28
29
|
|| retained.compatibilityDate !== config.compatibilityDate
|
|
29
30
|
|| JSON.stringify(Object.entries(retained.vars).sort()) !== JSON.stringify(Object.entries(vars).sort())) {
|
|
30
31
|
throw new Error("app_workflow_declaration_mismatch");
|
|
@@ -67,7 +68,7 @@ export async function packageAppWorkflows(root, artifactDirectory, environment)
|
|
|
67
68
|
const map = coordinator.outputFiles.find(file => file.path.endsWith("/workflow.mjs.map")).contents;
|
|
68
69
|
const descriptor = (path, bytes) => ({ path, sha256: hash(bytes), bytes: bytes.byteLength });
|
|
69
70
|
const workflows = parseWorkflowArtifact({
|
|
70
|
-
schema: "andeo.app-workflows/
|
|
71
|
+
schema: "andeo.app-workflows/v2", declarations: config.declarations.map(item => ({ ...item, publicEgress: config.egress[item.name] })),
|
|
71
72
|
module: { ...descriptor("workflow.mjs", code), contentType: "application/javascript+module" },
|
|
72
73
|
sourceMap: descriptor("workflow.mjs.map", map), compatibilityDate: config.compatibilityDate,
|
|
73
74
|
compatibilityFlags: ["nodejs_compat"], vars, services,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-package.js","sourceRoot":"","sources":["../src/workflow-package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D;;kEAEkE;AAClE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY,EAAE,iBAAyB,EAAE,WAAoB;IACrG,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM;QAAE,OAAO;IACzC,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAE,MAAiC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1G,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACxF,OAAO,CAAC,IAAI,EAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC,CAAC;IACJ,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;QACtD,IAAI,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"workflow-package.js","sourceRoot":"","sources":["../src/workflow-package.ts"],"names":[],"mappings":"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"}
|