akamai-edge-delivery-polyfill 1.0.4 → 1.0.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/index.js +46 -44
- package/dist/index.js.map +2 -2
- package/dist/kv-namespace.d.ts +7 -3
- package/dist/kv-namespace.d.ts.map +1 -1
- package/dist/kv-namespace.js +46 -44
- package/dist/kv-namespace.js.map +2 -2
- package/dist/polyfill.global.js +46 -43
- package/dist/polyfill.global.js.map +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
-
}) : x)(function(x) {
|
|
4
|
-
if (typeof require !== "undefined")
|
|
5
|
-
return require.apply(this, arguments);
|
|
6
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
|
-
});
|
|
8
|
-
|
|
9
1
|
// src/streams.ts
|
|
10
2
|
var ReadableStream2 = class {
|
|
11
3
|
constructor(source) {
|
|
@@ -445,53 +437,61 @@ var Response = class _Response {
|
|
|
445
437
|
|
|
446
438
|
// src/kv-namespace.ts
|
|
447
439
|
var KVNamespace = class {
|
|
448
|
-
constructor(
|
|
449
|
-
this.
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
440
|
+
constructor(edgeKV) {
|
|
441
|
+
this.edgeKV = edgeKV;
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Sanitize key to be compatible with EdgeKV requirements
|
|
445
|
+
* EdgeKV only allows A-Z a-z 0-9 _ - (max 512 chars)
|
|
446
|
+
* Replace invalid characters with hyphens
|
|
447
|
+
*/
|
|
448
|
+
sanitizeKey(key) {
|
|
449
|
+
const sanitized = key.replace(/[^A-Za-z0-9_-]/g, "-");
|
|
450
|
+
if (sanitized.length > 512) {
|
|
451
|
+
console.warn(`Key "${key}" exceeds 512 characters, truncating to 512`);
|
|
452
|
+
return sanitized.substring(0, 512);
|
|
456
453
|
}
|
|
454
|
+
return sanitized;
|
|
457
455
|
}
|
|
458
456
|
async get(key, optionsOrType) {
|
|
459
457
|
if (!this.edgeKV) {
|
|
460
458
|
throw new Error("EdgeKV not initialized");
|
|
461
459
|
}
|
|
460
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
461
|
+
let response = null;
|
|
462
462
|
try {
|
|
463
|
-
|
|
464
|
-
if (response === null || response === void 0) {
|
|
465
|
-
return null;
|
|
466
|
-
}
|
|
467
|
-
let type = "text";
|
|
468
|
-
if (typeof optionsOrType === "string") {
|
|
469
|
-
type = optionsOrType;
|
|
470
|
-
} else if (optionsOrType && "type" in optionsOrType) {
|
|
471
|
-
type = optionsOrType.type || "text";
|
|
472
|
-
}
|
|
473
|
-
switch (type) {
|
|
474
|
-
case "json":
|
|
475
|
-
return JSON.parse(response);
|
|
476
|
-
case "arrayBuffer":
|
|
477
|
-
return new TextEncoder().encode(response).buffer;
|
|
478
|
-
case "stream":
|
|
479
|
-
return new ReadableStream({
|
|
480
|
-
start(controller) {
|
|
481
|
-
controller.enqueue(new TextEncoder().encode(response));
|
|
482
|
-
controller.close();
|
|
483
|
-
}
|
|
484
|
-
});
|
|
485
|
-
case "text":
|
|
486
|
-
default:
|
|
487
|
-
return response;
|
|
488
|
-
}
|
|
463
|
+
response = await this.edgeKV.getText({ item: sanitizedKey });
|
|
489
464
|
} catch (error) {
|
|
490
465
|
if (error.status === 404 || error.message?.includes("not found")) {
|
|
491
466
|
return null;
|
|
492
467
|
}
|
|
493
468
|
throw error;
|
|
494
469
|
}
|
|
470
|
+
if (response === null || response === void 0) {
|
|
471
|
+
return null;
|
|
472
|
+
}
|
|
473
|
+
let type = "text";
|
|
474
|
+
if (typeof optionsOrType === "string") {
|
|
475
|
+
type = optionsOrType;
|
|
476
|
+
} else if (optionsOrType && "type" in optionsOrType) {
|
|
477
|
+
type = optionsOrType.type || "text";
|
|
478
|
+
}
|
|
479
|
+
switch (type) {
|
|
480
|
+
case "json":
|
|
481
|
+
return JSON.parse(response);
|
|
482
|
+
case "arrayBuffer":
|
|
483
|
+
return new TextEncoder().encode(response).buffer;
|
|
484
|
+
case "stream":
|
|
485
|
+
return new ReadableStream({
|
|
486
|
+
start(controller) {
|
|
487
|
+
controller.enqueue(new TextEncoder().encode(response));
|
|
488
|
+
controller.close();
|
|
489
|
+
}
|
|
490
|
+
});
|
|
491
|
+
case "text":
|
|
492
|
+
default:
|
|
493
|
+
return response;
|
|
494
|
+
}
|
|
495
495
|
}
|
|
496
496
|
async getWithMetadata(key, optionsOrType) {
|
|
497
497
|
const value = await this.get(key, optionsOrType);
|
|
@@ -507,6 +507,7 @@ var KVNamespace = class {
|
|
|
507
507
|
if (!this.edgeKV) {
|
|
508
508
|
throw new Error("EdgeKV not initialized");
|
|
509
509
|
}
|
|
510
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
510
511
|
let stringValue;
|
|
511
512
|
if (typeof value === "string") {
|
|
512
513
|
stringValue = value;
|
|
@@ -532,7 +533,7 @@ var KVNamespace = class {
|
|
|
532
533
|
} else {
|
|
533
534
|
throw new TypeError("Invalid value type");
|
|
534
535
|
}
|
|
535
|
-
await this.edgeKV.putText({ item:
|
|
536
|
+
await this.edgeKV.putText({ item: sanitizedKey, value: stringValue });
|
|
536
537
|
}
|
|
537
538
|
/**
|
|
538
539
|
* Delete a value from EdgeKV (maps to Cloudflare KV delete)
|
|
@@ -541,8 +542,9 @@ var KVNamespace = class {
|
|
|
541
542
|
if (!this.edgeKV) {
|
|
542
543
|
throw new Error("EdgeKV not initialized");
|
|
543
544
|
}
|
|
545
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
544
546
|
try {
|
|
545
|
-
await this.edgeKV.delete({ item:
|
|
547
|
+
await this.edgeKV.delete({ item: sanitizedKey });
|
|
546
548
|
} catch (error) {
|
|
547
549
|
if (error.status === 404 || error.message?.includes("not found")) {
|
|
548
550
|
return;
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
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 private _cachedBodyText: string | null = null;\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 this.ewRequest = 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 this._cachedBodyText = input._cachedBodyText;\n } else {\n // Akamai EW Request object - store reference for lazy body reading\n this.ewRequest = input;\n this._url = this.buildUrl(input);\n this._method = input.method?.toUpperCase() || 'GET';\n this._headers = this.convertHeaders(input);\n // Don't read body yet - will be read lazily when .text() is called\n this._body = null;\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 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 we have a cached body from cloning, use it\n if (this._cachedBodyText !== null) {\n return this._cachedBodyText;\n }\n\n // If this is an Akamai request, read body from it\n if (this.ewRequest && !this._body) {\n try {\n // Try different methods to get the body from Akamai request\n if (typeof this.ewRequest.text === 'function') {\n const bodyText = await this.ewRequest.text();\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (typeof this.ewRequest.json === 'function') {\n const bodyJson = await this.ewRequest.json();\n const bodyText = JSON.stringify(bodyJson);\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (typeof this.ewRequest.getBody === 'function') {\n const body = await this.ewRequest.getBody();\n const bodyText = typeof body === 'string' ? body : JSON.stringify(body);\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (this.ewRequest.body !== undefined && this.ewRequest.body !== null) {\n const bodyText = typeof this.ewRequest.body === 'string'\n ? this.ewRequest.body\n : JSON.stringify(this.ewRequest.body);\n this._cachedBodyText = bodyText;\n return bodyText;\n }\n } catch (error) {\n console.error('Error reading body from Akamai request:', error);\n }\n }\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 const bodyText = new TextDecoder().decode(result);\n this._cachedBodyText = bodyText;\n return bodyText;\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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",
|
|
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 private _cachedBodyText: string | null = null;\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 this.ewRequest = 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 this._cachedBodyText = input._cachedBodyText;\n } else {\n // Akamai EW Request object - store reference for lazy body reading\n this.ewRequest = input;\n this._url = this.buildUrl(input);\n this._method = input.method?.toUpperCase() || 'GET';\n this._headers = this.convertHeaders(input);\n // Don't read body yet - will be read lazily when .text() is called\n this._body = null;\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 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 we have a cached body from cloning, use it\n if (this._cachedBodyText !== null) {\n return this._cachedBodyText;\n }\n\n // If this is an Akamai request, read body from it\n if (this.ewRequest && !this._body) {\n try {\n // Try different methods to get the body from Akamai request\n if (typeof this.ewRequest.text === 'function') {\n const bodyText = await this.ewRequest.text();\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (typeof this.ewRequest.json === 'function') {\n const bodyJson = await this.ewRequest.json();\n const bodyText = JSON.stringify(bodyJson);\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (typeof this.ewRequest.getBody === 'function') {\n const body = await this.ewRequest.getBody();\n const bodyText = typeof body === 'string' ? body : JSON.stringify(body);\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (this.ewRequest.body !== undefined && this.ewRequest.body !== null) {\n const bodyText = typeof this.ewRequest.body === 'string'\n ? this.ewRequest.body\n : JSON.stringify(this.ewRequest.body);\n this._cachedBodyText = bodyText;\n return bodyText;\n }\n } catch (error) {\n console.error('Error reading body from Akamai request:', error);\n }\n }\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 const bodyText = new TextDecoder().decode(result);\n this._cachedBodyText = bodyText;\n return bodyText;\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 edgeKV: any;\n\n constructor(edgeKV: any) {\n this.edgeKV = edgeKV;\n }\n\n /**\n * Sanitize key to be compatible with EdgeKV requirements\n * EdgeKV only allows A-Z a-z 0-9 _ - (max 512 chars)\n * Replace invalid characters with hyphens\n */\n private sanitizeKey(key: string): string {\n // Replace any character that's not alphanumeric, underscore, or hyphen with hyphen\n const sanitized = key.replace(/[^A-Za-z0-9_-]/g, '-');\n\n // Ensure it's within 512 character limit\n if (sanitized.length > 512) {\n console.warn(`Key \"${key}\" exceeds 512 characters, truncating to 512`);\n return sanitized.substring(0, 512);\n }\n\n return sanitized;\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 // Sanitize key for EdgeKV compatibility\n const sanitizedKey = this.sanitizeKey(key);\n\n let response: string | null = null;\n\n try {\n response = await this.edgeKV.getText({ item: sanitizedKey });\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 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 }\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 // Sanitize key for EdgeKV compatibility\n const sanitizedKey = this.sanitizeKey(key);\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: sanitizedKey, 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 // Sanitize key for EdgeKV compatibility\n const sanitizedKey = this.sanitizeKey(key);\n\n try {\n await this.edgeKV.delete({ item: sanitizedKey });\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
6
|
"names": ["ReadableStream", "bodyText", "value", "ReadableStream"]
|
|
7
7
|
}
|
package/dist/kv-namespace.d.ts
CHANGED
|
@@ -3,10 +3,14 @@
|
|
|
3
3
|
* Wraps Akamai EdgeKV to provide Cloudflare-compatible interface
|
|
4
4
|
*/
|
|
5
5
|
export declare class KVNamespace {
|
|
6
|
-
private namespace;
|
|
7
|
-
private group;
|
|
8
6
|
private edgeKV;
|
|
9
|
-
constructor(
|
|
7
|
+
constructor(edgeKV: any);
|
|
8
|
+
/**
|
|
9
|
+
* Sanitize key to be compatible with EdgeKV requirements
|
|
10
|
+
* EdgeKV only allows A-Z a-z 0-9 _ - (max 512 chars)
|
|
11
|
+
* Replace invalid characters with hyphens
|
|
12
|
+
*/
|
|
13
|
+
private sanitizeKey;
|
|
10
14
|
/**
|
|
11
15
|
* Get a value from EdgeKV (maps to Cloudflare KV get)
|
|
12
16
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kv-namespace.d.ts","sourceRoot":"","sources":["../src/kv-namespace.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,WAAW;IACtB,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"kv-namespace.d.ts","sourceRoot":"","sources":["../src/kv-namespace.ts"],"names":[],"mappings":"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"}
|
package/dist/kv-namespace.js
CHANGED
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
-
}) : x)(function(x) {
|
|
4
|
-
if (typeof require !== "undefined")
|
|
5
|
-
return require.apply(this, arguments);
|
|
6
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
|
-
});
|
|
8
|
-
|
|
9
1
|
// src/kv-namespace.ts
|
|
10
2
|
var KVNamespace = class {
|
|
11
|
-
constructor(
|
|
12
|
-
this.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
3
|
+
constructor(edgeKV) {
|
|
4
|
+
this.edgeKV = edgeKV;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Sanitize key to be compatible with EdgeKV requirements
|
|
8
|
+
* EdgeKV only allows A-Z a-z 0-9 _ - (max 512 chars)
|
|
9
|
+
* Replace invalid characters with hyphens
|
|
10
|
+
*/
|
|
11
|
+
sanitizeKey(key) {
|
|
12
|
+
const sanitized = key.replace(/[^A-Za-z0-9_-]/g, "-");
|
|
13
|
+
if (sanitized.length > 512) {
|
|
14
|
+
console.warn(`Key "${key}" exceeds 512 characters, truncating to 512`);
|
|
15
|
+
return sanitized.substring(0, 512);
|
|
19
16
|
}
|
|
17
|
+
return sanitized;
|
|
20
18
|
}
|
|
21
19
|
async get(key, optionsOrType) {
|
|
22
20
|
if (!this.edgeKV) {
|
|
23
21
|
throw new Error("EdgeKV not initialized");
|
|
24
22
|
}
|
|
23
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
24
|
+
let response = null;
|
|
25
25
|
try {
|
|
26
|
-
|
|
27
|
-
if (response === null || response === void 0) {
|
|
28
|
-
return null;
|
|
29
|
-
}
|
|
30
|
-
let type = "text";
|
|
31
|
-
if (typeof optionsOrType === "string") {
|
|
32
|
-
type = optionsOrType;
|
|
33
|
-
} else if (optionsOrType && "type" in optionsOrType) {
|
|
34
|
-
type = optionsOrType.type || "text";
|
|
35
|
-
}
|
|
36
|
-
switch (type) {
|
|
37
|
-
case "json":
|
|
38
|
-
return JSON.parse(response);
|
|
39
|
-
case "arrayBuffer":
|
|
40
|
-
return new TextEncoder().encode(response).buffer;
|
|
41
|
-
case "stream":
|
|
42
|
-
return new ReadableStream({
|
|
43
|
-
start(controller) {
|
|
44
|
-
controller.enqueue(new TextEncoder().encode(response));
|
|
45
|
-
controller.close();
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
case "text":
|
|
49
|
-
default:
|
|
50
|
-
return response;
|
|
51
|
-
}
|
|
26
|
+
response = await this.edgeKV.getText({ item: sanitizedKey });
|
|
52
27
|
} catch (error) {
|
|
53
28
|
if (error.status === 404 || error.message?.includes("not found")) {
|
|
54
29
|
return null;
|
|
55
30
|
}
|
|
56
31
|
throw error;
|
|
57
32
|
}
|
|
33
|
+
if (response === null || response === void 0) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
let type = "text";
|
|
37
|
+
if (typeof optionsOrType === "string") {
|
|
38
|
+
type = optionsOrType;
|
|
39
|
+
} else if (optionsOrType && "type" in optionsOrType) {
|
|
40
|
+
type = optionsOrType.type || "text";
|
|
41
|
+
}
|
|
42
|
+
switch (type) {
|
|
43
|
+
case "json":
|
|
44
|
+
return JSON.parse(response);
|
|
45
|
+
case "arrayBuffer":
|
|
46
|
+
return new TextEncoder().encode(response).buffer;
|
|
47
|
+
case "stream":
|
|
48
|
+
return new ReadableStream({
|
|
49
|
+
start(controller) {
|
|
50
|
+
controller.enqueue(new TextEncoder().encode(response));
|
|
51
|
+
controller.close();
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
case "text":
|
|
55
|
+
default:
|
|
56
|
+
return response;
|
|
57
|
+
}
|
|
58
58
|
}
|
|
59
59
|
async getWithMetadata(key, optionsOrType) {
|
|
60
60
|
const value = await this.get(key, optionsOrType);
|
|
@@ -70,6 +70,7 @@ var KVNamespace = class {
|
|
|
70
70
|
if (!this.edgeKV) {
|
|
71
71
|
throw new Error("EdgeKV not initialized");
|
|
72
72
|
}
|
|
73
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
73
74
|
let stringValue;
|
|
74
75
|
if (typeof value === "string") {
|
|
75
76
|
stringValue = value;
|
|
@@ -95,7 +96,7 @@ var KVNamespace = class {
|
|
|
95
96
|
} else {
|
|
96
97
|
throw new TypeError("Invalid value type");
|
|
97
98
|
}
|
|
98
|
-
await this.edgeKV.putText({ item:
|
|
99
|
+
await this.edgeKV.putText({ item: sanitizedKey, value: stringValue });
|
|
99
100
|
}
|
|
100
101
|
/**
|
|
101
102
|
* Delete a value from EdgeKV (maps to Cloudflare KV delete)
|
|
@@ -104,8 +105,9 @@ var KVNamespace = class {
|
|
|
104
105
|
if (!this.edgeKV) {
|
|
105
106
|
throw new Error("EdgeKV not initialized");
|
|
106
107
|
}
|
|
108
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
107
109
|
try {
|
|
108
|
-
await this.edgeKV.delete({ item:
|
|
110
|
+
await this.edgeKV.delete({ item: sanitizedKey });
|
|
109
111
|
} catch (error) {
|
|
110
112
|
if (error.status === 404 || error.message?.includes("not found")) {
|
|
111
113
|
return;
|
package/dist/kv-namespace.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/kv-namespace.ts"],
|
|
4
|
-
"sourcesContent": ["/**\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
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["/**\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 edgeKV: any;\n\n constructor(edgeKV: any) {\n this.edgeKV = edgeKV;\n }\n\n /**\n * Sanitize key to be compatible with EdgeKV requirements\n * EdgeKV only allows A-Z a-z 0-9 _ - (max 512 chars)\n * Replace invalid characters with hyphens\n */\n private sanitizeKey(key: string): string {\n // Replace any character that's not alphanumeric, underscore, or hyphen with hyphen\n const sanitized = key.replace(/[^A-Za-z0-9_-]/g, '-');\n\n // Ensure it's within 512 character limit\n if (sanitized.length > 512) {\n console.warn(`Key \"${key}\" exceeds 512 characters, truncating to 512`);\n return sanitized.substring(0, 512);\n }\n\n return sanitized;\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 // Sanitize key for EdgeKV compatibility\n const sanitizedKey = this.sanitizeKey(key);\n\n let response: string | null = null;\n\n try {\n response = await this.edgeKV.getText({ item: sanitizedKey });\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 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 }\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 // Sanitize key for EdgeKV compatibility\n const sanitizedKey = this.sanitizeKey(key);\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: sanitizedKey, 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 // Sanitize key for EdgeKV compatibility\n const sanitizedKey = this.sanitizeKey(key);\n\n try {\n await this.edgeKV.delete({ item: sanitizedKey });\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["value"]
|
|
7
7
|
}
|
package/dist/polyfill.global.js
CHANGED
|
@@ -3,13 +3,6 @@ var AkamaiPolyfill = (() => {
|
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
7
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
8
|
-
}) : x)(function(x) {
|
|
9
|
-
if (typeof require !== "undefined")
|
|
10
|
-
return require.apply(this, arguments);
|
|
11
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
12
|
-
});
|
|
13
6
|
var __export = (target, all) => {
|
|
14
7
|
for (var name in all)
|
|
15
8
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -477,53 +470,61 @@ var AkamaiPolyfill = (() => {
|
|
|
477
470
|
|
|
478
471
|
// src/kv-namespace.ts
|
|
479
472
|
var KVNamespace = class {
|
|
480
|
-
constructor(
|
|
481
|
-
this.
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
473
|
+
constructor(edgeKV) {
|
|
474
|
+
this.edgeKV = edgeKV;
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Sanitize key to be compatible with EdgeKV requirements
|
|
478
|
+
* EdgeKV only allows A-Z a-z 0-9 _ - (max 512 chars)
|
|
479
|
+
* Replace invalid characters with hyphens
|
|
480
|
+
*/
|
|
481
|
+
sanitizeKey(key) {
|
|
482
|
+
const sanitized = key.replace(/[^A-Za-z0-9_-]/g, "-");
|
|
483
|
+
if (sanitized.length > 512) {
|
|
484
|
+
console.warn(`Key "${key}" exceeds 512 characters, truncating to 512`);
|
|
485
|
+
return sanitized.substring(0, 512);
|
|
488
486
|
}
|
|
487
|
+
return sanitized;
|
|
489
488
|
}
|
|
490
489
|
async get(key, optionsOrType) {
|
|
491
490
|
if (!this.edgeKV) {
|
|
492
491
|
throw new Error("EdgeKV not initialized");
|
|
493
492
|
}
|
|
493
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
494
|
+
let response = null;
|
|
494
495
|
try {
|
|
495
|
-
|
|
496
|
-
if (response === null || response === void 0) {
|
|
497
|
-
return null;
|
|
498
|
-
}
|
|
499
|
-
let type = "text";
|
|
500
|
-
if (typeof optionsOrType === "string") {
|
|
501
|
-
type = optionsOrType;
|
|
502
|
-
} else if (optionsOrType && "type" in optionsOrType) {
|
|
503
|
-
type = optionsOrType.type || "text";
|
|
504
|
-
}
|
|
505
|
-
switch (type) {
|
|
506
|
-
case "json":
|
|
507
|
-
return JSON.parse(response);
|
|
508
|
-
case "arrayBuffer":
|
|
509
|
-
return new TextEncoder().encode(response).buffer;
|
|
510
|
-
case "stream":
|
|
511
|
-
return new ReadableStream({
|
|
512
|
-
start(controller) {
|
|
513
|
-
controller.enqueue(new TextEncoder().encode(response));
|
|
514
|
-
controller.close();
|
|
515
|
-
}
|
|
516
|
-
});
|
|
517
|
-
case "text":
|
|
518
|
-
default:
|
|
519
|
-
return response;
|
|
520
|
-
}
|
|
496
|
+
response = await this.edgeKV.getText({ item: sanitizedKey });
|
|
521
497
|
} catch (error) {
|
|
522
498
|
if (error.status === 404 || error.message?.includes("not found")) {
|
|
523
499
|
return null;
|
|
524
500
|
}
|
|
525
501
|
throw error;
|
|
526
502
|
}
|
|
503
|
+
if (response === null || response === void 0) {
|
|
504
|
+
return null;
|
|
505
|
+
}
|
|
506
|
+
let type = "text";
|
|
507
|
+
if (typeof optionsOrType === "string") {
|
|
508
|
+
type = optionsOrType;
|
|
509
|
+
} else if (optionsOrType && "type" in optionsOrType) {
|
|
510
|
+
type = optionsOrType.type || "text";
|
|
511
|
+
}
|
|
512
|
+
switch (type) {
|
|
513
|
+
case "json":
|
|
514
|
+
return JSON.parse(response);
|
|
515
|
+
case "arrayBuffer":
|
|
516
|
+
return new TextEncoder().encode(response).buffer;
|
|
517
|
+
case "stream":
|
|
518
|
+
return new ReadableStream({
|
|
519
|
+
start(controller) {
|
|
520
|
+
controller.enqueue(new TextEncoder().encode(response));
|
|
521
|
+
controller.close();
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
case "text":
|
|
525
|
+
default:
|
|
526
|
+
return response;
|
|
527
|
+
}
|
|
527
528
|
}
|
|
528
529
|
async getWithMetadata(key, optionsOrType) {
|
|
529
530
|
const value = await this.get(key, optionsOrType);
|
|
@@ -539,6 +540,7 @@ var AkamaiPolyfill = (() => {
|
|
|
539
540
|
if (!this.edgeKV) {
|
|
540
541
|
throw new Error("EdgeKV not initialized");
|
|
541
542
|
}
|
|
543
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
542
544
|
let stringValue;
|
|
543
545
|
if (typeof value === "string") {
|
|
544
546
|
stringValue = value;
|
|
@@ -564,7 +566,7 @@ var AkamaiPolyfill = (() => {
|
|
|
564
566
|
} else {
|
|
565
567
|
throw new TypeError("Invalid value type");
|
|
566
568
|
}
|
|
567
|
-
await this.edgeKV.putText({ item:
|
|
569
|
+
await this.edgeKV.putText({ item: sanitizedKey, value: stringValue });
|
|
568
570
|
}
|
|
569
571
|
/**
|
|
570
572
|
* Delete a value from EdgeKV (maps to Cloudflare KV delete)
|
|
@@ -573,8 +575,9 @@ var AkamaiPolyfill = (() => {
|
|
|
573
575
|
if (!this.edgeKV) {
|
|
574
576
|
throw new Error("EdgeKV not initialized");
|
|
575
577
|
}
|
|
578
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
576
579
|
try {
|
|
577
|
-
await this.edgeKV.delete({ item:
|
|
580
|
+
await this.edgeKV.delete({ item: sanitizedKey });
|
|
578
581
|
} catch (error) {
|
|
579
582
|
if (error.status === 404 || error.message?.includes("not found")) {
|
|
580
583
|
return;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/global.ts", "../src/streams.ts", "../src/request.ts", "../src/response.ts", "../src/kv-namespace.ts", "../src/crypto.ts", "../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Global entry point - exposes all polyfills as global variables\n * This file is used for the IIFE build that automatically installs polyfills\n */\n\nimport { Request, Headers } from './request';\nimport { Response } from './response';\nimport { KVNamespace } from './kv-namespace';\nimport { Crypto, SubtleCrypto } from './crypto';\nimport { installGlobalPolyfills, toEdgeWorkerResponse } from './index';\n\n// Export all modules for the global bundle\nexport {\n Request,\n Response,\n Headers,\n KVNamespace,\n Crypto,\n SubtleCrypto,\n installGlobalPolyfills,\n toEdgeWorkerResponse,\n};\n\n// Also expose as default export\nexport default {\n Request,\n Response,\n Headers,\n KVNamespace,\n Crypto,\n SubtleCrypto,\n installGlobalPolyfills,\n toEdgeWorkerResponse,\n};\n", "/**\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 private _cachedBodyText: string | null = null;\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 this.ewRequest = 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 this._cachedBodyText = input._cachedBodyText;\n } else {\n // Akamai EW Request object - store reference for lazy body reading\n this.ewRequest = input;\n this._url = this.buildUrl(input);\n this._method = input.method?.toUpperCase() || 'GET';\n this._headers = this.convertHeaders(input);\n // Don't read body yet - will be read lazily when .text() is called\n this._body = null;\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 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 we have a cached body from cloning, use it\n if (this._cachedBodyText !== null) {\n return this._cachedBodyText;\n }\n\n // If this is an Akamai request, read body from it\n if (this.ewRequest && !this._body) {\n try {\n // Try different methods to get the body from Akamai request\n if (typeof this.ewRequest.text === 'function') {\n const bodyText = await this.ewRequest.text();\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (typeof this.ewRequest.json === 'function') {\n const bodyJson = await this.ewRequest.json();\n const bodyText = JSON.stringify(bodyJson);\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (typeof this.ewRequest.getBody === 'function') {\n const body = await this.ewRequest.getBody();\n const bodyText = typeof body === 'string' ? body : JSON.stringify(body);\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (this.ewRequest.body !== undefined && this.ewRequest.body !== null) {\n const bodyText = typeof this.ewRequest.body === 'string'\n ? this.ewRequest.body\n : JSON.stringify(this.ewRequest.body);\n this._cachedBodyText = bodyText;\n return bodyText;\n }\n } catch (error) {\n console.error('Error reading body from Akamai request:', error);\n }\n }\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 const bodyText = new TextDecoder().decode(result);\n this._cachedBodyText = bodyText;\n return bodyText;\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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",
|
|
4
|
+
"sourcesContent": ["/**\n * Global entry point - exposes all polyfills as global variables\n * This file is used for the IIFE build that automatically installs polyfills\n */\n\nimport { Request, Headers } from './request';\nimport { Response } from './response';\nimport { KVNamespace } from './kv-namespace';\nimport { Crypto, SubtleCrypto } from './crypto';\nimport { installGlobalPolyfills, toEdgeWorkerResponse } from './index';\n\n// Export all modules for the global bundle\nexport {\n Request,\n Response,\n Headers,\n KVNamespace,\n Crypto,\n SubtleCrypto,\n installGlobalPolyfills,\n toEdgeWorkerResponse,\n};\n\n// Also expose as default export\nexport default {\n Request,\n Response,\n Headers,\n KVNamespace,\n Crypto,\n SubtleCrypto,\n installGlobalPolyfills,\n toEdgeWorkerResponse,\n};\n", "/**\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 private _cachedBodyText: string | null = null;\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 this.ewRequest = 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 this._cachedBodyText = input._cachedBodyText;\n } else {\n // Akamai EW Request object - store reference for lazy body reading\n this.ewRequest = input;\n this._url = this.buildUrl(input);\n this._method = input.method?.toUpperCase() || 'GET';\n this._headers = this.convertHeaders(input);\n // Don't read body yet - will be read lazily when .text() is called\n this._body = null;\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 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 we have a cached body from cloning, use it\n if (this._cachedBodyText !== null) {\n return this._cachedBodyText;\n }\n\n // If this is an Akamai request, read body from it\n if (this.ewRequest && !this._body) {\n try {\n // Try different methods to get the body from Akamai request\n if (typeof this.ewRequest.text === 'function') {\n const bodyText = await this.ewRequest.text();\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (typeof this.ewRequest.json === 'function') {\n const bodyJson = await this.ewRequest.json();\n const bodyText = JSON.stringify(bodyJson);\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (typeof this.ewRequest.getBody === 'function') {\n const body = await this.ewRequest.getBody();\n const bodyText = typeof body === 'string' ? body : JSON.stringify(body);\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (this.ewRequest.body !== undefined && this.ewRequest.body !== null) {\n const bodyText = typeof this.ewRequest.body === 'string'\n ? this.ewRequest.body\n : JSON.stringify(this.ewRequest.body);\n this._cachedBodyText = bodyText;\n return bodyText;\n }\n } catch (error) {\n console.error('Error reading body from Akamai request:', error);\n }\n }\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 const bodyText = new TextDecoder().decode(result);\n this._cachedBodyText = bodyText;\n return bodyText;\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 edgeKV: any;\n\n constructor(edgeKV: any) {\n this.edgeKV = edgeKV;\n }\n\n /**\n * Sanitize key to be compatible with EdgeKV requirements\n * EdgeKV only allows A-Z a-z 0-9 _ - (max 512 chars)\n * Replace invalid characters with hyphens\n */\n private sanitizeKey(key: string): string {\n // Replace any character that's not alphanumeric, underscore, or hyphen with hyphen\n const sanitized = key.replace(/[^A-Za-z0-9_-]/g, '-');\n\n // Ensure it's within 512 character limit\n if (sanitized.length > 512) {\n console.warn(`Key \"${key}\" exceeds 512 characters, truncating to 512`);\n return sanitized.substring(0, 512);\n }\n\n return sanitized;\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 // Sanitize key for EdgeKV compatibility\n const sanitizedKey = this.sanitizeKey(key);\n\n let response: string | null = null;\n\n try {\n response = await this.edgeKV.getText({ item: sanitizedKey });\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 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 }\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 // Sanitize key for EdgeKV compatibility\n const sanitizedKey = this.sanitizeKey(key);\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: sanitizedKey, 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 // Sanitize key for EdgeKV compatibility\n const sanitizedKey = this.sanitizeKey(key);\n\n try {\n await this.edgeKV.delete({ item: sanitizedKey });\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
6
|
"names": ["ReadableStream", "bodyText", "value"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "akamai-edge-delivery-polyfill",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
4
4
|
"description": "Polyfill to make Akamai EdgeWorkers compatible with Cloudflare Workers API for Optimizely Edge Delivery SDK",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|