@researchdatabox/sails-hook-redbox-storage-mongo 5.0.4-beta.12498 → 5.0.5

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.
@@ -1,258 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RecordSchemaPersistenceError = exports.RECORD_SCHEMA_STORAGE_CODES = exports.RECORD_SCHEMA_REFERENCE_QUERY_LIMIT_MAX = void 0;
4
- exports.validateRecordSchemaDigest = validateRecordSchemaDigest;
5
- exports.validateRecordSchemaArtifactInput = validateRecordSchemaArtifactInput;
6
- exports.validateRecordSchemaReferenceInput = validateRecordSchemaReferenceInput;
7
- exports.artifactContentIdentity = artifactContentIdentity;
8
- exports.referenceContentIdentity = referenceContentIdentity;
9
- exports.artifactModelFromDocument = artifactModelFromDocument;
10
- exports.referenceModelFromDocument = referenceModelFromDocument;
11
- exports.isDuplicateKeyError = isDuplicateKeyError;
12
- const redbox_core_1 = require("@researchdatabox/redbox-core");
13
- const RecordSchemaArtifact_1 = require("../models/RecordSchemaArtifact");
14
- const RecordSchemaReference_1 = require("../models/RecordSchemaReference");
15
- exports.RECORD_SCHEMA_REFERENCE_QUERY_LIMIT_MAX = 1_000;
16
- exports.RECORD_SCHEMA_STORAGE_CODES = {
17
- INVALID_ARTIFACT: redbox_core_1.RECORD_SCHEMA_PROBLEM_CODES.INVALID_CONTRACT,
18
- DIGEST_COLLISION: redbox_core_1.RECORD_SCHEMA_PROBLEM_CODES.DIGEST_COLLISION,
19
- INVALID_REFERENCE: 'record-schema.reference-invalid',
20
- REFERENCE_KEY_COLLISION: 'record-schema.reference-key-collision',
21
- ARTIFACT_NOT_FOUND: 'record-schema.artifact-not-found',
22
- STORAGE_FAILED: redbox_core_1.RECORD_SCHEMA_PROBLEM_CODES.STORAGE_UNAVAILABLE,
23
- };
24
- class RecordSchemaPersistenceError extends Error {
25
- code;
26
- constructor(code, message) {
27
- super(message);
28
- this.code = code;
29
- this.name = 'RecordSchemaPersistenceError';
30
- }
31
- }
32
- exports.RecordSchemaPersistenceError = RecordSchemaPersistenceError;
33
- function invalidArtifact(message) {
34
- throw new RecordSchemaPersistenceError(exports.RECORD_SCHEMA_STORAGE_CODES.INVALID_ARTIFACT, message);
35
- }
36
- function invalidReference(message) {
37
- throw new RecordSchemaPersistenceError(exports.RECORD_SCHEMA_STORAGE_CODES.INVALID_REFERENCE, message);
38
- }
39
- function isContractJsonObject(value) {
40
- return value !== null && typeof value === 'object' && !Array.isArray(value);
41
- }
42
- function validateRecordSchemaDigest(digest) {
43
- if (typeof digest !== 'string' || !RecordSchemaArtifact_1.RECORD_SCHEMA_DIGEST_PATTERN.test(digest)) {
44
- return invalidArtifact('Record schema artifact digest must be lowercase SHA-256 hex.');
45
- }
46
- return digest;
47
- }
48
- function validateRecordSchemaArtifactInput(input) {
49
- if (!input || typeof input !== 'object') {
50
- return invalidArtifact('Record schema artifact input is required.');
51
- }
52
- const digest = validateRecordSchemaDigest(input.digest);
53
- if (input.contractFormat !== redbox_core_1.RECORD_CONTRACT_FORMAT_V1) {
54
- return invalidArtifact('Record schema artifact contract format is unsupported.');
55
- }
56
- if (input.completeness !== 'complete' && input.completeness !== 'partial') {
57
- return invalidArtifact('Record schema artifact completeness is invalid.');
58
- }
59
- if (!Number.isSafeInteger(input.byteLength) || input.byteLength <= 0) {
60
- return invalidArtifact('Record schema artifact byte length must be a positive safe integer.');
61
- }
62
- let document;
63
- try {
64
- document = (0, redbox_core_1.normalizeRedboxCanonicalJsonV1)(input.document);
65
- }
66
- catch {
67
- return invalidArtifact('Record schema artifacts must contain only canonical JSON values.');
68
- }
69
- if (!isContractJsonObject(document)) {
70
- return invalidArtifact('Record schema artifact document must be a JSON object.');
71
- }
72
- const serializedDocument = JSON.stringify(document);
73
- if (Buffer.byteLength(serializedDocument, 'utf8') !== input.byteLength) {
74
- return invalidArtifact('Record schema artifact byte length does not match its JSON document.');
75
- }
76
- return {
77
- digest,
78
- document,
79
- contractFormat: input.contractFormat,
80
- completeness: input.completeness,
81
- byteLength: input.byteLength,
82
- serializedDocument,
83
- };
84
- }
85
- function requiredNormalizedString(value, field, maximumLength = 512) {
86
- if (typeof value !== 'string' || value.length === 0 || value !== value.trim()) {
87
- return invalidReference(`Record schema reference ${field} must be a normalized non-empty string.`);
88
- }
89
- if (value.length > maximumLength) {
90
- return invalidReference(`Record schema reference ${field} exceeds its storage limit.`);
91
- }
92
- return value;
93
- }
94
- function optionalDate(value, field) {
95
- if (value === undefined) {
96
- return undefined;
97
- }
98
- if (!(value instanceof Date) || Number.isNaN(value.getTime())) {
99
- return invalidReference(`Record schema reference ${field} must be a valid Date.`);
100
- }
101
- return new Date(value.getTime());
102
- }
103
- function validateRecordSchemaReferenceInput(input) {
104
- if (!input || typeof input !== 'object') {
105
- return invalidReference('Record schema reference input is required.');
106
- }
107
- const referenceKey = requiredNormalizedString(Reflect.get(input, 'referenceKey'), 'referenceKey');
108
- if (!RecordSchemaReference_1.RECORD_SCHEMA_REFERENCE_KEY_PATTERN.test(referenceKey)) {
109
- return invalidReference('Record schema reference key contains unsupported characters.');
110
- }
111
- const digest = requiredNormalizedString(Reflect.get(input, 'digest'), 'digest', 64);
112
- if (!RecordSchemaArtifact_1.RECORD_SCHEMA_DIGEST_PATTERN.test(digest)) {
113
- return invalidReference('Record schema reference digest must be lowercase SHA-256 hex.');
114
- }
115
- const brand = requiredNormalizedString(Reflect.get(input, 'brand'), 'brand');
116
- const portal = requiredNormalizedString(Reflect.get(input, 'portal'), 'portal');
117
- const recordType = requiredNormalizedString(Reflect.get(input, 'recordType'), 'recordType');
118
- const operation = requiredNormalizedString(Reflect.get(input, 'operation'), 'operation');
119
- const schemaKind = Reflect.get(input, 'schemaKind');
120
- if (schemaKind !== 'create' && schemaKind !== 'update') {
121
- return invalidReference('Record schema reference schemaKind is invalid.');
122
- }
123
- const kind = Reflect.get(input, 'kind');
124
- const oid = Reflect.get(input, 'oid');
125
- const owner = Reflect.get(input, 'owner');
126
- const purpose = Reflect.get(input, 'purpose');
127
- const expiresAt = Reflect.get(input, 'expiresAt');
128
- const common = {
129
- referenceKey,
130
- digest,
131
- brand,
132
- portal,
133
- recordType,
134
- operation,
135
- };
136
- if (kind === 'grant') {
137
- if (owner !== undefined || purpose !== undefined || expiresAt !== undefined) {
138
- return invalidReference('Record schema grant references cannot contain pin fields.');
139
- }
140
- if (schemaKind === 'create') {
141
- if (oid !== undefined) {
142
- return invalidReference('Record schema create grants cannot contain an OID.');
143
- }
144
- return { ...common, kind: 'grant', schemaKind: 'create' };
145
- }
146
- return {
147
- ...common,
148
- kind: 'grant',
149
- schemaKind: 'update',
150
- oid: requiredNormalizedString(oid, 'oid'),
151
- };
152
- }
153
- if (kind === 'save') {
154
- if (owner !== undefined || purpose !== undefined || expiresAt !== undefined) {
155
- return invalidReference('Record schema save references cannot contain pin fields.');
156
- }
157
- return {
158
- ...common,
159
- kind: 'save',
160
- schemaKind,
161
- oid: requiredNormalizedString(oid, 'oid'),
162
- };
163
- }
164
- if (kind === 'pin') {
165
- if (oid !== undefined) {
166
- return invalidReference('Record schema pin references cannot contain an OID.');
167
- }
168
- return {
169
- ...common,
170
- kind: 'pin',
171
- schemaKind,
172
- owner: requiredNormalizedString(owner, 'owner'),
173
- purpose: requiredNormalizedString(purpose, 'purpose', 2_048),
174
- expiresAt: optionalDate(expiresAt, 'expiresAt'),
175
- };
176
- }
177
- return invalidReference('Record schema reference kind is invalid.');
178
- }
179
- function dateValue(value, field) {
180
- const date = value instanceof Date ? value : new Date(String(value ?? ''));
181
- if (Number.isNaN(date.getTime())) {
182
- throw new RecordSchemaPersistenceError(exports.RECORD_SCHEMA_STORAGE_CODES.STORAGE_FAILED, `Stored record schema ${field} is invalid.`);
183
- }
184
- return date;
185
- }
186
- function artifactContentIdentity(artifact) {
187
- const validated = validateRecordSchemaArtifactInput(artifact);
188
- return JSON.stringify({
189
- byteLength: validated.byteLength,
190
- completeness: validated.completeness,
191
- contractFormat: validated.contractFormat,
192
- document: JSON.parse(validated.serializedDocument),
193
- });
194
- }
195
- function referenceContentIdentity(reference) {
196
- const validated = validateRecordSchemaReferenceInput(reference);
197
- const expiresAt = validated.kind === 'pin' ? validated.expiresAt?.toISOString() : undefined;
198
- return JSON.stringify({
199
- brand: validated.brand,
200
- digest: validated.digest,
201
- expiresAt,
202
- kind: validated.kind,
203
- oid: validated.kind === 'pin' || (validated.kind === 'grant' && validated.schemaKind === 'create')
204
- ? undefined
205
- : validated.oid,
206
- operation: validated.operation,
207
- owner: validated.kind === 'pin' ? validated.owner : undefined,
208
- portal: validated.portal,
209
- purpose: validated.kind === 'pin' ? validated.purpose : undefined,
210
- recordType: validated.recordType,
211
- referenceKey: validated.referenceKey,
212
- schemaKind: validated.schemaKind,
213
- });
214
- }
215
- function artifactModelFromDocument(document) {
216
- const validated = validateRecordSchemaArtifactInput({
217
- digest: document.digest,
218
- document: document.document,
219
- contractFormat: document.contractFormat,
220
- completeness: document.completeness,
221
- byteLength: document.byteLength,
222
- });
223
- return {
224
- digest: validated.digest,
225
- document: validated.document,
226
- contractFormat: validated.contractFormat,
227
- completeness: validated.completeness,
228
- byteLength: validated.byteLength,
229
- createdAt: dateValue(document.createdAt, 'artifact createdAt'),
230
- updatedAt: dateValue(document.updatedAt, 'artifact updatedAt'),
231
- lastAccessedAt: document.lastAccessedAt === undefined ? undefined : dateValue(document.lastAccessedAt, 'artifact lastAccessedAt'),
232
- };
233
- }
234
- function referenceModelFromDocument(document) {
235
- const reference = validateRecordSchemaReferenceInput({
236
- referenceKey: document.referenceKey,
237
- digest: document.digest,
238
- kind: document.kind,
239
- brand: document.brand,
240
- portal: document.portal,
241
- schemaKind: document.schemaKind,
242
- recordType: document.recordType,
243
- oid: document.oid,
244
- operation: document.operation,
245
- owner: document.owner,
246
- purpose: document.purpose,
247
- expiresAt: document.expiresAt,
248
- });
249
- return {
250
- ...reference,
251
- createdAt: dateValue(document.createdAt, 'reference createdAt'),
252
- updatedAt: dateValue(document.updatedAt, 'reference updatedAt'),
253
- };
254
- }
255
- function isDuplicateKeyError(error) {
256
- return typeof error === 'object' && error !== null && Reflect.get(error, 'code') === 11000;
257
- }
258
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkU2NoZW1hUGVyc2lzdGVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcmVjb3JkU2NoZW1hUGVyc2lzdGVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBeURBLGdFQUtDO0FBRUQsOEVBcUNDO0FBc0JELGdGQTZFQztBQWFELDBEQVFDO0FBRUQsNERBb0JDO0FBRUQsOERBbUJDO0FBRUQsZ0VBb0JDO0FBRUQsa0RBRUM7QUFsU0QsOERBSXNDO0FBV3RDLHlFQUE4RTtBQUM5RSwyRUFBc0Y7QUFFekUsUUFBQSx1Q0FBdUMsR0FBRyxLQUFLLENBQUM7QUFFaEQsUUFBQSwyQkFBMkIsR0FBRztJQUN6QyxnQkFBZ0IsRUFBRSx5Q0FBMkIsQ0FBQyxnQkFBZ0I7SUFDOUQsZ0JBQWdCLEVBQUUseUNBQTJCLENBQUMsZ0JBQWdCO0lBQzlELGlCQUFpQixFQUFFLGlDQUFpQztJQUNwRCx1QkFBdUIsRUFBRSx1Q0FBdUM7SUFDaEUsa0JBQWtCLEVBQUUsa0NBQWtDO0lBQ3RELGNBQWMsRUFBRSx5Q0FBMkIsQ0FBQyxtQkFBbUI7Q0FDdkQsQ0FBQztBQUlYLE1BQWEsNEJBQTZCLFNBQVEsS0FBSztJQUVuQztJQURsQixZQUNrQixJQUE2QixFQUM3QyxPQUFlO1FBRWYsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBSEMsU0FBSSxHQUFKLElBQUksQ0FBeUI7UUFJN0MsSUFBSSxDQUFDLElBQUksR0FBRyw4QkFBOEIsQ0FBQztJQUM3QyxDQUFDO0NBQ0Y7QUFSRCxvRUFRQztBQUVELFNBQVMsZUFBZSxDQUFDLE9BQWU7SUFDdEMsTUFBTSxJQUFJLDRCQUE0QixDQUFDLG1DQUEyQixDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hHLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLE9BQWU7SUFDdkMsTUFBTSxJQUFJLDRCQUE0QixDQUFDLG1DQUEyQixDQUFDLGlCQUFpQixFQUFF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