@effect-app/infra 4.0.0-beta.84 → 4.0.0-beta.86
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 +14 -0
- package/dist/Store/Cosmos.d.ts.map +1 -1
- package/dist/Store/Cosmos.js +44 -32
- package/dist/Store/SQL/Pg.d.ts.map +1 -1
- package/dist/Store/SQL/Pg.js +65 -54
- package/dist/Store/SQL.d.ts.map +1 -1
- package/dist/Store/SQL.js +65 -54
- package/package.json +2 -2
- package/src/Store/Cosmos.ts +73 -42
- package/src/Store/SQL/Pg.ts +112 -80
- package/src/Store/SQL.ts +112 -80
package/dist/Store/SQL.js
CHANGED
|
@@ -60,8 +60,61 @@ function makeSQLStoreInt(dialect, jsonColumnType) {
|
|
|
60
60
|
return { id, _etag: newE._etag, data, item: newE };
|
|
61
61
|
};
|
|
62
62
|
const exec = (query, params) => sql.unsafe(query, params).pipe(Effect.orDie);
|
|
63
|
+
const seedMarkerId = `__seed_marker__`;
|
|
64
|
+
const setInternal = (e, ns) => Effect.gen(function* () {
|
|
65
|
+
const row = toRow(e);
|
|
66
|
+
if (e._etag) {
|
|
67
|
+
yield* exec(`UPDATE "${tableName}" SET _etag = ?, data = ? WHERE id = ? AND _etag = ? AND _namespace = ?`, [row._etag, row.data, row.id, e._etag, ns]);
|
|
68
|
+
const existing = yield* exec(`SELECT _etag FROM "${tableName}" WHERE id = ? AND _namespace = ?`, [row.id, ns]);
|
|
69
|
+
const current = existing[0];
|
|
70
|
+
if (!current || current._etag !== row._etag) {
|
|
71
|
+
if (current) {
|
|
72
|
+
return yield* new OptimisticConcurrencyException({
|
|
73
|
+
type: name,
|
|
74
|
+
id: row.id,
|
|
75
|
+
current: current._etag,
|
|
76
|
+
found: e._etag,
|
|
77
|
+
code: 412
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return yield* new OptimisticConcurrencyException({
|
|
81
|
+
type: name,
|
|
82
|
+
id: row.id,
|
|
83
|
+
current: "",
|
|
84
|
+
found: e._etag,
|
|
85
|
+
code: 404
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
yield* exec(`INSERT INTO "${tableName}" (id, _namespace, _etag, data) VALUES (?, ?, ?, ?)`, [row.id, ns, row._etag, row.data]);
|
|
91
|
+
}
|
|
92
|
+
return row.item;
|
|
93
|
+
});
|
|
94
|
+
const bulkSetInternal = (items, ns) => sql
|
|
95
|
+
.withTransaction(Effect.forEach(items, (e) => setInternal(e, ns)))
|
|
96
|
+
.pipe(Effect.orDie, Effect.map((_) => _));
|
|
97
|
+
const ctx = yield* Effect.context();
|
|
98
|
+
const seedCache = new Map();
|
|
99
|
+
const makeSeedEffect = (ns) => exec(`SELECT id FROM "${tableName}" WHERE id = ? AND _namespace = ?`, [seedMarkerId, `__seed__::${ns}`])
|
|
100
|
+
.pipe(Effect.flatMap((existing) => {
|
|
101
|
+
if (existing.length > 0)
|
|
102
|
+
return Effect.void;
|
|
103
|
+
return InfraLogger.logInfo(`Seeding data for ${name} (namespace: ${ns})`).pipe(Effect.andThen(seed), Effect.flatMap((items) => Effect.flatMapOption(Effect.succeed(toNonEmptyArray([...items])), (a) => bulkSetInternal(a, ns))), Effect.andThen(exec(`INSERT INTO "${tableName}" (id, _namespace, _etag, data) VALUES (?, ?, ?, ?)`, [seedMarkerId, `__seed__::${ns}`, null, JSON.stringify({ _marker: true })])), Effect.provide(ctx), Effect.orDie);
|
|
104
|
+
}));
|
|
105
|
+
const seedNamespace = Effect.fn("seedNamespace")(function* (ns) {
|
|
106
|
+
if (!seed)
|
|
107
|
+
return;
|
|
108
|
+
let cached = seedCache.get(ns);
|
|
109
|
+
if (!cached) {
|
|
110
|
+
cached = yield* Effect.cached(makeSeedEffect(ns));
|
|
111
|
+
seedCache.set(ns, cached);
|
|
112
|
+
}
|
|
113
|
+
yield* cached;
|
|
114
|
+
});
|
|
115
|
+
const resolveAndSeed = resolveNamespace.pipe(Effect.tap((ns) => seedNamespace(ns)));
|
|
63
116
|
const s = {
|
|
64
|
-
all:
|
|
117
|
+
all: resolveAndSeed.pipe(Effect.flatMap((ns) => exec(`SELECT id, _etag, data FROM "${tableName}" WHERE _namespace = ?`, [ns])
|
|
65
118
|
.pipe(Effect.map((rows) => rows.map((r) => parseRow(r, idKey, defaultValues))), Effect.withSpan("SQL.all [effect-app/infra/Store]", {
|
|
66
119
|
attributes: {
|
|
67
120
|
"repository.table_name": tableName,
|
|
@@ -69,7 +122,7 @@ function makeSQLStoreInt(dialect, jsonColumnType) {
|
|
|
69
122
|
"repository.namespace": ns
|
|
70
123
|
}
|
|
71
124
|
}, { captureStackTrace: false })))),
|
|
72
|
-
find: (id) =>
|
|
125
|
+
find: (id) => resolveAndSeed.pipe(Effect.flatMap((ns) => exec(`SELECT id, _etag, data FROM "${tableName}" WHERE id = ? AND _namespace = ?`, [id, ns])
|
|
73
126
|
.pipe(Effect.map((rows) => {
|
|
74
127
|
const row = rows[0];
|
|
75
128
|
return row
|
|
@@ -81,7 +134,7 @@ function makeSQLStoreInt(dialect, jsonColumnType) {
|
|
|
81
134
|
filter: (f) => {
|
|
82
135
|
const filter = f
|
|
83
136
|
.filter;
|
|
84
|
-
return
|
|
137
|
+
return resolveAndSeed
|
|
85
138
|
.pipe(Effect
|
|
86
139
|
.flatMap((ns) => Effect
|
|
87
140
|
.sync(() => {
|
|
@@ -125,53 +178,18 @@ function makeSQLStoreInt(dialect, jsonColumnType) {
|
|
|
125
178
|
attributes: { "repository.table_name": tableName, "repository.model_name": name }
|
|
126
179
|
}, { captureStackTrace: false }))));
|
|
127
180
|
},
|
|
128
|
-
set: (e) =>
|
|
129
|
-
.gen(function* () {
|
|
130
|
-
const row = toRow(e);
|
|
131
|
-
if (e._etag) {
|
|
132
|
-
yield* exec(`UPDATE "${tableName}" SET _etag = ?, data = ? WHERE id = ? AND _etag = ? AND _namespace = ?`, [row._etag, row.data, row.id, e._etag, ns]);
|
|
133
|
-
const existing = yield* exec(`SELECT _etag FROM "${tableName}" WHERE id = ? AND _namespace = ?`, [row.id, ns]);
|
|
134
|
-
const current = existing[0];
|
|
135
|
-
if (!current || current._etag !== row._etag) {
|
|
136
|
-
if (current) {
|
|
137
|
-
return yield* new OptimisticConcurrencyException({
|
|
138
|
-
type: name,
|
|
139
|
-
id: row.id,
|
|
140
|
-
current: current._etag,
|
|
141
|
-
found: e._etag,
|
|
142
|
-
code: 412
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
return yield* new OptimisticConcurrencyException({
|
|
146
|
-
type: name,
|
|
147
|
-
id: row.id,
|
|
148
|
-
current: "",
|
|
149
|
-
found: e._etag,
|
|
150
|
-
code: 404
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
yield* exec(`INSERT INTO "${tableName}" (id, _namespace, _etag, data) VALUES (?, ?, ?, ?)`, [row.id, ns, row._etag, row.data]);
|
|
156
|
-
}
|
|
157
|
-
return row.item;
|
|
158
|
-
})
|
|
159
|
-
.pipe(Effect.withSpan("SQL.set [effect-app/infra/Store]", {
|
|
181
|
+
set: (e) => resolveAndSeed.pipe(Effect.flatMap((ns) => setInternal(e, ns).pipe(Effect.withSpan("SQL.set [effect-app/infra/Store]", {
|
|
160
182
|
attributes: { "repository.table_name": tableName, "repository.model_name": name, id: e[idKey] }
|
|
161
183
|
}, { captureStackTrace: false })))),
|
|
162
|
-
batchSet: (items) =>
|
|
163
|
-
.withTransaction(Effect.forEach(items, (e) => s.set(e)))
|
|
164
|
-
.pipe(Effect.orDie, Effect.map((_) => _), Effect.withSpan("SQL.batchSet [effect-app/infra/Store]", {
|
|
184
|
+
batchSet: (items) => resolveAndSeed.pipe(Effect.flatMap((ns) => bulkSetInternal(items, ns).pipe(Effect.withSpan("SQL.batchSet [effect-app/infra/Store]", {
|
|
165
185
|
attributes: { "repository.table_name": tableName, "repository.model_name": name }
|
|
166
|
-
}, { captureStackTrace: false })),
|
|
167
|
-
bulkSet: (items) =>
|
|
168
|
-
.withTransaction(Effect.forEach(items, (e) => s.set(e)))
|
|
169
|
-
.pipe(Effect.orDie, Effect.map((_) => _), Effect.withSpan("SQL.bulkSet [effect-app/infra/Store]", {
|
|
186
|
+
}, { captureStackTrace: false })))),
|
|
187
|
+
bulkSet: (items) => resolveAndSeed.pipe(Effect.flatMap((ns) => bulkSetInternal(items, ns).pipe(Effect.withSpan("SQL.bulkSet [effect-app/infra/Store]", {
|
|
170
188
|
attributes: { "repository.table_name": tableName, "repository.model_name": name }
|
|
171
|
-
}, { captureStackTrace: false })),
|
|
189
|
+
}, { captureStackTrace: false })))),
|
|
172
190
|
batchRemove: (ids) => {
|
|
173
191
|
const placeholders = ids.map(() => "?").join(", ");
|
|
174
|
-
return
|
|
192
|
+
return resolveAndSeed.pipe(Effect.flatMap((ns) => exec(`DELETE FROM "${tableName}" WHERE id IN (${placeholders}) AND _namespace = ?`, [...ids, ns])
|
|
175
193
|
.pipe(Effect.asVoid, Effect.withSpan("SQL.batchRemove [effect-app/infra/Store]", {
|
|
176
194
|
attributes: { "repository.table_name": tableName, "repository.model_name": name }
|
|
177
195
|
}, { captureStackTrace: false }))));
|
|
@@ -180,15 +198,8 @@ function makeSQLStoreInt(dialect, jsonColumnType) {
|
|
|
180
198
|
attributes: { "repository.table_name": tableName, "repository.model_name": name }
|
|
181
199
|
}, { captureStackTrace: false }))
|
|
182
200
|
};
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
const count = existing[0]?.cnt ?? 0;
|
|
186
|
-
if (count === 0) {
|
|
187
|
-
yield* InfraLogger.logInfo("Seeding data for " + name);
|
|
188
|
-
const items = yield* seed;
|
|
189
|
-
yield* Effect.flatMapOption(Effect.succeed(toNonEmptyArray([...items])), (a) => s.bulkSet(a).pipe(Effect.orDie));
|
|
190
|
-
}
|
|
191
|
-
}
|
|
201
|
+
// Eagerly seed primary namespace on initialization
|
|
202
|
+
yield* seedNamespace("primary");
|
|
192
203
|
return s;
|
|
193
204
|
})
|
|
194
205
|
};
|
|
@@ -198,4 +209,4 @@ export function SQLiteStoreLayer(cfg) {
|
|
|
198
209
|
return StoreMaker
|
|
199
210
|
.toLayer(makeSQLStoreInt(sqliteDialect, "JSON")(cfg));
|
|
200
211
|
}
|
|
201
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU1FMLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1N0b3JlL1NRTC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBOEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUMvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRTFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDckMsT0FBTyxFQUFnRyxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDdkksT0FBTyxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBbUIsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDN0YsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVyQyxnQkFBZ0I7QUFDaEIsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQ3RCLEdBQXVELEVBQ3ZELEtBQWtCLEVBQ2xCLGFBQStCLEVBQ0EsRUFBRTtJQUNqQyxNQUFNLElBQUksR0FBRyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFXLENBQUE7SUFDdkYsT0FBTyxFQUFFLEdBQUcsYUFBYSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssSUFBSSxTQUFT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
|
|
212
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU1FMLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1N0b3JlL1NRTC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBOEIsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUMvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQy9DLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRTFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDckMsT0FBTyxFQUFnRyxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDdkksT0FBTyxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBbUIsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDN0YsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVyQyxnQkFBZ0I7QUFDaEIsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQ3RCLEdBQXVELEVBQ3ZELEtBQWtCLEVBQ2xCLGFBQStCLEVBQ0EsRUFBRTtJQUNqQyxNQUFNLElBQUksR0FBRyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFXLENBQUE7SUFDdkYsT0FBTyxFQUFFLEdBQUcsYUFBYSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssSUFBSSxTQUFT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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/infra",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.86",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"proper-lockfile": "^4.1.2",
|
|
14
14
|
"pure-rand": "7.0.1",
|
|
15
15
|
"query-string": "^9.3.1",
|
|
16
|
-
"effect-app": "4.0.0-beta.
|
|
16
|
+
"effect-app": "4.0.0-beta.86"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@azure/cosmos": "^4.9.2",
|
package/src/Store/Cosmos.ts
CHANGED
|
@@ -75,10 +75,64 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
75
75
|
// then need to clean up the actual data.. perhaps first do with a config toggle to prescribe to it.
|
|
76
76
|
const importedMarkerId = containerId
|
|
77
77
|
|
|
78
|
-
const
|
|
78
|
+
const ctx = yield* Effect.context<R>()
|
|
79
|
+
const seedCache = new Map<string, Effect.Effect<void>>()
|
|
80
|
+
const makeSeedEffect = (ns: string) => {
|
|
81
|
+
const markerId = ns === "primary" ? importedMarkerId : `${importedMarkerId}::${ns}`
|
|
82
|
+
return Effect
|
|
83
|
+
.promise(() =>
|
|
84
|
+
container
|
|
85
|
+
.item(markerId, markerId)
|
|
86
|
+
.read<{ id: string }>()
|
|
87
|
+
.then(({ resource }) => Option.fromNullishOr(resource))
|
|
88
|
+
)
|
|
89
|
+
.pipe(
|
|
90
|
+
Effect.flatMap((marker) => {
|
|
91
|
+
if (Option.isSome(marker)) return Effect.void
|
|
92
|
+
return InfraLogger.logInfo(`Creating mock data for ${name} (namespace: ${ns})`).pipe(
|
|
93
|
+
Effect.andThen(seed!),
|
|
94
|
+
Effect.flatMap((m) =>
|
|
95
|
+
Effect.flatMapOption(
|
|
96
|
+
Effect.succeed(toNonEmptyArray([...m])),
|
|
97
|
+
(a) =>
|
|
98
|
+
bulkSetInternal(a, ns).pipe(
|
|
99
|
+
Effect.orDie,
|
|
100
|
+
Effect.delay(Duration.millis(1100))
|
|
101
|
+
)
|
|
102
|
+
)
|
|
103
|
+
),
|
|
104
|
+
Effect.andThen(
|
|
105
|
+
Effect.promise(() =>
|
|
106
|
+
container.items.create({
|
|
107
|
+
_partitionKey: markerId,
|
|
108
|
+
id: markerId,
|
|
109
|
+
ttl: -1
|
|
110
|
+
})
|
|
111
|
+
)
|
|
112
|
+
),
|
|
113
|
+
Effect.provide(ctx),
|
|
114
|
+
Effect.orDie
|
|
115
|
+
)
|
|
116
|
+
})
|
|
117
|
+
)
|
|
118
|
+
}
|
|
119
|
+
const seedNamespace = Effect.fn("seedNamespace")(function*(ns: string) {
|
|
120
|
+
if (!seed) return
|
|
121
|
+
let cached = seedCache.get(ns)
|
|
122
|
+
if (!cached) {
|
|
123
|
+
cached = yield* Effect.cached(makeSeedEffect(ns))
|
|
124
|
+
seedCache.set(ns, cached)
|
|
125
|
+
}
|
|
126
|
+
yield* cached
|
|
127
|
+
})
|
|
128
|
+
const resolveAndSeed = resolveNamespace.pipe(
|
|
129
|
+
Effect.tap((ns) => seedNamespace(ns))
|
|
130
|
+
)
|
|
131
|
+
const resolvePartitionKeyAndSeed = Effect.map(resolveAndSeed, (ns) => `${nsPrefix(ns)}${basePartitionKey}`)
|
|
132
|
+
|
|
133
|
+
const bulkSetInternal = (items: NonEmptyReadonlyArray<PM>, ns: string) =>
|
|
79
134
|
Effect
|
|
80
135
|
.gen(function*() {
|
|
81
|
-
const ns = yield* resolveNamespace
|
|
82
136
|
// TODO: disable batching if need atomicity
|
|
83
137
|
// we delay and batch to keep low amount of RUs
|
|
84
138
|
const b = [...items]
|
|
@@ -177,12 +231,18 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
177
231
|
|
|
178
232
|
return batchResult.flat() as unknown as NonEmptyReadonlyArray<Encoded>
|
|
179
233
|
})
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
234
|
+
|
|
235
|
+
const bulkSet = (items: NonEmptyReadonlyArray<PM>) =>
|
|
236
|
+
resolveAndSeed.pipe(Effect.flatMap((ns) =>
|
|
237
|
+
bulkSetInternal(items, ns).pipe(
|
|
238
|
+
Effect.withSpan("Cosmos.bulkSet [effect-app/infra/Store]", {
|
|
239
|
+
attributes: { "repository.container_id": containerId, "repository.model_name": name }
|
|
240
|
+
}, { captureStackTrace: false })
|
|
241
|
+
)
|
|
242
|
+
))
|
|
183
243
|
|
|
184
244
|
const batchSet = (items: NonEmptyReadonlyArray<PM>) => {
|
|
185
|
-
return
|
|
245
|
+
return resolveAndSeed
|
|
186
246
|
.pipe(Effect.flatMap((ns) =>
|
|
187
247
|
Effect
|
|
188
248
|
.suspend(() => {
|
|
@@ -253,7 +313,7 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
253
313
|
const s: Store<IdKey, Encoded> = {
|
|
254
314
|
queryRaw: <Out>(query: RawQuery<Encoded, Out>) =>
|
|
255
315
|
Effect
|
|
256
|
-
.all({ q: Effect.sync(() => query.cosmos({ name })), pk:
|
|
316
|
+
.all({ q: Effect.sync(() => query.cosmos({ name })), pk: resolvePartitionKeyAndSeed })
|
|
257
317
|
.pipe(
|
|
258
318
|
Effect.tap(({ q }) => logQuery(q)),
|
|
259
319
|
Effect.flatMap(({ pk, q }) =>
|
|
@@ -275,7 +335,7 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
275
335
|
}, { captureStackTrace: false })
|
|
276
336
|
),
|
|
277
337
|
batchRemove: (ids, partitionKey?: string) =>
|
|
278
|
-
|
|
338
|
+
resolvePartitionKeyAndSeed.pipe(Effect.flatMap((pk) =>
|
|
279
339
|
Effect.promise(() =>
|
|
280
340
|
execBatch(
|
|
281
341
|
mutable(ids.map((id) =>
|
|
@@ -296,7 +356,7 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
296
356
|
query: `SELECT * FROM ${name}`,
|
|
297
357
|
parameters: []
|
|
298
358
|
})),
|
|
299
|
-
pk:
|
|
359
|
+
pk: resolvePartitionKeyAndSeed
|
|
300
360
|
})
|
|
301
361
|
.pipe(
|
|
302
362
|
Effect.tap(({ q }) => logQuery(q)),
|
|
@@ -382,7 +442,7 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
382
442
|
)
|
|
383
443
|
},
|
|
384
444
|
find: (id) =>
|
|
385
|
-
|
|
445
|
+
resolveAndSeed.pipe(Effect.flatMap((ns) =>
|
|
386
446
|
Effect
|
|
387
447
|
.promise(() =>
|
|
388
448
|
container
|
|
@@ -405,7 +465,7 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
405
465
|
}, { captureStackTrace: false }))
|
|
406
466
|
)),
|
|
407
467
|
set: (e) =>
|
|
408
|
-
|
|
468
|
+
resolveAndSeed.pipe(Effect.flatMap((ns) =>
|
|
409
469
|
Option
|
|
410
470
|
.match(
|
|
411
471
|
Option
|
|
@@ -466,38 +526,9 @@ function makeCosmosStore({ prefix }: StorageConfig) {
|
|
|
466
526
|
bulkSet
|
|
467
527
|
}
|
|
468
528
|
|
|
469
|
-
//
|
|
470
|
-
|
|
471
|
-
container
|
|
472
|
-
.item(importedMarkerId, importedMarkerId)
|
|
473
|
-
.read<{ id: string }>()
|
|
474
|
-
.then(({ resource }) => Option.fromNullishOr(resource))
|
|
475
|
-
)
|
|
529
|
+
// Eagerly seed primary namespace on initialization
|
|
530
|
+
yield* seedNamespace("primary")
|
|
476
531
|
|
|
477
|
-
if (!Option.isSome(marker)) {
|
|
478
|
-
yield* InfraLogger.logInfo("Creating mock data for " + name)
|
|
479
|
-
if (seed) {
|
|
480
|
-
const m = yield* seed
|
|
481
|
-
yield* Effect.flatMapOption(
|
|
482
|
-
Effect.succeed(toNonEmptyArray([...m])),
|
|
483
|
-
(a) =>
|
|
484
|
-
s.bulkSet(a).pipe(
|
|
485
|
-
Effect.orDie,
|
|
486
|
-
Effect
|
|
487
|
-
// we delay extra here, so that initial creation between Companies/POs also have an interval between them.
|
|
488
|
-
.delay(Duration.millis(1100))
|
|
489
|
-
)
|
|
490
|
-
)
|
|
491
|
-
}
|
|
492
|
-
// Mark as imported
|
|
493
|
-
yield* Effect.promise(() =>
|
|
494
|
-
container.items.create({
|
|
495
|
-
_partitionKey: importedMarkerId,
|
|
496
|
-
id: importedMarkerId,
|
|
497
|
-
ttl: -1
|
|
498
|
-
})
|
|
499
|
-
)
|
|
500
|
-
}
|
|
501
532
|
return s
|
|
502
533
|
})
|
|
503
534
|
}
|
package/src/Store/SQL/Pg.ts
CHANGED
|
@@ -78,8 +78,100 @@ function makePgStore({ prefix }: StorageConfig) {
|
|
|
78
78
|
const exec = (query: string, params?: readonly unknown[]) =>
|
|
79
79
|
sql.unsafe(query, params as any).pipe(Effect.orDie)
|
|
80
80
|
|
|
81
|
+
const seedMarkerId = `__seed_marker__`
|
|
82
|
+
|
|
83
|
+
const setInternal = (e: PM, ns: string) =>
|
|
84
|
+
Effect.gen(function*() {
|
|
85
|
+
const row = toRow(e)
|
|
86
|
+
if (e._etag) {
|
|
87
|
+
yield* exec(
|
|
88
|
+
`UPDATE "${tableName}" SET _etag = $1, data = $2 WHERE id = $3 AND _etag = $4 AND _namespace = $5`,
|
|
89
|
+
[row._etag, row.data, row.id, e._etag, ns]
|
|
90
|
+
)
|
|
91
|
+
const existing = yield* exec(
|
|
92
|
+
`SELECT _etag FROM "${tableName}" WHERE id = $1 AND _namespace = $2`,
|
|
93
|
+
[row.id, ns]
|
|
94
|
+
)
|
|
95
|
+
const current = (existing as any[])[0]
|
|
96
|
+
if (!current || current._etag !== row._etag) {
|
|
97
|
+
if (current) {
|
|
98
|
+
return yield* new OptimisticConcurrencyException({
|
|
99
|
+
type: name,
|
|
100
|
+
id: row.id,
|
|
101
|
+
current: current._etag,
|
|
102
|
+
found: e._etag,
|
|
103
|
+
code: 412
|
|
104
|
+
})
|
|
105
|
+
}
|
|
106
|
+
return yield* new OptimisticConcurrencyException({
|
|
107
|
+
type: name,
|
|
108
|
+
id: row.id,
|
|
109
|
+
current: "",
|
|
110
|
+
found: e._etag,
|
|
111
|
+
code: 404
|
|
112
|
+
})
|
|
113
|
+
}
|
|
114
|
+
} else {
|
|
115
|
+
yield* exec(
|
|
116
|
+
`INSERT INTO "${tableName}" (id, _namespace, _etag, data) VALUES ($1, $2, $3, $4)`,
|
|
117
|
+
[row.id, ns, row._etag, row.data]
|
|
118
|
+
)
|
|
119
|
+
}
|
|
120
|
+
return row.item
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
const bulkSetInternal = (items: NonEmptyReadonlyArray<PM>, ns: string) =>
|
|
124
|
+
sql
|
|
125
|
+
.withTransaction(Effect.forEach(items, (e) => setInternal(e, ns)))
|
|
126
|
+
.pipe(
|
|
127
|
+
Effect.orDie,
|
|
128
|
+
Effect.map((_) => _ as unknown as NonEmptyReadonlyArray<PM>)
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
const ctx = yield* Effect.context<R>()
|
|
132
|
+
const seedCache = new Map<string, Effect.Effect<void>>()
|
|
133
|
+
const makeSeedEffect = (ns: string) =>
|
|
134
|
+
exec(
|
|
135
|
+
`SELECT id FROM "${tableName}" WHERE id = $1 AND _namespace = $2`,
|
|
136
|
+
[seedMarkerId, `__seed__::${ns}`]
|
|
137
|
+
)
|
|
138
|
+
.pipe(
|
|
139
|
+
Effect.flatMap((existing) => {
|
|
140
|
+
if ((existing as any[]).length > 0) return Effect.void
|
|
141
|
+
return InfraLogger.logInfo(`Seeding data for ${name} (namespace: ${ns})`).pipe(
|
|
142
|
+
Effect.andThen(seed!),
|
|
143
|
+
Effect.flatMap((items) =>
|
|
144
|
+
Effect.flatMapOption(
|
|
145
|
+
Effect.succeed(toNonEmptyArray([...items])),
|
|
146
|
+
(a) => bulkSetInternal(a, ns)
|
|
147
|
+
)
|
|
148
|
+
),
|
|
149
|
+
Effect.andThen(
|
|
150
|
+
exec(
|
|
151
|
+
`INSERT INTO "${tableName}" (id, _namespace, _etag, data) VALUES ($1, $2, $3, $4)`,
|
|
152
|
+
[seedMarkerId, `__seed__::${ns}`, null, JSON.stringify({ _marker: true })]
|
|
153
|
+
)
|
|
154
|
+
),
|
|
155
|
+
Effect.provide(ctx),
|
|
156
|
+
Effect.orDie
|
|
157
|
+
)
|
|
158
|
+
})
|
|
159
|
+
)
|
|
160
|
+
const seedNamespace = Effect.fn("seedNamespace")(function*(ns: string) {
|
|
161
|
+
if (!seed) return
|
|
162
|
+
let cached = seedCache.get(ns)
|
|
163
|
+
if (!cached) {
|
|
164
|
+
cached = yield* Effect.cached(makeSeedEffect(ns))
|
|
165
|
+
seedCache.set(ns, cached)
|
|
166
|
+
}
|
|
167
|
+
yield* cached
|
|
168
|
+
})
|
|
169
|
+
const resolveAndSeed = resolveNamespace.pipe(
|
|
170
|
+
Effect.tap((ns) => seedNamespace(ns))
|
|
171
|
+
)
|
|
172
|
+
|
|
81
173
|
const s: Store<IdKey, Encoded> = {
|
|
82
|
-
all:
|
|
174
|
+
all: resolveAndSeed.pipe(Effect.flatMap((ns) =>
|
|
83
175
|
exec(`SELECT id, _etag, data FROM "${tableName}" WHERE _namespace = $1`, [ns])
|
|
84
176
|
.pipe(
|
|
85
177
|
Effect.map((rows) => (rows as any[]).map((r) => parseRow<Encoded>(r, idKey, defaultValues))),
|
|
@@ -94,7 +186,7 @@ function makePgStore({ prefix }: StorageConfig) {
|
|
|
94
186
|
)),
|
|
95
187
|
|
|
96
188
|
find: (id) =>
|
|
97
|
-
|
|
189
|
+
resolveAndSeed.pipe(Effect
|
|
98
190
|
.flatMap((ns) =>
|
|
99
191
|
exec(`SELECT id, _etag, data FROM "${tableName}" WHERE id = $1 AND _namespace = $2`, [id, ns])
|
|
100
192
|
.pipe(
|
|
@@ -114,7 +206,7 @@ function makePgStore({ prefix }: StorageConfig) {
|
|
|
114
206
|
const filter = f
|
|
115
207
|
.filter
|
|
116
208
|
type M = U extends undefined ? Encoded : Pick<Encoded, U>
|
|
117
|
-
return
|
|
209
|
+
return resolveAndSeed.pipe(Effect.flatMap((ns) =>
|
|
118
210
|
Effect
|
|
119
211
|
.sync(() => {
|
|
120
212
|
const q = buildWhereSQLQuery(
|
|
@@ -169,83 +261,36 @@ function makePgStore({ prefix }: StorageConfig) {
|
|
|
169
261
|
},
|
|
170
262
|
|
|
171
263
|
set: (e) =>
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
.
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
`UPDATE "${tableName}" SET _etag = $1, data = $2 WHERE id = $3 AND _etag = $4 AND _namespace = $5`,
|
|
179
|
-
[row._etag, row.data, row.id, e._etag, ns]
|
|
180
|
-
)
|
|
181
|
-
const existing = yield* exec(
|
|
182
|
-
`SELECT _etag FROM "${tableName}" WHERE id = $1 AND _namespace = $2`,
|
|
183
|
-
[row.id, ns]
|
|
184
|
-
)
|
|
185
|
-
const current = (existing as any[])[0]
|
|
186
|
-
if (!current || current._etag !== row._etag) {
|
|
187
|
-
if (current) {
|
|
188
|
-
return yield* new OptimisticConcurrencyException({
|
|
189
|
-
type: name,
|
|
190
|
-
id: row.id,
|
|
191
|
-
current: current._etag,
|
|
192
|
-
found: e._etag,
|
|
193
|
-
code: 412
|
|
194
|
-
})
|
|
195
|
-
}
|
|
196
|
-
return yield* new OptimisticConcurrencyException({
|
|
197
|
-
type: name,
|
|
198
|
-
id: row.id,
|
|
199
|
-
current: "",
|
|
200
|
-
found: e._etag,
|
|
201
|
-
code: 404
|
|
202
|
-
})
|
|
203
|
-
}
|
|
204
|
-
} else {
|
|
205
|
-
yield* exec(
|
|
206
|
-
`INSERT INTO "${tableName}" (id, _namespace, _etag, data) VALUES ($1, $2, $3, $4)`,
|
|
207
|
-
[row.id, ns, row._etag, row.data]
|
|
208
|
-
)
|
|
209
|
-
}
|
|
210
|
-
return row.item
|
|
211
|
-
})
|
|
212
|
-
.pipe(
|
|
213
|
-
Effect.withSpan("PgSQL.set [effect-app/infra/Store]", {
|
|
214
|
-
attributes: { "repository.table_name": tableName, "repository.model_name": name, id: e[idKey] }
|
|
215
|
-
}, { captureStackTrace: false })
|
|
216
|
-
)
|
|
264
|
+
resolveAndSeed.pipe(Effect.flatMap((ns) =>
|
|
265
|
+
setInternal(e, ns).pipe(
|
|
266
|
+
Effect.withSpan("PgSQL.set [effect-app/infra/Store]", {
|
|
267
|
+
attributes: { "repository.table_name": tableName, "repository.model_name": name, id: e[idKey] }
|
|
268
|
+
}, { captureStackTrace: false })
|
|
269
|
+
)
|
|
217
270
|
)),
|
|
218
271
|
|
|
219
272
|
batchSet: (items) =>
|
|
220
|
-
|
|
221
|
-
.
|
|
222
|
-
Effect.forEach(items, (e) => s.set(e))
|
|
223
|
-
)
|
|
224
|
-
.pipe(
|
|
225
|
-
Effect.orDie,
|
|
226
|
-
Effect.map((_) => _ as unknown as NonEmptyReadonlyArray<PM>),
|
|
273
|
+
resolveAndSeed.pipe(Effect.flatMap((ns) =>
|
|
274
|
+
bulkSetInternal(items, ns).pipe(
|
|
227
275
|
Effect.withSpan("PgSQL.batchSet [effect-app/infra/Store]", {
|
|
228
276
|
attributes: { "repository.table_name": tableName, "repository.model_name": name }
|
|
229
277
|
}, { captureStackTrace: false })
|
|
230
|
-
)
|
|
278
|
+
)
|
|
279
|
+
)),
|
|
231
280
|
|
|
232
281
|
bulkSet: (items) =>
|
|
233
|
-
|
|
234
|
-
.
|
|
235
|
-
Effect.forEach(items, (e) => s.set(e))
|
|
236
|
-
)
|
|
237
|
-
.pipe(
|
|
238
|
-
Effect.orDie,
|
|
239
|
-
Effect.map((_) => _ as unknown as NonEmptyReadonlyArray<PM>),
|
|
282
|
+
resolveAndSeed.pipe(Effect.flatMap((ns) =>
|
|
283
|
+
bulkSetInternal(items, ns).pipe(
|
|
240
284
|
Effect.withSpan("PgSQL.bulkSet [effect-app/infra/Store]", {
|
|
241
285
|
attributes: { "repository.table_name": tableName, "repository.model_name": name }
|
|
242
286
|
}, { captureStackTrace: false })
|
|
243
|
-
)
|
|
287
|
+
)
|
|
288
|
+
)),
|
|
244
289
|
|
|
245
290
|
batchRemove: (ids) => {
|
|
246
291
|
const placeholders = ids.map((_, i) => `$${i + 1}`).join(", ")
|
|
247
292
|
const nsPlaceholder = `$${ids.length + 1}`
|
|
248
|
-
return
|
|
293
|
+
return resolveAndSeed.pipe(Effect.flatMap((ns) =>
|
|
249
294
|
exec(
|
|
250
295
|
`DELETE FROM "${tableName}" WHERE id IN (${placeholders}) AND _namespace = ${nsPlaceholder}`,
|
|
251
296
|
[...ids, ns]
|
|
@@ -268,21 +313,8 @@ function makePgStore({ prefix }: StorageConfig) {
|
|
|
268
313
|
)
|
|
269
314
|
}
|
|
270
315
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
`SELECT COUNT(*) as cnt FROM "${tableName}" WHERE _namespace = $1`,
|
|
274
|
-
["primary"]
|
|
275
|
-
)
|
|
276
|
-
const count = Number((existing as any[])[0]?.cnt ?? 0)
|
|
277
|
-
if (count === 0) {
|
|
278
|
-
yield* InfraLogger.logInfo("Seeding data for " + name)
|
|
279
|
-
const items = yield* seed
|
|
280
|
-
yield* Effect.flatMapOption(
|
|
281
|
-
Effect.succeed(toNonEmptyArray([...items])),
|
|
282
|
-
(a) => s.bulkSet(a).pipe(Effect.orDie)
|
|
283
|
-
)
|
|
284
|
-
}
|
|
285
|
-
}
|
|
316
|
+
// Eagerly seed primary namespace on initialization
|
|
317
|
+
yield* seedNamespace("primary")
|
|
286
318
|
|
|
287
319
|
return s
|
|
288
320
|
})
|