@eyepop.ai/react-native-eyepop 1.15.1
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/LICENSE +20 -0
- package/README.md +33 -0
- package/lib/commonjs/index.js +52 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/rn_http_client.js +113 -0
- package/lib/commonjs/rn_http_client.js.map +1 -0
- package/lib/commonjs/rn_http_header_parser.js +135 -0
- package/lib/commonjs/rn_http_header_parser.js.map +1 -0
- package/lib/commonjs/rn_http_response_parser.js +199 -0
- package/lib/commonjs/rn_http_response_parser.js.map +1 -0
- package/lib/commonjs/rn_local_file.js +38 -0
- package/lib/commonjs/rn_local_file.js.map +1 -0
- package/lib/commonjs/rn_streaming_fetch.js +111 -0
- package/lib/commonjs/rn_streaming_fetch.js.map +1 -0
- package/lib/module/index.js +48 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/rn_http_client.js +109 -0
- package/lib/module/rn_http_client.js.map +1 -0
- package/lib/module/rn_http_header_parser.js +131 -0
- package/lib/module/rn_http_header_parser.js.map +1 -0
- package/lib/module/rn_http_response_parser.js +194 -0
- package/lib/module/rn_http_response_parser.js.map +1 -0
- package/lib/module/rn_local_file.js +34 -0
- package/lib/module/rn_local_file.js.map +1 -0
- package/lib/module/rn_streaming_fetch.js +107 -0
- package/lib/module/rn_streaming_fetch.js.map +1 -0
- package/lib/typescript/commonjs/package.json +1 -0
- package/lib/typescript/commonjs/src/index.d.ts +8 -0
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/rn_http_client.d.ts +19 -0
- package/lib/typescript/commonjs/src/rn_http_client.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/rn_http_header_parser.d.ts +2 -0
- package/lib/typescript/commonjs/src/rn_http_header_parser.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/rn_http_response_parser.d.ts +21 -0
- package/lib/typescript/commonjs/src/rn_http_response_parser.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/rn_local_file.d.ts +5 -0
- package/lib/typescript/commonjs/src/rn_local_file.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/rn_streaming_fetch.d.ts +7 -0
- package/lib/typescript/commonjs/src/rn_streaming_fetch.d.ts.map +1 -0
- package/lib/typescript/module/package.json +1 -0
- package/lib/typescript/module/src/index.d.ts +8 -0
- package/lib/typescript/module/src/index.d.ts.map +1 -0
- package/lib/typescript/module/src/rn_http_client.d.ts +19 -0
- package/lib/typescript/module/src/rn_http_client.d.ts.map +1 -0
- package/lib/typescript/module/src/rn_http_header_parser.d.ts +2 -0
- package/lib/typescript/module/src/rn_http_header_parser.d.ts.map +1 -0
- package/lib/typescript/module/src/rn_http_response_parser.d.ts +21 -0
- package/lib/typescript/module/src/rn_http_response_parser.d.ts.map +1 -0
- package/lib/typescript/module/src/rn_local_file.d.ts +5 -0
- package/lib/typescript/module/src/rn_local_file.d.ts.map +1 -0
- package/lib/typescript/module/src/rn_streaming_fetch.d.ts +7 -0
- package/lib/typescript/module/src/rn_streaming_fetch.d.ts.map +1 -0
- package/package.json +202 -0
- package/src/index.ts +48 -0
- package/src/rn_http_client.ts +134 -0
- package/src/rn_http_header_parser.ts +138 -0
- package/src/rn_http_response_parser.ts +248 -0
- package/src/rn_local_file.ts +43 -0
- package/src/rn_streaming_fetch.ts +131 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.reactNativeStreamingFetch = reactNativeStreamingFetch;
|
|
7
|
+
require("react-native-polyfill-globals/auto");
|
|
8
|
+
var _rn_http_response_parser = require("./rn_http_response_parser.js");
|
|
9
|
+
var _es = require("web-streams-polyfill/ponyfill/es6");
|
|
10
|
+
async function reactNativeStreamingFetch(url, method, headers, body, contentLength, sockets, logger) {
|
|
11
|
+
const isHttps = url.protocol === 'https:';
|
|
12
|
+
const port = url.port ? parseInt(url.port, 10) : isHttps ? 443 : 80;
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
const connectOptions = {
|
|
15
|
+
port: port,
|
|
16
|
+
host: url.hostname,
|
|
17
|
+
reuseAddress: true
|
|
18
|
+
};
|
|
19
|
+
const clientSocket = new sockets.Socket();
|
|
20
|
+
const client = isHttps ? new sockets.TLSSocket(clientSocket) : clientSocket;
|
|
21
|
+
let error;
|
|
22
|
+
const responseParser = new _rn_http_response_parser.ResponseParser(logger, resolve, reason => {
|
|
23
|
+
error = reason;
|
|
24
|
+
reject(error);
|
|
25
|
+
client.destroy();
|
|
26
|
+
});
|
|
27
|
+
client.on('data', function (data) {
|
|
28
|
+
responseParser.processResponseReadBuffer(data);
|
|
29
|
+
});
|
|
30
|
+
client.on('error', function (err) {
|
|
31
|
+
logger.info(`error: ${err}`);
|
|
32
|
+
if (!error) {
|
|
33
|
+
error = err;
|
|
34
|
+
reject(error);
|
|
35
|
+
}
|
|
36
|
+
client.destroy();
|
|
37
|
+
});
|
|
38
|
+
client.on('close', function () {
|
|
39
|
+
if (!error) {
|
|
40
|
+
error = 'socket closed';
|
|
41
|
+
reject(error);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
client.connect(connectOptions, async () => {
|
|
45
|
+
const headerLines = [`${method} ${url.pathname}${url.search} HTTP/1.1\r\n`, `Host: ${url.host}\r\n`];
|
|
46
|
+
headers.forEach((value, key) => {
|
|
47
|
+
headerLines.push(`${key}: ${value}\r\n`);
|
|
48
|
+
});
|
|
49
|
+
headerLines.push('\r\n');
|
|
50
|
+
const textEncoder = new TextEncoder();
|
|
51
|
+
const headerChunk = headerLines.join('');
|
|
52
|
+
const bodyReader = body ? body.getReader() : undefined;
|
|
53
|
+
let headerEnqueued = false;
|
|
54
|
+
let eof = false;
|
|
55
|
+
const readableHeaderChunkedBody = new _es.ReadableStream({
|
|
56
|
+
async pull(controller) {
|
|
57
|
+
if (!headerEnqueued) {
|
|
58
|
+
controller.enqueue(headerChunk);
|
|
59
|
+
headerEnqueued = true;
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (eof) {
|
|
63
|
+
controller.close();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (!bodyReader) {
|
|
67
|
+
controller.close();
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const chunk = await bodyReader.read();
|
|
71
|
+
if (chunk.value) {
|
|
72
|
+
let outputChunk;
|
|
73
|
+
if (contentLength) {
|
|
74
|
+
outputChunk = chunk.value;
|
|
75
|
+
} else {
|
|
76
|
+
outputChunk = Buffer.concat([textEncoder.encode(`${chunk.value.length.toString(16)}\r\n`), chunk.value, textEncoder.encode(`\r\n`)]);
|
|
77
|
+
}
|
|
78
|
+
controller.enqueue(outputChunk);
|
|
79
|
+
} else if (chunk.done) {
|
|
80
|
+
if (!contentLength) {
|
|
81
|
+
controller.enqueue(Buffer.from(`0\r\n\r\n`, 'utf8'));
|
|
82
|
+
}
|
|
83
|
+
eof = true;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
const readableHeaderChunkedBodyReader = readableHeaderChunkedBody.getReader();
|
|
88
|
+
const pipeChunk = async () => {
|
|
89
|
+
while (true) {
|
|
90
|
+
try {
|
|
91
|
+
const chunk = await readableHeaderChunkedBodyReader.read();
|
|
92
|
+
if (chunk.value) {
|
|
93
|
+
if (!client.write(chunk.value)) {
|
|
94
|
+
// interrupt this loop and wait for "drain" event
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
} else if (chunk.done) {
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
} catch (e) {
|
|
101
|
+
logger.error(e);
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
client.on('drain', pipeChunk);
|
|
107
|
+
await pipeChunk();
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=rn_streaming_fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["require","_rn_http_response_parser","_es","reactNativeStreamingFetch","url","method","headers","body","contentLength","sockets","logger","isHttps","protocol","port","parseInt","Promise","resolve","reject","connectOptions","host","hostname","reuseAddress","clientSocket","Socket","client","TLSSocket","error","responseParser","ResponseParser","reason","destroy","on","data","processResponseReadBuffer","err","info","connect","headerLines","pathname","search","forEach","value","key","push","textEncoder","TextEncoder","headerChunk","join","bodyReader","getReader","undefined","headerEnqueued","eof","readableHeaderChunkedBody","ReadableStream","pull","controller","enqueue","close","chunk","read","outputChunk","Buffer","concat","encode","length","toString","done","from","readableHeaderChunkedBodyReader","pipeChunk","write","e"],"sourceRoot":"../../src","sources":["rn_streaming_fetch.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import 'react-native-polyfill-globals/auto';
|
|
4
|
+
globalThis.Buffer = require('buffer').Buffer;
|
|
5
|
+
import '@azure/core-asynciterator-polyfill';
|
|
6
|
+
import { RTCPeerConnection, RTCSessionDescription } from 'react-native-webrtc';
|
|
7
|
+
// @ts-ignore
|
|
8
|
+
globalThis.RTCPeerConnection = RTCPeerConnection;
|
|
9
|
+
// @ts-ignore
|
|
10
|
+
globalThis.RTCSessionDescription = RTCSessionDescription;
|
|
11
|
+
import { pino } from 'pino';
|
|
12
|
+
import { EyePop as _EyePop } from '@eyepop.ai/eyepop';
|
|
13
|
+
import { resolvePathRN } from "./rn_local_file.js";
|
|
14
|
+
import { createHttpClientRN } from "./rn_http_client.js";
|
|
15
|
+
export let EyePop;
|
|
16
|
+
(function (_EyePop2) {
|
|
17
|
+
function workerEndpoint(opts) {
|
|
18
|
+
opts = opts || {};
|
|
19
|
+
if (opts.logger === undefined) {
|
|
20
|
+
opts.logger = pino({
|
|
21
|
+
level: 'debug',
|
|
22
|
+
name: 'eyepop'
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
opts.platformSupport = {
|
|
26
|
+
resolvePath: resolvePathRN,
|
|
27
|
+
createHttpClient: createHttpClientRN
|
|
28
|
+
};
|
|
29
|
+
return _EyePop.workerEndpoint(opts);
|
|
30
|
+
}
|
|
31
|
+
_EyePop2.workerEndpoint = workerEndpoint;
|
|
32
|
+
function dataEndpoint(opts) {
|
|
33
|
+
opts = opts || {};
|
|
34
|
+
if (opts.logger === undefined) {
|
|
35
|
+
opts.logger = pino({
|
|
36
|
+
level: 'debug',
|
|
37
|
+
name: 'eyepop'
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
opts.platformSupport = {
|
|
41
|
+
resolvePath: resolvePathRN,
|
|
42
|
+
createHttpClient: createHttpClientRN
|
|
43
|
+
};
|
|
44
|
+
return _EyePop.dataEndpoint(opts);
|
|
45
|
+
}
|
|
46
|
+
_EyePop2.dataEndpoint = dataEndpoint;
|
|
47
|
+
})(EyePop || (EyePop = {}));
|
|
48
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["globalThis","Buffer","require","RTCPeerConnection","RTCSessionDescription","pino","EyePop","_EyePop","resolvePathRN","createHttpClientRN","_EyePop2","workerEndpoint","opts","logger","undefined","level","name","platformSupport","resolvePath","createHttpClient","dataEndpoint"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,OAAO,oCAAoC;AAC3CA,UAAU,CAACC,MAAM,GAAGC,OAAO,CAAC,QAAQ,CAAC,CAACD,MAAM;AAE5C,OAAO,oCAAoC;AAE3C,SAASE,iBAAiB,EAAEC,qBAAqB,QAAQ,qBAAqB;AAC9E;AACAJ,UAAU,CAACG,iBAAiB,GAAGA,iBAAiB;AAChD;AACAH,UAAU,CAACI,qBAAqB,GAAGA,qBAAqB;AAExD,SAASC,IAAI,QAAQ,MAAM;AAE3B,SAGEC,MAAM,IAAIC,OAAO,QAGZ,mBAAmB;AAC1B,SAASC,aAAa,QAAQ,oBAAiB;AAC/C,SAASC,kBAAkB,QAAQ,qBAAkB;AAAA,WAEpCH,MAAM;AAAA,WAAAI,QAAA;EACd,SAASC,cAAcA,CAACC,IAAoB,EAAkB;IACnEA,IAAI,GAAGA,IAAI,IAAI,CAAC,CAAC;IACjB,IAAIA,IAAI,CAACC,MAAM,KAAKC,SAAS,EAAE;MAC7BF,IAAI,CAACC,MAAM,GAAGR,IAAI,CAAC;QAAEU,KAAK,EAAE,OAAO;QAAEC,IAAI,EAAE;MAAS,CAAC,CAAC;IACxD;IACAJ,IAAI,CAACK,eAAe,GAAG;MACrBC,WAAW,EAAEV,aAAa;MAC1BW,gBAAgB,EAAEV;IACpB,CAAC;IACD,OAAOF,OAAO,CAACI,cAAc,CAACC,IAAI,CAAC;EACrC;EAACF,QAAA,CAAAC,cAAA,GAAAA,cAAA;EAEM,SAASS,YAAYA,CAACR,IAAkB,EAAgB;IAC7DA,IAAI,GAAGA,IAAI,IAAI,CAAC,CAAC;IACjB,IAAIA,IAAI,CAACC,MAAM,KAAKC,SAAS,EAAE;MAC7BF,IAAI,CAACC,MAAM,GAAGR,IAAI,CAAC;QAAEU,KAAK,EAAE,OAAO;QAAEC,IAAI,EAAE;MAAS,CAAC,CAAC;IACxD;IACAJ,IAAI,CAACK,eAAe,GAAG;MACrBC,WAAW,EAAEV,aAAa;MAC1BW,gBAAgB,EAAEV;IACpB,CAAC;IACD,OAAOF,OAAO,CAACa,YAAY,CAACR,IAAI,CAAC;EACnC;EAACF,QAAA,CAAAU,YAAA,GAAAA,YAAA;AAAA,GAvBcd,MAAM,KAANA,MAAM","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import 'react-native-polyfill-globals/auto';
|
|
4
|
+
import { reactNativeStreamingFetch } from "./rn_streaming_fetch.js";
|
|
5
|
+
import TcpSockets from 'react-native-tcp-socket';
|
|
6
|
+
import { ReadableStream } from 'web-streams-polyfill/ponyfill/es6';
|
|
7
|
+
|
|
8
|
+
/** HTTP client that will work around the RN fetch implementation and truly stream request and response bodies.
|
|
9
|
+
*
|
|
10
|
+
* While '{ textStreaming: true }' helps somewhat for the response body, it does not truly stream the response
|
|
11
|
+
* body, instead it keeps a large buffer and does not stream bytes to the consumer as they come in.
|
|
12
|
+
* Additionally, it does not support streaming request bodies which forces the consumer to load large files
|
|
13
|
+
* into memory w/o any possibility to avoid OOMs.
|
|
14
|
+
*
|
|
15
|
+
* This implementation implements selected HTTP interactions by using TCP sockets directly. The implementation
|
|
16
|
+
* is minimal and far from complete, e.g. no redirect support. For that reason, EyePop wil prefer to use the
|
|
17
|
+
* built-in fetch() except for cases when (a) the request requires a ReadableStream request body, or
|
|
18
|
+
* (b) the response is supposed to truly stream as indicated by the proprietary init parameter
|
|
19
|
+
* '{ eyepop: { responseStreaming: true} }'.
|
|
20
|
+
*
|
|
21
|
+
* */
|
|
22
|
+
export async function createHttpClientRN(logger) {
|
|
23
|
+
class ReactNativeHttpClient {
|
|
24
|
+
constructor(logger_) {
|
|
25
|
+
this.logger = logger_;
|
|
26
|
+
}
|
|
27
|
+
async fetch(input, init) {
|
|
28
|
+
init ||= {};
|
|
29
|
+
let streamBody;
|
|
30
|
+
if (input instanceof Request && input.body instanceof ReadableStream) {
|
|
31
|
+
// Request body streaming not supported by RN fetch
|
|
32
|
+
streamBody = input.body;
|
|
33
|
+
} else if (init?.body instanceof ReadableStream) {
|
|
34
|
+
streamBody = init.body;
|
|
35
|
+
// @ts-ignore
|
|
36
|
+
} else if (init?.eyepop?.responseStreaming) {
|
|
37
|
+
const requestBody = input instanceof Request ? input.body : init?.body;
|
|
38
|
+
if (requestBody !== undefined) {
|
|
39
|
+
// The limited HTTP post requires a ReadableStream request body
|
|
40
|
+
if (typeof requestBody === 'string') {
|
|
41
|
+
streamBody = new ReadableStream({
|
|
42
|
+
start: controller => {
|
|
43
|
+
controller.enqueue(Buffer.from(requestBody, 'utf8'));
|
|
44
|
+
controller.close();
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
} else if (requestBody instanceof Uint8Array) {
|
|
48
|
+
streamBody = new ReadableStream({
|
|
49
|
+
start: controller => {
|
|
50
|
+
controller.enqueue(requestBody);
|
|
51
|
+
controller.close();
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
} else {
|
|
55
|
+
this.logger.warn(`EyePop responseStreaming requires a request body of type ReadableStream | string | Uint8Array but is ${typeof requestBody}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (streamBody) {
|
|
60
|
+
let url;
|
|
61
|
+
let method;
|
|
62
|
+
let headers;
|
|
63
|
+
if (input instanceof Request) {
|
|
64
|
+
url = new URL(input.url);
|
|
65
|
+
method = input.method;
|
|
66
|
+
headers = input.headers;
|
|
67
|
+
} else {
|
|
68
|
+
if (input instanceof URL) {
|
|
69
|
+
url = input;
|
|
70
|
+
} else {
|
|
71
|
+
url = new URL(input);
|
|
72
|
+
}
|
|
73
|
+
method = init?.method || 'POST';
|
|
74
|
+
headers = new Headers(init?.headers);
|
|
75
|
+
}
|
|
76
|
+
let contentLength;
|
|
77
|
+
if (headers.has('content-length')) {
|
|
78
|
+
contentLength = parseInt(headers.get('content-length') || '', 10);
|
|
79
|
+
} else {
|
|
80
|
+
headers.append('Transfer-Encoding', 'chunked');
|
|
81
|
+
}
|
|
82
|
+
this.logger.debug(`reactNativeStreamingFetch() BEFORE ${method} ${url}`);
|
|
83
|
+
const response = await reactNativeStreamingFetch(url, method, headers, streamBody, contentLength, TcpSockets, this.logger);
|
|
84
|
+
this.logger.debug(`AFTER ${method} ${url} -> ${response.status}`);
|
|
85
|
+
return response;
|
|
86
|
+
}
|
|
87
|
+
// @ts-ignore
|
|
88
|
+
init.reactNative = {
|
|
89
|
+
textStreaming: true
|
|
90
|
+
};
|
|
91
|
+
const logLine = logLineFromRequest(input, init);
|
|
92
|
+
this.logger.debug(`ReactNative fetch() BEFORE ${logLine}`);
|
|
93
|
+
const response = await fetch(input, init);
|
|
94
|
+
this.logger.debug(`AFTER ${logLine} -> ${response.status}`);
|
|
95
|
+
return response;
|
|
96
|
+
}
|
|
97
|
+
async close() {}
|
|
98
|
+
isFullDuplex() {
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return new ReactNativeHttpClient(logger);
|
|
103
|
+
}
|
|
104
|
+
function logLineFromRequest(input, init) {
|
|
105
|
+
const url = input instanceof Request ? input.url : input;
|
|
106
|
+
const method = input instanceof Request ? input.method : init?.method || (init?.body !== undefined ? 'POST' : 'GET');
|
|
107
|
+
return `${method} ${url}`;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=rn_http_client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["reactNativeStreamingFetch","TcpSockets","ReadableStream","createHttpClientRN","logger","ReactNativeHttpClient","constructor","logger_","fetch","input","init","streamBody","Request","body","eyepop","responseStreaming","requestBody","undefined","start","controller","enqueue","Buffer","from","close","Uint8Array","warn","url","method","headers","URL","Headers","contentLength","has","parseInt","get","append","debug","response","status","reactNative","textStreaming","logLine","logLineFromRequest","isFullDuplex"],"sourceRoot":"../../src","sources":["rn_http_client.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// RFC-2068 Start-Line definitions:
|
|
4
|
+
// Request-Line: Method SP Request-URI SP HTTP-Version CRLF
|
|
5
|
+
// Status-Line: HTTP-Version SP Status-Code SP Reason-Phrase CRLF
|
|
6
|
+
var startLine = /^[A-Z_]+(\/\d\.\d)? /;
|
|
7
|
+
var requestLine = /^([A-Z_]+) (.+) [A-Z]+\/(\d)\.(\d)$/;
|
|
8
|
+
var statusLine = /^[A-Z]+\/(\d)\.(\d) (\d{3}) (.*)$/;
|
|
9
|
+
export function parseHttpHeader(lines, onlyHeaders) {
|
|
10
|
+
let line = lines[0] || '';
|
|
11
|
+
let match;
|
|
12
|
+
if (onlyHeaders && startLine.test(line)) {
|
|
13
|
+
return parseHeaders(lines);
|
|
14
|
+
} else if ((match = line.match(requestLine)) !== null) {
|
|
15
|
+
return {
|
|
16
|
+
method: match[1],
|
|
17
|
+
url: match[2],
|
|
18
|
+
version: {
|
|
19
|
+
major: parseInt(match[3] || '', 10),
|
|
20
|
+
minor: parseInt(match[4] || '', 10)
|
|
21
|
+
},
|
|
22
|
+
headers: parseHeaders(lines)
|
|
23
|
+
};
|
|
24
|
+
} else if ((match = line.match(statusLine)) !== null) {
|
|
25
|
+
return {
|
|
26
|
+
version: {
|
|
27
|
+
major: parseInt(match[1] || '', 10),
|
|
28
|
+
minor: parseInt(match[2] || '', 10)
|
|
29
|
+
},
|
|
30
|
+
statusCode: parseInt(match[3] || '', 10),
|
|
31
|
+
statusMessage: match[4],
|
|
32
|
+
headers: parseHeaders(lines)
|
|
33
|
+
};
|
|
34
|
+
} else {
|
|
35
|
+
return parseHeaders(lines);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function parseHeaders(lines) {
|
|
39
|
+
var headers = {};
|
|
40
|
+
var i = 0;
|
|
41
|
+
var line = lines[i] || '';
|
|
42
|
+
var index, name, value;
|
|
43
|
+
if (startLine.test(line)) {
|
|
44
|
+
line = line[++i] || '';
|
|
45
|
+
}
|
|
46
|
+
while (line) {
|
|
47
|
+
// subsequent lines in multi-line headers start with whitespace
|
|
48
|
+
if (line[0] === ' ' || line[0] === '\t') {
|
|
49
|
+
value += ' ' + line.trim();
|
|
50
|
+
i++;
|
|
51
|
+
if (i < lines.length) {
|
|
52
|
+
line = lines[i] || '';
|
|
53
|
+
} else {
|
|
54
|
+
line = '';
|
|
55
|
+
}
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (name && value) {
|
|
59
|
+
addHeaderLine(name, value, headers);
|
|
60
|
+
}
|
|
61
|
+
index = line.indexOf(':');
|
|
62
|
+
name = line.substr(0, index);
|
|
63
|
+
value = line.substr(index + 1).trim();
|
|
64
|
+
i++;
|
|
65
|
+
if (i < lines.length) {
|
|
66
|
+
line = lines[i] || '';
|
|
67
|
+
} else {
|
|
68
|
+
line = '';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (name && value) {
|
|
72
|
+
addHeaderLine(name, value, headers);
|
|
73
|
+
}
|
|
74
|
+
return headers;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The following function is lifted from:
|
|
78
|
+
// https://github.com/nodejs/node/blob/f1294f5bfd7f02bce8029818be9c92de59749137/lib/_http_incoming.js#L116-L170
|
|
79
|
+
//
|
|
80
|
+
// Add the given (field, value) pair to the message
|
|
81
|
+
//
|
|
82
|
+
// Per RFC2616, section 4.2 it is acceptable to join multiple instances of the
|
|
83
|
+
// same header with a ', ' if the header in question supports specification of
|
|
84
|
+
// multiple values this way. If not, we declare the first instance the winner
|
|
85
|
+
// and drop the second. Extended header fields (those beginning with 'x-') are
|
|
86
|
+
// always joined.
|
|
87
|
+
function addHeaderLine(field, value, dest) {
|
|
88
|
+
field = field.toLowerCase();
|
|
89
|
+
switch (field) {
|
|
90
|
+
// Array headers:
|
|
91
|
+
case 'set-cookie':
|
|
92
|
+
if (dest[field] !== undefined) {
|
|
93
|
+
dest[field].push(value);
|
|
94
|
+
} else {
|
|
95
|
+
dest[field] = [value];
|
|
96
|
+
}
|
|
97
|
+
break;
|
|
98
|
+
|
|
99
|
+
// list is taken from:
|
|
100
|
+
// https://mxr.mozilla.org/mozilla/source/netwerk/protocol/http/src/nsHttpHeaderArray.cpp
|
|
101
|
+
case 'content-type':
|
|
102
|
+
case 'content-length':
|
|
103
|
+
case 'user-agent':
|
|
104
|
+
case 'referer':
|
|
105
|
+
case 'host':
|
|
106
|
+
case 'authorization':
|
|
107
|
+
case 'proxy-authorization':
|
|
108
|
+
case 'if-modified-since':
|
|
109
|
+
case 'if-unmodified-since':
|
|
110
|
+
case 'from':
|
|
111
|
+
case 'location':
|
|
112
|
+
case 'max-forwards':
|
|
113
|
+
case 'retry-after':
|
|
114
|
+
case 'etag':
|
|
115
|
+
case 'last-modified':
|
|
116
|
+
case 'server':
|
|
117
|
+
case 'age':
|
|
118
|
+
case 'expires':
|
|
119
|
+
// drop duplicates
|
|
120
|
+
if (dest[field] === undefined) dest[field] = value;
|
|
121
|
+
break;
|
|
122
|
+
default:
|
|
123
|
+
// make comma-separated list
|
|
124
|
+
if (typeof dest[field] === 'string') {
|
|
125
|
+
dest[field] += ', ' + value;
|
|
126
|
+
} else {
|
|
127
|
+
dest[field] = value;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=rn_http_header_parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["startLine","requestLine","statusLine","parseHttpHeader","lines","onlyHeaders","line","match","test","parseHeaders","method","url","version","major","parseInt","minor","headers","statusCode","statusMessage","i","index","name","value","trim","length","addHeaderLine","indexOf","substr","field","dest","toLowerCase","undefined","push"],"sourceRoot":"../../src","sources":["rn_http_header_parser.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import 'react-native-polyfill-globals/auto';
|
|
4
|
+
import { EyepopLineDecoder } from '@eyepop.ai/eyepop';
|
|
5
|
+
import { parseHttpHeader } from "./rn_http_header_parser.js";
|
|
6
|
+
import { ReadableStream } from 'web-streams-polyfill/ponyfill/es6';
|
|
7
|
+
var ResponseState = /*#__PURE__*/function (ResponseState) {
|
|
8
|
+
ResponseState[ResponseState["RECEIVING_HEADER"] = 0] = "RECEIVING_HEADER";
|
|
9
|
+
ResponseState[ResponseState["RECEIVING_BODY"] = 1] = "RECEIVING_BODY";
|
|
10
|
+
ResponseState[ResponseState["RECEIVING_BODY_CHUNKED"] = 2] = "RECEIVING_BODY_CHUNKED";
|
|
11
|
+
ResponseState[ResponseState["RECEIVING_COMPLETED"] = 3] = "RECEIVING_COMPLETED";
|
|
12
|
+
return ResponseState;
|
|
13
|
+
}(ResponseState || {});
|
|
14
|
+
export class ResponseParser {
|
|
15
|
+
responseChunkRemainder = 0;
|
|
16
|
+
constructor(logger, resolve, reject) {
|
|
17
|
+
this.logger = logger;
|
|
18
|
+
this.resolve = resolve;
|
|
19
|
+
this.reject = reject;
|
|
20
|
+
this.error = null;
|
|
21
|
+
this.responseReadBuffer = undefined;
|
|
22
|
+
this.responseState = ResponseState.RECEIVING_HEADER;
|
|
23
|
+
this.pullController = undefined;
|
|
24
|
+
this.pullResolve = undefined;
|
|
25
|
+
this.pullReject = undefined;
|
|
26
|
+
}
|
|
27
|
+
processResponseReadBuffer(data) {
|
|
28
|
+
if (this.error) {
|
|
29
|
+
this.logger.info(`RN http streamed response, received ${data.length} bytes in error mode`);
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
if (this.responseReadBuffer) {
|
|
33
|
+
this.responseReadBuffer = Buffer.concat([this.responseReadBuffer, data]);
|
|
34
|
+
} else {
|
|
35
|
+
this.responseReadBuffer = Buffer.from(data.subarray());
|
|
36
|
+
}
|
|
37
|
+
if (this.responseState === ResponseState.RECEIVING_COMPLETED) {
|
|
38
|
+
if (this.pullController) {
|
|
39
|
+
this.pullController.close();
|
|
40
|
+
if (this.pullResolve) {
|
|
41
|
+
this.pullResolve();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
} else if (this.responseState === ResponseState.RECEIVING_HEADER) {
|
|
46
|
+
const headerEnd = this.responseReadBuffer.indexOf('\r\n\r\n');
|
|
47
|
+
if (headerEnd >= 0) {
|
|
48
|
+
let headerChunk = this.responseReadBuffer.subarray(0, headerEnd + 4);
|
|
49
|
+
this.responseReadBuffer = Buffer.from(this.responseReadBuffer.subarray(headerEnd + 4));
|
|
50
|
+
const maxHeaderLines = 128;
|
|
51
|
+
let responseHeaderLines = [];
|
|
52
|
+
const lineDecoder = new EyepopLineDecoder();
|
|
53
|
+
for (const line of lineDecoder.decode(headerChunk)) {
|
|
54
|
+
if (line.length > 0) {
|
|
55
|
+
responseHeaderLines.push(line);
|
|
56
|
+
if (responseHeaderLines.length > maxHeaderLines) {
|
|
57
|
+
this.error = `Response header exceeds ${maxHeaderLines} lines`;
|
|
58
|
+
this.reject(this.error);
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
let responseHeader = parseHttpHeader(responseHeaderLines, false);
|
|
64
|
+
if (responseHeader.statusCode === undefined) {
|
|
65
|
+
this.logger.warn(`Could not find status header in HTTP response ${JSON.stringify(responseHeader)}`);
|
|
66
|
+
this.reject('missing status header in HTTP response');
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
const headers = new Headers(responseHeader.headers);
|
|
70
|
+
if (headers.has('transfer-encoding')) {
|
|
71
|
+
if (headers.get('transfer-encoding')?.toLowerCase() === 'chunked') {
|
|
72
|
+
this.responseState = ResponseState.RECEIVING_BODY_CHUNKED;
|
|
73
|
+
this.responseChunkRemainder = 0;
|
|
74
|
+
} else {
|
|
75
|
+
this.error = `Response with unsupported transfer-encoding '${headers.get('transfer-encoding')}'`;
|
|
76
|
+
this.reject(this.error);
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
} else if (headers.has('content-length')) {
|
|
80
|
+
this.responseState = ResponseState.RECEIVING_BODY;
|
|
81
|
+
this.responseChunkRemainder = parseInt(headers.get('content-length') || '-1', 10);
|
|
82
|
+
} else {
|
|
83
|
+
this.responseState = ResponseState.RECEIVING_BODY_CHUNKED;
|
|
84
|
+
this.responseChunkRemainder = 0;
|
|
85
|
+
}
|
|
86
|
+
const responseBody = new ReadableStream({
|
|
87
|
+
pull: controller => {
|
|
88
|
+
if (this.error || this.responseState === ResponseState.RECEIVING_COMPLETED) {
|
|
89
|
+
// done with the whole request
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (this.pull(controller)) {
|
|
93
|
+
// one chunk enqueued, fulfilled the pull() protocol
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// nothing to enqueue yet, need to defer top a promise
|
|
97
|
+
return new Promise((resolve, reject) => {
|
|
98
|
+
if (this.pullController) {
|
|
99
|
+
if (this.pullReject) {
|
|
100
|
+
this.pullReject('pull, we got a pending controller already');
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
this.pullController = controller;
|
|
104
|
+
this.pullResolve = resolve;
|
|
105
|
+
this.pullReject = reject;
|
|
106
|
+
});
|
|
107
|
+
},
|
|
108
|
+
cancel: reason => {
|
|
109
|
+
if (!this.error) {
|
|
110
|
+
this.error = `cancelled: ${reason}`;
|
|
111
|
+
this.reject(this.error);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
this.resolve(
|
|
116
|
+
// @ts-ignore
|
|
117
|
+
new Response(responseBody, {
|
|
118
|
+
status: responseHeader.statusCode,
|
|
119
|
+
statusText: responseHeader.statusText,
|
|
120
|
+
headers: headers
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
} else if (this.pullController) {
|
|
124
|
+
if (this.pull(this.pullController)) {
|
|
125
|
+
this.pullController = undefined;
|
|
126
|
+
if (this.pullResolve) {
|
|
127
|
+
this.pullResolve();
|
|
128
|
+
}
|
|
129
|
+
this.pullResolve = undefined;
|
|
130
|
+
this.pullReject = undefined;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
pull(controller) {
|
|
136
|
+
if (this.responseState === ResponseState.RECEIVING_COMPLETED) {
|
|
137
|
+
controller.close();
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
if (this.responseReadBuffer === undefined) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
if (this.responseState === ResponseState.RECEIVING_BODY) {
|
|
144
|
+
controller.enqueue(this.responseReadBuffer);
|
|
145
|
+
this.responseChunkRemainder -= this.responseReadBuffer.length;
|
|
146
|
+
this.responseReadBuffer = undefined;
|
|
147
|
+
if (this.responseChunkRemainder <= 0) {
|
|
148
|
+
this.responseState = ResponseState.RECEIVING_COMPLETED;
|
|
149
|
+
controller.close();
|
|
150
|
+
}
|
|
151
|
+
return true;
|
|
152
|
+
} else if (this.responseState === ResponseState.RECEIVING_BODY_CHUNKED) {
|
|
153
|
+
while (this.responseReadBuffer.length > 1) {
|
|
154
|
+
if (this.responseChunkRemainder === 0) {
|
|
155
|
+
// need to find the new chunk length
|
|
156
|
+
let chunkHeaderEnd = 0;
|
|
157
|
+
while (this.responseReadBuffer.length >= 2 && chunkHeaderEnd === 0) {
|
|
158
|
+
chunkHeaderEnd = this.responseReadBuffer.indexOf('\r\n');
|
|
159
|
+
if (chunkHeaderEnd === 0) {
|
|
160
|
+
// skip closing \r\n line of a previous chunk
|
|
161
|
+
this.responseReadBuffer = Buffer.from(this.responseReadBuffer.subarray(2));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (chunkHeaderEnd > 0) {
|
|
165
|
+
this.responseChunkRemainder = parseInt(Buffer.from(this.responseReadBuffer, 0, chunkHeaderEnd).toString('utf8'), 16);
|
|
166
|
+
this.responseReadBuffer = Buffer.from(this.responseReadBuffer.subarray(chunkHeaderEnd + 2));
|
|
167
|
+
if (this.responseChunkRemainder <= 0) {
|
|
168
|
+
this.responseState = ResponseState.RECEIVING_COMPLETED;
|
|
169
|
+
controller.close();
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
} else if (this.responseReadBuffer.length > 64) {
|
|
173
|
+
this.error = 'Cannot find chunked encoding header within 64 bytes, given up';
|
|
174
|
+
controller.error(this.error);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (this.responseChunkRemainder > 0 && this.responseReadBuffer.length > 0) {
|
|
178
|
+
const chunk = Buffer.from(this.responseReadBuffer.subarray(0, this.responseChunkRemainder));
|
|
179
|
+
this.responseReadBuffer = Buffer.from(this.responseReadBuffer.subarray(this.responseChunkRemainder));
|
|
180
|
+
controller.enqueue(chunk);
|
|
181
|
+
this.responseChunkRemainder -= chunk.length;
|
|
182
|
+
return true;
|
|
183
|
+
} else {
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
} else {
|
|
188
|
+
this.error = `Received more data in wrong state ${this.responseState}`;
|
|
189
|
+
controller.error(this.error);
|
|
190
|
+
}
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=rn_http_response_parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["EyepopLineDecoder","parseHttpHeader","ReadableStream","ResponseState","ResponseParser","responseChunkRemainder","constructor","logger","resolve","reject","error","responseReadBuffer","undefined","responseState","RECEIVING_HEADER","pullController","pullResolve","pullReject","processResponseReadBuffer","data","info","length","Buffer","concat","from","subarray","RECEIVING_COMPLETED","close","headerEnd","indexOf","headerChunk","maxHeaderLines","responseHeaderLines","lineDecoder","line","decode","push","responseHeader","statusCode","warn","JSON","stringify","headers","Headers","has","get","toLowerCase","RECEIVING_BODY_CHUNKED","RECEIVING_BODY","parseInt","responseBody","pull","controller","Promise","cancel","reason","Response","status","statusText","enqueue","chunkHeaderEnd","toString","chunk"],"sourceRoot":"../../src","sources":["rn_http_response_parser.ts"],"mappings":"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","ignoreList":[]}
|