@bsv/vsc 0.2.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +58 -0
- package/README.md +107 -0
- package/artifacts/context-0.1.0.jsonld +127 -0
- package/artifacts/disclosure-0.1.0.schema.json +526 -0
- package/artifacts/epcis/NOTICE.md +11 -0
- package/artifacts/epcis/epcis-context-2.0.1.jsonld +593 -0
- package/artifacts/epcis/epcis-json-schema-2.0.1.json +2352 -0
- package/artifacts/epcis/query-schema-2.0.1.json +968 -0
- package/artifacts/external/NOTICE.md +3 -0
- package/artifacts/external/dpp-external-passport-1.context.jsonld +8 -0
- package/artifacts/external/dpp-external-passport-1.schema.json +158 -0
- package/artifacts/profile-0.1.0.json +100 -0
- package/artifacts/seal-0.1.0.schema.json +535 -0
- package/artifacts/w3c/NOTICE.md +3 -0
- package/artifacts/w3c/credentials-v2.jsonld +340 -0
- package/dist/context.d.ts +9 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +50 -0
- package/dist/context.js.map +1 -0
- package/dist/crypto.d.ts +50 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +141 -0
- package/dist/crypto.js.map +1 -0
- package/dist/did-web.d.ts +9 -0
- package/dist/did-web.d.ts.map +1 -0
- package/dist/did-web.js +66 -0
- package/dist/did-web.js.map +1 -0
- package/dist/epcis-source.d.ts +251 -0
- package/dist/epcis-source.d.ts.map +1 -0
- package/dist/epcis-source.js +573 -0
- package/dist/epcis-source.js.map +1 -0
- package/dist/epcis.d.ts +51 -0
- package/dist/epcis.d.ts.map +1 -0
- package/dist/epcis.js +171 -0
- package/dist/epcis.js.map +1 -0
- package/dist/exchange.d.ts +175 -0
- package/dist/exchange.d.ts.map +1 -0
- package/dist/exchange.js +491 -0
- package/dist/exchange.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/jcs.d.ts +25 -0
- package/dist/jcs.d.ts.map +1 -0
- package/dist/jcs.js +67 -0
- package/dist/jcs.js.map +1 -0
- package/dist/schema.d.ts +414 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +537 -0
- package/dist/schema.js.map +1 -0
- package/dist/types.d.ts +159 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +22 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +147 -0
- package/dist/validation.js.map +1 -0
- package/dist/verification.d.ts +10 -0
- package/dist/verification.d.ts.map +1 -0
- package/dist/verification.js +350 -0
- package/dist/verification.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EPCIS source exchange (`spec/epcis-interoperability.md`, the epcis-json@1
|
|
3
|
+
* interoperability profile): the shared, dependency-light half of importing
|
|
4
|
+
* an EPCIS 2.0.1 JSON or JSON-LD document.
|
|
5
|
+
*
|
|
6
|
+
* What lives here is everything a registry, an application service and an
|
|
7
|
+
* offline reader must agree on byte for byte: the strict parse with its
|
|
8
|
+
* disclosed limits, the pinned-schema validation that never mutates, the
|
|
9
|
+
* event pointers, the canonical event-body digest a duplicate or a conflict is
|
|
10
|
+
* decided by, the local identity of an event that carries no eventID, and the
|
|
11
|
+
* signed source-reference extension a mapped credential carries. Durable
|
|
12
|
+
* retention, idempotency keys, checkpoints and the pull client are the
|
|
13
|
+
* application service's, because they need a store and a network.
|
|
14
|
+
*
|
|
15
|
+
* Nothing here strips, coerces, reorders or rewrites a source. A safely
|
|
16
|
+
* parsed document that fails EPCIS validation is returned with its findings
|
|
17
|
+
* so it can be retained as evidence; a transport that is unsafe to parse
|
|
18
|
+
* (malformed UTF-8, a duplicate key, a depth or size past the limit, a number
|
|
19
|
+
* a double cannot carry) is refused before anything is produced.
|
|
20
|
+
*/
|
|
21
|
+
import { createHash } from 'node:crypto';
|
|
22
|
+
import { readFileSync } from 'node:fs';
|
|
23
|
+
import { Ajv } from 'ajv';
|
|
24
|
+
import addFormats from 'ajv-formats';
|
|
25
|
+
import { canonicalizeJcs } from './jcs.js';
|
|
26
|
+
/* ------------------------------ artefacts ------------------------------- */
|
|
27
|
+
/** The pinned GS1 artefacts this module validates against (artifacts/epcis/NOTICE.md). */
|
|
28
|
+
export const EPCIS_ARTEFACTS = [
|
|
29
|
+
{ id: 'epcis-json-schema', kind: 'json-schema', version: '2.0.1', path: 'artifacts/epcis/epcis-json-schema-2.0.1.json', uri: 'https://ref.gs1.org/standards/epcis/2.0.1/epcis-json-schema.json', sha256: '0f46ff694efffd8d8ce840a33dfde84228add11b516b8b258f3200740ae210af', byteLength: 55680, carried: true },
|
|
30
|
+
{ id: 'epcis-context', kind: 'jsonld-context', version: '2.0.1', path: 'artifacts/epcis/epcis-context-2.0.1.jsonld', uri: 'https://ref.gs1.org/standards/epcis/2.0.1/epcis-context.jsonld', sha256: '5056c65f991425b1d3a35e35edf4f7d0c7ff56cf688c2912b930f93494713737', byteLength: 20690, carried: true },
|
|
31
|
+
{ id: 'epcis-query-schema', kind: 'json-schema', version: '2.0.1', path: 'artifacts/epcis/query-schema-2.0.1.json', uri: 'https://ref.gs1.org/standards/epcis/2.0.1/query-schema.json', sha256: '4b5583c9a0a715324594617f3cf6744f4f930568484f7df8fb7aa81819355341', byteLength: 27229, carried: true },
|
|
32
|
+
{ id: 'epcis-openapi', kind: 'openapi', version: '2.0.1', path: null, uri: 'https://ref.gs1.org/standards/epcis/2.0.1/openapi.json', sha256: '3d33792c520d7a7a1d080382d956730bb07021c7dd1cc17229fce27b784d66fc', byteLength: 351201, carried: false },
|
|
33
|
+
];
|
|
34
|
+
export const EPCIS_VERSION = '2.0.1';
|
|
35
|
+
export const CBV_VERSION = '2.0.0';
|
|
36
|
+
export const EPCIS_CONTEXT_IRI = 'https://ref.gs1.org/standards/epcis/2.0.1/epcis-context.jsonld';
|
|
37
|
+
export const EPCIS_CONTEXT_DIGEST = EPCIS_ARTEFACTS[1].sha256;
|
|
38
|
+
/** The five event types the profile recognises; anything else is an extension event this profile does not interpret. */
|
|
39
|
+
export const EPCIS_EVENT_TYPES = ['ObjectEvent', 'AggregationEvent', 'TransformationEvent', 'TransactionEvent', 'AssociationEvent'];
|
|
40
|
+
/** The signed source-reference vocabulary a mapped credential carries beside the round-trip event. */
|
|
41
|
+
export const EPCIS_SOURCE_VOCABULARY = 'urn:bsv:dpp:epcis-source:1';
|
|
42
|
+
export const EPCIS_MAPPING_PROFILE = 'epcis-vsc@1';
|
|
43
|
+
export const EPCIS_SOURCE_PROFILE = 'epcis-json@1';
|
|
44
|
+
export const EPCIS_MEDIA_TYPES = ['application/json', 'application/ld+json'];
|
|
45
|
+
/** The disclosed defaults of epcis-json@1; an operator lowers them or explicitly configures bounded higher values. */
|
|
46
|
+
export const EPCIS_DEFAULT_LIMITS = {
|
|
47
|
+
maxDocumentBytes: 2 * 1024 * 1024,
|
|
48
|
+
maxEventsPerPage: 100,
|
|
49
|
+
maxJsonDepth: 64,
|
|
50
|
+
maxContextDocuments: 16,
|
|
51
|
+
maxContextBytes: 1024 * 1024,
|
|
52
|
+
fetchTimeoutMs: 10_000,
|
|
53
|
+
maxPullPages: 10,
|
|
54
|
+
maxPullBytes: 20 * 1024 * 1024,
|
|
55
|
+
maxPullSeconds: 60,
|
|
56
|
+
};
|
|
57
|
+
export function resolveEpcisLimits(overrides = {}) {
|
|
58
|
+
const limits = { ...EPCIS_DEFAULT_LIMITS, ...overrides };
|
|
59
|
+
for (const [name, value] of Object.entries(limits)) {
|
|
60
|
+
if (!Number.isSafeInteger(value) || value <= 0)
|
|
61
|
+
throw new Error(`EPCIS limit ${name} must be a positive integer`);
|
|
62
|
+
}
|
|
63
|
+
return limits;
|
|
64
|
+
}
|
|
65
|
+
const NUMBER = /-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/y;
|
|
66
|
+
/** The digits and decimal exponent of a JSON number literal, with leading and trailing zeros removed, so two spellings of one value compare equal. */
|
|
67
|
+
function normalisedDecimal(text) {
|
|
68
|
+
const match = /^(-)?(\d+)(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/.exec(text);
|
|
69
|
+
if (match == null)
|
|
70
|
+
throw new Error(`not a number literal: ${text}`);
|
|
71
|
+
const integer = match[2] ?? '';
|
|
72
|
+
const fraction = match[3] ?? '';
|
|
73
|
+
let exponent = Number(match[4] ?? '0') - fraction.length;
|
|
74
|
+
// Scanned rather than matched: a run of zeros against an anchored regex costs quadratic time.
|
|
75
|
+
const all = integer + fraction;
|
|
76
|
+
let start = 0;
|
|
77
|
+
while (start < all.length && all[start] === '0')
|
|
78
|
+
start++;
|
|
79
|
+
let end = all.length;
|
|
80
|
+
while (end > start && all[end - 1] === '0')
|
|
81
|
+
end--;
|
|
82
|
+
if (start === all.length)
|
|
83
|
+
return { negative: false, digits: '0', exponent: 0 };
|
|
84
|
+
const digits = all.slice(start, end);
|
|
85
|
+
exponent += all.length - end;
|
|
86
|
+
return { negative: match[1] === '-', digits, exponent };
|
|
87
|
+
}
|
|
88
|
+
/** Whether a number literal survives a parse into a double and the shortest round-trip serialisation with the same decimal digits. */
|
|
89
|
+
export function numberLiteralIsExact(text) {
|
|
90
|
+
const value = Number(text);
|
|
91
|
+
if (!Number.isFinite(value))
|
|
92
|
+
return false;
|
|
93
|
+
const literal = normalisedDecimal(text);
|
|
94
|
+
if (literal.digits === '0')
|
|
95
|
+
return true;
|
|
96
|
+
const roundTrip = normalisedDecimal(String(value));
|
|
97
|
+
return literal.digits === roundTrip.digits && literal.exponent === roundTrip.exponent && literal.negative === roundTrip.negative;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Validate the transport of an already syntactically valid JSON text: no
|
|
101
|
+
* duplicate member names, no container nested past the depth limit, and no
|
|
102
|
+
* number a double cannot carry exactly. Returns the refusal, or undefined.
|
|
103
|
+
*/
|
|
104
|
+
function inspectTransport(text, maxDepth) {
|
|
105
|
+
let index = 0;
|
|
106
|
+
const whitespace = () => { while (index < text.length && /\s/.test(text[index]))
|
|
107
|
+
index++; };
|
|
108
|
+
const string = () => {
|
|
109
|
+
const start = index++;
|
|
110
|
+
while (index < text.length) {
|
|
111
|
+
if (text[index] === '\\')
|
|
112
|
+
index += 2;
|
|
113
|
+
else if (text[index++] === '"')
|
|
114
|
+
return JSON.parse(text.slice(start, index));
|
|
115
|
+
}
|
|
116
|
+
throw new Error('unterminated string');
|
|
117
|
+
};
|
|
118
|
+
let refusal;
|
|
119
|
+
const visit = (depth, path) => {
|
|
120
|
+
if (refusal != null)
|
|
121
|
+
return;
|
|
122
|
+
whitespace();
|
|
123
|
+
const char = text[index];
|
|
124
|
+
if (char === '{') {
|
|
125
|
+
if (depth > maxDepth) {
|
|
126
|
+
refusal = { reason: 'depth', detail: `an object at ${path || '/'} is nested deeper than ${maxDepth}` };
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
index++;
|
|
130
|
+
whitespace();
|
|
131
|
+
const keys = new Set();
|
|
132
|
+
while (text[index] !== '}') {
|
|
133
|
+
const key = string();
|
|
134
|
+
if (keys.has(key)) {
|
|
135
|
+
refusal = { reason: 'duplicate-key', detail: `member ${JSON.stringify(key)} appears twice at ${path || '/'}` };
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
keys.add(key);
|
|
139
|
+
whitespace();
|
|
140
|
+
index++;
|
|
141
|
+
visit(depth + 1, `${path}/${key}`);
|
|
142
|
+
if (refusal != null)
|
|
143
|
+
return;
|
|
144
|
+
whitespace();
|
|
145
|
+
if (text[index] !== ',')
|
|
146
|
+
break;
|
|
147
|
+
index++;
|
|
148
|
+
whitespace();
|
|
149
|
+
}
|
|
150
|
+
index++;
|
|
151
|
+
}
|
|
152
|
+
else if (char === '[') {
|
|
153
|
+
if (depth > maxDepth) {
|
|
154
|
+
refusal = { reason: 'depth', detail: `an array at ${path || '/'} is nested deeper than ${maxDepth}` };
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
index++;
|
|
158
|
+
whitespace();
|
|
159
|
+
let position = 0;
|
|
160
|
+
while (text[index] !== ']') {
|
|
161
|
+
visit(depth + 1, `${path}/${position++}`);
|
|
162
|
+
if (refusal != null)
|
|
163
|
+
return;
|
|
164
|
+
whitespace();
|
|
165
|
+
if (text[index] !== ',')
|
|
166
|
+
break;
|
|
167
|
+
index++;
|
|
168
|
+
}
|
|
169
|
+
index++;
|
|
170
|
+
}
|
|
171
|
+
else if (char === '"') {
|
|
172
|
+
string();
|
|
173
|
+
}
|
|
174
|
+
else if (char === '-' || (char != null && char >= '0' && char <= '9')) {
|
|
175
|
+
NUMBER.lastIndex = index;
|
|
176
|
+
const match = NUMBER.exec(text);
|
|
177
|
+
if (match == null)
|
|
178
|
+
throw new Error('unreadable number');
|
|
179
|
+
index += match[0].length;
|
|
180
|
+
if (!numberLiteralIsExact(match[0]))
|
|
181
|
+
refusal = { reason: 'unsafe-number', detail: `the number ${match[0]} at ${path || '/'} cannot be carried exactly; it would be silently changed by any parser` };
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
while (index < text.length && !/[\s,\]}]/.test(text[index]))
|
|
185
|
+
index++;
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
visit(1, '');
|
|
189
|
+
return refusal;
|
|
190
|
+
}
|
|
191
|
+
const sha256Hex = (bytes) => createHash('sha256').update(bytes).digest('hex');
|
|
192
|
+
function mediaTypeBase(value) {
|
|
193
|
+
return value.split(';')[0]?.trim().toLowerCase() ?? '';
|
|
194
|
+
}
|
|
195
|
+
const EVENT_LIST_POINTERS = {
|
|
196
|
+
EPCISDocument: '/epcisBody/eventList',
|
|
197
|
+
EPCISQueryDocument: '/epcisBody/queryResults/resultsBody/eventList',
|
|
198
|
+
};
|
|
199
|
+
function readPointer(root, pointer) {
|
|
200
|
+
let value = root;
|
|
201
|
+
for (const part of pointer.split('/').slice(1)) {
|
|
202
|
+
if (value == null || typeof value !== 'object')
|
|
203
|
+
return undefined;
|
|
204
|
+
value = value[part.replace(/~1/g, '/').replace(/~0/g, '~')];
|
|
205
|
+
}
|
|
206
|
+
return value;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Parse an EPCIS source strictly under the profile's limits, without
|
|
210
|
+
* changing a byte of it. The document, when the transport is safe, is the
|
|
211
|
+
* exact JSON value; the events are pointers into it; the findings say what
|
|
212
|
+
* the envelope lacks without deciding what the caller does about it.
|
|
213
|
+
*/
|
|
214
|
+
export function parseEpcisSource(bytes, options) {
|
|
215
|
+
const limits = resolveEpcisLimits(options.limits);
|
|
216
|
+
const mediaType = mediaTypeBase(options.mediaType);
|
|
217
|
+
if (!EPCIS_MEDIA_TYPES.includes(mediaType)) {
|
|
218
|
+
return { ok: false, reason: 'unsupported-media-type', detail: `${options.mediaType} is not one of ${EPCIS_MEDIA_TYPES.join(', ')}` };
|
|
219
|
+
}
|
|
220
|
+
if (bytes.byteLength > limits.maxDocumentBytes) {
|
|
221
|
+
return { ok: false, reason: 'oversized', detail: `${bytes.byteLength} bytes exceeds the ${limits.maxDocumentBytes} byte limit` };
|
|
222
|
+
}
|
|
223
|
+
let text;
|
|
224
|
+
try {
|
|
225
|
+
text = new TextDecoder('utf-8', { fatal: true }).decode(bytes);
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
return { ok: false, reason: 'malformed-utf8', detail: 'the bytes are not well-formed UTF-8' };
|
|
229
|
+
}
|
|
230
|
+
let value;
|
|
231
|
+
try {
|
|
232
|
+
value = JSON.parse(text);
|
|
233
|
+
}
|
|
234
|
+
catch (cause) {
|
|
235
|
+
return { ok: false, reason: 'malformed-json', detail: cause instanceof Error ? cause.message : String(cause) };
|
|
236
|
+
}
|
|
237
|
+
const transport = inspectTransport(text, limits.maxJsonDepth);
|
|
238
|
+
if (transport != null)
|
|
239
|
+
return { ok: false, ...transport };
|
|
240
|
+
if (value == null || typeof value !== 'object' || Array.isArray(value)) {
|
|
241
|
+
return { ok: false, reason: 'not-an-object', detail: 'an EPCIS source is a JSON object' };
|
|
242
|
+
}
|
|
243
|
+
const document = value;
|
|
244
|
+
const findings = [];
|
|
245
|
+
const digest = sha256Hex(bytes);
|
|
246
|
+
const context = { events: [] };
|
|
247
|
+
if (document['@context'] !== undefined)
|
|
248
|
+
context.document = document['@context'];
|
|
249
|
+
let envelope;
|
|
250
|
+
let eventList;
|
|
251
|
+
let listPointer;
|
|
252
|
+
const type = document.type;
|
|
253
|
+
if (type === 'EPCISDocument' || type === 'EPCISQueryDocument') {
|
|
254
|
+
const body = document.epcisBody;
|
|
255
|
+
const header = document.epcisHeader;
|
|
256
|
+
envelope = {
|
|
257
|
+
type,
|
|
258
|
+
...(typeof document.schemaVersion === 'string' ? { schemaVersion: document.schemaVersion } : {}),
|
|
259
|
+
...(typeof document.creationDate === 'string' ? { creationDate: document.creationDate } : {}),
|
|
260
|
+
hasHeader: header != null && typeof header === 'object',
|
|
261
|
+
hasMasterData: header != null && typeof header === 'object' && header.epcisMasterData != null,
|
|
262
|
+
};
|
|
263
|
+
if (type === 'EPCISQueryDocument') {
|
|
264
|
+
const queryName = readPointer(document, '/epcisBody/queryResults/queryName');
|
|
265
|
+
if (typeof queryName === 'string')
|
|
266
|
+
envelope.queryName = queryName;
|
|
267
|
+
}
|
|
268
|
+
if (document['@context'] === undefined)
|
|
269
|
+
findings.push({ code: 'context-missing', path: '/@context', message: 'an EPCIS envelope declares its JSON-LD context', severity: 'error' });
|
|
270
|
+
if (typeof document.schemaVersion !== 'string')
|
|
271
|
+
findings.push({ code: 'schema-version-missing', path: '/schemaVersion', message: 'the envelope names no schemaVersion', severity: type === 'EPCISDocument' ? 'error' : 'warning' });
|
|
272
|
+
else if (!/^2(\.\d+)*$/.test(document.schemaVersion))
|
|
273
|
+
findings.push({ code: 'schema-version-unsupported', path: '/schemaVersion', message: `schemaVersion ${document.schemaVersion} is not EPCIS 2; this profile reads 2.0.1`, severity: 'error' });
|
|
274
|
+
if (body == null || typeof body !== 'object') {
|
|
275
|
+
findings.push({ code: 'body-missing', path: '/epcisBody', message: 'the envelope carries no epcisBody', severity: 'error' });
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
listPointer = EVENT_LIST_POINTERS[type];
|
|
279
|
+
eventList = readPointer(document, listPointer);
|
|
280
|
+
if (!Array.isArray(eventList)) {
|
|
281
|
+
findings.push({ code: 'event-list-missing', path: listPointer, message: 'no eventList array at the position the envelope type defines', severity: 'error' });
|
|
282
|
+
eventList = undefined;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
else if (options.singleEvent != null && typeof type === 'string' && EPCIS_EVENT_TYPES.includes(type)) {
|
|
287
|
+
envelope = { type: options.singleEvent.envelopeType, hasHeader: false, hasMasterData: false };
|
|
288
|
+
context.document = options.singleEvent.contextDeclarations;
|
|
289
|
+
eventList = [document];
|
|
290
|
+
listPointer = '';
|
|
291
|
+
findings.push({ code: 'single-event', path: '', message: 'a bare event accepted under caller-supplied envelope facts; the source is the event alone', severity: 'info' });
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
findings.push({ code: 'envelope-unrecognised', path: '/type', message: `type ${JSON.stringify(type)} is neither EPCISDocument nor EPCISQueryDocument`, severity: 'error' });
|
|
295
|
+
}
|
|
296
|
+
const events = [];
|
|
297
|
+
if (Array.isArray(eventList)) {
|
|
298
|
+
if (eventList.length > limits.maxEventsPerPage) {
|
|
299
|
+
return { ok: false, reason: 'too-many-events', detail: `${eventList.length} events exceeds the ${limits.maxEventsPerPage} events per document or page limit; a larger source is split or the limit is explicitly raised` };
|
|
300
|
+
}
|
|
301
|
+
eventList.forEach((event, index) => {
|
|
302
|
+
const pointer = listPointer === '' ? '' : `${listPointer}/${index}`;
|
|
303
|
+
if (event == null || typeof event !== 'object' || Array.isArray(event)) {
|
|
304
|
+
findings.push({ code: 'event-not-object', path: pointer, message: 'an event is a JSON object', severity: 'error' });
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
const record = event;
|
|
308
|
+
const eventType = typeof record.type === 'string' ? record.type : '';
|
|
309
|
+
if (eventType === '')
|
|
310
|
+
findings.push({ code: 'event-type-missing', path: `${pointer}/type`, message: 'an event names its type', severity: 'error' });
|
|
311
|
+
else if (!EPCIS_EVENT_TYPES.includes(eventType))
|
|
312
|
+
findings.push({ code: 'event-type-unsupported', path: `${pointer}/type`, message: `${eventType} is an extension event type this profile retains without interpreting`, severity: 'warning' });
|
|
313
|
+
if (record['@context'] !== undefined)
|
|
314
|
+
context.events.push({ pointer, context: record['@context'] });
|
|
315
|
+
const eventId = typeof record.eventID === 'string' && record.eventID !== '' ? record.eventID : undefined;
|
|
316
|
+
events.push(eventId != null
|
|
317
|
+
? { pointer, index, type: eventType, eventId, identityKind: 'event-id' }
|
|
318
|
+
: { pointer, index, type: eventType, localIdentity: localEventIdentity(digest, pointer), identityKind: 'local' });
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
const seen = new Map();
|
|
322
|
+
for (const event of events) {
|
|
323
|
+
if (event.eventId == null)
|
|
324
|
+
continue;
|
|
325
|
+
const earlier = seen.get(event.eventId);
|
|
326
|
+
if (earlier != null)
|
|
327
|
+
findings.push({ code: 'event-id-repeated', path: event.pointer, message: `eventID ${event.eventId} also appears at ${earlier}; the two bodies are compared by digest, never merged`, severity: 'warning' });
|
|
328
|
+
else
|
|
329
|
+
seen.set(event.eventId, event.pointer);
|
|
330
|
+
}
|
|
331
|
+
return { ok: true, retained: true, sha256: digest, byteLength: bytes.byteLength, mediaType, document, ...(envelope == null ? {} : { envelope }), context, events, findings };
|
|
332
|
+
}
|
|
333
|
+
/* ------------------------------ identities ------------------------------ */
|
|
334
|
+
/** The local ingestion identity of an event that carries no eventID: derived from the source digest and the event's pointer, labelled local, never written into the source. */
|
|
335
|
+
export function localEventIdentity(sourceSha256, pointer) {
|
|
336
|
+
if (!/^[0-9a-f]{64}$/.test(sourceSha256))
|
|
337
|
+
throw new Error('a source digest is 64 lower-case hex characters');
|
|
338
|
+
return `urn:bsv:dpp:epcis:local-event:sha256:${sha256Hex(`${sourceSha256}#${pointer}`)}`;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* The canonical event-body digest a duplicate or a conflict is decided by:
|
|
342
|
+
* RFC 8785 over the event without its repository `recordTime` and its
|
|
343
|
+
* `errorDeclaration`, beside the sorted digests of the contexts it was read
|
|
344
|
+
* under, then SHA-256. Two formattings of one event digest the same; two
|
|
345
|
+
* JSON-LD spellings of one meaning do not, and are not promised to.
|
|
346
|
+
*/
|
|
347
|
+
export function epcisEventBodyDigest(event, contextDigests) {
|
|
348
|
+
const { recordTime: _recordTime, errorDeclaration: _errorDeclaration, ...body } = event;
|
|
349
|
+
for (const digest of contextDigests)
|
|
350
|
+
if (!/^[0-9a-f]{64}$/.test(digest))
|
|
351
|
+
throw new Error('a context digest is 64 lower-case hex characters');
|
|
352
|
+
return sha256Hex(canonicalizeJcs({ event: body, contexts: [...contextDigests].sort() }));
|
|
353
|
+
}
|
|
354
|
+
const PINNED_CONTEXTS = new Map([[EPCIS_CONTEXT_IRI, EPCIS_CONTEXT_DIGEST]]);
|
|
355
|
+
export function contextReferences(declaration) {
|
|
356
|
+
const entries = declaration === undefined ? [] : Array.isArray(declaration) ? declaration : [declaration];
|
|
357
|
+
return entries.map((entry) => {
|
|
358
|
+
if (typeof entry === 'string') {
|
|
359
|
+
const digest = PINNED_CONTEXTS.get(entry);
|
|
360
|
+
return digest == null ? { kind: 'iri', value: entry, pinned: false } : { kind: 'iri', value: entry, digest, pinned: true };
|
|
361
|
+
}
|
|
362
|
+
const digest = sha256Hex(canonicalizeJcs(entry));
|
|
363
|
+
return { kind: 'inline', value: `urn:bsv:dpp:epcis:inline-context:sha256:${digest}`, digest, pinned: true };
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
/** The digests of every pinned context in a declaration; an unpinned IRI contributes nothing and is reported by the caller as a gap. */
|
|
367
|
+
export function pinnedContextDigests(declaration) {
|
|
368
|
+
const refs = contextReferences(declaration);
|
|
369
|
+
return { digests: refs.flatMap((r) => (r.digest == null ? [] : [r.digest])), unpinned: refs.filter((r) => !r.pinned).map((r) => r.value) };
|
|
370
|
+
}
|
|
371
|
+
export function epcisSourceReference(input) {
|
|
372
|
+
if (!/^[0-9a-f]{64}$/.test(input.sourceSha256))
|
|
373
|
+
throw new Error('a source digest is 64 lower-case hex characters');
|
|
374
|
+
if (!EPCIS_MEDIA_TYPES.includes(mediaTypeBase(input.mediaType)))
|
|
375
|
+
throw new Error('the source media type is one the profile accepts');
|
|
376
|
+
return {
|
|
377
|
+
vocabularyUrn: EPCIS_SOURCE_VOCABULARY,
|
|
378
|
+
sourceDigest: input.sourceSha256,
|
|
379
|
+
mediaType: mediaTypeBase(input.mediaType),
|
|
380
|
+
eventPointer: input.pointer,
|
|
381
|
+
...(input.eventId == null ? {} : { eventId: input.eventId }),
|
|
382
|
+
contextDigests: [...input.contextDigests].sort(),
|
|
383
|
+
mappingProfile: input.mappingProfile ?? EPCIS_MAPPING_PROFILE,
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
/** The source reference a mapped SEAL carries, or undefined when it carries none. Reading it does not verify the credential. */
|
|
387
|
+
export function readEpcisSourceReference(seal) {
|
|
388
|
+
const value = seal.extensions?.['+Dn']?.[EPCIS_SOURCE_VOCABULARY];
|
|
389
|
+
if (value == null || typeof value !== 'object' || Array.isArray(value))
|
|
390
|
+
return undefined;
|
|
391
|
+
const ref = value;
|
|
392
|
+
if (ref.vocabularyUrn !== EPCIS_SOURCE_VOCABULARY || typeof ref.sourceDigest !== 'string' || typeof ref.eventPointer !== 'string' || !Array.isArray(ref.contextDigests))
|
|
393
|
+
return undefined;
|
|
394
|
+
return ref;
|
|
395
|
+
}
|
|
396
|
+
const URI = /^[A-Za-z][A-Za-z0-9+.-]*:[^\s]+$/;
|
|
397
|
+
function checkDigit(digits) {
|
|
398
|
+
let sum = 0;
|
|
399
|
+
let weight = 3;
|
|
400
|
+
for (let i = digits.length - 1; i >= 0; i--) {
|
|
401
|
+
sum += Number(digits[i]) * weight;
|
|
402
|
+
weight = weight === 3 ? 1 : 3;
|
|
403
|
+
}
|
|
404
|
+
return (10 - (sum % 10)) % 10;
|
|
405
|
+
}
|
|
406
|
+
/** A GTIN-14 from an SGTIN or LGTIN URN's company prefix and item reference (indicator digit first), with the check digit computed. */
|
|
407
|
+
function gtinFromUrn(companyPrefix, itemReference) {
|
|
408
|
+
if (!/^\d{6,12}$/.test(companyPrefix) || !/^\d+$/.test(itemReference) || companyPrefix.length + itemReference.length !== 13)
|
|
409
|
+
return undefined;
|
|
410
|
+
const indicator = itemReference[0];
|
|
411
|
+
const thirteen = indicator + companyPrefix + itemReference.slice(1);
|
|
412
|
+
return thirteen + String(checkDigit(thirteen));
|
|
413
|
+
}
|
|
414
|
+
/** Classify one identifier without rewriting it; a claimed GS1 identifier is checked against the grammar, anything else keeps its declared scheme. */
|
|
415
|
+
export function classifyEpcisIdentifier(path, value) {
|
|
416
|
+
if (typeof value !== 'string' || !URI.test(value))
|
|
417
|
+
return { path, value: String(value), scheme: 'other', problem: 'not a URI' };
|
|
418
|
+
const sgtin = /^urn:epc:id:sgtin:(\d+)\.(\d+)\.(.+)$/.exec(value);
|
|
419
|
+
if (sgtin != null) {
|
|
420
|
+
const gtin = gtinFromUrn(sgtin[1], sgtin[2]);
|
|
421
|
+
return gtin == null ? { path, value, scheme: 'gs1-sgtin', problem: 'company prefix and item reference do not total thirteen digits' } : { path, value, scheme: 'gs1-sgtin', gtin, serial: sgtin[3], checkDigitValid: true };
|
|
422
|
+
}
|
|
423
|
+
const lgtin = /^urn:epc:class:lgtin:(\d+)\.(\d+)\.(.+)$/.exec(value);
|
|
424
|
+
if (lgtin != null) {
|
|
425
|
+
const gtin = gtinFromUrn(lgtin[1], lgtin[2]);
|
|
426
|
+
return gtin == null ? { path, value, scheme: 'gs1-lgtin', problem: 'company prefix and item reference do not total thirteen digits' } : { path, value, scheme: 'gs1-lgtin', gtin, lot: lgtin[3], checkDigitValid: true };
|
|
427
|
+
}
|
|
428
|
+
const pattern = /^urn:epc:idpat:sgtin:(\d+)\.(\d+)\.\*$/.exec(value);
|
|
429
|
+
if (pattern != null) {
|
|
430
|
+
const gtin = gtinFromUrn(pattern[1], pattern[2]);
|
|
431
|
+
return gtin == null ? { path, value, scheme: 'gs1-sgtin-pattern', problem: 'company prefix and item reference do not total thirteen digits' } : { path, value, scheme: 'gs1-sgtin-pattern', gtin, checkDigitValid: true };
|
|
432
|
+
}
|
|
433
|
+
if (/^urn:epc:/.test(value))
|
|
434
|
+
return { path, value, scheme: 'epc-other' };
|
|
435
|
+
const link = /^https?:\/\/[^/]+(?:\/[^/?#]+)*?\/01\/([^/?#]+)((?:\/[^/?#]+\/[^/?#]+)*)/.exec(value);
|
|
436
|
+
if (link != null) {
|
|
437
|
+
const gtinRaw = link[1];
|
|
438
|
+
if (!/^(\d{8}|\d{12,14})$/.test(gtinRaw))
|
|
439
|
+
return { path, value, scheme: 'gs1-digital-link', problem: 'application identifier 01 carries 8, 12, 13 or 14 digits' };
|
|
440
|
+
const finding = { path, value, scheme: 'gs1-digital-link', gtin: gtinRaw.padStart(14, '0'), checkDigitValid: checkDigit(gtinRaw.slice(0, -1)) === Number(gtinRaw.at(-1)) };
|
|
441
|
+
const qualifiers = (link[2] ?? '').split('/').filter((s) => s !== '');
|
|
442
|
+
for (let i = 0; i + 1 < qualifiers.length; i += 2) {
|
|
443
|
+
const ai = qualifiers[i];
|
|
444
|
+
const qualifier = decodeURIComponent(qualifiers[i + 1]);
|
|
445
|
+
if (ai === '21')
|
|
446
|
+
finding.serial = qualifier;
|
|
447
|
+
else if (ai === '10')
|
|
448
|
+
finding.lot = qualifier;
|
|
449
|
+
}
|
|
450
|
+
if (!finding.checkDigitValid)
|
|
451
|
+
finding.problem = 'the GTIN check digit does not hold';
|
|
452
|
+
return finding;
|
|
453
|
+
}
|
|
454
|
+
return { path, value, scheme: 'other' };
|
|
455
|
+
}
|
|
456
|
+
const COMMON_EVENT_KEYS = ['@context', 'type', 'eventTime', 'recordTime', 'eventTimeZoneOffset', 'eventID', 'certificationInfo', 'errorDeclaration'];
|
|
457
|
+
const EVENT_KEYS = {
|
|
458
|
+
ObjectEvent: ['action', 'epcList', 'quantityList', 'bizStep', 'disposition', 'persistentDisposition', 'readPoint', 'bizLocation', 'bizTransactionList', 'sourceList', 'destinationList', 'sensorElementList', 'ilmd'],
|
|
459
|
+
AggregationEvent: ['parentID', 'childEPCs', 'childQuantityList', 'action', 'bizStep', 'disposition', 'persistentDisposition', 'readPoint', 'bizLocation', 'bizTransactionList', 'sourceList', 'destinationList', 'sensorElementList'],
|
|
460
|
+
TransactionEvent: ['bizTransactionList', 'parentID', 'epcList', 'quantityList', 'action', 'bizStep', 'disposition', 'persistentDisposition', 'readPoint', 'bizLocation', 'sourceList', 'destinationList', 'sensorElementList'],
|
|
461
|
+
TransformationEvent: ['inputEPCList', 'inputQuantityList', 'outputEPCList', 'outputQuantityList', 'transformationID', 'bizStep', 'disposition', 'persistentDisposition', 'readPoint', 'bizLocation', 'bizTransactionList', 'sourceList', 'destinationList', 'sensorElementList', 'ilmd'],
|
|
462
|
+
AssociationEvent: ['parentID', 'childEPCs', 'childQuantityList', 'action', 'bizStep', 'disposition', 'persistentDisposition', 'readPoint', 'bizLocation', 'bizTransactionList', 'sourceList', 'destinationList', 'sensorElementList'],
|
|
463
|
+
};
|
|
464
|
+
const DOCUMENT_KEYS = ['@context', 'id', 'type', 'schemaVersion', 'creationDate', 'instanceIdentifier', 'sender', 'receiver', 'epcisHeader', 'epcisBody'];
|
|
465
|
+
/** The members of an event the schema does not name for its type: retained as given, never interpreted here. */
|
|
466
|
+
export function preservedEventExtensions(event) {
|
|
467
|
+
const known = new Set([...COMMON_EVENT_KEYS, ...(EVENT_KEYS[String(event.type)] ?? [])]);
|
|
468
|
+
return Object.keys(event).filter((key) => !known.has(key));
|
|
469
|
+
}
|
|
470
|
+
const ID_LIST_KEYS = ['epcList', 'childEPCs', 'inputEPCList', 'outputEPCList'];
|
|
471
|
+
const QUANTITY_LIST_KEYS = ['quantityList', 'childQuantityList', 'inputQuantityList', 'outputQuantityList'];
|
|
472
|
+
/** Every identifier an event names, classified in place. */
|
|
473
|
+
export function eventIdentifiers(event, pointer = '') {
|
|
474
|
+
const found = [];
|
|
475
|
+
for (const key of ID_LIST_KEYS) {
|
|
476
|
+
const list = event[key];
|
|
477
|
+
if (Array.isArray(list))
|
|
478
|
+
list.forEach((value, i) => found.push(classifyEpcisIdentifier(`${pointer}/${key}/${i}`, value)));
|
|
479
|
+
}
|
|
480
|
+
if (event.parentID !== undefined)
|
|
481
|
+
found.push(classifyEpcisIdentifier(`${pointer}/parentID`, event.parentID));
|
|
482
|
+
for (const key of QUANTITY_LIST_KEYS) {
|
|
483
|
+
const list = event[key];
|
|
484
|
+
if (Array.isArray(list))
|
|
485
|
+
list.forEach((element, i) => { if (element != null && typeof element === 'object')
|
|
486
|
+
found.push(classifyEpcisIdentifier(`${pointer}/${key}/${i}/epcClass`, element.epcClass)); });
|
|
487
|
+
}
|
|
488
|
+
return found;
|
|
489
|
+
}
|
|
490
|
+
let compiledSchema;
|
|
491
|
+
function schemaValidator() {
|
|
492
|
+
if (compiledSchema == null) {
|
|
493
|
+
const schema = JSON.parse(readFileSync(new URL('../artifacts/epcis/epcis-json-schema-2.0.1.json', import.meta.url), 'utf8'));
|
|
494
|
+
const ajv = new Ajv({ allErrors: true, strict: false });
|
|
495
|
+
addFormats(ajv);
|
|
496
|
+
compiledSchema = ajv.compile(schema);
|
|
497
|
+
}
|
|
498
|
+
return compiledSchema;
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Validate a safely parsed document against the pinned EPCIS 2.0.1 schema
|
|
502
|
+
* and the profile's identifier rules. Every finding names its path; nothing
|
|
503
|
+
* is repaired. `schema` says whether the pinned schema accepted the whole
|
|
504
|
+
* document; the identifier findings are independent of it, so a document
|
|
505
|
+
* the schema rejects still has its identifiers read.
|
|
506
|
+
*/
|
|
507
|
+
export function validateEpcisDocument(document, options = {}) {
|
|
508
|
+
const validate = schemaValidator();
|
|
509
|
+
const findings = [];
|
|
510
|
+
const passed = validate(document);
|
|
511
|
+
for (const error of validate.errors ?? []) {
|
|
512
|
+
findings.push({ code: `schema:${error.keyword}`, path: error.instancePath || '/', message: `${error.message ?? 'invalid'} (${error.schemaPath})`, severity: 'error' });
|
|
513
|
+
}
|
|
514
|
+
const type = document.type;
|
|
515
|
+
const events = [];
|
|
516
|
+
const pointers = options.events ?? (type === 'EPCISDocument' || type === 'EPCISQueryDocument'
|
|
517
|
+
? (readPointer(document, EVENT_LIST_POINTERS[type]) ?? []).map((_, index) => ({ pointer: `${EVENT_LIST_POINTERS[type]}/${index}` }))
|
|
518
|
+
: []);
|
|
519
|
+
for (const { pointer } of pointers) {
|
|
520
|
+
const event = readPointer(document, pointer);
|
|
521
|
+
if (event == null || typeof event !== 'object' || Array.isArray(event))
|
|
522
|
+
continue;
|
|
523
|
+
const record = event;
|
|
524
|
+
const identifiers = eventIdentifiers(record, pointer);
|
|
525
|
+
for (const id of identifiers) {
|
|
526
|
+
if (id.problem != null)
|
|
527
|
+
findings.push({ code: 'identifier', path: id.path, message: `${id.value}: ${id.problem}`, severity: id.problem === 'not a URI' ? 'error' : 'warning' });
|
|
528
|
+
}
|
|
529
|
+
const declaration = record.errorDeclaration;
|
|
530
|
+
const entry = { pointer, type: String(record.type ?? ''), identifiers, preservedExtensions: preservedEventExtensions(record) };
|
|
531
|
+
if (declaration != null && typeof declaration === 'object') {
|
|
532
|
+
const d = declaration;
|
|
533
|
+
entry.errorDeclaration = {
|
|
534
|
+
...(typeof d.declarationTime === 'string' ? { declarationTime: d.declarationTime } : {}),
|
|
535
|
+
...(typeof d.reason === 'string' ? { reason: d.reason } : {}),
|
|
536
|
+
correctiveEventIDs: Array.isArray(d.correctiveEventIDs) ? d.correctiveEventIDs.filter((v) => typeof v === 'string') : [],
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
events.push(entry);
|
|
540
|
+
}
|
|
541
|
+
const preservedExtensions = type === 'EPCISDocument' || type === 'EPCISQueryDocument' ? Object.keys(document).filter((key) => !DOCUMENT_KEYS.includes(key)) : [];
|
|
542
|
+
return { schema: passed ? 'pass' : 'fail', findings, events, preservedExtensions };
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* How a newly arrived event relates to one already held under the same
|
|
546
|
+
* scoped identity. Equal bodies with equal repository observations are a
|
|
547
|
+
* duplicate; equal bodies with a changed recordTime or error declaration
|
|
548
|
+
* are a further observation of the same event, never permission to
|
|
549
|
+
* overwrite it; different bodies are a conflict that stays visible until it
|
|
550
|
+
* is explicitly resolved.
|
|
551
|
+
*/
|
|
552
|
+
export function classifyEventArrival(existing, incoming) {
|
|
553
|
+
if (existing.identity !== incoming.identity)
|
|
554
|
+
throw new Error('arrival is classified within one scoped event identity');
|
|
555
|
+
if (existing.bodyDigest !== incoming.bodyDigest)
|
|
556
|
+
return 'conflict';
|
|
557
|
+
const sameRecordTime = (existing.recordTime ?? null) === (incoming.recordTime ?? null);
|
|
558
|
+
const sameDeclaration = canonicalizeJcs(existing.errorDeclaration ?? null) === canonicalizeJcs(incoming.errorDeclaration ?? null);
|
|
559
|
+
return sameRecordTime && sameDeclaration ? 'duplicate' : 'new-observation';
|
|
560
|
+
}
|
|
561
|
+
/** The corrective event references an error declaration names that the supplied set of held identities does not contain: unresolved, never silently resolved. */
|
|
562
|
+
export function unresolvedCorrections(validation, heldIdentities) {
|
|
563
|
+
const out = [];
|
|
564
|
+
for (const event of validation.events) {
|
|
565
|
+
if (event.errorDeclaration == null)
|
|
566
|
+
continue;
|
|
567
|
+
const missing = event.errorDeclaration.correctiveEventIDs.filter((id) => !heldIdentities.has(id));
|
|
568
|
+
if (event.errorDeclaration.correctiveEventIDs.length === 0 || missing.length > 0)
|
|
569
|
+
out.push({ pointer: event.pointer, missing });
|
|
570
|
+
}
|
|
571
|
+
return out;
|
|
572
|
+
}
|
|
573
|
+
//# sourceMappingURL=epcis-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"epcis-source.js","sourceRoot":"","sources":["../src/epcis-source.ts"],"names":[],"mappings":"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"}
|