@ddd-ts/store-inmemory 0.0.0-feat.june-improvements.c0df263
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/dist/in-memory.transaction.js +17 -0
- package/dist/in-memory.transaction.js.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/store/in-memory.collection.js +62 -0
- package/dist/store/in-memory.collection.js.map +1 -0
- package/dist/store/in-memory.database.js +103 -0
- package/dist/store/in-memory.database.js.map +1 -0
- package/dist/store/in-memory.storage.js +41 -0
- package/dist/store/in-memory.storage.js.map +1 -0
- package/dist/store/in-memory.store.js +44 -0
- package/dist/store/in-memory.store.js.map +1 -0
- package/package.json +17 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FakeInMemoryTransactionPerformer = exports.InMemoryTransactionPerformer = void 0;
|
|
4
|
+
const model_1 = require("@ddd-ts/model");
|
|
5
|
+
class InMemoryTransactionPerformer extends model_1.TransactionPerformer {
|
|
6
|
+
constructor(db) {
|
|
7
|
+
super((effect) => db.transactionally(effect));
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
exports.InMemoryTransactionPerformer = InMemoryTransactionPerformer;
|
|
11
|
+
class FakeInMemoryTransactionPerformer extends model_1.TransactionPerformer {
|
|
12
|
+
constructor() {
|
|
13
|
+
super((effect) => effect(null));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.FakeInMemoryTransactionPerformer = FakeInMemoryTransactionPerformer;
|
|
17
|
+
//# sourceMappingURL=in-memory.transaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory.transaction.js","sourceRoot":"","sources":["../src/in-memory.transaction.ts"],"names":[],"mappings":";;;AAAA,yCAAqD;AAMrD,MAAa,4BAA6B,SAAQ,4BAAyC;IACzF,YAAY,EAAoB;QAC9B,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IAChD,CAAC;CACF;AAJD,oEAIC;AAED,MAAa,gCAAiC,SAAQ,4BAA0B;IAC9E;QACE,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC;CACF;AAJD,4EAIC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InMemoryStore = exports.InMemoryDatabase = exports.FakeInMemoryTransactionPerformer = exports.InMemoryTransactionPerformer = void 0;
|
|
4
|
+
var in_memory_transaction_1 = require("./in-memory.transaction");
|
|
5
|
+
Object.defineProperty(exports, "InMemoryTransactionPerformer", { enumerable: true, get: function () { return in_memory_transaction_1.InMemoryTransactionPerformer; } });
|
|
6
|
+
Object.defineProperty(exports, "FakeInMemoryTransactionPerformer", { enumerable: true, get: function () { return in_memory_transaction_1.FakeInMemoryTransactionPerformer; } });
|
|
7
|
+
var in_memory_database_1 = require("./store/in-memory.database");
|
|
8
|
+
Object.defineProperty(exports, "InMemoryDatabase", { enumerable: true, get: function () { return in_memory_database_1.InMemoryDatabase; } });
|
|
9
|
+
var in_memory_store_1 = require("./store/in-memory.store");
|
|
10
|
+
Object.defineProperty(exports, "InMemoryStore", { enumerable: true, get: function () { return in_memory_store_1.InMemoryStore; } });
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iEAGiC;AAF/B,qIAAA,4BAA4B,OAAA;AAC5B,yIAAA,gCAAgC,OAAA;AAElC,iEAGoC;AAFlC,sHAAA,gBAAgB,OAAA;AAGlB,2DAAwD;AAA/C,gHAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Collection = void 0;
|
|
4
|
+
class Collection {
|
|
5
|
+
data;
|
|
6
|
+
constructor(data = new Map()) {
|
|
7
|
+
this.data = data;
|
|
8
|
+
}
|
|
9
|
+
clear() {
|
|
10
|
+
this.data.clear();
|
|
11
|
+
}
|
|
12
|
+
getLatestSnapshot(id) {
|
|
13
|
+
const data = [...this.data.values()];
|
|
14
|
+
const sameId = data.filter((d) => d.data.id === id);
|
|
15
|
+
const sorted = sameId.sort((a, b) => b.savedAt - a.savedAt);
|
|
16
|
+
return sorted[0]?.data;
|
|
17
|
+
}
|
|
18
|
+
clone() {
|
|
19
|
+
const clone = new Map();
|
|
20
|
+
for (const [key, value] of this.data) {
|
|
21
|
+
clone.set(key, value);
|
|
22
|
+
}
|
|
23
|
+
return new Collection(clone);
|
|
24
|
+
}
|
|
25
|
+
merge(other) {
|
|
26
|
+
const merge = new Map();
|
|
27
|
+
for (const [key, value] of this.data) {
|
|
28
|
+
merge.set(key, value);
|
|
29
|
+
}
|
|
30
|
+
for (const [key, value] of other.data) {
|
|
31
|
+
merge.set(key, value);
|
|
32
|
+
}
|
|
33
|
+
return new Collection(merge);
|
|
34
|
+
}
|
|
35
|
+
delete(id) {
|
|
36
|
+
this.data.delete(id);
|
|
37
|
+
}
|
|
38
|
+
get(id) {
|
|
39
|
+
return this.data.get(id)?.data;
|
|
40
|
+
}
|
|
41
|
+
getAll() {
|
|
42
|
+
return [...this.data.entries()].map(([id, data]) => data.data);
|
|
43
|
+
}
|
|
44
|
+
save(id, data) {
|
|
45
|
+
const now = process.hrtime();
|
|
46
|
+
const total = now[0] * 1e9 + now[1];
|
|
47
|
+
this.data.set(id, { savedAt: total, data });
|
|
48
|
+
}
|
|
49
|
+
toPretty() {
|
|
50
|
+
return [...this.data.entries()]
|
|
51
|
+
.map(([id, data]) => `\t\t"${id}": ${JSON.stringify(data.data, replaceBigInt)}`)
|
|
52
|
+
.join(",\n");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.Collection = Collection;
|
|
56
|
+
function replaceBigInt(key, value) {
|
|
57
|
+
if (typeof value === "bigint") {
|
|
58
|
+
return value.toString();
|
|
59
|
+
}
|
|
60
|
+
return value;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=in-memory.collection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory.collection.js","sourceRoot":"","sources":["../../src/store/in-memory.collection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InMemoryDatabase = void 0;
|
|
4
|
+
const in_memory_storage_1 = require("./in-memory.storage");
|
|
5
|
+
class TransactionNotFound extends Error {
|
|
6
|
+
constructor(trx) {
|
|
7
|
+
super(`Transaction "${trx}" not found`);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
class WriteCollisionDetected extends Error {
|
|
11
|
+
constructor(id) {
|
|
12
|
+
super(`Write collision detected for key "${id}"`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
class InMemoryDatabase {
|
|
16
|
+
storage = new in_memory_storage_1.Storage();
|
|
17
|
+
transactions = new Map();
|
|
18
|
+
getStorage(trx) {
|
|
19
|
+
if (trx) {
|
|
20
|
+
const storage = this.transactions.get(trx);
|
|
21
|
+
if (!storage) {
|
|
22
|
+
throw new TransactionNotFound(trx);
|
|
23
|
+
}
|
|
24
|
+
return storage;
|
|
25
|
+
}
|
|
26
|
+
return this.storage;
|
|
27
|
+
}
|
|
28
|
+
clear(collectionName) {
|
|
29
|
+
this.storage.getCollection(collectionName).clear();
|
|
30
|
+
}
|
|
31
|
+
load(collectionName, id, trx) {
|
|
32
|
+
return this.getStorage(trx).getCollection(collectionName).get(id);
|
|
33
|
+
}
|
|
34
|
+
delete(collectionName, id) {
|
|
35
|
+
// TODO: implement transactional delete
|
|
36
|
+
this.storage.getCollection(collectionName).delete(id);
|
|
37
|
+
}
|
|
38
|
+
loadAll(collectionName, trx) {
|
|
39
|
+
return this.getStorage(trx).getCollection(collectionName).getAll();
|
|
40
|
+
}
|
|
41
|
+
loadLatestSnapshot(id) {
|
|
42
|
+
return this.storage.getCollection("snapshots").getLatestSnapshot(id);
|
|
43
|
+
}
|
|
44
|
+
save(collectionName, id, data, trx) {
|
|
45
|
+
const globalStorage = this.storage;
|
|
46
|
+
const targetStorage = this.getStorage(trx);
|
|
47
|
+
if (globalStorage.getCollection(collectionName).get(id) &&
|
|
48
|
+
globalStorage.getCollection(collectionName).get(id) !==
|
|
49
|
+
targetStorage.getCollection(collectionName).get(id)) {
|
|
50
|
+
throw new WriteCollisionDetected(id);
|
|
51
|
+
}
|
|
52
|
+
targetStorage.getCollection(collectionName).save(id, data);
|
|
53
|
+
}
|
|
54
|
+
initiateTransaction(trx = Math.random().toString().substring(2)) {
|
|
55
|
+
const snapshot = this.storage.clone();
|
|
56
|
+
this.transactions.set(trx, snapshot);
|
|
57
|
+
return trx;
|
|
58
|
+
}
|
|
59
|
+
async transactionally(fn) {
|
|
60
|
+
const trx = this.initiateTransaction();
|
|
61
|
+
let retry = 5;
|
|
62
|
+
let latestReturnValue = undefined;
|
|
63
|
+
while (retry--) {
|
|
64
|
+
try {
|
|
65
|
+
latestReturnValue = await fn(trx);
|
|
66
|
+
this.commit(trx);
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (error instanceof WriteCollisionDetected ||
|
|
71
|
+
error instanceof TransactionNotFound) {
|
|
72
|
+
this.initiateTransaction(trx);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (retry === -1) {
|
|
80
|
+
throw new Error("failed to execute transaction after 5 retries");
|
|
81
|
+
}
|
|
82
|
+
return latestReturnValue;
|
|
83
|
+
}
|
|
84
|
+
commit(trx) {
|
|
85
|
+
const snapshot = this.transactions.get(trx);
|
|
86
|
+
if (!snapshot) {
|
|
87
|
+
throw new TransactionNotFound(trx);
|
|
88
|
+
}
|
|
89
|
+
this.storage = this.storage.clone().merge(snapshot);
|
|
90
|
+
this.transactions.delete(trx);
|
|
91
|
+
}
|
|
92
|
+
print() {
|
|
93
|
+
console.log([
|
|
94
|
+
"Database:",
|
|
95
|
+
this.storage.toPretty(),
|
|
96
|
+
"",
|
|
97
|
+
"Transactions:",
|
|
98
|
+
...[...this.transactions.entries()].map(([trx, storage]) => `\t${trx}: ${storage.toPretty()}`),
|
|
99
|
+
].join("\n"));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.InMemoryDatabase = InMemoryDatabase;
|
|
103
|
+
//# sourceMappingURL=in-memory.database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory.database.js","sourceRoot":"","sources":["../../src/store/in-memory.database.ts"],"names":[],"mappings":";;;AAAA,2DAA8C;AAI9C,MAAM,mBAAoB,SAAQ,KAAK;IACrC,YAAY,GAAwB;QAClC,KAAK,CAAC,gBAAgB,GAAG,aAAa,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,sBAAuB,SAAQ,KAAK;IACxC,YAAY,EAAU;QACpB,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAa,gBAAgB;IACnB,OAAO,GAAG,IAAI,2BAAO,EAAE,CAAC;IACxB,YAAY,GAAG,IAAI,GAAG,EAAgC,CAAC;IAE/D,UAAU,CAAC,GAAyB;QAClC,IAAI,GAAG,EAAE;YACP,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO,EAAE;gBACZ,MAAM,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC;aACpC;YACD,OAAO,OAAO,CAAC;SAChB;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,cAAsB;QAC1B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,CAAC;IACrD,CAAC;IAED,IAAI,CAAC,cAAsB,EAAE,EAAU,EAAE,GAAyB;QAChE,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,cAAsB,EAAE,EAAU;QACvC,uCAAuC;QACvC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,CAAC,cAAsB,EAAE,GAAyB;QACvD,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,MAAM,EAAE,CAAC;IACrE,CAAC;IAED,kBAAkB,CAAC,EAAU;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,CACF,cAAsB,EACtB,EAAU,EACV,IAAS,EACT,GAAyB;QAEzB,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC;QACnC,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAE3C,IACE,aAAa,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD,aAAa,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjD,aAAa,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EACrD;YACA,MAAM,IAAI,sBAAsB,CAAC,EAAE,CAAC,CAAC;SACtC;QAED,aAAa,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC7D,CAAC;IAEO,mBAAmB,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAEtC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACrC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,EAAqC;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACvC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,iBAAiB,GAAG,SAAS,CAAC;QAClC,OAAO,KAAK,EAAE,EAAE;YACd,IAAI;gBACF,iBAAiB,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;gBAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjB,MAAM;aACP;YAAC,OAAO,KAAK,EAAE;gBACd,IACE,KAAK,YAAY,sBAAsB;oBACvC,KAAK,YAAY,mBAAmB,EACpC;oBACA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;iBAC/B;qBAAM;oBACL,MAAM,KAAK,CAAC;iBACb;aACF;SACF;QAED,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;SAClE;QAED,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAEO,MAAM,CAAC,GAAwB;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC;SACpC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,KAAK;QACH,OAAO,CAAC,GAAG,CACT;YACE,WAAW;YACX,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;YACvB,EAAE;YACF,eAAe;YACf,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CACrC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,OAAO,CAAC,QAAQ,EAAE,EAAE,CACtD;SACF,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;CACF;AAlHD,4CAkHC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Storage = void 0;
|
|
4
|
+
const in_memory_collection_1 = require("./in-memory.collection");
|
|
5
|
+
class Storage {
|
|
6
|
+
collections;
|
|
7
|
+
constructor(collections = new Map()) {
|
|
8
|
+
this.collections = collections;
|
|
9
|
+
}
|
|
10
|
+
clone() {
|
|
11
|
+
const clone = new Map();
|
|
12
|
+
for (const [collectionName, collection] of this.collections) {
|
|
13
|
+
clone.set(collectionName, collection.clone());
|
|
14
|
+
}
|
|
15
|
+
return new Storage(clone);
|
|
16
|
+
}
|
|
17
|
+
merge(other) {
|
|
18
|
+
const collections = new Map();
|
|
19
|
+
for (const [collectionName, collection] of other.collections) {
|
|
20
|
+
collections.set(collectionName, this.getCollection(collectionName).merge(collection));
|
|
21
|
+
}
|
|
22
|
+
return new Storage(collections);
|
|
23
|
+
}
|
|
24
|
+
getCollection(collectionName) {
|
|
25
|
+
const collection = this.collections.get(collectionName) || new in_memory_collection_1.Collection();
|
|
26
|
+
this.collections.set(collectionName, collection);
|
|
27
|
+
return collection;
|
|
28
|
+
}
|
|
29
|
+
toPretty() {
|
|
30
|
+
return [...this.collections.entries()]
|
|
31
|
+
.map(([collectionName, collection]) => {
|
|
32
|
+
return [
|
|
33
|
+
'Collection: "' + collectionName + '"',
|
|
34
|
+
collection.toPretty(),
|
|
35
|
+
].join("\n");
|
|
36
|
+
})
|
|
37
|
+
.join("\n");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.Storage = Storage;
|
|
41
|
+
//# sourceMappingURL=in-memory.storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory.storage.js","sourceRoot":"","sources":["../../src/store/in-memory.storage.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAEpD,MAAa,OAAO;IACE;IAApB,YAAoB,cAAuC,IAAI,GAAG,EAAE;QAAhD,gBAAW,GAAX,WAAW,CAAqC;IAAG,CAAC;IAExE,KAAK;QACH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;QAC5C,KAAK,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;YAC3D,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;SAC/C;QAED,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,KAAc;QAClB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;QAClD,KAAK,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE;YAC5D,WAAW,CAAC,GAAG,CACb,cAAc,EACd,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CACrD,CAAC;SACH;QACD,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;IAED,aAAa,CAAC,cAAsB;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI,iCAAU,EAAE,CAAC;QAC5E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;QACjD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;aACnC,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,UAAU,CAAC,EAAE,EAAE;YACpC,OAAO;gBACL,eAAe,GAAG,cAAc,GAAG,GAAG;gBACtC,UAAU,CAAC,QAAQ,EAAE;aACtB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;CACF;AAvCD,0BAuCC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InMemoryStore = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* This in memory store is a copy store. It stores a copy of the actual model.
|
|
6
|
+
* It is the recommended inmemory store to use, as it reflects more closely the behaviour of a real store.
|
|
7
|
+
*/
|
|
8
|
+
class InMemoryStore {
|
|
9
|
+
collection;
|
|
10
|
+
database;
|
|
11
|
+
serializer;
|
|
12
|
+
constructor(collection, database, serializer) {
|
|
13
|
+
this.collection = collection;
|
|
14
|
+
this.database = database;
|
|
15
|
+
this.serializer = serializer;
|
|
16
|
+
}
|
|
17
|
+
async filter(predicate, trx) {
|
|
18
|
+
const serialized = await this.database.loadAll(this.collection, trx);
|
|
19
|
+
const all = await Promise.all(serialized.map((s) => this.serializer.deserialize(s)));
|
|
20
|
+
return all.filter(predicate);
|
|
21
|
+
}
|
|
22
|
+
clear() {
|
|
23
|
+
this.database.clear(this.collection);
|
|
24
|
+
}
|
|
25
|
+
async save(model, trx) {
|
|
26
|
+
await this.database.save(this.collection, model.id.toString(), await this.serializer.serialize(model), trx);
|
|
27
|
+
}
|
|
28
|
+
async load(id, trx) {
|
|
29
|
+
const serialized = await this.database.load(this.collection, id.toString(), trx);
|
|
30
|
+
if (!serialized) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
return this.serializer.deserialize(serialized);
|
|
34
|
+
}
|
|
35
|
+
loadAll() {
|
|
36
|
+
const serialized = this.database.loadAll(this.collection);
|
|
37
|
+
return Promise.all(serialized.map((s) => this.serializer.deserialize(s)));
|
|
38
|
+
}
|
|
39
|
+
async delete(id) {
|
|
40
|
+
this.database.delete(this.collection, id.toString());
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.InMemoryStore = InMemoryStore;
|
|
44
|
+
//# sourceMappingURL=in-memory.store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory.store.js","sourceRoot":"","sources":["../../src/store/in-memory.store.ts"],"names":[],"mappings":";;;AAGA;;;GAGG;AACH,MAAa,aAAa;IAIN;IACA;IACA;IAHlB,YACkB,UAAkB,EAClB,QAA0B,EAC1B,UAA6B;QAF7B,eAAU,GAAV,UAAU,CAAQ;QAClB,aAAQ,GAAR,QAAQ,CAAkB;QAC1B,eAAU,GAAV,UAAU,CAAmB;IAC5C,CAAC;IAEM,KAAK,CAAC,MAAM,CACpB,SAAoC,EACpC,GAAyB;QAEzB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAErE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAC3B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CACtD,CAAC;QAEF,OAAO,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAY,EAAE,GAAyB;QAChD,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CACtB,IAAI,CAAC,UAAU,EACf,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,EACnB,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,EACtC,GAAG,CACJ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CACR,EAAe,EACf,GAAyB;QAEzB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CACzC,IAAI,CAAC,UAAU,EACf,EAAE,CAAC,QAAQ,EAAE,EACb,GAAG,CACJ,CAAC;QAEF,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,SAAS,CAAC;SAClB;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAED,OAAO;QACL,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE1D,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAe;QAC1B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;CACF;AA7DD,sCA6DC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ddd-ts/store-inmemory",
|
|
3
|
+
"version": "0.0.0-feat.june-improvements.c0df263",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"types": "src/index.ts",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "builder"
|
|
9
|
+
},
|
|
10
|
+
"peerDependencies": {
|
|
11
|
+
"@ddd-ts/model": "*"
|
|
12
|
+
},
|
|
13
|
+
"devDependencies": {
|
|
14
|
+
"@ddd-ts/dev": "*",
|
|
15
|
+
"@ddd-ts/types": "*"
|
|
16
|
+
}
|
|
17
|
+
}
|