akamai-edge-delivery-polyfill 1.0.1 → 1.0.3
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/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +47 -12
- package/dist/index.js.map +4 -4
- package/dist/polyfill.global.js +45 -12
- package/dist/polyfill.global.js.map +3 -3
- package/dist/request.d.ts +1 -0
- package/dist/request.d.ts.map +1 -1
- package/dist/request.js +44 -11
- package/dist/request.js.map +4 -4
- package/dist/response.d.ts +1 -0
- package/dist/response.d.ts.map +1 -1
- package/dist/response.js +39 -0
- package/dist/response.js.map +4 -4
- package/dist/streams.d.ts +26 -0
- package/dist/streams.d.ts.map +1 -0
- package/dist/streams.js +43 -0
- package/dist/streams.js.map +7 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -17,14 +17,17 @@
|
|
|
17
17
|
* }
|
|
18
18
|
* ```
|
|
19
19
|
*/
|
|
20
|
+
import './streams';
|
|
20
21
|
import { Request, Headers } from './request';
|
|
21
22
|
import { Response } from './response';
|
|
22
23
|
import { KVNamespace } from './kv-namespace';
|
|
23
24
|
import { Crypto, SubtleCrypto } from './crypto';
|
|
25
|
+
import { ReadableStream } from './streams';
|
|
24
26
|
export { Request, Headers } from './request';
|
|
25
27
|
export { Response } from './response';
|
|
26
28
|
export { KVNamespace } from './kv-namespace';
|
|
27
29
|
export { Crypto, SubtleCrypto } from './crypto';
|
|
30
|
+
export { ReadableStream } from './streams';
|
|
28
31
|
/**
|
|
29
32
|
* Helper function to convert Akamai EdgeWorker Response to a format
|
|
30
33
|
* that can be returned from EdgeWorker event handlers
|
|
@@ -39,6 +42,7 @@ declare const _default: {
|
|
|
39
42
|
Request: typeof Request;
|
|
40
43
|
Response: typeof Response;
|
|
41
44
|
Headers: typeof Headers;
|
|
45
|
+
ReadableStream: typeof ReadableStream;
|
|
42
46
|
KVNamespace: typeof KVNamespace;
|
|
43
47
|
Crypto: typeof Crypto;
|
|
44
48
|
SubtleCrypto: typeof SubtleCrypto;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,WAAW,CAAC;AAEnB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAatE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAsI7C;;;;;;;;;;;;AAGD,wBAUE"}
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
6
6
|
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
7
|
});
|
|
8
8
|
|
|
9
|
-
// src/
|
|
9
|
+
// src/streams.ts
|
|
10
10
|
var ReadableStream2 = class {
|
|
11
11
|
constructor(source) {
|
|
12
12
|
this.chunks = [];
|
|
@@ -21,20 +21,18 @@ var ReadableStream2 = class {
|
|
|
21
21
|
this.closed = true;
|
|
22
22
|
}
|
|
23
23
|
};
|
|
24
|
-
this.controller = controller;
|
|
25
24
|
if (source?.start) {
|
|
26
25
|
source.start(controller);
|
|
27
26
|
}
|
|
28
27
|
}
|
|
29
28
|
getReader() {
|
|
30
|
-
return new ReadableStreamReader(this.chunks
|
|
29
|
+
return new ReadableStreamReader(this.chunks);
|
|
31
30
|
}
|
|
32
31
|
};
|
|
33
32
|
var ReadableStreamReader = class {
|
|
34
|
-
constructor(chunks
|
|
33
|
+
constructor(chunks) {
|
|
35
34
|
this.index = 0;
|
|
36
35
|
this.chunks = chunks;
|
|
37
|
-
this.closed = closed;
|
|
38
36
|
}
|
|
39
37
|
async read() {
|
|
40
38
|
if (this.index < this.chunks.length) {
|
|
@@ -43,6 +41,11 @@ var ReadableStreamReader = class {
|
|
|
43
41
|
return { done: true };
|
|
44
42
|
}
|
|
45
43
|
};
|
|
44
|
+
if (typeof globalThis !== "undefined" && !globalThis.ReadableStream) {
|
|
45
|
+
globalThis.ReadableStream = ReadableStream2;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/request.ts
|
|
46
49
|
var Request = class _Request {
|
|
47
50
|
constructor(input, init) {
|
|
48
51
|
this._bodyUsed = false;
|
|
@@ -87,22 +90,52 @@ var Request = class _Request {
|
|
|
87
90
|
return headers;
|
|
88
91
|
}
|
|
89
92
|
createBodyStream(ewRequest) {
|
|
90
|
-
|
|
93
|
+
let bodyData = ewRequest.body;
|
|
94
|
+
if (!bodyData && ewRequest.bodyUsed === false) {
|
|
95
|
+
let bodyPromise = null;
|
|
96
|
+
return new ReadableStream({
|
|
97
|
+
start(controller) {
|
|
98
|
+
if (typeof ewRequest.getBody === "function") {
|
|
99
|
+
bodyPromise = ewRequest.getBody();
|
|
100
|
+
} else if (typeof ewRequest.text === "function") {
|
|
101
|
+
bodyPromise = ewRequest.text();
|
|
102
|
+
}
|
|
103
|
+
if (bodyPromise) {
|
|
104
|
+
bodyPromise.then((body) => {
|
|
105
|
+
if (typeof body === "string") {
|
|
106
|
+
controller.enqueue(new TextEncoder().encode(body));
|
|
107
|
+
} else if (body instanceof Uint8Array) {
|
|
108
|
+
controller.enqueue(body);
|
|
109
|
+
} else if (body) {
|
|
110
|
+
controller.enqueue(new TextEncoder().encode(String(body)));
|
|
111
|
+
}
|
|
112
|
+
controller.close();
|
|
113
|
+
}).catch((err) => {
|
|
114
|
+
console.error("Error reading body:", err);
|
|
115
|
+
controller.close();
|
|
116
|
+
});
|
|
117
|
+
} else {
|
|
118
|
+
controller.close();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
if (!bodyData) {
|
|
91
124
|
return null;
|
|
92
125
|
}
|
|
93
|
-
return new
|
|
126
|
+
return new ReadableStream({
|
|
94
127
|
start(controller) {
|
|
95
|
-
if (typeof
|
|
96
|
-
controller.enqueue(new TextEncoder().encode(
|
|
97
|
-
} else if (
|
|
98
|
-
controller.enqueue(
|
|
128
|
+
if (typeof bodyData === "string") {
|
|
129
|
+
controller.enqueue(new TextEncoder().encode(bodyData));
|
|
130
|
+
} else if (bodyData instanceof Uint8Array) {
|
|
131
|
+
controller.enqueue(bodyData);
|
|
99
132
|
}
|
|
100
133
|
controller.close();
|
|
101
134
|
}
|
|
102
135
|
});
|
|
103
136
|
}
|
|
104
137
|
createReadableStream(body) {
|
|
105
|
-
return new
|
|
138
|
+
return new ReadableStream({
|
|
106
139
|
start(controller) {
|
|
107
140
|
if (typeof body === "string") {
|
|
108
141
|
controller.enqueue(new TextEncoder().encode(body));
|
|
@@ -833,6 +866,7 @@ var src_default = {
|
|
|
833
866
|
Request,
|
|
834
867
|
Response,
|
|
835
868
|
Headers,
|
|
869
|
+
ReadableStream: ReadableStream2,
|
|
836
870
|
KVNamespace,
|
|
837
871
|
Crypto,
|
|
838
872
|
SubtleCrypto,
|
|
@@ -843,6 +877,7 @@ export {
|
|
|
843
877
|
Crypto,
|
|
844
878
|
Headers,
|
|
845
879
|
KVNamespace,
|
|
880
|
+
ReadableStream2 as ReadableStream,
|
|
846
881
|
Request,
|
|
847
882
|
Response,
|
|
848
883
|
SubtleCrypto,
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/request.ts", "../src/response.ts", "../src/kv-namespace.ts", "../src/crypto.ts", "../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Request polyfill for Akamai EdgeWorkers to match Cloudflare Workers API\n * Wraps Akamai's EW Request to provide Cloudflare-compatible interface\n */\n\n// Simple ReadableStream polyfill for Akamai EdgeWorkers\nclass ReadableStream {\n private chunks: Uint8Array[] = [];\n private closed: boolean = false;\n private controller: any;\n\n constructor(source?: { start?: (controller: any) => void }) {\n const controller = {\n enqueue: (chunk: Uint8Array) => {\n if (!this.closed) {\n this.chunks.push(chunk);\n }\n },\n close: () => {\n this.closed = true;\n }\n };\n this.controller = controller;\n\n if (source?.start) {\n source.start(controller);\n }\n }\n\n getReader(): ReadableStreamReader {\n return new ReadableStreamReader(this.chunks, this.closed);\n }\n}\n\nclass ReadableStreamReader {\n private chunks: Uint8Array[];\n private index: number = 0;\n private closed: boolean;\n\n constructor(chunks: Uint8Array[], closed: boolean) {\n this.chunks = chunks;\n this.closed = closed;\n }\n\n async read(): Promise<{ done: boolean; value?: Uint8Array }> {\n if (this.index < this.chunks.length) {\n return { done: false, value: this.chunks[this.index++] };\n }\n return { done: true };\n }\n}\n\nexport class Request {\n private ewRequest: any;\n private _url: string;\n private _method: string;\n private _headers: Headers;\n private _body: ReadableStream | null;\n private _bodyUsed: boolean = false;\n\n constructor(input: string | Request | any, init?: RequestInit) {\n if (typeof input === 'string') {\n this._url = input;\n this._method = init?.method?.toUpperCase() || 'GET';\n this._headers = new Headers(init?.headers);\n this._body = init?.body ? this.createReadableStream(init.body) : null;\n } else if (input instanceof Request) {\n this._url = input.url;\n this._method = input.method;\n this._headers = new Headers(input.headers);\n this._body = input._body;\n this.ewRequest = input.ewRequest;\n } else {\n // Akamai EW Request object\n this.ewRequest = input;\n this._url = this.buildUrl(input);\n this._method = input.method?.toUpperCase() || 'GET';\n this._headers = this.convertHeaders(input);\n this._body = this.createBodyStream(input);\n }\n }\n\n private buildUrl(ewRequest: any): string {\n const scheme = ewRequest.scheme || 'https';\n const host = ewRequest.host || ewRequest.getHeader('host') || 'localhost';\n const path = ewRequest.path || '/';\n const query = ewRequest.query || '';\n\n return `${scheme}://${host}${path}${query ? '?' + query : ''}`;\n }\n\n private convertHeaders(ewRequest: any): Headers {\n const headers = new Headers();\n\n if (ewRequest.getHeaders) {\n const ewHeaders = ewRequest.getHeaders();\n for (const [name, values] of Object.entries(ewHeaders)) {\n if (Array.isArray(values)) {\n values.forEach((value: string) => headers.append(name, value));\n } else {\n headers.set(name, values as string);\n }\n }\n }\n\n return headers;\n }\n\n private createBodyStream(ewRequest: any): ReadableStream | null {\n if (!ewRequest.body) {\n return null;\n }\n\n return new ReadableStream({\n start(controller) {\n if (typeof ewRequest.body === 'string') {\n controller.enqueue(new TextEncoder().encode(ewRequest.body));\n } else if (ewRequest.body instanceof Uint8Array) {\n controller.enqueue(ewRequest.body);\n }\n controller.close();\n }\n });\n }\n\n private createReadableStream(body: BodyInit): ReadableStream {\n return new ReadableStream({\n start(controller) {\n if (typeof body === 'string') {\n controller.enqueue(new TextEncoder().encode(body));\n } else if (body instanceof Uint8Array) {\n controller.enqueue(body);\n } else if (body instanceof ArrayBuffer) {\n controller.enqueue(new Uint8Array(body));\n }\n controller.close();\n }\n });\n }\n\n get url(): string {\n return this._url;\n }\n\n get method(): string {\n return this._method;\n }\n\n get headers(): Headers {\n return this._headers;\n }\n\n get bodyUsed(): boolean {\n return this._bodyUsed;\n }\n\n async text(): Promise<string> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return '';\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return new TextDecoder().decode(result);\n }\n\n async json<T = any>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text);\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return new ArrayBuffer(0);\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result.buffer;\n }\n\n clone(): Request {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n\n const cloned = new Request(this._url, {\n method: this._method,\n headers: this._headers,\n });\n\n cloned.ewRequest = this.ewRequest;\n\n return cloned;\n }\n}\n\n// Headers polyfill for Akamai EdgeWorkers\nexport class Headers {\n private headers: Map<string, string[]> = new Map();\n\n constructor(init?: HeadersInit) {\n if (init) {\n if (init instanceof Headers) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n } else if (Array.isArray(init)) {\n init.forEach(([key, value]) => {\n this.append(key, value);\n });\n } else {\n Object.entries(init).forEach(([key, value]) => {\n this.append(key, value);\n });\n }\n }\n }\n\n append(name: string, value: string): void {\n const normalizedName = name.toLowerCase();\n const existing = this.headers.get(normalizedName) || [];\n existing.push(value);\n this.headers.set(normalizedName, existing);\n }\n\n delete(name: string): void {\n this.headers.delete(name.toLowerCase());\n }\n\n get(name: string): string | null {\n const values = this.headers.get(name.toLowerCase());\n return values ? values[0] : null;\n }\n\n has(name: string): boolean {\n return this.headers.has(name.toLowerCase());\n }\n\n set(name: string, value: string): void {\n this.headers.set(name.toLowerCase(), [value]);\n }\n\n forEach(callback: (value: string, key: string, parent: Headers) => void): void {\n this.headers.forEach((values, key) => {\n values.forEach(value => callback(value, key, this));\n });\n }\n\n entries(): IterableIterator<[string, string]> {\n const entries: [string, string][] = [];\n this.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries[Symbol.iterator]();\n }\n\n keys(): IterableIterator<string> {\n return this.headers.keys();\n }\n\n values(): IterableIterator<string> {\n const values: string[] = [];\n this.forEach(value => {\n values.push(value);\n });\n return values[Symbol.iterator]();\n }\n\n [Symbol.iterator](): IterableIterator<[string, string]> {\n return this.entries();\n }\n}\n\ntype HeadersInit = Headers | string[][] | Record<string, string>;\n\ninterface RequestInit {\n method?: string;\n headers?: HeadersInit;\n body?: BodyInit;\n}\n\ntype BodyInit = string | Uint8Array | ArrayBuffer;\n", "/**\n * Response polyfill for Akamai EdgeWorkers to match Cloudflare Workers API\n * Creates Cloudflare-compatible Response objects that can be converted to Akamai responses\n */\n\nimport { Headers } from './request';\n\nexport class Response {\n private _body: ReadableStream | null;\n private _bodyUsed: boolean = false;\n private _status: number;\n private _statusText: string;\n private _headers: Headers;\n private _ok: boolean;\n\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n this._status = init?.status || 200;\n this._statusText = init?.statusText || this.getStatusText(this._status);\n this._headers = new Headers(init?.headers);\n this._ok = this._status >= 200 && this._status < 300;\n\n if (body !== null && body !== undefined) {\n this._body = this.createReadableStream(body);\n } else {\n this._body = null;\n }\n }\n\n private getStatusText(status: number): string {\n const statusTexts: Record<number, string> = {\n 200: 'OK',\n 201: 'Created',\n 204: 'No Content',\n 301: 'Moved Permanently',\n 302: 'Found',\n 304: 'Not Modified',\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 500: 'Internal Server Error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n };\n return statusTexts[status] || '';\n }\n\n private createReadableStream(body: BodyInit): ReadableStream {\n return new ReadableStream({\n start(controller) {\n if (typeof body === 'string') {\n controller.enqueue(new TextEncoder().encode(body));\n } else if (body instanceof Uint8Array) {\n controller.enqueue(body);\n } else if (body instanceof ArrayBuffer) {\n controller.enqueue(new Uint8Array(body));\n } else if (body instanceof ReadableStream) {\n // Handle ReadableStream\n const reader = body.getReader();\n function push() {\n reader.read().then(({ done, value }) => {\n if (done) {\n controller.close();\n return;\n }\n controller.enqueue(value);\n push();\n });\n }\n push();\n return;\n }\n controller.close();\n }\n });\n }\n\n get body(): ReadableStream | null {\n return this._body;\n }\n\n get bodyUsed(): boolean {\n return this._bodyUsed;\n }\n\n get ok(): boolean {\n return this._ok;\n }\n\n get status(): number {\n return this._status;\n }\n\n get statusText(): string {\n return this._statusText;\n }\n\n get headers(): Headers {\n return this._headers;\n }\n\n async text(): Promise<string> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return '';\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return new TextDecoder().decode(result);\n }\n\n async json<T = any>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text);\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return new ArrayBuffer(0);\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result.buffer;\n }\n\n clone(): Response {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n\n return new Response(this._body, {\n status: this._status,\n statusText: this._statusText,\n headers: this._headers,\n });\n }\n\n static redirect(url: string, status?: number): Response {\n const redirectStatus = status || 302;\n return new Response(null, {\n status: redirectStatus,\n headers: {\n Location: url,\n },\n });\n }\n\n static json(data: any, init?: ResponseInit): Response {\n const body = JSON.stringify(data);\n const headers = new Headers(init?.headers);\n\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n\n return new Response(body, {\n ...init,\n headers,\n });\n }\n}\n\ntype BodyInit = string | Uint8Array | ArrayBuffer | ReadableStream;\n\ninterface ResponseInit {\n status?: number;\n statusText?: string;\n headers?: HeadersInit;\n}\n\ntype HeadersInit = Headers | string[][] | Record<string, string>;\n", "/**\n * KVNamespace polyfill for Akamai EdgeWorkers to match Cloudflare Workers KV API\n * Wraps Akamai EdgeKV to provide Cloudflare-compatible interface\n */\n\nexport class KVNamespace {\n private namespace: string;\n private group: string;\n private edgeKV: any;\n\n constructor(namespace: string, group: string = 'default') {\n this.namespace = namespace;\n this.group = group;\n\n // Lazy load EdgeKV when first accessed\n // In Akamai EdgeWorkers, you'd import: const { EdgeKV } = require('./edgekv.js');\n try {\n // @ts-ignore - EdgeKV is available in Akamai runtime\n const { EdgeKV } = require('./edgekv.js');\n this.edgeKV = new EdgeKV({ namespace: this.namespace, group: this.group });\n } catch (e) {\n console.warn('EdgeKV not available, KVNamespace will not function properly');\n }\n }\n\n /**\n * Get a value from EdgeKV (maps to Cloudflare KV get)\n */\n async get(key: string, options?: KVGetOptions): Promise<string | null>;\n async get(key: string, type: 'text'): Promise<string | null>;\n async get(key: string, type: 'json'): Promise<any>;\n async get(key: string, type: 'arrayBuffer'): Promise<ArrayBuffer | null>;\n async get(key: string, type: 'stream'): Promise<ReadableStream | null>;\n async get(\n key: string,\n optionsOrType?: KVGetOptions | 'text' | 'json' | 'arrayBuffer' | 'stream'\n ): Promise<string | any | ArrayBuffer | ReadableStream | null> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n try {\n const response = await this.edgeKV.getText({ item: key });\n\n if (response === null || response === undefined) {\n return null;\n }\n\n // Determine the type\n let type: string = 'text';\n if (typeof optionsOrType === 'string') {\n type = optionsOrType;\n } else if (optionsOrType && 'type' in optionsOrType) {\n type = optionsOrType.type || 'text';\n }\n\n switch (type) {\n case 'json':\n return JSON.parse(response);\n case 'arrayBuffer':\n return new TextEncoder().encode(response).buffer;\n case 'stream':\n return new ReadableStream({\n start(controller) {\n controller.enqueue(new TextEncoder().encode(response));\n controller.close();\n }\n });\n case 'text':\n default:\n return response;\n }\n } catch (error: any) {\n // EdgeKV throws 404 errors, Cloudflare returns null\n if (error.status === 404 || error.message?.includes('not found')) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Get value with metadata\n */\n async getWithMetadata<Metadata = unknown>(\n key: string,\n options?: KVGetOptions\n ): Promise<KVValueWithMetadata<string, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'text'\n ): Promise<KVValueWithMetadata<string, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'json'\n ): Promise<KVValueWithMetadata<any, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'arrayBuffer'\n ): Promise<KVValueWithMetadata<ArrayBuffer, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'stream'\n ): Promise<KVValueWithMetadata<ReadableStream, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n optionsOrType?: KVGetOptions | 'text' | 'json' | 'arrayBuffer' | 'stream'\n ): Promise<KVValueWithMetadata<any, Metadata>> {\n const value = await this.get(key, optionsOrType as any);\n\n // EdgeKV doesn't support metadata natively, so we return null for metadata\n return {\n value,\n metadata: null,\n };\n }\n\n /**\n * Put a value into EdgeKV (maps to Cloudflare KV put)\n */\n async put(key: string, value: string | ArrayBuffer | ReadableStream, options?: KVPutOptions): Promise<void> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n let stringValue: string;\n\n if (typeof value === 'string') {\n stringValue = value;\n } else if (value instanceof ArrayBuffer) {\n stringValue = new TextDecoder().decode(value);\n } else if (value instanceof ReadableStream) {\n // Read the stream\n const reader = value.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n stringValue = new TextDecoder().decode(result);\n } else {\n throw new TypeError('Invalid value type');\n }\n\n // EdgeKV doesn't support expiration or metadata in the same way\n // We'll just store the value\n await this.edgeKV.putText({ item: key, value: stringValue });\n }\n\n /**\n * Delete a value from EdgeKV (maps to Cloudflare KV delete)\n */\n async delete(key: string): Promise<void> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n try {\n await this.edgeKV.delete({ item: key });\n } catch (error: any) {\n // Ignore 404 errors\n if (error.status === 404 || error.message?.includes('not found')) {\n return;\n }\n throw error;\n }\n }\n\n /**\n * List keys in the namespace\n * Note: EdgeKV doesn't support listing keys, so this is a limited implementation\n */\n async list(options?: KVListOptions): Promise<KVListResult> {\n // EdgeKV doesn't natively support list operations\n // This would require a custom implementation or tracking keys separately\n console.warn('KVNamespace.list() is not fully supported with Akamai EdgeKV');\n\n return {\n keys: [],\n list_complete: true,\n cursor: undefined,\n };\n }\n}\n\ninterface KVGetOptions {\n type?: 'text' | 'json' | 'arrayBuffer' | 'stream';\n cacheTtl?: number;\n}\n\ninterface KVPutOptions {\n expiration?: number;\n expirationTtl?: number;\n metadata?: any;\n}\n\ninterface KVListOptions {\n prefix?: string;\n limit?: number;\n cursor?: string;\n}\n\ninterface KVListResult {\n keys: Array<{ name: string; expiration?: number; metadata?: any }>;\n list_complete: boolean;\n cursor?: string;\n}\n\ninterface KVValueWithMetadata<Value, Metadata> {\n value: Value | null;\n metadata: Metadata | null;\n}\n", "/**\n * Crypto polyfill for Akamai EdgeWorkers to match Cloudflare Workers Web Crypto API\n * Provides a subset of the Web Crypto API using Akamai's crypto module\n */\n\nexport class Crypto {\n /**\n * Generate cryptographically strong random values\n */\n getRandomValues<T extends ArrayBufferView>(array: T): T {\n // In Akamai EdgeWorkers, we can use the crypto module\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n return crypto.getRandomValues(array);\n }\n\n // Fallback implementation (not cryptographically secure, for development only)\n console.warn('Using fallback random number generation - not cryptographically secure');\n const bytes = new Uint8Array(array.buffer, array.byteOffset, array.byteLength);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n return array;\n }\n\n /**\n * Generate a random UUID\n */\n randomUUID(): string {\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback UUID v4 generation\n const bytes = new Uint8Array(16);\n this.getRandomValues(bytes);\n\n // Set version (4) and variant bits\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n\n const hex = Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n }\n\n /**\n * SubtleCrypto API for cryptographic operations\n */\n get subtle(): SubtleCrypto {\n return new SubtleCrypto();\n }\n}\n\nexport class SubtleCrypto {\n /**\n * Generate a digest (hash) of the data\n */\n async digest(algorithm: AlgorithmIdentifier, data: BufferSource): Promise<ArrayBuffer> {\n const algName = typeof algorithm === 'string' ? algorithm : algorithm.name;\n\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.digest) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.digest(algorithm, data);\n }\n\n // For Akamai EdgeWorkers without native crypto.subtle\n // You would need to use the crypto module's createHash or similar\n throw new Error(`Digest algorithm ${algName} not supported in this environment`);\n }\n\n /**\n * Sign data with a key\n */\n async sign(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.sign) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.sign(algorithm, key, data);\n }\n\n throw new Error('Sign operation not supported in this environment');\n }\n\n /**\n * Verify a signature\n */\n async verify(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n signature: BufferSource,\n data: BufferSource\n ): Promise<boolean> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.verify) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.verify(algorithm, key, signature, data);\n }\n\n throw new Error('Verify operation not supported in this environment');\n }\n\n /**\n * Encrypt data\n */\n async encrypt(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.encrypt) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.encrypt(algorithm, key, data);\n }\n\n throw new Error('Encrypt operation not supported in this environment');\n }\n\n /**\n * Decrypt data\n */\n async decrypt(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.decrypt) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.decrypt(algorithm, key, data);\n }\n\n throw new Error('Decrypt operation not supported in this environment');\n }\n\n /**\n * Generate a key\n */\n async generateKey(\n algorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey | CryptoKeyPair> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.generateKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.generateKey(algorithm, extractable, keyUsages);\n }\n\n throw new Error('GenerateKey operation not supported in this environment');\n }\n\n /**\n * Derive bits from a key\n */\n async deriveBits(\n algorithm: AlgorithmIdentifier,\n baseKey: CryptoKey,\n length: number\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.deriveBits) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.deriveBits(algorithm, baseKey, length);\n }\n\n throw new Error('DeriveBits operation not supported in this environment');\n }\n\n /**\n * Derive a key from another key\n */\n async deriveKey(\n algorithm: AlgorithmIdentifier,\n baseKey: CryptoKey,\n derivedKeyAlgorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.deriveKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages);\n }\n\n throw new Error('DeriveKey operation not supported in this environment');\n }\n\n /**\n * Import a key\n */\n async importKey(\n format: KeyFormat,\n keyData: BufferSource | JsonWebKey,\n algorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.importKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.importKey(format, keyData, algorithm, extractable, keyUsages);\n }\n\n throw new Error('ImportKey operation not supported in this environment');\n }\n\n /**\n * Export a key\n */\n async exportKey(format: KeyFormat, key: CryptoKey): Promise<ArrayBuffer | JsonWebKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.exportKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.exportKey(format, key);\n }\n\n throw new Error('ExportKey operation not supported in this environment');\n }\n\n /**\n * Wrap a key\n */\n async wrapKey(\n format: KeyFormat,\n key: CryptoKey,\n wrappingKey: CryptoKey,\n wrapAlgorithm: AlgorithmIdentifier\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.wrapKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.wrapKey(format, key, wrappingKey, wrapAlgorithm);\n }\n\n throw new Error('WrapKey operation not supported in this environment');\n }\n\n /**\n * Unwrap a key\n */\n async unwrapKey(\n format: KeyFormat,\n wrappedKey: BufferSource,\n unwrappingKey: CryptoKey,\n unwrapAlgorithm: AlgorithmIdentifier,\n unwrappedKeyAlgorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.unwrapKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.unwrapKey(\n format,\n wrappedKey,\n unwrappingKey,\n unwrapAlgorithm,\n unwrappedKeyAlgorithm,\n extractable,\n keyUsages\n );\n }\n\n throw new Error('UnwrapKey operation not supported in this environment');\n }\n}\n\n// Type definitions are provided by lib.dom.d.ts\n// We don't need to redefine them here since tsconfig includes \"DOM\" lib\n", "/**\n * Akamai EdgeWorkers to Cloudflare Workers API Polyfill\n *\n * This polyfill makes Akamai EdgeWorkers compatible with Cloudflare Workers API,\n * enabling the use of Optimizely Edge Delivery SDK and other Cloudflare-compatible\n * libraries on Akamai's edge platform.\n *\n * @example\n * ```typescript\n * import { Request, Response, KVNamespace, Crypto } from 'akamai-edge-delivery-polyfill';\n *\n * // Use in your EdgeWorker\n * export async function onClientRequest(request) {\n * const cfRequest = new Request(request);\n * const response = new Response('Hello World', { status: 200 });\n * return response;\n * }\n * ```\n */\n\nimport { Request, Headers } from './request';\nimport { Response } from './response';\nimport { KVNamespace } from './kv-namespace';\nimport { Crypto, SubtleCrypto } from './crypto';\n\nexport { Request, Headers } from './request';\nexport { Response } from './response';\nexport { KVNamespace } from './kv-namespace';\nexport { Crypto, SubtleCrypto } from './crypto';\n\n/**\n * Helper function to convert Akamai EdgeWorker Response to a format\n * that can be returned from EdgeWorker event handlers\n */\nexport async function toEdgeWorkerResponse(response: any): Promise<any> {\n const body = await response.text();\n const headers: Record<string, string> = {};\n\n response.headers.forEach((value: string, key: string) => {\n headers[key] = value;\n });\n\n return {\n status: response.status,\n headers,\n body,\n };\n}\n\n/**\n * Create a global polyfill that injects Cloudflare-compatible APIs into the global scope\n * This is useful when using libraries that expect these APIs to be globally available\n */\nexport function installGlobalPolyfills(): void {\n const g = globalThis as any;\n\n if (!g.Request) {\n g.Request = Request;\n }\n\n if (!g.Response) {\n g.Response = Response;\n }\n\n if (!g.Headers) {\n g.Headers = Headers;\n }\n\n if (!g.crypto) {\n g.crypto = new Crypto();\n }\n\n // Add TextEncoder and TextDecoder if not available\n if (!g.TextEncoder) {\n g.TextEncoder = class TextEncoder {\n encode(input: string): Uint8Array {\n const utf8: number[] = [];\n for (let i = 0; i < input.length; i++) {\n let charCode = input.charCodeAt(i);\n if (charCode < 0x80) {\n utf8.push(charCode);\n } else if (charCode < 0x800) {\n utf8.push(0xc0 | (charCode >> 6), 0x80 | (charCode & 0x3f));\n } else if (charCode < 0xd800 || charCode >= 0xe000) {\n utf8.push(0xe0 | (charCode >> 12), 0x80 | ((charCode >> 6) & 0x3f), 0x80 | (charCode & 0x3f));\n } else {\n i++;\n charCode = 0x10000 + (((charCode & 0x3ff) << 10) | (input.charCodeAt(i) & 0x3ff));\n utf8.push(\n 0xf0 | (charCode >> 18),\n 0x80 | ((charCode >> 12) & 0x3f),\n 0x80 | ((charCode >> 6) & 0x3f),\n 0x80 | (charCode & 0x3f)\n );\n }\n }\n return new Uint8Array(utf8);\n }\n };\n }\n\n if (!g.TextDecoder) {\n g.TextDecoder = class TextDecoder {\n decode(input: Uint8Array | ArrayBuffer): string {\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n let result = '';\n let i = 0;\n\n while (i < bytes.length) {\n const byte1 = bytes[i++];\n\n if (byte1 < 0x80) {\n result += String.fromCharCode(byte1);\n } else if (byte1 < 0xe0) {\n const byte2 = bytes[i++];\n result += String.fromCharCode(((byte1 & 0x1f) << 6) | (byte2 & 0x3f));\n } else if (byte1 < 0xf0) {\n const byte2 = bytes[i++];\n const byte3 = bytes[i++];\n result += String.fromCharCode(((byte1 & 0x0f) << 12) | ((byte2 & 0x3f) << 6) | (byte3 & 0x3f));\n } else {\n const byte2 = bytes[i++];\n const byte3 = bytes[i++];\n const byte4 = bytes[i++];\n let codePoint =\n ((byte1 & 0x07) << 18) | ((byte2 & 0x3f) << 12) | ((byte3 & 0x3f) << 6) | (byte4 & 0x3f);\n codePoint -= 0x10000;\n result += String.fromCharCode(0xd800 + (codePoint >> 10), 0xdc00 + (codePoint & 0x3ff));\n }\n }\n\n return result;\n }\n };\n }\n\n // Add ReadableStream if not available (basic implementation)\n if (!g.ReadableStream) {\n g.ReadableStream = class ReadableStream {\n private controller: any;\n private started = false;\n private closed = false;\n\n constructor(underlyingSource?: any) {\n this.controller = {\n enqueue: (chunk: any) => {\n this.controller._queue = this.controller._queue || [];\n this.controller._queue.push(chunk);\n },\n close: () => {\n this.closed = true;\n },\n error: (e: any) => {\n this.controller._error = e;\n },\n _queue: [],\n _error: null,\n };\n\n if (underlyingSource && underlyingSource.start) {\n underlyingSource.start(this.controller);\n this.started = true;\n }\n }\n\n getReader(): any {\n return {\n read: async () => {\n if (this.controller._error) {\n throw this.controller._error;\n }\n\n if (this.controller._queue.length > 0) {\n return { done: false, value: this.controller._queue.shift() };\n }\n\n if (this.closed) {\n return { done: true, value: undefined };\n }\n\n return { done: true, value: undefined };\n },\n releaseLock: () => {},\n };\n }\n };\n }\n}\n\n// Default export\nexport default {\n Request,\n Response,\n Headers,\n KVNamespace,\n Crypto,\n SubtleCrypto,\n toEdgeWorkerResponse,\n installGlobalPolyfills,\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["ReadableStream", "value"]
|
|
3
|
+
"sources": ["../src/streams.ts", "../src/request.ts", "../src/response.ts", "../src/kv-namespace.ts", "../src/crypto.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * ReadableStream polyfill for Akamai EdgeWorkers\n * Provides basic ReadableStream functionality for body handling\n */\n\nexport class ReadableStream {\n private readonly chunks: Uint8Array[] = [];\n private closed: boolean = false;\n\n constructor(source?: { start?: (controller: ReadableStreamController) => void }) {\n const controller: ReadableStreamController = {\n enqueue: (chunk: Uint8Array) => {\n if (!this.closed) {\n this.chunks.push(chunk);\n }\n },\n close: () => {\n this.closed = true;\n }\n };\n\n if (source?.start) {\n source.start(controller);\n }\n }\n\n getReader(): ReadableStreamReader {\n return new ReadableStreamReader(this.chunks);\n }\n}\n\nexport class ReadableStreamReader {\n private readonly chunks: Uint8Array[];\n private index: number = 0;\n\n constructor(chunks: Uint8Array[]) {\n this.chunks = chunks;\n }\n\n async read(): Promise<{ done: boolean; value?: Uint8Array }> {\n if (this.index < this.chunks.length) {\n return { done: false, value: this.chunks[this.index++] };\n }\n return { done: true };\n }\n}\n\nexport interface ReadableStreamController {\n enqueue(chunk: Uint8Array): void;\n close(): void;\n}\n\n// Make ReadableStream available globally for Akamai EdgeWorkers\nif (typeof globalThis !== 'undefined' && !globalThis.ReadableStream) {\n (globalThis as any).ReadableStream = ReadableStream;\n}\n", "/**\n * Request polyfill for Akamai EdgeWorkers to match Cloudflare Workers API\n * Wraps Akamai's EW Request to provide Cloudflare-compatible interface\n */\n\nimport './streams';\n\nexport class Request {\n private ewRequest: any;\n private _url: string;\n private _method: string;\n private _headers: Headers;\n private _body: ReadableStream | null;\n private _bodyUsed: boolean = false;\n\n constructor(input: string | Request | any, init?: RequestInit) {\n if (typeof input === 'string') {\n this._url = input;\n this._method = init?.method?.toUpperCase() || 'GET';\n this._headers = new Headers(init?.headers);\n this._body = init?.body ? this.createReadableStream(init.body) : null;\n } else if (input instanceof Request) {\n this._url = input.url;\n this._method = input.method;\n this._headers = new Headers(input.headers);\n this._body = input._body;\n this.ewRequest = input.ewRequest;\n } else {\n // Akamai EW Request object\n this.ewRequest = input;\n this._url = this.buildUrl(input);\n this._method = input.method?.toUpperCase() || 'GET';\n this._headers = this.convertHeaders(input);\n this._body = this.createBodyStream(input);\n }\n }\n\n private buildUrl(ewRequest: any): string {\n const scheme = ewRequest.scheme || 'https';\n const host = ewRequest.host || ewRequest.getHeader('host') || 'localhost';\n const path = ewRequest.path || '/';\n const query = ewRequest.query || '';\n\n return `${scheme}://${host}${path}${query ? '?' + query : ''}`;\n }\n\n private convertHeaders(ewRequest: any): Headers {\n const headers = new Headers();\n\n if (ewRequest.getHeaders) {\n const ewHeaders = ewRequest.getHeaders();\n for (const [name, values] of Object.entries(ewHeaders)) {\n if (Array.isArray(values)) {\n values.forEach((value: string) => headers.append(name, value));\n } else {\n headers.set(name, values as string);\n }\n }\n }\n\n return headers;\n }\n\n private createBodyStream(ewRequest: any): ReadableStream | null {\n // Try multiple ways to access the body\n let bodyData = ewRequest.body;\n\n // If body is not directly available, check for common Akamai patterns\n if (!bodyData && ewRequest.bodyUsed === false) {\n let bodyPromise: Promise<any> | null = null;\n\n return new ReadableStream({\n start(controller) {\n // Try to get body asynchronously\n if (typeof ewRequest.getBody === 'function') {\n bodyPromise = ewRequest.getBody();\n } else if (typeof ewRequest.text === 'function') {\n bodyPromise = ewRequest.text();\n }\n\n if (bodyPromise) {\n bodyPromise.then((body: any) => {\n if (typeof body === 'string') {\n controller.enqueue(new TextEncoder().encode(body));\n } else if (body instanceof Uint8Array) {\n controller.enqueue(body);\n } else if (body) {\n controller.enqueue(new TextEncoder().encode(String(body)));\n }\n controller.close();\n }).catch((err: any) => {\n console.error('Error reading body:', err);\n controller.close();\n });\n } else {\n controller.close();\n }\n }\n });\n }\n\n if (!bodyData) {\n return null;\n }\n\n return new ReadableStream({\n start(controller) {\n if (typeof bodyData === 'string') {\n controller.enqueue(new TextEncoder().encode(bodyData));\n } else if (bodyData instanceof Uint8Array) {\n controller.enqueue(bodyData);\n }\n controller.close();\n }\n });\n }\n\n private createReadableStream(body: BodyInit): ReadableStream {\n return new ReadableStream({\n start(controller) {\n if (typeof body === 'string') {\n controller.enqueue(new TextEncoder().encode(body));\n } else if (body instanceof Uint8Array) {\n controller.enqueue(body);\n } else if (body instanceof ArrayBuffer) {\n controller.enqueue(new Uint8Array(body));\n }\n controller.close();\n }\n });\n }\n\n get url(): string {\n return this._url;\n }\n\n get method(): string {\n return this._method;\n }\n\n get headers(): Headers {\n return this._headers;\n }\n\n get bodyUsed(): boolean {\n return this._bodyUsed;\n }\n\n async text(): Promise<string> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return '';\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return new TextDecoder().decode(result);\n }\n\n async json<T = any>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text);\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return new ArrayBuffer(0);\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result.buffer;\n }\n\n clone(): Request {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n\n const cloned = new Request(this._url, {\n method: this._method,\n headers: this._headers,\n });\n\n cloned.ewRequest = this.ewRequest;\n\n return cloned;\n }\n}\n\n// Headers polyfill for Akamai EdgeWorkers\nexport class Headers {\n private headers: Map<string, string[]> = new Map();\n\n constructor(init?: HeadersInit) {\n if (init) {\n if (init instanceof Headers) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n } else if (Array.isArray(init)) {\n init.forEach(([key, value]) => {\n this.append(key, value);\n });\n } else {\n Object.entries(init).forEach(([key, value]) => {\n this.append(key, value);\n });\n }\n }\n }\n\n append(name: string, value: string): void {\n const normalizedName = name.toLowerCase();\n const existing = this.headers.get(normalizedName) || [];\n existing.push(value);\n this.headers.set(normalizedName, existing);\n }\n\n delete(name: string): void {\n this.headers.delete(name.toLowerCase());\n }\n\n get(name: string): string | null {\n const values = this.headers.get(name.toLowerCase());\n return values ? values[0] : null;\n }\n\n has(name: string): boolean {\n return this.headers.has(name.toLowerCase());\n }\n\n set(name: string, value: string): void {\n this.headers.set(name.toLowerCase(), [value]);\n }\n\n forEach(callback: (value: string, key: string, parent: Headers) => void): void {\n this.headers.forEach((values, key) => {\n values.forEach(value => callback(value, key, this));\n });\n }\n\n entries(): IterableIterator<[string, string]> {\n const entries: [string, string][] = [];\n this.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries[Symbol.iterator]();\n }\n\n keys(): IterableIterator<string> {\n return this.headers.keys();\n }\n\n values(): IterableIterator<string> {\n const values: string[] = [];\n this.forEach(value => {\n values.push(value);\n });\n return values[Symbol.iterator]();\n }\n\n [Symbol.iterator](): IterableIterator<[string, string]> {\n return this.entries();\n }\n}\n\ntype HeadersInit = Headers | string[][] | Record<string, string>;\n\ninterface RequestInit {\n method?: string;\n headers?: HeadersInit;\n body?: BodyInit;\n}\n\ntype BodyInit = string | Uint8Array | ArrayBuffer;\n", "/**\n * Response polyfill for Akamai EdgeWorkers to match Cloudflare Workers API\n * Creates Cloudflare-compatible Response objects that can be converted to Akamai responses\n */\n\nimport './streams';\nimport { Headers } from './request';\n\nexport class Response {\n private _body: ReadableStream | null;\n private _bodyUsed: boolean = false;\n private _status: number;\n private _statusText: string;\n private _headers: Headers;\n private _ok: boolean;\n\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n this._status = init?.status || 200;\n this._statusText = init?.statusText || this.getStatusText(this._status);\n this._headers = new Headers(init?.headers);\n this._ok = this._status >= 200 && this._status < 300;\n\n if (body !== null && body !== undefined) {\n this._body = this.createReadableStream(body);\n } else {\n this._body = null;\n }\n }\n\n private getStatusText(status: number): string {\n const statusTexts: Record<number, string> = {\n 200: 'OK',\n 201: 'Created',\n 204: 'No Content',\n 301: 'Moved Permanently',\n 302: 'Found',\n 304: 'Not Modified',\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 500: 'Internal Server Error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n };\n return statusTexts[status] || '';\n }\n\n private createReadableStream(body: BodyInit): ReadableStream {\n return new ReadableStream({\n start(controller) {\n if (typeof body === 'string') {\n controller.enqueue(new TextEncoder().encode(body));\n } else if (body instanceof Uint8Array) {\n controller.enqueue(body);\n } else if (body instanceof ArrayBuffer) {\n controller.enqueue(new Uint8Array(body));\n } else if (body instanceof ReadableStream) {\n // Handle ReadableStream\n const reader = body.getReader();\n function push() {\n reader.read().then(({ done, value }) => {\n if (done) {\n controller.close();\n return;\n }\n controller.enqueue(value);\n push();\n });\n }\n push();\n return;\n }\n controller.close();\n }\n });\n }\n\n get body(): ReadableStream | null {\n return this._body;\n }\n\n get bodyUsed(): boolean {\n return this._bodyUsed;\n }\n\n get ok(): boolean {\n return this._ok;\n }\n\n get status(): number {\n return this._status;\n }\n\n get statusText(): string {\n return this._statusText;\n }\n\n get headers(): Headers {\n return this._headers;\n }\n\n async text(): Promise<string> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return '';\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return new TextDecoder().decode(result);\n }\n\n async json<T = any>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text);\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return new ArrayBuffer(0);\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result.buffer;\n }\n\n clone(): Response {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n\n return new Response(this._body, {\n status: this._status,\n statusText: this._statusText,\n headers: this._headers,\n });\n }\n\n static redirect(url: string, status?: number): Response {\n const redirectStatus = status || 302;\n return new Response(null, {\n status: redirectStatus,\n headers: {\n Location: url,\n },\n });\n }\n\n static json(data: any, init?: ResponseInit): Response {\n const body = JSON.stringify(data);\n const headers = new Headers(init?.headers);\n\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n\n return new Response(body, {\n ...init,\n headers,\n });\n }\n}\n\ntype BodyInit = string | Uint8Array | ArrayBuffer | ReadableStream;\n\ninterface ResponseInit {\n status?: number;\n statusText?: string;\n headers?: HeadersInit;\n}\n\ntype HeadersInit = Headers | string[][] | Record<string, string>;\n", "/**\n * KVNamespace polyfill for Akamai EdgeWorkers to match Cloudflare Workers KV API\n * Wraps Akamai EdgeKV to provide Cloudflare-compatible interface\n */\n\nexport class KVNamespace {\n private namespace: string;\n private group: string;\n private edgeKV: any;\n\n constructor(namespace: string, group: string = 'default') {\n this.namespace = namespace;\n this.group = group;\n\n // Lazy load EdgeKV when first accessed\n // In Akamai EdgeWorkers, you'd import: const { EdgeKV } = require('./edgekv.js');\n try {\n // @ts-ignore - EdgeKV is available in Akamai runtime\n const { EdgeKV } = require('./edgekv.js');\n this.edgeKV = new EdgeKV({ namespace: this.namespace, group: this.group });\n } catch (e) {\n console.warn('EdgeKV not available, KVNamespace will not function properly');\n }\n }\n\n /**\n * Get a value from EdgeKV (maps to Cloudflare KV get)\n */\n async get(key: string, options?: KVGetOptions): Promise<string | null>;\n async get(key: string, type: 'text'): Promise<string | null>;\n async get(key: string, type: 'json'): Promise<any>;\n async get(key: string, type: 'arrayBuffer'): Promise<ArrayBuffer | null>;\n async get(key: string, type: 'stream'): Promise<ReadableStream | null>;\n async get(\n key: string,\n optionsOrType?: KVGetOptions | 'text' | 'json' | 'arrayBuffer' | 'stream'\n ): Promise<string | any | ArrayBuffer | ReadableStream | null> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n try {\n const response = await this.edgeKV.getText({ item: key });\n\n if (response === null || response === undefined) {\n return null;\n }\n\n // Determine the type\n let type: string = 'text';\n if (typeof optionsOrType === 'string') {\n type = optionsOrType;\n } else if (optionsOrType && 'type' in optionsOrType) {\n type = optionsOrType.type || 'text';\n }\n\n switch (type) {\n case 'json':\n return JSON.parse(response);\n case 'arrayBuffer':\n return new TextEncoder().encode(response).buffer;\n case 'stream':\n return new ReadableStream({\n start(controller) {\n controller.enqueue(new TextEncoder().encode(response));\n controller.close();\n }\n });\n case 'text':\n default:\n return response;\n }\n } catch (error: any) {\n // EdgeKV throws 404 errors, Cloudflare returns null\n if (error.status === 404 || error.message?.includes('not found')) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Get value with metadata\n */\n async getWithMetadata<Metadata = unknown>(\n key: string,\n options?: KVGetOptions\n ): Promise<KVValueWithMetadata<string, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'text'\n ): Promise<KVValueWithMetadata<string, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'json'\n ): Promise<KVValueWithMetadata<any, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'arrayBuffer'\n ): Promise<KVValueWithMetadata<ArrayBuffer, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'stream'\n ): Promise<KVValueWithMetadata<ReadableStream, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n optionsOrType?: KVGetOptions | 'text' | 'json' | 'arrayBuffer' | 'stream'\n ): Promise<KVValueWithMetadata<any, Metadata>> {\n const value = await this.get(key, optionsOrType as any);\n\n // EdgeKV doesn't support metadata natively, so we return null for metadata\n return {\n value,\n metadata: null,\n };\n }\n\n /**\n * Put a value into EdgeKV (maps to Cloudflare KV put)\n */\n async put(key: string, value: string | ArrayBuffer | ReadableStream, options?: KVPutOptions): Promise<void> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n let stringValue: string;\n\n if (typeof value === 'string') {\n stringValue = value;\n } else if (value instanceof ArrayBuffer) {\n stringValue = new TextDecoder().decode(value);\n } else if (value instanceof ReadableStream) {\n // Read the stream\n const reader = value.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n stringValue = new TextDecoder().decode(result);\n } else {\n throw new TypeError('Invalid value type');\n }\n\n // EdgeKV doesn't support expiration or metadata in the same way\n // We'll just store the value\n await this.edgeKV.putText({ item: key, value: stringValue });\n }\n\n /**\n * Delete a value from EdgeKV (maps to Cloudflare KV delete)\n */\n async delete(key: string): Promise<void> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n try {\n await this.edgeKV.delete({ item: key });\n } catch (error: any) {\n // Ignore 404 errors\n if (error.status === 404 || error.message?.includes('not found')) {\n return;\n }\n throw error;\n }\n }\n\n /**\n * List keys in the namespace\n * Note: EdgeKV doesn't support listing keys, so this is a limited implementation\n */\n async list(options?: KVListOptions): Promise<KVListResult> {\n // EdgeKV doesn't natively support list operations\n // This would require a custom implementation or tracking keys separately\n console.warn('KVNamespace.list() is not fully supported with Akamai EdgeKV');\n\n return {\n keys: [],\n list_complete: true,\n cursor: undefined,\n };\n }\n}\n\ninterface KVGetOptions {\n type?: 'text' | 'json' | 'arrayBuffer' | 'stream';\n cacheTtl?: number;\n}\n\ninterface KVPutOptions {\n expiration?: number;\n expirationTtl?: number;\n metadata?: any;\n}\n\ninterface KVListOptions {\n prefix?: string;\n limit?: number;\n cursor?: string;\n}\n\ninterface KVListResult {\n keys: Array<{ name: string; expiration?: number; metadata?: any }>;\n list_complete: boolean;\n cursor?: string;\n}\n\ninterface KVValueWithMetadata<Value, Metadata> {\n value: Value | null;\n metadata: Metadata | null;\n}\n", "/**\n * Crypto polyfill for Akamai EdgeWorkers to match Cloudflare Workers Web Crypto API\n * Provides a subset of the Web Crypto API using Akamai's crypto module\n */\n\nexport class Crypto {\n /**\n * Generate cryptographically strong random values\n */\n getRandomValues<T extends ArrayBufferView>(array: T): T {\n // In Akamai EdgeWorkers, we can use the crypto module\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n return crypto.getRandomValues(array);\n }\n\n // Fallback implementation (not cryptographically secure, for development only)\n console.warn('Using fallback random number generation - not cryptographically secure');\n const bytes = new Uint8Array(array.buffer, array.byteOffset, array.byteLength);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n return array;\n }\n\n /**\n * Generate a random UUID\n */\n randomUUID(): string {\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback UUID v4 generation\n const bytes = new Uint8Array(16);\n this.getRandomValues(bytes);\n\n // Set version (4) and variant bits\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n\n const hex = Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n }\n\n /**\n * SubtleCrypto API for cryptographic operations\n */\n get subtle(): SubtleCrypto {\n return new SubtleCrypto();\n }\n}\n\nexport class SubtleCrypto {\n /**\n * Generate a digest (hash) of the data\n */\n async digest(algorithm: AlgorithmIdentifier, data: BufferSource): Promise<ArrayBuffer> {\n const algName = typeof algorithm === 'string' ? algorithm : algorithm.name;\n\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.digest) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.digest(algorithm, data);\n }\n\n // For Akamai EdgeWorkers without native crypto.subtle\n // You would need to use the crypto module's createHash or similar\n throw new Error(`Digest algorithm ${algName} not supported in this environment`);\n }\n\n /**\n * Sign data with a key\n */\n async sign(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.sign) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.sign(algorithm, key, data);\n }\n\n throw new Error('Sign operation not supported in this environment');\n }\n\n /**\n * Verify a signature\n */\n async verify(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n signature: BufferSource,\n data: BufferSource\n ): Promise<boolean> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.verify) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.verify(algorithm, key, signature, data);\n }\n\n throw new Error('Verify operation not supported in this environment');\n }\n\n /**\n * Encrypt data\n */\n async encrypt(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.encrypt) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.encrypt(algorithm, key, data);\n }\n\n throw new Error('Encrypt operation not supported in this environment');\n }\n\n /**\n * Decrypt data\n */\n async decrypt(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.decrypt) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.decrypt(algorithm, key, data);\n }\n\n throw new Error('Decrypt operation not supported in this environment');\n }\n\n /**\n * Generate a key\n */\n async generateKey(\n algorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey | CryptoKeyPair> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.generateKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.generateKey(algorithm, extractable, keyUsages);\n }\n\n throw new Error('GenerateKey operation not supported in this environment');\n }\n\n /**\n * Derive bits from a key\n */\n async deriveBits(\n algorithm: AlgorithmIdentifier,\n baseKey: CryptoKey,\n length: number\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.deriveBits) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.deriveBits(algorithm, baseKey, length);\n }\n\n throw new Error('DeriveBits operation not supported in this environment');\n }\n\n /**\n * Derive a key from another key\n */\n async deriveKey(\n algorithm: AlgorithmIdentifier,\n baseKey: CryptoKey,\n derivedKeyAlgorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.deriveKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages);\n }\n\n throw new Error('DeriveKey operation not supported in this environment');\n }\n\n /**\n * Import a key\n */\n async importKey(\n format: KeyFormat,\n keyData: BufferSource | JsonWebKey,\n algorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.importKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.importKey(format, keyData, algorithm, extractable, keyUsages);\n }\n\n throw new Error('ImportKey operation not supported in this environment');\n }\n\n /**\n * Export a key\n */\n async exportKey(format: KeyFormat, key: CryptoKey): Promise<ArrayBuffer | JsonWebKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.exportKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.exportKey(format, key);\n }\n\n throw new Error('ExportKey operation not supported in this environment');\n }\n\n /**\n * Wrap a key\n */\n async wrapKey(\n format: KeyFormat,\n key: CryptoKey,\n wrappingKey: CryptoKey,\n wrapAlgorithm: AlgorithmIdentifier\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.wrapKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.wrapKey(format, key, wrappingKey, wrapAlgorithm);\n }\n\n throw new Error('WrapKey operation not supported in this environment');\n }\n\n /**\n * Unwrap a key\n */\n async unwrapKey(\n format: KeyFormat,\n wrappedKey: BufferSource,\n unwrappingKey: CryptoKey,\n unwrapAlgorithm: AlgorithmIdentifier,\n unwrappedKeyAlgorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.unwrapKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.unwrapKey(\n format,\n wrappedKey,\n unwrappingKey,\n unwrapAlgorithm,\n unwrappedKeyAlgorithm,\n extractable,\n keyUsages\n );\n }\n\n throw new Error('UnwrapKey operation not supported in this environment');\n }\n}\n\n// Type definitions are provided by lib.dom.d.ts\n// We don't need to redefine them here since tsconfig includes \"DOM\" lib\n", "/**\n * Akamai EdgeWorkers to Cloudflare Workers API Polyfill\n *\n * This polyfill makes Akamai EdgeWorkers compatible with Cloudflare Workers API,\n * enabling the use of Optimizely Edge Delivery SDK and other Cloudflare-compatible\n * libraries on Akamai's edge platform.\n *\n * @example\n * ```typescript\n * import { Request, Response, KVNamespace, Crypto } from 'akamai-edge-delivery-polyfill';\n *\n * // Use in your EdgeWorker\n * export async function onClientRequest(request) {\n * const cfRequest = new Request(request);\n * const response = new Response('Hello World', { status: 200 });\n * return response;\n * }\n * ```\n */\n\n// Import streams polyfill first to ensure ReadableStream is available globally\nimport './streams';\n\nimport { Request, Headers } from './request';\nimport { Response } from './response';\nimport { KVNamespace } from './kv-namespace';\nimport { Crypto, SubtleCrypto } from './crypto';\nimport { ReadableStream } from './streams';\n\nexport { Request, Headers } from './request';\nexport { Response } from './response';\nexport { KVNamespace } from './kv-namespace';\nexport { Crypto, SubtleCrypto } from './crypto';\nexport { ReadableStream } from './streams';\n\n/**\n * Helper function to convert Akamai EdgeWorker Response to a format\n * that can be returned from EdgeWorker event handlers\n */\nexport async function toEdgeWorkerResponse(response: any): Promise<any> {\n const body = await response.text();\n const headers: Record<string, string> = {};\n\n response.headers.forEach((value: string, key: string) => {\n headers[key] = value;\n });\n\n return {\n status: response.status,\n headers,\n body,\n };\n}\n\n/**\n * Create a global polyfill that injects Cloudflare-compatible APIs into the global scope\n * This is useful when using libraries that expect these APIs to be globally available\n */\nexport function installGlobalPolyfills(): void {\n const g = globalThis as any;\n\n if (!g.Request) {\n g.Request = Request;\n }\n\n if (!g.Response) {\n g.Response = Response;\n }\n\n if (!g.Headers) {\n g.Headers = Headers;\n }\n\n if (!g.crypto) {\n g.crypto = new Crypto();\n }\n\n // Add TextEncoder and TextDecoder if not available\n if (!g.TextEncoder) {\n g.TextEncoder = class TextEncoder {\n encode(input: string): Uint8Array {\n const utf8: number[] = [];\n for (let i = 0; i < input.length; i++) {\n let charCode = input.charCodeAt(i);\n if (charCode < 0x80) {\n utf8.push(charCode);\n } else if (charCode < 0x800) {\n utf8.push(0xc0 | (charCode >> 6), 0x80 | (charCode & 0x3f));\n } else if (charCode < 0xd800 || charCode >= 0xe000) {\n utf8.push(0xe0 | (charCode >> 12), 0x80 | ((charCode >> 6) & 0x3f), 0x80 | (charCode & 0x3f));\n } else {\n i++;\n charCode = 0x10000 + (((charCode & 0x3ff) << 10) | (input.charCodeAt(i) & 0x3ff));\n utf8.push(\n 0xf0 | (charCode >> 18),\n 0x80 | ((charCode >> 12) & 0x3f),\n 0x80 | ((charCode >> 6) & 0x3f),\n 0x80 | (charCode & 0x3f)\n );\n }\n }\n return new Uint8Array(utf8);\n }\n };\n }\n\n if (!g.TextDecoder) {\n g.TextDecoder = class TextDecoder {\n decode(input: Uint8Array | ArrayBuffer): string {\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n let result = '';\n let i = 0;\n\n while (i < bytes.length) {\n const byte1 = bytes[i++];\n\n if (byte1 < 0x80) {\n result += String.fromCharCode(byte1);\n } else if (byte1 < 0xe0) {\n const byte2 = bytes[i++];\n result += String.fromCharCode(((byte1 & 0x1f) << 6) | (byte2 & 0x3f));\n } else if (byte1 < 0xf0) {\n const byte2 = bytes[i++];\n const byte3 = bytes[i++];\n result += String.fromCharCode(((byte1 & 0x0f) << 12) | ((byte2 & 0x3f) << 6) | (byte3 & 0x3f));\n } else {\n const byte2 = bytes[i++];\n const byte3 = bytes[i++];\n const byte4 = bytes[i++];\n let codePoint =\n ((byte1 & 0x07) << 18) | ((byte2 & 0x3f) << 12) | ((byte3 & 0x3f) << 6) | (byte4 & 0x3f);\n codePoint -= 0x10000;\n result += String.fromCharCode(0xd800 + (codePoint >> 10), 0xdc00 + (codePoint & 0x3ff));\n }\n }\n\n return result;\n }\n };\n }\n\n // Add ReadableStream if not available (basic implementation)\n if (!g.ReadableStream) {\n g.ReadableStream = class ReadableStream {\n private controller: any;\n private started = false;\n private closed = false;\n\n constructor(underlyingSource?: any) {\n this.controller = {\n enqueue: (chunk: any) => {\n this.controller._queue = this.controller._queue || [];\n this.controller._queue.push(chunk);\n },\n close: () => {\n this.closed = true;\n },\n error: (e: any) => {\n this.controller._error = e;\n },\n _queue: [],\n _error: null,\n };\n\n if (underlyingSource && underlyingSource.start) {\n underlyingSource.start(this.controller);\n this.started = true;\n }\n }\n\n getReader(): any {\n return {\n read: async () => {\n if (this.controller._error) {\n throw this.controller._error;\n }\n\n if (this.controller._queue.length > 0) {\n return { done: false, value: this.controller._queue.shift() };\n }\n\n if (this.closed) {\n return { done: true, value: undefined };\n }\n\n return { done: true, value: undefined };\n },\n releaseLock: () => {},\n };\n }\n };\n }\n}\n\n// Default export\nexport default {\n Request,\n Response,\n Headers,\n ReadableStream,\n KVNamespace,\n Crypto,\n SubtleCrypto,\n toEdgeWorkerResponse,\n installGlobalPolyfills,\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ReadableStream", "value", "ReadableStream"]
|
|
7
7
|
}
|
package/dist/polyfill.global.js
CHANGED
|
@@ -38,7 +38,7 @@ var AkamaiPolyfill = (() => {
|
|
|
38
38
|
toEdgeWorkerResponse: () => toEdgeWorkerResponse
|
|
39
39
|
});
|
|
40
40
|
|
|
41
|
-
// src/
|
|
41
|
+
// src/streams.ts
|
|
42
42
|
var ReadableStream2 = class {
|
|
43
43
|
constructor(source) {
|
|
44
44
|
this.chunks = [];
|
|
@@ -53,20 +53,18 @@ var AkamaiPolyfill = (() => {
|
|
|
53
53
|
this.closed = true;
|
|
54
54
|
}
|
|
55
55
|
};
|
|
56
|
-
this.controller = controller;
|
|
57
56
|
if (source?.start) {
|
|
58
57
|
source.start(controller);
|
|
59
58
|
}
|
|
60
59
|
}
|
|
61
60
|
getReader() {
|
|
62
|
-
return new ReadableStreamReader(this.chunks
|
|
61
|
+
return new ReadableStreamReader(this.chunks);
|
|
63
62
|
}
|
|
64
63
|
};
|
|
65
64
|
var ReadableStreamReader = class {
|
|
66
|
-
constructor(chunks
|
|
65
|
+
constructor(chunks) {
|
|
67
66
|
this.index = 0;
|
|
68
67
|
this.chunks = chunks;
|
|
69
|
-
this.closed = closed;
|
|
70
68
|
}
|
|
71
69
|
async read() {
|
|
72
70
|
if (this.index < this.chunks.length) {
|
|
@@ -75,6 +73,11 @@ var AkamaiPolyfill = (() => {
|
|
|
75
73
|
return { done: true };
|
|
76
74
|
}
|
|
77
75
|
};
|
|
76
|
+
if (typeof globalThis !== "undefined" && !globalThis.ReadableStream) {
|
|
77
|
+
globalThis.ReadableStream = ReadableStream2;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// src/request.ts
|
|
78
81
|
var Request = class _Request {
|
|
79
82
|
constructor(input, init) {
|
|
80
83
|
this._bodyUsed = false;
|
|
@@ -119,22 +122,52 @@ var AkamaiPolyfill = (() => {
|
|
|
119
122
|
return headers;
|
|
120
123
|
}
|
|
121
124
|
createBodyStream(ewRequest) {
|
|
122
|
-
|
|
125
|
+
let bodyData = ewRequest.body;
|
|
126
|
+
if (!bodyData && ewRequest.bodyUsed === false) {
|
|
127
|
+
let bodyPromise = null;
|
|
128
|
+
return new ReadableStream({
|
|
129
|
+
start(controller) {
|
|
130
|
+
if (typeof ewRequest.getBody === "function") {
|
|
131
|
+
bodyPromise = ewRequest.getBody();
|
|
132
|
+
} else if (typeof ewRequest.text === "function") {
|
|
133
|
+
bodyPromise = ewRequest.text();
|
|
134
|
+
}
|
|
135
|
+
if (bodyPromise) {
|
|
136
|
+
bodyPromise.then((body) => {
|
|
137
|
+
if (typeof body === "string") {
|
|
138
|
+
controller.enqueue(new TextEncoder().encode(body));
|
|
139
|
+
} else if (body instanceof Uint8Array) {
|
|
140
|
+
controller.enqueue(body);
|
|
141
|
+
} else if (body) {
|
|
142
|
+
controller.enqueue(new TextEncoder().encode(String(body)));
|
|
143
|
+
}
|
|
144
|
+
controller.close();
|
|
145
|
+
}).catch((err) => {
|
|
146
|
+
console.error("Error reading body:", err);
|
|
147
|
+
controller.close();
|
|
148
|
+
});
|
|
149
|
+
} else {
|
|
150
|
+
controller.close();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
if (!bodyData) {
|
|
123
156
|
return null;
|
|
124
157
|
}
|
|
125
|
-
return new
|
|
158
|
+
return new ReadableStream({
|
|
126
159
|
start(controller) {
|
|
127
|
-
if (typeof
|
|
128
|
-
controller.enqueue(new TextEncoder().encode(
|
|
129
|
-
} else if (
|
|
130
|
-
controller.enqueue(
|
|
160
|
+
if (typeof bodyData === "string") {
|
|
161
|
+
controller.enqueue(new TextEncoder().encode(bodyData));
|
|
162
|
+
} else if (bodyData instanceof Uint8Array) {
|
|
163
|
+
controller.enqueue(bodyData);
|
|
131
164
|
}
|
|
132
165
|
controller.close();
|
|
133
166
|
}
|
|
134
167
|
});
|
|
135
168
|
}
|
|
136
169
|
createReadableStream(body) {
|
|
137
|
-
return new
|
|
170
|
+
return new ReadableStream({
|
|
138
171
|
start(controller) {
|
|
139
172
|
if (typeof body === "string") {
|
|
140
173
|
controller.enqueue(new TextEncoder().encode(body));
|