@axe-core/watcher 3.23.0-next.a719b6da → 3.23.0-next.b77a56b7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/sendResultsToServer.d.ts +3 -0
- package/dist/sendResultsToServer.js +17 -15
- package/dist/sendResultsToServer.js.map +1 -1
- package/dist/utils/initializeSession.js +7 -5
- package/dist/utils/initializeSession.js.map +1 -1
- package/dist/utils/sync-fetch-worker.mjs +77 -0
- package/dist/utils/sync-fetch.d.ts +11 -0
- package/dist/utils/sync-fetch.js +72 -0
- package/dist/utils/sync-fetch.js.map +1 -0
- package/extension/background.js +1 -1
- package/extension/content.js +1 -1
- package/package.json +3 -5
@@ -27,4 +27,7 @@ interface SendResultsToServerParams {
|
|
27
27
|
skipped_url?: string | null;
|
28
28
|
}
|
29
29
|
export declare const sendResultsToServer: ({ results, debugLogger }: SendResultsToServerParams) => Promise<void | SendResultsFailureStatus>;
|
30
|
+
export declare class MaximumRetriesReached extends Error {
|
31
|
+
constructor();
|
32
|
+
}
|
30
33
|
export default sendResultsToServer;
|
@@ -36,8 +36,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
37
37
|
};
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
39
|
-
exports.sendResultsToServer = exports.MAX_RETRIES = exports.MAX_PAGE_STATES_PER_REQUEST = void 0;
|
40
|
-
const
|
39
|
+
exports.MaximumRetriesReached = exports.sendResultsToServer = exports.MAX_RETRIES = exports.MAX_PAGE_STATES_PER_REQUEST = void 0;
|
40
|
+
const undici_1 = require("undici");
|
41
41
|
const uuid_1 = require("uuid");
|
42
42
|
const readVariables_1 = __importDefault(require("./utils/readVariables"));
|
43
43
|
const linearBackoff_1 = __importDefault(require("./utils/linearBackoff"));
|
@@ -45,7 +45,6 @@ const createAbortController_1 = __importStar(require("./utils/createAbortControl
|
|
45
45
|
const { version } = require('../package.json');
|
46
46
|
exports.MAX_PAGE_STATES_PER_REQUEST = 5;
|
47
47
|
exports.MAX_RETRIES = 3;
|
48
|
-
const MAX_RETRIES_ERROR_TYPE = 'maximum-retries';
|
49
48
|
const sendResultsToServer = async ({ results, debugLogger }) => {
|
50
49
|
const { server_url, api_key, session_id, git_data } = (0, readVariables_1.default)();
|
51
50
|
const resultsURL = new URL(`/api-pub/watcher/sessions/${session_id}`, server_url);
|
@@ -63,13 +62,14 @@ const sendResultsToServer = async ({ results, debugLogger }) => {
|
|
63
62
|
};
|
64
63
|
const { signal, cleanup } = (0, createAbortController_1.default)();
|
65
64
|
try {
|
66
|
-
const res = await (
|
65
|
+
const res = await fetch(resultsURL, {
|
67
66
|
method: 'PUT',
|
68
67
|
redirect: 'follow',
|
69
68
|
headers: {
|
70
69
|
'Content-Type': 'application/json',
|
71
70
|
'X-API-Key': api_key
|
72
71
|
},
|
72
|
+
dispatcher: new undici_1.EnvHttpProxyAgent(),
|
73
73
|
body: JSON.stringify(body),
|
74
74
|
signal
|
75
75
|
});
|
@@ -111,7 +111,7 @@ const sendResultsToServer = async ({ results, debugLogger }) => {
|
|
111
111
|
resStatus: res.status
|
112
112
|
});
|
113
113
|
console.warn('@axe-core/watcher: Unable to send results to server, max retries reached');
|
114
|
-
return Promise.reject(new
|
114
|
+
return Promise.reject(new MaximumRetriesReached());
|
115
115
|
}
|
116
116
|
}
|
117
117
|
catch (error) {
|
@@ -138,7 +138,7 @@ const sendResultsToServer = async ({ results, debugLogger }) => {
|
|
138
138
|
retryAttempt
|
139
139
|
});
|
140
140
|
console.warn('@axe-core/watcher: Request timed out, max retries reached');
|
141
|
-
return Promise.reject(new
|
141
|
+
return Promise.reject(new MaximumRetriesReached());
|
142
142
|
}
|
143
143
|
}
|
144
144
|
throw error;
|
@@ -153,16 +153,10 @@ const sendResultsToServer = async ({ results, debugLogger }) => {
|
|
153
153
|
}
|
154
154
|
});
|
155
155
|
const requestErrorHandler = (error) => {
|
156
|
-
if (error
|
156
|
+
if (error instanceof MaximumRetriesReached) {
|
157
157
|
return { failureStatus: error.message };
|
158
158
|
}
|
159
|
-
debugLogger('SendResultsToServer: Fetch error',
|
160
|
-
message: error.message,
|
161
|
-
type: error.type || 'NA',
|
162
|
-
code: error.code || 'NA',
|
163
|
-
stack: error.stack || 'NA',
|
164
|
-
errno: error.errno || 'NA'
|
165
|
-
});
|
159
|
+
debugLogger('SendResultsToServer: Fetch error', error);
|
166
160
|
};
|
167
161
|
let catchResult;
|
168
162
|
for (let i = 0; i < results.length; i += exports.MAX_PAGE_STATES_PER_REQUEST) {
|
@@ -183,9 +177,10 @@ const sendResultsToServer = async ({ results, debugLogger }) => {
|
|
183
177
|
}
|
184
178
|
const url = new URL(screenshotsURL.href);
|
185
179
|
url.searchParams.set('screenshot_id', screenshot_id);
|
186
|
-
const { ok } = await (
|
180
|
+
const { ok } = await fetch(url, {
|
187
181
|
method: 'POST',
|
188
182
|
redirect: 'follow',
|
183
|
+
dispatcher: new undici_1.EnvHttpProxyAgent(),
|
189
184
|
headers: {
|
190
185
|
'Content-Type': 'image/png',
|
191
186
|
'X-API-Key': api_key
|
@@ -198,5 +193,12 @@ const sendResultsToServer = async ({ results, debugLogger }) => {
|
|
198
193
|
})).catch(requestErrorHandler);
|
199
194
|
};
|
200
195
|
exports.sendResultsToServer = sendResultsToServer;
|
196
|
+
class MaximumRetriesReached extends Error {
|
197
|
+
constructor() {
|
198
|
+
super('Maximum retries reached');
|
199
|
+
this.name = 'MaximumRetriesReached';
|
200
|
+
}
|
201
|
+
}
|
202
|
+
exports.MaximumRetriesReached = MaximumRetriesReached;
|
201
203
|
exports.default = exports.sendResultsToServer;
|
202
204
|
//# sourceMappingURL=sendResultsToServer.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"sendResultsToServer.js","sourceRoot":"","sources":["../src/sendResultsToServer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
1
|
+
{"version":3,"file":"sendResultsToServer.js","sourceRoot":"","sources":["../src/sendResultsToServer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,mCAA0C;AAE1C,+BAAiC;AAEjC,0EAAiD;AACjD,0EAAiD;AAEjD,uFAEsC;AAItC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;AASjC,QAAA,2BAA2B,GAAG,CAAC,CAAA;AAM/B,QAAA,WAAW,GAAG,CAAC,CAAA;AAwBrB,MAAM,mBAAmB,GAAG,KAAK,EAAE,EACxC,OAAO,EACP,WAAW,EACe,EAA4C,EAAE;IACxE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAA,uBAAa,GAAE,CAAA;IAErE,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,6BAA6B,UAAU,EAAE,EACzC,UAAU,CACX,CAAA;IACD,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,6BAA6B,UAAU,cAAc,EACrD,UAAU,CACX,CAAA;IAED,WAAW,CAAC,uCAAuC,EAAE;QACnD,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;KACvD,CAAC,CAAA;IACF,WAAW,CAAC,iCAAiC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;IAE9D,MAAM,UAAU,GAAG,KAAK,EACtB,cAAwB,EAAE,EAC1B,YAAY,GAAG,CAAC,EACD,EAAE;QACjB,MAAM,IAAI,GAAS;YACjB,mBAAmB,EAAE,OAAO;YAC5B,OAAO,EAAE,WAAW;YACpB,GAAG,QAAQ;SACZ,CAAA;QAED,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,+BAAqB,GAAE,CAAA;QAEnD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE;gBAClC,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,WAAW,EAAE,OAAO;iBACrB;gBACD,UAAU,EAAE,IAAI,0BAAiB,EAAE;gBACnC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,MAAM;aAC4C,CAAC,CAAA;YAErD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,WAAW,CAAC,6CAA6C,EAAE;oBACzD,YAAY,EAAE,WAAW,CAAC,MAAM;oBAChC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBAChD,SAAS,EAAE,GAAG,CAAC,MAAM;oBACrB,aAAa,EAAE,GAAG,CAAC,UAAU;iBAC9B,CAAC,CAAA;gBAGF,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAA;YACrE,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,wCAAwC,EAAE;oBACpD,YAAY,EAAE,WAAW,CAAC,MAAM;oBAChC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBAChD,SAAS,EAAE,GAAG,CAAC,MAAM;oBACrB,aAAa,EAAE,GAAG,CAAC,UAAU;iBAC9B,CAAC,CAAA;YACJ,CAAC;YAED,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,KAAK,GAAG,CAAA;YAChC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,KAAK,GAAG,CAAA;YAChC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,KAAK,GAAG,CAAA;YAEhC,IAAI,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,YAAY,KAAK,mBAAW,EAAE,CAAC;gBAC9D,MAAM,cAAc,GAAG,YAAY,GAAG,CAAC,CAAA;gBAEvC,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;gBAC9C,WAAW,CAAC,kCAAkC,EAAE;oBAC9C,YAAY,EAAE,cAAc;oBAC5B,SAAS,EAAE,GAAG,CAAC,MAAM;oBACrB,YAAY,EAAE,WAAW,CAAC,MAAM;oBAChC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;iBACjD,CAAC,CAAA;gBAEF,MAAM,IAAA,uBAAa,EAAC,cAAc,CAAC,CAAA;gBACnC,MAAM,UAAU,CAAC,WAAW,EAAE,cAAc,CAAC,CAAA;YAC/C,CAAC;iBAAM,IAAI,YAAY,KAAK,mBAAW,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACnD,WAAW,CAAC,0CAA0C,EAAE;oBACtD,YAAY;oBACZ,SAAS,EAAE,GAAG,CAAC,MAAM;iBACtB,CAAC,CAAA;gBAEF,OAAO,CAAC,IAAI,CACV,0EAA0E,CAC3E,CAAA;gBACD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAA;YACpD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAAe,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC3C,WAAW,CAAC,qDAAqD,EAAE;oBACjE,YAAY,EAAE,gDAAwB;oBACtC,YAAY;oBACZ,YAAY,EAAE,WAAW,CAAC,MAAM;oBAChC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;iBACjD,CAAC,CAAA;gBAEF,IAAI,YAAY,KAAK,mBAAW,EAAE,CAAC;oBACjC,MAAM,cAAc,GAAG,YAAY,GAAG,CAAC,CAAA;oBAEvC,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAA;oBAC5D,WAAW,CAAC,gDAAgD,EAAE;wBAC5D,YAAY,EAAE,cAAc;wBAC5B,YAAY,EAAE,WAAW,CAAC,MAAM;wBAChC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;qBACjD,CAAC,CAAA;oBAEF,MAAM,IAAA,uBAAa,EAAC,cAAc,CAAC,CAAA;oBACnC,MAAM,UAAU,CAAC,WAAW,EAAE,cAAc,CAAC,CAAA;gBAC/C,CAAC;qBAAM,CAAC;oBACN,WAAW,CACT,wDAAwD,EACxD;wBACE,YAAY;qBACb,CACF,CAAA;oBAED,OAAO,CAAC,IAAI,CACV,2DAA2D,CAC5D,CAAA;oBACD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAA;gBACpD,CAAC;YACH,CAAC;YAGD,MAAM,KAAK,CAAA;QACb,CAAC;gBAAS,CAAC;YACT,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC,CAAA;IAGD,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACvB,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,MAAM,CAAC,aAAa,GAAG,IAAA,SAAI,GAAE,CAAA;QAC/B,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,mBAAmB,GAAG,CAC1B,KAAoC,EACH,EAAE;QAMnC,IAAI,KAAK,YAAY,qBAAqB,EAAE,CAAC;YAC3C,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,OAAO,EAAE,CAAA;QACzC,CAAC;QAED,WAAW,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAA;IACxD,CAAC,CAAA;IAED,IAAI,WAAW,CAAA;IAGf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,mCAA2B,EAAE,CAAC;QAErE,MAAM,KAAK,GAAG,OAAO;aAClB,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,mCAA2B,CAAC;aACzC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACzC,WAAW,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;QAChE,IAAI,WAAW,EAAE,CAAC;YAChB,MAAK;QACP,CAAC;IACH,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IACrC,CAAC;IAGD,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,EAAE;QAClD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAM;QACR,CAAC;QAGD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QACxC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,aAAuB,CAAC,CAAA;QAE9D,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC9B,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,IAAI,0BAAiB,EAAE;YACnC,OAAO,EAAE;gBACP,cAAc,EAAE,WAAW;gBAC3B,WAAW,EAAE,OAAO;aACrB;YACD,IAAI,EAAE,UAAU;SACkC,CAAC,CAAA;QAErD,IAAI,CAAC,EAAE,EAAE,CAAC;YAER,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAA;QACxE,CAAC;IACH,CAAC,CAAC,CACH,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;AAC9B,CAAC,CAAA;AA5MY,QAAA,mBAAmB,uBA4M/B;AAED,MAAa,qBAAsB,SAAQ,KAAK;IAC9C;QACE,KAAK,CAAC,yBAAyB,CAAC,CAAA;QAChC,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAA;IACrC,CAAC;CACF;AALD,sDAKC;AAED,kBAAe,2BAAmB,CAAA"}
|
@@ -3,10 +3,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
const sync_request_1 = __importDefault(require("sync-request"));
|
7
6
|
const assert_1 = __importDefault(require("assert"));
|
8
7
|
const uuid_1 = require("uuid");
|
9
8
|
const createDebugger_1 = __importDefault(require("../createDebugger"));
|
9
|
+
const sync_fetch_1 = require("./sync-fetch");
|
10
10
|
const debugLogger = (0, createDebugger_1.default)('config:initializeSession');
|
11
11
|
function initializeSession({ apiKey, projectId, serverURL, watcherVersion, sessionID, buildID, gitCommitSha, gitUrl, gitBranch, gitCommitAuthor, gitIsDirty, gitDefaultBranch, gitCommitMessage, gitTag, gitCommitEmail, configOverrides, runOptions }) {
|
12
12
|
(0, assert_1.default)(apiKey, 'API key is required');
|
@@ -54,13 +54,15 @@ function initializeSession({ apiKey, projectId, serverURL, watcherVersion, sessi
|
|
54
54
|
},
|
55
55
|
...(projectId && { project_id: projectId })
|
56
56
|
};
|
57
|
-
const res = (0,
|
57
|
+
const res = (0, sync_fetch_1.syncFetch)(url.toString(), {
|
58
58
|
headers: {
|
59
|
-
'X-API-Key': apiKey
|
59
|
+
'X-API-Key': apiKey,
|
60
|
+
'Content-Type': 'application/json'
|
60
61
|
},
|
61
|
-
|
62
|
+
method: 'POST',
|
63
|
+
body: JSON.stringify(payload)
|
62
64
|
});
|
63
|
-
const body = JSON.parse(res.
|
65
|
+
const body = JSON.parse(res.body);
|
64
66
|
const error = body.error || (body.errors?.length && body.errors[0]);
|
65
67
|
if (error) {
|
66
68
|
debugLogger('Error initializing session:', error);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"initializeSession.js","sourceRoot":"","sources":["../../src/utils/initializeSession.ts"],"names":[],"mappings":";;;;;AAAA,
|
1
|
+
{"version":3,"file":"initializeSession.js","sourceRoot":"","sources":["../../src/utils/initializeSession.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,77 @@
|
|
1
|
+
/**
|
2
|
+
* This is implemented as an mjs file explicitly since it
|
3
|
+
* needs to be loaded as a worker thread. It can't be
|
4
|
+
* TypeScript for unit testing reasons. It also can't be
|
5
|
+
* TS in production since Node 20 does not have type stripping.
|
6
|
+
*/
|
7
|
+
|
8
|
+
import { isMainThread, workerData } from 'node:worker_threads'
|
9
|
+
import { EnvHttpProxyAgent } from 'undici'
|
10
|
+
|
11
|
+
if (isMainThread) {
|
12
|
+
throw new Error('This script should only be run as a worker thread')
|
13
|
+
}
|
14
|
+
|
15
|
+
const { url, options, sharedBuffer, timeout, WORKER_STATUS, BUFFER_LAYOUT } =
|
16
|
+
workerData
|
17
|
+
|
18
|
+
const int32Array = new Int32Array(sharedBuffer)
|
19
|
+
const responseBuffer = new Uint8Array(
|
20
|
+
sharedBuffer,
|
21
|
+
BUFFER_LAYOUT.RESPONSE_OFFSET
|
22
|
+
)
|
23
|
+
|
24
|
+
try {
|
25
|
+
const response = await fetch(url, {
|
26
|
+
...options,
|
27
|
+
dispatcher: new EnvHttpProxyAgent(),
|
28
|
+
signal: AbortSignal.timeout(timeout)
|
29
|
+
})
|
30
|
+
|
31
|
+
const body = await response.text()
|
32
|
+
const responseData = JSON.stringify({
|
33
|
+
status: response.status,
|
34
|
+
statusText: response.statusText,
|
35
|
+
headers: Object.fromEntries(response.headers.entries()),
|
36
|
+
body,
|
37
|
+
ok: response.ok
|
38
|
+
})
|
39
|
+
|
40
|
+
const encoder = new TextEncoder()
|
41
|
+
const encoded = encoder.encode(responseData)
|
42
|
+
|
43
|
+
if (encoded.length > responseBuffer.length - 4) {
|
44
|
+
throw new Error('Response too large for shared buffer')
|
45
|
+
}
|
46
|
+
|
47
|
+
const lengthView = new Uint32Array(
|
48
|
+
sharedBuffer,
|
49
|
+
BUFFER_LAYOUT.LENGTH_OFFSET,
|
50
|
+
BUFFER_LAYOUT.LENGTH_VIEW_SIZE
|
51
|
+
)
|
52
|
+
lengthView[0] = encoded.length
|
53
|
+
responseBuffer.set(encoded)
|
54
|
+
|
55
|
+
Atomics.store(int32Array, BUFFER_LAYOUT.STATUS_INDEX, WORKER_STATUS.SUCCESS)
|
56
|
+
Atomics.notify(int32Array, BUFFER_LAYOUT.STATUS_INDEX)
|
57
|
+
} catch (error) {
|
58
|
+
let errorMessage = error.message || 'Unknown error'
|
59
|
+
if (error.name === 'TimeoutError') {
|
60
|
+
errorMessage = 'Fetch request timed out after ' + timeout + 'ms'
|
61
|
+
}
|
62
|
+
const encoder = new TextEncoder()
|
63
|
+
const encoded = encoder.encode(errorMessage)
|
64
|
+
|
65
|
+
if (encoded.length <= responseBuffer.length - 4) {
|
66
|
+
const lengthView = new Uint32Array(
|
67
|
+
sharedBuffer,
|
68
|
+
BUFFER_LAYOUT.LENGTH_OFFSET,
|
69
|
+
BUFFER_LAYOUT.LENGTH_VIEW_SIZE
|
70
|
+
)
|
71
|
+
lengthView[0] = encoded.length
|
72
|
+
responseBuffer.set(encoded)
|
73
|
+
}
|
74
|
+
|
75
|
+
Atomics.store(int32Array, BUFFER_LAYOUT.STATUS_INDEX, WORKER_STATUS.ERROR)
|
76
|
+
Atomics.notify(int32Array, BUFFER_LAYOUT.STATUS_INDEX)
|
77
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
export interface SyncFetchCustomOptions {
|
2
|
+
timeout?: number;
|
3
|
+
}
|
4
|
+
export interface SyncFetchResponse {
|
5
|
+
status: number;
|
6
|
+
statusText: string;
|
7
|
+
headers: Record<string, string>;
|
8
|
+
body: string;
|
9
|
+
ok: boolean;
|
10
|
+
}
|
11
|
+
export declare function syncFetch(url: string, options?: RequestInit, customOptions?: SyncFetchCustomOptions): SyncFetchResponse;
|
@@ -0,0 +1,72 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.syncFetch = syncFetch;
|
4
|
+
const node_worker_threads_1 = require("node:worker_threads");
|
5
|
+
const node_path_1 = require("node:path");
|
6
|
+
const WORKER_STATUS = {
|
7
|
+
PENDING: 0,
|
8
|
+
SUCCESS: 1,
|
9
|
+
ERROR: 2
|
10
|
+
};
|
11
|
+
const BUFFER_LAYOUT = {
|
12
|
+
STATUS_INDEX: 0,
|
13
|
+
LENGTH_OFFSET: 12,
|
14
|
+
RESPONSE_OFFSET: 16,
|
15
|
+
LENGTH_VIEW_SIZE: 1,
|
16
|
+
DEFAULT_BUFFER_SIZE: 1024 * 1024
|
17
|
+
};
|
18
|
+
function syncFetch(url, options = {}, customOptions = {
|
19
|
+
timeout: 30000
|
20
|
+
}) {
|
21
|
+
const timeout = customOptions.timeout || 30000;
|
22
|
+
const processingBuffer = 3000;
|
23
|
+
const mainThreadTimeout = timeout + processingBuffer;
|
24
|
+
const sharedBuffer = new SharedArrayBuffer(BUFFER_LAYOUT.RESPONSE_OFFSET + BUFFER_LAYOUT.DEFAULT_BUFFER_SIZE);
|
25
|
+
const int32Array = new Int32Array(sharedBuffer);
|
26
|
+
Atomics.store(int32Array, BUFFER_LAYOUT.STATUS_INDEX, WORKER_STATUS.PENDING);
|
27
|
+
const worker = new node_worker_threads_1.Worker((0, node_path_1.join)(__dirname, 'sync-fetch-worker.mjs'), {
|
28
|
+
name: 'sync-fetch',
|
29
|
+
eval: false,
|
30
|
+
workerData: {
|
31
|
+
url,
|
32
|
+
options,
|
33
|
+
sharedBuffer,
|
34
|
+
timeout,
|
35
|
+
WORKER_STATUS,
|
36
|
+
BUFFER_LAYOUT
|
37
|
+
}
|
38
|
+
});
|
39
|
+
try {
|
40
|
+
const result = Atomics.wait(int32Array, BUFFER_LAYOUT.STATUS_INDEX, WORKER_STATUS.PENDING, mainThreadTimeout);
|
41
|
+
if (result === 'timed-out') {
|
42
|
+
throw new Error(`Request timed out - worker thread did not respond within ${mainThreadTimeout}ms`);
|
43
|
+
}
|
44
|
+
const status = Atomics.load(int32Array, BUFFER_LAYOUT.STATUS_INDEX);
|
45
|
+
if (status === WORKER_STATUS.ERROR) {
|
46
|
+
const lengthView = new Uint32Array(sharedBuffer, BUFFER_LAYOUT.LENGTH_OFFSET, BUFFER_LAYOUT.LENGTH_VIEW_SIZE);
|
47
|
+
const responseLength = lengthView[0];
|
48
|
+
const responseBuffer = new Uint8Array(sharedBuffer, BUFFER_LAYOUT.RESPONSE_OFFSET, responseLength);
|
49
|
+
const decoder = new TextDecoder();
|
50
|
+
const errorMessage = decoder.decode(responseBuffer);
|
51
|
+
throw new Error(`Fetch failed: ${errorMessage}`);
|
52
|
+
}
|
53
|
+
if (status === WORKER_STATUS.SUCCESS) {
|
54
|
+
const lengthView = new Uint32Array(sharedBuffer, BUFFER_LAYOUT.LENGTH_OFFSET, BUFFER_LAYOUT.LENGTH_VIEW_SIZE);
|
55
|
+
const responseLength = lengthView[0];
|
56
|
+
const responseBuffer = new Uint8Array(sharedBuffer, BUFFER_LAYOUT.RESPONSE_OFFSET, responseLength);
|
57
|
+
const decoder = new TextDecoder();
|
58
|
+
const responseText = decoder.decode(responseBuffer);
|
59
|
+
try {
|
60
|
+
return JSON.parse(responseText);
|
61
|
+
}
|
62
|
+
catch {
|
63
|
+
throw new Error('Failed to parse response data');
|
64
|
+
}
|
65
|
+
}
|
66
|
+
throw new Error('Unknown response status');
|
67
|
+
}
|
68
|
+
finally {
|
69
|
+
worker.terminate();
|
70
|
+
}
|
71
|
+
}
|
72
|
+
//# sourceMappingURL=sync-fetch.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"sync-fetch.js","sourceRoot":"","sources":["../../src/utils/sync-fetch.ts"],"names":[],"mappings":"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"}
|