@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.
Files changed (61) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +33 -0
  3. package/lib/commonjs/index.js +52 -0
  4. package/lib/commonjs/index.js.map +1 -0
  5. package/lib/commonjs/package.json +1 -0
  6. package/lib/commonjs/rn_http_client.js +113 -0
  7. package/lib/commonjs/rn_http_client.js.map +1 -0
  8. package/lib/commonjs/rn_http_header_parser.js +135 -0
  9. package/lib/commonjs/rn_http_header_parser.js.map +1 -0
  10. package/lib/commonjs/rn_http_response_parser.js +199 -0
  11. package/lib/commonjs/rn_http_response_parser.js.map +1 -0
  12. package/lib/commonjs/rn_local_file.js +38 -0
  13. package/lib/commonjs/rn_local_file.js.map +1 -0
  14. package/lib/commonjs/rn_streaming_fetch.js +111 -0
  15. package/lib/commonjs/rn_streaming_fetch.js.map +1 -0
  16. package/lib/module/index.js +48 -0
  17. package/lib/module/index.js.map +1 -0
  18. package/lib/module/package.json +1 -0
  19. package/lib/module/rn_http_client.js +109 -0
  20. package/lib/module/rn_http_client.js.map +1 -0
  21. package/lib/module/rn_http_header_parser.js +131 -0
  22. package/lib/module/rn_http_header_parser.js.map +1 -0
  23. package/lib/module/rn_http_response_parser.js +194 -0
  24. package/lib/module/rn_http_response_parser.js.map +1 -0
  25. package/lib/module/rn_local_file.js +34 -0
  26. package/lib/module/rn_local_file.js.map +1 -0
  27. package/lib/module/rn_streaming_fetch.js +107 -0
  28. package/lib/module/rn_streaming_fetch.js.map +1 -0
  29. package/lib/typescript/commonjs/package.json +1 -0
  30. package/lib/typescript/commonjs/src/index.d.ts +8 -0
  31. package/lib/typescript/commonjs/src/index.d.ts.map +1 -0
  32. package/lib/typescript/commonjs/src/rn_http_client.d.ts +19 -0
  33. package/lib/typescript/commonjs/src/rn_http_client.d.ts.map +1 -0
  34. package/lib/typescript/commonjs/src/rn_http_header_parser.d.ts +2 -0
  35. package/lib/typescript/commonjs/src/rn_http_header_parser.d.ts.map +1 -0
  36. package/lib/typescript/commonjs/src/rn_http_response_parser.d.ts +21 -0
  37. package/lib/typescript/commonjs/src/rn_http_response_parser.d.ts.map +1 -0
  38. package/lib/typescript/commonjs/src/rn_local_file.d.ts +5 -0
  39. package/lib/typescript/commonjs/src/rn_local_file.d.ts.map +1 -0
  40. package/lib/typescript/commonjs/src/rn_streaming_fetch.d.ts +7 -0
  41. package/lib/typescript/commonjs/src/rn_streaming_fetch.d.ts.map +1 -0
  42. package/lib/typescript/module/package.json +1 -0
  43. package/lib/typescript/module/src/index.d.ts +8 -0
  44. package/lib/typescript/module/src/index.d.ts.map +1 -0
  45. package/lib/typescript/module/src/rn_http_client.d.ts +19 -0
  46. package/lib/typescript/module/src/rn_http_client.d.ts.map +1 -0
  47. package/lib/typescript/module/src/rn_http_header_parser.d.ts +2 -0
  48. package/lib/typescript/module/src/rn_http_header_parser.d.ts.map +1 -0
  49. package/lib/typescript/module/src/rn_http_response_parser.d.ts +21 -0
  50. package/lib/typescript/module/src/rn_http_response_parser.d.ts.map +1 -0
  51. package/lib/typescript/module/src/rn_local_file.d.ts +5 -0
  52. package/lib/typescript/module/src/rn_local_file.d.ts.map +1 -0
  53. package/lib/typescript/module/src/rn_streaming_fetch.d.ts +7 -0
  54. package/lib/typescript/module/src/rn_streaming_fetch.d.ts.map +1 -0
  55. package/package.json +202 -0
  56. package/src/index.ts +48 -0
  57. package/src/rn_http_client.ts +134 -0
  58. package/src/rn_http_header_parser.ts +138 -0
  59. package/src/rn_http_response_parser.ts +248 -0
  60. package/src/rn_local_file.ts +43 -0
  61. 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":";;AAAA,OAAO,oCAAoC;AAE3C,SAASA,yBAAyB,QAAQ,yBAAsB;AAEhE,OAAOC,UAAU,MAAM,yBAAyB;AAChD,SAASC,cAAc,QAAQ,mCAAmC;;AAElE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,kBAAkBA,CAACC,MAAc,EAAuB;EAC5E,MAAMC,qBAAqB,CAAC;IAG1BC,WAAWA,CAACC,OAAe,EAAE;MAC3B,IAAI,CAACH,MAAM,GAAGG,OAAO;IACvB;IAEA,MAAaC,KAAKA,CAChBC,KAAwB,EACxBC,IAAkB,EACC;MACnBA,IAAI,KAAK,CAAC,CAAC;MACX,IAAIC,UAAkD;MACtD,IAAIF,KAAK,YAAYG,OAAO,IAAIH,KAAK,CAACI,IAAI,YAAYX,cAAc,EAAE;QACpE;QACAS,UAAU,GAAGF,KAAK,CAACI,IAAI;MACzB,CAAC,MAAM,IAAIH,IAAI,EAAEG,IAAI,YAAYX,cAAc,EAAE;QAC/CS,UAAU,GAAGD,IAAI,CAACG,IAAI;QACtB;MACF,CAAC,MAAM,IAAIH,IAAI,EAAEI,MAAM,EAAEC,iBAAiB,EAAE;QAC1C,MAAMC,WAAW,GAAGP,KAAK,YAAYG,OAAO,GAAGH,KAAK,CAACI,IAAI,GAAGH,IAAI,EAAEG,IAAI;QACtE,IAAIG,WAAW,KAAKC,SAAS,EAAE;UAC7B;UACA,IAAI,OAAOD,WAAW,KAAK,QAAQ,EAAE;YACnCL,UAAU,GAAG,IAAIT,cAAc,CAAC;cAC9BgB,KAAK,EAAGC,UAAU,IAAK;gBACrBA,UAAU,CAACC,OAAO,CAACC,MAAM,CAACC,IAAI,CAACN,WAAW,EAAY,MAAM,CAAC,CAAC;gBAC9DG,UAAU,CAACI,KAAK,CAAC,CAAC;cACpB;YACF,CAAC,CAAC;UACJ,CAAC,MAAM,IAAIP,WAAW,YAAYQ,UAAU,EAAE;YAC5Cb,UAAU,GAAG,IAAIT,cAAc,CAAC;cAC9BgB,KAAK,EAAGC,UAAU,IAAK;gBACrBA,UAAU,CAACC,OAAO,CAACJ,WAAyB,CAAC;gBAC7CG,UAAU,CAACI,KAAK,CAAC,CAAC;cACpB;YACF,CAAC,CAAC;UACJ,CAAC,MAAM;YACL,IAAI,CAACnB,MAAM,CAACqB,IAAI,CACd,wGAAwG,OAAOT,WAAW,EAC5H,CAAC;UACH;QACF;MACF;MACA,IAAIL,UAAU,EAAE;QACd,IAAIe,GAAQ;QACZ,IAAIC,MAAc;QAClB,IAAIC,OAAgB;QACpB,IAAInB,KAAK,YAAYG,OAAO,EAAE;UAC5Bc,GAAG,GAAG,IAAIG,GAAG,CAACpB,KAAK,CAACiB,GAAG,CAAC;UACxBC,MAAM,GAAGlB,KAAK,CAACkB,MAAM;UACrBC,OAAO,GAAGnB,KAAK,CAACmB,OAAO;QACzB,CAAC,MAAM;UACL,IAAInB,KAAK,YAAYoB,GAAG,EAAE;YACxBH,GAAG,GAAGjB,KAAK;UACb,CAAC,MAAM;YACLiB,GAAG,GAAG,IAAIG,GAAG,CAACpB,KAAK,CAAC;UACtB;UACAkB,MAAM,GAAGjB,IAAI,EAAEiB,MAAM,IAAI,MAAM;UAC/BC,OAAO,GAAG,IAAIE,OAAO,CAACpB,IAAI,EAAEkB,OAAO,CAAC;QACtC;QACA,IAAIG,aAAa;QACjB,IAAIH,OAAO,CAACI,GAAG,CAAC,gBAAgB,CAAC,EAAE;UACjCD,aAAa,GAAGE,QAAQ,CAACL,OAAO,CAACM,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;QACnE,CAAC,MAAM;UACLN,OAAO,CAACO,MAAM,CAAC,mBAAmB,EAAE,SAAS,CAAC;QAChD;QACA,IAAI,CAAC/B,MAAM,CAACgC,KAAK,CACf,sCAAsCT,MAAM,IAAID,GAAG,EACrD,CAAC;QACD,MAAMW,QAAQ,GAAG,MAAMrC,yBAAyB,CAC9C0B,GAAG,EACHC,MAAM,EACNC,OAAO,EACPjB,UAAU,EACVoB,aAAa,EACb9B,UAAU,EACV,IAAI,CAACG,MACP,CAAC;QACD,IAAI,CAACA,MAAM,CAACgC,KAAK,CAAC,SAAST,MAAM,IAAID,GAAG,OAAOW,QAAQ,CAACC,MAAM,EAAE,CAAC;QACjE,OAAOD,QAAQ;MACjB;MACA;MACA3B,IAAI,CAAC6B,WAAW,GAAG;QAAEC,aAAa,EAAE;MAAK,CAAC;MAC1C,MAAMC,OAAO,GAAGC,kBAAkB,CAACjC,KAAK,EAAEC,IAAI,CAAC;MAC/C,IAAI,CAACN,MAAM,CAACgC,KAAK,CAAC,8BAA8BK,OAAO,EAAE,CAAC;MAC1D,MAAMJ,QAAQ,GAAG,MAAM7B,KAAK,CAACC,KAAK,EAAEC,IAAI,CAAC;MACzC,IAAI,CAACN,MAAM,CAACgC,KAAK,CAAC,SAASK,OAAO,OAAOJ,QAAQ,CAACC,MAAM,EAAE,CAAC;MAC3D,OAAOD,QAAQ;IACjB;IAEA,MAAad,KAAKA,CAAA,EAAkB,CAAC;IAE9BoB,YAAYA,CAAA,EAAG;MACpB,OAAO,IAAI;IACb;EACF;EAEA,OAAO,IAAItC,qBAAqB,CAACD,MAAM,CAAC;AAC1C;AAEA,SAASsC,kBAAkBA,CACzBjC,KAAwB,EACxBC,IAAkB,EACV;EACR,MAAMgB,GAAG,GAAGjB,KAAK,YAAYG,OAAO,GAAGH,KAAK,CAACiB,GAAG,GAAGjB,KAAK;EACxD,MAAMkB,MAAM,GACVlB,KAAK,YAAYG,OAAO,GACpBH,KAAK,CAACkB,MAAM,GACZjB,IAAI,EAAEiB,MAAM,KAAKjB,IAAI,EAAEG,IAAI,KAAKI,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;EACjE,OAAO,GAAGU,MAAM,IAAID,GAAG,EAAE;AAC3B","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":[]}