ropegeo-common 1.18.0 → 1.18.2
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/README.md +1 -1
- package/dist/download/helpers/downloadHttpRequest.d.ts +10 -0
- package/dist/download/helpers/downloadHttpRequest.d.ts.map +1 -0
- package/dist/download/helpers/downloadHttpRequest.js +78 -0
- package/dist/download/tasks/fetchPageJsonTask.d.ts.map +1 -1
- package/dist/download/tasks/fetchPageJsonTask.js +5 -2
- package/dist/download/tasks/fetchRegionRouteListTask.d.ts.map +1 -1
- package/dist/download/tasks/fetchRegionRouteListTask.js +5 -2
- package/dist/download/tasks/fetchRopeGeoTileListTask.d.ts.map +1 -1
- package/dist/download/tasks/fetchRopeGeoTileListTask.js +5 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -273,7 +273,7 @@ Abstract classes live under `minimap/abstract/`, concrete under `minimap/concret
|
|
|
273
273
|
|
|
274
274
|
### Download orchestration (`src/download/`)
|
|
275
275
|
|
|
276
|
-
Import from **`ropegeo-common/download`**. Platform I/O (Expo FileSystem, Mapbox, AsyncStorage) is implemented by Mobile via `DownloadPlatformHarness`; Common owns job planning and task logic only.
|
|
276
|
+
Import from **`ropegeo-common/download`**. Platform I/O (Expo FileSystem, Mapbox, AsyncStorage) is implemented by Mobile via `DownloadPlatformHarness`; Common owns job planning and task logic only. List/page JSON fetches inside download tasks use `downloadHttpRequest` (global `fetch` only), not `httpRequest` (Lambda proxy / undici).
|
|
277
277
|
|
|
278
278
|
| Name | Description | Import |
|
|
279
279
|
| --- | --- | --- |
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for download tasks. Uses global `fetch` only (no undici / Lambda proxy)
|
|
3
|
+
* so the download module graph is safe for React Native Metro bundling.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Send a single HTTP request for download list/page JSON fetches.
|
|
7
|
+
* Aborts when `abortSignal` fires or after 30 seconds. Throws on non-OK responses.
|
|
8
|
+
*/
|
|
9
|
+
export declare function downloadHttpRequest(url: string | URL, abortSignal?: AbortSignal, init?: RequestInit): Promise<Response>;
|
|
10
|
+
//# sourceMappingURL=downloadHttpRequest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"downloadHttpRequest.d.ts","sourceRoot":"","sources":["../../../src/download/helpers/downloadHttpRequest.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA8CH;;;GAGG;AACH,wBAAsB,mBAAmB,CACrC,GAAG,EAAE,MAAM,GAAG,GAAG,EACjB,WAAW,CAAC,EAAE,WAAW,EACzB,IAAI,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,QAAQ,CAAC,CAwCnB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HTTP client for download tasks. Uses global `fetch` only (no undici / Lambda proxy)
|
|
4
|
+
* so the download module graph is safe for React Native Metro bundling.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.downloadHttpRequest = downloadHttpRequest;
|
|
8
|
+
const networkRequestPolicy_1 = require("../../helpers/network/networkRequestPolicy");
|
|
9
|
+
const DEFAULT_HEADERS = {
|
|
10
|
+
Accept: 'application/json, text/html, application/xml, */*',
|
|
11
|
+
'Accept-Language': 'en-US,en;q=0.9',
|
|
12
|
+
};
|
|
13
|
+
const DOWNLOAD_HTTP_REQUEST_TIMEOUT_MS = 30000;
|
|
14
|
+
const buildNonOkMessage = async (response, requestUrl) => {
|
|
15
|
+
const finalUrl = response.url;
|
|
16
|
+
const server = response.headers.get('server') ?? response.headers.get('x-powered-by') ?? '(none)';
|
|
17
|
+
let bodyText = '';
|
|
18
|
+
try {
|
|
19
|
+
bodyText = await response.clone().text();
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
bodyText = '(failed to read body)';
|
|
23
|
+
}
|
|
24
|
+
const bodyPreview = bodyText.length > 2000 ? `${bodyText.slice(0, 2000)}...` : bodyText;
|
|
25
|
+
return (`downloadHttpRequest non-OK: status=${response.status} statusText=${response.statusText} ` +
|
|
26
|
+
`requestUrl=${requestUrl} finalUrl=${finalUrl} server=${server} responseBody=${bodyPreview}`);
|
|
27
|
+
};
|
|
28
|
+
function abortSignalAfterMs(ms) {
|
|
29
|
+
const controller = new AbortController();
|
|
30
|
+
const timeoutId = setTimeout(() => {
|
|
31
|
+
if (!controller.signal.aborted) {
|
|
32
|
+
controller.abort();
|
|
33
|
+
}
|
|
34
|
+
}, ms);
|
|
35
|
+
return {
|
|
36
|
+
signal: controller.signal,
|
|
37
|
+
dispose: () => {
|
|
38
|
+
clearTimeout(timeoutId);
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Send a single HTTP request for download list/page JSON fetches.
|
|
44
|
+
* Aborts when `abortSignal` fires or after 30 seconds. Throws on non-OK responses.
|
|
45
|
+
*/
|
|
46
|
+
async function downloadHttpRequest(url, abortSignal, init) {
|
|
47
|
+
const requestUrl = typeof url === 'string' ? url : url.toString();
|
|
48
|
+
if (abortSignal?.aborted) {
|
|
49
|
+
const err = abortSignal.reason instanceof Error
|
|
50
|
+
? abortSignal.reason
|
|
51
|
+
: new Error(String(abortSignal.reason));
|
|
52
|
+
throw new Error(`downloadHttpRequest aborted: requestUrl=${requestUrl} error=${err.message}`);
|
|
53
|
+
}
|
|
54
|
+
const deadline = abortSignal != null
|
|
55
|
+
? (0, networkRequestPolicy_1.mergeParentSignalWithDeadline)(abortSignal, DOWNLOAD_HTTP_REQUEST_TIMEOUT_MS)
|
|
56
|
+
: null;
|
|
57
|
+
const timeoutOnly = deadline == null ? abortSignalAfterMs(DOWNLOAD_HTTP_REQUEST_TIMEOUT_MS) : null;
|
|
58
|
+
const requestSignal = deadline?.signal ?? timeoutOnly.signal;
|
|
59
|
+
let response;
|
|
60
|
+
try {
|
|
61
|
+
response = await globalThis.fetch(requestUrl, {
|
|
62
|
+
headers: DEFAULT_HEADERS,
|
|
63
|
+
signal: requestSignal,
|
|
64
|
+
...init,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
throw new Error(`downloadHttpRequest failed: requestUrl=${requestUrl} error=${error}`);
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
deadline?.dispose();
|
|
72
|
+
timeoutOnly?.dispose();
|
|
73
|
+
}
|
|
74
|
+
if (!response.ok) {
|
|
75
|
+
throw new Error(await buildNonOkMessage(response, requestUrl));
|
|
76
|
+
}
|
|
77
|
+
return response;
|
|
78
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchPageJsonTask.d.ts","sourceRoot":"","sources":["../../../src/download/tasks/fetchPageJsonTask.ts"],"names":[],"mappings":"AACA,OAAO,mDAAmD,CAAC;AAK3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGrH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AActD,qBAAa,iBAAkB,SAAQ,YAAY;IAC/C,QAAQ,CAAC,QAAQ,mBAAmB;IACpC,QAAQ,CAAC,cAAc,6BAAmD;IAC1E,KAAK,EAAE,MAAM,CAAC;gBAEF,SAAS,SAAI,EAAE,KAAK,SAAI;IAK9B,OAAO,CACT,GAAG,EAAE,kBAAkB,EACvB,gBAAgB,EAAE,uBAAuB,EACzC,MAAM,EAAE,WAAW,GACpB,OAAO,CAAC,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"fetchPageJsonTask.d.ts","sourceRoot":"","sources":["../../../src/download/tasks/fetchPageJsonTask.ts"],"names":[],"mappings":"AACA,OAAO,mDAAmD,CAAC;AAK3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGrH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AActD,qBAAa,iBAAkB,SAAQ,YAAY;IAC/C,QAAQ,CAAC,QAAQ,mBAAmB;IACpC,QAAQ,CAAC,cAAc,6BAAmD;IAC1E,KAAK,EAAE,MAAM,CAAC;gBAEF,SAAS,SAAI,EAAE,KAAK,SAAI;IAK9B,OAAO,CACT,GAAG,EAAE,kBAAkB,EACvB,gBAAgB,EAAE,uBAAuB,EACzC,MAAM,EAAE,WAAW,GACpB,OAAO,CAAC,cAAc,CAAC;IA+B1B,aAAa,IAAI,uBAAuB;IAQxC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB;CAI1D"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.FetchPageJsonTask = void 0;
|
|
4
|
-
const
|
|
4
|
+
const downloadHttpRequest_1 = require("../helpers/downloadHttpRequest");
|
|
5
5
|
require("../../models/api/results/registerAllResultParsers");
|
|
6
6
|
const result_1 = require("../../models/api/results/result");
|
|
7
7
|
const downloadDependencyKeys_1 = require("../dependencies/downloadDependencyKeys");
|
|
@@ -30,7 +30,10 @@ class FetchPageJsonTask extends abstractDownloadTask_1.DownloadTask {
|
|
|
30
30
|
return { done: true };
|
|
31
31
|
}
|
|
32
32
|
const dep = this.requireDependency(ctx, downloadDependencyKeys_1.DownloadDependencyKeys.FetchPageJson);
|
|
33
|
-
const response = await (0,
|
|
33
|
+
const response = await (0, downloadHttpRequest_1.downloadHttpRequest)(dep.pageUrl, signal, {
|
|
34
|
+
method: 'GET',
|
|
35
|
+
headers: { Accept: 'application/json' },
|
|
36
|
+
});
|
|
34
37
|
const text = await response.text();
|
|
35
38
|
const parsedResponse = result_1.Result.fromResponseBody(unwrapData(JSON.parse(text)));
|
|
36
39
|
const view = parsedResponse.result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchRegionRouteListTask.d.ts","sourceRoot":"","sources":["../../../src/download/tasks/fetchRegionRouteListTask.ts"],"names":[],"mappings":"AACA,OAAO,mDAAmD,CAAC;AAU3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AActD,qBAAa,wBAAyB,SAAQ,YAAY;IACtD,QAAQ,CAAC,QAAQ,0BAA0B;IAC3C,QAAQ,CAAC,cAAc,oCAA0D;IACjF,KAAK,EAAE,MAAM,CAAC;gBAEF,KAAK,EAAE,MAAM,EAAE,SAAS,SAAI;IAKlC,OAAO,CACT,GAAG,EAAE,kBAAkB,EACvB,eAAe,EAAE,uBAAuB,EACxC,MAAM,EAAE,WAAW,GACpB,OAAO,CAAC,cAAc,CAAC;YA4CZ,cAAc;YAgCd,SAAS;
|
|
1
|
+
{"version":3,"file":"fetchRegionRouteListTask.d.ts","sourceRoot":"","sources":["../../../src/download/tasks/fetchRegionRouteListTask.ts"],"names":[],"mappings":"AACA,OAAO,mDAAmD,CAAC;AAU3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AActD,qBAAa,wBAAyB,SAAQ,YAAY;IACtD,QAAQ,CAAC,QAAQ,0BAA0B;IAC3C,QAAQ,CAAC,cAAc,oCAA0D;IACjF,KAAK,EAAE,MAAM,CAAC;gBAEF,KAAK,EAAE,MAAM,EAAE,SAAS,SAAI;IAKlC,OAAO,CACT,GAAG,EAAE,kBAAkB,EACvB,eAAe,EAAE,uBAAuB,EACxC,MAAM,EAAE,WAAW,GACpB,OAAO,CAAC,cAAc,CAAC;YA4CZ,cAAc;YAgCd,SAAS;IAmBvB,aAAa,IAAI,uBAAuB;IAQxC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,wBAAwB;CAIjE"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.FetchRegionRouteListTask = void 0;
|
|
4
|
-
const
|
|
4
|
+
const downloadHttpRequest_1 = require("../helpers/downloadHttpRequest");
|
|
5
5
|
require("../../models/api/results/registerAllResultParsers");
|
|
6
6
|
const paginationResults_1 = require("../../models/api/results/paginationResults");
|
|
7
7
|
const routeGeojson_1 = require("../../models/api/results/routeGeojson");
|
|
@@ -74,7 +74,10 @@ class FetchRegionRouteListTask extends abstractDownloadTask_1.DownloadTask {
|
|
|
74
74
|
const params = dep.routesParams.withPage(page);
|
|
75
75
|
const query = params.toQueryString();
|
|
76
76
|
const url = new URL(query.length > 0 ? `/routes?${query}` : '/routes', ctx.config.webScraperBaseUrl);
|
|
77
|
-
const response = await (0,
|
|
77
|
+
const response = await (0, downloadHttpRequest_1.downloadHttpRequest)(url.toString(), signal, {
|
|
78
|
+
method: 'GET',
|
|
79
|
+
headers: { Accept: 'application/json' },
|
|
80
|
+
});
|
|
78
81
|
const text = await response.text();
|
|
79
82
|
const parsed = paginationResults_1.PaginationResults.fromResponseBody(unwrapData(JSON.parse(text)));
|
|
80
83
|
const results = parsed.results.map((item) => routeGeoJsonFeature_1.RouteGeoJsonFeature.fromResult(item));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchRopeGeoTileListTask.d.ts","sourceRoot":"","sources":["../../../src/download/tasks/fetchRopeGeoTileListTask.ts"],"names":[],"mappings":"AACA,OAAO,mDAAmD,CAAC;AAM3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAoBtD,qBAAa,wBAAyB,SAAQ,YAAY;IACtD,QAAQ,CAAC,QAAQ,0BAA0B;IAC3C,QAAQ,CAAC,cAAc,oCAA0D;IACjF,KAAK,EAAE,MAAM,CAAC;gBAEF,KAAK,EAAE,MAAM,EAAE,SAAS,SAAI;IAKlC,OAAO,CACT,GAAG,EAAE,kBAAkB,EACvB,gBAAgB,EAAE,uBAAuB,EACzC,MAAM,EAAE,WAAW,GACpB,OAAO,CAAC,cAAc,CAAC;YA2DZ,SAAS;
|
|
1
|
+
{"version":3,"file":"fetchRopeGeoTileListTask.d.ts","sourceRoot":"","sources":["../../../src/download/tasks/fetchRopeGeoTileListTask.ts"],"names":[],"mappings":"AACA,OAAO,mDAAmD,CAAC;AAM3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACrH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAoBtD,qBAAa,wBAAyB,SAAQ,YAAY;IACtD,QAAQ,CAAC,QAAQ,0BAA0B;IAC3C,QAAQ,CAAC,cAAc,oCAA0D;IACjF,KAAK,EAAE,MAAM,CAAC;gBAEF,KAAK,EAAE,MAAM,EAAE,SAAS,SAAI;IAKlC,OAAO,CACT,GAAG,EAAE,kBAAkB,EACvB,gBAAgB,EAAE,uBAAuB,EACzC,MAAM,EAAE,WAAW,GACpB,OAAO,CAAC,cAAc,CAAC;YA2DZ,SAAS;IAgCvB,aAAa,IAAI,uBAAuB;IAQxC,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,wBAAwB;CAIjE"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.FetchRopeGeoTileListTask = void 0;
|
|
4
|
-
const
|
|
4
|
+
const downloadHttpRequest_1 = require("../helpers/downloadHttpRequest");
|
|
5
5
|
require("../../models/api/results/registerAllResultParsers");
|
|
6
6
|
const paginationResults_1 = require("../../models/api/results/paginationResults");
|
|
7
7
|
const downloadDependencyKeys_1 = require("../dependencies/downloadDependencyKeys");
|
|
@@ -66,7 +66,10 @@ class FetchRopeGeoTileListTask extends abstractDownloadTask_1.DownloadTask {
|
|
|
66
66
|
const url = new URL(`/mapdata/${encodeURIComponent(dep.mapDataId)}/tiles`, ctx.config.webScraperBaseUrl);
|
|
67
67
|
url.searchParams.set('page', String(page));
|
|
68
68
|
url.searchParams.set('limit', String(dep.listPageLimit));
|
|
69
|
-
const response = await (0,
|
|
69
|
+
const response = await (0, downloadHttpRequest_1.downloadHttpRequest)(url.toString(), signal, {
|
|
70
|
+
method: 'GET',
|
|
71
|
+
headers: { Accept: 'application/json' },
|
|
72
|
+
});
|
|
70
73
|
const text = await response.text();
|
|
71
74
|
const parsedBody = unwrapData(JSON.parse(text));
|
|
72
75
|
const pageResult = paginationResults_1.PaginationResults.fromResponseBody(parsedBody);
|