akamai-edge-delivery-polyfill 1.0.5 → 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 +19 -3
- package/dist/index.js.map +2 -2
- package/dist/kv-namespace.d.ts +6 -0
- package/dist/kv-namespace.d.ts.map +1 -1
- package/dist/kv-namespace.js +19 -3
- package/dist/kv-namespace.js.map +2 -2
- package/dist/polyfill.global.js +19 -3
- package/dist/polyfill.global.js.map +2 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -440,13 +440,27 @@ var KVNamespace = class {
|
|
|
440
440
|
constructor(edgeKV) {
|
|
441
441
|
this.edgeKV = edgeKV;
|
|
442
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);
|
|
453
|
+
}
|
|
454
|
+
return sanitized;
|
|
455
|
+
}
|
|
443
456
|
async get(key, optionsOrType) {
|
|
444
457
|
if (!this.edgeKV) {
|
|
445
458
|
throw new Error("EdgeKV not initialized");
|
|
446
459
|
}
|
|
460
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
447
461
|
let response = null;
|
|
448
462
|
try {
|
|
449
|
-
response = await this.edgeKV.getText({ item:
|
|
463
|
+
response = await this.edgeKV.getText({ item: sanitizedKey });
|
|
450
464
|
} catch (error) {
|
|
451
465
|
if (error.status === 404 || error.message?.includes("not found")) {
|
|
452
466
|
return null;
|
|
@@ -493,6 +507,7 @@ var KVNamespace = class {
|
|
|
493
507
|
if (!this.edgeKV) {
|
|
494
508
|
throw new Error("EdgeKV not initialized");
|
|
495
509
|
}
|
|
510
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
496
511
|
let stringValue;
|
|
497
512
|
if (typeof value === "string") {
|
|
498
513
|
stringValue = value;
|
|
@@ -518,7 +533,7 @@ var KVNamespace = class {
|
|
|
518
533
|
} else {
|
|
519
534
|
throw new TypeError("Invalid value type");
|
|
520
535
|
}
|
|
521
|
-
await this.edgeKV.putText({ item:
|
|
536
|
+
await this.edgeKV.putText({ item: sanitizedKey, value: stringValue });
|
|
522
537
|
}
|
|
523
538
|
/**
|
|
524
539
|
* Delete a value from EdgeKV (maps to Cloudflare KV delete)
|
|
@@ -527,8 +542,9 @@ var KVNamespace = class {
|
|
|
527
542
|
if (!this.edgeKV) {
|
|
528
543
|
throw new Error("EdgeKV not initialized");
|
|
529
544
|
}
|
|
545
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
530
546
|
try {
|
|
531
|
-
await this.edgeKV.delete({ item:
|
|
547
|
+
await this.edgeKV.delete({ item: sanitizedKey });
|
|
532
548
|
} catch (error) {
|
|
533
549
|
if (error.status === 404 || error.message?.includes("not found")) {
|
|
534
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 edgeKV: any;\n\n constructor(edgeKV: any) {\n this.edgeKV = edgeKV;\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 let response: string | null = null;\n\n try {\n response = await this.edgeKV.getText({ item: key });\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 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
|
@@ -5,6 +5,12 @@
|
|
|
5
5
|
export declare class KVNamespace {
|
|
6
6
|
private edgeKV;
|
|
7
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;
|
|
8
14
|
/**
|
|
9
15
|
* Get a value from EdgeKV (maps to Cloudflare KV get)
|
|
10
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,MAAM,CAAM;gBAER,MAAM,EAAE,GAAG;IAIvB;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAChE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IACtD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAC5C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAClE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"kv-namespace.d.ts","sourceRoot":"","sources":["../src/kv-namespace.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAM;gBAER,MAAM,EAAE,GAAG;IAIvB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAanB;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAChE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IACtD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAC5C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAClE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAsDtE;;OAEG;IACG,eAAe,CAAC,QAAQ,GAAG,OAAO,EACtC,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3C,eAAe,CAAC,QAAQ,GAAG,OAAO,EACtC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3C,eAAe,CAAC,QAAQ,GAAG,OAAO,EACtC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACxC,eAAe,CAAC,QAAQ,GAAG,OAAO,EACtC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,mBAAmB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAChD,eAAe,CAAC,QAAQ,GAAG,OAAO,EACtC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,mBAAmB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAczD;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,cAAc,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA4C3G;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBxC;;;OAGG;IACG,IAAI,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;CAW3D;AAED,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,GAAG,QAAQ,CAAC;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,GAAG,CAAC;CAChB;AAED,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;IACnE,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,mBAAmB,CAAC,KAAK,EAAE,QAAQ;IAC3C,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC3B"}
|
package/dist/kv-namespace.js
CHANGED
|
@@ -3,13 +3,27 @@ var KVNamespace = class {
|
|
|
3
3
|
constructor(edgeKV) {
|
|
4
4
|
this.edgeKV = edgeKV;
|
|
5
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);
|
|
16
|
+
}
|
|
17
|
+
return sanitized;
|
|
18
|
+
}
|
|
6
19
|
async get(key, optionsOrType) {
|
|
7
20
|
if (!this.edgeKV) {
|
|
8
21
|
throw new Error("EdgeKV not initialized");
|
|
9
22
|
}
|
|
23
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
10
24
|
let response = null;
|
|
11
25
|
try {
|
|
12
|
-
response = await this.edgeKV.getText({ item:
|
|
26
|
+
response = await this.edgeKV.getText({ item: sanitizedKey });
|
|
13
27
|
} catch (error) {
|
|
14
28
|
if (error.status === 404 || error.message?.includes("not found")) {
|
|
15
29
|
return null;
|
|
@@ -56,6 +70,7 @@ var KVNamespace = class {
|
|
|
56
70
|
if (!this.edgeKV) {
|
|
57
71
|
throw new Error("EdgeKV not initialized");
|
|
58
72
|
}
|
|
73
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
59
74
|
let stringValue;
|
|
60
75
|
if (typeof value === "string") {
|
|
61
76
|
stringValue = value;
|
|
@@ -81,7 +96,7 @@ var KVNamespace = class {
|
|
|
81
96
|
} else {
|
|
82
97
|
throw new TypeError("Invalid value type");
|
|
83
98
|
}
|
|
84
|
-
await this.edgeKV.putText({ item:
|
|
99
|
+
await this.edgeKV.putText({ item: sanitizedKey, value: stringValue });
|
|
85
100
|
}
|
|
86
101
|
/**
|
|
87
102
|
* Delete a value from EdgeKV (maps to Cloudflare KV delete)
|
|
@@ -90,8 +105,9 @@ var KVNamespace = class {
|
|
|
90
105
|
if (!this.edgeKV) {
|
|
91
106
|
throw new Error("EdgeKV not initialized");
|
|
92
107
|
}
|
|
108
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
93
109
|
try {
|
|
94
|
-
await this.edgeKV.delete({ item:
|
|
110
|
+
await this.edgeKV.delete({ item: sanitizedKey });
|
|
95
111
|
} catch (error) {
|
|
96
112
|
if (error.status === 404 || error.message?.includes("not found")) {
|
|
97
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 edgeKV: any;\n\n constructor(edgeKV: any) {\n this.edgeKV = edgeKV;\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 let response: string | null = null;\n\n try {\n response = await this.edgeKV.getText({ item:
|
|
5
|
-
"mappings": ";AAKO,IAAM,cAAN,MAAkB;AAAA,EAGvB,YAAY,QAAa;AACvB,SAAK,SAAS;AAAA,EAChB;AAAA,EAUA,MAAM,IACJ,KACA,eAC6D;AAC7D,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;
|
|
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
|
@@ -473,13 +473,27 @@ var AkamaiPolyfill = (() => {
|
|
|
473
473
|
constructor(edgeKV) {
|
|
474
474
|
this.edgeKV = edgeKV;
|
|
475
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);
|
|
486
|
+
}
|
|
487
|
+
return sanitized;
|
|
488
|
+
}
|
|
476
489
|
async get(key, optionsOrType) {
|
|
477
490
|
if (!this.edgeKV) {
|
|
478
491
|
throw new Error("EdgeKV not initialized");
|
|
479
492
|
}
|
|
493
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
480
494
|
let response = null;
|
|
481
495
|
try {
|
|
482
|
-
response = await this.edgeKV.getText({ item:
|
|
496
|
+
response = await this.edgeKV.getText({ item: sanitizedKey });
|
|
483
497
|
} catch (error) {
|
|
484
498
|
if (error.status === 404 || error.message?.includes("not found")) {
|
|
485
499
|
return null;
|
|
@@ -526,6 +540,7 @@ var AkamaiPolyfill = (() => {
|
|
|
526
540
|
if (!this.edgeKV) {
|
|
527
541
|
throw new Error("EdgeKV not initialized");
|
|
528
542
|
}
|
|
543
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
529
544
|
let stringValue;
|
|
530
545
|
if (typeof value === "string") {
|
|
531
546
|
stringValue = value;
|
|
@@ -551,7 +566,7 @@ var AkamaiPolyfill = (() => {
|
|
|
551
566
|
} else {
|
|
552
567
|
throw new TypeError("Invalid value type");
|
|
553
568
|
}
|
|
554
|
-
await this.edgeKV.putText({ item:
|
|
569
|
+
await this.edgeKV.putText({ item: sanitizedKey, value: stringValue });
|
|
555
570
|
}
|
|
556
571
|
/**
|
|
557
572
|
* Delete a value from EdgeKV (maps to Cloudflare KV delete)
|
|
@@ -560,8 +575,9 @@ var AkamaiPolyfill = (() => {
|
|
|
560
575
|
if (!this.edgeKV) {
|
|
561
576
|
throw new Error("EdgeKV not initialized");
|
|
562
577
|
}
|
|
578
|
+
const sanitizedKey = this.sanitizeKey(key);
|
|
563
579
|
try {
|
|
564
|
-
await this.edgeKV.delete({ item:
|
|
580
|
+
await this.edgeKV.delete({ item: sanitizedKey });
|
|
565
581
|
} catch (error) {
|
|
566
582
|
if (error.status === 404 || error.message?.includes("not found")) {
|
|
567
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 edgeKV: any;\n\n constructor(edgeKV: any) {\n this.edgeKV = edgeKV;\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 let response: string | null = null;\n\n try {\n response = await this.edgeKV.getText({ item: key });\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 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",
|