@uncefact/untp-utils 0.2.0 → 0.3.0
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 +40 -12
- package/artefacts/context/untp/0.6.0/dcc.json +1241 -0
- package/artefacts/context/untp/0.6.0/dfr.json +619 -0
- package/artefacts/context/untp/0.6.0/dia.json +162 -0
- package/artefacts/context/untp/0.6.0/dpp.json +1078 -0
- package/artefacts/context/untp/0.6.0/dte.json +1285 -0
- package/artefacts/context/untp/0.6.1/dcc.json +1388 -0
- package/artefacts/context/untp/0.6.1/dfr.json +690 -0
- package/artefacts/context/untp/0.6.1/dia.json +196 -0
- package/artefacts/context/untp/0.6.1/dpp.json +1164 -0
- package/artefacts/context/untp/0.6.1/dte.json +1340 -0
- package/artefacts/context/untp/0.7.0/untp.json +3493 -0
- package/artefacts/context/vcdm/2/credentials.json +301 -0
- package/artefacts/manifest.json +214 -0
- package/artefacts/schema/untp/0.6.0/dcc.json +1131 -0
- package/artefacts/schema/untp/0.6.0/dfr.json +1028 -0
- package/artefacts/schema/untp/0.6.0/dia.json +236 -0
- package/artefacts/schema/untp/0.6.0/dpp.json +1219 -0
- package/artefacts/schema/untp/0.6.0/dte.json +845 -0
- package/artefacts/schema/untp/0.6.1/dcc.json +1196 -0
- package/artefacts/schema/untp/0.6.1/dfr.json +1037 -0
- package/artefacts/schema/untp/0.6.1/dia.json +236 -0
- package/artefacts/schema/untp/0.6.1/dpp.json +1229 -0
- package/artefacts/schema/untp/0.6.1/dte.json +845 -0
- package/artefacts/schema/untp/0.7.0/cvc.json +701 -0
- package/artefacts/schema/untp/0.7.0/dcc.json +1133 -0
- package/artefacts/schema/untp/0.7.0/dfr.json +1245 -0
- package/artefacts/schema/untp/0.7.0/dia.json +443 -0
- package/artefacts/schema/untp/0.7.0/dpp.json +1300 -0
- package/artefacts/schema/untp/0.7.0/dte.json +1226 -0
- package/artefacts/schema/untp/0.7.0/linkset.json +119 -0
- package/artefacts/schema/vcdm/2/verifiable-credential.json +318 -0
- package/build/artefacts/urls.d.ts +6 -0
- package/build/artefacts/urls.js +8 -0
- package/build/artefacts/urls.js.map +1 -1
- package/build/artefacts/urls.test.js +9 -1
- package/build/artefacts/urls.test.js.map +1 -1
- package/build/bundle/artefacts/context/untp/0.6.0/dcc.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dcc.js +1244 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dcc.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dfr.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dfr.js +622 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dfr.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dia.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dia.js +165 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dia.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dpp.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dpp.js +1081 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dpp.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dte.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dte.js +1288 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dte.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dcc.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dcc.js +1391 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dcc.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dfr.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dfr.js +693 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dfr.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dia.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dia.js +199 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dia.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dpp.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dpp.js +1167 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dpp.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dte.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dte.js +1343 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dte.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.7.0/untp.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.7.0/untp.js +3496 -0
- package/build/bundle/artefacts/context/untp/0.7.0/untp.js.map +1 -0
- package/build/bundle/artefacts/context/vcdm/2/credentials.d.ts +2 -0
- package/build/bundle/artefacts/context/vcdm/2/credentials.js +304 -0
- package/build/bundle/artefacts/context/vcdm/2/credentials.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dcc.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dcc.js +1134 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dcc.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dfr.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dfr.js +1031 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dfr.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dia.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dia.js +239 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dia.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dpp.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dpp.js +1222 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dpp.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dte.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dte.js +848 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dte.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dcc.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dcc.js +1199 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dcc.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dfr.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dfr.js +1040 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dfr.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dia.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dia.js +239 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dia.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dpp.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dpp.js +1232 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dpp.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dte.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dte.js +848 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dte.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/cvc.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/cvc.js +704 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/cvc.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dcc.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dcc.js +1136 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dcc.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dfr.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dfr.js +1248 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dfr.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dia.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dia.js +446 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dia.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dpp.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dpp.js +1303 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dpp.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dte.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dte.js +1229 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dte.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/linkset.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/linkset.js +122 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/linkset.js.map +1 -0
- package/build/bundle/artefacts/schema/vcdm/2/verifiable-credential.d.ts +2 -0
- package/build/bundle/artefacts/schema/vcdm/2/verifiable-credential.js +321 -0
- package/build/bundle/artefacts/schema/vcdm/2/verifiable-credential.js.map +1 -0
- package/build/bundle/fallback.d.ts +41 -0
- package/build/bundle/fallback.js +62 -0
- package/build/bundle/fallback.js.map +1 -0
- package/build/bundle/fallback.test.d.ts +1 -0
- package/build/bundle/fallback.test.js +124 -0
- package/build/bundle/fallback.test.js.map +1 -0
- package/build/bundle/index.d.ts +4 -0
- package/build/bundle/index.js +77 -0
- package/build/bundle/index.js.map +1 -0
- package/build/bundle/lookup.d.ts +14 -0
- package/build/bundle/lookup.js +40 -0
- package/build/bundle/lookup.js.map +1 -0
- package/build/bundle/lookup.test.d.ts +1 -0
- package/build/bundle/lookup.test.js +70 -0
- package/build/bundle/lookup.test.js.map +1 -0
- package/build/bundle/public.d.ts +25 -0
- package/build/bundle/public.js +56 -0
- package/build/bundle/public.js.map +1 -0
- package/build/bundle/public.test.d.ts +1 -0
- package/build/bundle/public.test.js +35 -0
- package/build/bundle/public.test.js.map +1 -0
- package/build/bundle/refresh-classify.test.d.ts +1 -0
- package/build/bundle/refresh-classify.test.js +20 -0
- package/build/bundle/refresh-classify.test.js.map +1 -0
- package/build/bundle/refresh-main.test.d.ts +1 -0
- package/build/bundle/refresh-main.test.js +98 -0
- package/build/bundle/refresh-main.test.js.map +1 -0
- package/build/common/as-date-time.d.ts +13 -0
- package/build/common/as-date-time.js +44 -0
- package/build/common/as-date-time.js.map +1 -0
- package/build/common/as-date-time.test.d.ts +1 -0
- package/build/common/as-date-time.test.js +42 -0
- package/build/common/as-date-time.test.js.map +1 -0
- package/build/common/as-non-empty-string.d.ts +11 -4
- package/build/common/as-non-empty-string.js +15 -5
- package/build/common/as-non-empty-string.js.map +1 -1
- package/build/common/as-non-empty-string.test.js +7 -2
- package/build/common/as-non-empty-string.test.js.map +1 -1
- package/build/common/index.d.ts +4 -0
- package/build/common/index.js +5 -0
- package/build/common/index.js.map +1 -0
- package/build/common/validity-window.d.ts +45 -0
- package/build/common/validity-window.js +68 -0
- package/build/common/validity-window.js.map +1 -0
- package/build/common/validity-window.test.d.ts +1 -0
- package/build/common/validity-window.test.js +67 -0
- package/build/common/validity-window.test.js.map +1 -0
- package/build/loaders/index.d.ts +2 -0
- package/build/loaders/index.js +1 -0
- package/build/loaders/index.js.map +1 -1
- package/build/loaders/jsonld-document-loader.d.ts +7 -5
- package/build/loaders/jsonld-document-loader.js +11 -2
- package/build/loaders/jsonld-document-loader.js.map +1 -1
- package/build/loaders/jsonld-document-loader.test.js +41 -1
- package/build/loaders/jsonld-document-loader.test.js.map +1 -1
- package/build/loaders/schema-loader.d.ts +13 -3
- package/build/loaders/schema-loader.js +24 -8
- package/build/loaders/schema-loader.js.map +1 -1
- package/build/loaders/schema-loader.test.js +56 -1
- package/build/loaders/schema-loader.test.js.map +1 -1
- package/build/node/errors.d.ts +9 -3
- package/build/node/errors.js +9 -3
- package/build/node/errors.js.map +1 -1
- package/build/node/index.d.ts +1 -1
- package/build/node/index.js +1 -1
- package/build/node/index.js.map +1 -1
- package/build/node/is-private-ip.d.ts +8 -4
- package/build/node/is-private-ip.fail-closed.test.d.ts +1 -0
- package/build/node/is-private-ip.fail-closed.test.js +36 -0
- package/build/node/is-private-ip.fail-closed.test.js.map +1 -0
- package/build/node/is-private-ip.js +77 -12
- package/build/node/is-private-ip.js.map +1 -1
- package/build/node/is-private-ip.test.js +28 -0
- package/build/node/is-private-ip.test.js.map +1 -1
- package/build/node/validate-public-url.d.ts +43 -11
- package/build/node/validate-public-url.js +68 -34
- package/build/node/validate-public-url.js.map +1 -1
- package/build/node/validate-public-url.test.js +161 -14
- package/build/node/validate-public-url.test.js.map +1 -1
- package/build/resolvers/errors.d.ts +36 -6
- package/build/resolvers/errors.js +41 -7
- package/build/resolvers/errors.js.map +1 -1
- package/build/resolvers/resolve-document-if-changed.test.js +7 -0
- package/build/resolvers/resolve-document-if-changed.test.js.map +1 -1
- package/build/resolvers/resolve-document.d.ts +29 -9
- package/build/resolvers/resolve-document.integration.test.d.ts +1 -0
- package/build/resolvers/resolve-document.integration.test.js +108 -0
- package/build/resolvers/resolve-document.integration.test.js.map +1 -0
- package/build/resolvers/resolve-document.js +129 -49
- package/build/resolvers/resolve-document.js.map +1 -1
- package/build/resolvers/resolve-document.test.js +462 -12
- package/build/resolvers/resolve-document.test.js.map +1 -1
- package/build/resolvers/resolve-json-document.d.ts +11 -8
- package/build/resolvers/resolve-json-document.js +7 -6
- package/build/resolvers/resolve-json-document.js.map +1 -1
- package/build/resolvers/resolve-json-document.test.js +21 -4
- package/build/resolvers/resolve-json-document.test.js.map +1 -1
- package/build/validation/describe-jsonld-failure.d.ts +48 -8
- package/build/validation/describe-jsonld-failure.js +94 -27
- package/build/validation/describe-jsonld-failure.js.map +1 -1
- package/build/validation/describe-jsonld-failure.test.js +98 -13
- package/build/validation/describe-jsonld-failure.test.js.map +1 -1
- package/build/validation/index.d.ts +3 -2
- package/build/validation/index.js +2 -2
- package/build/validation/index.js.map +1 -1
- package/build/validation/validate-jsonld.d.ts +29 -3
- package/build/validation/validate-jsonld.js +49 -22
- package/build/validation/validate-jsonld.js.map +1 -1
- package/build/validation/validate-jsonld.test.js +62 -5
- package/build/validation/validate-jsonld.test.js.map +1 -1
- package/package.json +23 -3
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ResolverNetworkError } from '../resolvers/errors.js';
|
|
2
|
+
import { ResolutionFailedError } from '../node/errors.js';
|
|
2
3
|
import { createInMemoryTtlCache } from '../cache/in-memory-ttl-cache.js';
|
|
4
|
+
import { jest } from '@jest/globals';
|
|
3
5
|
const resolveJsonDocument = jest.fn();
|
|
4
6
|
jest.unstable_mockModule('../resolvers/index.js', () => ({
|
|
5
7
|
resolveJsonDocument,
|
|
@@ -68,4 +70,42 @@ describe('createJsonLdDocumentLoader', () => {
|
|
|
68
70
|
});
|
|
69
71
|
});
|
|
70
72
|
});
|
|
73
|
+
describe('createJsonLdDocumentLoader bundled fallback', () => {
|
|
74
|
+
const CONTEXT_URL = 'https://vocabulary.uncefact.org/untp/0.7.0/context/';
|
|
75
|
+
beforeEach(() => {
|
|
76
|
+
resolveJsonDocument.mockReset();
|
|
77
|
+
});
|
|
78
|
+
it('serves the bundled context under the requested URL when its fetch fails', async () => {
|
|
79
|
+
resolveJsonDocument.mockRejectedValue(new ResolverNetworkError(CONTEXT_URL, new Error('ENOTFOUND')));
|
|
80
|
+
const onBundledFallback = jest.fn();
|
|
81
|
+
const load = createJsonLdDocumentLoader({ onBundledFallback });
|
|
82
|
+
const result = await load(CONTEXT_URL);
|
|
83
|
+
expect(result.documentUrl).toBe(CONTEXT_URL);
|
|
84
|
+
expect(Object.keys(result.document)).toContain('@context');
|
|
85
|
+
expect(onBundledFallback).toHaveBeenCalledWith({ url: CONTEXT_URL, cause: expect.any(Error) });
|
|
86
|
+
});
|
|
87
|
+
it('rethrows for a context the bundle does not carry', async () => {
|
|
88
|
+
const cause = new ResolverNetworkError('https://example.com/context.jsonld', new Error('ENOTFOUND'));
|
|
89
|
+
resolveJsonDocument.mockRejectedValue(cause);
|
|
90
|
+
const load = createJsonLdDocumentLoader();
|
|
91
|
+
await expect(load('https://example.com/context.jsonld')).rejects.toBe(cause);
|
|
92
|
+
});
|
|
93
|
+
it('serves the copy when the context host name stops resolving', async () => {
|
|
94
|
+
resolveJsonDocument.mockRejectedValue(new ResolutionFailedError('vocabulary.uncefact.org', new Error('ENOTFOUND')));
|
|
95
|
+
const result = await createJsonLdDocumentLoader()(CONTEXT_URL);
|
|
96
|
+
expect(result.documentUrl).toBe(CONTEXT_URL);
|
|
97
|
+
});
|
|
98
|
+
it('rethrows when the fallback is switched off', async () => {
|
|
99
|
+
const cause = new ResolverNetworkError(CONTEXT_URL, new Error('ENOTFOUND'));
|
|
100
|
+
resolveJsonDocument.mockRejectedValue(cause);
|
|
101
|
+
await expect(createJsonLdDocumentLoader({ bundledFallback: false })(CONTEXT_URL)).rejects.toBe(cause);
|
|
102
|
+
});
|
|
103
|
+
it('caches a bundled context so the next load does not retry the network', async () => {
|
|
104
|
+
resolveJsonDocument.mockRejectedValue(new ResolverNetworkError(CONTEXT_URL, new Error('ENOTFOUND')));
|
|
105
|
+
const load = createJsonLdDocumentLoader({ cache: createInMemoryTtlCache({ ttlMs: 60_000 }) });
|
|
106
|
+
await load(CONTEXT_URL);
|
|
107
|
+
await load(CONTEXT_URL);
|
|
108
|
+
expect(resolveJsonDocument).toHaveBeenCalledTimes(1);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
71
111
|
//# sourceMappingURL=jsonld-document-loader.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonld-document-loader.test.js","sourceRoot":"","sources":["../../src/loaders/jsonld-document-loader.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"jsonld-document-loader.test.js","sourceRoot":"","sources":["../../src/loaders/jsonld-document-loader.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { BundledFallbackOptions } from '../bundle/fallback.js';
|
|
1
2
|
import type { TtlCache } from '../cache/ttl-cache.js';
|
|
2
3
|
/**
|
|
3
4
|
* Loads a JSON Schema document by URL. `T` declares the shape the caller
|
|
@@ -15,7 +16,16 @@ export interface SchemaLoader<T extends object = object> {
|
|
|
15
16
|
* are never cached; a successfully fetched and parsed document is cached
|
|
16
17
|
* even if it later fails Ajv compilation.
|
|
17
18
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
19
|
+
* When the host cannot deliver a bundled UNTP artefact (see
|
|
20
|
+
* `isHostDeliveryFailure`: unreachable, non-2xx, bad body, size, redirect or
|
|
21
|
+
* time bounds), the bundled copy is returned instead and
|
|
22
|
+
* `options.onBundledFallback` is told (see {@link BundledFallbackOptions}); a
|
|
23
|
+
* bundled copy served this way is cached like a fetched one. A URL the SSRF
|
|
24
|
+
* guard refused, an unexpected error, and any URL the bundle does not carry
|
|
25
|
+
* fail exactly as before.
|
|
26
|
+
*
|
|
27
|
+
* @throws {SchemaLoaderError} on `load(url)` if the underlying fetch fails
|
|
28
|
+
* and no bundled copy stands in. The concrete subclass identifies which
|
|
29
|
+
* step failed.
|
|
20
30
|
*/
|
|
21
|
-
export declare function createSchemaLoader<T extends object = object>(cache?: TtlCache<T
|
|
31
|
+
export declare function createSchemaLoader<T extends object = object>(cache?: TtlCache<T>, options?: BundledFallbackOptions): SchemaLoader<T>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { withBundledFallback } from '../bundle/fallback.js';
|
|
1
2
|
import { ResolverHttpError, ResolverInvalidJsonError, ResolverNetworkError } from '../resolvers/errors.js';
|
|
2
3
|
import { SchemaLoaderHttpError, SchemaLoaderInvalidJsonError, SchemaLoaderNetworkError } from './errors.js';
|
|
3
4
|
const FETCH_TIMEOUT_MS = 10_000;
|
|
@@ -35,14 +36,19 @@ function toSchemaLoaderError(url, cause) {
|
|
|
35
36
|
* @throws {SchemaLoaderHttpError} on a non-2xx HTTP status.
|
|
36
37
|
* @throws {SchemaLoaderInvalidJsonError} if the body is not parseable as JSON.
|
|
37
38
|
*/
|
|
38
|
-
async function fetchSchema(url) {
|
|
39
|
+
async function fetchSchema(url, options) {
|
|
39
40
|
// Lazy import: the resolver stack pulls in undici, which jsdom test
|
|
40
41
|
// environments cannot evaluate, so it loads at fetch time to keep this
|
|
41
42
|
// module importable there.
|
|
42
43
|
const { resolveJsonDocument } = await import('../resolvers/index.js');
|
|
43
44
|
try {
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
// The fallback classifies the resolver's own error, before it is mapped
|
|
46
|
+
// to this package's public error classes, so an untyped failure inside
|
|
47
|
+
// the fetch never reads as a host outage.
|
|
48
|
+
return await withBundledFallback(url, options, async () => {
|
|
49
|
+
const { json } = await resolveJsonDocument(url, { accept: SCHEMA_ACCEPT, totalTimeoutMs: FETCH_TIMEOUT_MS });
|
|
50
|
+
return json;
|
|
51
|
+
});
|
|
46
52
|
}
|
|
47
53
|
catch (cause) {
|
|
48
54
|
throw toSchemaLoaderError(url, cause);
|
|
@@ -55,13 +61,23 @@ async function fetchSchema(url) {
|
|
|
55
61
|
* are never cached; a successfully fetched and parsed document is cached
|
|
56
62
|
* even if it later fails Ajv compilation.
|
|
57
63
|
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
64
|
+
* When the host cannot deliver a bundled UNTP artefact (see
|
|
65
|
+
* `isHostDeliveryFailure`: unreachable, non-2xx, bad body, size, redirect or
|
|
66
|
+
* time bounds), the bundled copy is returned instead and
|
|
67
|
+
* `options.onBundledFallback` is told (see {@link BundledFallbackOptions}); a
|
|
68
|
+
* bundled copy served this way is cached like a fetched one. A URL the SSRF
|
|
69
|
+
* guard refused, an unexpected error, and any URL the bundle does not carry
|
|
70
|
+
* fail exactly as before.
|
|
71
|
+
*
|
|
72
|
+
* @throws {SchemaLoaderError} on `load(url)` if the underlying fetch fails
|
|
73
|
+
* and no bundled copy stands in. The concrete subclass identifies which
|
|
74
|
+
* step failed.
|
|
60
75
|
*/
|
|
61
|
-
export function createSchemaLoader(cache) {
|
|
76
|
+
export function createSchemaLoader(cache, options) {
|
|
77
|
+
const load = (url) => fetchSchema(url, options);
|
|
62
78
|
if (!cache) {
|
|
63
|
-
return { load
|
|
79
|
+
return { load };
|
|
64
80
|
}
|
|
65
|
-
return { load: (url) => cache.get(url, () =>
|
|
81
|
+
return { load: (url) => cache.get(url, () => load(url)) };
|
|
66
82
|
}
|
|
67
83
|
//# sourceMappingURL=schema-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-loader.js","sourceRoot":"","sources":["../../src/loaders/schema-loader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC3G,OAAO,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAY5G,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,MAAM,aAAa,GAAG,iDAAiD,CAAC;AAExE;;;;;;;;;;GAUG;AACH,SAAS,mBAAmB,CAAC,GAAW,EAAE,KAAc;IACtD,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;QACvC,OAAO,IAAI,qBAAqB,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,KAAK,YAAY,wBAAwB,EAAE,CAAC;QAC9C,OAAO,IAAI,4BAA4B,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;QAC1C,OAAO,IAAI,wBAAwB,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,IAAI,wBAAwB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,WAAW,CAAmB,GAAW;
|
|
1
|
+
{"version":3,"file":"schema-loader.js","sourceRoot":"","sources":["../../src/loaders/schema-loader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC3G,OAAO,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAY5G,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,MAAM,aAAa,GAAG,iDAAiD,CAAC;AAExE;;;;;;;;;;GAUG;AACH,SAAS,mBAAmB,CAAC,GAAW,EAAE,KAAc;IACtD,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;QACvC,OAAO,IAAI,qBAAqB,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,KAAK,YAAY,wBAAwB,EAAE,CAAC;QAC9C,OAAO,IAAI,4BAA4B,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;QAC1C,OAAO,IAAI,wBAAwB,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,IAAI,wBAAwB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,WAAW,CAAmB,GAAW,EAAE,OAA2C;IACnG,oEAAoE;IACpE,uEAAuE;IACvE,2BAA2B;IAC3B,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;IACtE,IAAI,CAAC;QACH,wEAAwE;QACxE,uEAAuE;QACvE,0CAA0C;QAC1C,OAAO,MAAM,mBAAmB,CAAI,GAAG,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE;YAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAC7G,OAAO,IAAS,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAmB,EACnB,OAAgC;IAEhC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,WAAW,CAAI,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;AAC5D,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jest } from '@jest/globals';
|
|
2
2
|
import { createInMemoryTtlCache } from '../cache/in-memory-ttl-cache.js';
|
|
3
3
|
import { ResolverHttpError, ResolverInvalidJsonError, ResolverNetworkError, ResolverTimedOutError, } from '../resolvers/errors.js';
|
|
4
|
-
import { PrivateHostnameError } from '../node/errors.js';
|
|
4
|
+
import { PrivateHostnameError, ResolutionFailedError } from '../node/errors.js';
|
|
5
5
|
import { SchemaLoaderError, SchemaLoaderHttpError, SchemaLoaderInvalidJsonError, SchemaLoaderNetworkError, } from './errors.js';
|
|
6
6
|
const resolveJsonDocument = jest.fn();
|
|
7
7
|
// Mock the resolver entry point but keep the real error classes so the
|
|
@@ -159,4 +159,59 @@ describe('createSchemaLoader', () => {
|
|
|
159
159
|
});
|
|
160
160
|
});
|
|
161
161
|
});
|
|
162
|
+
describe('createSchemaLoader bundled fallback', () => {
|
|
163
|
+
const BUNDLED_URL = 'https://untp.unece.org/artefacts/schema/v0.7.0/dpp/DigitalProductPassport.json';
|
|
164
|
+
beforeEach(() => {
|
|
165
|
+
resolveJsonDocument.mockReset();
|
|
166
|
+
});
|
|
167
|
+
it('serves the bundled schema when the fetch of a bundled URL fails, and reports it', async () => {
|
|
168
|
+
resolveJsonDocument.mockRejectedValue(new ResolverNetworkError(BUNDLED_URL, new Error('ENOTFOUND')));
|
|
169
|
+
const onBundledFallback = jest.fn();
|
|
170
|
+
const loader = createSchemaLoader(undefined, { onBundledFallback });
|
|
171
|
+
const schema = await loader.load(BUNDLED_URL);
|
|
172
|
+
expect(JSON.stringify(schema)).toContain('DigitalProductPassport');
|
|
173
|
+
expect(onBundledFallback).toHaveBeenCalledTimes(1);
|
|
174
|
+
expect(onBundledFallback.mock.calls[0][0]).toMatchObject({
|
|
175
|
+
url: BUNDLED_URL,
|
|
176
|
+
cause: expect.any(ResolverNetworkError),
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
it('falls back on an upstream HTTP failure too, since the artefact is immutable once published', async () => {
|
|
180
|
+
resolveJsonDocument.mockRejectedValue(new ResolverHttpError(BUNDLED_URL, 403));
|
|
181
|
+
const loader = createSchemaLoader();
|
|
182
|
+
await expect(loader.load(BUNDLED_URL)).resolves.toBeDefined();
|
|
183
|
+
});
|
|
184
|
+
it('caches a bundled copy so the next load does not retry the network', async () => {
|
|
185
|
+
resolveJsonDocument.mockRejectedValue(new ResolverNetworkError(BUNDLED_URL, new Error('ENOTFOUND')));
|
|
186
|
+
const loader = createSchemaLoader(createInMemoryTtlCache({ ttlMs: 60_000 }));
|
|
187
|
+
await loader.load(BUNDLED_URL);
|
|
188
|
+
await loader.load(BUNDLED_URL);
|
|
189
|
+
expect(resolveJsonDocument).toHaveBeenCalledTimes(1);
|
|
190
|
+
});
|
|
191
|
+
it('still fails exactly as before for a URL the bundle does not carry', async () => {
|
|
192
|
+
resolveJsonDocument.mockRejectedValue(new ResolverNetworkError(SCHEMA_URL, new Error('ENOTFOUND')));
|
|
193
|
+
const onBundledFallback = jest.fn();
|
|
194
|
+
const loader = createSchemaLoader(undefined, { onBundledFallback });
|
|
195
|
+
await expect(loader.load(SCHEMA_URL)).rejects.toBeInstanceOf(SchemaLoaderNetworkError);
|
|
196
|
+
expect(onBundledFallback).not.toHaveBeenCalled();
|
|
197
|
+
});
|
|
198
|
+
it('serves the copy when DNS resolution fails, the outage behind uncefact/tests-untp#1006', async () => {
|
|
199
|
+
resolveJsonDocument.mockRejectedValue(new ResolutionFailedError('untp.unece.org', new Error('ENOTFOUND')));
|
|
200
|
+
const loader = createSchemaLoader();
|
|
201
|
+
await expect(loader.load(BUNDLED_URL)).resolves.toBeDefined();
|
|
202
|
+
});
|
|
203
|
+
it('rethrows an untyped failure inside the fetch as a loader error instead of serving the copy', async () => {
|
|
204
|
+
const bug = new TypeError('resolver programming error');
|
|
205
|
+
resolveJsonDocument.mockRejectedValue(bug);
|
|
206
|
+
const onBundledFallback = jest.fn();
|
|
207
|
+
const loader = createSchemaLoader(undefined, { onBundledFallback });
|
|
208
|
+
await expect(loader.load(BUNDLED_URL)).rejects.toBeInstanceOf(SchemaLoaderNetworkError);
|
|
209
|
+
expect(onBundledFallback).not.toHaveBeenCalled();
|
|
210
|
+
});
|
|
211
|
+
it('can be switched off', async () => {
|
|
212
|
+
resolveJsonDocument.mockRejectedValue(new ResolverNetworkError(BUNDLED_URL, new Error('ENOTFOUND')));
|
|
213
|
+
const loader = createSchemaLoader(undefined, { bundledFallback: false });
|
|
214
|
+
await expect(loader.load(BUNDLED_URL)).rejects.toBeInstanceOf(SchemaLoaderNetworkError);
|
|
215
|
+
});
|
|
216
|
+
});
|
|
162
217
|
//# sourceMappingURL=schema-loader.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-loader.test.js","sourceRoot":"","sources":["../../src/loaders/schema-loader.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema-loader.test.js","sourceRoot":"","sources":["../../src/loaders/schema-loader.test.ts"],"names":[],"mappings":"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"}
|
package/build/node/errors.d.ts
CHANGED
|
@@ -16,13 +16,19 @@ export declare class UnsupportedSchemeError extends UrlValidationError {
|
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
18
18
|
* The hostname is a known private/local name (`localhost`, `*.localhost`,
|
|
19
|
-
* `*.local`, `*.internal`, etc.)
|
|
20
|
-
* empty
|
|
19
|
+
* `*.local`, `*.internal`, etc.) or an IP literal in a non-public range. An
|
|
20
|
+
* empty hostname is refused as malformed input (`InvalidUrlError`) before
|
|
21
|
+
* this check runs.
|
|
21
22
|
*/
|
|
22
23
|
export declare class PrivateHostnameError extends UrlValidationError {
|
|
23
24
|
constructor(hostname: string);
|
|
24
25
|
}
|
|
25
|
-
/**
|
|
26
|
+
/**
|
|
27
|
+
* DNS resolution rejected (`ENOTFOUND`, `EAI_AGAIN`, etc.), or the resolver
|
|
28
|
+
* returned a record whose address is unparseable or contradicts its claimed
|
|
29
|
+
* family; contradictory resolver metadata is treated as a failed resolution
|
|
30
|
+
* rather than silently reconciled.
|
|
31
|
+
*/
|
|
26
32
|
export declare class ResolutionFailedError extends UrlValidationError {
|
|
27
33
|
constructor(hostname: string, cause: unknown);
|
|
28
34
|
}
|
package/build/node/errors.js
CHANGED
|
@@ -26,8 +26,9 @@ export class UnsupportedSchemeError extends UrlValidationError {
|
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
28
|
* The hostname is a known private/local name (`localhost`, `*.localhost`,
|
|
29
|
-
* `*.local`, `*.internal`, etc.)
|
|
30
|
-
* empty
|
|
29
|
+
* `*.local`, `*.internal`, etc.) or an IP literal in a non-public range. An
|
|
30
|
+
* empty hostname is refused as malformed input (`InvalidUrlError`) before
|
|
31
|
+
* this check runs.
|
|
31
32
|
*/
|
|
32
33
|
export class PrivateHostnameError extends UrlValidationError {
|
|
33
34
|
constructor(hostname) {
|
|
@@ -39,7 +40,12 @@ export class PrivateHostnameError extends UrlValidationError {
|
|
|
39
40
|
});
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
|
-
/**
|
|
43
|
+
/**
|
|
44
|
+
* DNS resolution rejected (`ENOTFOUND`, `EAI_AGAIN`, etc.), or the resolver
|
|
45
|
+
* returned a record whose address is unparseable or contradicts its claimed
|
|
46
|
+
* family; contradictory resolver metadata is treated as a failed resolution
|
|
47
|
+
* rather than silently reconciled.
|
|
48
|
+
*/
|
|
43
49
|
export class ResolutionFailedError extends UrlValidationError {
|
|
44
50
|
constructor(hostname, cause) {
|
|
45
51
|
super({
|
package/build/node/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/node/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;;;GAIG;AACH,MAAM,OAAO,kBAAmB,SAAQ,eAAe;CAAG;AAE1D,wEAAwE;AACxE,MAAM,OAAO,eAAgB,SAAQ,kBAAkB;IACrD,YAAY,QAAgB,EAAE,KAAc;QAC1C,KAAK,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,0BAA0B,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IACvF,CAAC;CACF;AAED,6EAA6E;AAC7E,MAAM,OAAO,sBAAuB,SAAQ,kBAAkB;IAC5D,YAAY,MAAc,EAAE,cAAiC;QAC3D,KAAK,CAAC;YACJ,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,cAAc,MAAM,8BAA8B;YAC3D,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,CAAC,GAAG,cAAc,CAAC;YAC7B,WAAW,EAAE,eAAe,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;SACzD,CAAC,CAAC;IACL,CAAC;CACF;AAED
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/node/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;;;GAIG;AACH,MAAM,OAAO,kBAAmB,SAAQ,eAAe;CAAG;AAE1D,wEAAwE;AACxE,MAAM,OAAO,eAAgB,SAAQ,kBAAkB;IACrD,YAAY,QAAgB,EAAE,KAAc;QAC1C,KAAK,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,0BAA0B,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IACvF,CAAC;CACF;AAED,6EAA6E;AAC7E,MAAM,OAAO,sBAAuB,SAAQ,kBAAkB;IAC5D,YAAY,MAAc,EAAE,cAAiC;QAC3D,KAAK,CAAC;YACJ,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EAAE,cAAc,MAAM,8BAA8B;YAC3D,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,CAAC,GAAG,cAAc,CAAC;YAC7B,WAAW,EAAE,eAAe,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;SACzD,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,oBAAqB,SAAQ,kBAAkB;IAC1D,YAAY,QAAgB;QAC1B,KAAK,CAAC;YACJ,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,YAAY,QAAQ,IAAI,SAAS,qCAAqC;YAC/E,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,mCAAmC;SACjD,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,qBAAsB,SAAQ,kBAAkB;IAC3D,YAAY,QAAgB,EAAE,KAAc;QAC1C,KAAK,CAAC;YACJ,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,6BAA6B,QAAQ,GAAG;YACjD,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAChE,KAAK;SACN,CAAC,CAAC;IACL,CAAC;CACF;AAED,0DAA0D;AAC1D,MAAM,OAAO,oBAAqB,SAAQ,kBAAkB;IAC1D,YAAY,QAAgB;QAC1B,KAAK,CAAC;YACJ,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,0CAA0C,QAAQ,GAAG;YAC9D,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,mBAAoB,SAAQ,kBAAkB;IAChD,iBAAiB,CAAoB;IAC9C,YAAY,QAAgB,EAAE,iBAAoC;QAChE,KAAK,CAAC;YACJ,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,YAAY,QAAQ,iCAAiC;YAC9D,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EAAE,4EAA4E;SAC1F,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC7C,CAAC;CACF"}
|
package/build/node/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { UrlValidationError, InvalidUrlError, UnsupportedSchemeError, PrivateHostnameError, ResolutionFailedError, ResolutionEmptyError, PrivateAddressError, } from './errors.js';
|
|
2
2
|
export { isPrivateHostname, isPrivateIpv4, isPrivateIpv6 } from './is-private-ip.js';
|
|
3
|
-
export { validatePublicUrl, type ValidatePublicUrlOptions, type ResolvedAddress } from './validate-public-url.js';
|
|
3
|
+
export { validatePublicUrl, type PublicUrlLookup, type ValidatePublicUrlOptions, type ResolvedAddress, type ValidatedAddresses, } from './validate-public-url.js';
|
package/build/node/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { UrlValidationError, InvalidUrlError, UnsupportedSchemeError, PrivateHostnameError, ResolutionFailedError, ResolutionEmptyError, PrivateAddressError, } from './errors.js';
|
|
2
2
|
export { isPrivateHostname, isPrivateIpv4, isPrivateIpv6 } from './is-private-ip.js';
|
|
3
|
-
export { validatePublicUrl } from './validate-public-url.js';
|
|
3
|
+
export { validatePublicUrl, } from './validate-public-url.js';
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/build/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EACL,iBAAiB,GAKlB,MAAM,0BAA0B,CAAC"}
|
|
@@ -17,10 +17,14 @@
|
|
|
17
17
|
*/
|
|
18
18
|
export declare function isPrivateIpv4(address: string): boolean;
|
|
19
19
|
/**
|
|
20
|
-
* Returns `true` if `address` is an IPv6 address string that
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
20
|
+
* Returns `true` if `address` is an IPv6 address string that is not a
|
|
21
|
+
* genuine public Global Unicast address. This is a default-deny predicate:
|
|
22
|
+
* an address is treated as public only when it is both inside the allocated
|
|
23
|
+
* `2000::/3` Global Unicast block and not one of the named special-purpose
|
|
24
|
+
* ranges within it; every other address, including reserved or unallocated
|
|
25
|
+
* space `ipaddr.js` has no name for, is denied. IPv4-mapped addresses
|
|
26
|
+
* (`::ffff:a.b.c.d`) are re-checked against {@link isPrivateIpv4}, and the
|
|
27
|
+
* deprecated IPv4-compatible form (`::a.b.c.d`) is rejected outright.
|
|
24
28
|
*
|
|
25
29
|
* Fails closed on parser drift, mirroring {@link isPrivateIpv4}.
|
|
26
30
|
*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jest } from '@jest/globals';
|
|
2
|
+
// These cases pin the fail-closed branches of the IP predicates: when
|
|
3
|
+
// `ipaddr.js` cannot parse a value that `node:net` accepted, or reports an
|
|
4
|
+
// unexpected kind, the predicates must classify the address as private
|
|
5
|
+
// rather than let it through. Only a mocked parser can reach those
|
|
6
|
+
// branches, so this file (unlike is-private-ip.test.ts) replaces
|
|
7
|
+
// `ipaddr.js` per test.
|
|
8
|
+
const parse = jest.fn();
|
|
9
|
+
jest.unstable_mockModule('ipaddr.js', () => ({
|
|
10
|
+
default: { parse },
|
|
11
|
+
}));
|
|
12
|
+
const { isPrivateIpv4, isPrivateIpv6 } = await import('./is-private-ip.js');
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
parse.mockReset();
|
|
15
|
+
});
|
|
16
|
+
describe('isPrivateIpv4 fail-closed', () => {
|
|
17
|
+
it('treats an address as private when ipaddr.js cannot parse a value node:net accepted', () => {
|
|
18
|
+
parse.mockImplementation(() => {
|
|
19
|
+
throw new Error('parser/grammar skew');
|
|
20
|
+
});
|
|
21
|
+
expect(isPrivateIpv4('1.1.1.1')).toBe(true);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
describe('isPrivateIpv6 fail-closed', () => {
|
|
25
|
+
it('treats an address as private when ipaddr.js cannot parse a value node:net accepted', () => {
|
|
26
|
+
parse.mockImplementation(() => {
|
|
27
|
+
throw new Error('parser/grammar skew');
|
|
28
|
+
});
|
|
29
|
+
expect(isPrivateIpv6('2606:4700:4700::1111')).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
it('treats an address as private when ipaddr.js reports a non-ipv6 kind for an IPv6-shaped input', () => {
|
|
32
|
+
parse.mockReturnValue({ kind: () => 'ipv4' });
|
|
33
|
+
expect(isPrivateIpv6('2606:4700:4700::1111')).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=is-private-ip.fail-closed.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-private-ip.fail-closed.test.js","sourceRoot":"","sources":["../../src/node/is-private-ip.fail-closed.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,sEAAsE;AACtE,2EAA2E;AAC3E,uEAAuE;AACvE,mEAAmE;AACnE,iEAAiE;AACjE,wBAAwB;AACxB,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AAExB,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3C,OAAO,EAAE,EAAE,KAAK,EAAE;CACnB,CAAC,CAAC,CAAC;AAEJ,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAE5E,UAAU,CAAC,GAAG,EAAE;IACd,KAAK,CAAC,SAAS,EAAE,CAAC;AACpB,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,KAAK,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAC5B,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,KAAK,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAC5B,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8FAA8F,EAAE,GAAG,EAAE;QACtG,KAAK,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { isIPv4, isIPv6 } from 'node:net';
|
|
2
2
|
import ipaddr from 'ipaddr.js';
|
|
3
3
|
/**
|
|
4
|
-
* The single `ipaddr.js` range category that
|
|
5
|
-
* unicast address. Anything else (loopback, link-local, private,
|
|
6
|
-
* unique-local, reserved, 6to4, teredo, etc.) is rejected. An
|
|
7
|
-
* safer than enumerating disallowed buckets: new range names
|
|
8
|
-
* future `ipaddr.js` versions default to "block" rather than
|
|
4
|
+
* The single `ipaddr.js` range category that can represent a publicly
|
|
5
|
+
* routable unicast address. Anything else (loopback, link-local, private,
|
|
6
|
+
* multicast, unique-local, reserved, 6to4, teredo, etc.) is rejected. An
|
|
7
|
+
* allowlist is safer than enumerating disallowed buckets: new range names
|
|
8
|
+
* introduced by future `ipaddr.js` versions default to "block" rather than
|
|
9
|
+
* "allow". For IPv4 this category alone is sufficient (IANA's special-purpose
|
|
10
|
+
* registry is small and enumerated in full); for IPv6 it is not, because
|
|
11
|
+
* `range()` also reports it as a fallback for unallocated space, so
|
|
12
|
+
* {@link isPrivateIpv6} additionally gates on the `2000::/3` Global Unicast
|
|
13
|
+
* block before trusting it.
|
|
9
14
|
*/
|
|
10
15
|
const PUBLIC_RANGE = 'unicast';
|
|
11
16
|
/**
|
|
@@ -77,10 +82,14 @@ export function isPrivateIpv4(address) {
|
|
|
77
82
|
}
|
|
78
83
|
}
|
|
79
84
|
/**
|
|
80
|
-
* Returns `true` if `address` is an IPv6 address string that
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
85
|
+
* Returns `true` if `address` is an IPv6 address string that is not a
|
|
86
|
+
* genuine public Global Unicast address. This is a default-deny predicate:
|
|
87
|
+
* an address is treated as public only when it is both inside the allocated
|
|
88
|
+
* `2000::/3` Global Unicast block and not one of the named special-purpose
|
|
89
|
+
* ranges within it; every other address, including reserved or unallocated
|
|
90
|
+
* space `ipaddr.js` has no name for, is denied. IPv4-mapped addresses
|
|
91
|
+
* (`::ffff:a.b.c.d`) are re-checked against {@link isPrivateIpv4}, and the
|
|
92
|
+
* deprecated IPv4-compatible form (`::a.b.c.d`) is rejected outright.
|
|
84
93
|
*
|
|
85
94
|
* Fails closed on parser drift, mirroring {@link isPrivateIpv4}.
|
|
86
95
|
*
|
|
@@ -92,15 +101,71 @@ export function isPrivateIpv4(address) {
|
|
|
92
101
|
export function isPrivateIpv6(address) {
|
|
93
102
|
if (!isIPv6(address))
|
|
94
103
|
return false;
|
|
104
|
+
// The dotted IPv4-compatible spelling (`::a.b.c.d`) is rewritten by
|
|
105
|
+
// `ipaddr.js` into the IPv4-mapped byte layout before parsing, which would
|
|
106
|
+
// route it to the mapped (accept-if-public) branch below instead of the
|
|
107
|
+
// compatible (always-deny) branch. Deny the textual form up front so both
|
|
108
|
+
// spellings of the deprecated compatible form classify identically.
|
|
109
|
+
// The optional %zone suffix mirrors ipaddr.js's own deprecatedTransitional
|
|
110
|
+
// grammar; without it, a zone-indexed spelling (`::a.b.c.d%eth0`) would
|
|
111
|
+
// still reach the rewrite.
|
|
112
|
+
if (/^::\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(%[0-9a-z]+)?$/i.test(address))
|
|
113
|
+
return true;
|
|
95
114
|
try {
|
|
96
115
|
const parsed = ipaddr.parse(address);
|
|
97
116
|
if (parsed.kind() !== 'ipv6')
|
|
98
117
|
return true; // Defensive: parser/version skew. Fail closed.
|
|
99
118
|
const v6 = parsed;
|
|
100
|
-
|
|
101
|
-
|
|
119
|
+
const bytes = v6.toByteArray();
|
|
120
|
+
// Both embedded-IPv4 forms encode the IPv4 address in the last 4 bytes
|
|
121
|
+
// with the first 10 bytes zero, differing only in bytes 10-11 (0x0000
|
|
122
|
+
// for IPv4-compatible, 0xffff for IPv4-mapped). Extracting directly from
|
|
123
|
+
// the byte array, rather than trusting `::ffff:` textual matching or
|
|
124
|
+
// `isIPv4MappedAddress()` (which recognises only the mapped form), means
|
|
125
|
+
// neither encoding can bypass classification through this predicate.
|
|
126
|
+
// - IPv4-mapped (`::ffff:a.b.c.d`) is a real IPv4 destination tunnelled
|
|
127
|
+
// through IPv6, so the embedded address is re-checked against
|
|
128
|
+
// {@link isPrivateIpv4} and accepted if public.
|
|
129
|
+
// - IPv4-compatible (`::a.b.c.d`, RFC 4291 section 2.5.5.1) is
|
|
130
|
+
// deprecated, IANA-reserved space that does not route, so it is
|
|
131
|
+
// rejected unconditionally regardless of the embedded address (the
|
|
132
|
+
// dotted spelling is denied textually above, before `ipaddr.js`
|
|
133
|
+
// rewrites it to the mapped layout). This
|
|
134
|
+
// also covers `::` (unspecified) and `::1` (loopback), which take
|
|
135
|
+
// this same form.
|
|
136
|
+
const embedsIpv4 = bytes.slice(0, 10).every((byte) => byte === 0) && bytes[10] === bytes[11];
|
|
137
|
+
if (embedsIpv4 && bytes[10] === 0xff) {
|
|
138
|
+
return isPrivateIpv4(bytes.slice(12).join('.'));
|
|
139
|
+
}
|
|
140
|
+
if (embedsIpv4 && bytes[10] === 0x00) {
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
// `3ffe::/16` is the decommissioned 6bone experimental block: it sits
|
|
144
|
+
// inside `2000::/3` (top byte `0x3f`) so the Global Unicast gate below
|
|
145
|
+
// would otherwise let it through, and `ipaddr.js` has no named range
|
|
146
|
+
// for it, so `range()` reports the 'unicast' fallback for it too. It is
|
|
147
|
+
// IANA-reserved and does not route; deny it explicitly.
|
|
148
|
+
if (bytes[0] === 0x3f && bytes[1] === 0xfe) {
|
|
149
|
+
return true;
|
|
102
150
|
}
|
|
103
|
-
|
|
151
|
+
// Default-deny: `range()` reports the 'unicast' fallback for any
|
|
152
|
+
// address matching none of `ipaddr.js`'s named special ranges, so it is
|
|
153
|
+
// not by itself a positive "allocated and routable" signal. `4000::1`,
|
|
154
|
+
// `fe00::1`, and `101::1` are all unallocated or IANA-reserved space,
|
|
155
|
+
// and all report `range() === 'unicast'`, so treating that alone as
|
|
156
|
+
// "public" fails open. Requiring the address to also fall inside the
|
|
157
|
+
// allocated Global Unicast block `2000::/3` (top 3 bits `001`) closes
|
|
158
|
+
// that gap while `range()` still excludes the named special-purpose
|
|
159
|
+
// ranges nested inside that block (documentation `2001:db8::/32`,
|
|
160
|
+
// teredo `2001::/32`, 6to4 `2002::/16`, benchmarking `2001:2::/48`).
|
|
161
|
+
//
|
|
162
|
+
// This is not a claim of complete IANA-allocation tracking: it denies
|
|
163
|
+
// everything outside `2000::/3`, everything `ipaddr.js` special-cases
|
|
164
|
+
// within it, and the explicitly-listed `3ffe::/16` above. It does not
|
|
165
|
+
// enumerate every IANA reservation inside `2000::/3` and cannot prove
|
|
166
|
+
// an address is *currently* routed.
|
|
167
|
+
const isAllocatedGlobalUnicast = (bytes[0] & 0xe0) === 0x20;
|
|
168
|
+
return !(isAllocatedGlobalUnicast && v6.range() === PUBLIC_RANGE);
|
|
104
169
|
}
|
|
105
170
|
catch {
|
|
106
171
|
return true; // Fail closed: cannot prove the address is public, so treat as private.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-private-ip.js","sourceRoot":"","sources":["../../src/node/is-private-ip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,MAAM,MAAM,WAAW,CAAC;AAE/B
|
|
1
|
+
{"version":3,"file":"is-private-ip.js","sourceRoot":"","sources":["../../src/node/is-private-ip.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,6 +54,34 @@ describe('isPrivateIpv6', () => {
|
|
|
54
54
|
expect(isPrivateIpv6('::ffff:169.254.169.254')).toBe(true);
|
|
55
55
|
expect(isPrivateIpv6('::ffff:1.1.1.1')).toBe(false);
|
|
56
56
|
});
|
|
57
|
+
it.each([
|
|
58
|
+
['::7f00:1'], // IPv4-compatible wrapping 127.0.0.1
|
|
59
|
+
['::a9fe:a9fe'], // IPv4-compatible wrapping 169.254.169.254
|
|
60
|
+
['::5db8:d822'], // IPv4-compatible wrapping a public address: still deprecated, non-routing space
|
|
61
|
+
['::127.0.0.1'], // dotted spelling of the compatible form (ipaddr.js rewrites it to mapped)
|
|
62
|
+
['::93.184.216.34'], // dotted compatible wrapping a public address
|
|
63
|
+
['::1.1.1.1%lo0'], // zone-indexed dotted compatible (ipaddr.js rewrites this spelling too)
|
|
64
|
+
['::93.184.216.34%eth0'], // zone-indexed dotted compatible wrapping a public address
|
|
65
|
+
])('rejects the deprecated IPv4-compatible form %s regardless of the embedded address', (addr) => {
|
|
66
|
+
expect(isPrivateIpv6(addr)).toBe(true);
|
|
67
|
+
});
|
|
68
|
+
it('treats the hex-group mapped form the same as the dotted mapped form', () => {
|
|
69
|
+
// `URL.hostname` canonicalises `[::ffff:127.0.0.1]` to `[::ffff:7f00:1]`,
|
|
70
|
+
// so the hex-group encoding is the one URL-derived callers present.
|
|
71
|
+
expect(isPrivateIpv6('::ffff:7f00:1')).toBe(true);
|
|
72
|
+
expect(isPrivateIpv6('::ffff:101:101')).toBe(false); // 1.1.1.1
|
|
73
|
+
// Control: the zone-suffix handling must not start denying mapped-public.
|
|
74
|
+
expect(isPrivateIpv6('::ffff:1.1.1.1')).toBe(false);
|
|
75
|
+
});
|
|
76
|
+
it.each([
|
|
77
|
+
['4000::1'], // unallocated, outside 2000::/3
|
|
78
|
+
['fe00::1'], // reserved, outside 2000::/3
|
|
79
|
+
['101::1'], // unallocated, outside 2000::/3
|
|
80
|
+
['100:0:0:1::1'], // discard-only 100::/64 sibling space
|
|
81
|
+
['3ffe::1'], // decommissioned 6bone block inside 2000::/3
|
|
82
|
+
])('rejects the reserved or unallocated address %s that ipaddr.js has no named range for', (addr) => {
|
|
83
|
+
expect(isPrivateIpv6(addr)).toBe(true);
|
|
84
|
+
});
|
|
57
85
|
it('returns false for non-IPv6 input', () => {
|
|
58
86
|
expect(isPrivateIpv6('not an ip')).toBe(false);
|
|
59
87
|
expect(isPrivateIpv6('10.0.0.1')).toBe(false);
|