woml-cli 1.0.1

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.
@@ -0,0 +1,172 @@
1
+ // @bun
2
+ // src/custom-notification-provider/worker.ts
3
+ import { parentPort } from "worker_threads";
4
+ var AsyncFunction = Object.getPrototypeOf(async function empty() {}).constructor;
5
+ function deepFreeze(value, seen = new WeakSet) {
6
+ if (typeof value !== "object" || value === null)
7
+ return value;
8
+ if (seen.has(value))
9
+ return value;
10
+ seen.add(value);
11
+ for (const child of Object.values(value))
12
+ deepFreeze(child, seen);
13
+ return Object.freeze(value);
14
+ }
15
+ function sensitiveStrings(value, found = []) {
16
+ if (typeof value === "string" && value.length > 0)
17
+ found.push(value);
18
+ else if (Array.isArray(value)) {
19
+ for (const child of value)
20
+ sensitiveStrings(child, found);
21
+ } else if (typeof value === "object" && value !== null) {
22
+ for (const child of Object.values(value))
23
+ sensitiveStrings(child, found);
24
+ }
25
+ return found;
26
+ }
27
+ function redact(message, props, notification) {
28
+ let safe = message;
29
+ for (const value of sensitiveStrings({ props, notification }).sort((left, right) => right.length - left.length)) {
30
+ safe = safe.split(value).join("[REDACTED]");
31
+ }
32
+ return safe.slice(0, 1024);
33
+ }
34
+ function printable(value) {
35
+ if (typeof value === "string")
36
+ return value;
37
+ if (value === undefined || value === null || typeof value === "number" || typeof value === "boolean" || typeof value === "bigint") {
38
+ return String(value);
39
+ }
40
+ try {
41
+ return JSON.stringify(value);
42
+ } catch {
43
+ return Object.prototype.toString.call(value);
44
+ }
45
+ }
46
+ function managedConsole(props, notification) {
47
+ const sensitive = sensitiveStrings({
48
+ props,
49
+ idempotencyKey: notification.idempotencyKey,
50
+ actions: notification.actions
51
+ }).sort((left, right) => right.length - left.length);
52
+ const write = (...values) => {
53
+ let message = values.map(printable).join(" ");
54
+ for (const value of sensitive) {
55
+ message = message.split(value).join("[REDACTED]");
56
+ }
57
+ process.stderr.write(`${message.slice(0, 4096)}
58
+ `);
59
+ };
60
+ return deepFreeze({
61
+ debug: write,
62
+ error: write,
63
+ info: write,
64
+ log: write,
65
+ warn: write
66
+ });
67
+ }
68
+ function validReceipt(value) {
69
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
70
+ return false;
71
+ }
72
+ const record = value;
73
+ return Object.keys(record).every((key) => key === "messageId") && (record.messageId === undefined || typeof record.messageId === "string" && record.messageId.length >= 1 && [...record.messageId].length <= 512);
74
+ }
75
+
76
+ class ManagedServiceError extends Error {
77
+ retryable;
78
+ constructor(message, retryable) {
79
+ super(message);
80
+ this.retryable = retryable;
81
+ this.name = "ManagedServiceError";
82
+ }
83
+ }
84
+ var services = deepFreeze({
85
+ http: {
86
+ async request(input) {
87
+ if (typeof input !== "object" || input === null || typeof input.url !== "string") {
88
+ throw new TypeError("services.http.request() requires a request object with a URL.");
89
+ }
90
+ const url = new URL(input.url);
91
+ for (const [name, raw] of Object.entries(input.query ?? {})) {
92
+ for (const value of Array.isArray(raw) ? raw : [raw]) {
93
+ if (value !== undefined && value !== null) {
94
+ url.searchParams.append(name, String(value));
95
+ }
96
+ }
97
+ }
98
+ const timeoutMs = input.timeoutMs ?? 30000;
99
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 86400000) {
100
+ throw new TypeError("Managed HTTP timeout must be between 1 ms and 24 hours.");
101
+ }
102
+ if (input.json !== undefined && input.text !== undefined) {
103
+ throw new TypeError("Managed HTTP accepts only one of json or text.");
104
+ }
105
+ const headers = new Headers(input.headers);
106
+ let body;
107
+ if (input.json !== undefined) {
108
+ if (!headers.has("content-type")) {
109
+ headers.set("content-type", "application/json");
110
+ }
111
+ body = JSON.stringify(input.json);
112
+ } else if (input.text !== undefined) {
113
+ body = input.text;
114
+ }
115
+ let response;
116
+ try {
117
+ response = await fetch(url, {
118
+ method: input.method?.toUpperCase() ?? "GET",
119
+ headers,
120
+ body,
121
+ signal: AbortSignal.timeout(timeoutMs)
122
+ });
123
+ } catch {
124
+ throw new ManagedServiceError("The managed HTTP request failed.", true);
125
+ }
126
+ const accepted = input.acceptedStatus ?? { minimum: 200, maximum: 299 };
127
+ if (response.status < accepted.minimum || response.status > accepted.maximum) {
128
+ throw new ManagedServiceError(`The managed HTTP response status ${response.status} is outside the accepted range.`, response.status === 429 || response.status >= 500);
129
+ }
130
+ const data = input.responseType === "text" ? await response.text() : await response.json();
131
+ return deepFreeze({
132
+ ok: response.ok,
133
+ status: response.status,
134
+ headers: Object.fromEntries(response.headers.entries()),
135
+ data,
136
+ url: response.url,
137
+ redirected: response.redirected
138
+ });
139
+ }
140
+ }
141
+ });
142
+ async function execute(request) {
143
+ try {
144
+ const run = new AsyncFunction("props", "notification", "attempt", "services", "console", `"use strict";
145
+ ${request.source}`);
146
+ const result = await run(deepFreeze(structuredClone(request.props)), deepFreeze(structuredClone(request.notification)), deepFreeze(structuredClone(request.attempt)), services, managedConsole(request.props, request.notification));
147
+ if (!validReceipt(result)) {
148
+ return {
149
+ ok: false,
150
+ kind: "non_json",
151
+ message: "Provider scripts must return {} or { messageId: string }.",
152
+ retryable: false
153
+ };
154
+ }
155
+ return { ok: true, receipt: result };
156
+ } catch (error) {
157
+ const raw = error instanceof Error ? error.message : String(error);
158
+ return {
159
+ ok: false,
160
+ kind: error instanceof ManagedServiceError ? "service_failed" : "script_threw",
161
+ message: redact(raw, request.props, request.notification),
162
+ retryable: error instanceof ManagedServiceError && error.retryable
163
+ };
164
+ }
165
+ }
166
+ if (parentPort === null)
167
+ throw new Error("Custom provider worker requires a parent port.");
168
+ parentPort.once("message", async (request) => {
169
+ parentPort.postMessage(await execute(request));
170
+ });
171
+
172
+ //# debugId=09369A9DB883B22564756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/custom-notification-provider/worker.ts"],
4
+ "sourcesContent": [
5
+ "import { parentPort } from 'node:worker_threads';\n\nimport type {\n CustomNotificationRequest,\n CustomProviderReceipt,\n} from './types';\n\ninterface WorkerRequest {\n readonly source: string;\n readonly props: Readonly<Record<string, unknown>>;\n readonly notification: CustomNotificationRequest;\n readonly attempt: { readonly number: number; readonly max: number };\n}\n\ntype WorkerResponse =\n | { readonly ok: true; readonly receipt: CustomProviderReceipt }\n | {\n readonly ok: false;\n readonly kind: 'script_threw' | 'non_json' | 'service_failed';\n readonly message: string;\n readonly retryable: boolean;\n };\n\ntype AsyncFunction = (...args: unknown[]) => Promise<unknown>;\ntype AsyncFunctionConstructor = new (\n ...parametersAndBody: string[]\n) => AsyncFunction;\nconst AsyncFunction = Object.getPrototypeOf(\n async function empty() {}\n).constructor as AsyncFunctionConstructor;\n\nfunction deepFreeze<T>(value: T, seen = new WeakSet<object>()): T {\n if (typeof value !== 'object' || value === null) return value;\n if (seen.has(value)) return value;\n seen.add(value);\n for (const child of Object.values(value)) deepFreeze(child, seen);\n return Object.freeze(value);\n}\n\nfunction sensitiveStrings(value: unknown, found: string[] = []): string[] {\n if (typeof value === 'string' && value.length > 0) found.push(value);\n else if (Array.isArray(value)) {\n for (const child of value) sensitiveStrings(child, found);\n } else if (typeof value === 'object' && value !== null) {\n for (const child of Object.values(value)) sensitiveStrings(child, found);\n }\n return found;\n}\n\nfunction redact(\n message: string,\n props: Readonly<Record<string, unknown>>,\n notification: CustomNotificationRequest\n): string {\n let safe = message;\n for (const value of sensitiveStrings({ props, notification }).sort(\n (left, right) => right.length - left.length\n )) {\n safe = safe.split(value).join('[REDACTED]');\n }\n return safe.slice(0, 1024);\n}\n\nfunction printable(value: unknown): string {\n if (typeof value === 'string') return value;\n if (\n value === undefined ||\n value === null ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint'\n ) {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return Object.prototype.toString.call(value);\n }\n}\n\nfunction managedConsole(\n props: Readonly<Record<string, unknown>>,\n notification: CustomNotificationRequest\n) {\n const sensitive = sensitiveStrings({\n props,\n idempotencyKey: notification.idempotencyKey,\n actions: notification.actions,\n }).sort((left, right) => right.length - left.length);\n const write = (...values: unknown[]) => {\n let message = values.map(printable).join(' ');\n for (const value of sensitive) {\n message = message.split(value).join('[REDACTED]');\n }\n process.stderr.write(`${message.slice(0, 4096)}\\n`);\n };\n return deepFreeze({\n debug: write,\n error: write,\n info: write,\n log: write,\n warn: write,\n });\n}\n\nfunction validReceipt(value: unknown): value is CustomProviderReceipt {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n const record = value as Record<string, unknown>;\n return (\n Object.keys(record).every(key => key === 'messageId') &&\n (record.messageId === undefined ||\n (typeof record.messageId === 'string' &&\n record.messageId.length >= 1 &&\n [...record.messageId].length <= 512))\n );\n}\n\nclass ManagedServiceError extends Error {\n constructor(\n message: string,\n readonly retryable: boolean\n ) {\n super(message);\n this.name = 'ManagedServiceError';\n }\n}\n\ninterface ManagedHttpRequest {\n readonly url: string;\n readonly method?: string;\n readonly headers?: Readonly<Record<string, string>>;\n readonly query?: Readonly<Record<string, unknown>>;\n readonly json?: unknown;\n readonly text?: string;\n readonly responseType?: 'json' | 'text';\n readonly timeoutMs?: number;\n readonly acceptedStatus?: {\n readonly minimum: number;\n readonly maximum: number;\n };\n}\n\nconst services = deepFreeze({\n http: {\n async request(input: ManagedHttpRequest) {\n if (\n typeof input !== 'object' ||\n input === null ||\n typeof input.url !== 'string'\n ) {\n throw new TypeError(\n 'services.http.request() requires a request object with a URL.'\n );\n }\n const url = new URL(input.url);\n for (const [name, raw] of Object.entries(input.query ?? {})) {\n for (const value of Array.isArray(raw) ? raw : [raw]) {\n if (value !== undefined && value !== null) {\n url.searchParams.append(name, String(value));\n }\n }\n }\n const timeoutMs = input.timeoutMs ?? 30_000;\n if (\n !Number.isSafeInteger(timeoutMs) ||\n timeoutMs < 1 ||\n timeoutMs > 86_400_000\n ) {\n throw new TypeError(\n 'Managed HTTP timeout must be between 1 ms and 24 hours.'\n );\n }\n if (input.json !== undefined && input.text !== undefined) {\n throw new TypeError('Managed HTTP accepts only one of json or text.');\n }\n const headers = new Headers(input.headers);\n let body: string | undefined;\n if (input.json !== undefined) {\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n body = JSON.stringify(input.json);\n } else if (input.text !== undefined) {\n body = input.text;\n }\n let response: Response;\n try {\n response = await fetch(url, {\n method: input.method?.toUpperCase() ?? 'GET',\n headers,\n body,\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch {\n throw new ManagedServiceError('The managed HTTP request failed.', true);\n }\n const accepted = input.acceptedStatus ?? { minimum: 200, maximum: 299 };\n if (\n response.status < accepted.minimum ||\n response.status > accepted.maximum\n ) {\n throw new ManagedServiceError(\n `The managed HTTP response status ${response.status} is outside the accepted range.`,\n response.status === 429 || response.status >= 500\n );\n }\n const data =\n input.responseType === 'text'\n ? await response.text()\n : await response.json();\n return deepFreeze({\n ok: response.ok,\n status: response.status,\n headers: Object.fromEntries(response.headers.entries()),\n data,\n url: response.url,\n redirected: response.redirected,\n });\n },\n },\n});\n\nasync function execute(request: WorkerRequest): Promise<WorkerResponse> {\n try {\n const run = new AsyncFunction(\n 'props',\n 'notification',\n 'attempt',\n 'services',\n 'console',\n `\"use strict\";\\n${request.source}`\n );\n const result = await run(\n deepFreeze(structuredClone(request.props)),\n deepFreeze(structuredClone(request.notification)),\n deepFreeze(structuredClone(request.attempt)),\n services,\n managedConsole(request.props, request.notification)\n );\n if (!validReceipt(result)) {\n return {\n ok: false,\n kind: 'non_json',\n message: 'Provider scripts must return {} or { messageId: string }.',\n retryable: false,\n };\n }\n return { ok: true, receipt: result };\n } catch (error) {\n const raw = error instanceof Error ? error.message : String(error);\n return {\n ok: false,\n kind:\n error instanceof ManagedServiceError\n ? 'service_failed'\n : 'script_threw',\n message: redact(raw, request.props, request.notification),\n retryable: error instanceof ManagedServiceError && error.retryable,\n };\n }\n}\n\nif (parentPort === null) throw new Error('Custom provider worker requires a parent port.');\nparentPort.once('message', async (request: WorkerRequest) => {\n parentPort!.postMessage(await execute(request));\n});\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "09369A9DB883B22564756E2164756E21",
9
+ "names": []
10
+ }