akamai-edge-delivery-polyfill 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/request.ts", "../src/response.ts"],
4
- "sourcesContent": ["/**\n * Request polyfill for Akamai EdgeWorkers to match Cloudflare Workers API\n * Wraps Akamai's EW Request to provide Cloudflare-compatible interface\n */\n\n// Simple ReadableStream polyfill for Akamai EdgeWorkers\nclass ReadableStream {\n private chunks: Uint8Array[] = [];\n private closed: boolean = false;\n private controller: any;\n\n constructor(source?: { start?: (controller: any) => void }) {\n const controller = {\n enqueue: (chunk: Uint8Array) => {\n if (!this.closed) {\n this.chunks.push(chunk);\n }\n },\n close: () => {\n this.closed = true;\n }\n };\n this.controller = controller;\n\n if (source?.start) {\n source.start(controller);\n }\n }\n\n getReader(): ReadableStreamReader {\n return new ReadableStreamReader(this.chunks, this.closed);\n }\n}\n\nclass ReadableStreamReader {\n private chunks: Uint8Array[];\n private index: number = 0;\n private closed: boolean;\n\n constructor(chunks: Uint8Array[], closed: boolean) {\n this.chunks = chunks;\n this.closed = closed;\n }\n\n async read(): Promise<{ done: boolean; value?: Uint8Array }> {\n if (this.index < this.chunks.length) {\n return { done: false, value: this.chunks[this.index++] };\n }\n return { done: true };\n }\n}\n\nexport class Request {\n private ewRequest: any;\n private _url: string;\n private _method: string;\n private _headers: Headers;\n private _body: ReadableStream | null;\n private _bodyUsed: boolean = false;\n\n constructor(input: string | Request | any, init?: RequestInit) {\n if (typeof input === 'string') {\n this._url = input;\n this._method = init?.method?.toUpperCase() || 'GET';\n this._headers = new Headers(init?.headers);\n this._body = init?.body ? this.createReadableStream(init.body) : null;\n } else if (input instanceof Request) {\n this._url = input.url;\n this._method = input.method;\n this._headers = new Headers(input.headers);\n this._body = input._body;\n this.ewRequest = input.ewRequest;\n } else {\n // Akamai EW Request object\n this.ewRequest = input;\n this._url = this.buildUrl(input);\n this._method = input.method?.toUpperCase() || 'GET';\n this._headers = this.convertHeaders(input);\n this._body = this.createBodyStream(input);\n }\n }\n\n private buildUrl(ewRequest: any): string {\n const scheme = ewRequest.scheme || 'https';\n const host = ewRequest.host || ewRequest.getHeader('host') || 'localhost';\n const path = ewRequest.path || '/';\n const query = ewRequest.query || '';\n\n return `${scheme}://${host}${path}${query ? '?' + query : ''}`;\n }\n\n private convertHeaders(ewRequest: any): Headers {\n const headers = new Headers();\n\n if (ewRequest.getHeaders) {\n const ewHeaders = ewRequest.getHeaders();\n for (const [name, values] of Object.entries(ewHeaders)) {\n if (Array.isArray(values)) {\n values.forEach((value: string) => headers.append(name, value));\n } else {\n headers.set(name, values as string);\n }\n }\n }\n\n return headers;\n }\n\n private createBodyStream(ewRequest: any): ReadableStream | null {\n if (!ewRequest.body) {\n return null;\n }\n\n return new ReadableStream({\n start(controller) {\n if (typeof ewRequest.body === 'string') {\n controller.enqueue(new TextEncoder().encode(ewRequest.body));\n } else if (ewRequest.body instanceof Uint8Array) {\n controller.enqueue(ewRequest.body);\n }\n controller.close();\n }\n });\n }\n\n private createReadableStream(body: BodyInit): ReadableStream {\n return new ReadableStream({\n start(controller) {\n if (typeof body === 'string') {\n controller.enqueue(new TextEncoder().encode(body));\n } else if (body instanceof Uint8Array) {\n controller.enqueue(body);\n } else if (body instanceof ArrayBuffer) {\n controller.enqueue(new Uint8Array(body));\n }\n controller.close();\n }\n });\n }\n\n get url(): string {\n return this._url;\n }\n\n get method(): string {\n return this._method;\n }\n\n get headers(): Headers {\n return this._headers;\n }\n\n get bodyUsed(): boolean {\n return this._bodyUsed;\n }\n\n async text(): Promise<string> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return '';\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return new TextDecoder().decode(result);\n }\n\n async json<T = any>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text);\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return new ArrayBuffer(0);\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result.buffer;\n }\n\n clone(): Request {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n\n const cloned = new Request(this._url, {\n method: this._method,\n headers: this._headers,\n });\n\n cloned.ewRequest = this.ewRequest;\n\n return cloned;\n }\n}\n\n// Headers polyfill for Akamai EdgeWorkers\nexport class Headers {\n private headers: Map<string, string[]> = new Map();\n\n constructor(init?: HeadersInit) {\n if (init) {\n if (init instanceof Headers) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n } else if (Array.isArray(init)) {\n init.forEach(([key, value]) => {\n this.append(key, value);\n });\n } else {\n Object.entries(init).forEach(([key, value]) => {\n this.append(key, value);\n });\n }\n }\n }\n\n append(name: string, value: string): void {\n const normalizedName = name.toLowerCase();\n const existing = this.headers.get(normalizedName) || [];\n existing.push(value);\n this.headers.set(normalizedName, existing);\n }\n\n delete(name: string): void {\n this.headers.delete(name.toLowerCase());\n }\n\n get(name: string): string | null {\n const values = this.headers.get(name.toLowerCase());\n return values ? values[0] : null;\n }\n\n has(name: string): boolean {\n return this.headers.has(name.toLowerCase());\n }\n\n set(name: string, value: string): void {\n this.headers.set(name.toLowerCase(), [value]);\n }\n\n forEach(callback: (value: string, key: string, parent: Headers) => void): void {\n this.headers.forEach((values, key) => {\n values.forEach(value => callback(value, key, this));\n });\n }\n\n entries(): IterableIterator<[string, string]> {\n const entries: [string, string][] = [];\n this.forEach((value, key) => {\n entries.push([key, value]);\n });\n return entries[Symbol.iterator]();\n }\n\n keys(): IterableIterator<string> {\n return this.headers.keys();\n }\n\n values(): IterableIterator<string> {\n const values: string[] = [];\n this.forEach(value => {\n values.push(value);\n });\n return values[Symbol.iterator]();\n }\n\n [Symbol.iterator](): IterableIterator<[string, string]> {\n return this.entries();\n }\n}\n\ntype HeadersInit = Headers | string[][] | Record<string, string>;\n\ninterface RequestInit {\n method?: string;\n headers?: HeadersInit;\n body?: BodyInit;\n}\n\ntype BodyInit = string | Uint8Array | ArrayBuffer;\n", "/**\n * Response polyfill for Akamai EdgeWorkers to match Cloudflare Workers API\n * Creates Cloudflare-compatible Response objects that can be converted to Akamai responses\n */\n\nimport { Headers } from './request';\n\nexport class Response {\n private _body: ReadableStream | null;\n private _bodyUsed: boolean = false;\n private _status: number;\n private _statusText: string;\n private _headers: Headers;\n private _ok: boolean;\n\n constructor(body?: BodyInit | null, init?: ResponseInit) {\n this._status = init?.status || 200;\n this._statusText = init?.statusText || this.getStatusText(this._status);\n this._headers = new Headers(init?.headers);\n this._ok = this._status >= 200 && this._status < 300;\n\n if (body !== null && body !== undefined) {\n this._body = this.createReadableStream(body);\n } else {\n this._body = null;\n }\n }\n\n private getStatusText(status: number): string {\n const statusTexts: Record<number, string> = {\n 200: 'OK',\n 201: 'Created',\n 204: 'No Content',\n 301: 'Moved Permanently',\n 302: 'Found',\n 304: 'Not Modified',\n 400: 'Bad Request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not Found',\n 500: 'Internal Server Error',\n 502: 'Bad Gateway',\n 503: 'Service Unavailable',\n };\n return statusTexts[status] || '';\n }\n\n private createReadableStream(body: BodyInit): ReadableStream {\n return new ReadableStream({\n start(controller) {\n if (typeof body === 'string') {\n controller.enqueue(new TextEncoder().encode(body));\n } else if (body instanceof Uint8Array) {\n controller.enqueue(body);\n } else if (body instanceof ArrayBuffer) {\n controller.enqueue(new Uint8Array(body));\n } else if (body instanceof ReadableStream) {\n // Handle ReadableStream\n const reader = body.getReader();\n function push() {\n reader.read().then(({ done, value }) => {\n if (done) {\n controller.close();\n return;\n }\n controller.enqueue(value);\n push();\n });\n }\n push();\n return;\n }\n controller.close();\n }\n });\n }\n\n get body(): ReadableStream | null {\n return this._body;\n }\n\n get bodyUsed(): boolean {\n return this._bodyUsed;\n }\n\n get ok(): boolean {\n return this._ok;\n }\n\n get status(): number {\n return this._status;\n }\n\n get statusText(): string {\n return this._statusText;\n }\n\n get headers(): Headers {\n return this._headers;\n }\n\n async text(): Promise<string> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return '';\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return new TextDecoder().decode(result);\n }\n\n async json<T = any>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text);\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n this._bodyUsed = true;\n\n if (!this._body) {\n return new ArrayBuffer(0);\n }\n\n const reader = this._body.getReader();\n const chunks: Uint8Array[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result.buffer;\n }\n\n clone(): Response {\n if (this._bodyUsed) {\n throw new TypeError('Body has already been consumed');\n }\n\n return new Response(this._body, {\n status: this._status,\n statusText: this._statusText,\n headers: this._headers,\n });\n }\n\n static redirect(url: string, status?: number): Response {\n const redirectStatus = status || 302;\n return new Response(null, {\n status: redirectStatus,\n headers: {\n Location: url,\n },\n });\n }\n\n static json(data: any, init?: ResponseInit): Response {\n const body = JSON.stringify(data);\n const headers = new Headers(init?.headers);\n\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/json');\n }\n\n return new Response(body, {\n ...init,\n headers,\n });\n }\n}\n\ntype BodyInit = string | Uint8Array | ArrayBuffer | ReadableStream;\n\ninterface ResponseInit {\n status?: number;\n statusText?: string;\n headers?: HeadersInit;\n}\n\ntype HeadersInit = Headers | string[][] | Record<string, string>;\n"],
5
- "mappings": "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",
6
- "names": []
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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",
6
+ "names": ["ReadableStream"]
7
7
  }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * ReadableStream polyfill for Akamai EdgeWorkers
3
+ * Provides basic ReadableStream functionality for body handling
4
+ */
5
+ export declare class ReadableStream {
6
+ private readonly chunks;
7
+ private closed;
8
+ constructor(source?: {
9
+ start?: (controller: ReadableStreamController) => void;
10
+ });
11
+ getReader(): ReadableStreamReader;
12
+ }
13
+ export declare class ReadableStreamReader {
14
+ private readonly chunks;
15
+ private index;
16
+ constructor(chunks: Uint8Array[]);
17
+ read(): Promise<{
18
+ done: boolean;
19
+ value?: Uint8Array;
20
+ }>;
21
+ }
22
+ export interface ReadableStreamController {
23
+ enqueue(chunk: Uint8Array): void;
24
+ close(): void;
25
+ }
26
+ //# sourceMappingURL=streams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streams.d.ts","sourceRoot":"","sources":["../src/streams.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,wBAAwB,KAAK,IAAI,CAAA;KAAE;IAiB/E,SAAS,IAAI,oBAAoB;CAGlC;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,KAAK,CAAa;gBAEd,MAAM,EAAE,UAAU,EAAE;IAI1B,IAAI,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;CAM7D;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,KAAK,IAAI,IAAI,CAAC;CACf"}
@@ -0,0 +1,43 @@
1
+ // src/streams.ts
2
+ var ReadableStream = class {
3
+ constructor(source) {
4
+ this.chunks = [];
5
+ this.closed = false;
6
+ const controller = {
7
+ enqueue: (chunk) => {
8
+ if (!this.closed) {
9
+ this.chunks.push(chunk);
10
+ }
11
+ },
12
+ close: () => {
13
+ this.closed = true;
14
+ }
15
+ };
16
+ if (source?.start) {
17
+ source.start(controller);
18
+ }
19
+ }
20
+ getReader() {
21
+ return new ReadableStreamReader(this.chunks);
22
+ }
23
+ };
24
+ var ReadableStreamReader = class {
25
+ constructor(chunks) {
26
+ this.index = 0;
27
+ this.chunks = chunks;
28
+ }
29
+ async read() {
30
+ if (this.index < this.chunks.length) {
31
+ return { done: false, value: this.chunks[this.index++] };
32
+ }
33
+ return { done: true };
34
+ }
35
+ };
36
+ if (typeof globalThis !== "undefined" && !globalThis.ReadableStream) {
37
+ globalThis.ReadableStream = ReadableStream;
38
+ }
39
+ export {
40
+ ReadableStream,
41
+ ReadableStreamReader
42
+ };
43
+ //# sourceMappingURL=streams.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/streams.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"],
5
+ "mappings": ";AAKO,IAAM,iBAAN,MAAqB;AAAA,EAI1B,YAAY,QAAqE;AAHjF,SAAiB,SAAuB,CAAC;AACzC,SAAQ,SAAkB;AAGxB,UAAM,aAAuC;AAAA,MAC3C,SAAS,CAAC,UAAsB;AAC9B,YAAI,CAAC,KAAK,QAAQ;AAChB,eAAK,OAAO,KAAK,KAAK;AAAA,QACxB;AAAA,MACF;AAAA,MACA,OAAO,MAAM;AACX,aAAK,SAAS;AAAA,MAChB;AAAA,IACF;AAEA,QAAI,QAAQ,OAAO;AACjB,aAAO,MAAM,UAAU;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,YAAkC;AAChC,WAAO,IAAI,qBAAqB,KAAK,MAAM;AAAA,EAC7C;AACF;AAEO,IAAM,uBAAN,MAA2B;AAAA,EAIhC,YAAY,QAAsB;AAFlC,SAAQ,QAAgB;AAGtB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,OAAuD;AAC3D,QAAI,KAAK,QAAQ,KAAK,OAAO,QAAQ;AACnC,aAAO,EAAE,MAAM,OAAO,OAAO,KAAK,OAAO,KAAK,OAAO,EAAE;AAAA,IACzD;AACA,WAAO,EAAE,MAAM,KAAK;AAAA,EACtB;AACF;AAQA,IAAI,OAAO,eAAe,eAAe,CAAC,WAAW,gBAAgB;AACnE,EAAC,WAAmB,iBAAiB;AACvC;",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "akamai-edge-delivery-polyfill",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
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",