edockit 0.2.4 → 0.4.0-dev.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.
Files changed (69) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +81 -175
  3. package/TRUSTED-LIST.md +308 -0
  4. package/dist/certificate-c46e14a0.js +560 -0
  5. package/dist/certificate-c46e14a0.js.map +1 -0
  6. package/dist/certificate-fc0e06f7.js +571 -0
  7. package/dist/certificate-fc0e06f7.js.map +1 -0
  8. package/dist/core/canonicalization/XMLCanonicalizer.d.ts +9 -3
  9. package/dist/core/rsa-digestinfo-workaround.d.ts +29 -0
  10. package/dist/core/trustedlist/build.d.ts +41 -0
  11. package/dist/core/trustedlist/bundled-provider.d.ts +2 -0
  12. package/dist/core/trustedlist/contract.d.ts +19 -0
  13. package/dist/core/trustedlist/dom.d.ts +12 -0
  14. package/dist/core/trustedlist/extract.d.ts +6 -0
  15. package/dist/core/trustedlist/http.d.ts +8 -0
  16. package/dist/core/trustedlist/identity.d.ts +7 -0
  17. package/dist/core/trustedlist/index.d.ts +18 -0
  18. package/dist/core/trustedlist/loader.d.ts +5 -0
  19. package/dist/core/trustedlist/matcher.d.ts +11 -0
  20. package/dist/core/trustedlist/normalize.d.ts +14 -0
  21. package/dist/core/trustedlist/reference-provider.d.ts +12 -0
  22. package/dist/core/trustedlist/types.d.ts +114 -0
  23. package/dist/core/unzip.d.ts +0 -0
  24. package/dist/core/verification.d.ts +50 -0
  25. package/dist/data/trusted-list.d.ts +3 -0
  26. package/dist/identity-1a3dddc3.js +902 -0
  27. package/dist/identity-1a3dddc3.js.map +1 -0
  28. package/dist/identity-b3a70fc1.js +897 -0
  29. package/dist/identity-b3a70fc1.js.map +1 -0
  30. package/dist/index.cjs.js +1275 -7892
  31. package/dist/index.cjs.js.map +1 -1
  32. package/dist/index.d.ts +4 -2
  33. package/dist/index.esm.js +783 -7399
  34. package/dist/index.esm.js.map +1 -1
  35. package/dist/index.umd.js +12 -15
  36. package/dist/index.umd.js.map +1 -1
  37. package/dist/loader-1ac52e12.js +217 -0
  38. package/dist/loader-1ac52e12.js.map +1 -0
  39. package/dist/loader-43d8e17a.js +222 -0
  40. package/dist/loader-43d8e17a.js.map +1 -0
  41. package/dist/normalize-60f2d7e6.js +6270 -0
  42. package/dist/normalize-60f2d7e6.js.map +1 -0
  43. package/dist/normalize-70da6516.js +6214 -0
  44. package/dist/normalize-70da6516.js.map +1 -0
  45. package/dist/reference-provider-1cd85b7b.js +217 -0
  46. package/dist/reference-provider-1cd85b7b.js.map +1 -0
  47. package/dist/reference-provider-53240217.js +211 -0
  48. package/dist/reference-provider-53240217.js.map +1 -0
  49. package/dist/trusted-list-build.cjs.js +575 -0
  50. package/dist/trusted-list-build.cjs.js.map +1 -0
  51. package/dist/trusted-list-build.d.ts +4 -0
  52. package/dist/trusted-list-build.esm.js +564 -0
  53. package/dist/trusted-list-build.esm.js.map +1 -0
  54. package/dist/trusted-list-bundled.cjs.js +30436 -0
  55. package/dist/trusted-list-bundled.cjs.js.map +1 -0
  56. package/dist/trusted-list-bundled.d.ts +1 -0
  57. package/dist/trusted-list-bundled.esm.js +30432 -0
  58. package/dist/trusted-list-bundled.esm.js.map +1 -0
  59. package/dist/trusted-list-http.cjs.js +85 -0
  60. package/dist/trusted-list-http.cjs.js.map +1 -0
  61. package/dist/trusted-list-http.d.ts +1 -0
  62. package/dist/trusted-list-http.esm.js +81 -0
  63. package/dist/trusted-list-http.esm.js.map +1 -0
  64. package/dist/trusted-list.cjs.js +35 -0
  65. package/dist/trusted-list.cjs.js.map +1 -0
  66. package/dist/trusted-list.d.ts +9 -0
  67. package/dist/trusted-list.esm.js +10 -0
  68. package/dist/trusted-list.esm.js.map +1 -0
  69. package/package.json +34 -2
@@ -0,0 +1,217 @@
1
+ /*!
2
+ * MIT License
3
+ * Copyright (c) 2025 Edgars Jēkabsons, ZenomyTech SIA
4
+ */
5
+ 'use strict';
6
+
7
+ var loader = require('./loader-43d8e17a.js');
8
+ var normalize = require('./normalize-60f2d7e6.js');
9
+ var identity = require('./identity-1a3dddc3.js');
10
+
11
+ function getTrustIntervalAtTime(service, time) {
12
+ const timeUnix = Math.floor(time.getTime() / 1000);
13
+ return (service.trustIntervals.find((interval) => {
14
+ const intervalEnd = interval.toUnix ?? Number.POSITIVE_INFINITY;
15
+ return timeUnix >= interval.fromUnix && timeUnix < intervalEnd;
16
+ }) || null);
17
+ }
18
+ function getMatchSubjectLabel(purpose) {
19
+ return purpose === "signature_issuer" ? "issuer" : "timestamp authority";
20
+ }
21
+ function buildPositiveDetail(purpose, confidence) {
22
+ if (purpose === "signature_issuer") {
23
+ if (confidence === "exact") {
24
+ return "Trusted-list issuer match by SPKI, trusted at the requested time";
25
+ }
26
+ if (confidence === "ski_dn") {
27
+ return "Trusted-list issuer match by SKI + DN, trusted at the requested time";
28
+ }
29
+ return "Trusted-list issuer match by DN, trusted at the requested time";
30
+ }
31
+ if (confidence === "exact") {
32
+ return "Trusted-list timestamp authority match by certificate SPKI, trusted at the requested time";
33
+ }
34
+ if (confidence === "ski_dn") {
35
+ return "Trusted-list timestamp authority match by SKI + DN, trusted at the requested time";
36
+ }
37
+ return "Trusted-list timestamp authority match by DN, trusted at the requested time";
38
+ }
39
+ function buildWeakDnOnlyDetail(purpose) {
40
+ return purpose === "signature_issuer"
41
+ ? "Only issuer DN matched trusted-list data; no SKI or issuer certificate SPKI match available"
42
+ : "Only timestamp authority DN matched trusted-list data; no SKI or certificate SPKI match available";
43
+ }
44
+ function buildTrustMatch(service, query, confidence) {
45
+ if (!query.time) {
46
+ return {
47
+ found: true,
48
+ confidence,
49
+ country: service.country,
50
+ detail: `Matching ${getMatchSubjectLabel(query.purpose)} found, but no verification time was provided`,
51
+ };
52
+ }
53
+ const activeInterval = getTrustIntervalAtTime(service, query.time);
54
+ if (!activeInterval) {
55
+ return {
56
+ found: true,
57
+ confidence,
58
+ country: service.country,
59
+ detail: `Matching ${getMatchSubjectLabel(query.purpose)} found, but service was not trusted at the requested time`,
60
+ trustedAtTime: false,
61
+ };
62
+ }
63
+ return {
64
+ found: true,
65
+ trustedAtTime: true,
66
+ confidence,
67
+ country: service.country,
68
+ detail: confidence === "dn_only"
69
+ ? buildWeakDnOnlyDetail(query.purpose)
70
+ : buildPositiveDetail(query.purpose, confidence),
71
+ };
72
+ }
73
+ function pickBestServiceMatch(services, query, confidence) {
74
+ if (!query.time) {
75
+ return buildTrustMatch(services[0], query, confidence);
76
+ }
77
+ const trustedService = services.find((service) => getTrustIntervalAtTime(service, query.time));
78
+ if (trustedService) {
79
+ return buildTrustMatch(trustedService, query, confidence);
80
+ }
81
+ return buildTrustMatch(services[0], query, confidence);
82
+ }
83
+ function filterServicesByPurpose(services, purpose) {
84
+ return (services || []).filter((service) => normalize.trustListPurposeMatchesMask(purpose, service.purposeMask));
85
+ }
86
+ function filterServicesBySubjectDn(services, subjectDn) {
87
+ if (!subjectDn) {
88
+ return services || [];
89
+ }
90
+ return (services || []).filter((service) => service.subjectDn === subjectDn);
91
+ }
92
+ function matchTrustListQuery(query, trustedListData) {
93
+ const normalizedSubjectDn = normalize.normalizeDistinguishedName(query.subjectDn);
94
+ const normalizedSpkiSha256Hex = normalize.normalizeHex(query.spkiSha256Hex);
95
+ const normalizedSkiHex = normalize.normalizeKeyIdentifier(query.skiHex);
96
+ if (normalizedSpkiSha256Hex) {
97
+ const exactMatches = filterServicesBySubjectDn(filterServicesByPurpose(trustedListData.indexes.bySpkiSha256.get(normalizedSpkiSha256Hex), query.purpose), normalizedSubjectDn);
98
+ if (exactMatches.length > 0) {
99
+ return pickBestServiceMatch(exactMatches, {
100
+ ...query,
101
+ spkiSha256Hex: normalizedSpkiSha256Hex,
102
+ subjectDn: normalizedSubjectDn,
103
+ }, "exact");
104
+ }
105
+ }
106
+ if (normalizedSkiHex && normalizedSubjectDn) {
107
+ const skiMatches = filterServicesBySubjectDn(filterServicesByPurpose(trustedListData.indexes.bySki.get(normalizedSkiHex), query.purpose), normalizedSubjectDn);
108
+ if (skiMatches.length > 0) {
109
+ return pickBestServiceMatch(skiMatches, {
110
+ ...query,
111
+ skiHex: normalizedSkiHex,
112
+ subjectDn: normalizedSubjectDn,
113
+ }, "ski_dn");
114
+ }
115
+ }
116
+ if (normalizedSubjectDn) {
117
+ const dnOnlyMatches = filterServicesByPurpose(trustedListData.indexes.bySubjectDn.get(normalizedSubjectDn), query.purpose);
118
+ if (dnOnlyMatches.length > 0) {
119
+ return pickBestServiceMatch(dnOnlyMatches, {
120
+ ...query,
121
+ subjectDn: normalizedSubjectDn,
122
+ }, "dn_only");
123
+ }
124
+ }
125
+ return {
126
+ found: false,
127
+ detail: `No matching ${getMatchSubjectLabel(query.purpose)} found in trusted-list data`,
128
+ };
129
+ }
130
+ function matchIssuerIdentityToTrustedList(issuerIdentity, trustedListData, options) {
131
+ const issuerCertificate = issuerIdentity.issuerCertificate
132
+ ? {
133
+ subjectDn: normalize.normalizeDistinguishedName(issuerIdentity.issuerCertificate.subjectDn),
134
+ spkiSha256Hex: normalize.normalizeHex(issuerIdentity.issuerCertificate.spkiSha256Hex),
135
+ }
136
+ : null;
137
+ return matchTrustListQuery({
138
+ purpose: "signature_issuer",
139
+ subjectDn: issuerIdentity.issuerSubjectDn,
140
+ skiHex: issuerIdentity.authorityKeyIdentifierHex,
141
+ spkiSha256Hex: issuerCertificate?.spkiSha256Hex,
142
+ time: options.time,
143
+ }, trustedListData);
144
+ }
145
+ async function matchCertificateIssuerToTrustedList(certificatePem, options) {
146
+ const issuerIdentity = await identity.extractIssuerIdentityFromCertificate(certificatePem, options);
147
+ return matchIssuerIdentityToTrustedList(issuerIdentity, options.trustedListData, {
148
+ time: options.time,
149
+ });
150
+ }
151
+ async function matchCertificateToTrustedList(certificatePem, options) {
152
+ const certificateIdentity = await identity.extractCertificateIdentityFromCertificate(certificatePem);
153
+ return matchTrustListQuery({
154
+ purpose: options.purpose || "timestamp_tsa",
155
+ subjectDn: certificateIdentity.subjectDn,
156
+ skiHex: certificateIdentity.subjectKeyIdentifierHex,
157
+ spkiSha256Hex: certificateIdentity.spkiSha256Hex,
158
+ time: options.time,
159
+ }, options.trustedListData);
160
+ }
161
+
162
+ function isTrustedListData(value) {
163
+ return "indexes" in value;
164
+ }
165
+ function createInMemoryTrustListProvider(trustedListData) {
166
+ return {
167
+ async match(query) {
168
+ return matchTrustListQuery(query, trustedListData);
169
+ },
170
+ };
171
+ }
172
+ async function loadTrustedListDataFromUrl(options) {
173
+ const fetchImpl = options.fetch ?? globalThis.fetch;
174
+ if (!fetchImpl) {
175
+ throw new Error("No fetch implementation available to load trusted-list data");
176
+ }
177
+ const response = await fetchImpl(options.url, {
178
+ method: "GET",
179
+ headers: options.headers,
180
+ });
181
+ if (!response.ok) {
182
+ throw new Error(`Failed to fetch trusted-list data from "${options.url}": HTTP ${response.status}`);
183
+ }
184
+ const bundle = (await response.json());
185
+ return loader.buildTrustedListData(bundle);
186
+ }
187
+ function createTrustListProvider(options) {
188
+ if (!options) {
189
+ throw new Error("createTrustListProvider requires either { data } or { url }. For bundled fallback use createBundledTrustListProvider from edockit/trusted-list/bundled.");
190
+ }
191
+ if ("data" in options) {
192
+ const trustedListData = isTrustedListData(options.data)
193
+ ? options.data
194
+ : loader.buildTrustedListData(options.data);
195
+ return createInMemoryTrustListProvider(trustedListData);
196
+ }
197
+ let trustedListDataPromise = null;
198
+ return {
199
+ async match(query) {
200
+ if (!trustedListDataPromise) {
201
+ trustedListDataPromise = loadTrustedListDataFromUrl(options).catch((error) => {
202
+ trustedListDataPromise = null;
203
+ throw error;
204
+ });
205
+ }
206
+ const trustedListData = await trustedListDataPromise;
207
+ return matchTrustListQuery(query, trustedListData);
208
+ },
209
+ };
210
+ }
211
+
212
+ exports.createTrustListProvider = createTrustListProvider;
213
+ exports.matchCertificateIssuerToTrustedList = matchCertificateIssuerToTrustedList;
214
+ exports.matchCertificateToTrustedList = matchCertificateToTrustedList;
215
+ exports.matchIssuerIdentityToTrustedList = matchIssuerIdentityToTrustedList;
216
+ exports.matchTrustListQuery = matchTrustListQuery;
217
+ //# sourceMappingURL=reference-provider-1cd85b7b.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference-provider-1cd85b7b.js","sources":["../src/core/trustedlist/matcher.ts","../src/core/trustedlist/reference-provider.ts"],"sourcesContent":[null,null],"names":["trustListPurposeMatchesMask","normalizeDistinguishedName","normalizeHex","normalizeKeyIdentifier","extractIssuerIdentityFromCertificate","extractCertificateIdentityFromCertificate","buildTrustedListData"],"mappings":"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"}
@@ -0,0 +1,211 @@
1
+ /*!
2
+ * MIT License
3
+ * Copyright (c) 2025 Edgars Jēkabsons, ZenomyTech SIA
4
+ */
5
+ import { b as buildTrustedListData } from './loader-1ac52e12.js';
6
+ import { X as normalizeDistinguishedName, a3 as normalizeHex, Y as normalizeKeyIdentifier, a4 as trustListPurposeMatchesMask } from './normalize-70da6516.js';
7
+ import { e as extractIssuerIdentityFromCertificate, a as extractCertificateIdentityFromCertificate } from './identity-b3a70fc1.js';
8
+
9
+ function getTrustIntervalAtTime(service, time) {
10
+ const timeUnix = Math.floor(time.getTime() / 1000);
11
+ return (service.trustIntervals.find((interval) => {
12
+ const intervalEnd = interval.toUnix ?? Number.POSITIVE_INFINITY;
13
+ return timeUnix >= interval.fromUnix && timeUnix < intervalEnd;
14
+ }) || null);
15
+ }
16
+ function getMatchSubjectLabel(purpose) {
17
+ return purpose === "signature_issuer" ? "issuer" : "timestamp authority";
18
+ }
19
+ function buildPositiveDetail(purpose, confidence) {
20
+ if (purpose === "signature_issuer") {
21
+ if (confidence === "exact") {
22
+ return "Trusted-list issuer match by SPKI, trusted at the requested time";
23
+ }
24
+ if (confidence === "ski_dn") {
25
+ return "Trusted-list issuer match by SKI + DN, trusted at the requested time";
26
+ }
27
+ return "Trusted-list issuer match by DN, trusted at the requested time";
28
+ }
29
+ if (confidence === "exact") {
30
+ return "Trusted-list timestamp authority match by certificate SPKI, trusted at the requested time";
31
+ }
32
+ if (confidence === "ski_dn") {
33
+ return "Trusted-list timestamp authority match by SKI + DN, trusted at the requested time";
34
+ }
35
+ return "Trusted-list timestamp authority match by DN, trusted at the requested time";
36
+ }
37
+ function buildWeakDnOnlyDetail(purpose) {
38
+ return purpose === "signature_issuer"
39
+ ? "Only issuer DN matched trusted-list data; no SKI or issuer certificate SPKI match available"
40
+ : "Only timestamp authority DN matched trusted-list data; no SKI or certificate SPKI match available";
41
+ }
42
+ function buildTrustMatch(service, query, confidence) {
43
+ if (!query.time) {
44
+ return {
45
+ found: true,
46
+ confidence,
47
+ country: service.country,
48
+ detail: `Matching ${getMatchSubjectLabel(query.purpose)} found, but no verification time was provided`,
49
+ };
50
+ }
51
+ const activeInterval = getTrustIntervalAtTime(service, query.time);
52
+ if (!activeInterval) {
53
+ return {
54
+ found: true,
55
+ confidence,
56
+ country: service.country,
57
+ detail: `Matching ${getMatchSubjectLabel(query.purpose)} found, but service was not trusted at the requested time`,
58
+ trustedAtTime: false,
59
+ };
60
+ }
61
+ return {
62
+ found: true,
63
+ trustedAtTime: true,
64
+ confidence,
65
+ country: service.country,
66
+ detail: confidence === "dn_only"
67
+ ? buildWeakDnOnlyDetail(query.purpose)
68
+ : buildPositiveDetail(query.purpose, confidence),
69
+ };
70
+ }
71
+ function pickBestServiceMatch(services, query, confidence) {
72
+ if (!query.time) {
73
+ return buildTrustMatch(services[0], query, confidence);
74
+ }
75
+ const trustedService = services.find((service) => getTrustIntervalAtTime(service, query.time));
76
+ if (trustedService) {
77
+ return buildTrustMatch(trustedService, query, confidence);
78
+ }
79
+ return buildTrustMatch(services[0], query, confidence);
80
+ }
81
+ function filterServicesByPurpose(services, purpose) {
82
+ return (services || []).filter((service) => trustListPurposeMatchesMask(purpose, service.purposeMask));
83
+ }
84
+ function filterServicesBySubjectDn(services, subjectDn) {
85
+ if (!subjectDn) {
86
+ return services || [];
87
+ }
88
+ return (services || []).filter((service) => service.subjectDn === subjectDn);
89
+ }
90
+ function matchTrustListQuery(query, trustedListData) {
91
+ const normalizedSubjectDn = normalizeDistinguishedName(query.subjectDn);
92
+ const normalizedSpkiSha256Hex = normalizeHex(query.spkiSha256Hex);
93
+ const normalizedSkiHex = normalizeKeyIdentifier(query.skiHex);
94
+ if (normalizedSpkiSha256Hex) {
95
+ const exactMatches = filterServicesBySubjectDn(filterServicesByPurpose(trustedListData.indexes.bySpkiSha256.get(normalizedSpkiSha256Hex), query.purpose), normalizedSubjectDn);
96
+ if (exactMatches.length > 0) {
97
+ return pickBestServiceMatch(exactMatches, {
98
+ ...query,
99
+ spkiSha256Hex: normalizedSpkiSha256Hex,
100
+ subjectDn: normalizedSubjectDn,
101
+ }, "exact");
102
+ }
103
+ }
104
+ if (normalizedSkiHex && normalizedSubjectDn) {
105
+ const skiMatches = filterServicesBySubjectDn(filterServicesByPurpose(trustedListData.indexes.bySki.get(normalizedSkiHex), query.purpose), normalizedSubjectDn);
106
+ if (skiMatches.length > 0) {
107
+ return pickBestServiceMatch(skiMatches, {
108
+ ...query,
109
+ skiHex: normalizedSkiHex,
110
+ subjectDn: normalizedSubjectDn,
111
+ }, "ski_dn");
112
+ }
113
+ }
114
+ if (normalizedSubjectDn) {
115
+ const dnOnlyMatches = filterServicesByPurpose(trustedListData.indexes.bySubjectDn.get(normalizedSubjectDn), query.purpose);
116
+ if (dnOnlyMatches.length > 0) {
117
+ return pickBestServiceMatch(dnOnlyMatches, {
118
+ ...query,
119
+ subjectDn: normalizedSubjectDn,
120
+ }, "dn_only");
121
+ }
122
+ }
123
+ return {
124
+ found: false,
125
+ detail: `No matching ${getMatchSubjectLabel(query.purpose)} found in trusted-list data`,
126
+ };
127
+ }
128
+ function matchIssuerIdentityToTrustedList(issuerIdentity, trustedListData, options) {
129
+ const issuerCertificate = issuerIdentity.issuerCertificate
130
+ ? {
131
+ subjectDn: normalizeDistinguishedName(issuerIdentity.issuerCertificate.subjectDn),
132
+ spkiSha256Hex: normalizeHex(issuerIdentity.issuerCertificate.spkiSha256Hex),
133
+ }
134
+ : null;
135
+ return matchTrustListQuery({
136
+ purpose: "signature_issuer",
137
+ subjectDn: issuerIdentity.issuerSubjectDn,
138
+ skiHex: issuerIdentity.authorityKeyIdentifierHex,
139
+ spkiSha256Hex: issuerCertificate?.spkiSha256Hex,
140
+ time: options.time,
141
+ }, trustedListData);
142
+ }
143
+ async function matchCertificateIssuerToTrustedList(certificatePem, options) {
144
+ const issuerIdentity = await extractIssuerIdentityFromCertificate(certificatePem, options);
145
+ return matchIssuerIdentityToTrustedList(issuerIdentity, options.trustedListData, {
146
+ time: options.time,
147
+ });
148
+ }
149
+ async function matchCertificateToTrustedList(certificatePem, options) {
150
+ const certificateIdentity = await extractCertificateIdentityFromCertificate(certificatePem);
151
+ return matchTrustListQuery({
152
+ purpose: options.purpose || "timestamp_tsa",
153
+ subjectDn: certificateIdentity.subjectDn,
154
+ skiHex: certificateIdentity.subjectKeyIdentifierHex,
155
+ spkiSha256Hex: certificateIdentity.spkiSha256Hex,
156
+ time: options.time,
157
+ }, options.trustedListData);
158
+ }
159
+
160
+ function isTrustedListData(value) {
161
+ return "indexes" in value;
162
+ }
163
+ function createInMemoryTrustListProvider(trustedListData) {
164
+ return {
165
+ async match(query) {
166
+ return matchTrustListQuery(query, trustedListData);
167
+ },
168
+ };
169
+ }
170
+ async function loadTrustedListDataFromUrl(options) {
171
+ const fetchImpl = options.fetch ?? globalThis.fetch;
172
+ if (!fetchImpl) {
173
+ throw new Error("No fetch implementation available to load trusted-list data");
174
+ }
175
+ const response = await fetchImpl(options.url, {
176
+ method: "GET",
177
+ headers: options.headers,
178
+ });
179
+ if (!response.ok) {
180
+ throw new Error(`Failed to fetch trusted-list data from "${options.url}": HTTP ${response.status}`);
181
+ }
182
+ const bundle = (await response.json());
183
+ return buildTrustedListData(bundle);
184
+ }
185
+ function createTrustListProvider(options) {
186
+ if (!options) {
187
+ throw new Error("createTrustListProvider requires either { data } or { url }. For bundled fallback use createBundledTrustListProvider from edockit/trusted-list/bundled.");
188
+ }
189
+ if ("data" in options) {
190
+ const trustedListData = isTrustedListData(options.data)
191
+ ? options.data
192
+ : buildTrustedListData(options.data);
193
+ return createInMemoryTrustListProvider(trustedListData);
194
+ }
195
+ let trustedListDataPromise = null;
196
+ return {
197
+ async match(query) {
198
+ if (!trustedListDataPromise) {
199
+ trustedListDataPromise = loadTrustedListDataFromUrl(options).catch((error) => {
200
+ trustedListDataPromise = null;
201
+ throw error;
202
+ });
203
+ }
204
+ const trustedListData = await trustedListDataPromise;
205
+ return matchTrustListQuery(query, trustedListData);
206
+ },
207
+ };
208
+ }
209
+
210
+ export { matchCertificateToTrustedList as a, matchIssuerIdentityToTrustedList as b, matchTrustListQuery as c, createTrustListProvider as d, matchCertificateIssuerToTrustedList as m };
211
+ //# sourceMappingURL=reference-provider-53240217.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference-provider-53240217.js","sources":["../src/core/trustedlist/matcher.ts","../src/core/trustedlist/reference-provider.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}