akamai-edge-delivery-polyfill 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,11 +1,3 @@
1
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
- }) : x)(function(x) {
4
- if (typeof require !== "undefined")
5
- return require.apply(this, arguments);
6
- throw Error('Dynamic require of "' + x + '" is not supported');
7
- });
8
-
9
1
  // src/streams.ts
10
2
  var ReadableStream2 = class {
11
3
  constructor(source) {
@@ -445,53 +437,61 @@ var Response = class _Response {
445
437
 
446
438
  // src/kv-namespace.ts
447
439
  var KVNamespace = class {
448
- constructor(namespace, group = "default") {
449
- this.namespace = namespace;
450
- this.group = group;
451
- try {
452
- const { EdgeKV } = __require("./edgekv.js");
453
- this.edgeKV = new EdgeKV({ namespace: this.namespace, group: this.group });
454
- } catch (e) {
455
- console.warn("EdgeKV not available, KVNamespace will not function properly");
440
+ constructor(edgeKV) {
441
+ this.edgeKV = edgeKV;
442
+ }
443
+ /**
444
+ * Sanitize key to be compatible with EdgeKV requirements
445
+ * EdgeKV only allows A-Z a-z 0-9 _ - (max 512 chars)
446
+ * Replace invalid characters with hyphens
447
+ */
448
+ sanitizeKey(key) {
449
+ const sanitized = key.replace(/[^A-Za-z0-9_-]/g, "-");
450
+ if (sanitized.length > 512) {
451
+ console.warn(`Key "${key}" exceeds 512 characters, truncating to 512`);
452
+ return sanitized.substring(0, 512);
456
453
  }
454
+ return sanitized;
457
455
  }
458
456
  async get(key, optionsOrType) {
459
457
  if (!this.edgeKV) {
460
458
  throw new Error("EdgeKV not initialized");
461
459
  }
460
+ const sanitizedKey = this.sanitizeKey(key);
461
+ let response = null;
462
462
  try {
463
- const response = await this.edgeKV.getText({ item: key });
464
- if (response === null || response === void 0) {
465
- return null;
466
- }
467
- let type = "text";
468
- if (typeof optionsOrType === "string") {
469
- type = optionsOrType;
470
- } else if (optionsOrType && "type" in optionsOrType) {
471
- type = optionsOrType.type || "text";
472
- }
473
- switch (type) {
474
- case "json":
475
- return JSON.parse(response);
476
- case "arrayBuffer":
477
- return new TextEncoder().encode(response).buffer;
478
- case "stream":
479
- return new ReadableStream({
480
- start(controller) {
481
- controller.enqueue(new TextEncoder().encode(response));
482
- controller.close();
483
- }
484
- });
485
- case "text":
486
- default:
487
- return response;
488
- }
463
+ response = await this.edgeKV.getText({ item: sanitizedKey });
489
464
  } catch (error) {
490
465
  if (error.status === 404 || error.message?.includes("not found")) {
491
466
  return null;
492
467
  }
493
468
  throw error;
494
469
  }
470
+ if (response === null || response === void 0) {
471
+ return null;
472
+ }
473
+ let type = "text";
474
+ if (typeof optionsOrType === "string") {
475
+ type = optionsOrType;
476
+ } else if (optionsOrType && "type" in optionsOrType) {
477
+ type = optionsOrType.type || "text";
478
+ }
479
+ switch (type) {
480
+ case "json":
481
+ return JSON.parse(response);
482
+ case "arrayBuffer":
483
+ return new TextEncoder().encode(response).buffer;
484
+ case "stream":
485
+ return new ReadableStream({
486
+ start(controller) {
487
+ controller.enqueue(new TextEncoder().encode(response));
488
+ controller.close();
489
+ }
490
+ });
491
+ case "text":
492
+ default:
493
+ return response;
494
+ }
495
495
  }
496
496
  async getWithMetadata(key, optionsOrType) {
497
497
  const value = await this.get(key, optionsOrType);
@@ -507,6 +507,7 @@ var KVNamespace = class {
507
507
  if (!this.edgeKV) {
508
508
  throw new Error("EdgeKV not initialized");
509
509
  }
510
+ const sanitizedKey = this.sanitizeKey(key);
510
511
  let stringValue;
511
512
  if (typeof value === "string") {
512
513
  stringValue = value;
@@ -532,7 +533,7 @@ var KVNamespace = class {
532
533
  } else {
533
534
  throw new TypeError("Invalid value type");
534
535
  }
535
- await this.edgeKV.putText({ item: key, value: stringValue });
536
+ await this.edgeKV.putText({ item: sanitizedKey, value: stringValue });
536
537
  }
537
538
  /**
538
539
  * Delete a value from EdgeKV (maps to Cloudflare KV delete)
@@ -541,8 +542,9 @@ var KVNamespace = class {
541
542
  if (!this.edgeKV) {
542
543
  throw new Error("EdgeKV not initialized");
543
544
  }
545
+ const sanitizedKey = this.sanitizeKey(key);
544
546
  try {
545
- await this.edgeKV.delete({ item: key });
547
+ await this.edgeKV.delete({ item: sanitizedKey });
546
548
  } catch (error) {
547
549
  if (error.status === 404 || error.message?.includes("not found")) {
548
550
  return;
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/streams.ts", "../src/request.ts", "../src/response.ts", "../src/kv-namespace.ts", "../src/crypto.ts", "../src/index.ts"],
4
- "sourcesContent": ["/**\n * ReadableStream polyfill for Akamai EdgeWorkers\n * Provides basic ReadableStream functionality for body handling\n */\n\nexport class ReadableStream {\n private readonly chunks: Uint8Array[] = [];\n private closed: boolean = false;\n\n constructor(source?: { start?: (controller: ReadableStreamController) => void }) {\n const controller: ReadableStreamController = {\n enqueue: (chunk: Uint8Array) => {\n if (!this.closed) {\n this.chunks.push(chunk);\n }\n },\n close: () => {\n this.closed = true;\n }\n };\n\n if (source?.start) {\n source.start(controller);\n }\n }\n\n getReader(): ReadableStreamReader {\n return new ReadableStreamReader(this.chunks);\n }\n}\n\nexport class ReadableStreamReader {\n private readonly chunks: Uint8Array[];\n private index: number = 0;\n\n constructor(chunks: Uint8Array[]) {\n this.chunks = chunks;\n }\n\n async read(): Promise<{ done: boolean; value?: Uint8Array }> {\n if (this.index < this.chunks.length) {\n return { done: false, value: this.chunks[this.index++] };\n }\n return { done: true };\n }\n}\n\nexport interface ReadableStreamController {\n enqueue(chunk: Uint8Array): void;\n close(): void;\n}\n\n// Make ReadableStream available globally for Akamai EdgeWorkers\nif (typeof globalThis !== 'undefined' && !globalThis.ReadableStream) {\n (globalThis as any).ReadableStream = ReadableStream;\n}\n", "/**\n * Request polyfill for Akamai EdgeWorkers to match Cloudflare Workers API\n * Wraps Akamai's EW Request to provide Cloudflare-compatible interface\n */\n\nimport './streams';\n\nexport class Request {\n private ewRequest: any;\n private _url: string;\n private _method: string;\n private _headers: Headers;\n private _body: ReadableStream | null;\n private _bodyUsed: boolean = false;\n private _cachedBodyText: string | null = null;\n\n constructor(input: string | Request | any, init?: RequestInit) {\n if (typeof input === 'string') {\n this._url = input;\n this._method = init?.method?.toUpperCase() || 'GET';\n this._headers = new Headers(init?.headers);\n this._body = init?.body ? this.createReadableStream(init.body) : null;\n this.ewRequest = null;\n } else if (input instanceof Request) {\n this._url = input.url;\n this._method = input.method;\n this._headers = new Headers(input.headers);\n this._body = input._body;\n this.ewRequest = input.ewRequest;\n this._cachedBodyText = input._cachedBodyText;\n } else {\n // Akamai EW Request object - store reference for lazy body reading\n this.ewRequest = input;\n this._url = this.buildUrl(input);\n this._method = input.method?.toUpperCase() || 'GET';\n this._headers = this.convertHeaders(input);\n // Don't read body yet - will be read lazily when .text() is called\n this._body = null;\n }\n }\n\n private buildUrl(ewRequest: any): string {\n const scheme = ewRequest.scheme || 'https';\n const host = ewRequest.host || ewRequest.getHeader('host') || 'localhost';\n const path = ewRequest.path || '/';\n const query = ewRequest.query || '';\n\n return `${scheme}://${host}${path}${query ? '?' + query : ''}`;\n }\n\n private convertHeaders(ewRequest: any): Headers {\n const headers = new Headers();\n\n if (ewRequest.getHeaders) {\n const ewHeaders = ewRequest.getHeaders();\n for (const [name, values] of Object.entries(ewHeaders)) {\n if (Array.isArray(values)) {\n values.forEach((value: string) => headers.append(name, value));\n } else {\n headers.set(name, values as string);\n }\n }\n }\n\n return headers;\n }\n\n private createReadableStream(body: BodyInit): ReadableStream {\n return new ReadableStream({\n start(controller) {\n if (typeof body === 'string') {\n controller.enqueue(new TextEncoder().encode(body));\n } else if (body instanceof Uint8Array) {\n controller.enqueue(body);\n } else if (body instanceof ArrayBuffer) {\n controller.enqueue(new Uint8Array(body));\n }\n controller.close();\n }\n });\n }\n\n get url(): string {\n return this._url;\n }\n\n get method(): string {\n return this._method;\n }\n\n get headers(): Headers {\n return this._headers;\n }\n\n get bodyUsed(): boolean {\n return this._bodyUsed;\n }\n\n async text(): Promise<string> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n // If we have a cached body from cloning, use it\n if (this._cachedBodyText !== null) {\n return this._cachedBodyText;\n }\n\n // If this is an Akamai request, read body from it\n if (this.ewRequest && !this._body) {\n try {\n // Try different methods to get the body from Akamai request\n if (typeof this.ewRequest.text === 'function') {\n const bodyText = await this.ewRequest.text();\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (typeof this.ewRequest.json === 'function') {\n const bodyJson = await this.ewRequest.json();\n const bodyText = JSON.stringify(bodyJson);\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (typeof this.ewRequest.getBody === 'function') {\n const body = await this.ewRequest.getBody();\n const bodyText = typeof body === 'string' ? body : JSON.stringify(body);\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (this.ewRequest.body !== undefined && this.ewRequest.body !== null) {\n const bodyText = typeof this.ewRequest.body === 'string'\n ? this.ewRequest.body\n : JSON.stringify(this.ewRequest.body);\n this._cachedBodyText = bodyText;\n return bodyText;\n }\n } catch (error) {\n console.error('Error reading body from Akamai request:', error);\n }\n }\n\n if (!this._body) {\n return '';\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n const bodyText = new TextDecoder().decode(result);\n this._cachedBodyText = bodyText;\n return bodyText;\n }\n\n async json<T = any>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text);\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return new ArrayBuffer(0);\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result.buffer;\n }\n\n clone(): Request {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n\n const cloned = new Request(this._url, {\n method: this._method,\n headers: this._headers,\n });\n\n cloned.ewRequest = this.ewRequest;\n\n return cloned;\n }\n}\n\n// Headers polyfill for Akamai EdgeWorkers\nexport class Headers {\n private headers: Map<string, string[]> = new Map();\n\n constructor(init?: HeadersInit) {\n if (init) {\n if (init instanceof Headers) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n } else if (Array.isArray(init)) {\n init.forEach(([key, value]) => {\n this.append(key, value);\n });\n } else {\n Object.entries(init).forEach(([key, value]) => {\n this.append(key, value);\n });\n }\n }\n }\n\n append(name: string, value: string): void {\n const normalizedName = name.toLowerCase();\n const existing = this.headers.get(normalizedName) || [];\n existing.push(value);\n this.headers.set(normalizedName, existing);\n }\n\n delete(name: string): void {\n this.headers.delete(name.toLowerCase());\n }\n\n get(name: string): string | null {\n const values = this.headers.get(name.toLowerCase());\n return values ? values[0] : null;\n }\n\n has(name: string): boolean {\n return this.headers.has(name.toLowerCase());\n }\n\n set(name: string, value: string): void {\n this.headers.set(name.toLowerCase(), [value]);\n }\n\n forEach(callback: (value: string, key: string, parent: Headers) => void): void {\n this.headers.forEach((values, key) => {\n values.forEach(value => callback(value, key, this));\n });\n }\n\n entries(): IterableIterator<[string, string]> {\n const entries: [string, string][] = [];\n this.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries[Symbol.iterator]();\n }\n\n keys(): IterableIterator<string> {\n return this.headers.keys();\n }\n\n values(): IterableIterator<string> {\n const values: string[] = [];\n this.forEach(value => {\n values.push(value);\n });\n return values[Symbol.iterator]();\n }\n\n [Symbol.iterator](): IterableIterator<[string, string]> {\n return this.entries();\n }\n}\n\ntype HeadersInit = Headers | string[][] | Record<string, string>;\n\ninterface RequestInit {\n method?: string;\n headers?: HeadersInit;\n body?: BodyInit;\n}\n\ntype BodyInit = string | Uint8Array | ArrayBuffer;\n", "/**\n * Response polyfill for Akamai EdgeWorkers to match Cloudflare Workers API\n * Creates Cloudflare-compatible Response objects that can be converted to Akamai responses\n */\n\nimport './streams';\nimport { Headers } from './request';\n\nexport class Response {\n private _body: ReadableStream | null;\n private _bodyUsed: boolean = false;\n private _status: number;\n private _statusText: string;\n private _headers: Headers;\n private _ok: boolean;\n\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n this._status = init?.status || 200;\n this._statusText = init?.statusText || this.getStatusText(this._status);\n this._headers = new Headers(init?.headers);\n this._ok = this._status >= 200 && this._status < 300;\n\n if (body !== null && body !== undefined) {\n this._body = this.createReadableStream(body);\n } else {\n this._body = null;\n }\n }\n\n private getStatusText(status: number): string {\n const statusTexts: Record<number, string> = {\n 200: 'OK',\n 201: 'Created',\n 204: 'No Content',\n 301: 'Moved Permanently',\n 302: 'Found',\n 304: 'Not Modified',\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 500: 'Internal Server Error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n };\n return statusTexts[status] || '';\n }\n\n private createReadableStream(body: BodyInit): ReadableStream {\n return new ReadableStream({\n start(controller) {\n if (typeof body === 'string') {\n controller.enqueue(new TextEncoder().encode(body));\n } else if (body instanceof Uint8Array) {\n controller.enqueue(body);\n } else if (body instanceof ArrayBuffer) {\n controller.enqueue(new Uint8Array(body));\n } else if (body instanceof ReadableStream) {\n // Handle ReadableStream\n const reader = body.getReader();\n function push() {\n reader.read().then(({ done, value }) => {\n if (done) {\n controller.close();\n return;\n }\n controller.enqueue(value);\n push();\n });\n }\n push();\n return;\n }\n controller.close();\n }\n });\n }\n\n get body(): ReadableStream | null {\n return this._body;\n }\n\n get bodyUsed(): boolean {\n return this._bodyUsed;\n }\n\n get ok(): boolean {\n return this._ok;\n }\n\n get status(): number {\n return this._status;\n }\n\n get statusText(): string {\n return this._statusText;\n }\n\n get headers(): Headers {\n return this._headers;\n }\n\n async text(): Promise<string> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return '';\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return new TextDecoder().decode(result);\n }\n\n async json<T = any>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text);\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return new ArrayBuffer(0);\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result.buffer;\n }\n\n clone(): Response {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n\n return new Response(this._body, {\n status: this._status,\n statusText: this._statusText,\n headers: this._headers,\n });\n }\n\n static redirect(url: string, status?: number): Response {\n const redirectStatus = status || 302;\n return new Response(null, {\n status: redirectStatus,\n headers: {\n Location: url,\n },\n });\n }\n\n static json(data: any, init?: ResponseInit): Response {\n const body = JSON.stringify(data);\n const headers = new Headers(init?.headers);\n\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n\n return new Response(body, {\n ...init,\n headers,\n });\n }\n}\n\ntype BodyInit = string | Uint8Array | ArrayBuffer | ReadableStream;\n\ninterface ResponseInit {\n status?: number;\n statusText?: string;\n headers?: HeadersInit;\n}\n\ntype HeadersInit = Headers | string[][] | Record<string, string>;\n", "/**\n * KVNamespace polyfill for Akamai EdgeWorkers to match Cloudflare Workers KV API\n * Wraps Akamai EdgeKV to provide Cloudflare-compatible interface\n */\n\nexport class KVNamespace {\n private namespace: string;\n private group: string;\n private edgeKV: any;\n\n constructor(namespace: string, group: string = 'default') {\n this.namespace = namespace;\n this.group = group;\n\n // Lazy load EdgeKV when first accessed\n // In Akamai EdgeWorkers, you'd import: const { EdgeKV } = require('./edgekv.js');\n try {\n // @ts-ignore - EdgeKV is available in Akamai runtime\n const { EdgeKV } = require('./edgekv.js');\n this.edgeKV = new EdgeKV({ namespace: this.namespace, group: this.group });\n } catch (e) {\n console.warn('EdgeKV not available, KVNamespace will not function properly');\n }\n }\n\n /**\n * Get a value from EdgeKV (maps to Cloudflare KV get)\n */\n async get(key: string, options?: KVGetOptions): Promise<string | null>;\n async get(key: string, type: 'text'): Promise<string | null>;\n async get(key: string, type: 'json'): Promise<any>;\n async get(key: string, type: 'arrayBuffer'): Promise<ArrayBuffer | null>;\n async get(key: string, type: 'stream'): Promise<ReadableStream | null>;\n async get(\n key: string,\n optionsOrType?: KVGetOptions | 'text' | 'json' | 'arrayBuffer' | 'stream'\n ): Promise<string | any | ArrayBuffer | ReadableStream | null> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n try {\n const response = await this.edgeKV.getText({ item: key });\n\n if (response === null || response === undefined) {\n return null;\n }\n\n // Determine the type\n let type: string = 'text';\n if (typeof optionsOrType === 'string') {\n type = optionsOrType;\n } else if (optionsOrType && 'type' in optionsOrType) {\n type = optionsOrType.type || 'text';\n }\n\n switch (type) {\n case 'json':\n return JSON.parse(response);\n case 'arrayBuffer':\n return new TextEncoder().encode(response).buffer;\n case 'stream':\n return new ReadableStream({\n start(controller) {\n controller.enqueue(new TextEncoder().encode(response));\n controller.close();\n }\n });\n case 'text':\n default:\n return response;\n }\n } catch (error: any) {\n // EdgeKV throws 404 errors, Cloudflare returns null\n if (error.status === 404 || error.message?.includes('not found')) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Get value with metadata\n */\n async getWithMetadata<Metadata = unknown>(\n key: string,\n options?: KVGetOptions\n ): Promise<KVValueWithMetadata<string, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'text'\n ): Promise<KVValueWithMetadata<string, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'json'\n ): Promise<KVValueWithMetadata<any, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'arrayBuffer'\n ): Promise<KVValueWithMetadata<ArrayBuffer, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'stream'\n ): Promise<KVValueWithMetadata<ReadableStream, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n optionsOrType?: KVGetOptions | 'text' | 'json' | 'arrayBuffer' | 'stream'\n ): Promise<KVValueWithMetadata<any, Metadata>> {\n const value = await this.get(key, optionsOrType as any);\n\n // EdgeKV doesn't support metadata natively, so we return null for metadata\n return {\n value,\n metadata: null,\n };\n }\n\n /**\n * Put a value into EdgeKV (maps to Cloudflare KV put)\n */\n async put(key: string, value: string | ArrayBuffer | ReadableStream, options?: KVPutOptions): Promise<void> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n let stringValue: string;\n\n if (typeof value === 'string') {\n stringValue = value;\n } else if (value instanceof ArrayBuffer) {\n stringValue = new TextDecoder().decode(value);\n } else if (value instanceof ReadableStream) {\n // Read the stream\n const reader = value.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n stringValue = new TextDecoder().decode(result);\n } else {\n throw new TypeError('Invalid value type');\n }\n\n // EdgeKV doesn't support expiration or metadata in the same way\n // We'll just store the value\n await this.edgeKV.putText({ item: key, value: stringValue });\n }\n\n /**\n * Delete a value from EdgeKV (maps to Cloudflare KV delete)\n */\n async delete(key: string): Promise<void> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n try {\n await this.edgeKV.delete({ item: key });\n } catch (error: any) {\n // Ignore 404 errors\n if (error.status === 404 || error.message?.includes('not found')) {\n return;\n }\n throw error;\n }\n }\n\n /**\n * List keys in the namespace\n * Note: EdgeKV doesn't support listing keys, so this is a limited implementation\n */\n async list(options?: KVListOptions): Promise<KVListResult> {\n // EdgeKV doesn't natively support list operations\n // This would require a custom implementation or tracking keys separately\n console.warn('KVNamespace.list() is not fully supported with Akamai EdgeKV');\n\n return {\n keys: [],\n list_complete: true,\n cursor: undefined,\n };\n }\n}\n\ninterface KVGetOptions {\n type?: 'text' | 'json' | 'arrayBuffer' | 'stream';\n cacheTtl?: number;\n}\n\ninterface KVPutOptions {\n expiration?: number;\n expirationTtl?: number;\n metadata?: any;\n}\n\ninterface KVListOptions {\n prefix?: string;\n limit?: number;\n cursor?: string;\n}\n\ninterface KVListResult {\n keys: Array<{ name: string; expiration?: number; metadata?: any }>;\n list_complete: boolean;\n cursor?: string;\n}\n\ninterface KVValueWithMetadata<Value, Metadata> {\n value: Value | null;\n metadata: Metadata | null;\n}\n", "/**\n * Crypto polyfill for Akamai EdgeWorkers to match Cloudflare Workers Web Crypto API\n * Provides a subset of the Web Crypto API using Akamai's crypto module\n */\n\nexport class Crypto {\n /**\n * Generate cryptographically strong random values\n */\n getRandomValues<T extends ArrayBufferView>(array: T): T {\n // In Akamai EdgeWorkers, we can use the crypto module\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n return crypto.getRandomValues(array);\n }\n\n // Fallback implementation (not cryptographically secure, for development only)\n console.warn('Using fallback random number generation - not cryptographically secure');\n const bytes = new Uint8Array(array.buffer, array.byteOffset, array.byteLength);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n return array;\n }\n\n /**\n * Generate a random UUID\n */\n randomUUID(): string {\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback UUID v4 generation\n const bytes = new Uint8Array(16);\n this.getRandomValues(bytes);\n\n // Set version (4) and variant bits\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n\n const hex = Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n }\n\n /**\n * SubtleCrypto API for cryptographic operations\n */\n get subtle(): SubtleCrypto {\n return new SubtleCrypto();\n }\n}\n\nexport class SubtleCrypto {\n /**\n * Generate a digest (hash) of the data\n */\n async digest(algorithm: AlgorithmIdentifier, data: BufferSource): Promise<ArrayBuffer> {\n const algName = typeof algorithm === 'string' ? algorithm : algorithm.name;\n\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.digest) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.digest(algorithm, data);\n }\n\n // For Akamai EdgeWorkers without native crypto.subtle\n // You would need to use the crypto module's createHash or similar\n throw new Error(`Digest algorithm ${algName} not supported in this environment`);\n }\n\n /**\n * Sign data with a key\n */\n async sign(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.sign) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.sign(algorithm, key, data);\n }\n\n throw new Error('Sign operation not supported in this environment');\n }\n\n /**\n * Verify a signature\n */\n async verify(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n signature: BufferSource,\n data: BufferSource\n ): Promise<boolean> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.verify) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.verify(algorithm, key, signature, data);\n }\n\n throw new Error('Verify operation not supported in this environment');\n }\n\n /**\n * Encrypt data\n */\n async encrypt(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.encrypt) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.encrypt(algorithm, key, data);\n }\n\n throw new Error('Encrypt operation not supported in this environment');\n }\n\n /**\n * Decrypt data\n */\n async decrypt(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.decrypt) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.decrypt(algorithm, key, data);\n }\n\n throw new Error('Decrypt operation not supported in this environment');\n }\n\n /**\n * Generate a key\n */\n async generateKey(\n algorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey | CryptoKeyPair> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.generateKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.generateKey(algorithm, extractable, keyUsages);\n }\n\n throw new Error('GenerateKey operation not supported in this environment');\n }\n\n /**\n * Derive bits from a key\n */\n async deriveBits(\n algorithm: AlgorithmIdentifier,\n baseKey: CryptoKey,\n length: number\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.deriveBits) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.deriveBits(algorithm, baseKey, length);\n }\n\n throw new Error('DeriveBits operation not supported in this environment');\n }\n\n /**\n * Derive a key from another key\n */\n async deriveKey(\n algorithm: AlgorithmIdentifier,\n baseKey: CryptoKey,\n derivedKeyAlgorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.deriveKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages);\n }\n\n throw new Error('DeriveKey operation not supported in this environment');\n }\n\n /**\n * Import a key\n */\n async importKey(\n format: KeyFormat,\n keyData: BufferSource | JsonWebKey,\n algorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.importKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.importKey(format, keyData, algorithm, extractable, keyUsages);\n }\n\n throw new Error('ImportKey operation not supported in this environment');\n }\n\n /**\n * Export a key\n */\n async exportKey(format: KeyFormat, key: CryptoKey): Promise<ArrayBuffer | JsonWebKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.exportKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.exportKey(format, key);\n }\n\n throw new Error('ExportKey operation not supported in this environment');\n }\n\n /**\n * Wrap a key\n */\n async wrapKey(\n format: KeyFormat,\n key: CryptoKey,\n wrappingKey: CryptoKey,\n wrapAlgorithm: AlgorithmIdentifier\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.wrapKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.wrapKey(format, key, wrappingKey, wrapAlgorithm);\n }\n\n throw new Error('WrapKey operation not supported in this environment');\n }\n\n /**\n * Unwrap a key\n */\n async unwrapKey(\n format: KeyFormat,\n wrappedKey: BufferSource,\n unwrappingKey: CryptoKey,\n unwrapAlgorithm: AlgorithmIdentifier,\n unwrappedKeyAlgorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.unwrapKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.unwrapKey(\n format,\n wrappedKey,\n unwrappingKey,\n unwrapAlgorithm,\n unwrappedKeyAlgorithm,\n extractable,\n keyUsages\n );\n }\n\n throw new Error('UnwrapKey operation not supported in this environment');\n }\n}\n\n// Type definitions are provided by lib.dom.d.ts\n// We don't need to redefine them here since tsconfig includes \"DOM\" lib\n", "/**\n * Akamai EdgeWorkers to Cloudflare Workers API Polyfill\n *\n * This polyfill makes Akamai EdgeWorkers compatible with Cloudflare Workers API,\n * enabling the use of Optimizely Edge Delivery SDK and other Cloudflare-compatible\n * libraries on Akamai's edge platform.\n *\n * @example\n * ```typescript\n * import { Request, Response, KVNamespace, Crypto } from 'akamai-edge-delivery-polyfill';\n *\n * // Use in your EdgeWorker\n * export async function onClientRequest(request) {\n * const cfRequest = new Request(request);\n * const response = new Response('Hello World', { status: 200 });\n * return response;\n * }\n * ```\n */\n\n// Import streams polyfill first to ensure ReadableStream is available globally\nimport './streams';\n\nimport { Request, Headers } from './request';\nimport { Response } from './response';\nimport { KVNamespace } from './kv-namespace';\nimport { Crypto, SubtleCrypto } from './crypto';\nimport { ReadableStream } from './streams';\n\nexport { Request, Headers } from './request';\nexport { Response } from './response';\nexport { KVNamespace } from './kv-namespace';\nexport { Crypto, SubtleCrypto } from './crypto';\nexport { ReadableStream } from './streams';\n\n/**\n * Helper function to convert Akamai EdgeWorker Response to a format\n * that can be returned from EdgeWorker event handlers\n */\nexport async function toEdgeWorkerResponse(response: any): Promise<any> {\n const body = await response.text();\n const headers: Record<string, string> = {};\n\n response.headers.forEach((value: string, key: string) => {\n headers[key] = value;\n });\n\n return {\n status: response.status,\n headers,\n body,\n };\n}\n\n/**\n * Create a global polyfill that injects Cloudflare-compatible APIs into the global scope\n * This is useful when using libraries that expect these APIs to be globally available\n */\nexport function installGlobalPolyfills(): void {\n const g = globalThis as any;\n\n if (!g.Request) {\n g.Request = Request;\n }\n\n if (!g.Response) {\n g.Response = Response;\n }\n\n if (!g.Headers) {\n g.Headers = Headers;\n }\n\n if (!g.crypto) {\n g.crypto = new Crypto();\n }\n\n // Add TextEncoder and TextDecoder if not available\n if (!g.TextEncoder) {\n g.TextEncoder = class TextEncoder {\n encode(input: string): Uint8Array {\n const utf8: number[] = [];\n for (let i = 0; i < input.length; i++) {\n let charCode = input.charCodeAt(i);\n if (charCode < 0x80) {\n utf8.push(charCode);\n } else if (charCode < 0x800) {\n utf8.push(0xc0 | (charCode >> 6), 0x80 | (charCode & 0x3f));\n } else if (charCode < 0xd800 || charCode >= 0xe000) {\n utf8.push(0xe0 | (charCode >> 12), 0x80 | ((charCode >> 6) & 0x3f), 0x80 | (charCode & 0x3f));\n } else {\n i++;\n charCode = 0x10000 + (((charCode & 0x3ff) << 10) | (input.charCodeAt(i) & 0x3ff));\n utf8.push(\n 0xf0 | (charCode >> 18),\n 0x80 | ((charCode >> 12) & 0x3f),\n 0x80 | ((charCode >> 6) & 0x3f),\n 0x80 | (charCode & 0x3f)\n );\n }\n }\n return new Uint8Array(utf8);\n }\n };\n }\n\n if (!g.TextDecoder) {\n g.TextDecoder = class TextDecoder {\n decode(input: Uint8Array | ArrayBuffer): string {\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n let result = '';\n let i = 0;\n\n while (i < bytes.length) {\n const byte1 = bytes[i++];\n\n if (byte1 < 0x80) {\n result += String.fromCharCode(byte1);\n } else if (byte1 < 0xe0) {\n const byte2 = bytes[i++];\n result += String.fromCharCode(((byte1 & 0x1f) << 6) | (byte2 & 0x3f));\n } else if (byte1 < 0xf0) {\n const byte2 = bytes[i++];\n const byte3 = bytes[i++];\n result += String.fromCharCode(((byte1 & 0x0f) << 12) | ((byte2 & 0x3f) << 6) | (byte3 & 0x3f));\n } else {\n const byte2 = bytes[i++];\n const byte3 = bytes[i++];\n const byte4 = bytes[i++];\n let codePoint =\n ((byte1 & 0x07) << 18) | ((byte2 & 0x3f) << 12) | ((byte3 & 0x3f) << 6) | (byte4 & 0x3f);\n codePoint -= 0x10000;\n result += String.fromCharCode(0xd800 + (codePoint >> 10), 0xdc00 + (codePoint & 0x3ff));\n }\n }\n\n return result;\n }\n };\n }\n\n // Add ReadableStream if not available (basic implementation)\n if (!g.ReadableStream) {\n g.ReadableStream = class ReadableStream {\n private controller: any;\n private started = false;\n private closed = false;\n\n constructor(underlyingSource?: any) {\n this.controller = {\n enqueue: (chunk: any) => {\n this.controller._queue = this.controller._queue || [];\n this.controller._queue.push(chunk);\n },\n close: () => {\n this.closed = true;\n },\n error: (e: any) => {\n this.controller._error = e;\n },\n _queue: [],\n _error: null,\n };\n\n if (underlyingSource && underlyingSource.start) {\n underlyingSource.start(this.controller);\n this.started = true;\n }\n }\n\n getReader(): any {\n return {\n read: async () => {\n if (this.controller._error) {\n throw this.controller._error;\n }\n\n if (this.controller._queue.length > 0) {\n return { done: false, value: this.controller._queue.shift() };\n }\n\n if (this.closed) {\n return { done: true, value: undefined };\n }\n\n return { done: true, value: undefined };\n },\n releaseLock: () => {},\n };\n }\n };\n }\n}\n\n// Default export\nexport default {\n Request,\n Response,\n Headers,\n ReadableStream,\n KVNamespace,\n Crypto,\n SubtleCrypto,\n toEdgeWorkerResponse,\n installGlobalPolyfills,\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * ReadableStream polyfill for Akamai EdgeWorkers\n * Provides basic ReadableStream functionality for body handling\n */\n\nexport class ReadableStream {\n private readonly chunks: Uint8Array[] = [];\n private closed: boolean = false;\n\n constructor(source?: { start?: (controller: ReadableStreamController) => void }) {\n const controller: ReadableStreamController = {\n enqueue: (chunk: Uint8Array) => {\n if (!this.closed) {\n this.chunks.push(chunk);\n }\n },\n close: () => {\n this.closed = true;\n }\n };\n\n if (source?.start) {\n source.start(controller);\n }\n }\n\n getReader(): ReadableStreamReader {\n return new ReadableStreamReader(this.chunks);\n }\n}\n\nexport class ReadableStreamReader {\n private readonly chunks: Uint8Array[];\n private index: number = 0;\n\n constructor(chunks: Uint8Array[]) {\n this.chunks = chunks;\n }\n\n async read(): Promise<{ done: boolean; value?: Uint8Array }> {\n if (this.index < this.chunks.length) {\n return { done: false, value: this.chunks[this.index++] };\n }\n return { done: true };\n }\n}\n\nexport interface ReadableStreamController {\n enqueue(chunk: Uint8Array): void;\n close(): void;\n}\n\n// Make ReadableStream available globally for Akamai EdgeWorkers\nif (typeof globalThis !== 'undefined' && !globalThis.ReadableStream) {\n (globalThis as any).ReadableStream = ReadableStream;\n}\n", "/**\n * Request polyfill for Akamai EdgeWorkers to match Cloudflare Workers API\n * Wraps Akamai's EW Request to provide Cloudflare-compatible interface\n */\n\nimport './streams';\n\nexport class Request {\n private ewRequest: any;\n private _url: string;\n private _method: string;\n private _headers: Headers;\n private _body: ReadableStream | null;\n private _bodyUsed: boolean = false;\n private _cachedBodyText: string | null = null;\n\n constructor(input: string | Request | any, init?: RequestInit) {\n if (typeof input === 'string') {\n this._url = input;\n this._method = init?.method?.toUpperCase() || 'GET';\n this._headers = new Headers(init?.headers);\n this._body = init?.body ? this.createReadableStream(init.body) : null;\n this.ewRequest = null;\n } else if (input instanceof Request) {\n this._url = input.url;\n this._method = input.method;\n this._headers = new Headers(input.headers);\n this._body = input._body;\n this.ewRequest = input.ewRequest;\n this._cachedBodyText = input._cachedBodyText;\n } else {\n // Akamai EW Request object - store reference for lazy body reading\n this.ewRequest = input;\n this._url = this.buildUrl(input);\n this._method = input.method?.toUpperCase() || 'GET';\n this._headers = this.convertHeaders(input);\n // Don't read body yet - will be read lazily when .text() is called\n this._body = null;\n }\n }\n\n private buildUrl(ewRequest: any): string {\n const scheme = ewRequest.scheme || 'https';\n const host = ewRequest.host || ewRequest.getHeader('host') || 'localhost';\n const path = ewRequest.path || '/';\n const query = ewRequest.query || '';\n\n return `${scheme}://${host}${path}${query ? '?' + query : ''}`;\n }\n\n private convertHeaders(ewRequest: any): Headers {\n const headers = new Headers();\n\n if (ewRequest.getHeaders) {\n const ewHeaders = ewRequest.getHeaders();\n for (const [name, values] of Object.entries(ewHeaders)) {\n if (Array.isArray(values)) {\n values.forEach((value: string) => headers.append(name, value));\n } else {\n headers.set(name, values as string);\n }\n }\n }\n\n return headers;\n }\n\n private createReadableStream(body: BodyInit): ReadableStream {\n return new ReadableStream({\n start(controller) {\n if (typeof body === 'string') {\n controller.enqueue(new TextEncoder().encode(body));\n } else if (body instanceof Uint8Array) {\n controller.enqueue(body);\n } else if (body instanceof ArrayBuffer) {\n controller.enqueue(new Uint8Array(body));\n }\n controller.close();\n }\n });\n }\n\n get url(): string {\n return this._url;\n }\n\n get method(): string {\n return this._method;\n }\n\n get headers(): Headers {\n return this._headers;\n }\n\n get bodyUsed(): boolean {\n return this._bodyUsed;\n }\n\n async text(): Promise<string> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n // If we have a cached body from cloning, use it\n if (this._cachedBodyText !== null) {\n return this._cachedBodyText;\n }\n\n // If this is an Akamai request, read body from it\n if (this.ewRequest && !this._body) {\n try {\n // Try different methods to get the body from Akamai request\n if (typeof this.ewRequest.text === 'function') {\n const bodyText = await this.ewRequest.text();\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (typeof this.ewRequest.json === 'function') {\n const bodyJson = await this.ewRequest.json();\n const bodyText = JSON.stringify(bodyJson);\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (typeof this.ewRequest.getBody === 'function') {\n const body = await this.ewRequest.getBody();\n const bodyText = typeof body === 'string' ? body : JSON.stringify(body);\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (this.ewRequest.body !== undefined && this.ewRequest.body !== null) {\n const bodyText = typeof this.ewRequest.body === 'string'\n ? this.ewRequest.body\n : JSON.stringify(this.ewRequest.body);\n this._cachedBodyText = bodyText;\n return bodyText;\n }\n } catch (error) {\n console.error('Error reading body from Akamai request:', error);\n }\n }\n\n if (!this._body) {\n return '';\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n const bodyText = new TextDecoder().decode(result);\n this._cachedBodyText = bodyText;\n return bodyText;\n }\n\n async json<T = any>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text);\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return new ArrayBuffer(0);\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result.buffer;\n }\n\n clone(): Request {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n\n const cloned = new Request(this._url, {\n method: this._method,\n headers: this._headers,\n });\n\n cloned.ewRequest = this.ewRequest;\n\n return cloned;\n }\n}\n\n// Headers polyfill for Akamai EdgeWorkers\nexport class Headers {\n private headers: Map<string, string[]> = new Map();\n\n constructor(init?: HeadersInit) {\n if (init) {\n if (init instanceof Headers) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n } else if (Array.isArray(init)) {\n init.forEach(([key, value]) => {\n this.append(key, value);\n });\n } else {\n Object.entries(init).forEach(([key, value]) => {\n this.append(key, value);\n });\n }\n }\n }\n\n append(name: string, value: string): void {\n const normalizedName = name.toLowerCase();\n const existing = this.headers.get(normalizedName) || [];\n existing.push(value);\n this.headers.set(normalizedName, existing);\n }\n\n delete(name: string): void {\n this.headers.delete(name.toLowerCase());\n }\n\n get(name: string): string | null {\n const values = this.headers.get(name.toLowerCase());\n return values ? values[0] : null;\n }\n\n has(name: string): boolean {\n return this.headers.has(name.toLowerCase());\n }\n\n set(name: string, value: string): void {\n this.headers.set(name.toLowerCase(), [value]);\n }\n\n forEach(callback: (value: string, key: string, parent: Headers) => void): void {\n this.headers.forEach((values, key) => {\n values.forEach(value => callback(value, key, this));\n });\n }\n\n entries(): IterableIterator<[string, string]> {\n const entries: [string, string][] = [];\n this.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries[Symbol.iterator]();\n }\n\n keys(): IterableIterator<string> {\n return this.headers.keys();\n }\n\n values(): IterableIterator<string> {\n const values: string[] = [];\n this.forEach(value => {\n values.push(value);\n });\n return values[Symbol.iterator]();\n }\n\n [Symbol.iterator](): IterableIterator<[string, string]> {\n return this.entries();\n }\n}\n\ntype HeadersInit = Headers | string[][] | Record<string, string>;\n\ninterface RequestInit {\n method?: string;\n headers?: HeadersInit;\n body?: BodyInit;\n}\n\ntype BodyInit = string | Uint8Array | ArrayBuffer;\n", "/**\n * Response polyfill for Akamai EdgeWorkers to match Cloudflare Workers API\n * Creates Cloudflare-compatible Response objects that can be converted to Akamai responses\n */\n\nimport './streams';\nimport { Headers } from './request';\n\nexport class Response {\n private _body: ReadableStream | null;\n private _bodyUsed: boolean = false;\n private _status: number;\n private _statusText: string;\n private _headers: Headers;\n private _ok: boolean;\n\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n this._status = init?.status || 200;\n this._statusText = init?.statusText || this.getStatusText(this._status);\n this._headers = new Headers(init?.headers);\n this._ok = this._status >= 200 && this._status < 300;\n\n if (body !== null && body !== undefined) {\n this._body = this.createReadableStream(body);\n } else {\n this._body = null;\n }\n }\n\n private getStatusText(status: number): string {\n const statusTexts: Record<number, string> = {\n 200: 'OK',\n 201: 'Created',\n 204: 'No Content',\n 301: 'Moved Permanently',\n 302: 'Found',\n 304: 'Not Modified',\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 500: 'Internal Server Error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n };\n return statusTexts[status] || '';\n }\n\n private createReadableStream(body: BodyInit): ReadableStream {\n return new ReadableStream({\n start(controller) {\n if (typeof body === 'string') {\n controller.enqueue(new TextEncoder().encode(body));\n } else if (body instanceof Uint8Array) {\n controller.enqueue(body);\n } else if (body instanceof ArrayBuffer) {\n controller.enqueue(new Uint8Array(body));\n } else if (body instanceof ReadableStream) {\n // Handle ReadableStream\n const reader = body.getReader();\n function push() {\n reader.read().then(({ done, value }) => {\n if (done) {\n controller.close();\n return;\n }\n controller.enqueue(value);\n push();\n });\n }\n push();\n return;\n }\n controller.close();\n }\n });\n }\n\n get body(): ReadableStream | null {\n return this._body;\n }\n\n get bodyUsed(): boolean {\n return this._bodyUsed;\n }\n\n get ok(): boolean {\n return this._ok;\n }\n\n get status(): number {\n return this._status;\n }\n\n get statusText(): string {\n return this._statusText;\n }\n\n get headers(): Headers {\n return this._headers;\n }\n\n async text(): Promise<string> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return '';\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return new TextDecoder().decode(result);\n }\n\n async json<T = any>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text);\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return new ArrayBuffer(0);\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result.buffer;\n }\n\n clone(): Response {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n\n return new Response(this._body, {\n status: this._status,\n statusText: this._statusText,\n headers: this._headers,\n });\n }\n\n static redirect(url: string, status?: number): Response {\n const redirectStatus = status || 302;\n return new Response(null, {\n status: redirectStatus,\n headers: {\n Location: url,\n },\n });\n }\n\n static json(data: any, init?: ResponseInit): Response {\n const body = JSON.stringify(data);\n const headers = new Headers(init?.headers);\n\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n\n return new Response(body, {\n ...init,\n headers,\n });\n }\n}\n\ntype BodyInit = string | Uint8Array | ArrayBuffer | ReadableStream;\n\ninterface ResponseInit {\n status?: number;\n statusText?: string;\n headers?: HeadersInit;\n}\n\ntype HeadersInit = Headers | string[][] | Record<string, string>;\n", "/**\n * KVNamespace polyfill for Akamai EdgeWorkers to match Cloudflare Workers KV API\n * Wraps Akamai EdgeKV to provide Cloudflare-compatible interface\n */\n\nexport class KVNamespace {\n private edgeKV: any;\n\n constructor(edgeKV: any) {\n this.edgeKV = edgeKV;\n }\n\n /**\n * Sanitize key to be compatible with EdgeKV requirements\n * EdgeKV only allows A-Z a-z 0-9 _ - (max 512 chars)\n * Replace invalid characters with hyphens\n */\n private sanitizeKey(key: string): string {\n // Replace any character that's not alphanumeric, underscore, or hyphen with hyphen\n const sanitized = key.replace(/[^A-Za-z0-9_-]/g, '-');\n\n // Ensure it's within 512 character limit\n if (sanitized.length > 512) {\n console.warn(`Key \"${key}\" exceeds 512 characters, truncating to 512`);\n return sanitized.substring(0, 512);\n }\n\n return sanitized;\n }\n\n /**\n * Get a value from EdgeKV (maps to Cloudflare KV get)\n */\n async get(key: string, options?: KVGetOptions): Promise<string | null>;\n async get(key: string, type: 'text'): Promise<string | null>;\n async get(key: string, type: 'json'): Promise<any>;\n async get(key: string, type: 'arrayBuffer'): Promise<ArrayBuffer | null>;\n async get(key: string, type: 'stream'): Promise<ReadableStream | null>;\n async get(\n key: string,\n optionsOrType?: KVGetOptions | 'text' | 'json' | 'arrayBuffer' | 'stream'\n ): Promise<string | any | ArrayBuffer | ReadableStream | null> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n // Sanitize key for EdgeKV compatibility\n const sanitizedKey = this.sanitizeKey(key);\n\n let response: string | null = null;\n\n try {\n response = await this.edgeKV.getText({ item: sanitizedKey });\n } catch (error: any) {\n // EdgeKV throws 404 errors, Cloudflare returns null\n if (error.status === 404 || error.message?.includes('not found')) {\n return null;\n }\n throw error;\n }\n\n if (response === null || response === undefined) {\n return null;\n }\n\n // Determine the type\n let type: string = 'text';\n if (typeof optionsOrType === 'string') {\n type = optionsOrType;\n } else if (optionsOrType && 'type' in optionsOrType) {\n type = optionsOrType.type || 'text';\n }\n\n switch (type) {\n case 'json':\n return JSON.parse(response);\n case 'arrayBuffer':\n return new TextEncoder().encode(response).buffer;\n case 'stream':\n return new ReadableStream({\n start(controller) {\n controller.enqueue(new TextEncoder().encode(response));\n controller.close();\n }\n });\n case 'text':\n default:\n return response;\n }\n }\n\n /**\n * Get value with metadata\n */\n async getWithMetadata<Metadata = unknown>(\n key: string,\n options?: KVGetOptions\n ): Promise<KVValueWithMetadata<string, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'text'\n ): Promise<KVValueWithMetadata<string, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'json'\n ): Promise<KVValueWithMetadata<any, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'arrayBuffer'\n ): Promise<KVValueWithMetadata<ArrayBuffer, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'stream'\n ): Promise<KVValueWithMetadata<ReadableStream, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n optionsOrType?: KVGetOptions | 'text' | 'json' | 'arrayBuffer' | 'stream'\n ): Promise<KVValueWithMetadata<any, Metadata>> {\n const value = await this.get(key, optionsOrType as any);\n\n // EdgeKV doesn't support metadata natively, so we return null for metadata\n return {\n value,\n metadata: null,\n };\n }\n\n /**\n * Put a value into EdgeKV (maps to Cloudflare KV put)\n */\n async put(key: string, value: string | ArrayBuffer | ReadableStream, options?: KVPutOptions): Promise<void> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n // Sanitize key for EdgeKV compatibility\n const sanitizedKey = this.sanitizeKey(key);\n\n let stringValue: string;\n\n if (typeof value === 'string') {\n stringValue = value;\n } else if (value instanceof ArrayBuffer) {\n stringValue = new TextDecoder().decode(value);\n } else if (value instanceof ReadableStream) {\n // Read the stream\n const reader = value.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n stringValue = new TextDecoder().decode(result);\n } else {\n throw new TypeError('Invalid value type');\n }\n\n // EdgeKV doesn't support expiration or metadata in the same way\n // We'll just store the value\n await this.edgeKV.putText({ item: sanitizedKey, value: stringValue });\n }\n\n /**\n * Delete a value from EdgeKV (maps to Cloudflare KV delete)\n */\n async delete(key: string): Promise<void> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n // Sanitize key for EdgeKV compatibility\n const sanitizedKey = this.sanitizeKey(key);\n\n try {\n await this.edgeKV.delete({ item: sanitizedKey });\n } catch (error: any) {\n // Ignore 404 errors\n if (error.status === 404 || error.message?.includes('not found')) {\n return;\n }\n throw error;\n }\n }\n\n /**\n * List keys in the namespace\n * Note: EdgeKV doesn't support listing keys, so this is a limited implementation\n */\n async list(options?: KVListOptions): Promise<KVListResult> {\n // EdgeKV doesn't natively support list operations\n // This would require a custom implementation or tracking keys separately\n console.warn('KVNamespace.list() is not fully supported with Akamai EdgeKV');\n\n return {\n keys: [],\n list_complete: true,\n cursor: undefined,\n };\n }\n}\n\ninterface KVGetOptions {\n type?: 'text' | 'json' | 'arrayBuffer' | 'stream';\n cacheTtl?: number;\n}\n\ninterface KVPutOptions {\n expiration?: number;\n expirationTtl?: number;\n metadata?: any;\n}\n\ninterface KVListOptions {\n prefix?: string;\n limit?: number;\n cursor?: string;\n}\n\ninterface KVListResult {\n keys: Array<{ name: string; expiration?: number; metadata?: any }>;\n list_complete: boolean;\n cursor?: string;\n}\n\ninterface KVValueWithMetadata<Value, Metadata> {\n value: Value | null;\n metadata: Metadata | null;\n}\n", "/**\n * Crypto polyfill for Akamai EdgeWorkers to match Cloudflare Workers Web Crypto API\n * Provides a subset of the Web Crypto API using Akamai's crypto module\n */\n\nexport class Crypto {\n /**\n * Generate cryptographically strong random values\n */\n getRandomValues<T extends ArrayBufferView>(array: T): T {\n // In Akamai EdgeWorkers, we can use the crypto module\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n return crypto.getRandomValues(array);\n }\n\n // Fallback implementation (not cryptographically secure, for development only)\n console.warn('Using fallback random number generation - not cryptographically secure');\n const bytes = new Uint8Array(array.buffer, array.byteOffset, array.byteLength);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n return array;\n }\n\n /**\n * Generate a random UUID\n */\n randomUUID(): string {\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback UUID v4 generation\n const bytes = new Uint8Array(16);\n this.getRandomValues(bytes);\n\n // Set version (4) and variant bits\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n\n const hex = Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n }\n\n /**\n * SubtleCrypto API for cryptographic operations\n */\n get subtle(): SubtleCrypto {\n return new SubtleCrypto();\n }\n}\n\nexport class SubtleCrypto {\n /**\n * Generate a digest (hash) of the data\n */\n async digest(algorithm: AlgorithmIdentifier, data: BufferSource): Promise<ArrayBuffer> {\n const algName = typeof algorithm === 'string' ? algorithm : algorithm.name;\n\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.digest) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.digest(algorithm, data);\n }\n\n // For Akamai EdgeWorkers without native crypto.subtle\n // You would need to use the crypto module's createHash or similar\n throw new Error(`Digest algorithm ${algName} not supported in this environment`);\n }\n\n /**\n * Sign data with a key\n */\n async sign(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.sign) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.sign(algorithm, key, data);\n }\n\n throw new Error('Sign operation not supported in this environment');\n }\n\n /**\n * Verify a signature\n */\n async verify(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n signature: BufferSource,\n data: BufferSource\n ): Promise<boolean> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.verify) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.verify(algorithm, key, signature, data);\n }\n\n throw new Error('Verify operation not supported in this environment');\n }\n\n /**\n * Encrypt data\n */\n async encrypt(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.encrypt) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.encrypt(algorithm, key, data);\n }\n\n throw new Error('Encrypt operation not supported in this environment');\n }\n\n /**\n * Decrypt data\n */\n async decrypt(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.decrypt) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.decrypt(algorithm, key, data);\n }\n\n throw new Error('Decrypt operation not supported in this environment');\n }\n\n /**\n * Generate a key\n */\n async generateKey(\n algorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey | CryptoKeyPair> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.generateKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.generateKey(algorithm, extractable, keyUsages);\n }\n\n throw new Error('GenerateKey operation not supported in this environment');\n }\n\n /**\n * Derive bits from a key\n */\n async deriveBits(\n algorithm: AlgorithmIdentifier,\n baseKey: CryptoKey,\n length: number\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.deriveBits) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.deriveBits(algorithm, baseKey, length);\n }\n\n throw new Error('DeriveBits operation not supported in this environment');\n }\n\n /**\n * Derive a key from another key\n */\n async deriveKey(\n algorithm: AlgorithmIdentifier,\n baseKey: CryptoKey,\n derivedKeyAlgorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.deriveKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages);\n }\n\n throw new Error('DeriveKey operation not supported in this environment');\n }\n\n /**\n * Import a key\n */\n async importKey(\n format: KeyFormat,\n keyData: BufferSource | JsonWebKey,\n algorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.importKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.importKey(format, keyData, algorithm, extractable, keyUsages);\n }\n\n throw new Error('ImportKey operation not supported in this environment');\n }\n\n /**\n * Export a key\n */\n async exportKey(format: KeyFormat, key: CryptoKey): Promise<ArrayBuffer | JsonWebKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.exportKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.exportKey(format, key);\n }\n\n throw new Error('ExportKey operation not supported in this environment');\n }\n\n /**\n * Wrap a key\n */\n async wrapKey(\n format: KeyFormat,\n key: CryptoKey,\n wrappingKey: CryptoKey,\n wrapAlgorithm: AlgorithmIdentifier\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.wrapKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.wrapKey(format, key, wrappingKey, wrapAlgorithm);\n }\n\n throw new Error('WrapKey operation not supported in this environment');\n }\n\n /**\n * Unwrap a key\n */\n async unwrapKey(\n format: KeyFormat,\n wrappedKey: BufferSource,\n unwrappingKey: CryptoKey,\n unwrapAlgorithm: AlgorithmIdentifier,\n unwrappedKeyAlgorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.unwrapKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.unwrapKey(\n format,\n wrappedKey,\n unwrappingKey,\n unwrapAlgorithm,\n unwrappedKeyAlgorithm,\n extractable,\n keyUsages\n );\n }\n\n throw new Error('UnwrapKey operation not supported in this environment');\n }\n}\n\n// Type definitions are provided by lib.dom.d.ts\n// We don't need to redefine them here since tsconfig includes \"DOM\" lib\n", "/**\n * Akamai EdgeWorkers to Cloudflare Workers API Polyfill\n *\n * This polyfill makes Akamai EdgeWorkers compatible with Cloudflare Workers API,\n * enabling the use of Optimizely Edge Delivery SDK and other Cloudflare-compatible\n * libraries on Akamai's edge platform.\n *\n * @example\n * ```typescript\n * import { Request, Response, KVNamespace, Crypto } from 'akamai-edge-delivery-polyfill';\n *\n * // Use in your EdgeWorker\n * export async function onClientRequest(request) {\n * const cfRequest = new Request(request);\n * const response = new Response('Hello World', { status: 200 });\n * return response;\n * }\n * ```\n */\n\n// Import streams polyfill first to ensure ReadableStream is available globally\nimport './streams';\n\nimport { Request, Headers } from './request';\nimport { Response } from './response';\nimport { KVNamespace } from './kv-namespace';\nimport { Crypto, SubtleCrypto } from './crypto';\nimport { ReadableStream } from './streams';\n\nexport { Request, Headers } from './request';\nexport { Response } from './response';\nexport { KVNamespace } from './kv-namespace';\nexport { Crypto, SubtleCrypto } from './crypto';\nexport { ReadableStream } from './streams';\n\n/**\n * Helper function to convert Akamai EdgeWorker Response to a format\n * that can be returned from EdgeWorker event handlers\n */\nexport async function toEdgeWorkerResponse(response: any): Promise<any> {\n const body = await response.text();\n const headers: Record<string, string> = {};\n\n response.headers.forEach((value: string, key: string) => {\n headers[key] = value;\n });\n\n return {\n status: response.status,\n headers,\n body,\n };\n}\n\n/**\n * Create a global polyfill that injects Cloudflare-compatible APIs into the global scope\n * This is useful when using libraries that expect these APIs to be globally available\n */\nexport function installGlobalPolyfills(): void {\n const g = globalThis as any;\n\n if (!g.Request) {\n g.Request = Request;\n }\n\n if (!g.Response) {\n g.Response = Response;\n }\n\n if (!g.Headers) {\n g.Headers = Headers;\n }\n\n if (!g.crypto) {\n g.crypto = new Crypto();\n }\n\n // Add TextEncoder and TextDecoder if not available\n if (!g.TextEncoder) {\n g.TextEncoder = class TextEncoder {\n encode(input: string): Uint8Array {\n const utf8: number[] = [];\n for (let i = 0; i < input.length; i++) {\n let charCode = input.charCodeAt(i);\n if (charCode < 0x80) {\n utf8.push(charCode);\n } else if (charCode < 0x800) {\n utf8.push(0xc0 | (charCode >> 6), 0x80 | (charCode & 0x3f));\n } else if (charCode < 0xd800 || charCode >= 0xe000) {\n utf8.push(0xe0 | (charCode >> 12), 0x80 | ((charCode >> 6) & 0x3f), 0x80 | (charCode & 0x3f));\n } else {\n i++;\n charCode = 0x10000 + (((charCode & 0x3ff) << 10) | (input.charCodeAt(i) & 0x3ff));\n utf8.push(\n 0xf0 | (charCode >> 18),\n 0x80 | ((charCode >> 12) & 0x3f),\n 0x80 | ((charCode >> 6) & 0x3f),\n 0x80 | (charCode & 0x3f)\n );\n }\n }\n return new Uint8Array(utf8);\n }\n };\n }\n\n if (!g.TextDecoder) {\n g.TextDecoder = class TextDecoder {\n decode(input: Uint8Array | ArrayBuffer): string {\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n let result = '';\n let i = 0;\n\n while (i < bytes.length) {\n const byte1 = bytes[i++];\n\n if (byte1 < 0x80) {\n result += String.fromCharCode(byte1);\n } else if (byte1 < 0xe0) {\n const byte2 = bytes[i++];\n result += String.fromCharCode(((byte1 & 0x1f) << 6) | (byte2 & 0x3f));\n } else if (byte1 < 0xf0) {\n const byte2 = bytes[i++];\n const byte3 = bytes[i++];\n result += String.fromCharCode(((byte1 & 0x0f) << 12) | ((byte2 & 0x3f) << 6) | (byte3 & 0x3f));\n } else {\n const byte2 = bytes[i++];\n const byte3 = bytes[i++];\n const byte4 = bytes[i++];\n let codePoint =\n ((byte1 & 0x07) << 18) | ((byte2 & 0x3f) << 12) | ((byte3 & 0x3f) << 6) | (byte4 & 0x3f);\n codePoint -= 0x10000;\n result += String.fromCharCode(0xd800 + (codePoint >> 10), 0xdc00 + (codePoint & 0x3ff));\n }\n }\n\n return result;\n }\n };\n }\n\n // Add ReadableStream if not available (basic implementation)\n if (!g.ReadableStream) {\n g.ReadableStream = class ReadableStream {\n private controller: any;\n private started = false;\n private closed = false;\n\n constructor(underlyingSource?: any) {\n this.controller = {\n enqueue: (chunk: any) => {\n this.controller._queue = this.controller._queue || [];\n this.controller._queue.push(chunk);\n },\n close: () => {\n this.closed = true;\n },\n error: (e: any) => {\n this.controller._error = e;\n },\n _queue: [],\n _error: null,\n };\n\n if (underlyingSource && underlyingSource.start) {\n underlyingSource.start(this.controller);\n this.started = true;\n }\n }\n\n getReader(): any {\n return {\n read: async () => {\n if (this.controller._error) {\n throw this.controller._error;\n }\n\n if (this.controller._queue.length > 0) {\n return { done: false, value: this.controller._queue.shift() };\n }\n\n if (this.closed) {\n return { done: true, value: undefined };\n }\n\n return { done: true, value: undefined };\n },\n releaseLock: () => {},\n };\n }\n };\n }\n}\n\n// Default export\nexport default {\n Request,\n Response,\n Headers,\n ReadableStream,\n KVNamespace,\n Crypto,\n SubtleCrypto,\n toEdgeWorkerResponse,\n installGlobalPolyfills,\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["ReadableStream", "bodyText", "value", "ReadableStream"]
7
7
  }
@@ -3,10 +3,14 @@
3
3
  * Wraps Akamai EdgeKV to provide Cloudflare-compatible interface
4
4
  */
5
5
  export declare class KVNamespace {
6
- private namespace;
7
- private group;
8
6
  private edgeKV;
9
- constructor(namespace: string, group?: string);
7
+ constructor(edgeKV: any);
8
+ /**
9
+ * Sanitize key to be compatible with EdgeKV requirements
10
+ * EdgeKV only allows A-Z a-z 0-9 _ - (max 512 chars)
11
+ * Replace invalid characters with hyphens
12
+ */
13
+ private sanitizeKey;
10
14
  /**
11
15
  * Get a value from EdgeKV (maps to Cloudflare KV get)
12
16
  */
@@ -1 +1 @@
1
- {"version":3,"file":"kv-namespace.d.ts","sourceRoot":"","sources":["../src/kv-namespace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"kv-namespace.d.ts","sourceRoot":"","sources":["../src/kv-namespace.ts"],"names":[],"mappings":"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"}
@@ -1,60 +1,60 @@
1
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
- }) : x)(function(x) {
4
- if (typeof require !== "undefined")
5
- return require.apply(this, arguments);
6
- throw Error('Dynamic require of "' + x + '" is not supported');
7
- });
8
-
9
1
  // src/kv-namespace.ts
10
2
  var KVNamespace = class {
11
- constructor(namespace, group = "default") {
12
- this.namespace = namespace;
13
- this.group = group;
14
- try {
15
- const { EdgeKV } = __require("./edgekv.js");
16
- this.edgeKV = new EdgeKV({ namespace: this.namespace, group: this.group });
17
- } catch (e) {
18
- console.warn("EdgeKV not available, KVNamespace will not function properly");
3
+ constructor(edgeKV) {
4
+ this.edgeKV = edgeKV;
5
+ }
6
+ /**
7
+ * Sanitize key to be compatible with EdgeKV requirements
8
+ * EdgeKV only allows A-Z a-z 0-9 _ - (max 512 chars)
9
+ * Replace invalid characters with hyphens
10
+ */
11
+ sanitizeKey(key) {
12
+ const sanitized = key.replace(/[^A-Za-z0-9_-]/g, "-");
13
+ if (sanitized.length > 512) {
14
+ console.warn(`Key "${key}" exceeds 512 characters, truncating to 512`);
15
+ return sanitized.substring(0, 512);
19
16
  }
17
+ return sanitized;
20
18
  }
21
19
  async get(key, optionsOrType) {
22
20
  if (!this.edgeKV) {
23
21
  throw new Error("EdgeKV not initialized");
24
22
  }
23
+ const sanitizedKey = this.sanitizeKey(key);
24
+ let response = null;
25
25
  try {
26
- const response = await this.edgeKV.getText({ item: key });
27
- if (response === null || response === void 0) {
28
- return null;
29
- }
30
- let type = "text";
31
- if (typeof optionsOrType === "string") {
32
- type = optionsOrType;
33
- } else if (optionsOrType && "type" in optionsOrType) {
34
- type = optionsOrType.type || "text";
35
- }
36
- switch (type) {
37
- case "json":
38
- return JSON.parse(response);
39
- case "arrayBuffer":
40
- return new TextEncoder().encode(response).buffer;
41
- case "stream":
42
- return new ReadableStream({
43
- start(controller) {
44
- controller.enqueue(new TextEncoder().encode(response));
45
- controller.close();
46
- }
47
- });
48
- case "text":
49
- default:
50
- return response;
51
- }
26
+ response = await this.edgeKV.getText({ item: sanitizedKey });
52
27
  } catch (error) {
53
28
  if (error.status === 404 || error.message?.includes("not found")) {
54
29
  return null;
55
30
  }
56
31
  throw error;
57
32
  }
33
+ if (response === null || response === void 0) {
34
+ return null;
35
+ }
36
+ let type = "text";
37
+ if (typeof optionsOrType === "string") {
38
+ type = optionsOrType;
39
+ } else if (optionsOrType && "type" in optionsOrType) {
40
+ type = optionsOrType.type || "text";
41
+ }
42
+ switch (type) {
43
+ case "json":
44
+ return JSON.parse(response);
45
+ case "arrayBuffer":
46
+ return new TextEncoder().encode(response).buffer;
47
+ case "stream":
48
+ return new ReadableStream({
49
+ start(controller) {
50
+ controller.enqueue(new TextEncoder().encode(response));
51
+ controller.close();
52
+ }
53
+ });
54
+ case "text":
55
+ default:
56
+ return response;
57
+ }
58
58
  }
59
59
  async getWithMetadata(key, optionsOrType) {
60
60
  const value = await this.get(key, optionsOrType);
@@ -70,6 +70,7 @@ var KVNamespace = class {
70
70
  if (!this.edgeKV) {
71
71
  throw new Error("EdgeKV not initialized");
72
72
  }
73
+ const sanitizedKey = this.sanitizeKey(key);
73
74
  let stringValue;
74
75
  if (typeof value === "string") {
75
76
  stringValue = value;
@@ -95,7 +96,7 @@ var KVNamespace = class {
95
96
  } else {
96
97
  throw new TypeError("Invalid value type");
97
98
  }
98
- await this.edgeKV.putText({ item: key, value: stringValue });
99
+ await this.edgeKV.putText({ item: sanitizedKey, value: stringValue });
99
100
  }
100
101
  /**
101
102
  * Delete a value from EdgeKV (maps to Cloudflare KV delete)
@@ -104,8 +105,9 @@ var KVNamespace = class {
104
105
  if (!this.edgeKV) {
105
106
  throw new Error("EdgeKV not initialized");
106
107
  }
108
+ const sanitizedKey = this.sanitizeKey(key);
107
109
  try {
108
- await this.edgeKV.delete({ item: key });
110
+ await this.edgeKV.delete({ item: sanitizedKey });
109
111
  } catch (error) {
110
112
  if (error.status === 404 || error.message?.includes("not found")) {
111
113
  return;
@@ -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 namespace: string;\n private group: string;\n private edgeKV: any;\n\n constructor(namespace: string, group: string = 'default') {\n this.namespace = namespace;\n this.group = group;\n\n // Lazy load EdgeKV when first accessed\n // In Akamai EdgeWorkers, you'd import: const { EdgeKV } = require('./edgekv.js');\n try {\n // @ts-ignore - EdgeKV is available in Akamai runtime\n const { EdgeKV } = require('./edgekv.js');\n this.edgeKV = new EdgeKV({ namespace: this.namespace, group: this.group });\n } catch (e) {\n console.warn('EdgeKV not available, KVNamespace will not function properly');\n }\n }\n\n /**\n * Get a value from EdgeKV (maps to Cloudflare KV get)\n */\n async get(key: string, options?: KVGetOptions): Promise<string | null>;\n async get(key: string, type: 'text'): Promise<string | null>;\n async get(key: string, type: 'json'): Promise<any>;\n async get(key: string, type: 'arrayBuffer'): Promise<ArrayBuffer | null>;\n async get(key: string, type: 'stream'): Promise<ReadableStream | null>;\n async get(\n key: string,\n optionsOrType?: KVGetOptions | 'text' | 'json' | 'arrayBuffer' | 'stream'\n ): Promise<string | any | ArrayBuffer | ReadableStream | null> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n try {\n const response = await this.edgeKV.getText({ item: key });\n\n if (response === null || response === undefined) {\n return null;\n }\n\n // Determine the type\n let type: string = 'text';\n if (typeof optionsOrType === 'string') {\n type = optionsOrType;\n } else if (optionsOrType && 'type' in optionsOrType) {\n type = optionsOrType.type || 'text';\n }\n\n switch (type) {\n case 'json':\n return JSON.parse(response);\n case 'arrayBuffer':\n return new TextEncoder().encode(response).buffer;\n case 'stream':\n return new ReadableStream({\n start(controller) {\n controller.enqueue(new TextEncoder().encode(response));\n controller.close();\n }\n });\n case 'text':\n default:\n return response;\n }\n } catch (error: any) {\n // EdgeKV throws 404 errors, Cloudflare returns null\n if (error.status === 404 || error.message?.includes('not found')) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Get value with metadata\n */\n async getWithMetadata<Metadata = unknown>(\n key: string,\n options?: KVGetOptions\n ): Promise<KVValueWithMetadata<string, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'text'\n ): Promise<KVValueWithMetadata<string, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'json'\n ): Promise<KVValueWithMetadata<any, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'arrayBuffer'\n ): Promise<KVValueWithMetadata<ArrayBuffer, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'stream'\n ): Promise<KVValueWithMetadata<ReadableStream, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n optionsOrType?: KVGetOptions | 'text' | 'json' | 'arrayBuffer' | 'stream'\n ): Promise<KVValueWithMetadata<any, Metadata>> {\n const value = await this.get(key, optionsOrType as any);\n\n // EdgeKV doesn't support metadata natively, so we return null for metadata\n return {\n value,\n metadata: null,\n };\n }\n\n /**\n * Put a value into EdgeKV (maps to Cloudflare KV put)\n */\n async put(key: string, value: string | ArrayBuffer | ReadableStream, options?: KVPutOptions): Promise<void> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n let stringValue: string;\n\n if (typeof value === 'string') {\n stringValue = value;\n } else if (value instanceof ArrayBuffer) {\n stringValue = new TextDecoder().decode(value);\n } else if (value instanceof ReadableStream) {\n // Read the stream\n const reader = value.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n stringValue = new TextDecoder().decode(result);\n } else {\n throw new TypeError('Invalid value type');\n }\n\n // EdgeKV doesn't support expiration or metadata in the same way\n // We'll just store the value\n await this.edgeKV.putText({ item: key, value: stringValue });\n }\n\n /**\n * Delete a value from EdgeKV (maps to Cloudflare KV delete)\n */\n async delete(key: string): Promise<void> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n try {\n await this.edgeKV.delete({ item: key });\n } catch (error: any) {\n // Ignore 404 errors\n if (error.status === 404 || error.message?.includes('not found')) {\n return;\n }\n throw error;\n }\n }\n\n /**\n * List keys in the namespace\n * Note: EdgeKV doesn't support listing keys, so this is a limited implementation\n */\n async list(options?: KVListOptions): Promise<KVListResult> {\n // EdgeKV doesn't natively support list operations\n // This would require a custom implementation or tracking keys separately\n console.warn('KVNamespace.list() is not fully supported with Akamai EdgeKV');\n\n return {\n keys: [],\n list_complete: true,\n cursor: undefined,\n };\n }\n}\n\ninterface KVGetOptions {\n type?: 'text' | 'json' | 'arrayBuffer' | 'stream';\n cacheTtl?: number;\n}\n\ninterface KVPutOptions {\n expiration?: number;\n expirationTtl?: number;\n metadata?: any;\n}\n\ninterface KVListOptions {\n prefix?: string;\n limit?: number;\n cursor?: string;\n}\n\ninterface KVListResult {\n keys: Array<{ name: string; expiration?: number; metadata?: any }>;\n list_complete: boolean;\n cursor?: string;\n}\n\ninterface KVValueWithMetadata<Value, Metadata> {\n value: Value | null;\n metadata: Metadata | null;\n}\n"],
5
- "mappings": "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",
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
  }
@@ -3,13 +3,6 @@ var AkamaiPolyfill = (() => {
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
7
- get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
8
- }) : x)(function(x) {
9
- if (typeof require !== "undefined")
10
- return require.apply(this, arguments);
11
- throw Error('Dynamic require of "' + x + '" is not supported');
12
- });
13
6
  var __export = (target, all) => {
14
7
  for (var name in all)
15
8
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -477,53 +470,61 @@ var AkamaiPolyfill = (() => {
477
470
 
478
471
  // src/kv-namespace.ts
479
472
  var KVNamespace = class {
480
- constructor(namespace, group = "default") {
481
- this.namespace = namespace;
482
- this.group = group;
483
- try {
484
- const { EdgeKV } = __require("./edgekv.js");
485
- this.edgeKV = new EdgeKV({ namespace: this.namespace, group: this.group });
486
- } catch (e) {
487
- console.warn("EdgeKV not available, KVNamespace will not function properly");
473
+ constructor(edgeKV) {
474
+ this.edgeKV = edgeKV;
475
+ }
476
+ /**
477
+ * Sanitize key to be compatible with EdgeKV requirements
478
+ * EdgeKV only allows A-Z a-z 0-9 _ - (max 512 chars)
479
+ * Replace invalid characters with hyphens
480
+ */
481
+ sanitizeKey(key) {
482
+ const sanitized = key.replace(/[^A-Za-z0-9_-]/g, "-");
483
+ if (sanitized.length > 512) {
484
+ console.warn(`Key "${key}" exceeds 512 characters, truncating to 512`);
485
+ return sanitized.substring(0, 512);
488
486
  }
487
+ return sanitized;
489
488
  }
490
489
  async get(key, optionsOrType) {
491
490
  if (!this.edgeKV) {
492
491
  throw new Error("EdgeKV not initialized");
493
492
  }
493
+ const sanitizedKey = this.sanitizeKey(key);
494
+ let response = null;
494
495
  try {
495
- const response = await this.edgeKV.getText({ item: key });
496
- if (response === null || response === void 0) {
497
- return null;
498
- }
499
- let type = "text";
500
- if (typeof optionsOrType === "string") {
501
- type = optionsOrType;
502
- } else if (optionsOrType && "type" in optionsOrType) {
503
- type = optionsOrType.type || "text";
504
- }
505
- switch (type) {
506
- case "json":
507
- return JSON.parse(response);
508
- case "arrayBuffer":
509
- return new TextEncoder().encode(response).buffer;
510
- case "stream":
511
- return new ReadableStream({
512
- start(controller) {
513
- controller.enqueue(new TextEncoder().encode(response));
514
- controller.close();
515
- }
516
- });
517
- case "text":
518
- default:
519
- return response;
520
- }
496
+ response = await this.edgeKV.getText({ item: sanitizedKey });
521
497
  } catch (error) {
522
498
  if (error.status === 404 || error.message?.includes("not found")) {
523
499
  return null;
524
500
  }
525
501
  throw error;
526
502
  }
503
+ if (response === null || response === void 0) {
504
+ return null;
505
+ }
506
+ let type = "text";
507
+ if (typeof optionsOrType === "string") {
508
+ type = optionsOrType;
509
+ } else if (optionsOrType && "type" in optionsOrType) {
510
+ type = optionsOrType.type || "text";
511
+ }
512
+ switch (type) {
513
+ case "json":
514
+ return JSON.parse(response);
515
+ case "arrayBuffer":
516
+ return new TextEncoder().encode(response).buffer;
517
+ case "stream":
518
+ return new ReadableStream({
519
+ start(controller) {
520
+ controller.enqueue(new TextEncoder().encode(response));
521
+ controller.close();
522
+ }
523
+ });
524
+ case "text":
525
+ default:
526
+ return response;
527
+ }
527
528
  }
528
529
  async getWithMetadata(key, optionsOrType) {
529
530
  const value = await this.get(key, optionsOrType);
@@ -539,6 +540,7 @@ var AkamaiPolyfill = (() => {
539
540
  if (!this.edgeKV) {
540
541
  throw new Error("EdgeKV not initialized");
541
542
  }
543
+ const sanitizedKey = this.sanitizeKey(key);
542
544
  let stringValue;
543
545
  if (typeof value === "string") {
544
546
  stringValue = value;
@@ -564,7 +566,7 @@ var AkamaiPolyfill = (() => {
564
566
  } else {
565
567
  throw new TypeError("Invalid value type");
566
568
  }
567
- await this.edgeKV.putText({ item: key, value: stringValue });
569
+ await this.edgeKV.putText({ item: sanitizedKey, value: stringValue });
568
570
  }
569
571
  /**
570
572
  * Delete a value from EdgeKV (maps to Cloudflare KV delete)
@@ -573,8 +575,9 @@ var AkamaiPolyfill = (() => {
573
575
  if (!this.edgeKV) {
574
576
  throw new Error("EdgeKV not initialized");
575
577
  }
578
+ const sanitizedKey = this.sanitizeKey(key);
576
579
  try {
577
- await this.edgeKV.delete({ item: key });
580
+ await this.edgeKV.delete({ item: sanitizedKey });
578
581
  } catch (error) {
579
582
  if (error.status === 404 || error.message?.includes("not found")) {
580
583
  return;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/global.ts", "../src/streams.ts", "../src/request.ts", "../src/response.ts", "../src/kv-namespace.ts", "../src/crypto.ts", "../src/index.ts"],
4
- "sourcesContent": ["/**\n * Global entry point - exposes all polyfills as global variables\n * This file is used for the IIFE build that automatically installs polyfills\n */\n\nimport { Request, Headers } from './request';\nimport { Response } from './response';\nimport { KVNamespace } from './kv-namespace';\nimport { Crypto, SubtleCrypto } from './crypto';\nimport { installGlobalPolyfills, toEdgeWorkerResponse } from './index';\n\n// Export all modules for the global bundle\nexport {\n Request,\n Response,\n Headers,\n KVNamespace,\n Crypto,\n SubtleCrypto,\n installGlobalPolyfills,\n toEdgeWorkerResponse,\n};\n\n// Also expose as default export\nexport default {\n Request,\n Response,\n Headers,\n KVNamespace,\n Crypto,\n SubtleCrypto,\n installGlobalPolyfills,\n toEdgeWorkerResponse,\n};\n", "/**\n * ReadableStream polyfill for Akamai EdgeWorkers\n * Provides basic ReadableStream functionality for body handling\n */\n\nexport class ReadableStream {\n private readonly chunks: Uint8Array[] = [];\n private closed: boolean = false;\n\n constructor(source?: { start?: (controller: ReadableStreamController) => void }) {\n const controller: ReadableStreamController = {\n enqueue: (chunk: Uint8Array) => {\n if (!this.closed) {\n this.chunks.push(chunk);\n }\n },\n close: () => {\n this.closed = true;\n }\n };\n\n if (source?.start) {\n source.start(controller);\n }\n }\n\n getReader(): ReadableStreamReader {\n return new ReadableStreamReader(this.chunks);\n }\n}\n\nexport class ReadableStreamReader {\n private readonly chunks: Uint8Array[];\n private index: number = 0;\n\n constructor(chunks: Uint8Array[]) {\n this.chunks = chunks;\n }\n\n async read(): Promise<{ done: boolean; value?: Uint8Array }> {\n if (this.index < this.chunks.length) {\n return { done: false, value: this.chunks[this.index++] };\n }\n return { done: true };\n }\n}\n\nexport interface ReadableStreamController {\n enqueue(chunk: Uint8Array): void;\n close(): void;\n}\n\n// Make ReadableStream available globally for Akamai EdgeWorkers\nif (typeof globalThis !== 'undefined' && !globalThis.ReadableStream) {\n (globalThis as any).ReadableStream = ReadableStream;\n}\n", "/**\n * Request polyfill for Akamai EdgeWorkers to match Cloudflare Workers API\n * Wraps Akamai's EW Request to provide Cloudflare-compatible interface\n */\n\nimport './streams';\n\nexport class Request {\n private ewRequest: any;\n private _url: string;\n private _method: string;\n private _headers: Headers;\n private _body: ReadableStream | null;\n private _bodyUsed: boolean = false;\n private _cachedBodyText: string | null = null;\n\n constructor(input: string | Request | any, init?: RequestInit) {\n if (typeof input === 'string') {\n this._url = input;\n this._method = init?.method?.toUpperCase() || 'GET';\n this._headers = new Headers(init?.headers);\n this._body = init?.body ? this.createReadableStream(init.body) : null;\n this.ewRequest = null;\n } else if (input instanceof Request) {\n this._url = input.url;\n this._method = input.method;\n this._headers = new Headers(input.headers);\n this._body = input._body;\n this.ewRequest = input.ewRequest;\n this._cachedBodyText = input._cachedBodyText;\n } else {\n // Akamai EW Request object - store reference for lazy body reading\n this.ewRequest = input;\n this._url = this.buildUrl(input);\n this._method = input.method?.toUpperCase() || 'GET';\n this._headers = this.convertHeaders(input);\n // Don't read body yet - will be read lazily when .text() is called\n this._body = null;\n }\n }\n\n private buildUrl(ewRequest: any): string {\n const scheme = ewRequest.scheme || 'https';\n const host = ewRequest.host || ewRequest.getHeader('host') || 'localhost';\n const path = ewRequest.path || '/';\n const query = ewRequest.query || '';\n\n return `${scheme}://${host}${path}${query ? '?' + query : ''}`;\n }\n\n private convertHeaders(ewRequest: any): Headers {\n const headers = new Headers();\n\n if (ewRequest.getHeaders) {\n const ewHeaders = ewRequest.getHeaders();\n for (const [name, values] of Object.entries(ewHeaders)) {\n if (Array.isArray(values)) {\n values.forEach((value: string) => headers.append(name, value));\n } else {\n headers.set(name, values as string);\n }\n }\n }\n\n return headers;\n }\n\n private createReadableStream(body: BodyInit): ReadableStream {\n return new ReadableStream({\n start(controller) {\n if (typeof body === 'string') {\n controller.enqueue(new TextEncoder().encode(body));\n } else if (body instanceof Uint8Array) {\n controller.enqueue(body);\n } else if (body instanceof ArrayBuffer) {\n controller.enqueue(new Uint8Array(body));\n }\n controller.close();\n }\n });\n }\n\n get url(): string {\n return this._url;\n }\n\n get method(): string {\n return this._method;\n }\n\n get headers(): Headers {\n return this._headers;\n }\n\n get bodyUsed(): boolean {\n return this._bodyUsed;\n }\n\n async text(): Promise<string> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n // If we have a cached body from cloning, use it\n if (this._cachedBodyText !== null) {\n return this._cachedBodyText;\n }\n\n // If this is an Akamai request, read body from it\n if (this.ewRequest && !this._body) {\n try {\n // Try different methods to get the body from Akamai request\n if (typeof this.ewRequest.text === 'function') {\n const bodyText = await this.ewRequest.text();\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (typeof this.ewRequest.json === 'function') {\n const bodyJson = await this.ewRequest.json();\n const bodyText = JSON.stringify(bodyJson);\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (typeof this.ewRequest.getBody === 'function') {\n const body = await this.ewRequest.getBody();\n const bodyText = typeof body === 'string' ? body : JSON.stringify(body);\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (this.ewRequest.body !== undefined && this.ewRequest.body !== null) {\n const bodyText = typeof this.ewRequest.body === 'string'\n ? this.ewRequest.body\n : JSON.stringify(this.ewRequest.body);\n this._cachedBodyText = bodyText;\n return bodyText;\n }\n } catch (error) {\n console.error('Error reading body from Akamai request:', error);\n }\n }\n\n if (!this._body) {\n return '';\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n const bodyText = new TextDecoder().decode(result);\n this._cachedBodyText = bodyText;\n return bodyText;\n }\n\n async json<T = any>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text);\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return new ArrayBuffer(0);\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result.buffer;\n }\n\n clone(): Request {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n\n const cloned = new Request(this._url, {\n method: this._method,\n headers: this._headers,\n });\n\n cloned.ewRequest = this.ewRequest;\n\n return cloned;\n }\n}\n\n// Headers polyfill for Akamai EdgeWorkers\nexport class Headers {\n private headers: Map<string, string[]> = new Map();\n\n constructor(init?: HeadersInit) {\n if (init) {\n if (init instanceof Headers) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n } else if (Array.isArray(init)) {\n init.forEach(([key, value]) => {\n this.append(key, value);\n });\n } else {\n Object.entries(init).forEach(([key, value]) => {\n this.append(key, value);\n });\n }\n }\n }\n\n append(name: string, value: string): void {\n const normalizedName = name.toLowerCase();\n const existing = this.headers.get(normalizedName) || [];\n existing.push(value);\n this.headers.set(normalizedName, existing);\n }\n\n delete(name: string): void {\n this.headers.delete(name.toLowerCase());\n }\n\n get(name: string): string | null {\n const values = this.headers.get(name.toLowerCase());\n return values ? values[0] : null;\n }\n\n has(name: string): boolean {\n return this.headers.has(name.toLowerCase());\n }\n\n set(name: string, value: string): void {\n this.headers.set(name.toLowerCase(), [value]);\n }\n\n forEach(callback: (value: string, key: string, parent: Headers) => void): void {\n this.headers.forEach((values, key) => {\n values.forEach(value => callback(value, key, this));\n });\n }\n\n entries(): IterableIterator<[string, string]> {\n const entries: [string, string][] = [];\n this.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries[Symbol.iterator]();\n }\n\n keys(): IterableIterator<string> {\n return this.headers.keys();\n }\n\n values(): IterableIterator<string> {\n const values: string[] = [];\n this.forEach(value => {\n values.push(value);\n });\n return values[Symbol.iterator]();\n }\n\n [Symbol.iterator](): IterableIterator<[string, string]> {\n return this.entries();\n }\n}\n\ntype HeadersInit = Headers | string[][] | Record<string, string>;\n\ninterface RequestInit {\n method?: string;\n headers?: HeadersInit;\n body?: BodyInit;\n}\n\ntype BodyInit = string | Uint8Array | ArrayBuffer;\n", "/**\n * Response polyfill for Akamai EdgeWorkers to match Cloudflare Workers API\n * Creates Cloudflare-compatible Response objects that can be converted to Akamai responses\n */\n\nimport './streams';\nimport { Headers } from './request';\n\nexport class Response {\n private _body: ReadableStream | null;\n private _bodyUsed: boolean = false;\n private _status: number;\n private _statusText: string;\n private _headers: Headers;\n private _ok: boolean;\n\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n this._status = init?.status || 200;\n this._statusText = init?.statusText || this.getStatusText(this._status);\n this._headers = new Headers(init?.headers);\n this._ok = this._status >= 200 && this._status < 300;\n\n if (body !== null && body !== undefined) {\n this._body = this.createReadableStream(body);\n } else {\n this._body = null;\n }\n }\n\n private getStatusText(status: number): string {\n const statusTexts: Record<number, string> = {\n 200: 'OK',\n 201: 'Created',\n 204: 'No Content',\n 301: 'Moved Permanently',\n 302: 'Found',\n 304: 'Not Modified',\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 500: 'Internal Server Error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n };\n return statusTexts[status] || '';\n }\n\n private createReadableStream(body: BodyInit): ReadableStream {\n return new ReadableStream({\n start(controller) {\n if (typeof body === 'string') {\n controller.enqueue(new TextEncoder().encode(body));\n } else if (body instanceof Uint8Array) {\n controller.enqueue(body);\n } else if (body instanceof ArrayBuffer) {\n controller.enqueue(new Uint8Array(body));\n } else if (body instanceof ReadableStream) {\n // Handle ReadableStream\n const reader = body.getReader();\n function push() {\n reader.read().then(({ done, value }) => {\n if (done) {\n controller.close();\n return;\n }\n controller.enqueue(value);\n push();\n });\n }\n push();\n return;\n }\n controller.close();\n }\n });\n }\n\n get body(): ReadableStream | null {\n return this._body;\n }\n\n get bodyUsed(): boolean {\n return this._bodyUsed;\n }\n\n get ok(): boolean {\n return this._ok;\n }\n\n get status(): number {\n return this._status;\n }\n\n get statusText(): string {\n return this._statusText;\n }\n\n get headers(): Headers {\n return this._headers;\n }\n\n async text(): Promise<string> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return '';\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return new TextDecoder().decode(result);\n }\n\n async json<T = any>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text);\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return new ArrayBuffer(0);\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result.buffer;\n }\n\n clone(): Response {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n\n return new Response(this._body, {\n status: this._status,\n statusText: this._statusText,\n headers: this._headers,\n });\n }\n\n static redirect(url: string, status?: number): Response {\n const redirectStatus = status || 302;\n return new Response(null, {\n status: redirectStatus,\n headers: {\n Location: url,\n },\n });\n }\n\n static json(data: any, init?: ResponseInit): Response {\n const body = JSON.stringify(data);\n const headers = new Headers(init?.headers);\n\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n\n return new Response(body, {\n ...init,\n headers,\n });\n }\n}\n\ntype BodyInit = string | Uint8Array | ArrayBuffer | ReadableStream;\n\ninterface ResponseInit {\n status?: number;\n statusText?: string;\n headers?: HeadersInit;\n}\n\ntype HeadersInit = Headers | string[][] | Record<string, string>;\n", "/**\n * KVNamespace polyfill for Akamai EdgeWorkers to match Cloudflare Workers KV API\n * Wraps Akamai EdgeKV to provide Cloudflare-compatible interface\n */\n\nexport class KVNamespace {\n private namespace: string;\n private group: string;\n private edgeKV: any;\n\n constructor(namespace: string, group: string = 'default') {\n this.namespace = namespace;\n this.group = group;\n\n // Lazy load EdgeKV when first accessed\n // In Akamai EdgeWorkers, you'd import: const { EdgeKV } = require('./edgekv.js');\n try {\n // @ts-ignore - EdgeKV is available in Akamai runtime\n const { EdgeKV } = require('./edgekv.js');\n this.edgeKV = new EdgeKV({ namespace: this.namespace, group: this.group });\n } catch (e) {\n console.warn('EdgeKV not available, KVNamespace will not function properly');\n }\n }\n\n /**\n * Get a value from EdgeKV (maps to Cloudflare KV get)\n */\n async get(key: string, options?: KVGetOptions): Promise<string | null>;\n async get(key: string, type: 'text'): Promise<string | null>;\n async get(key: string, type: 'json'): Promise<any>;\n async get(key: string, type: 'arrayBuffer'): Promise<ArrayBuffer | null>;\n async get(key: string, type: 'stream'): Promise<ReadableStream | null>;\n async get(\n key: string,\n optionsOrType?: KVGetOptions | 'text' | 'json' | 'arrayBuffer' | 'stream'\n ): Promise<string | any | ArrayBuffer | ReadableStream | null> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n try {\n const response = await this.edgeKV.getText({ item: key });\n\n if (response === null || response === undefined) {\n return null;\n }\n\n // Determine the type\n let type: string = 'text';\n if (typeof optionsOrType === 'string') {\n type = optionsOrType;\n } else if (optionsOrType && 'type' in optionsOrType) {\n type = optionsOrType.type || 'text';\n }\n\n switch (type) {\n case 'json':\n return JSON.parse(response);\n case 'arrayBuffer':\n return new TextEncoder().encode(response).buffer;\n case 'stream':\n return new ReadableStream({\n start(controller) {\n controller.enqueue(new TextEncoder().encode(response));\n controller.close();\n }\n });\n case 'text':\n default:\n return response;\n }\n } catch (error: any) {\n // EdgeKV throws 404 errors, Cloudflare returns null\n if (error.status === 404 || error.message?.includes('not found')) {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Get value with metadata\n */\n async getWithMetadata<Metadata = unknown>(\n key: string,\n options?: KVGetOptions\n ): Promise<KVValueWithMetadata<string, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'text'\n ): Promise<KVValueWithMetadata<string, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'json'\n ): Promise<KVValueWithMetadata<any, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'arrayBuffer'\n ): Promise<KVValueWithMetadata<ArrayBuffer, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'stream'\n ): Promise<KVValueWithMetadata<ReadableStream, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n optionsOrType?: KVGetOptions | 'text' | 'json' | 'arrayBuffer' | 'stream'\n ): Promise<KVValueWithMetadata<any, Metadata>> {\n const value = await this.get(key, optionsOrType as any);\n\n // EdgeKV doesn't support metadata natively, so we return null for metadata\n return {\n value,\n metadata: null,\n };\n }\n\n /**\n * Put a value into EdgeKV (maps to Cloudflare KV put)\n */\n async put(key: string, value: string | ArrayBuffer | ReadableStream, options?: KVPutOptions): Promise<void> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n let stringValue: string;\n\n if (typeof value === 'string') {\n stringValue = value;\n } else if (value instanceof ArrayBuffer) {\n stringValue = new TextDecoder().decode(value);\n } else if (value instanceof ReadableStream) {\n // Read the stream\n const reader = value.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n stringValue = new TextDecoder().decode(result);\n } else {\n throw new TypeError('Invalid value type');\n }\n\n // EdgeKV doesn't support expiration or metadata in the same way\n // We'll just store the value\n await this.edgeKV.putText({ item: key, value: stringValue });\n }\n\n /**\n * Delete a value from EdgeKV (maps to Cloudflare KV delete)\n */\n async delete(key: string): Promise<void> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n try {\n await this.edgeKV.delete({ item: key });\n } catch (error: any) {\n // Ignore 404 errors\n if (error.status === 404 || error.message?.includes('not found')) {\n return;\n }\n throw error;\n }\n }\n\n /**\n * List keys in the namespace\n * Note: EdgeKV doesn't support listing keys, so this is a limited implementation\n */\n async list(options?: KVListOptions): Promise<KVListResult> {\n // EdgeKV doesn't natively support list operations\n // This would require a custom implementation or tracking keys separately\n console.warn('KVNamespace.list() is not fully supported with Akamai EdgeKV');\n\n return {\n keys: [],\n list_complete: true,\n cursor: undefined,\n };\n }\n}\n\ninterface KVGetOptions {\n type?: 'text' | 'json' | 'arrayBuffer' | 'stream';\n cacheTtl?: number;\n}\n\ninterface KVPutOptions {\n expiration?: number;\n expirationTtl?: number;\n metadata?: any;\n}\n\ninterface KVListOptions {\n prefix?: string;\n limit?: number;\n cursor?: string;\n}\n\ninterface KVListResult {\n keys: Array<{ name: string; expiration?: number; metadata?: any }>;\n list_complete: boolean;\n cursor?: string;\n}\n\ninterface KVValueWithMetadata<Value, Metadata> {\n value: Value | null;\n metadata: Metadata | null;\n}\n", "/**\n * Crypto polyfill for Akamai EdgeWorkers to match Cloudflare Workers Web Crypto API\n * Provides a subset of the Web Crypto API using Akamai's crypto module\n */\n\nexport class Crypto {\n /**\n * Generate cryptographically strong random values\n */\n getRandomValues<T extends ArrayBufferView>(array: T): T {\n // In Akamai EdgeWorkers, we can use the crypto module\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n return crypto.getRandomValues(array);\n }\n\n // Fallback implementation (not cryptographically secure, for development only)\n console.warn('Using fallback random number generation - not cryptographically secure');\n const bytes = new Uint8Array(array.buffer, array.byteOffset, array.byteLength);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n return array;\n }\n\n /**\n * Generate a random UUID\n */\n randomUUID(): string {\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback UUID v4 generation\n const bytes = new Uint8Array(16);\n this.getRandomValues(bytes);\n\n // Set version (4) and variant bits\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n\n const hex = Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n }\n\n /**\n * SubtleCrypto API for cryptographic operations\n */\n get subtle(): SubtleCrypto {\n return new SubtleCrypto();\n }\n}\n\nexport class SubtleCrypto {\n /**\n * Generate a digest (hash) of the data\n */\n async digest(algorithm: AlgorithmIdentifier, data: BufferSource): Promise<ArrayBuffer> {\n const algName = typeof algorithm === 'string' ? algorithm : algorithm.name;\n\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.digest) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.digest(algorithm, data);\n }\n\n // For Akamai EdgeWorkers without native crypto.subtle\n // You would need to use the crypto module's createHash or similar\n throw new Error(`Digest algorithm ${algName} not supported in this environment`);\n }\n\n /**\n * Sign data with a key\n */\n async sign(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.sign) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.sign(algorithm, key, data);\n }\n\n throw new Error('Sign operation not supported in this environment');\n }\n\n /**\n * Verify a signature\n */\n async verify(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n signature: BufferSource,\n data: BufferSource\n ): Promise<boolean> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.verify) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.verify(algorithm, key, signature, data);\n }\n\n throw new Error('Verify operation not supported in this environment');\n }\n\n /**\n * Encrypt data\n */\n async encrypt(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.encrypt) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.encrypt(algorithm, key, data);\n }\n\n throw new Error('Encrypt operation not supported in this environment');\n }\n\n /**\n * Decrypt data\n */\n async decrypt(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.decrypt) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.decrypt(algorithm, key, data);\n }\n\n throw new Error('Decrypt operation not supported in this environment');\n }\n\n /**\n * Generate a key\n */\n async generateKey(\n algorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey | CryptoKeyPair> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.generateKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.generateKey(algorithm, extractable, keyUsages);\n }\n\n throw new Error('GenerateKey operation not supported in this environment');\n }\n\n /**\n * Derive bits from a key\n */\n async deriveBits(\n algorithm: AlgorithmIdentifier,\n baseKey: CryptoKey,\n length: number\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.deriveBits) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.deriveBits(algorithm, baseKey, length);\n }\n\n throw new Error('DeriveBits operation not supported in this environment');\n }\n\n /**\n * Derive a key from another key\n */\n async deriveKey(\n algorithm: AlgorithmIdentifier,\n baseKey: CryptoKey,\n derivedKeyAlgorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.deriveKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages);\n }\n\n throw new Error('DeriveKey operation not supported in this environment');\n }\n\n /**\n * Import a key\n */\n async importKey(\n format: KeyFormat,\n keyData: BufferSource | JsonWebKey,\n algorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.importKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.importKey(format, keyData, algorithm, extractable, keyUsages);\n }\n\n throw new Error('ImportKey operation not supported in this environment');\n }\n\n /**\n * Export a key\n */\n async exportKey(format: KeyFormat, key: CryptoKey): Promise<ArrayBuffer | JsonWebKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.exportKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.exportKey(format, key);\n }\n\n throw new Error('ExportKey operation not supported in this environment');\n }\n\n /**\n * Wrap a key\n */\n async wrapKey(\n format: KeyFormat,\n key: CryptoKey,\n wrappingKey: CryptoKey,\n wrapAlgorithm: AlgorithmIdentifier\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.wrapKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.wrapKey(format, key, wrappingKey, wrapAlgorithm);\n }\n\n throw new Error('WrapKey operation not supported in this environment');\n }\n\n /**\n * Unwrap a key\n */\n async unwrapKey(\n format: KeyFormat,\n wrappedKey: BufferSource,\n unwrappingKey: CryptoKey,\n unwrapAlgorithm: AlgorithmIdentifier,\n unwrappedKeyAlgorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.unwrapKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.unwrapKey(\n format,\n wrappedKey,\n unwrappingKey,\n unwrapAlgorithm,\n unwrappedKeyAlgorithm,\n extractable,\n keyUsages\n );\n }\n\n throw new Error('UnwrapKey operation not supported in this environment');\n }\n}\n\n// Type definitions are provided by lib.dom.d.ts\n// We don't need to redefine them here since tsconfig includes \"DOM\" lib\n", "/**\n * Akamai EdgeWorkers to Cloudflare Workers API Polyfill\n *\n * This polyfill makes Akamai EdgeWorkers compatible with Cloudflare Workers API,\n * enabling the use of Optimizely Edge Delivery SDK and other Cloudflare-compatible\n * libraries on Akamai's edge platform.\n *\n * @example\n * ```typescript\n * import { Request, Response, KVNamespace, Crypto } from 'akamai-edge-delivery-polyfill';\n *\n * // Use in your EdgeWorker\n * export async function onClientRequest(request) {\n * const cfRequest = new Request(request);\n * const response = new Response('Hello World', { status: 200 });\n * return response;\n * }\n * ```\n */\n\n// Import streams polyfill first to ensure ReadableStream is available globally\nimport './streams';\n\nimport { Request, Headers } from './request';\nimport { Response } from './response';\nimport { KVNamespace } from './kv-namespace';\nimport { Crypto, SubtleCrypto } from './crypto';\nimport { ReadableStream } from './streams';\n\nexport { Request, Headers } from './request';\nexport { Response } from './response';\nexport { KVNamespace } from './kv-namespace';\nexport { Crypto, SubtleCrypto } from './crypto';\nexport { ReadableStream } from './streams';\n\n/**\n * Helper function to convert Akamai EdgeWorker Response to a format\n * that can be returned from EdgeWorker event handlers\n */\nexport async function toEdgeWorkerResponse(response: any): Promise<any> {\n const body = await response.text();\n const headers: Record<string, string> = {};\n\n response.headers.forEach((value: string, key: string) => {\n headers[key] = value;\n });\n\n return {\n status: response.status,\n headers,\n body,\n };\n}\n\n/**\n * Create a global polyfill that injects Cloudflare-compatible APIs into the global scope\n * This is useful when using libraries that expect these APIs to be globally available\n */\nexport function installGlobalPolyfills(): void {\n const g = globalThis as any;\n\n if (!g.Request) {\n g.Request = Request;\n }\n\n if (!g.Response) {\n g.Response = Response;\n }\n\n if (!g.Headers) {\n g.Headers = Headers;\n }\n\n if (!g.crypto) {\n g.crypto = new Crypto();\n }\n\n // Add TextEncoder and TextDecoder if not available\n if (!g.TextEncoder) {\n g.TextEncoder = class TextEncoder {\n encode(input: string): Uint8Array {\n const utf8: number[] = [];\n for (let i = 0; i < input.length; i++) {\n let charCode = input.charCodeAt(i);\n if (charCode < 0x80) {\n utf8.push(charCode);\n } else if (charCode < 0x800) {\n utf8.push(0xc0 | (charCode >> 6), 0x80 | (charCode & 0x3f));\n } else if (charCode < 0xd800 || charCode >= 0xe000) {\n utf8.push(0xe0 | (charCode >> 12), 0x80 | ((charCode >> 6) & 0x3f), 0x80 | (charCode & 0x3f));\n } else {\n i++;\n charCode = 0x10000 + (((charCode & 0x3ff) << 10) | (input.charCodeAt(i) & 0x3ff));\n utf8.push(\n 0xf0 | (charCode >> 18),\n 0x80 | ((charCode >> 12) & 0x3f),\n 0x80 | ((charCode >> 6) & 0x3f),\n 0x80 | (charCode & 0x3f)\n );\n }\n }\n return new Uint8Array(utf8);\n }\n };\n }\n\n if (!g.TextDecoder) {\n g.TextDecoder = class TextDecoder {\n decode(input: Uint8Array | ArrayBuffer): string {\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n let result = '';\n let i = 0;\n\n while (i < bytes.length) {\n const byte1 = bytes[i++];\n\n if (byte1 < 0x80) {\n result += String.fromCharCode(byte1);\n } else if (byte1 < 0xe0) {\n const byte2 = bytes[i++];\n result += String.fromCharCode(((byte1 & 0x1f) << 6) | (byte2 & 0x3f));\n } else if (byte1 < 0xf0) {\n const byte2 = bytes[i++];\n const byte3 = bytes[i++];\n result += String.fromCharCode(((byte1 & 0x0f) << 12) | ((byte2 & 0x3f) << 6) | (byte3 & 0x3f));\n } else {\n const byte2 = bytes[i++];\n const byte3 = bytes[i++];\n const byte4 = bytes[i++];\n let codePoint =\n ((byte1 & 0x07) << 18) | ((byte2 & 0x3f) << 12) | ((byte3 & 0x3f) << 6) | (byte4 & 0x3f);\n codePoint -= 0x10000;\n result += String.fromCharCode(0xd800 + (codePoint >> 10), 0xdc00 + (codePoint & 0x3ff));\n }\n }\n\n return result;\n }\n };\n }\n\n // Add ReadableStream if not available (basic implementation)\n if (!g.ReadableStream) {\n g.ReadableStream = class ReadableStream {\n private controller: any;\n private started = false;\n private closed = false;\n\n constructor(underlyingSource?: any) {\n this.controller = {\n enqueue: (chunk: any) => {\n this.controller._queue = this.controller._queue || [];\n this.controller._queue.push(chunk);\n },\n close: () => {\n this.closed = true;\n },\n error: (e: any) => {\n this.controller._error = e;\n },\n _queue: [],\n _error: null,\n };\n\n if (underlyingSource && underlyingSource.start) {\n underlyingSource.start(this.controller);\n this.started = true;\n }\n }\n\n getReader(): any {\n return {\n read: async () => {\n if (this.controller._error) {\n throw this.controller._error;\n }\n\n if (this.controller._queue.length > 0) {\n return { done: false, value: this.controller._queue.shift() };\n }\n\n if (this.closed) {\n return { done: true, value: undefined };\n }\n\n return { done: true, value: undefined };\n },\n releaseLock: () => {},\n };\n }\n };\n }\n}\n\n// Default export\nexport default {\n Request,\n Response,\n Headers,\n ReadableStream,\n KVNamespace,\n Crypto,\n SubtleCrypto,\n toEdgeWorkerResponse,\n installGlobalPolyfills,\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Global entry point - exposes all polyfills as global variables\n * This file is used for the IIFE build that automatically installs polyfills\n */\n\nimport { Request, Headers } from './request';\nimport { Response } from './response';\nimport { KVNamespace } from './kv-namespace';\nimport { Crypto, SubtleCrypto } from './crypto';\nimport { installGlobalPolyfills, toEdgeWorkerResponse } from './index';\n\n// Export all modules for the global bundle\nexport {\n Request,\n Response,\n Headers,\n KVNamespace,\n Crypto,\n SubtleCrypto,\n installGlobalPolyfills,\n toEdgeWorkerResponse,\n};\n\n// Also expose as default export\nexport default {\n Request,\n Response,\n Headers,\n KVNamespace,\n Crypto,\n SubtleCrypto,\n installGlobalPolyfills,\n toEdgeWorkerResponse,\n};\n", "/**\n * ReadableStream polyfill for Akamai EdgeWorkers\n * Provides basic ReadableStream functionality for body handling\n */\n\nexport class ReadableStream {\n private readonly chunks: Uint8Array[] = [];\n private closed: boolean = false;\n\n constructor(source?: { start?: (controller: ReadableStreamController) => void }) {\n const controller: ReadableStreamController = {\n enqueue: (chunk: Uint8Array) => {\n if (!this.closed) {\n this.chunks.push(chunk);\n }\n },\n close: () => {\n this.closed = true;\n }\n };\n\n if (source?.start) {\n source.start(controller);\n }\n }\n\n getReader(): ReadableStreamReader {\n return new ReadableStreamReader(this.chunks);\n }\n}\n\nexport class ReadableStreamReader {\n private readonly chunks: Uint8Array[];\n private index: number = 0;\n\n constructor(chunks: Uint8Array[]) {\n this.chunks = chunks;\n }\n\n async read(): Promise<{ done: boolean; value?: Uint8Array }> {\n if (this.index < this.chunks.length) {\n return { done: false, value: this.chunks[this.index++] };\n }\n return { done: true };\n }\n}\n\nexport interface ReadableStreamController {\n enqueue(chunk: Uint8Array): void;\n close(): void;\n}\n\n// Make ReadableStream available globally for Akamai EdgeWorkers\nif (typeof globalThis !== 'undefined' && !globalThis.ReadableStream) {\n (globalThis as any).ReadableStream = ReadableStream;\n}\n", "/**\n * Request polyfill for Akamai EdgeWorkers to match Cloudflare Workers API\n * Wraps Akamai's EW Request to provide Cloudflare-compatible interface\n */\n\nimport './streams';\n\nexport class Request {\n private ewRequest: any;\n private _url: string;\n private _method: string;\n private _headers: Headers;\n private _body: ReadableStream | null;\n private _bodyUsed: boolean = false;\n private _cachedBodyText: string | null = null;\n\n constructor(input: string | Request | any, init?: RequestInit) {\n if (typeof input === 'string') {\n this._url = input;\n this._method = init?.method?.toUpperCase() || 'GET';\n this._headers = new Headers(init?.headers);\n this._body = init?.body ? this.createReadableStream(init.body) : null;\n this.ewRequest = null;\n } else if (input instanceof Request) {\n this._url = input.url;\n this._method = input.method;\n this._headers = new Headers(input.headers);\n this._body = input._body;\n this.ewRequest = input.ewRequest;\n this._cachedBodyText = input._cachedBodyText;\n } else {\n // Akamai EW Request object - store reference for lazy body reading\n this.ewRequest = input;\n this._url = this.buildUrl(input);\n this._method = input.method?.toUpperCase() || 'GET';\n this._headers = this.convertHeaders(input);\n // Don't read body yet - will be read lazily when .text() is called\n this._body = null;\n }\n }\n\n private buildUrl(ewRequest: any): string {\n const scheme = ewRequest.scheme || 'https';\n const host = ewRequest.host || ewRequest.getHeader('host') || 'localhost';\n const path = ewRequest.path || '/';\n const query = ewRequest.query || '';\n\n return `${scheme}://${host}${path}${query ? '?' + query : ''}`;\n }\n\n private convertHeaders(ewRequest: any): Headers {\n const headers = new Headers();\n\n if (ewRequest.getHeaders) {\n const ewHeaders = ewRequest.getHeaders();\n for (const [name, values] of Object.entries(ewHeaders)) {\n if (Array.isArray(values)) {\n values.forEach((value: string) => headers.append(name, value));\n } else {\n headers.set(name, values as string);\n }\n }\n }\n\n return headers;\n }\n\n private createReadableStream(body: BodyInit): ReadableStream {\n return new ReadableStream({\n start(controller) {\n if (typeof body === 'string') {\n controller.enqueue(new TextEncoder().encode(body));\n } else if (body instanceof Uint8Array) {\n controller.enqueue(body);\n } else if (body instanceof ArrayBuffer) {\n controller.enqueue(new Uint8Array(body));\n }\n controller.close();\n }\n });\n }\n\n get url(): string {\n return this._url;\n }\n\n get method(): string {\n return this._method;\n }\n\n get headers(): Headers {\n return this._headers;\n }\n\n get bodyUsed(): boolean {\n return this._bodyUsed;\n }\n\n async text(): Promise<string> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n // If we have a cached body from cloning, use it\n if (this._cachedBodyText !== null) {\n return this._cachedBodyText;\n }\n\n // If this is an Akamai request, read body from it\n if (this.ewRequest && !this._body) {\n try {\n // Try different methods to get the body from Akamai request\n if (typeof this.ewRequest.text === 'function') {\n const bodyText = await this.ewRequest.text();\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (typeof this.ewRequest.json === 'function') {\n const bodyJson = await this.ewRequest.json();\n const bodyText = JSON.stringify(bodyJson);\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (typeof this.ewRequest.getBody === 'function') {\n const body = await this.ewRequest.getBody();\n const bodyText = typeof body === 'string' ? body : JSON.stringify(body);\n this._cachedBodyText = bodyText;\n return bodyText;\n } else if (this.ewRequest.body !== undefined && this.ewRequest.body !== null) {\n const bodyText = typeof this.ewRequest.body === 'string'\n ? this.ewRequest.body\n : JSON.stringify(this.ewRequest.body);\n this._cachedBodyText = bodyText;\n return bodyText;\n }\n } catch (error) {\n console.error('Error reading body from Akamai request:', error);\n }\n }\n\n if (!this._body) {\n return '';\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n const bodyText = new TextDecoder().decode(result);\n this._cachedBodyText = bodyText;\n return bodyText;\n }\n\n async json<T = any>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text);\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return new ArrayBuffer(0);\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result.buffer;\n }\n\n clone(): Request {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n\n const cloned = new Request(this._url, {\n method: this._method,\n headers: this._headers,\n });\n\n cloned.ewRequest = this.ewRequest;\n\n return cloned;\n }\n}\n\n// Headers polyfill for Akamai EdgeWorkers\nexport class Headers {\n private headers: Map<string, string[]> = new Map();\n\n constructor(init?: HeadersInit) {\n if (init) {\n if (init instanceof Headers) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n } else if (Array.isArray(init)) {\n init.forEach(([key, value]) => {\n this.append(key, value);\n });\n } else {\n Object.entries(init).forEach(([key, value]) => {\n this.append(key, value);\n });\n }\n }\n }\n\n append(name: string, value: string): void {\n const normalizedName = name.toLowerCase();\n const existing = this.headers.get(normalizedName) || [];\n existing.push(value);\n this.headers.set(normalizedName, existing);\n }\n\n delete(name: string): void {\n this.headers.delete(name.toLowerCase());\n }\n\n get(name: string): string | null {\n const values = this.headers.get(name.toLowerCase());\n return values ? values[0] : null;\n }\n\n has(name: string): boolean {\n return this.headers.has(name.toLowerCase());\n }\n\n set(name: string, value: string): void {\n this.headers.set(name.toLowerCase(), [value]);\n }\n\n forEach(callback: (value: string, key: string, parent: Headers) => void): void {\n this.headers.forEach((values, key) => {\n values.forEach(value => callback(value, key, this));\n });\n }\n\n entries(): IterableIterator<[string, string]> {\n const entries: [string, string][] = [];\n this.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries[Symbol.iterator]();\n }\n\n keys(): IterableIterator<string> {\n return this.headers.keys();\n }\n\n values(): IterableIterator<string> {\n const values: string[] = [];\n this.forEach(value => {\n values.push(value);\n });\n return values[Symbol.iterator]();\n }\n\n [Symbol.iterator](): IterableIterator<[string, string]> {\n return this.entries();\n }\n}\n\ntype HeadersInit = Headers | string[][] | Record<string, string>;\n\ninterface RequestInit {\n method?: string;\n headers?: HeadersInit;\n body?: BodyInit;\n}\n\ntype BodyInit = string | Uint8Array | ArrayBuffer;\n", "/**\n * Response polyfill for Akamai EdgeWorkers to match Cloudflare Workers API\n * Creates Cloudflare-compatible Response objects that can be converted to Akamai responses\n */\n\nimport './streams';\nimport { Headers } from './request';\n\nexport class Response {\n private _body: ReadableStream | null;\n private _bodyUsed: boolean = false;\n private _status: number;\n private _statusText: string;\n private _headers: Headers;\n private _ok: boolean;\n\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n this._status = init?.status || 200;\n this._statusText = init?.statusText || this.getStatusText(this._status);\n this._headers = new Headers(init?.headers);\n this._ok = this._status >= 200 && this._status < 300;\n\n if (body !== null && body !== undefined) {\n this._body = this.createReadableStream(body);\n } else {\n this._body = null;\n }\n }\n\n private getStatusText(status: number): string {\n const statusTexts: Record<number, string> = {\n 200: 'OK',\n 201: 'Created',\n 204: 'No Content',\n 301: 'Moved Permanently',\n 302: 'Found',\n 304: 'Not Modified',\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 500: 'Internal Server Error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n };\n return statusTexts[status] || '';\n }\n\n private createReadableStream(body: BodyInit): ReadableStream {\n return new ReadableStream({\n start(controller) {\n if (typeof body === 'string') {\n controller.enqueue(new TextEncoder().encode(body));\n } else if (body instanceof Uint8Array) {\n controller.enqueue(body);\n } else if (body instanceof ArrayBuffer) {\n controller.enqueue(new Uint8Array(body));\n } else if (body instanceof ReadableStream) {\n // Handle ReadableStream\n const reader = body.getReader();\n function push() {\n reader.read().then(({ done, value }) => {\n if (done) {\n controller.close();\n return;\n }\n controller.enqueue(value);\n push();\n });\n }\n push();\n return;\n }\n controller.close();\n }\n });\n }\n\n get body(): ReadableStream | null {\n return this._body;\n }\n\n get bodyUsed(): boolean {\n return this._bodyUsed;\n }\n\n get ok(): boolean {\n return this._ok;\n }\n\n get status(): number {\n return this._status;\n }\n\n get statusText(): string {\n return this._statusText;\n }\n\n get headers(): Headers {\n return this._headers;\n }\n\n async text(): Promise<string> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return '';\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return new TextDecoder().decode(result);\n }\n\n async json<T = any>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text);\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return new ArrayBuffer(0);\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result.buffer;\n }\n\n clone(): Response {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n\n return new Response(this._body, {\n status: this._status,\n statusText: this._statusText,\n headers: this._headers,\n });\n }\n\n static redirect(url: string, status?: number): Response {\n const redirectStatus = status || 302;\n return new Response(null, {\n status: redirectStatus,\n headers: {\n Location: url,\n },\n });\n }\n\n static json(data: any, init?: ResponseInit): Response {\n const body = JSON.stringify(data);\n const headers = new Headers(init?.headers);\n\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n\n return new Response(body, {\n ...init,\n headers,\n });\n }\n}\n\ntype BodyInit = string | Uint8Array | ArrayBuffer | ReadableStream;\n\ninterface ResponseInit {\n status?: number;\n statusText?: string;\n headers?: HeadersInit;\n}\n\ntype HeadersInit = Headers | string[][] | Record<string, string>;\n", "/**\n * KVNamespace polyfill for Akamai EdgeWorkers to match Cloudflare Workers KV API\n * Wraps Akamai EdgeKV to provide Cloudflare-compatible interface\n */\n\nexport class KVNamespace {\n private edgeKV: any;\n\n constructor(edgeKV: any) {\n this.edgeKV = edgeKV;\n }\n\n /**\n * Sanitize key to be compatible with EdgeKV requirements\n * EdgeKV only allows A-Z a-z 0-9 _ - (max 512 chars)\n * Replace invalid characters with hyphens\n */\n private sanitizeKey(key: string): string {\n // Replace any character that's not alphanumeric, underscore, or hyphen with hyphen\n const sanitized = key.replace(/[^A-Za-z0-9_-]/g, '-');\n\n // Ensure it's within 512 character limit\n if (sanitized.length > 512) {\n console.warn(`Key \"${key}\" exceeds 512 characters, truncating to 512`);\n return sanitized.substring(0, 512);\n }\n\n return sanitized;\n }\n\n /**\n * Get a value from EdgeKV (maps to Cloudflare KV get)\n */\n async get(key: string, options?: KVGetOptions): Promise<string | null>;\n async get(key: string, type: 'text'): Promise<string | null>;\n async get(key: string, type: 'json'): Promise<any>;\n async get(key: string, type: 'arrayBuffer'): Promise<ArrayBuffer | null>;\n async get(key: string, type: 'stream'): Promise<ReadableStream | null>;\n async get(\n key: string,\n optionsOrType?: KVGetOptions | 'text' | 'json' | 'arrayBuffer' | 'stream'\n ): Promise<string | any | ArrayBuffer | ReadableStream | null> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n // Sanitize key for EdgeKV compatibility\n const sanitizedKey = this.sanitizeKey(key);\n\n let response: string | null = null;\n\n try {\n response = await this.edgeKV.getText({ item: sanitizedKey });\n } catch (error: any) {\n // EdgeKV throws 404 errors, Cloudflare returns null\n if (error.status === 404 || error.message?.includes('not found')) {\n return null;\n }\n throw error;\n }\n\n if (response === null || response === undefined) {\n return null;\n }\n\n // Determine the type\n let type: string = 'text';\n if (typeof optionsOrType === 'string') {\n type = optionsOrType;\n } else if (optionsOrType && 'type' in optionsOrType) {\n type = optionsOrType.type || 'text';\n }\n\n switch (type) {\n case 'json':\n return JSON.parse(response);\n case 'arrayBuffer':\n return new TextEncoder().encode(response).buffer;\n case 'stream':\n return new ReadableStream({\n start(controller) {\n controller.enqueue(new TextEncoder().encode(response));\n controller.close();\n }\n });\n case 'text':\n default:\n return response;\n }\n }\n\n /**\n * Get value with metadata\n */\n async getWithMetadata<Metadata = unknown>(\n key: string,\n options?: KVGetOptions\n ): Promise<KVValueWithMetadata<string, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'text'\n ): Promise<KVValueWithMetadata<string, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'json'\n ): Promise<KVValueWithMetadata<any, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'arrayBuffer'\n ): Promise<KVValueWithMetadata<ArrayBuffer, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n type: 'stream'\n ): Promise<KVValueWithMetadata<ReadableStream, Metadata>>;\n async getWithMetadata<Metadata = unknown>(\n key: string,\n optionsOrType?: KVGetOptions | 'text' | 'json' | 'arrayBuffer' | 'stream'\n ): Promise<KVValueWithMetadata<any, Metadata>> {\n const value = await this.get(key, optionsOrType as any);\n\n // EdgeKV doesn't support metadata natively, so we return null for metadata\n return {\n value,\n metadata: null,\n };\n }\n\n /**\n * Put a value into EdgeKV (maps to Cloudflare KV put)\n */\n async put(key: string, value: string | ArrayBuffer | ReadableStream, options?: KVPutOptions): Promise<void> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n // Sanitize key for EdgeKV compatibility\n const sanitizedKey = this.sanitizeKey(key);\n\n let stringValue: string;\n\n if (typeof value === 'string') {\n stringValue = value;\n } else if (value instanceof ArrayBuffer) {\n stringValue = new TextDecoder().decode(value);\n } else if (value instanceof ReadableStream) {\n // Read the stream\n const reader = value.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n stringValue = new TextDecoder().decode(result);\n } else {\n throw new TypeError('Invalid value type');\n }\n\n // EdgeKV doesn't support expiration or metadata in the same way\n // We'll just store the value\n await this.edgeKV.putText({ item: sanitizedKey, value: stringValue });\n }\n\n /**\n * Delete a value from EdgeKV (maps to Cloudflare KV delete)\n */\n async delete(key: string): Promise<void> {\n if (!this.edgeKV) {\n throw new Error('EdgeKV not initialized');\n }\n\n // Sanitize key for EdgeKV compatibility\n const sanitizedKey = this.sanitizeKey(key);\n\n try {\n await this.edgeKV.delete({ item: sanitizedKey });\n } catch (error: any) {\n // Ignore 404 errors\n if (error.status === 404 || error.message?.includes('not found')) {\n return;\n }\n throw error;\n }\n }\n\n /**\n * List keys in the namespace\n * Note: EdgeKV doesn't support listing keys, so this is a limited implementation\n */\n async list(options?: KVListOptions): Promise<KVListResult> {\n // EdgeKV doesn't natively support list operations\n // This would require a custom implementation or tracking keys separately\n console.warn('KVNamespace.list() is not fully supported with Akamai EdgeKV');\n\n return {\n keys: [],\n list_complete: true,\n cursor: undefined,\n };\n }\n}\n\ninterface KVGetOptions {\n type?: 'text' | 'json' | 'arrayBuffer' | 'stream';\n cacheTtl?: number;\n}\n\ninterface KVPutOptions {\n expiration?: number;\n expirationTtl?: number;\n metadata?: any;\n}\n\ninterface KVListOptions {\n prefix?: string;\n limit?: number;\n cursor?: string;\n}\n\ninterface KVListResult {\n keys: Array<{ name: string; expiration?: number; metadata?: any }>;\n list_complete: boolean;\n cursor?: string;\n}\n\ninterface KVValueWithMetadata<Value, Metadata> {\n value: Value | null;\n metadata: Metadata | null;\n}\n", "/**\n * Crypto polyfill for Akamai EdgeWorkers to match Cloudflare Workers Web Crypto API\n * Provides a subset of the Web Crypto API using Akamai's crypto module\n */\n\nexport class Crypto {\n /**\n * Generate cryptographically strong random values\n */\n getRandomValues<T extends ArrayBufferView>(array: T): T {\n // In Akamai EdgeWorkers, we can use the crypto module\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\n return crypto.getRandomValues(array);\n }\n\n // Fallback implementation (not cryptographically secure, for development only)\n console.warn('Using fallback random number generation - not cryptographically secure');\n const bytes = new Uint8Array(array.buffer, array.byteOffset, array.byteLength);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n return array;\n }\n\n /**\n * Generate a random UUID\n */\n randomUUID(): string {\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n\n // Fallback UUID v4 generation\n const bytes = new Uint8Array(16);\n this.getRandomValues(bytes);\n\n // Set version (4) and variant bits\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n\n const hex = Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n }\n\n /**\n * SubtleCrypto API for cryptographic operations\n */\n get subtle(): SubtleCrypto {\n return new SubtleCrypto();\n }\n}\n\nexport class SubtleCrypto {\n /**\n * Generate a digest (hash) of the data\n */\n async digest(algorithm: AlgorithmIdentifier, data: BufferSource): Promise<ArrayBuffer> {\n const algName = typeof algorithm === 'string' ? algorithm : algorithm.name;\n\n // @ts-ignore - crypto is available in Akamai runtime\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.digest) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.digest(algorithm, data);\n }\n\n // For Akamai EdgeWorkers without native crypto.subtle\n // You would need to use the crypto module's createHash or similar\n throw new Error(`Digest algorithm ${algName} not supported in this environment`);\n }\n\n /**\n * Sign data with a key\n */\n async sign(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.sign) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.sign(algorithm, key, data);\n }\n\n throw new Error('Sign operation not supported in this environment');\n }\n\n /**\n * Verify a signature\n */\n async verify(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n signature: BufferSource,\n data: BufferSource\n ): Promise<boolean> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.verify) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.verify(algorithm, key, signature, data);\n }\n\n throw new Error('Verify operation not supported in this environment');\n }\n\n /**\n * Encrypt data\n */\n async encrypt(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.encrypt) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.encrypt(algorithm, key, data);\n }\n\n throw new Error('Encrypt operation not supported in this environment');\n }\n\n /**\n * Decrypt data\n */\n async decrypt(\n algorithm: AlgorithmIdentifier,\n key: CryptoKey,\n data: BufferSource\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.decrypt) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.decrypt(algorithm, key, data);\n }\n\n throw new Error('Decrypt operation not supported in this environment');\n }\n\n /**\n * Generate a key\n */\n async generateKey(\n algorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey | CryptoKeyPair> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.generateKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.generateKey(algorithm, extractable, keyUsages);\n }\n\n throw new Error('GenerateKey operation not supported in this environment');\n }\n\n /**\n * Derive bits from a key\n */\n async deriveBits(\n algorithm: AlgorithmIdentifier,\n baseKey: CryptoKey,\n length: number\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.deriveBits) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.deriveBits(algorithm, baseKey, length);\n }\n\n throw new Error('DeriveBits operation not supported in this environment');\n }\n\n /**\n * Derive a key from another key\n */\n async deriveKey(\n algorithm: AlgorithmIdentifier,\n baseKey: CryptoKey,\n derivedKeyAlgorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.deriveKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages);\n }\n\n throw new Error('DeriveKey operation not supported in this environment');\n }\n\n /**\n * Import a key\n */\n async importKey(\n format: KeyFormat,\n keyData: BufferSource | JsonWebKey,\n algorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.importKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.importKey(format, keyData, algorithm, extractable, keyUsages);\n }\n\n throw new Error('ImportKey operation not supported in this environment');\n }\n\n /**\n * Export a key\n */\n async exportKey(format: KeyFormat, key: CryptoKey): Promise<ArrayBuffer | JsonWebKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.exportKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.exportKey(format, key);\n }\n\n throw new Error('ExportKey operation not supported in this environment');\n }\n\n /**\n * Wrap a key\n */\n async wrapKey(\n format: KeyFormat,\n key: CryptoKey,\n wrappingKey: CryptoKey,\n wrapAlgorithm: AlgorithmIdentifier\n ): Promise<ArrayBuffer> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.wrapKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.wrapKey(format, key, wrappingKey, wrapAlgorithm);\n }\n\n throw new Error('WrapKey operation not supported in this environment');\n }\n\n /**\n * Unwrap a key\n */\n async unwrapKey(\n format: KeyFormat,\n wrappedKey: BufferSource,\n unwrappingKey: CryptoKey,\n unwrapAlgorithm: AlgorithmIdentifier,\n unwrappedKeyAlgorithm: AlgorithmIdentifier,\n extractable: boolean,\n keyUsages: KeyUsage[]\n ): Promise<CryptoKey> {\n // @ts-ignore\n if (typeof crypto !== 'undefined' && crypto.subtle && crypto.subtle.unwrapKey) {\n // @ts-ignore - type compatibility with native crypto\n return crypto.subtle.unwrapKey(\n format,\n wrappedKey,\n unwrappingKey,\n unwrapAlgorithm,\n unwrappedKeyAlgorithm,\n extractable,\n keyUsages\n );\n }\n\n throw new Error('UnwrapKey operation not supported in this environment');\n }\n}\n\n// Type definitions are provided by lib.dom.d.ts\n// We don't need to redefine them here since tsconfig includes \"DOM\" lib\n", "/**\n * Akamai EdgeWorkers to Cloudflare Workers API Polyfill\n *\n * This polyfill makes Akamai EdgeWorkers compatible with Cloudflare Workers API,\n * enabling the use of Optimizely Edge Delivery SDK and other Cloudflare-compatible\n * libraries on Akamai's edge platform.\n *\n * @example\n * ```typescript\n * import { Request, Response, KVNamespace, Crypto } from 'akamai-edge-delivery-polyfill';\n *\n * // Use in your EdgeWorker\n * export async function onClientRequest(request) {\n * const cfRequest = new Request(request);\n * const response = new Response('Hello World', { status: 200 });\n * return response;\n * }\n * ```\n */\n\n// Import streams polyfill first to ensure ReadableStream is available globally\nimport './streams';\n\nimport { Request, Headers } from './request';\nimport { Response } from './response';\nimport { KVNamespace } from './kv-namespace';\nimport { Crypto, SubtleCrypto } from './crypto';\nimport { ReadableStream } from './streams';\n\nexport { Request, Headers } from './request';\nexport { Response } from './response';\nexport { KVNamespace } from './kv-namespace';\nexport { Crypto, SubtleCrypto } from './crypto';\nexport { ReadableStream } from './streams';\n\n/**\n * Helper function to convert Akamai EdgeWorker Response to a format\n * that can be returned from EdgeWorker event handlers\n */\nexport async function toEdgeWorkerResponse(response: any): Promise<any> {\n const body = await response.text();\n const headers: Record<string, string> = {};\n\n response.headers.forEach((value: string, key: string) => {\n headers[key] = value;\n });\n\n return {\n status: response.status,\n headers,\n body,\n };\n}\n\n/**\n * Create a global polyfill that injects Cloudflare-compatible APIs into the global scope\n * This is useful when using libraries that expect these APIs to be globally available\n */\nexport function installGlobalPolyfills(): void {\n const g = globalThis as any;\n\n if (!g.Request) {\n g.Request = Request;\n }\n\n if (!g.Response) {\n g.Response = Response;\n }\n\n if (!g.Headers) {\n g.Headers = Headers;\n }\n\n if (!g.crypto) {\n g.crypto = new Crypto();\n }\n\n // Add TextEncoder and TextDecoder if not available\n if (!g.TextEncoder) {\n g.TextEncoder = class TextEncoder {\n encode(input: string): Uint8Array {\n const utf8: number[] = [];\n for (let i = 0; i < input.length; i++) {\n let charCode = input.charCodeAt(i);\n if (charCode < 0x80) {\n utf8.push(charCode);\n } else if (charCode < 0x800) {\n utf8.push(0xc0 | (charCode >> 6), 0x80 | (charCode & 0x3f));\n } else if (charCode < 0xd800 || charCode >= 0xe000) {\n utf8.push(0xe0 | (charCode >> 12), 0x80 | ((charCode >> 6) & 0x3f), 0x80 | (charCode & 0x3f));\n } else {\n i++;\n charCode = 0x10000 + (((charCode & 0x3ff) << 10) | (input.charCodeAt(i) & 0x3ff));\n utf8.push(\n 0xf0 | (charCode >> 18),\n 0x80 | ((charCode >> 12) & 0x3f),\n 0x80 | ((charCode >> 6) & 0x3f),\n 0x80 | (charCode & 0x3f)\n );\n }\n }\n return new Uint8Array(utf8);\n }\n };\n }\n\n if (!g.TextDecoder) {\n g.TextDecoder = class TextDecoder {\n decode(input: Uint8Array | ArrayBuffer): string {\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n let result = '';\n let i = 0;\n\n while (i < bytes.length) {\n const byte1 = bytes[i++];\n\n if (byte1 < 0x80) {\n result += String.fromCharCode(byte1);\n } else if (byte1 < 0xe0) {\n const byte2 = bytes[i++];\n result += String.fromCharCode(((byte1 & 0x1f) << 6) | (byte2 & 0x3f));\n } else if (byte1 < 0xf0) {\n const byte2 = bytes[i++];\n const byte3 = bytes[i++];\n result += String.fromCharCode(((byte1 & 0x0f) << 12) | ((byte2 & 0x3f) << 6) | (byte3 & 0x3f));\n } else {\n const byte2 = bytes[i++];\n const byte3 = bytes[i++];\n const byte4 = bytes[i++];\n let codePoint =\n ((byte1 & 0x07) << 18) | ((byte2 & 0x3f) << 12) | ((byte3 & 0x3f) << 6) | (byte4 & 0x3f);\n codePoint -= 0x10000;\n result += String.fromCharCode(0xd800 + (codePoint >> 10), 0xdc00 + (codePoint & 0x3ff));\n }\n }\n\n return result;\n }\n };\n }\n\n // Add ReadableStream if not available (basic implementation)\n if (!g.ReadableStream) {\n g.ReadableStream = class ReadableStream {\n private controller: any;\n private started = false;\n private closed = false;\n\n constructor(underlyingSource?: any) {\n this.controller = {\n enqueue: (chunk: any) => {\n this.controller._queue = this.controller._queue || [];\n this.controller._queue.push(chunk);\n },\n close: () => {\n this.closed = true;\n },\n error: (e: any) => {\n this.controller._error = e;\n },\n _queue: [],\n _error: null,\n };\n\n if (underlyingSource && underlyingSource.start) {\n underlyingSource.start(this.controller);\n this.started = true;\n }\n }\n\n getReader(): any {\n return {\n read: async () => {\n if (this.controller._error) {\n throw this.controller._error;\n }\n\n if (this.controller._queue.length > 0) {\n return { done: false, value: this.controller._queue.shift() };\n }\n\n if (this.closed) {\n return { done: true, value: undefined };\n }\n\n return { done: true, value: undefined };\n },\n releaseLock: () => {},\n };\n }\n };\n }\n}\n\n// Default export\nexport default {\n Request,\n Response,\n Headers,\n ReadableStream,\n KVNamespace,\n Crypto,\n SubtleCrypto,\n toEdgeWorkerResponse,\n installGlobalPolyfills,\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["ReadableStream", "bodyText", "value"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "akamai-edge-delivery-polyfill",
3
- "version": "1.0.4",
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",