@effect-app/infra 4.0.0-beta.13 → 4.0.0-beta.130

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.
Files changed (201) hide show
  1. package/CHANGELOG.md +857 -0
  2. package/dist/CUPS.d.ts +13 -5
  3. package/dist/CUPS.d.ts.map +1 -1
  4. package/dist/CUPS.js +10 -12
  5. package/dist/Emailer/service.d.ts +2 -2
  6. package/dist/Emailer/service.d.ts.map +1 -1
  7. package/dist/Emailer/service.js +3 -3
  8. package/dist/MainFiberSet.d.ts +2 -2
  9. package/dist/MainFiberSet.d.ts.map +1 -1
  10. package/dist/MainFiberSet.js +3 -3
  11. package/dist/Model/Repository/Registry.d.ts +20 -0
  12. package/dist/Model/Repository/Registry.d.ts.map +1 -0
  13. package/dist/Model/Repository/Registry.js +17 -0
  14. package/dist/Model/Repository/ext.d.ts +21 -3
  15. package/dist/Model/Repository/ext.d.ts.map +1 -1
  16. package/dist/Model/Repository/ext.js +54 -2
  17. package/dist/Model/Repository/internal/internal.d.ts +4 -4
  18. package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
  19. package/dist/Model/Repository/internal/internal.js +31 -21
  20. package/dist/Model/Repository/makeRepo.d.ts +6 -5
  21. package/dist/Model/Repository/makeRepo.d.ts.map +1 -1
  22. package/dist/Model/Repository/makeRepo.js +4 -1
  23. package/dist/Model/Repository/service.d.ts +27 -22
  24. package/dist/Model/Repository/service.d.ts.map +1 -1
  25. package/dist/Model/Repository/validation.d.ts +59 -9
  26. package/dist/Model/Repository/validation.d.ts.map +1 -1
  27. package/dist/Model/Repository.d.ts +1 -0
  28. package/dist/Model/Repository.d.ts.map +1 -1
  29. package/dist/Model/Repository.js +2 -1
  30. package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -1
  31. package/dist/Model/query/new-kid-interpreter.js +3 -3
  32. package/dist/Model.d.ts +1 -0
  33. package/dist/Model.d.ts.map +1 -1
  34. package/dist/Model.js +2 -1
  35. package/dist/Operations.d.ts +4 -4
  36. package/dist/Operations.d.ts.map +1 -1
  37. package/dist/Operations.js +56 -59
  38. package/dist/OperationsRepo.d.ts +4 -4
  39. package/dist/OperationsRepo.d.ts.map +1 -1
  40. package/dist/OperationsRepo.js +3 -3
  41. package/dist/QueueMaker/SQLQueue.d.ts +3 -6
  42. package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
  43. package/dist/QueueMaker/SQLQueue.js +105 -114
  44. package/dist/QueueMaker/errors.d.ts +1 -1
  45. package/dist/QueueMaker/errors.d.ts.map +1 -1
  46. package/dist/QueueMaker/memQueue.d.ts +6 -3
  47. package/dist/QueueMaker/memQueue.d.ts.map +1 -1
  48. package/dist/QueueMaker/memQueue.js +51 -62
  49. package/dist/QueueMaker/sbqueue.d.ts +5 -2
  50. package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
  51. package/dist/QueueMaker/sbqueue.js +36 -52
  52. package/dist/RequestContext.d.ts +51 -21
  53. package/dist/RequestContext.d.ts.map +1 -1
  54. package/dist/RequestContext.js +5 -5
  55. package/dist/RequestFiberSet.d.ts +2 -2
  56. package/dist/RequestFiberSet.d.ts.map +1 -1
  57. package/dist/RequestFiberSet.js +5 -5
  58. package/dist/Store/ContextMapContainer.d.ts +18 -2
  59. package/dist/Store/ContextMapContainer.d.ts.map +1 -1
  60. package/dist/Store/ContextMapContainer.js +13 -3
  61. package/dist/Store/Cosmos.d.ts.map +1 -1
  62. package/dist/Store/Cosmos.js +308 -242
  63. package/dist/Store/Disk.d.ts +1 -1
  64. package/dist/Store/Disk.d.ts.map +1 -1
  65. package/dist/Store/Disk.js +25 -22
  66. package/dist/Store/Memory.d.ts +3 -3
  67. package/dist/Store/Memory.d.ts.map +1 -1
  68. package/dist/Store/Memory.js +27 -22
  69. package/dist/Store/SQL/Pg.d.ts +4 -0
  70. package/dist/Store/SQL/Pg.d.ts.map +1 -0
  71. package/dist/Store/SQL/Pg.js +189 -0
  72. package/dist/Store/SQL/query.d.ts +38 -0
  73. package/dist/Store/SQL/query.d.ts.map +1 -0
  74. package/dist/Store/SQL/query.js +367 -0
  75. package/dist/Store/SQL.d.ts +20 -0
  76. package/dist/Store/SQL.d.ts.map +1 -0
  77. package/dist/Store/SQL.js +381 -0
  78. package/dist/Store/index.d.ts +4 -1
  79. package/dist/Store/index.d.ts.map +1 -1
  80. package/dist/Store/index.js +15 -3
  81. package/dist/Store/service.d.ts +16 -5
  82. package/dist/Store/service.d.ts.map +1 -1
  83. package/dist/Store/service.js +24 -6
  84. package/dist/Store/utils.d.ts.map +1 -1
  85. package/dist/Store/utils.js +3 -4
  86. package/dist/adapters/ServiceBus.d.ts +6 -6
  87. package/dist/adapters/ServiceBus.d.ts.map +1 -1
  88. package/dist/adapters/ServiceBus.js +13 -15
  89. package/dist/adapters/cosmos-client.d.ts +2 -2
  90. package/dist/adapters/cosmos-client.d.ts.map +1 -1
  91. package/dist/adapters/cosmos-client.js +3 -3
  92. package/dist/adapters/logger.d.ts.map +1 -1
  93. package/dist/adapters/memQueue.d.ts +2 -2
  94. package/dist/adapters/memQueue.d.ts.map +1 -1
  95. package/dist/adapters/memQueue.js +3 -3
  96. package/dist/adapters/mongo-client.d.ts +2 -2
  97. package/dist/adapters/mongo-client.d.ts.map +1 -1
  98. package/dist/adapters/mongo-client.js +3 -3
  99. package/dist/adapters/redis-client.d.ts +2 -2
  100. package/dist/adapters/redis-client.d.ts.map +1 -1
  101. package/dist/adapters/redis-client.js +3 -3
  102. package/dist/api/ContextProvider.d.ts +6 -6
  103. package/dist/api/ContextProvider.d.ts.map +1 -1
  104. package/dist/api/ContextProvider.js +6 -6
  105. package/dist/api/internal/auth.d.ts +42 -4
  106. package/dist/api/internal/auth.d.ts.map +1 -1
  107. package/dist/api/internal/auth.js +160 -29
  108. package/dist/api/internal/events.d.ts +2 -2
  109. package/dist/api/internal/events.d.ts.map +1 -1
  110. package/dist/api/internal/events.js +11 -7
  111. package/dist/api/layerUtils.d.ts +5 -5
  112. package/dist/api/layerUtils.d.ts.map +1 -1
  113. package/dist/api/layerUtils.js +5 -5
  114. package/dist/api/routing/middleware/RouterMiddleware.d.ts +3 -3
  115. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
  116. package/dist/api/routing/middleware/middleware.d.ts +35 -1
  117. package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
  118. package/dist/api/routing/middleware/middleware.js +39 -1
  119. package/dist/api/routing.d.ts +1 -5
  120. package/dist/api/routing.d.ts.map +1 -1
  121. package/dist/api/routing.js +3 -2
  122. package/dist/api/setupRequest.d.ts +6 -3
  123. package/dist/api/setupRequest.d.ts.map +1 -1
  124. package/dist/api/setupRequest.js +11 -6
  125. package/dist/errorReporter.d.ts +3 -3
  126. package/dist/errorReporter.d.ts.map +1 -1
  127. package/dist/errorReporter.js +16 -23
  128. package/dist/logger.d.ts.map +1 -1
  129. package/dist/rateLimit.d.ts +8 -2
  130. package/dist/rateLimit.d.ts.map +1 -1
  131. package/dist/rateLimit.js +5 -11
  132. package/examples/query.ts +30 -26
  133. package/package.json +36 -22
  134. package/src/CUPS.ts +9 -11
  135. package/src/Emailer/service.ts +2 -2
  136. package/src/MainFiberSet.ts +2 -2
  137. package/src/Model/Repository/Registry.ts +33 -0
  138. package/src/Model/Repository/ext.ts +93 -6
  139. package/src/Model/Repository/internal/internal.ts +84 -76
  140. package/src/Model/Repository/makeRepo.ts +11 -8
  141. package/src/Model/Repository/service.ts +31 -22
  142. package/src/Model/Repository.ts +1 -0
  143. package/src/Model/query/new-kid-interpreter.ts +2 -2
  144. package/src/Model.ts +1 -0
  145. package/src/Operations.ts +78 -113
  146. package/src/OperationsRepo.ts +2 -2
  147. package/src/QueueMaker/SQLQueue.ts +121 -151
  148. package/src/QueueMaker/memQueue.ts +82 -103
  149. package/src/QueueMaker/sbqueue.ts +55 -85
  150. package/src/RequestContext.ts +4 -4
  151. package/src/RequestFiberSet.ts +4 -4
  152. package/src/Store/ContextMapContainer.ts +41 -2
  153. package/src/Store/Cosmos.ts +437 -343
  154. package/src/Store/Disk.ts +52 -49
  155. package/src/Store/Memory.ts +54 -48
  156. package/src/Store/SQL/Pg.ts +318 -0
  157. package/src/Store/SQL/query.ts +409 -0
  158. package/src/Store/SQL.ts +668 -0
  159. package/src/Store/index.ts +17 -2
  160. package/src/Store/service.ts +31 -7
  161. package/src/Store/utils.ts +23 -22
  162. package/src/adapters/ServiceBus.ts +111 -115
  163. package/src/adapters/cosmos-client.ts +2 -2
  164. package/src/adapters/memQueue.ts +2 -2
  165. package/src/adapters/mongo-client.ts +2 -2
  166. package/src/adapters/redis-client.ts +2 -2
  167. package/src/api/ContextProvider.ts +11 -11
  168. package/src/api/internal/auth.ts +246 -44
  169. package/src/api/internal/events.ts +14 -9
  170. package/src/api/layerUtils.ts +8 -8
  171. package/src/api/routing/middleware/RouterMiddleware.ts +4 -4
  172. package/src/api/routing/middleware/middleware.ts +42 -0
  173. package/src/api/routing.ts +4 -4
  174. package/src/api/setupRequest.ts +27 -7
  175. package/src/errorReporter.ts +58 -72
  176. package/src/rateLimit.ts +30 -22
  177. package/test/auth.test.ts +101 -0
  178. package/test/contextProvider.test.ts +11 -11
  179. package/test/controller.test.ts +18 -13
  180. package/test/dist/auth.test.d.ts.map +1 -0
  181. package/test/dist/contextProvider.test.d.ts.map +1 -1
  182. package/test/dist/controller.test.d.ts.map +1 -1
  183. package/test/dist/date-query.test.d.ts.map +1 -0
  184. package/test/dist/fixtures.d.ts +19 -9
  185. package/test/dist/fixtures.d.ts.map +1 -1
  186. package/test/dist/fixtures.js +11 -9
  187. package/test/dist/query.test.d.ts.map +1 -1
  188. package/test/dist/rawQuery.test.d.ts.map +1 -1
  189. package/test/dist/repository-ext.test.d.ts.map +1 -0
  190. package/test/dist/requires.test.d.ts.map +1 -1
  191. package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
  192. package/test/dist/sql-store.test.d.ts.map +1 -0
  193. package/test/fixtures.ts +10 -8
  194. package/test/query.test.ts +209 -31
  195. package/test/rawQuery.test.ts +23 -19
  196. package/test/repository-ext.test.ts +58 -0
  197. package/test/requires.test.ts +6 -5
  198. package/test/rpc-multi-middleware.test.ts +72 -3
  199. package/test/sql-store.test.ts +1064 -0
  200. package/test/validateSample.test.ts +12 -9
  201. package/tsconfig.json +0 -1
@@ -6,6 +6,7 @@ import { CosmosClient, CosmosClientLayer } from "../adapters/cosmos-client.js";
6
6
  import { OptimisticConcurrencyException } from "../errors.js";
7
7
  import { InfraLogger } from "../logger.js";
8
8
  import { buildWhereCosmosQuery3, logQuery } from "./Cosmos/query.js";
9
+ import { storeId } from "./Memory.js";
9
10
  import { StoreMaker } from "./service.js";
10
11
  const makeMapId = (idKey) => ({ [idKey]: id, ...e }) => ({
11
12
  ...e,
@@ -20,286 +21,351 @@ class CosmosDbOperationError {
20
21
  this.raw = raw;
21
22
  }
22
23
  } // TODO: Retry operation when running into RU limit.
23
- function makeCosmosStore({ prefix }) {
24
- return Effect.gen(function* () {
25
- const { db } = yield* CosmosClient;
26
- return {
27
- make: (name, idKey, seed, config) => Effect.gen(function* () {
28
- const mapId = makeMapId(idKey);
29
- const mapReverseId = makeReverseMapId(idKey);
30
- const containerId = `${prefix}${name}`;
31
- yield* Effect.promise(() => db.containers.createIfNotExists(dropUndefinedT({
32
- id: containerId,
33
- uniqueKeyPolicy: config?.uniqueKeys
34
- ? { uniqueKeys: config.uniqueKeys }
35
- : undefined
36
- })));
37
- const mainPartitionKey = config?.partitionValue() ?? "primary";
38
- const defaultValues = config?.defaultValues ?? {};
39
- const container = db.container(containerId);
40
- const bulk = container.items.bulk.bind(container.items);
41
- const execBatch = container.items.batch.bind(container.items);
42
- // TODO: move the marker to a separate container and get rid of the checks on every query
43
- // then need to clean up the actual data.. perhaps first do with a config toggle to prescribe to it.
44
- const importedMarkerId = containerId;
45
- const bulkSet = (items) => Effect
46
- .gen(function* () {
47
- // TODO: disable batching if need atomicity
48
- // we delay and batch to keep low amount of RUs
49
- const b = [...items]
50
- .map((x) => [
24
+ const makeCosmosStore = Effect.fnUntraced(function* ({ prefix }) {
25
+ const { db } = yield* CosmosClient;
26
+ return {
27
+ make: Effect.fnUntraced(function* (name, idKey, seed, config) {
28
+ const mapId = makeMapId(idKey);
29
+ const mapReverseId = makeReverseMapId(idKey);
30
+ const containerId = `${prefix}${name}`;
31
+ yield* Effect.promise(() => db.containers.createIfNotExists(dropUndefinedT({
32
+ id: containerId,
33
+ uniqueKeyPolicy: config?.uniqueKeys
34
+ ? { uniqueKeys: config.uniqueKeys }
35
+ : undefined,
36
+ partitionKey: {
37
+ paths: ["/_partitionKey"],
38
+ version: 2 // support large partitionkeys so that the hash is not based on just the first 100 bytes!
39
+ }
40
+ })));
41
+ const basePartitionKey = config?.partitionValue() ?? "primary";
42
+ const nsPrefix = (ns) => ns === "primary" ? "" : `${ns}::`;
43
+ const nsPartitionValue = (ns, e) => {
44
+ const base = config?.partitionValue(e) ?? "primary";
45
+ return `${nsPrefix(ns)}${base}`;
46
+ };
47
+ const nsBasePartitionKey = (ns) => `${nsPrefix(ns)}${basePartitionKey}`;
48
+ const resolveNamespace = !config?.allowNamespace
49
+ ? Effect.succeed("primary")
50
+ : storeId.asEffect().pipe(Effect.map((namespace) => {
51
+ if (namespace !== "primary" && !config.allowNamespace(namespace)) {
52
+ throw new Error(`Namespace ${namespace} not allowed!`);
53
+ }
54
+ return namespace;
55
+ }));
56
+ const defaultValues = config?.defaultValues ?? {};
57
+ const container = db.container(containerId);
58
+ const bulk = container.items.bulk.bind(container.items);
59
+ const execBatch = container.items.batch.bind(container.items);
60
+ // TODO: move the marker to a separate container and get rid of the checks on every query
61
+ // then need to clean up the actual data.. perhaps first do with a config toggle to prescribe to it.
62
+ const importedMarkerId = containerId;
63
+ const ctx = yield* Effect.context();
64
+ const seedCache = new Map();
65
+ const makeSeedEffect = (ns) => {
66
+ const markerId = ns === "primary" ? importedMarkerId : `${importedMarkerId}::${ns}`;
67
+ return Effect
68
+ .promise(() => container
69
+ .item(markerId, markerId)
70
+ .read()
71
+ .then(({ resource }) => Option.fromNullishOr(resource)))
72
+ .pipe(Effect.flatMap((marker) => {
73
+ if (Option.isSome(marker))
74
+ return Effect.void;
75
+ return InfraLogger.logInfo(`Creating mock data for ${name} (namespace: ${ns})`).pipe(Effect.andThen(seed), Effect.flatMap((m) => Effect.flatMapOption(Effect.succeed(toNonEmptyArray([...m])), (a) => bulkSetInternal(a, ns).pipe(Effect.orDie))), Effect.andThen(Effect.promise(() => container.items.create({
76
+ _partitionKey: markerId,
77
+ id: markerId,
78
+ ttl: -1
79
+ }))), Effect.provide(ctx), Effect.orDie);
80
+ }), Effect.withLogSpan(`Cosmos.seedCheck ${name} in ${ns} [effect-app/infra/Store]`), Effect.withSpan("Cosmos.seed [effect-app/infra/Store]", { attributes: { name, namespace: ns } }));
81
+ };
82
+ const seedNamespace = Effect.fn("seedNamespace")(function* (ns) {
83
+ if (!seed)
84
+ return;
85
+ let cached = seedCache.get(ns);
86
+ if (!cached) {
87
+ cached = yield* Effect.cached(Effect.uninterruptible(makeSeedEffect(ns)));
88
+ seedCache.set(ns, cached);
89
+ }
90
+ yield* cached;
91
+ });
92
+ const bulkSetInternal = (items, ns) => Effect
93
+ .gen(function* () {
94
+ // TODO: disable batching if need atomicity
95
+ // we delay and batch to keep low amount of RUs
96
+ const b = [...items]
97
+ .map((x) => [
98
+ x,
99
+ Option.match(Option.fromNullishOr(x._etag), {
100
+ onNone: () => dropUndefinedT({
101
+ operationType: "Create",
102
+ resourceBody: {
103
+ ...Struct.omit(x, ["_etag", idKey]),
104
+ id: x[idKey],
105
+ _partitionKey: nsPartitionValue(ns, x)
106
+ }
107
+ // don't use this or we get an error that the request and some item partition key dont match - makese no sense
108
+ // partitionKey: config?.partitionValue(x)
109
+ }),
110
+ onSome: (eTag) => dropUndefinedT({
111
+ operationType: "Replace",
112
+ id: x[idKey],
113
+ resourceBody: {
114
+ ...Struct.omit(x, ["_etag", idKey]),
115
+ id: x[idKey],
116
+ _partitionKey: nsPartitionValue(ns, x)
117
+ },
118
+ ifMatch: eTag
119
+ // don't use this or we get an error that the request and some item partition key dont match - makese no sense
120
+ // partitionKey: config?.partitionValue(x)
121
+ })
122
+ })
123
+ ]);
124
+ const batches = Array.chunksOf(b, config?.maxBulkSize ?? 10);
125
+ const batchResult = yield* Effect.forEach(batches
126
+ .map((x, i) => [i, x]), ([i, batch]) => Effect
127
+ .promise(() => bulk(batch.map(([, op]) => op)))
128
+ .pipe(Effect
129
+ .delay(Duration.millis(i === 0 ? 0 : 150)), Effect
130
+ .flatMap((responses) => Effect.gen(function* () {
131
+ const r = responses.find((x) => x.statusCode === 412 || x.statusCode === 404 || x.statusCode === 409);
132
+ if (r) {
133
+ return yield* Effect.fail(new OptimisticConcurrencyException({
134
+ type: name,
135
+ id: JSON.stringify(r.resourceBody?.["id"]),
136
+ code: r.statusCode,
137
+ raw: responses
138
+ }));
139
+ }
140
+ const r2 = responses.find((x) => x.statusCode !== 424 && (x.statusCode > 299 || x.statusCode < 200));
141
+ if (r2) {
142
+ return yield* Effect.die(new CosmosDbOperationError("not able to update records: " + r2.statusCode, responses));
143
+ }
144
+ const r3 = responses.find((x) => x.statusCode > 299 || x.statusCode < 200);
145
+ if (r3) {
146
+ return yield* Effect.die(new CosmosDbOperationError("not able to update records: " + r3.statusCode, responses));
147
+ }
148
+ return batch.map(([e], i) => ({
149
+ ...e,
150
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
151
+ _etag: responses[i].eTag
152
+ }));
153
+ }))));
154
+ return batchResult.flat();
155
+ })
156
+ .pipe(Effect.withSpan("Cosmos.bulkSet [effect-app/infra/Store]", {
157
+ attributes: { "repository.container_id": containerId, "repository.model_name": name, namespace: ns }
158
+ }, { captureStackTrace: false }));
159
+ const bulkSet = (items) => resolveNamespace.pipe(Effect.flatMap((ns) => bulkSetInternal(items, ns)));
160
+ const batchSet = (items) => {
161
+ return resolveNamespace
162
+ .pipe(Effect.flatMap((ns) => Effect
163
+ .suspend(() => {
164
+ const batch = [...items].map((x) => [
51
165
  x,
52
166
  Option.match(Option.fromNullishOr(x._etag), {
53
- onNone: () => dropUndefinedT({
167
+ onNone: () => ({
54
168
  operationType: "Create",
55
169
  resourceBody: {
56
170
  ...Struct.omit(x, ["_etag", idKey]),
57
171
  id: x[idKey],
58
- _partitionKey: config?.partitionValue(x)
172
+ _partitionKey: nsPartitionValue(ns, x)
59
173
  }
60
174
  // don't use this or we get an error that the request and some item partition key dont match - makese no sense
61
175
  // partitionKey: config?.partitionValue(x)
62
176
  }),
63
- onSome: (eTag) => dropUndefinedT({
177
+ onSome: (eTag) => ({
64
178
  operationType: "Replace",
65
179
  id: x[idKey],
66
180
  resourceBody: {
67
181
  ...Struct.omit(x, ["_etag", idKey]),
68
182
  id: x[idKey],
69
- _partitionKey: config?.partitionValue(x)
183
+ _partitionKey: nsPartitionValue(ns, x)
70
184
  },
71
- ifMatch: eTag
72
185
  // don't use this or we get an error that the request and some item partition key dont match - makese no sense
73
186
  // partitionKey: config?.partitionValue(x)
187
+ ifMatch: eTag
74
188
  })
75
189
  })
76
190
  ]);
77
- const batches = Array.chunksOf(b, config?.maxBulkSize ?? 10);
78
- const batchResult = yield* Effect.forEach(batches
79
- .map((x, i) => [i, x]), ([i, batch]) => Effect
80
- .promise(() => bulk(batch.map(([, op]) => op)))
81
- .pipe(Effect
82
- .delay(Duration.millis(i === 0 ? 0 : 1100)), Effect
83
- .flatMap((responses) => Effect.gen(function* () {
84
- const r = responses.find((x) => x.statusCode === 412 || x.statusCode === 404 || x.statusCode === 409);
85
- if (r) {
86
- return yield* Effect.fail(new OptimisticConcurrencyException({
87
- type: name,
88
- id: JSON.stringify(r.resourceBody?.["id"]),
89
- code: r.statusCode,
90
- raw: responses
91
- }));
92
- }
93
- const r2 = responses.find((x) => x.statusCode !== 424 && (x.statusCode > 299 || x.statusCode < 200));
94
- if (r2) {
95
- return yield* Effect.die(new CosmosDbOperationError("not able to update records: " + r2.statusCode, responses));
96
- }
97
- const r3 = responses.find((x) => x.statusCode > 299 || x.statusCode < 200);
98
- if (r3) {
99
- return yield* Effect.die(new CosmosDbOperationError("not able to update records: " + r3.statusCode, responses));
191
+ const ex = batch.map(([, c]) => c);
192
+ return Effect
193
+ .promise(() => execBatch(ex, ex[0]?.resourceBody._partitionKey))
194
+ .pipe(Effect.flatMap(Effect.fnUntraced(function* (x) {
195
+ const result = x.result ?? [];
196
+ const firstFailed = result.find((x) => x.statusCode > 299 || x.statusCode < 200);
197
+ if (firstFailed) {
198
+ const code = firstFailed.statusCode ?? 0;
199
+ if (code === 412 || code === 404 || code === 409) {
200
+ return yield* new OptimisticConcurrencyException({ type: name, id: "batch", code });
201
+ }
202
+ return yield* Effect.die(new CosmosDbOperationError("not able to update record: " + code));
100
203
  }
101
204
  return batch.map(([e], i) => ({
102
205
  ...e,
103
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
104
- _etag: responses[i].eTag
206
+ _etag: result[i]?.eTag
105
207
  }));
106
- }))));
107
- return batchResult.flat();
208
+ })));
108
209
  })
109
- .pipe(Effect.withSpan("Cosmos.bulkSet [effect-app/infra/Store]", {
110
- attributes: { "repository.container_id": containerId, "repository.model_name": name }
111
- }, { captureStackTrace: false }));
112
- const batchSet = (items) => {
113
- return Effect
114
- .suspend(() => {
115
- const batch = [...items].map((x) => [
116
- x,
117
- Option.match(Option.fromNullishOr(x._etag), {
118
- onNone: () => ({
119
- operationType: "Create",
120
- resourceBody: {
121
- ...Struct.omit(x, ["_etag", idKey]),
122
- id: x[idKey],
123
- _partitionKey: config?.partitionValue(x)
124
- }
125
- // don't use this or we get an error that the request and some item partition key dont match - makese no sense
126
- // partitionKey: config?.partitionValue(x)
127
- }),
128
- onSome: (eTag) => ({
129
- operationType: "Replace",
130
- id: x[idKey],
131
- resourceBody: {
132
- ...Struct.omit(x, ["_etag", idKey]),
133
- id: x[idKey],
134
- _partitionKey: config?.partitionValue(x)
135
- },
136
- // don't use this or we get an error that the request and some item partition key dont match - makese no sense
137
- // partitionKey: config?.partitionValue(x)
138
- ifMatch: eTag
139
- })
140
- })
141
- ]);
142
- const ex = batch.map(([, c]) => c);
143
- return Effect
144
- .promise(() => execBatch(ex, ex[0]?.resourceBody._partitionKey))
145
- .pipe(Effect.flatMap(Effect.fnUntraced(function* (x) {
146
- const result = x.result ?? [];
147
- const firstFailed = result.find((x) => x.statusCode > 299 || x.statusCode < 200);
148
- if (firstFailed) {
149
- const code = firstFailed.statusCode ?? 0;
150
- if (code === 412 || code === 404 || code === 409) {
151
- return yield* new OptimisticConcurrencyException({ type: name, id: "batch", code });
152
- }
153
- return yield* Effect.die(new CosmosDbOperationError("not able to update record: " + code));
154
- }
155
- return batch.map(([e], i) => ({
156
- ...e,
157
- _etag: result[i]?.eTag
158
- }));
159
- })));
160
- })
161
- .pipe(Effect
162
- .withSpan("Cosmos.batchSet [effect-app/infra/Store]", {
163
- attributes: { "repository.container_id": containerId, "repository.model_name": name }
164
- }, { captureStackTrace: false }));
165
- };
166
- const s = {
167
- queryRaw: (query) => Effect
168
- .sync(() => query.cosmos({ name }))
169
- .pipe(Effect.tap((q) => logQuery(q)), Effect.flatMap((q) => Effect.promise(() => container
170
- .items
171
- .query(q, { partitionKey: mainPartitionKey })
172
- .fetchAll()
173
- .then(({ resources }) => resources.map((_) => ({ ...defaultValues, ...mapReverseId(_) }))))), Effect
174
- .withSpan("Cosmos.queryRaw [effect-app/infra/Store]", {
175
- attributes: { "repository.container_id": containerId, "repository.model_name": name }
176
- }, { captureStackTrace: false })),
177
- batchRemove: (ids, partitionKey) => Effect.promise(() => execBatch(mutable(ids.map((id) => dropUndefinedT({
178
- operationType: "Delete",
179
- id
180
- // don't use this or we get an error that the request and some item partition key dont match - makese no sense
181
- // partitionKey: config?.partitionValue({ [idKey]: id } as Encoded)
182
- }))), partitionKey ?? mainPartitionKey)),
183
- all: Effect
184
- .sync(() => ({
210
+ .pipe(Effect
211
+ .withSpan("Cosmos.batchSet [effect-app/infra/Store]", {
212
+ attributes: {
213
+ "repository.container_id": containerId,
214
+ "repository.model_name": name,
215
+ namespace: ns
216
+ }
217
+ }, { captureStackTrace: false }))));
218
+ };
219
+ const s = {
220
+ seedNamespace: (ns) => seedNamespace(ns),
221
+ queryRaw: (query) => Effect
222
+ .all({ q: Effect.sync(() => query.cosmos({ name })), ns: resolveNamespace })
223
+ .pipe(Effect.tap(({ q }) => logQuery(q)), Effect.flatMap(({ ns, q }) => Effect
224
+ .promise(() => container
225
+ .items
226
+ .query(q, { partitionKey: nsBasePartitionKey(ns) })
227
+ .fetchAll()
228
+ .then(({ resources }) => resources.map((_) => ({ ...defaultValues, ...mapReverseId(_) }))))
229
+ .pipe(Effect.withSpan("Cosmos.queryRaw [effect-app/infra/Store]", {
230
+ attributes: {
231
+ "repository.container_id": containerId,
232
+ "repository.model_name": name,
233
+ namespace: ns
234
+ }
235
+ }, { captureStackTrace: false })))),
236
+ batchRemove: (ids, partitionKey) => resolveNamespace.pipe(Effect.flatMap((ns) => Effect
237
+ .promise(() => execBatch(mutable(ids.map((id) => dropUndefinedT({
238
+ operationType: "Delete",
239
+ id
240
+ // don't use this or we get an error that the request and some item partition key dont match - makese no sense
241
+ // partitionKey: config?.partitionValue({ [idKey]: id } as Encoded)
242
+ }))), partitionKey ?? nsBasePartitionKey(ns)))
243
+ .pipe(Effect.withSpan("Cosmos.batchRemove [effect-app/infra/Store]", {
244
+ attributes: {
245
+ "repository.container_id": containerId,
246
+ "repository.model_name": name,
247
+ namespace: ns
248
+ }
249
+ }, { captureStackTrace: false })))),
250
+ all: Effect
251
+ .all({
252
+ q: Effect.sync(() => ({
185
253
  query: `SELECT * FROM ${name}`,
186
254
  parameters: []
187
- }))
188
- .pipe(Effect.tap((q) => logQuery(q)), Effect.flatMap((q) => Effect.promise(() => container
189
- .items
190
- .query(q, { partitionKey: mainPartitionKey })
191
- .fetchAll()
192
- .then(({ resources }) => resources.map((_) => ({ ...defaultValues, ...mapReverseId(_) }))))), Effect
193
- .withSpan("Cosmos.all [effect-app/infra/Store]", {
194
- attributes: { "repository.container_id": containerId, "repository.model_name": name }
195
- }, { captureStackTrace: false })),
196
- /**
197
- * May return duplicate results for "join_find", when matching more than once.
198
- */
199
- filter: (f) => {
200
- const skip = f?.skip;
201
- const limit = f?.limit;
202
- const filter = f.filter;
203
- return Effect
204
- .sync(() => buildWhereCosmosQuery3(idKey, filter ? [{ t: "where-scope", result: filter, relation: "some" }] : [], name, defaultValues, f.select, f.order, skip, limit))
205
- .pipe(Effect.tap((q) => logQuery(q)), Effect
206
- .flatMap((q) => Effect.promise(() => f.select
207
- ? container
208
- .items
209
- .query(q, { partitionKey: mainPartitionKey })
210
- .fetchAll()
211
- .then(({ resources }) => resources.map((_) => ({
212
- ...pipe(defaultValues, Struct.pick(f.select.filter((_) => typeof _ === "string"))),
213
- ...mapReverseId(_)
214
- })))
215
- : container
216
- .items
217
- .query(q, { partitionKey: mainPartitionKey })
218
- .fetchAll()
219
- .then(({ resources }) => resources.map(({ f }) => ({ ...defaultValues, ...mapReverseId(f) }))))))
220
- .pipe(Effect.withSpan("Cosmos.filter [effect-app/infra/Store]", {
221
- attributes: { "repository.container_id": containerId, "repository.model_name": name }
222
- }, { captureStackTrace: false }));
223
- },
224
- find: (id) => Effect
225
- .promise(() => container
226
- .item(id, config?.partitionValue({ [idKey]: id }))
227
- .read()
228
- .then(({ resource }) => Option.fromNullishOr(resource).pipe(Option.map((_) => ({ ...defaultValues, ...mapReverseId(_) })))))
229
- .pipe(Effect
230
- .withSpan("Cosmos.find [effect-app/infra/Store]", {
231
- attributes: {
232
- "repository.container_id": containerId,
233
- "repository.model_name": name,
234
- partitionValue: config?.partitionValue({ [idKey]: id }),
235
- id
236
- }
237
- }, { captureStackTrace: false })),
238
- set: (e) => Option
239
- .match(Option
240
- .fromNullishOr(e._etag), {
241
- onNone: () => Effect.promise(() => container.items.create({
242
- ...mapId(e),
243
- _partitionKey: config?.partitionValue(e)
244
- })),
245
- onSome: (eTag) => Effect.promise(() => container.item(e[idKey], config?.partitionValue(e)).replace({ ...mapId(e), _partitionKey: config?.partitionValue(e) }, {
246
- accessCondition: {
247
- type: "IfMatch",
248
- condition: eTag
249
- }
250
- }))
255
+ })),
256
+ ns: resolveNamespace
257
+ })
258
+ .pipe(Effect.tap(({ q }) => logQuery(q)), Effect.flatMap(({ ns, q }) => Effect
259
+ .promise(() => container
260
+ .items
261
+ .query(q, { partitionKey: nsBasePartitionKey(ns) })
262
+ .fetchAll()
263
+ .then(({ resources }) => resources.map((_) => ({ ...defaultValues, ...mapReverseId(_) }))))
264
+ .pipe(Effect.withSpan("Cosmos.all [effect-app/infra/Store]", {
265
+ attributes: {
266
+ "repository.container_id": containerId,
267
+ "repository.model_name": name,
268
+ namespace: ns
269
+ }
270
+ }, { captureStackTrace: false })))),
271
+ /**
272
+ * May return duplicate results for "join_find", when matching more than once.
273
+ */
274
+ filter: (f) => {
275
+ const skip = f?.skip;
276
+ const limit = f?.limit;
277
+ const filter = f.filter;
278
+ return Effect
279
+ .all({
280
+ q: Effect.sync(() => buildWhereCosmosQuery3(idKey, filter ? [{ t: "where-scope", result: filter, relation: "some" }] : [], name, defaultValues, f.select, f.order, skip, limit)),
281
+ ns: resolveNamespace
251
282
  })
252
- .pipe(Effect
253
- .flatMap((x) => {
254
- if (x.statusCode === 412 || x.statusCode === 404 || x.statusCode === 409) {
255
- return Effect.fail(new OptimisticConcurrencyException({ type: name, id: e[idKey], code: x.statusCode }));
256
- }
257
- if (x.statusCode > 299 || x.statusCode < 200) {
258
- return Effect.die(new CosmosDbOperationError("not able to update record: " + x.statusCode));
259
- }
260
- return Effect.sync(() => ({
261
- ...e,
262
- _etag: x.etag
263
- }));
264
- }), Effect
265
- .withSpan("Cosmos.set [effect-app/infra/Store]", {
283
+ .pipe(Effect.tap(({ q }) => logQuery(q)), Effect
284
+ .flatMap(({ ns, q }) => Effect
285
+ .promise(() => f.select
286
+ ? container
287
+ .items
288
+ .query(q, { partitionKey: nsBasePartitionKey(ns) })
289
+ .fetchAll()
290
+ .then(({ resources }) => resources.map((_) => ({
291
+ ...pipe(defaultValues, Struct.pick(f.select.filter((_) => typeof _ === "string"))),
292
+ ...mapReverseId(_)
293
+ })))
294
+ : container
295
+ .items
296
+ .query(q, { partitionKey: nsBasePartitionKey(ns) })
297
+ .fetchAll()
298
+ .then(({ resources }) => resources.map(({ f }) => ({ ...defaultValues, ...mapReverseId(f) }))))
299
+ .pipe(Effect.withSpan("Cosmos.filter [effect-app/infra/Store]", {
266
300
  attributes: {
267
301
  "repository.container_id": containerId,
268
302
  "repository.model_name": name,
269
- id: e[idKey]
303
+ namespace: ns
270
304
  }
271
- }, { captureStackTrace: false })),
272
- batchSet,
273
- bulkSet
274
- };
275
- // handle mock data
276
- const marker = yield* Effect.promise(() => container
277
- .item(importedMarkerId, importedMarkerId)
305
+ }, { captureStackTrace: false }))));
306
+ },
307
+ find: (id) => resolveNamespace.pipe(Effect.flatMap((ns) => Effect
308
+ .promise(() => container
309
+ .item(id, nsPartitionValue(ns, { [idKey]: id }))
278
310
  .read()
279
- .then(({ resource }) => Option.fromNullishOr(resource)));
280
- if (!Option.isSome(marker)) {
281
- yield* InfraLogger.logInfo("Creating mock data for " + name);
282
- if (seed) {
283
- const m = yield* seed;
284
- yield* Effect.flatMapOption(Effect.succeed(toNonEmptyArray([...m])), (a) => s.bulkSet(a).pipe(Effect.orDie, Effect
285
- // we delay extra here, so that initial creation between Companies/POs also have an interval between them.
286
- .delay(Duration.millis(1100))));
311
+ .then(({ resource }) => Option.fromNullishOr(resource).pipe(Option.map((_) => ({ ...defaultValues, ...mapReverseId(_) })))))
312
+ .pipe(Effect
313
+ .withSpan("Cosmos.find [effect-app/infra/Store]", {
314
+ attributes: {
315
+ "repository.container_id": containerId,
316
+ "repository.model_name": name,
317
+ partitionValue: nsPartitionValue(ns, { [idKey]: id }),
318
+ namespace: ns,
319
+ id
287
320
  }
288
- // Mark as imported
289
- yield* Effect.promise(() => container.items.create({
290
- _partitionKey: importedMarkerId,
291
- id: importedMarkerId,
292
- ttl: -1
321
+ }, { captureStackTrace: false })))),
322
+ set: (e) => resolveNamespace.pipe(Effect.flatMap((ns) => Option
323
+ .match(Option
324
+ .fromNullishOr(e._etag), {
325
+ onNone: () => Effect.promise(() => container.items.create({
326
+ ...mapId(e),
327
+ _partitionKey: nsPartitionValue(ns, e)
328
+ })),
329
+ onSome: (eTag) => Effect.promise(() => container.item(e[idKey], nsPartitionValue(ns, e)).replace({ ...mapId(e), _partitionKey: nsPartitionValue(ns, e) }, {
330
+ accessCondition: {
331
+ type: "IfMatch",
332
+ condition: eTag
333
+ }
334
+ }))
335
+ })
336
+ .pipe(Effect
337
+ .flatMap((x) => {
338
+ if (x.statusCode === 412 || x.statusCode === 404 || x.statusCode === 409) {
339
+ return Effect.fail(new OptimisticConcurrencyException({ type: name, id: e[idKey], code: x.statusCode }));
340
+ }
341
+ if (x.statusCode > 299 || x.statusCode < 200) {
342
+ return Effect.die(new CosmosDbOperationError("not able to update record: " + x.statusCode));
343
+ }
344
+ return Effect.sync(() => ({
345
+ ...e,
346
+ _etag: x.etag
293
347
  }));
294
- }
295
- return s;
296
- })
297
- };
298
- });
299
- }
348
+ }), Effect
349
+ .withSpan("Cosmos.set [effect-app/infra/Store]", {
350
+ attributes: {
351
+ "repository.container_id": containerId,
352
+ "repository.model_name": name,
353
+ namespace: ns,
354
+ id: e[idKey]
355
+ }
356
+ }, { captureStackTrace: false })))),
357
+ batchSet,
358
+ bulkSet
359
+ };
360
+ // Eagerly seed primary namespace on initialization
361
+ yield* seedNamespace("primary");
362
+ return s;
363
+ })
364
+ };
365
+ });
300
366
  export function CosmosStoreLayer(cfg) {
301
367
  return StoreMaker
302
368
  .toLayer(makeCosmosStore(cfg))
303
369
  .pipe(Layer.provide(CosmosClientLayer(Redacted.value(cfg.url), cfg.dbName)));
304
370
  }
305
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zbW9zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1N0b3JlL0Nvc21vcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBOEIsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3ZILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUM5RSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUcxQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDcEUsT0FBTyxFQUFnRyxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFFdkksTUFBTSxTQUFTLEdBQ2IsQ0FBMkQsS0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMvRyxHQUFHLENBQUM7SUFDSixFQUFFO0NBQ0gsQ0FBQyxDQUFBO0FBQ0osTUFBTSxnQkFBZ0IsR0FDcEIsQ0FBMkQsS0FBWSxFQUFFLEVBQUUsQ0FDM0UsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBK0QsRUFBRSxFQUFFLENBQzVFLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUF5QyxDQUFBO0FB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
371
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zbW9zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1N0b3JlL0Nvc21vcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBOEIsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3ZILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUM5RSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUcxQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDcEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNyQyxPQUFPLEVBQWdHLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUV2SSxNQUFNLFNBQVMsR0FDYixDQUEyRCxLQUFZLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQy9HLEdBQUcsQ0FBQztJQUNKLEVBQUU7Q0FDSCxDQUFDLENBQUE7QUFDSixNQUFNLGdCQUFnQixHQUNwQixDQUEyRCxLQUFZLEVBQUUsRUFBRSxDQUMzRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUErRCxFQUFFLEVBQUUsQ0FDNUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENB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