@squiz/db-lib 1.76.0 → 1.77.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/CHANGELOG.md +12 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.d.ts +1 -1
- package/lib/dynamodb/AbstractDynamoDbRepository.d.ts.map +1 -1
- package/lib/dynamodb/AbstractDynamoDbRepository.js +6 -5
- package/lib/dynamodb/AbstractDynamoDbRepository.js.map +1 -1
- package/lib/dynamodb/AbstractDynamoDbRepository.spec.d.ts.map +1 -1
- package/lib/dynamodb/AbstractDynamoDbRepository.spec.js +15 -14
- package/lib/dynamodb/AbstractDynamoDbRepository.spec.js.map +1 -1
- package/lib/dynamodb/getDynamoDbOptions.d.ts.map +1 -1
- package/lib/externalized/ExternalizedDynamoDbRepository.d.ts +166 -0
- package/lib/externalized/ExternalizedDynamoDbRepository.d.ts.map +1 -0
- package/lib/externalized/ExternalizedDynamoDbRepository.js +535 -0
- package/lib/externalized/ExternalizedDynamoDbRepository.js.map +1 -0
- package/lib/externalized/ExternalizedDynamoDbRepository.spec.d.ts +2 -0
- package/lib/externalized/ExternalizedDynamoDbRepository.spec.d.ts.map +1 -0
- package/lib/externalized/ExternalizedDynamoDbRepository.spec.js +431 -0
- package/lib/externalized/ExternalizedDynamoDbRepository.spec.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -0
- package/lib/index.js.map +1 -1
- package/lib/s3/S3ExternalStorage.d.ts +66 -0
- package/lib/s3/S3ExternalStorage.d.ts.map +1 -0
- package/lib/s3/S3ExternalStorage.js +84 -0
- package/lib/s3/S3ExternalStorage.js.map +1 -0
- package/lib/s3/S3ExternalStorage.spec.d.ts +12 -0
- package/lib/s3/S3ExternalStorage.spec.d.ts.map +1 -0
- package/lib/s3/S3ExternalStorage.spec.js +130 -0
- package/lib/s3/S3ExternalStorage.spec.js.map +1 -0
- package/package.json +7 -6
- package/src/dynamodb/AbstractDynamoDbRepository.spec.ts +2 -1
- package/src/dynamodb/AbstractDynamoDbRepository.ts +3 -1
- package/src/externalized/ExternalizedDynamoDbRepository.spec.ts +539 -0
- package/src/externalized/ExternalizedDynamoDbRepository.ts +625 -0
- package/src/index.ts +4 -0
- package/src/s3/S3ExternalStorage.spec.ts +181 -0
- package/src/s3/S3ExternalStorage.ts +118 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const ExternalizedDynamoDbRepository_1 = require("./ExternalizedDynamoDbRepository");
|
|
4
|
+
class TestItem {
|
|
5
|
+
constructor(input = {}) {
|
|
6
|
+
this.id = input.id || '';
|
|
7
|
+
this.name = input.name || '';
|
|
8
|
+
this.data = input.data || [];
|
|
9
|
+
// Note: storageLocation is intentionally not set from input to simulate model stripping it
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
// Test entity definition
|
|
13
|
+
const testEntityDefinition = {
|
|
14
|
+
keys: {
|
|
15
|
+
pk: {
|
|
16
|
+
attributeName: 'pk',
|
|
17
|
+
format: 'ITEM#${id}',
|
|
18
|
+
},
|
|
19
|
+
sk: {
|
|
20
|
+
attributeName: 'sk',
|
|
21
|
+
format: 'ITEM#${id}',
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
indexes: {},
|
|
25
|
+
fieldsAsJsonString: ['data'],
|
|
26
|
+
};
|
|
27
|
+
// Concrete test repository
|
|
28
|
+
class TestRepo extends ExternalizedDynamoDbRepository_1.ExternalizedDynamoDbRepository {
|
|
29
|
+
constructor(dbManager, storage, overrides = {}) {
|
|
30
|
+
super('test-table', dbManager, 'test_item', { ...testEntityDefinition, ...overrides }, TestItem, storage);
|
|
31
|
+
}
|
|
32
|
+
// Expose protected methods for testing
|
|
33
|
+
async testPrepareValueForStorage(value) {
|
|
34
|
+
return await this.prepareValueForStorage(value);
|
|
35
|
+
}
|
|
36
|
+
async testHydrateFromExternalStorage(record) {
|
|
37
|
+
return await this.hydrateFromExternalStorage(record);
|
|
38
|
+
}
|
|
39
|
+
testIsDynamoItemSizeLimitError(error) {
|
|
40
|
+
return this.isDynamoItemSizeLimitError(error);
|
|
41
|
+
}
|
|
42
|
+
testIsContentInS3(item) {
|
|
43
|
+
return this.isContentInS3(item);
|
|
44
|
+
}
|
|
45
|
+
testGetKeyFieldsValues(obj) {
|
|
46
|
+
return this.getKeyFieldsValues(obj);
|
|
47
|
+
}
|
|
48
|
+
// Override updateItem to allow mocking super.updateItem
|
|
49
|
+
async updateItem(value) {
|
|
50
|
+
if (this.mockSuperUpdateItem) {
|
|
51
|
+
// Use mock if provided
|
|
52
|
+
const previousLocation = await this.fetchStoredLocation(value);
|
|
53
|
+
const updatedItem = await this.mockSuperUpdateItem(value);
|
|
54
|
+
if (!updatedItem) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
const newLocation = updatedItem.storageLocation;
|
|
58
|
+
if (previousLocation && previousLocation.key !== (newLocation === null || newLocation === void 0 ? void 0 : newLocation.key)) {
|
|
59
|
+
await this.storage.delete(previousLocation);
|
|
60
|
+
}
|
|
61
|
+
return updatedItem;
|
|
62
|
+
}
|
|
63
|
+
return super.updateItem(value);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const createDbManager = (clientOverrides = {}) => ({
|
|
67
|
+
client: {
|
|
68
|
+
get: jest.fn(),
|
|
69
|
+
put: jest.fn(),
|
|
70
|
+
delete: jest.fn(),
|
|
71
|
+
update: jest.fn(),
|
|
72
|
+
query: jest.fn(),
|
|
73
|
+
...clientOverrides,
|
|
74
|
+
},
|
|
75
|
+
repositories: {},
|
|
76
|
+
executeInTransaction: async (fn) => fn({}),
|
|
77
|
+
addWriteTransactionItem: jest.fn(),
|
|
78
|
+
});
|
|
79
|
+
const createStorage = () => ({
|
|
80
|
+
save: jest.fn(),
|
|
81
|
+
load: jest.fn(),
|
|
82
|
+
delete: jest.fn(),
|
|
83
|
+
});
|
|
84
|
+
const createTestItem = (overrides = {}) => {
|
|
85
|
+
const item = new TestItem({
|
|
86
|
+
id: 'item-1',
|
|
87
|
+
name: 'Test',
|
|
88
|
+
data: [{ key: 'sample', value: { main: [] } }],
|
|
89
|
+
...overrides,
|
|
90
|
+
});
|
|
91
|
+
return item;
|
|
92
|
+
};
|
|
93
|
+
describe('ExternalizedDynamoDbRepository', () => {
|
|
94
|
+
describe('prepareValueForStorage', () => {
|
|
95
|
+
it('externalizes data to S3 when prepareValueForStorage is called', async () => {
|
|
96
|
+
const storage = {
|
|
97
|
+
...createStorage(),
|
|
98
|
+
save: jest.fn().mockResolvedValue({ location: { type: 's3', key: 'item-key' }, size: 500 }),
|
|
99
|
+
};
|
|
100
|
+
const repo = new TestRepo(createDbManager(), storage);
|
|
101
|
+
const item = createTestItem();
|
|
102
|
+
const storedValue = await repo.testPrepareValueForStorage(item);
|
|
103
|
+
expect(storage.save).toHaveBeenCalled();
|
|
104
|
+
// storedValue is a minimal payload - original item is NOT mutated
|
|
105
|
+
expect(storedValue.data).toEqual([]);
|
|
106
|
+
expect(storedValue.storageLocation).toEqual({ type: 's3', key: 'item-key' });
|
|
107
|
+
});
|
|
108
|
+
it('removes existing storageLocation before saving to S3', async () => {
|
|
109
|
+
const storage = {
|
|
110
|
+
...createStorage(),
|
|
111
|
+
save: jest.fn().mockResolvedValue({ location: { type: 's3', key: 'new-key' }, size: 500 }),
|
|
112
|
+
};
|
|
113
|
+
const repo = new TestRepo(createDbManager(), storage);
|
|
114
|
+
const item = createTestItem();
|
|
115
|
+
item.storageLocation = { type: 's3', key: 'old-key' };
|
|
116
|
+
await repo.testPrepareValueForStorage(item);
|
|
117
|
+
// Verify save was called without storageLocation in the payload
|
|
118
|
+
const savedPayload = storage.save.mock.calls[0][2];
|
|
119
|
+
expect(savedPayload.storageLocation).toBeUndefined();
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
describe('createItem', () => {
|
|
123
|
+
it('creates item with storageLocation preserved', async () => {
|
|
124
|
+
const client = createDbManager().client;
|
|
125
|
+
client.put.mockResolvedValue({});
|
|
126
|
+
const storage = {
|
|
127
|
+
...createStorage(),
|
|
128
|
+
save: jest.fn().mockResolvedValue({ location: { type: 's3', key: 'item-key' }, size: 500 }),
|
|
129
|
+
load: jest.fn().mockResolvedValue(createTestItem()),
|
|
130
|
+
};
|
|
131
|
+
const repo = new TestRepo({ client }, storage);
|
|
132
|
+
const item = createTestItem();
|
|
133
|
+
// Use prepareValueForStorage to externalize data and set storageLocation
|
|
134
|
+
const preparedItem = await repo.testPrepareValueForStorage(item);
|
|
135
|
+
// Verify the prepared value has minimal payload (empty data)
|
|
136
|
+
expect(preparedItem.data).toEqual([]);
|
|
137
|
+
expect(preparedItem.storageLocation).toEqual({ type: 's3', key: 'item-key' });
|
|
138
|
+
// Original item should NOT be mutated
|
|
139
|
+
expect(item.storageLocation).toBeUndefined();
|
|
140
|
+
});
|
|
141
|
+
it('automatically externalizes to S3 when createItem exceeds DynamoDB size limit', async () => {
|
|
142
|
+
const client = createDbManager().client;
|
|
143
|
+
let callCount = 0;
|
|
144
|
+
client.put.mockImplementation(() => {
|
|
145
|
+
callCount++;
|
|
146
|
+
if (callCount === 1) {
|
|
147
|
+
// First call fails with size limit error
|
|
148
|
+
const error = new Error('Item size has exceeded the maximum allowed size');
|
|
149
|
+
error.code = 'ValidationException';
|
|
150
|
+
throw error;
|
|
151
|
+
}
|
|
152
|
+
// Second call succeeds
|
|
153
|
+
return Promise.resolve({});
|
|
154
|
+
});
|
|
155
|
+
const storage = {
|
|
156
|
+
...createStorage(),
|
|
157
|
+
save: jest.fn().mockResolvedValue({ location: { type: 's3', key: 'auto-key' }, size: 500 }),
|
|
158
|
+
load: jest.fn().mockResolvedValue(createTestItem()),
|
|
159
|
+
};
|
|
160
|
+
const repo = new TestRepo({ client }, storage);
|
|
161
|
+
const item = createTestItem({ data: [{ key: 'large', value: { content: 'x'.repeat(500000) } }] });
|
|
162
|
+
await repo.createItem(item);
|
|
163
|
+
// Should have called save to externalize
|
|
164
|
+
expect(storage.save).toHaveBeenCalled();
|
|
165
|
+
// Should have retried the put
|
|
166
|
+
expect(client.put).toHaveBeenCalledTimes(2);
|
|
167
|
+
});
|
|
168
|
+
it('cleans up old S3 file when overrideExisting is true', async () => {
|
|
169
|
+
const oldLocation = { type: 's3', key: 'old-key' };
|
|
170
|
+
const newLocation = { type: 's3', key: 'new-key' };
|
|
171
|
+
const client = createDbManager({
|
|
172
|
+
get: jest.fn().mockResolvedValue({
|
|
173
|
+
Item: {
|
|
174
|
+
id: 'item-1',
|
|
175
|
+
name: 'Old',
|
|
176
|
+
storageLocation: oldLocation,
|
|
177
|
+
},
|
|
178
|
+
}),
|
|
179
|
+
put: jest.fn().mockResolvedValue({}),
|
|
180
|
+
}).client;
|
|
181
|
+
const storage = {
|
|
182
|
+
...createStorage(),
|
|
183
|
+
save: jest.fn().mockResolvedValue({ location: newLocation, size: 500 }),
|
|
184
|
+
load: jest.fn().mockResolvedValue(createTestItem()),
|
|
185
|
+
};
|
|
186
|
+
const repo = new TestRepo({ client }, storage);
|
|
187
|
+
const item = createTestItem();
|
|
188
|
+
const preparedItem = await repo.testPrepareValueForStorage(item);
|
|
189
|
+
await repo.createItem(preparedItem, {}, {}, { overrideExisting: true });
|
|
190
|
+
expect(storage.delete).toHaveBeenCalledWith(oldLocation);
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
describe('updateItem', () => {
|
|
194
|
+
it('cleans up old S3 file when updating with new storageLocation', async () => {
|
|
195
|
+
const oldLocation = { type: 's3', key: 'old-key' };
|
|
196
|
+
const newLocation = { type: 's3', key: 'new-key' };
|
|
197
|
+
const client = createDbManager({
|
|
198
|
+
get: jest.fn().mockResolvedValue({
|
|
199
|
+
Item: {
|
|
200
|
+
id: 'item-1',
|
|
201
|
+
name: 'Test',
|
|
202
|
+
storageLocation: oldLocation,
|
|
203
|
+
},
|
|
204
|
+
}),
|
|
205
|
+
update: jest.fn().mockResolvedValue({
|
|
206
|
+
Attributes: {
|
|
207
|
+
id: 'item-1',
|
|
208
|
+
name: 'Updated',
|
|
209
|
+
storageLocation: newLocation,
|
|
210
|
+
},
|
|
211
|
+
}),
|
|
212
|
+
}).client;
|
|
213
|
+
const storage = createStorage();
|
|
214
|
+
const repo = new TestRepo({ client }, storage);
|
|
215
|
+
const updateValue = {
|
|
216
|
+
id: 'item-1',
|
|
217
|
+
name: 'Updated',
|
|
218
|
+
};
|
|
219
|
+
const updatedItem = createTestItem({ id: 'item-1', name: 'Updated' });
|
|
220
|
+
updatedItem.storageLocation = newLocation;
|
|
221
|
+
repo.mockSuperUpdateItem = jest.fn().mockResolvedValue(updatedItem);
|
|
222
|
+
await repo.updateItem(updateValue);
|
|
223
|
+
expect(storage.delete).toHaveBeenCalledWith(oldLocation);
|
|
224
|
+
});
|
|
225
|
+
it('does not delete S3 file when storageLocation is unchanged', async () => {
|
|
226
|
+
const location = { type: 's3', key: 'same-key' };
|
|
227
|
+
const client = createDbManager({
|
|
228
|
+
get: jest.fn().mockResolvedValue({
|
|
229
|
+
Item: {
|
|
230
|
+
id: 'item-1',
|
|
231
|
+
name: 'Test',
|
|
232
|
+
storageLocation: location,
|
|
233
|
+
},
|
|
234
|
+
}),
|
|
235
|
+
update: jest.fn().mockResolvedValue({
|
|
236
|
+
Attributes: {
|
|
237
|
+
id: 'item-1',
|
|
238
|
+
name: 'Updated',
|
|
239
|
+
storageLocation: location,
|
|
240
|
+
},
|
|
241
|
+
}),
|
|
242
|
+
}).client;
|
|
243
|
+
const storage = createStorage();
|
|
244
|
+
const repo = new TestRepo({ client }, storage);
|
|
245
|
+
const updateValue = {
|
|
246
|
+
id: 'item-1',
|
|
247
|
+
name: 'Updated',
|
|
248
|
+
};
|
|
249
|
+
const updatedItem = createTestItem({ id: 'item-1', name: 'Updated' });
|
|
250
|
+
updatedItem.storageLocation = location;
|
|
251
|
+
repo.mockSuperUpdateItem = jest.fn().mockResolvedValue(updatedItem);
|
|
252
|
+
await repo.updateItem(updateValue);
|
|
253
|
+
expect(storage.delete).not.toHaveBeenCalled();
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
describe('getItem', () => {
|
|
257
|
+
it('loads payload from external storage when storageLocation is set', async () => {
|
|
258
|
+
const storage = createStorage();
|
|
259
|
+
const fullData = {
|
|
260
|
+
id: 'item-1',
|
|
261
|
+
name: 'From S3',
|
|
262
|
+
data: [{ key: 'sample', value: { main: [] } }],
|
|
263
|
+
};
|
|
264
|
+
storage.load.mockResolvedValue(fullData);
|
|
265
|
+
const repo = new TestRepo(createDbManager({ get: jest.fn() }), storage);
|
|
266
|
+
const result = await repo.testHydrateFromExternalStorage({
|
|
267
|
+
id: 'item-1',
|
|
268
|
+
name: 'Placeholder',
|
|
269
|
+
data: [],
|
|
270
|
+
storageLocation: { type: 's3', key: 'item-key' },
|
|
271
|
+
});
|
|
272
|
+
expect(storage.load).toHaveBeenCalledWith({ type: 's3', key: 'item-key' });
|
|
273
|
+
expect(result === null || result === void 0 ? void 0 : result.name).toBe('From S3');
|
|
274
|
+
expect(result === null || result === void 0 ? void 0 : result.data).toEqual([{ key: 'sample', value: { main: [] } }]);
|
|
275
|
+
});
|
|
276
|
+
it('returns inline data when no storageLocation is present', async () => {
|
|
277
|
+
const storage = createStorage();
|
|
278
|
+
const repo = new TestRepo(createDbManager({ get: jest.fn() }), storage);
|
|
279
|
+
const inlineRecord = {
|
|
280
|
+
id: 'item-1',
|
|
281
|
+
name: 'Inline Item',
|
|
282
|
+
data: [{ key: 'sample', value: { main: [] } }],
|
|
283
|
+
};
|
|
284
|
+
const result = await repo.testHydrateFromExternalStorage(inlineRecord);
|
|
285
|
+
expect(storage.load).not.toHaveBeenCalled();
|
|
286
|
+
expect(result).toBeDefined();
|
|
287
|
+
expect(result === null || result === void 0 ? void 0 : result.name).toBe('Inline Item');
|
|
288
|
+
expect(result === null || result === void 0 ? void 0 : result.data).toEqual([{ key: 'sample', value: { main: [] } }]);
|
|
289
|
+
});
|
|
290
|
+
it('never includes storageLocation in response', async () => {
|
|
291
|
+
const storage = createStorage();
|
|
292
|
+
const fullData = {
|
|
293
|
+
id: 'item-1',
|
|
294
|
+
name: 'From S3',
|
|
295
|
+
data: [{ key: 'sample', value: { main: [] } }],
|
|
296
|
+
};
|
|
297
|
+
storage.load.mockResolvedValue(fullData);
|
|
298
|
+
const repo = new TestRepo(createDbManager(), storage);
|
|
299
|
+
const result = await repo.testHydrateFromExternalStorage({
|
|
300
|
+
id: 'item-1',
|
|
301
|
+
name: 'Placeholder',
|
|
302
|
+
data: [],
|
|
303
|
+
storageLocation: { type: 's3', key: 'item-key' },
|
|
304
|
+
});
|
|
305
|
+
// storageLocation is an internal implementation detail and should never be exposed
|
|
306
|
+
expect(result === null || result === void 0 ? void 0 : result.storageLocation).toBeUndefined();
|
|
307
|
+
expect(result === null || result === void 0 ? void 0 : result.name).toBe('From S3');
|
|
308
|
+
expect(result === null || result === void 0 ? void 0 : result.data).toEqual([{ key: 'sample', value: { main: [] } }]);
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
describe('deleteItem', () => {
|
|
312
|
+
it('deletes externalized payloads when deleting items', async () => {
|
|
313
|
+
const client = createDbManager({
|
|
314
|
+
get: jest.fn().mockResolvedValue({ Item: { storageLocation: { type: 's3', key: 'item-key' } } }),
|
|
315
|
+
delete: jest.fn().mockResolvedValue({}),
|
|
316
|
+
}).client;
|
|
317
|
+
const storage = createStorage();
|
|
318
|
+
const repo = new TestRepo({ client }, storage);
|
|
319
|
+
await repo.deleteItem({ id: 'item-1' });
|
|
320
|
+
expect(storage.delete).toHaveBeenCalledWith({ type: 's3', key: 'item-key' });
|
|
321
|
+
});
|
|
322
|
+
it('does not attempt to delete S3 when item has no storageLocation', async () => {
|
|
323
|
+
const client = createDbManager({
|
|
324
|
+
get: jest.fn().mockResolvedValue({ Item: { id: 'item-1', name: 'Test' } }),
|
|
325
|
+
delete: jest.fn().mockResolvedValue({}),
|
|
326
|
+
}).client;
|
|
327
|
+
const storage = createStorage();
|
|
328
|
+
const repo = new TestRepo({ client }, storage);
|
|
329
|
+
await repo.deleteItem({ id: 'item-1' });
|
|
330
|
+
expect(storage.delete).not.toHaveBeenCalled();
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
describe('isDynamoItemSizeLimitError', () => {
|
|
334
|
+
it('detects ValidationException with size message', () => {
|
|
335
|
+
const repo = new TestRepo(createDbManager(), createStorage());
|
|
336
|
+
const error = {
|
|
337
|
+
code: 'ValidationException',
|
|
338
|
+
message: 'Item size has exceeded the maximum allowed size',
|
|
339
|
+
};
|
|
340
|
+
expect(repo.testIsDynamoItemSizeLimitError(error)).toBe(true);
|
|
341
|
+
});
|
|
342
|
+
it('detects TransactionCanceledException with size in cancellation reasons', () => {
|
|
343
|
+
const repo = new TestRepo(createDbManager(), createStorage());
|
|
344
|
+
const error = {
|
|
345
|
+
code: 'TransactionCanceledException',
|
|
346
|
+
CancellationReasons: [
|
|
347
|
+
{
|
|
348
|
+
Code: 'ValidationException',
|
|
349
|
+
Message: 'Item size exceeded 400 KB limit',
|
|
350
|
+
},
|
|
351
|
+
],
|
|
352
|
+
};
|
|
353
|
+
expect(repo.testIsDynamoItemSizeLimitError(error)).toBe(true);
|
|
354
|
+
});
|
|
355
|
+
it('detects size keywords in error message', () => {
|
|
356
|
+
const repo = new TestRepo(createDbManager(), createStorage());
|
|
357
|
+
const error = {
|
|
358
|
+
message: 'The item size exceeds the maximum allowed size',
|
|
359
|
+
};
|
|
360
|
+
expect(repo.testIsDynamoItemSizeLimitError(error)).toBe(true);
|
|
361
|
+
});
|
|
362
|
+
it('returns false for non-size-related errors', () => {
|
|
363
|
+
const repo = new TestRepo(createDbManager(), createStorage());
|
|
364
|
+
const error = {
|
|
365
|
+
code: 'ResourceNotFoundException',
|
|
366
|
+
message: 'Table not found',
|
|
367
|
+
};
|
|
368
|
+
expect(repo.testIsDynamoItemSizeLimitError(error)).toBe(false);
|
|
369
|
+
});
|
|
370
|
+
it('returns false for null/undefined errors', () => {
|
|
371
|
+
const repo = new TestRepo(createDbManager(), createStorage());
|
|
372
|
+
expect(repo.testIsDynamoItemSizeLimitError(null)).toBe(false);
|
|
373
|
+
expect(repo.testIsDynamoItemSizeLimitError(undefined)).toBe(false);
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
describe('isContentInS3', () => {
|
|
377
|
+
it('returns true when storageLocation exists and large content fields are empty', () => {
|
|
378
|
+
const repo = new TestRepo(createDbManager(), createStorage());
|
|
379
|
+
const item = createTestItem({ data: [] });
|
|
380
|
+
item.storageLocation = { type: 's3', key: 'item-key' };
|
|
381
|
+
expect(repo.testIsContentInS3(item)).toBe(true);
|
|
382
|
+
});
|
|
383
|
+
it('returns false when storageLocation exists but large content fields have data', () => {
|
|
384
|
+
const repo = new TestRepo(createDbManager(), createStorage());
|
|
385
|
+
const item = createTestItem({ data: [{ key: 'sample', value: { main: [] } }] });
|
|
386
|
+
item.storageLocation = { type: 's3', key: 'item-key' };
|
|
387
|
+
expect(repo.testIsContentInS3(item)).toBe(false);
|
|
388
|
+
});
|
|
389
|
+
it('returns false when no storageLocation', () => {
|
|
390
|
+
const repo = new TestRepo(createDbManager(), createStorage());
|
|
391
|
+
const item = createTestItem();
|
|
392
|
+
expect(repo.testIsContentInS3(item)).toBe(false);
|
|
393
|
+
});
|
|
394
|
+
});
|
|
395
|
+
describe('getKeyFieldsValues', () => {
|
|
396
|
+
it('preserves key fields and small metadata', () => {
|
|
397
|
+
const repo = new TestRepo(createDbManager(), createStorage());
|
|
398
|
+
const obj = {
|
|
399
|
+
id: 'item-1',
|
|
400
|
+
name: 'Test',
|
|
401
|
+
data: [{ key: 'large', value: { content: 'big' } }],
|
|
402
|
+
};
|
|
403
|
+
const result = repo.testGetKeyFieldsValues(obj);
|
|
404
|
+
expect(result.id).toBe('item-1');
|
|
405
|
+
expect(result.name).toBe('Test');
|
|
406
|
+
});
|
|
407
|
+
it('empties large content fields (fieldsAsJsonString)', () => {
|
|
408
|
+
const repo = new TestRepo(createDbManager(), createStorage());
|
|
409
|
+
const obj = {
|
|
410
|
+
id: 'item-1',
|
|
411
|
+
name: 'Test',
|
|
412
|
+
data: [{ key: 'large', value: { content: 'big' } }],
|
|
413
|
+
};
|
|
414
|
+
const result = repo.testGetKeyFieldsValues(obj);
|
|
415
|
+
// data is in fieldsAsJsonString, so should be empty array
|
|
416
|
+
expect(result.data).toEqual([]);
|
|
417
|
+
});
|
|
418
|
+
it('removes storageLocation from result', () => {
|
|
419
|
+
const repo = new TestRepo(createDbManager(), createStorage());
|
|
420
|
+
const obj = {
|
|
421
|
+
id: 'item-1',
|
|
422
|
+
name: 'Test',
|
|
423
|
+
data: [],
|
|
424
|
+
storageLocation: { type: 's3', key: 'item-key' },
|
|
425
|
+
};
|
|
426
|
+
const result = repo.testGetKeyFieldsValues(obj);
|
|
427
|
+
expect(result.storageLocation).toBeUndefined();
|
|
428
|
+
});
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
//# sourceMappingURL=ExternalizedDynamoDbRepository.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExternalizedDynamoDbRepository.spec.js","sourceRoot":"","sources":["../../src/externalized/ExternalizedDynamoDbRepository.spec.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -12,4 +12,6 @@ export * from './error/MissingKeyValuesError';
|
|
|
12
12
|
export * from './error/InvalidDbSchemaError';
|
|
13
13
|
export * from './PostgresErrorCodes';
|
|
14
14
|
export { Pool, PoolClient } from 'pg';
|
|
15
|
+
export * from './s3/S3ExternalStorage';
|
|
16
|
+
export * from './externalized/ExternalizedDynamoDbRepository';
|
|
15
17
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uCAAuC,CAAC;AACtD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,sBAAsB,CAAC;AAErC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uCAAuC,CAAC;AACtD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,sBAAsB,CAAC;AAErC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAGtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+CAA+C,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -31,4 +31,7 @@ __exportStar(require("./error/InvalidDbSchemaError"), exports);
|
|
|
31
31
|
__exportStar(require("./PostgresErrorCodes"), exports);
|
|
32
32
|
var pg_1 = require("pg");
|
|
33
33
|
Object.defineProperty(exports, "Pool", { enumerable: true, get: function () { return pg_1.Pool; } });
|
|
34
|
+
// S3 External Storage
|
|
35
|
+
__exportStar(require("./s3/S3ExternalStorage"), exports);
|
|
36
|
+
__exportStar(require("./externalized/ExternalizedDynamoDbRepository"), exports);
|
|
34
37
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,sDAAoC;AACpC,6DAA2C;AAC3C,wEAAsD;AACtD,gEAA8C;AAC9C,6CAA2B;AAC3B,iDAA+B;AAC/B,sDAAoC;AACpC,6DAA2C;AAC3C,2DAAyC;AACzC,gEAA8C;AAC9C,+DAA6C;AAE7C,WAAW;AACX,uDAAqC;AAErC,yBAAsC;AAA7B,0FAAA,IAAI,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,sDAAoC;AACpC,6DAA2C;AAC3C,wEAAsD;AACtD,gEAA8C;AAC9C,6CAA2B;AAC3B,iDAA+B;AAC/B,sDAAoC;AACpC,6DAA2C;AAC3C,2DAAyC;AACzC,gEAA8C;AAC9C,+DAA6C;AAE7C,WAAW;AACX,uDAAqC;AAErC,yBAAsC;AAA7B,0FAAA,IAAI,OAAA;AAEb,sBAAsB;AACtB,yDAAuC;AACvC,gFAA8D"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* @file S3ExternalStorage.ts
|
|
3
|
+
* @description This file contains the S3ExternalStorage class, which is used to store and retrieve page contents from S3.
|
|
4
|
+
* @author Dean Heffernan
|
|
5
|
+
* @copyright 2025 Squiz
|
|
6
|
+
*/
|
|
7
|
+
import { S3Client } from '@aws-sdk/client-s3';
|
|
8
|
+
/**
|
|
9
|
+
* Represents the storage location of page contents in S3.
|
|
10
|
+
*/
|
|
11
|
+
export interface S3StorageLocation {
|
|
12
|
+
type: 's3';
|
|
13
|
+
key: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The S3ExternalStorage class is used to store and retrieve page contents from S3.
|
|
17
|
+
* @class S3ExternalStorage
|
|
18
|
+
* @constructor
|
|
19
|
+
* @param {string} bucket - The name of the S3 bucket to use for storing page contents.
|
|
20
|
+
* @param {number} thresholdBytes - The threshold in bytes above which page contents will be stored externally.
|
|
21
|
+
* @param {S3Client} s3Client - The S3 client to use for storing and retrieving page contents.
|
|
22
|
+
* @returns {S3ExternalStorage} A new instance of the S3ExternalStorage class.
|
|
23
|
+
*/
|
|
24
|
+
export declare class S3ExternalStorage {
|
|
25
|
+
/**
|
|
26
|
+
* The config to use for storing and retrieving page contents.
|
|
27
|
+
* @type {Config}
|
|
28
|
+
*/
|
|
29
|
+
private readonly tenantId;
|
|
30
|
+
/**
|
|
31
|
+
* The name of the S3 bucket to use for storing page contents.
|
|
32
|
+
* @type {string}
|
|
33
|
+
*/
|
|
34
|
+
private readonly bucket;
|
|
35
|
+
/**
|
|
36
|
+
* The S3 client to use for storing and retrieving page contents.
|
|
37
|
+
* @type {S3Client}
|
|
38
|
+
*/
|
|
39
|
+
private readonly s3Client;
|
|
40
|
+
/**
|
|
41
|
+
* Creates a new instance of the S3ExternalStorage class.
|
|
42
|
+
* @constructor
|
|
43
|
+
* @param {S3Client} s3Client - The S3 client to use for storing and retrieving page contents.
|
|
44
|
+
* @returns {S3ExternalStorage} A new instance of the S3ExternalStorage class.
|
|
45
|
+
*/
|
|
46
|
+
constructor(tenantId: string, s3Client: S3Client, bucket: string);
|
|
47
|
+
/**
|
|
48
|
+
* Saves a payload to S3.
|
|
49
|
+
* @param {string} entityName - The name of the entity to save the payload for.
|
|
50
|
+
* @param {string} referenceId - The reference ID of the payload.
|
|
51
|
+
* @param {object} payload - The payload to save.
|
|
52
|
+
* @returns {Promise<{ location: S3StorageLocation; size: number }>} A promise that resolves to the location and size of the saved payload.
|
|
53
|
+
*/
|
|
54
|
+
save(entityName: string, referenceId: string, payload: object): Promise<{
|
|
55
|
+
location: S3StorageLocation;
|
|
56
|
+
size: number;
|
|
57
|
+
}>;
|
|
58
|
+
/**
|
|
59
|
+
* Loads a payload from S3.
|
|
60
|
+
* @param location - The location of the payload to load.
|
|
61
|
+
* @returns {Promise<Record<string, unknown>>} A promise that resolves to the loaded payload.
|
|
62
|
+
*/
|
|
63
|
+
load(location: S3StorageLocation): Promise<Record<string, unknown>>;
|
|
64
|
+
delete(location?: S3StorageLocation): Promise<void>;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=S3ExternalStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"S3ExternalStorage.d.ts","sourceRoot":"","sources":["../../src/s3/S3ExternalStorage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAA2D,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEvG;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;GAQG;AACH,qBAAa,iBAAiB;IAC5B;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IAEpC;;;;;OAKG;gBACS,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM;IAMhE;;;;;;OAMG;IACU,IAAI,CACf,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,QAAQ,EAAE,iBAAiB,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBzD;;;;OAIG;IACU,IAAI,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAcnE,MAAM,CAAC,QAAQ,CAAC,EAAE,iBAAiB;CAWjD"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* @file S3ExternalStorage.ts
|
|
4
|
+
* @description This file contains the S3ExternalStorage class, which is used to store and retrieve page contents from S3.
|
|
5
|
+
* @author Dean Heffernan
|
|
6
|
+
* @copyright 2025 Squiz
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.S3ExternalStorage = void 0;
|
|
10
|
+
// External
|
|
11
|
+
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
12
|
+
/**
|
|
13
|
+
* The S3ExternalStorage class is used to store and retrieve page contents from S3.
|
|
14
|
+
* @class S3ExternalStorage
|
|
15
|
+
* @constructor
|
|
16
|
+
* @param {string} bucket - The name of the S3 bucket to use for storing page contents.
|
|
17
|
+
* @param {number} thresholdBytes - The threshold in bytes above which page contents will be stored externally.
|
|
18
|
+
* @param {S3Client} s3Client - The S3 client to use for storing and retrieving page contents.
|
|
19
|
+
* @returns {S3ExternalStorage} A new instance of the S3ExternalStorage class.
|
|
20
|
+
*/
|
|
21
|
+
class S3ExternalStorage {
|
|
22
|
+
/**
|
|
23
|
+
* Creates a new instance of the S3ExternalStorage class.
|
|
24
|
+
* @constructor
|
|
25
|
+
* @param {S3Client} s3Client - The S3 client to use for storing and retrieving page contents.
|
|
26
|
+
* @returns {S3ExternalStorage} A new instance of the S3ExternalStorage class.
|
|
27
|
+
*/
|
|
28
|
+
constructor(tenantId, s3Client, bucket) {
|
|
29
|
+
this.tenantId = tenantId;
|
|
30
|
+
this.bucket = bucket;
|
|
31
|
+
this.s3Client = s3Client;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Saves a payload to S3.
|
|
35
|
+
* @param {string} entityName - The name of the entity to save the payload for.
|
|
36
|
+
* @param {string} referenceId - The reference ID of the payload.
|
|
37
|
+
* @param {object} payload - The payload to save.
|
|
38
|
+
* @returns {Promise<{ location: S3StorageLocation; size: number }>} A promise that resolves to the location and size of the saved payload.
|
|
39
|
+
*/
|
|
40
|
+
async save(entityName, referenceId, payload) {
|
|
41
|
+
const body = JSON.stringify(payload);
|
|
42
|
+
const key = `${this.tenantId}/${entityName}/${referenceId}.json`;
|
|
43
|
+
await this.s3Client.send(new client_s3_1.PutObjectCommand({
|
|
44
|
+
Bucket: this.bucket,
|
|
45
|
+
Key: key,
|
|
46
|
+
Body: body,
|
|
47
|
+
ContentType: 'application/json',
|
|
48
|
+
}));
|
|
49
|
+
return {
|
|
50
|
+
location: {
|
|
51
|
+
type: 's3',
|
|
52
|
+
key,
|
|
53
|
+
},
|
|
54
|
+
size: Buffer.byteLength(body, 'utf8'),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Loads a payload from S3.
|
|
59
|
+
* @param location - The location of the payload to load.
|
|
60
|
+
* @returns {Promise<Record<string, unknown>>} A promise that resolves to the loaded payload.
|
|
61
|
+
*/
|
|
62
|
+
async load(location) {
|
|
63
|
+
const response = await this.s3Client.send(new client_s3_1.GetObjectCommand({
|
|
64
|
+
Bucket: this.bucket,
|
|
65
|
+
Key: location.key,
|
|
66
|
+
}));
|
|
67
|
+
if (!response.Body) {
|
|
68
|
+
throw new Error(`Failed to load externalised items from S3 object ${location.key}`);
|
|
69
|
+
}
|
|
70
|
+
const contents = await response.Body.transformToString();
|
|
71
|
+
return JSON.parse(contents);
|
|
72
|
+
}
|
|
73
|
+
async delete(location) {
|
|
74
|
+
if (!location || !this.bucket) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
await this.s3Client.send(new client_s3_1.DeleteObjectCommand({
|
|
78
|
+
Bucket: this.bucket,
|
|
79
|
+
Key: location.key,
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.S3ExternalStorage = S3ExternalStorage;
|
|
84
|
+
//# sourceMappingURL=S3ExternalStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"S3ExternalStorage.js","sourceRoot":"","sources":["../../src/s3/S3ExternalStorage.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,WAAW;AACX,kDAAuG;AAUvG;;;;;;;;GAQG;AACH,MAAa,iBAAiB;IAiB5B;;;;;OAKG;IACH,YAAY,QAAgB,EAAE,QAAkB,EAAE,MAAc;QAC9D,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,IAAI,CACf,UAAkB,EAClB,WAAmB,EACnB,OAAe;QAEf,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,UAAU,IAAI,WAAW,OAAO,CAAC;QACjE,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CACtB,IAAI,4BAAgB,CAAC;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,GAAG;YACR,IAAI,EAAE,IAAI;YACV,WAAW,EAAE,kBAAkB;SAChC,CAAC,CACH,CAAC;QACF,OAAO;YACL,QAAQ,EAAE;gBACR,IAAI,EAAE,IAAI;gBACV,GAAG;aACJ;YACD,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC;SACtC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,IAAI,CAAC,QAA2B;QAC3C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvC,IAAI,4BAAgB,CAAC;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,QAAQ,CAAC,GAAG;SAClB,CAAC,CACH,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,oDAAoD,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,QAA4B;QAC9C,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CACtB,IAAI,+BAAmB,CAAC;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,QAAQ,CAAC,GAAG;SAClB,CAAC,CACH,CAAC;IACJ,CAAC;CACF;AA1FD,8CA0FC"}
|