UNPKG

15.4 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const tslib_1 = require("tslib");
4const node_storage_common_1 = require("@neo-one/node-storage-common");
5const utils_1 = require("@neo-one/utils");
6const lru_cache_1 = tslib_1.__importDefault(require("lru-cache"));
7const convertChange_1 = require("./convertChange");
8const read = tslib_1.__importStar(require("./read"));
9exports.cacheStorage = ({ environment, storage, }) => {
10 // tslint:disable-next-line no-any
11 const cache = new lru_cache_1.default({
12 max: environment.maxSizeBytes,
13 });
14 const serializeHeaderKey = ({ hashOrIndex }) => typeof hashOrIndex === 'number'
15 ? `header:${hashOrIndex}`
16 : node_storage_common_1.keys.typeKeyToSerializeKeyString.header({ hash: hashOrIndex });
17 const headerBase = read.createReadStorage({
18 cache,
19 storage: storage.header,
20 serializeKeyString: serializeHeaderKey,
21 });
22 const header = {
23 get: headerBase.get,
24 tryGet: headerBase.tryGet,
25 tryGetLatest: storage.header.tryGetLatest,
26 };
27 const serializeBlockKey = ({ hashOrIndex }) => typeof hashOrIndex === 'number'
28 ? `block:${hashOrIndex}`
29 : node_storage_common_1.keys.typeKeyToSerializeKeyString.block({ hash: hashOrIndex });
30 const blockBase = read.createReadStorage({
31 cache,
32 storage: storage.block,
33 serializeKeyString: serializeBlockKey,
34 });
35 const block = {
36 get: blockBase.get,
37 tryGet: blockBase.tryGet,
38 tryGetLatest: storage.block.tryGetLatest,
39 };
40 return {
41 header,
42 block,
43 blockData: read.createReadStorage({
44 cache,
45 storage: storage.blockData,
46 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKeyString.blockData,
47 }),
48 account: read.createReadAllStorage({
49 cache,
50 storage: storage.account,
51 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKeyString.account,
52 }),
53 accountUnspent: storage.accountUnspent,
54 accountUnclaimed: storage.accountUnclaimed,
55 action: storage.action,
56 asset: read.createReadStorage({
57 cache,
58 storage: storage.asset,
59 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKeyString.asset,
60 }),
61 transaction: read.createReadStorage({
62 cache,
63 storage: storage.transaction,
64 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKeyString.transaction,
65 }),
66 transactionData: read.createReadStorage({
67 cache,
68 storage: storage.transactionData,
69 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKeyString.transactionData,
70 }),
71 output: read.createReadStorage({
72 cache,
73 storage: storage.output,
74 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKeyString.output,
75 }),
76 contract: read.createReadStorage({
77 cache,
78 storage: storage.contract,
79 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKeyString.contract,
80 }),
81 storageItem: read.createReadGetAllStorage({
82 cache,
83 storage: storage.storageItem,
84 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKeyString.storageItem,
85 }),
86 validator: read.createReadAllStorage({
87 cache,
88 storage: storage.validator,
89 serializeKeyString: node_storage_common_1.keys.typeKeyToSerializeKeyString.validator,
90 }),
91 invocationData: storage.invocationData,
92 validatorsCount: storage.validatorsCount,
93 async close() {
94 await storage.close();
95 },
96 async commit(changeSet) {
97 const changesList = changeSet.map(convertChange_1.convertChange);
98 // tslint:disable-next-line no-loop-statement
99 for (const changes of changesList) {
100 // tslint:disable-next-line no-loop-statement
101 for (const change of changes) {
102 switch (change.type) {
103 case 'add':
104 cache.set(change.key, change.value);
105 break;
106 case 'delete':
107 cache.del(change.key);
108 break;
109 default:
110 utils_1.utils.assertNever(change);
111 throw new Error('For TS');
112 }
113 }
114 }
115 await storage.commit(changeSet);
116 },
117 async reset() {
118 cache.reset();
119 await storage.reset();
120 },
121 };
122};
123
124//# sourceMappingURL=data:application/json;charset=utf8;base64,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LE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsNkJBQWEsQ0FBQyxDQUFDO1lBQ2pELDZDQUE2QztZQUM3QyxLQUFLLE1BQU0sT0FBTyxJQUFJLFdBQVcsRUFBRTtnQkFDakMsNkNBQTZDO2dCQUM3QyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtvQkFDNUIsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFO3dCQUNuQixLQUFLLEtBQUs7NEJBQ1IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDcEMsTUFBTTt3QkFDUixLQUFLLFFBQVE7NEJBQ1gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ3RCLE1BQU07d0JBQ1I7NEJBQ0UsYUFBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQzs0QkFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztxQkFDN0I7aUJBQ0Y7YUFDRjtZQUNELE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsS0FBSyxDQUFDLEtBQUs7WUFDVCxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZCxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMsQ0FBQyIsImZpbGUiOiJuZW8tb25lLW5vZGUtc3RvcmFnZS1jYWNoZS9zcmMvY2FjaGVTdG9yYWdlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVUludDI1NiB9IGZyb20gJ0BuZW8tb25lL2NsaWVudC1jb21tb24nO1xuaW1wb3J0IHsgU3RvcmFnZSB9IGZyb20gJ0BuZW8tb25lL25vZGUtY29yZSc7XG5pbXBvcnQgeyBrZXlzIH0gZnJvbSAnQG5lby1vbmUvbm9kZS1zdG9yYWdlLWNvbW1vbic7XG5pbXBvcnQgeyB1dGlscyB9IGZyb20gJ0BuZW8tb25lL3V0aWxzJztcbmltcG9ydCBMUlVDYWNoZSBmcm9tICdscnUtY2FjaGUnO1xuaW1wb3J0IHsgY29udmVydENoYW5nZSB9IGZyb20gJy4vY29udmVydENoYW5nZSc7XG5pbXBvcnQgKiBhcyByZWFkIGZyb20gJy4vcmVhZCc7XG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50IHtcbiAgcmVhZG9ubHkgbWF4U2l6ZUJ5dGVzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBjYWNoZVN0b3JhZ2UgPSAoe1xuICBlbnZpcm9ubWVudCxcbiAgc3RvcmFnZSxcbn06IHtcbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50O1xuICByZWFkb25seSBzdG9yYWdlOiBTdG9yYWdlO1xufSk6IFN0b3JhZ2UgPT4ge1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tYW55XG4gIGNvbnN0IGNhY2hlID0gbmV3IExSVUNhY2hlPHN0cmluZywgYW55Pih7XG4gICAgbWF4OiBlbnZpcm9ubWVudC5tYXhTaXplQnl0ZXMsXG4gICAgLy8gbGVuZ3RoOiAodmFsdWUsIGtleSkgPT4gdmFsdWUuc2l6ZSArIEJ1ZmZlci5ieXRlTGVuZ3RoKGtleSwgJ3V0ZjgnKSxcbiAgfSk7XG5cbiAgY29uc3Qgc2VyaWFsaXplSGVhZGVyS2V5ID0gKHsgaGFzaE9ySW5kZXggfTogeyBoYXNoT3JJbmRleDogbnVtYmVyIHwgVUludDI1NiB9KSA9PlxuICAgIHR5cGVvZiBoYXNoT3JJbmRleCA9PT0gJ251bWJlcidcbiAgICAgID8gYGhlYWRlcjoke2hhc2hPckluZGV4fWBcbiAgICAgIDoga2V5cy50eXBlS2V5VG9TZXJpYWxpemVLZXlTdHJpbmcuaGVhZGVyKHsgaGFzaDogaGFzaE9ySW5kZXggfSk7XG5cbiAgY29uc3QgaGVhZGVyQmFzZSA9IHJlYWQuY3JlYXRlUmVhZFN0b3JhZ2Uoe1xuICAgIGNhY2hlLFxuICAgIHN0b3JhZ2U6IHN0b3JhZ2UuaGVhZGVyLFxuICAgIHNlcmlhbGl6ZUtleVN0cmluZzogc2VyaWFsaXplSGVhZGVyS2V5LFxuICB9KTtcblxuICBjb25zdCBoZWFkZXIgPSB7XG4gICAgZ2V0OiBoZWFkZXJCYXNlLmdldCxcbiAgICB0cnlHZXQ6IGhlYWRlckJhc2UudHJ5R2V0LFxuICAgIHRyeUdldExhdGVzdDogc3RvcmFnZS5oZWFkZXIudHJ5R2V0TGF0ZXN0LFxuICB9O1xuXG4gIGNvbnN0IHNlcmlhbGl6ZUJsb2NrS2V5ID0gKHsgaGFzaE9ySW5kZXggfTogeyBoYXNoT3JJbmRleDogbnVtYmVyIHwgVUludDI1NiB9KSA9PlxuICAgIHR5cGVvZiBoYXNoT3JJbmRleCA9PT0gJ251bWJlcidcbiAgICAgID8gYGJsb2NrOiR7aGFzaE9ySW5kZXh9YFxuICAgICAgOiBrZXlzLnR5cGVLZXlUb1NlcmlhbGl6ZUtleVN0cmluZy5ibG9jayh7IGhhc2g6IGhhc2hPckluZGV4IH0pO1xuXG4gIGNvbnN0IGJsb2NrQmFzZSA9IHJlYWQuY3JlYXRlUmVhZFN0b3JhZ2Uoe1xuICAgIGNhY2hlLFxuICAgIHN0b3JhZ2U6IHN0b3JhZ2UuYmxvY2ssXG4gICAgc2VyaWFsaXplS2V5U3RyaW5nOiBzZXJpYWxpemVCbG9ja0tleSxcbiAgfSk7XG5cbiAgY29uc3QgYmxvY2sgPSB7XG4gICAgZ2V0OiBibG9ja0Jhc2UuZ2V0LFxuICAgIHRyeUdldDogYmxvY2tCYXNlLnRyeUdldCxcbiAgICB0cnlHZXRMYXRlc3Q6IHN0b3JhZ2UuYmxvY2sudHJ5R2V0TGF0ZXN0LFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgaGVhZGVyLFxuICAgIGJsb2NrLFxuICAgIGJsb2NrRGF0YTogcmVhZC5jcmVhdGVSZWFkU3RvcmFnZSh7XG4gICAgICBjYWNoZSxcbiAgICAgIHN0b3JhZ2U6IHN0b3JhZ2UuYmxvY2tEYXRhLFxuICAgICAgc2VyaWFsaXplS2V5U3RyaW5nOiBrZXlzLnR5cGVLZXlUb1NlcmlhbGl6ZUtleVN0cmluZy5ibG9ja0RhdGEsXG4gICAgfSksXG5cbiAgICBhY2NvdW50OiByZWFkLmNyZWF0ZVJlYWRBbGxTdG9yYWdlKHtcbiAgICAgIGNhY2hlLFxuICAgICAgc3RvcmFnZTogc3RvcmFnZS5hY2NvdW50LFxuICAgICAgc2VyaWFsaXplS2V5U3RyaW5nOiBrZXlzLnR5cGVLZXlUb1NlcmlhbGl6ZUtleVN0cmluZy5hY2NvdW50LFxuICAgIH0pLFxuXG4gICAgYWNjb3VudFVuc3BlbnQ6IHN0b3JhZ2UuYWNjb3VudFVuc3BlbnQsXG4gICAgYWNjb3VudFVuY2xhaW1lZDogc3RvcmFnZS5hY2NvdW50VW5jbGFpbWVkLFxuICAgIGFjdGlvbjogc3RvcmFnZS5hY3Rpb24sXG4gICAgYXNzZXQ6IHJlYWQuY3JlYXRlUmVhZFN0b3JhZ2Uoe1xuICAgICAgY2FjaGUsXG4gICAgICBzdG9yYWdlOiBzdG9yYWdlLmFzc2V0LFxuICAgICAgc2VyaWFsaXplS2V5U3RyaW5nOiBrZXlzLnR5cGVLZXlUb1NlcmlhbGl6ZUtleVN0cmluZy5hc3NldCxcbiAgICB9KSxcblxuICAgIHRyYW5zYWN0aW9uOiByZWFkLmNyZWF0ZVJlYWRTdG9yYWdlKHtcbiAgICAgIGNhY2hlLFxuICAgICAgc3RvcmFnZTogc3RvcmFnZS50cmFuc2FjdGlvbixcbiAgICAgIHNlcmlhbGl6ZUtleVN0cmluZzoga2V5cy50eXBlS2V5VG9TZXJpYWxpemVLZXlTdHJpbmcudHJhbnNhY3Rpb24sXG4gICAgfSksXG5cbiAgICB0cmFuc2FjdGlvbkRhdGE6IHJlYWQuY3JlYXRlUmVhZFN0b3JhZ2Uoe1xuICAgICAgY2FjaGUsXG4gICAgICBzdG9yYWdlOiBzdG9yYWdlLnRyYW5zYWN0aW9uRGF0YSxcbiAgICAgIHNlcmlhbGl6ZUtleVN0cmluZzoga2V5cy50eXBlS2V5VG9TZXJpYWxpemVLZXlTdHJpbmcudHJhbnNhY3Rpb25EYXRhLFxuICAgIH0pLFxuXG4gICAgb3V0cHV0OiByZWFkLmNyZWF0ZVJlYWRTdG9yYWdlKHtcbiAgICAgIGNhY2hlLFxuICAgICAgc3RvcmFnZTogc3RvcmFnZS5vdXRwdXQsXG4gICAgICBzZXJpYWxpemVLZXlTdHJpbmc6IGtleXMudHlwZUtleVRvU2VyaWFsaXplS2V5U3RyaW5nLm91dHB1dCxcbiAgICB9KSxcblxuICAgIGNvbnRyYWN0OiByZWFkLmNyZWF0ZVJlYWRTdG9yYWdlKHtcbiAgICAgIGNhY2hlLFxuICAgICAgc3RvcmFnZTogc3RvcmFnZS5jb250cmFjdCxcbiAgICAgIHNlcmlhbGl6ZUtleVN0cmluZzoga2V5cy50eXBlS2V5VG9TZXJpYWxpemVLZXlTdHJpbmcuY29udHJhY3QsXG4gICAgfSksXG5cbiAgICBzdG9yYWdlSXRlbTogcmVhZC5jcmVhdGVSZWFkR2V0QWxsU3RvcmFnZSh7XG4gICAgICBjYWNoZSxcbiAgICAgIHN0b3JhZ2U6IHN0b3JhZ2Uuc3RvcmFnZUl0ZW0sXG4gICAgICBzZXJpYWxpemVLZXlTdHJpbmc6IGtleXMudHlwZUtleVRvU2VyaWFsaXplS2V5U3RyaW5nLnN0b3JhZ2VJdGVtLFxuICAgIH0pLFxuXG4gICAgdmFsaWRhdG9yOiByZWFkLmNyZWF0ZVJlYWRBbGxTdG9yYWdlKHtcbiAgICAgIGNhY2hlLFxuICAgICAgc3RvcmFnZTogc3RvcmFnZS52YWxpZGF0b3IsXG4gICAgICBzZXJpYWxpemVLZXlTdHJpbmc6IGtleXMudHlwZUtleVRvU2VyaWFsaXplS2V5U3RyaW5nLnZhbGlkYXRvcixcbiAgICB9KSxcblxuICAgIGludm9jYXRpb25EYXRhOiBzdG9yYWdlLmludm9jYXRpb25EYXRhLFxuICAgIHZhbGlkYXRvcnNDb3VudDogc3RvcmFnZS52YWxpZGF0b3JzQ291bnQsXG4gICAgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCBzdG9yYWdlLmNsb3NlKCk7XG4gICAgfSxcbiAgICBhc3luYyBjb21taXQoY2hhbmdlU2V0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBjaGFuZ2VzTGlzdCA9IGNoYW5nZVNldC5tYXAoY29udmVydENoYW5nZSk7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1zdGF0ZW1lbnRcbiAgICAgIGZvciAoY29uc3QgY2hhbmdlcyBvZiBjaGFuZ2VzTGlzdCkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1zdGF0ZW1lbnRcbiAgICAgICAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgY2hhbmdlcykge1xuICAgICAgICAgIHN3aXRjaCAoY2hhbmdlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2FkZCc6XG4gICAgICAgICAgICAgIGNhY2hlLnNldChjaGFuZ2Uua2V5LCBjaGFuZ2UudmFsdWUpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgICAgICAgIGNhY2hlLmRlbChjaGFuZ2Uua2V5KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB1dGlscy5hc3NlcnROZXZlcihjaGFuZ2UpO1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvciBUUycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgc3RvcmFnZS5jb21taXQoY2hhbmdlU2V0KTtcbiAgICB9LFxuICAgIGFzeW5jIHJlc2V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY2FjaGUucmVzZXQoKTtcbiAgICAgIGF3YWl0IHN0b3JhZ2UucmVzZXQoKTtcbiAgICB9LFxuICB9O1xufTtcbiJdfQ==