@effect-app/infra 0.24.0 → 0.24.2
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/_cjs/services/Store/Disk.cjs +50 -21
- package/_cjs/services/Store/Disk.cjs.map +1 -1
- package/_cjs/services/Store/Memory.cjs +42 -27
- package/_cjs/services/Store/Memory.cjs.map +1 -1
- package/_src/services/Store/Disk.ts +86 -45
- package/_src/services/Store/Memory.ts +70 -52
- package/dist/services/Store/Disk.d.ts +1 -1
- package/dist/services/Store/Disk.d.ts.map +1 -1
- package/dist/services/Store/Disk.js +56 -24
- package/dist/services/Store/Memory.d.ts +1 -0
- package/dist/services/Store/Memory.d.ts.map +1 -1
- package/dist/services/Store/Memory.js +43 -29
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,7 +7,8 @@ exports.DiskStoreLive = DiskStoreLive;
|
|
|
7
7
|
exports.makeDiskStore = makeDiskStore;
|
|
8
8
|
var tsplus_module_1 = _interopRequireWildcard(require("@effect/io/Effect"));
|
|
9
9
|
var tsplus_module_2 = _interopRequireWildcard(require("@effect-app/core/Function"));
|
|
10
|
-
var tsplus_module_3 = _interopRequireWildcard(require("@effect
|
|
10
|
+
var tsplus_module_3 = _interopRequireWildcard(require("@effect/io/FiberRef"));
|
|
11
|
+
var tsplus_module_4 = _interopRequireWildcard(require("@effect-app/core/Effect"));
|
|
11
12
|
var fu = _interopRequireWildcard(require("@effect-app/infra-adapters/fileUtil"));
|
|
12
13
|
var _fs = _interopRequireDefault(require("fs"));
|
|
13
14
|
var _Memory = require("./Memory.cjs");
|
|
@@ -17,6 +18,27 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
|
|
|
17
18
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
18
19
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
19
20
|
|
|
21
|
+
function makeDiskStoreInt(prefix, namespace, dir, name, existing) {
|
|
22
|
+
return tsplus_module_1.gen(function* ($) {
|
|
23
|
+
const file = dir + "/" + prefix + name + (namespace === "primary" ? "" : "-" + namespace) + ".json";
|
|
24
|
+
const fsStore = {
|
|
25
|
+
get: tsplus_module_1.orDie(tsplus_module_1.map(x => JSON.parse(x))(fu.readTextFile(file))),
|
|
26
|
+
setRaw: v => JSON.stringify([...v], undefined, 2)["|>"](json => fu.writeTextFile(file, json))
|
|
27
|
+
};
|
|
28
|
+
const store = yield* $((0, _Memory.makeMemoryStoreInt)(name, !_fs.default.existsSync(file) ? existing ?? tsplus_module_1.sync(() => new Map()) : tsplus_module_1.map(x => new Map(x.map(x => [x.id, x])))(fsStore.get)));
|
|
29
|
+
yield* $(tsplus_module_1.flatMap(fsStore.setRaw)(store.all));
|
|
30
|
+
const sem = tsplus_module_1.unsafeMakeSemaphore(1);
|
|
31
|
+
const withPermit = sem.withPermits(1);
|
|
32
|
+
const flushToDisk = withPermit(tsplus_module_1.flatMap(fsStore.setRaw)(store.all));
|
|
33
|
+
return {
|
|
34
|
+
...store,
|
|
35
|
+
batchSet: tsplus_module_2.flow(store.batchSet, t => tsplus_module_1.tap(() => tsplus_module_1.forkDaemon(tsplus_module_1.tapErrorCause(err => tsplus_module_1.sync(() => console.error(err)))(flushToDisk)))(t)),
|
|
36
|
+
bulkSet: tsplus_module_2.flow(store.bulkSet, t => tsplus_module_1.tap(() => tsplus_module_1.forkDaemon(tsplus_module_1.tapErrorCause(err => tsplus_module_1.sync(() => console.error(err)))(flushToDisk)))(t)),
|
|
37
|
+
set: tsplus_module_2.flow(store.set, t => tsplus_module_1.tap(() => tsplus_module_1.forkDaemon(tsplus_module_1.tapErrorCause(err => tsplus_module_1.sync(() => console.error(err)))(flushToDisk)))(t)),
|
|
38
|
+
remove: tsplus_module_2.flow(store.remove, t => tsplus_module_1.tap(() => tsplus_module_1.forkDaemon(tsplus_module_1.tapErrorCause(err => tsplus_module_1.sync(() => console.error(err)))(flushToDisk)))(t))
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
}
|
|
20
42
|
/**
|
|
21
43
|
* The Disk-backed store, flushes writes in background, but keeps the data in memory
|
|
22
44
|
* and should therefore be as fast as the Memory Store.
|
|
@@ -30,26 +52,33 @@ function makeDiskStore({
|
|
|
30
52
|
_fs.default.mkdirSync(dir);
|
|
31
53
|
}
|
|
32
54
|
return {
|
|
33
|
-
make: (name, existing,
|
|
34
|
-
const
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
55
|
+
make: (name, existing, config) => tsplus_module_1.gen(function* ($) {
|
|
56
|
+
const storesSem = tsplus_module_1.unsafeMakeSemaphore(1);
|
|
57
|
+
const primary = yield* $(makeDiskStoreInt(prefix, "primary", dir, name, existing));
|
|
58
|
+
const stores = new Map([["primary", primary]]);
|
|
59
|
+
const getStore = !config?.allowNamespace ? tsplus_module_1.succeed(primary) : tsplus_module_1.flatMap(namespace => {
|
|
60
|
+
const store = stores.get(namespace);
|
|
61
|
+
if (store) {
|
|
62
|
+
return tsplus_module_1.succeed(store);
|
|
63
|
+
}
|
|
64
|
+
if (!config.allowNamespace(namespace)) {
|
|
65
|
+
throw new Error(`Namespace ${namespace} not allowed!`);
|
|
66
|
+
}
|
|
67
|
+
return storesSem.withPermits(1)(tsplus_module_1.suspendSucceed(() => {
|
|
68
|
+
const existing = stores.get(namespace);
|
|
69
|
+
if (existing) return tsplus_module_1.sync(() => existing);
|
|
70
|
+
return tsplus_module_1.tap(store => tsplus_module_1.sync(() => stores.set(namespace, store)))(makeDiskStoreInt(prefix, namespace, dir, name, existing));
|
|
71
|
+
}));
|
|
72
|
+
})(tsplus_module_3.get(_Memory.storeId));
|
|
47
73
|
const s = {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
74
|
+
all: tsplus_module_1.flatMap(_ => _.all)(getStore),
|
|
75
|
+
find: (...args) => tsplus_module_1.flatMap(_ => _.find(...args))(getStore),
|
|
76
|
+
filter: (...args) => tsplus_module_1.flatMap(_ => _.filter(...args))(getStore),
|
|
77
|
+
filterJoinSelect: (...args) => tsplus_module_1.flatMap(_ => _.filterJoinSelect(...args))(getStore),
|
|
78
|
+
set: (...args) => tsplus_module_1.flatMap(_ => _.set(...args))(getStore),
|
|
79
|
+
batchSet: (...args) => tsplus_module_1.flatMap(_ => _.batchSet(...args))(getStore),
|
|
80
|
+
bulkSet: (...args) => tsplus_module_1.flatMap(_ => _.bulkSet(...args))(getStore),
|
|
81
|
+
remove: (...args) => tsplus_module_1.flatMap(_ => _.remove(...args))(getStore)
|
|
53
82
|
};
|
|
54
83
|
return s;
|
|
55
84
|
})
|
|
@@ -57,6 +86,6 @@ function makeDiskStore({
|
|
|
57
86
|
});
|
|
58
87
|
}
|
|
59
88
|
function DiskStoreLive(config) {
|
|
60
|
-
return
|
|
89
|
+
return tsplus_module_4.toLayer(tsplus_module_1.flatMap(makeDiskStore)(tsplus_module_1.config(config)), _service.StoreMaker);
|
|
61
90
|
}
|
|
62
91
|
//# sourceMappingURL=Disk.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Disk.cjs","mappings":"
|
|
1
|
+
{"version":3,"file":"Disk.cjs","mappings":"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","names":["makeDiskStoreInt","prefix","namespace","dir","name","existing","tsplus_module_1","$","file","fsStore","get","x","JSON","parse","fu","readTextFile","setRaw","v","stringify","undefined","json","writeTextFile","store","fs","existsSync","Map","map","id","all","sem","withPermit","withPermits","flushToDisk","batchSet","tsplus_module_2","t","err","console","error","bulkSet","set","remove","makeDiskStore","mkdirSync","make","config","storesSem","primary","stores","getStore","allowNamespace","Error","storeId","s","_","find","args","filter","filterJoinSelect","DiskStoreLive","tsplus_module_4","StoreMaker"],"sourceRoot":"","sources":["../../../_src/services/Store/Disk.ts"],"sourcesContent":[null]}
|
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.makeMemoryStore = exports.MemoryStoreLive = void 0;
|
|
7
|
+
exports.makeMemoryStoreInt = makeMemoryStoreInt;
|
|
7
8
|
exports.memFilter = memFilter;
|
|
8
9
|
exports.storeId = exports.restoreFromRequestContext = void 0;
|
|
9
10
|
var tsplus_module_1 = _interopRequireWildcard(require("@effect/data/Chunk"));
|
|
@@ -44,48 +45,62 @@ const storeId = tsplus_module_5.unsafeMake("primary");
|
|
|
44
45
|
exports.storeId = storeId;
|
|
45
46
|
const restoreFromRequestContext = tsplus_module_7.serviceWithEffect(tsplus_module_6.tag, ctx => tsplus_module_5.set(ctx.parent?.namespace ?? ctx.namespace ?? "primary")(storeId));
|
|
46
47
|
exports.restoreFromRequestContext = restoreFromRequestContext;
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
function makeMemoryStoreInt(name, existing) {
|
|
49
|
+
return tsplus_module_7.gen(function* ($) {
|
|
49
50
|
const updateETag = (0, _utils.makeUpdateETag)(name);
|
|
50
51
|
const items = yield* $(existing ?? tsplus_module_7.sync(() => new Map()));
|
|
51
52
|
const makeStore = () => new Map([...items.entries()].map(([id, e]) => [id, (0, _utils.makeETag)(e)]));
|
|
52
|
-
const
|
|
53
|
-
const stores = new Map([["primary", tsplus_module_8.unsafeMake(makeStore())]]);
|
|
54
|
-
const getStore = tsplus_module_7.flatMap(namespace => {
|
|
55
|
-
const store = stores.get(namespace);
|
|
56
|
-
if (!store) {
|
|
57
|
-
if (!config?.allowNamespace || !config.allowNamespace(namespace)) {
|
|
58
|
-
throw new Error(`Namespace ${namespace} not allowed!`);
|
|
59
|
-
}
|
|
60
|
-
return storesSem.withPermits(1)(tsplus_module_7.suspendSucceed(() => {
|
|
61
|
-
const store = stores.get(namespace);
|
|
62
|
-
if (store) return tsplus_module_8.get(store);
|
|
63
|
-
const newStore = tsplus_module_8.unsafeMake(makeStore());
|
|
64
|
-
stores.set(namespace, newStore);
|
|
65
|
-
return tsplus_module_8.get(newStore);
|
|
66
|
-
}));
|
|
67
|
-
}
|
|
68
|
-
return tsplus_module_8.get(store);
|
|
69
|
-
})(tsplus_module_5.get(storeId));
|
|
70
|
-
const setStore = m => tsplus_module_7.flatMap(namespace => tsplus_module_8.set(m)(stores.get(namespace)))(tsplus_module_5.get(storeId));
|
|
53
|
+
const store = tsplus_module_8.unsafeMake(makeStore());
|
|
71
54
|
const sem = tsplus_module_7.unsafeMakeSemaphore(1);
|
|
72
55
|
const withPermit = sem.withPermits(1);
|
|
73
|
-
const values = tsplus_module_7.map(s => s.values())(
|
|
56
|
+
const values = tsplus_module_7.map(s => s.values())(tsplus_module_8.get(store));
|
|
74
57
|
const all = tsplus_module_7.map(tsplus_module_1.fromIterable)(values);
|
|
75
|
-
const batchSet = items => withPermit(tsplus_module_7.map(_ => _.toReadonlyArray())(tsplus_module_7.tap(items => tsplus_module_7.flatMap(_ =>
|
|
58
|
+
const batchSet = items => withPermit(tsplus_module_7.map(_ => _.toReadonlyArray())(tsplus_module_7.tap(items => tsplus_module_7.flatMap(_ => tsplus_module_8.set(_)(store))(tsplus_module_7.map(m => {
|
|
76
59
|
const mut = m;
|
|
77
60
|
items.forEach(e => mut.set(e.id, e));
|
|
78
61
|
return mut;
|
|
79
|
-
})(
|
|
62
|
+
})(tsplus_module_8.get(store))))(tsplus_module_9.ext_forEach(items, i => tsplus_module_7.flatMap(current => updateETag(i, current))(s.find(i.id))))));
|
|
80
63
|
const s = {
|
|
81
64
|
all,
|
|
82
|
-
find: id => tsplus_module_7.map(_ => tsplus_module_3.fromNullable(_.get(id)))(
|
|
65
|
+
find: id => tsplus_module_7.map(_ => tsplus_module_3.fromNullable(_.get(id)))(tsplus_module_8.get(store)),
|
|
83
66
|
filter: (filter, cursor) => tsplus_module_7.map(memFilter(filter, cursor))(all),
|
|
84
67
|
filterJoinSelect: filter => tsplus_module_7.map(c => c.flatMap((0, _utils.codeFilterJoinSelect)(filter)))(all),
|
|
85
|
-
set: e => withPermit(tsplus_module_7.tap(e => tsplus_module_7.flatMap(_ =>
|
|
68
|
+
set: e => withPermit(tsplus_module_7.tap(e => tsplus_module_7.flatMap(_ => tsplus_module_8.set(_)(store))(tsplus_module_7.map(_ => new Map([..._, [e.id, e]]))(tsplus_module_8.get(store))))(tsplus_module_7.flatMap(current => updateETag(e, current))(s.find(e.id)))),
|
|
86
69
|
batchSet,
|
|
87
70
|
bulkSet: batchSet,
|
|
88
|
-
remove: e => withPermit(tsplus_module_7.flatMap(_ =>
|
|
71
|
+
remove: e => withPermit(tsplus_module_7.flatMap(_ => tsplus_module_8.set(_)(store))(tsplus_module_7.map(_ => new Map([..._].filter(([_]) => _ !== e.id)))(tsplus_module_8.get(store))))
|
|
72
|
+
};
|
|
73
|
+
return s;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const makeMemoryStore = () => ({
|
|
77
|
+
make: (name, existing, config) => tsplus_module_7.gen(function* ($) {
|
|
78
|
+
const storesSem = tsplus_module_7.unsafeMakeSemaphore(1);
|
|
79
|
+
const primary = yield* $(makeMemoryStoreInt(name, existing));
|
|
80
|
+
const stores = new Map([["primary", primary]]);
|
|
81
|
+
const getStore = !config?.allowNamespace ? tsplus_module_7.succeed(primary) : tsplus_module_7.flatMap(namespace => {
|
|
82
|
+
const store = stores.get(namespace);
|
|
83
|
+
if (store) {
|
|
84
|
+
return tsplus_module_7.succeed(store);
|
|
85
|
+
}
|
|
86
|
+
if (!config.allowNamespace(namespace)) {
|
|
87
|
+
throw new Error(`Namespace ${namespace} not allowed!`);
|
|
88
|
+
}
|
|
89
|
+
return storesSem.withPermits(1)(tsplus_module_7.suspendSucceed(() => {
|
|
90
|
+
const store = stores.get(namespace);
|
|
91
|
+
if (store) return tsplus_module_7.sync(() => store);
|
|
92
|
+
return tsplus_module_7.tap(store => tsplus_module_7.sync(() => stores.set(namespace, store)))(makeMemoryStoreInt(name, existing));
|
|
93
|
+
}));
|
|
94
|
+
})(tsplus_module_5.get(storeId));
|
|
95
|
+
const s = {
|
|
96
|
+
all: tsplus_module_7.flatMap(_ => _.all)(getStore),
|
|
97
|
+
find: (...args) => tsplus_module_7.flatMap(_ => _.find(...args))(getStore),
|
|
98
|
+
filter: (...args) => tsplus_module_7.flatMap(_ => _.filter(...args))(getStore),
|
|
99
|
+
filterJoinSelect: (...args) => tsplus_module_7.flatMap(_ => _.filterJoinSelect(...args))(getStore),
|
|
100
|
+
set: (...args) => tsplus_module_7.flatMap(_ => _.set(...args))(getStore),
|
|
101
|
+
batchSet: (...args) => tsplus_module_7.flatMap(_ => _.batchSet(...args))(getStore),
|
|
102
|
+
bulkSet: (...args) => tsplus_module_7.flatMap(_ => _.bulkSet(...args))(getStore),
|
|
103
|
+
remove: (...args) => tsplus_module_7.flatMap(_ => _.remove(...args))(getStore)
|
|
89
104
|
};
|
|
90
105
|
return s;
|
|
91
106
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Memory.cjs","mappings":"
|
|
1
|
+
{"version":3,"file":"Memory.cjs","mappings":"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","names":["memFilter","filter","cursor","c","skip","limit","tsplus_module_3","tsplus_module_1","r","undefined","storeId","tsplus_module_5","restoreFromRequestContext","tsplus_module_7","ctx","parent","namespace","makeMemoryStoreInt","name","existing","$","updateETag","items","Map","makeStore","entries","map","id","e","store","tsplus_module_8","sem","withPermit","withPermits","values","s","all","batchSet","_","toReadonlyArray","m","mut","forEach","set","tsplus_module_9","i","current","find","get","filterJoinSelect","flatMap","bulkSet","remove","makeMemoryStore","make","config","storesSem","primary","stores","getStore","allowNamespace","Error","args","MemoryStoreLive","tsplus_module_10"],"sourceRoot":"","sources":["../../../_src/services/Store/Memory.ts"],"sourcesContent":[null]}
|
|
@@ -3,10 +3,63 @@ import * as fu from "@effect-app/infra-adapters/fileUtil"
|
|
|
3
3
|
|
|
4
4
|
import fs from "fs"
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { makeMemoryStoreInt, storeId } from "./Memory.js"
|
|
7
7
|
import type { PersistenceModelType, StorageConfig, Store, StoreConfig } from "./service.js"
|
|
8
8
|
import { StoreMaker } from "./service.js"
|
|
9
9
|
|
|
10
|
+
function makeDiskStoreInt<Id extends string, Id2 extends Id, PM extends PersistenceModelType<Id>>(
|
|
11
|
+
prefix: string,
|
|
12
|
+
namespace: string,
|
|
13
|
+
dir: string,
|
|
14
|
+
name: string,
|
|
15
|
+
existing?: Effect<never, never, ReadonlyMap<Id2, PM>>
|
|
16
|
+
) {
|
|
17
|
+
return Effect.gen(function*($) {
|
|
18
|
+
const file = dir + "/" + prefix + name + (namespace === "primary" ? "" : "-" + namespace) + ".json"
|
|
19
|
+
const fsStore = {
|
|
20
|
+
get: fu
|
|
21
|
+
.readTextFile(file)
|
|
22
|
+
.map(x => JSON.parse(x) as PM[])
|
|
23
|
+
.orDie,
|
|
24
|
+
setRaw: (v: Iterable<PM>) => JSON.stringify([...v], undefined, 2)["|>"](json => fu.writeTextFile(file, json))
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const store = yield* $(
|
|
28
|
+
makeMemoryStoreInt<Id, Id, PM>(
|
|
29
|
+
name,
|
|
30
|
+
!fs.existsSync(file)
|
|
31
|
+
? existing ?? Effect(new Map())
|
|
32
|
+
: fsStore.get.map(x => new Map(x.map(x => [x.id, x] as const)))
|
|
33
|
+
)
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
yield* $(store.all.flatMap(fsStore.setRaw))
|
|
37
|
+
|
|
38
|
+
const sem = Semaphore.unsafeMake(1)
|
|
39
|
+
const withPermit = sem.withPermits(1)
|
|
40
|
+
const flushToDisk = store.all.flatMap(fsStore.setRaw).apply(withPermit)
|
|
41
|
+
return {
|
|
42
|
+
...store,
|
|
43
|
+
batchSet: flow(
|
|
44
|
+
store.batchSet,
|
|
45
|
+
t => t.tap(() => flushToDisk.tapErrorCause(err => Effect(console.error(err))).forkDaemon)
|
|
46
|
+
),
|
|
47
|
+
bulkSet: flow(
|
|
48
|
+
store.bulkSet,
|
|
49
|
+
t => t.tap(() => flushToDisk.tapErrorCause(err => Effect(console.error(err))).forkDaemon)
|
|
50
|
+
),
|
|
51
|
+
set: flow(
|
|
52
|
+
store.set,
|
|
53
|
+
t => t.tap(() => flushToDisk.tapErrorCause(err => Effect(console.error(err))).forkDaemon)
|
|
54
|
+
),
|
|
55
|
+
remove: flow(
|
|
56
|
+
store.remove,
|
|
57
|
+
t => t.tap(() => flushToDisk.tapErrorCause(err => Effect(console.error(err))).forkDaemon)
|
|
58
|
+
)
|
|
59
|
+
} satisfies Store<PM, Id>
|
|
60
|
+
})
|
|
61
|
+
}
|
|
62
|
+
|
|
10
63
|
/**
|
|
11
64
|
* The Disk-backed store, flushes writes in background, but keeps the data in memory
|
|
12
65
|
* and should therefore be as fast as the Memory Store.
|
|
@@ -18,55 +71,43 @@ export function makeDiskStore({ prefix }: StorageConfig) {
|
|
|
18
71
|
fs.mkdirSync(dir)
|
|
19
72
|
}
|
|
20
73
|
return {
|
|
21
|
-
make: <Id extends string, Id2 extends Id,
|
|
74
|
+
make: <Id extends string, Id2 extends Id, PM extends PersistenceModelType<Id>>(
|
|
22
75
|
name: string,
|
|
23
|
-
existing?: Effect<never, never, ReadonlyMap<Id2,
|
|
24
|
-
|
|
76
|
+
existing?: Effect<never, never, ReadonlyMap<Id2, PM>>,
|
|
77
|
+
config?: StoreConfig<PM>
|
|
25
78
|
) =>
|
|
26
79
|
Effect.gen(function*($) {
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
80
|
+
const storesSem = Semaphore.unsafeMake(1)
|
|
81
|
+
const primary = yield* $(makeDiskStoreInt(prefix, "primary", dir, name, existing))
|
|
82
|
+
const stores = new Map<string, Store<PM, Id>>([["primary", primary]])
|
|
83
|
+
const getStore = !config?.allowNamespace ? Effect.succeed(primary) : storeId.get.flatMap(namespace => {
|
|
84
|
+
const store = stores.get(namespace)
|
|
85
|
+
if (store) {
|
|
86
|
+
return Effect.succeed(store)
|
|
87
|
+
}
|
|
88
|
+
if (!config.allowNamespace!(namespace)) {
|
|
89
|
+
throw new Error(`Namespace ${namespace} not allowed!`)
|
|
90
|
+
}
|
|
91
|
+
return storesSem.withPermits(1)(
|
|
92
|
+
Effect.suspendSucceed(() => {
|
|
93
|
+
const existing = stores.get(namespace)
|
|
94
|
+
if (existing) return Effect(existing)
|
|
95
|
+
return makeDiskStoreInt<Id, Id2, PM>(prefix, namespace, dir, name, existing).tap(store =>
|
|
96
|
+
Effect.sync(() => stores.set(namespace, store))
|
|
97
|
+
)
|
|
98
|
+
})
|
|
44
99
|
)
|
|
45
|
-
)
|
|
46
|
-
|
|
47
|
-
yield* $(store.all.flatMap(fsStore.setRaw))
|
|
100
|
+
})
|
|
48
101
|
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
...
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
bulkSet:
|
|
57
|
-
|
|
58
|
-
flushToDisk.tapErrorCause(err =>
|
|
59
|
-
Effect(console.error(err))
|
|
60
|
-
).forkDaemon
|
|
61
|
-
)),
|
|
62
|
-
set: flow(store.set, t =>
|
|
63
|
-
t.tap(() => flushToDisk.tapErrorCause(err => Effect(console.error(err))).forkDaemon)),
|
|
64
|
-
remove: flow(store.remove, t =>
|
|
65
|
-
t.tap(() =>
|
|
66
|
-
flushToDisk.tapErrorCause(err =>
|
|
67
|
-
Effect(console.error(err))
|
|
68
|
-
).forkDaemon
|
|
69
|
-
))
|
|
102
|
+
const s: Store<PM, Id> = {
|
|
103
|
+
all: getStore.flatMap(_ => _.all),
|
|
104
|
+
find: (...args) => getStore.flatMap(_ => _.find(...args)),
|
|
105
|
+
filter: (...args) => getStore.flatMap(_ => _.filter(...args)),
|
|
106
|
+
filterJoinSelect: (...args) => getStore.flatMap(_ => _.filterJoinSelect(...args)),
|
|
107
|
+
set: (...args) => getStore.flatMap(_ => _.set(...args)),
|
|
108
|
+
batchSet: (...args) => getStore.flatMap(_ => _.batchSet(...args)),
|
|
109
|
+
bulkSet: (...args) => getStore.flatMap(_ => _.bulkSet(...args)),
|
|
110
|
+
remove: (...args) => getStore.flatMap(_ => _.remove(...args))
|
|
70
111
|
}
|
|
71
112
|
return s
|
|
72
113
|
})
|
|
@@ -28,6 +28,55 @@ export const restoreFromRequestContext = RequestContext.Tag.accessWithEffect(ctx
|
|
|
28
28
|
storeId.set(ctx.parent?.namespace ?? ctx.namespace ?? "primary")
|
|
29
29
|
)
|
|
30
30
|
|
|
31
|
+
export function makeMemoryStoreInt<Id extends string, Id2 extends Id, PM extends PersistenceModelType<Id>>(
|
|
32
|
+
name: string,
|
|
33
|
+
existing?: Effect<never, never, ReadonlyMap<Id2, PM>>
|
|
34
|
+
) {
|
|
35
|
+
return Effect.gen(function*($) {
|
|
36
|
+
const updateETag = makeUpdateETag(name)
|
|
37
|
+
const items: ReadonlyMap<Id, PM> = yield* $(existing ?? Effect(new Map<Id, PM>()))
|
|
38
|
+
const makeStore = (): ReadonlyMap<Id, PM> => new Map([...items.entries()].map(([id, e]) => [id, makeETag(e)]))
|
|
39
|
+
const store = Ref.unsafeMake(makeStore())
|
|
40
|
+
const sem = Semaphore.unsafeMake(1)
|
|
41
|
+
const withPermit = sem.withPermits(1)
|
|
42
|
+
const values = store.get.map(s => s.values())
|
|
43
|
+
const all = values.map(Chunk.fromIterable)
|
|
44
|
+
const batchSet = (items: NonEmptyReadonlyArray<PM>) =>
|
|
45
|
+
items
|
|
46
|
+
.forEachEffect(i => s.find(i.id).flatMap(current => updateETag(i, current)))
|
|
47
|
+
.tap(items =>
|
|
48
|
+
store.get
|
|
49
|
+
.map(m => {
|
|
50
|
+
const mut = m as Map<Id, PM>
|
|
51
|
+
items.forEach(e => mut.set(e.id, e))
|
|
52
|
+
return mut
|
|
53
|
+
})
|
|
54
|
+
.flatMap(_ => store.set(_))
|
|
55
|
+
)
|
|
56
|
+
.map(_ => _.toReadonlyArray() as NonEmptyReadonlyArray<PM>)
|
|
57
|
+
.apply(withPermit)
|
|
58
|
+
const s: Store<PM, Id> = {
|
|
59
|
+
all,
|
|
60
|
+
find: id => store.get.map(_ => Option.fromNullable(_.get(id))),
|
|
61
|
+
filter: (filter: Filter<PM>, cursor?: { skip?: number; limit?: number }) => all.map(memFilter(filter, cursor)),
|
|
62
|
+
filterJoinSelect: <T extends object>(filter: FilterJoinSelect) =>
|
|
63
|
+
all.map(c => c.flatMap(codeFilterJoinSelect<PM, T>(filter))),
|
|
64
|
+
set: e =>
|
|
65
|
+
s
|
|
66
|
+
.find(e.id)
|
|
67
|
+
.flatMap(current => updateETag(e, current))
|
|
68
|
+
.tap(e => store.get.map(_ => new Map([..._, [e.id, e]])).flatMap(_ => store.set(_)))
|
|
69
|
+
.apply(withPermit),
|
|
70
|
+
batchSet,
|
|
71
|
+
bulkSet: batchSet,
|
|
72
|
+
remove: (e: PM) =>
|
|
73
|
+
store.get.map(_ => new Map([..._].filter(([_]) => _ !== e.id)))
|
|
74
|
+
.flatMap(_ => store.set(_)).apply(withPermit)
|
|
75
|
+
}
|
|
76
|
+
return s
|
|
77
|
+
})
|
|
78
|
+
}
|
|
79
|
+
|
|
31
80
|
export const makeMemoryStore = () => ({
|
|
32
81
|
make: <Id extends string, Id2 extends Id, PM extends PersistenceModelType<Id>>(
|
|
33
82
|
name: string,
|
|
@@ -35,63 +84,32 @@ export const makeMemoryStore = () => ({
|
|
|
35
84
|
config?: StoreConfig<PM>
|
|
36
85
|
) =>
|
|
37
86
|
Effect.gen(function*($) {
|
|
38
|
-
const updateETag = makeUpdateETag(name)
|
|
39
|
-
const items: ReadonlyMap<Id, PM> = yield* $(existing ?? Effect(new Map<Id, PM>()))
|
|
40
|
-
const makeStore = (): ReadonlyMap<Id, PM> => new Map([...items.entries()].map(([id, e]) => [id, makeETag(e)]))
|
|
41
87
|
const storesSem = Semaphore.unsafeMake(1)
|
|
42
|
-
const
|
|
43
|
-
const
|
|
88
|
+
const primary = yield* $(makeMemoryStoreInt<Id, Id2, PM>(name, existing))
|
|
89
|
+
const stores = new Map([["primary", primary]])
|
|
90
|
+
const getStore = !config?.allowNamespace ? Effect.succeed(primary) : storeId.get.flatMap(namespace => {
|
|
44
91
|
const store = stores.get(namespace)
|
|
45
|
-
if (
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const store = stores.get(namespace)
|
|
51
|
-
if (store) return store.get
|
|
52
|
-
const newStore = Ref.unsafeMake(makeStore())
|
|
53
|
-
stores.set(namespace, newStore)
|
|
54
|
-
return newStore.get
|
|
55
|
-
}))
|
|
92
|
+
if (store) {
|
|
93
|
+
return Effect.succeed(store)
|
|
94
|
+
}
|
|
95
|
+
if (!config.allowNamespace!(namespace)) {
|
|
96
|
+
throw new Error(`Namespace ${namespace} not allowed!`)
|
|
56
97
|
}
|
|
57
|
-
return
|
|
98
|
+
return storesSem.withPermits(1)(Effect.suspendSucceed(() => {
|
|
99
|
+
const store = stores.get(namespace)
|
|
100
|
+
if (store) return Effect(store)
|
|
101
|
+
return makeMemoryStoreInt(name, existing).tap(store => Effect.sync(() => stores.set(namespace, store)))
|
|
102
|
+
}))
|
|
58
103
|
})
|
|
59
|
-
const setStore = (m: any) => storeId.get.flatMap(namespace => stores.get(namespace)!.set(m))
|
|
60
|
-
const sem = Semaphore.unsafeMake(1)
|
|
61
|
-
const withPermit = sem.withPermits(1)
|
|
62
|
-
const values = getStore.map(s => s.values())
|
|
63
|
-
const all = values.map(Chunk.fromIterable)
|
|
64
|
-
const batchSet = (items: NonEmptyReadonlyArray<PM>) =>
|
|
65
|
-
items
|
|
66
|
-
.forEachEffect(i => s.find(i.id).flatMap(current => updateETag(i, current)))
|
|
67
|
-
.tap(items =>
|
|
68
|
-
getStore
|
|
69
|
-
.map(m => {
|
|
70
|
-
const mut = m as Map<Id, PM>
|
|
71
|
-
items.forEach(e => mut.set(e.id, e))
|
|
72
|
-
return mut
|
|
73
|
-
})
|
|
74
|
-
.flatMap(_ => setStore(_))
|
|
75
|
-
)
|
|
76
|
-
.map(_ => _.toReadonlyArray() as NonEmptyReadonlyArray<PM>)
|
|
77
|
-
.apply(withPermit)
|
|
78
104
|
const s: Store<PM, Id> = {
|
|
79
|
-
all,
|
|
80
|
-
find:
|
|
81
|
-
filter: (
|
|
82
|
-
filterJoinSelect:
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
.flatMap(current => updateETag(e, current))
|
|
88
|
-
.tap(e => getStore.map(_ => new Map([..._, [e.id, e]])).flatMap(_ => setStore(_)))
|
|
89
|
-
.apply(withPermit),
|
|
90
|
-
batchSet,
|
|
91
|
-
bulkSet: batchSet,
|
|
92
|
-
remove: (e: PM) =>
|
|
93
|
-
getStore.map(_ => new Map([..._].filter(([_]) => _ !== e.id)))
|
|
94
|
-
.flatMap(_ => setStore(_)).apply(withPermit)
|
|
105
|
+
all: getStore.flatMap(_ => _.all),
|
|
106
|
+
find: (...args) => getStore.flatMap(_ => _.find(...args)),
|
|
107
|
+
filter: (...args) => getStore.flatMap(_ => _.filter(...args)),
|
|
108
|
+
filterJoinSelect: (...args) => getStore.flatMap(_ => _.filterJoinSelect(...args)),
|
|
109
|
+
set: (...args) => getStore.flatMap(_ => _.set(...args)),
|
|
110
|
+
batchSet: (...args) => getStore.flatMap(_ => _.batchSet(...args)),
|
|
111
|
+
bulkSet: (...args) => getStore.flatMap(_ => _.bulkSet(...args)),
|
|
112
|
+
remove: (...args) => getStore.flatMap(_ => _.remove(...args))
|
|
95
113
|
}
|
|
96
114
|
return s
|
|
97
115
|
})
|
|
@@ -7,7 +7,7 @@ import { StoreMaker } from "./service.js";
|
|
|
7
7
|
* and should therefore be as fast as the Memory Store.
|
|
8
8
|
*/
|
|
9
9
|
export declare function makeDiskStore({ prefix }: StorageConfig): import("@effect/io/Effect").Effect<never, never, {
|
|
10
|
-
make: <Id extends string, Id2 extends Id,
|
|
10
|
+
make: <Id extends string, Id2 extends Id, PM extends PersistenceModelType<Id>>(name: string, existing?: import("@effect/io/Effect").Effect<never, never, ReadonlyMap<Id2, PM>> | undefined, config?: StoreConfig<PM> | undefined) => import("@effect/io/Effect").Effect<never, never, Store<PM, Id>>;
|
|
11
11
|
}>;
|
|
12
12
|
export declare function DiskStoreLive(config: Config<StorageConfig>): import("@effect/io/Layer").Layer<never, import("@effect/io/Config/Error").ConfigError, StoreMaker>;
|
|
13
13
|
//# sourceMappingURL=Disk.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Disk.d.ts","sourceRoot":"","sources":["../../../_src/services/Store/Disk.ts"],"names":[],"mappings":";;AAMA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC3F,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"Disk.d.ts","sourceRoot":"","sources":["../../../_src/services/Store/Disk.ts"],"names":[],"mappings":";;AAMA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC3F,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAuDzC;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,aAAa;yFAQzC,MAAM;GAyCnB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,sGAI1D"}
|
|
@@ -1,11 +1,36 @@
|
|
|
1
1
|
import * as tsplus_module_1 from "@effect/io/Effect";
|
|
2
2
|
import * as tsplus_module_2 from "@effect-app/core/Function";
|
|
3
|
-
import * as tsplus_module_3 from "@effect
|
|
3
|
+
import * as tsplus_module_3 from "@effect/io/FiberRef";
|
|
4
|
+
import * as tsplus_module_4 from "@effect-app/core/Effect";
|
|
4
5
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
6
|
import * as fu from "@effect-app/infra-adapters/fileUtil";
|
|
6
7
|
import fs from "fs";
|
|
7
|
-
import {
|
|
8
|
+
import { makeMemoryStoreInt, storeId } from "./Memory.js";
|
|
8
9
|
import { StoreMaker } from "./service.js";
|
|
10
|
+
function makeDiskStoreInt(prefix, namespace, dir, name, existing) {
|
|
11
|
+
return tsplus_module_1.gen(function* ($) {
|
|
12
|
+
const file = dir + "/" + prefix + name + (namespace === "primary" ? "" : "-" + namespace) + ".json";
|
|
13
|
+
const fsStore = {
|
|
14
|
+
get: tsplus_module_1.orDie(tsplus_module_1.map(x => JSON.parse(x))(fu
|
|
15
|
+
.readTextFile(file))),
|
|
16
|
+
setRaw: (v) => JSON.stringify([...v], undefined, 2)["|>"](json => fu.writeTextFile(file, json))
|
|
17
|
+
};
|
|
18
|
+
const store = yield* $(makeMemoryStoreInt(name, !fs.existsSync(file)
|
|
19
|
+
? existing ?? tsplus_module_1.sync(() => new Map())
|
|
20
|
+
: tsplus_module_1.map(x => new Map(x.map(x => [x.id, x])))(fsStore.get)));
|
|
21
|
+
yield* $(tsplus_module_1.flatMap(fsStore.setRaw)(store.all));
|
|
22
|
+
const sem = tsplus_module_1.unsafeMakeSemaphore(1);
|
|
23
|
+
const withPermit = sem.withPermits(1);
|
|
24
|
+
const flushToDisk = withPermit(tsplus_module_1.flatMap(fsStore.setRaw)(store.all));
|
|
25
|
+
return {
|
|
26
|
+
...store,
|
|
27
|
+
batchSet: tsplus_module_2.flow(store.batchSet, t => tsplus_module_1.tap(() => tsplus_module_1.forkDaemon(tsplus_module_1.tapErrorCause(err => tsplus_module_1.sync(() => console.error(err)))(flushToDisk)))(t)),
|
|
28
|
+
bulkSet: tsplus_module_2.flow(store.bulkSet, t => tsplus_module_1.tap(() => tsplus_module_1.forkDaemon(tsplus_module_1.tapErrorCause(err => tsplus_module_1.sync(() => console.error(err)))(flushToDisk)))(t)),
|
|
29
|
+
set: tsplus_module_2.flow(store.set, t => tsplus_module_1.tap(() => tsplus_module_1.forkDaemon(tsplus_module_1.tapErrorCause(err => tsplus_module_1.sync(() => console.error(err)))(flushToDisk)))(t)),
|
|
30
|
+
remove: tsplus_module_2.flow(store.remove, t => tsplus_module_1.tap(() => tsplus_module_1.forkDaemon(tsplus_module_1.tapErrorCause(err => tsplus_module_1.sync(() => console.error(err)))(flushToDisk)))(t))
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
}
|
|
9
34
|
/**
|
|
10
35
|
* The Disk-backed store, flushes writes in background, but keeps the data in memory
|
|
11
36
|
* and should therefore be as fast as the Memory Store.
|
|
@@ -17,27 +42,34 @@ export function makeDiskStore({ prefix }) {
|
|
|
17
42
|
fs.mkdirSync(dir);
|
|
18
43
|
}
|
|
19
44
|
return {
|
|
20
|
-
make: (name, existing,
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
45
|
+
make: (name, existing, config) => tsplus_module_1.gen(function* ($) {
|
|
46
|
+
const storesSem = tsplus_module_1.unsafeMakeSemaphore(1);
|
|
47
|
+
const primary = yield* $(makeDiskStoreInt(prefix, "primary", dir, name, existing));
|
|
48
|
+
const stores = new Map([["primary", primary]]);
|
|
49
|
+
const getStore = !config?.allowNamespace ? tsplus_module_1.succeed(primary) : tsplus_module_1.flatMap(namespace => {
|
|
50
|
+
const store = stores.get(namespace);
|
|
51
|
+
if (store) {
|
|
52
|
+
return tsplus_module_1.succeed(store);
|
|
53
|
+
}
|
|
54
|
+
if (!config.allowNamespace(namespace)) {
|
|
55
|
+
throw new Error(`Namespace ${namespace} not allowed!`);
|
|
56
|
+
}
|
|
57
|
+
return storesSem.withPermits(1)(tsplus_module_1.suspendSucceed(() => {
|
|
58
|
+
const existing = stores.get(namespace);
|
|
59
|
+
if (existing)
|
|
60
|
+
return tsplus_module_1.sync(() => existing);
|
|
61
|
+
return tsplus_module_1.tap(store => tsplus_module_1.sync(() => stores.set(namespace, store)))(makeDiskStoreInt(prefix, namespace, dir, name, existing));
|
|
62
|
+
}));
|
|
63
|
+
})(tsplus_module_3.get(storeId));
|
|
35
64
|
const s = {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
65
|
+
all: tsplus_module_1.flatMap(_ => _.all)(getStore),
|
|
66
|
+
find: (...args) => tsplus_module_1.flatMap(_ => _.find(...args))(getStore),
|
|
67
|
+
filter: (...args) => tsplus_module_1.flatMap(_ => _.filter(...args))(getStore),
|
|
68
|
+
filterJoinSelect: (...args) => tsplus_module_1.flatMap(_ => _.filterJoinSelect(...args))(getStore),
|
|
69
|
+
set: (...args) => tsplus_module_1.flatMap(_ => _.set(...args))(getStore),
|
|
70
|
+
batchSet: (...args) => tsplus_module_1.flatMap(_ => _.batchSet(...args))(getStore),
|
|
71
|
+
bulkSet: (...args) => tsplus_module_1.flatMap(_ => _.bulkSet(...args))(getStore),
|
|
72
|
+
remove: (...args) => tsplus_module_1.flatMap(_ => _.remove(...args))(getStore)
|
|
41
73
|
};
|
|
42
74
|
return s;
|
|
43
75
|
})
|
|
@@ -45,6 +77,6 @@ export function makeDiskStore({ prefix }) {
|
|
|
45
77
|
});
|
|
46
78
|
}
|
|
47
79
|
export function DiskStoreLive(config) {
|
|
48
|
-
return
|
|
80
|
+
return tsplus_module_4.toLayer(tsplus_module_1.flatMap(makeDiskStore)(tsplus_module_1.config(config)), StoreMaker);
|
|
49
81
|
}
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL19zcmMvc2VydmljZXMvU3RvcmUvRGlzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsdURBQXVEO0FBQ3ZELE9BQU8sS0FBSyxFQUFFLE1BQU0scUNBQXFDLENBQUE7QUFFekQsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBRW5CLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUV6QyxTQUFTLGdCQUFnQixDQUN2QixNQUFjLEVBQ2QsU0FBaUIsRUFDakIsR0FBVyxFQUNYLElBQVksRUFDWixRQUFxRDtJQUVyRCxPQUFPLG9CQUFXLFFBQVEsQ0FBQyxFQUFDLENBQUM7UUFDM0IsTUFBTSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFBO1FBQ25HLE1BQU0sT0FBTyxHQUFHO1lBQ2QsR0FBRyx3QkFBRSxvQkFFRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFTLEVBRjVCLEVBQUU7aUJBQ0osWUFBWSxDQUFDLElBQUksQ0FBQyxDQUNhLENBQzFCO1lBQ1IsTUFBTSxFQUFFLENBQUMsQ0FBZSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM5RyxDQUFB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
|
|
@@ -12,6 +12,7 @@ export declare function memFilter<T extends {
|
|
|
12
12
|
}): (c: Chunk<T>) => Chunk<T>;
|
|
13
13
|
export declare const storeId: import("@effect/io/FiberRef").FiberRef<string>;
|
|
14
14
|
export declare const restoreFromRequestContext: import("@effect/io/Effect").Effect<RequestContext, never, void>;
|
|
15
|
+
export declare function makeMemoryStoreInt<Id extends string, Id2 extends Id, PM extends PersistenceModelType<Id>>(name: string, existing?: Effect<never, never, ReadonlyMap<Id2, PM>>): import("@effect/io/Effect").Effect<never, never, Store<PM, Id>>;
|
|
15
16
|
export declare const makeMemoryStore: () => {
|
|
16
17
|
make: <Id extends string, Id2 extends Id, PM extends PersistenceModelType<Id>>(name: string, existing?: import("@effect/io/Effect").Effect<never, never, ReadonlyMap<Id2, PM>> | undefined, config?: StoreConfig<PM> | undefined) => import("@effect/io/Effect").Effect<never, never, Store<PM, Id>>;
|
|
17
18
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Memory.d.ts","sourceRoot":"","sources":["../../../_src/services/Store/Memory.ts"],"names":[],"mappings":";;;AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAAoB,oBAAoB,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACtG,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAGzC,wBAAgB,SAAS,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,OACnG,MAAM,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,CAehC;AAED,eAAO,MAAM,OAAO,gDAAiC,CAAA;AACrD,eAAO,MAAM,yBAAyB,iEAErC,CAAA;AAED,eAAO,MAAM,eAAe;yFAElB,MAAM;
|
|
1
|
+
{"version":3,"file":"Memory.d.ts","sourceRoot":"","sources":["../../../_src/services/Store/Memory.ts"],"names":[],"mappings":";;;AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,MAAM,EAAoB,oBAAoB,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACtG,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAGzC,wBAAgB,SAAS,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,OACnG,MAAM,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,CAehC;AAED,eAAO,MAAM,OAAO,gDAAiC,CAAA;AACrD,eAAO,MAAM,yBAAyB,iEAErC,CAAA;AAED,wBAAgB,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,SAAS,oBAAoB,CAAC,EAAE,CAAC,EACvG,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,mEA6CtD;AAED,eAAO,MAAM,eAAe;yFAElB,MAAM;CAkCd,CAAA;AAEF,eAAO,MAAM,eAAe,4DAA0C,CAAA"}
|
|
@@ -31,53 +31,67 @@ export function memFilter(filter, cursor) {
|
|
|
31
31
|
}
|
|
32
32
|
export const storeId = tsplus_module_5.unsafeMake("primary");
|
|
33
33
|
export const restoreFromRequestContext = tsplus_module_7.serviceWithEffect(tsplus_module_6.tag, ctx => tsplus_module_5.set(ctx.parent?.namespace ?? ctx.namespace ?? "primary")(storeId));
|
|
34
|
-
export
|
|
35
|
-
|
|
34
|
+
export function makeMemoryStoreInt(name, existing) {
|
|
35
|
+
return tsplus_module_7.gen(function* ($) {
|
|
36
36
|
const updateETag = makeUpdateETag(name);
|
|
37
37
|
const items = yield* $(existing ?? tsplus_module_7.sync(() => new Map()));
|
|
38
38
|
const makeStore = () => new Map([...items.entries()].map(([id, e]) => [id, makeETag(e)]));
|
|
39
|
-
const
|
|
40
|
-
const stores = new Map([["primary", tsplus_module_8.unsafeMake(makeStore())]]);
|
|
41
|
-
const getStore = tsplus_module_7.flatMap(namespace => {
|
|
42
|
-
const store = stores.get(namespace);
|
|
43
|
-
if (!store) {
|
|
44
|
-
if (!config?.allowNamespace || !config.allowNamespace(namespace)) {
|
|
45
|
-
throw new Error(`Namespace ${namespace} not allowed!`);
|
|
46
|
-
}
|
|
47
|
-
return storesSem.withPermits(1)(tsplus_module_7.suspendSucceed(() => {
|
|
48
|
-
const store = stores.get(namespace);
|
|
49
|
-
if (store)
|
|
50
|
-
return tsplus_module_8.get(store);
|
|
51
|
-
const newStore = tsplus_module_8.unsafeMake(makeStore());
|
|
52
|
-
stores.set(namespace, newStore);
|
|
53
|
-
return tsplus_module_8.get(newStore);
|
|
54
|
-
}));
|
|
55
|
-
}
|
|
56
|
-
return tsplus_module_8.get(store);
|
|
57
|
-
})(tsplus_module_5.get(storeId));
|
|
58
|
-
const setStore = (m) => tsplus_module_7.flatMap(namespace => tsplus_module_8.set(m)(stores.get(namespace)))(tsplus_module_5.get(storeId));
|
|
39
|
+
const store = tsplus_module_8.unsafeMake(makeStore());
|
|
59
40
|
const sem = tsplus_module_7.unsafeMakeSemaphore(1);
|
|
60
41
|
const withPermit = sem.withPermits(1);
|
|
61
|
-
const values = tsplus_module_7.map(s => s.values())(
|
|
42
|
+
const values = tsplus_module_7.map(s => s.values())(tsplus_module_8.get(store));
|
|
62
43
|
const all = tsplus_module_7.map(tsplus_module_1.fromIterable)(values);
|
|
63
|
-
const batchSet = (items) => withPermit(tsplus_module_7.map(_ => _.toReadonlyArray())(tsplus_module_7.tap(items => tsplus_module_7.flatMap(_ =>
|
|
44
|
+
const batchSet = (items) => withPermit(tsplus_module_7.map(_ => _.toReadonlyArray())(tsplus_module_7.tap(items => tsplus_module_7.flatMap(_ => tsplus_module_8.set(_)(store))(tsplus_module_7.map(m => {
|
|
64
45
|
const mut = m;
|
|
65
46
|
items.forEach(e => mut.set(e.id, e));
|
|
66
47
|
return mut;
|
|
67
|
-
})(
|
|
48
|
+
})(tsplus_module_8.get(store))))(tsplus_module_9.ext_forEach(items, i => tsplus_module_7.flatMap(current => updateETag(i, current))(s.find(i.id))))));
|
|
68
49
|
const s = {
|
|
69
50
|
all,
|
|
70
|
-
find: id => tsplus_module_7.map(_ => tsplus_module_3.fromNullable(_.get(id)))(
|
|
51
|
+
find: id => tsplus_module_7.map(_ => tsplus_module_3.fromNullable(_.get(id)))(tsplus_module_8.get(store)),
|
|
71
52
|
filter: (filter, cursor) => tsplus_module_7.map(memFilter(filter, cursor))(all),
|
|
72
53
|
filterJoinSelect: (filter) => tsplus_module_7.map(c => c.flatMap(codeFilterJoinSelect(filter)))(all),
|
|
73
|
-
set: e => withPermit(tsplus_module_7.tap(e => tsplus_module_7.flatMap(_ =>
|
|
54
|
+
set: e => withPermit(tsplus_module_7.tap(e => tsplus_module_7.flatMap(_ => tsplus_module_8.set(_)(store))(tsplus_module_7.map(_ => new Map([..._, [e.id, e]]))(tsplus_module_8.get(store))))(tsplus_module_7.flatMap(current => updateETag(e, current))(s
|
|
74
55
|
.find(e.id)))),
|
|
75
56
|
batchSet,
|
|
76
57
|
bulkSet: batchSet,
|
|
77
|
-
remove: (e) => withPermit(tsplus_module_7.flatMap(_ =>
|
|
58
|
+
remove: (e) => withPermit(tsplus_module_7.flatMap(_ => tsplus_module_8.set(_)(store))(tsplus_module_7.map(_ => new Map([..._].filter(([_]) => _ !== e.id)))(tsplus_module_8.get(store))))
|
|
59
|
+
};
|
|
60
|
+
return s;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
export const makeMemoryStore = () => ({
|
|
64
|
+
make: (name, existing, config) => tsplus_module_7.gen(function* ($) {
|
|
65
|
+
const storesSem = tsplus_module_7.unsafeMakeSemaphore(1);
|
|
66
|
+
const primary = yield* $(makeMemoryStoreInt(name, existing));
|
|
67
|
+
const stores = new Map([["primary", primary]]);
|
|
68
|
+
const getStore = !config?.allowNamespace ? tsplus_module_7.succeed(primary) : tsplus_module_7.flatMap(namespace => {
|
|
69
|
+
const store = stores.get(namespace);
|
|
70
|
+
if (store) {
|
|
71
|
+
return tsplus_module_7.succeed(store);
|
|
72
|
+
}
|
|
73
|
+
if (!config.allowNamespace(namespace)) {
|
|
74
|
+
throw new Error(`Namespace ${namespace} not allowed!`);
|
|
75
|
+
}
|
|
76
|
+
return storesSem.withPermits(1)(tsplus_module_7.suspendSucceed(() => {
|
|
77
|
+
const store = stores.get(namespace);
|
|
78
|
+
if (store)
|
|
79
|
+
return tsplus_module_7.sync(() => store);
|
|
80
|
+
return tsplus_module_7.tap(store => tsplus_module_7.sync(() => stores.set(namespace, store)))(makeMemoryStoreInt(name, existing));
|
|
81
|
+
}));
|
|
82
|
+
})(tsplus_module_5.get(storeId));
|
|
83
|
+
const s = {
|
|
84
|
+
all: tsplus_module_7.flatMap(_ => _.all)(getStore),
|
|
85
|
+
find: (...args) => tsplus_module_7.flatMap(_ => _.find(...args))(getStore),
|
|
86
|
+
filter: (...args) => tsplus_module_7.flatMap(_ => _.filter(...args))(getStore),
|
|
87
|
+
filterJoinSelect: (...args) => tsplus_module_7.flatMap(_ => _.filterJoinSelect(...args))(getStore),
|
|
88
|
+
set: (...args) => tsplus_module_7.flatMap(_ => _.set(...args))(getStore),
|
|
89
|
+
batchSet: (...args) => tsplus_module_7.flatMap(_ => _.batchSet(...args))(getStore),
|
|
90
|
+
bulkSet: (...args) => tsplus_module_7.flatMap(_ => _.bulkSet(...args))(getStore),
|
|
91
|
+
remove: (...args) => tsplus_module_7.flatMap(_ => _.remove(...args))(getStore)
|
|
78
92
|
};
|
|
79
93
|
return s;
|
|
80
94
|
})
|
|
81
95
|
});
|
|
82
96
|
export const MemoryStoreLive = tsplus_module_10.makeLayer(StoreMaker, makeMemoryStore());
|
|
83
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vX3NyYy9zZXJ2aWNlcy9TdG9yZS9NZW1vcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLHVEQUF1RDtBQUV2RCxPQUErQix5QkFBeUIsQ0FBQTtBQUV4RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUV2RixNQUFNLFVBQVUsU0FBUyxDQUEyQixNQUFpQixFQUFFLE1BQTBDO0lBQy9HLE9BQU8sQ0FBQyxDQUFDLENBQVcsRUFBWSxFQUFFO1FBQ2hDLE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxJQUFJLENBQUE7UUFDekIsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLEtBQUssQ0FBQTtRQUMzQixJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7WUFDeEIsT0FBTywwQkFBNkQsR0FBRyxFQUFFLENBQUMsdUJBQWEsRUFBaEYsMENBQUEsNkJBQWUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFqQyxDQUFDLENBQWlDLENBQWdCLENBQStCLENBQUE7U0FDekY7UUFDRCxJQUFJLENBQUMsR0FBRywwQkFBWSxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQTlCLENBQUMsQ0FBOEIsQ0FBQTtRQUN2QyxJQUFJLElBQUksRUFBRTtZQUNSLENBQUMsR0FBRyxxQkFBTyxJQUFJLEVBQVgsQ0FBQyxDQUFXLENBQUE7U0FDakI7UUFDRCxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsQ0FBQyxHQUFHLHFCQUFPLEtBQUssRUFBWixDQUFDLENBQVksQ0FBQTtTQUNsQjtRQUNELHFDQUFPLENBQUMsRUFBUTtJQUNsQixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMs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
|