akamai-edge-delivery-polyfill 1.0.3 → 1.0.4

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