1 | {"version":3,"file":"Http.js","sourceRoot":"","sources":["../../../../src/lib/channels/Http.ts"],"names":[],"mappings":"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","sourcesContent":["import { request, Task, CancellablePromise } from '@theintern/common';\n\nimport { RemoteEvents } from '../RemoteSuite';\nimport BaseChannel, { ChannelOptions, Message } from './Base';\nimport { stringify } from '../common/util';\n\nexport default class HttpChannel extends BaseChannel {\n protected _lastRequest: CancellablePromise<void>;\n protected _messageBuffer: MessageEntry[];\n protected _sequence: number;\n protected _maxPostSize: number;\n protected _activeRequest: CancellablePromise<any> | undefined;\n\n constructor(options: HttpChannelOptions) {\n super(options);\n this._sequence = 1;\n this._maxPostSize = options.maxPostSize || 100000;\n this._messageBuffer = [];\n this._lastRequest = Task.resolve();\n }\n\n protected _sendData(name: keyof RemoteEvents, data: any): CancellablePromise {\n const id = String(this._sequence++);\n const sessionId = this.sessionId;\n const message: Message = { id, sessionId, name, data };\n const task = new Task(\n (resolve, reject) => {\n this._messageBuffer.push({\n message: stringify(message),\n resolve,\n reject,\n });\n\n if (this._activeRequest) {\n this._activeRequest.then(() => this._sendMessages());\n } else {\n this._sendMessages();\n }\n },\n () => {\n if (this._activeRequest) {\n this._activeRequest.cancel();\n }\n this._messageBuffer = [];\n }\n );\n\n return task;\n }\n\n /**\n * Some testing services have problems handling large message POSTs, so\n * limit the maximum size of each POST body to maxPostSize bytes. Always\n * send at least one message, even if it's more than maxPostSize bytes.\n */\n protected _sendMessages(): CancellablePromise<any> | undefined {\n const messages = this._messageBuffer;\n if (messages.length === 0) {\n return;\n }\n\n const block = [messages.shift()!];\n\n let size = block[0].message.length;\n while (\n messages.length > 0 &&\n size + messages[0].message.length < this._maxPostSize\n ) {\n size += messages[0].message.length;\n block.push(messages.shift()!);\n }\n\n this._activeRequest = request(this.url, {\n method: 'post',\n headers: { 'Content-Type': 'application/json' },\n data: block.map((entry) => entry.message),\n })\n .then((response) => {\n if (response.status === 200) {\n return response.json<any[]>();\n } else if (response.status === 204) {\n return [];\n } else {\n throw new Error(response.statusText);\n }\n })\n .then((results: any[]) => {\n block.forEach((entry, index) => {\n entry.resolve(results[index]);\n });\n })\n .catch((error) => {\n block.forEach((entry) => {\n entry.reject(error);\n });\n })\n .finally(() => {\n this._activeRequest = undefined;\n if (messages.length > 0) {\n return this._sendMessages();\n }\n });\n\n return this._activeRequest;\n }\n}\n\nexport interface HttpChannelOptions extends ChannelOptions {\n maxPostSize?: number;\n}\n\nexport interface MessageEntry {\n message: string;\n resolve: (value: any) => void;\n reject: (error: Error) => void;\n}\n"]} |