@effect-app/infra 4.0.0-beta.263 → 4.0.0-beta.264

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 CHANGED
@@ -1,5 +1,12 @@
1
1
  # @effect-app/infra
2
2
 
3
+ ## 4.0.0-beta.264
4
+
5
+ ### Patch Changes
6
+
7
+ - 1587bfc: Batch more Cosmos cluster storage updates.
8
+ - effect-app@4.0.0-beta.264
9
+
3
10
  ## 4.0.0-beta.263
4
11
 
5
12
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"ClusterCosmos.d.ts","sourceRoot":"","sources":["../src/ClusterCosmos.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAG3C,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAA;AAEvE,OAAO,KAAK,cAAc,MAAM,wCAAwC,CAAA;AAExE,OAAO,KAAK,KAAK,KAAK,MAAM,+BAA+B,CAAA;AAC3D,OAAO,KAAK,aAAa,MAAM,uCAAuC,CAAA;AACtE,OAAO,KAAK,OAAO,MAAM,iCAAiC,CAAA;AAC1D,OAAO,KAAK,cAAc,MAAM,wCAAwC,CAAA;AACxE,OAAO,KAAK,SAAS,MAAM,mCAAmC,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAA;AAGpE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AA4UD,eAAO,MAAM,kBAAkB;sBACX,MAAM,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;6CAmXpC,CAAA;AAiCF,eAAO,MAAM,iBAAiB;sBACV,MAAM,GAAG,SAAS;;;;;;;;;;uDA8NpC,CAAA;AAEF,eAAO,MAAM,mBAAmB,aAAc;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC,KAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,EAAE,KAAK,EAAE,YAAY,GAAG,cAAc,CAAC,cAAc,CAG/F,CAAA;AAEH,eAAO,MAAM,kBAAkB,aAAc;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC,KAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE,KAAK,EAAE,YAAY,GAAG,cAAc,CAAC,cAAc,CACzB,CAAA;AAEvE,eAAO,MAAM,YAAY,aAAc;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC,KAAG,KAAK,CAAC,KAAK,CACb,cAAc,CAAC,cAAc,GAAG,aAAa,CAAC,aAAa,EAC3D,KAAK,EACL,YAAY,GAAG,cAAc,CAAC,cAAc,CAC6B,CAAA;AAE3E,eAAO,MAAM,WAAW,WAAY,mBAAmB,KAAG,KAAK,CAAC,KAAK,CACnE,cAAc,CAAC,cAAc,GAAG,aAAa,CAAC,aAAa,EAC3D,KAAK,EACL,cAAc,CAAC,cAAc,CAI5B,CAAA"}
1
+ {"version":3,"file":"ClusterCosmos.d.ts","sourceRoot":"","sources":["../src/ClusterCosmos.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAG3C,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAA;AAEvE,OAAO,KAAK,cAAc,MAAM,wCAAwC,CAAA;AAExE,OAAO,KAAK,KAAK,KAAK,MAAM,+BAA+B,CAAA;AAC3D,OAAO,KAAK,aAAa,MAAM,uCAAuC,CAAA;AACtE,OAAO,KAAK,OAAO,MAAM,iCAAiC,CAAA;AAC1D,OAAO,KAAK,cAAc,MAAM,wCAAwC,CAAA;AACxE,OAAO,KAAK,SAAS,MAAM,mCAAmC,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAA;AAGpE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AA6UD,eAAO,MAAM,kBAAkB;sBACX,MAAM,GAAG,SAAS;;;;;;;;;;;;;;;;;;;;;;6CA+VpC,CAAA;AAuFF,eAAO,MAAM,iBAAiB;sBACV,MAAM,GAAG,SAAS;;;;;;;;;;uDAyPpC,CAAA;AAEF,eAAO,MAAM,mBAAmB,aAAc;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC,KAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,EAAE,KAAK,EAAE,YAAY,GAAG,cAAc,CAAC,cAAc,CAG/F,CAAA;AAEH,eAAO,MAAM,kBAAkB,aAAc;IAC3C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC,KAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE,KAAK,EAAE,YAAY,GAAG,cAAc,CAAC,cAAc,CACzB,CAAA;AAEvE,eAAO,MAAM,YAAY,aAAc;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACrC,KAAG,KAAK,CAAC,KAAK,CACb,cAAc,CAAC,cAAc,GAAG,aAAa,CAAC,aAAa,EAC3D,KAAK,EACL,YAAY,GAAG,cAAc,CAAC,cAAc,CAC6B,CAAA;AAE3E,eAAO,MAAM,WAAW,WAAY,mBAAmB,KAAG,KAAK,CAAC,KAAK,CACnE,cAAc,CAAC,cAAc,GAAG,aAAa,CAAC,aAAa,EAC3D,KAAK,EACL,cAAc,CAAC,cAAc,CAI5B,CAAA"}
@@ -239,47 +239,34 @@ export const makeMessageStorage = Effect.fnUntraced(function* (options) {
239
239
  ? Effect.succeed(Option.none())
240
240
  : queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND c.rowid = @id", [{ name: "@id", value: replyId }])
241
241
  .pipe(Effect.map((docs) => Option.map(Option.fromNullishOr(docs[0]), replyFromDoc)));
242
- const markReplyAcked = (requestId, replyId) => Effect.tryPromise(() => container.item(cosmosId(replyId), replyPartition(requestId)).read()).pipe(Effect.flatMap((resp) => {
243
- const doc = resp.resource;
244
- if (!doc)
245
- return Effect.void;
246
- doc.acked = true;
247
- return Effect
248
- .tryPromise(() => container.item(cosmosId(replyId), replyPartition(requestId)).replace(doc, {
249
- accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
250
- }))
251
- .pipe(Effect.tap(annotateItem), Effect.asVoid);
252
- }), Effect.catchIf(isNotFound, () => Effect.void), Effect.catchIf(isPreconditionFailed, () => Effect.void));
253
- const replaceMessage = (doc) => Effect
254
- .tryPromise(() => container.item(doc.id, doc._partitionKey).replace(doc, {
255
- accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
256
- }))
242
+ const markReplyAcked = (requestId, replyId) => Effect
243
+ .tryPromise(() => container.item(cosmosId(replyId), replyPartition(requestId)).patch([
244
+ { op: "set", path: "/acked", value: true }
245
+ ]))
246
+ .pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void), Effect.catchIf(isPreconditionFailed, () => Effect.void));
247
+ const claimMessageRead = (doc, now) => Effect
248
+ .tryPromise(() => container.item(doc.id, doc._partitionKey).patch([{ op: "set", path: "/lastRead", value: now }], { accessCondition: { type: "IfMatch", condition: doc._etag ?? "" } }))
257
249
  .pipe(Effect.tap(annotateItem), Effect.as(true), Effect.catchIf(isPreconditionFailed, () => Effect.succeed(false)));
258
- const markAckMessagesProcessed = (docs) => Effect.forEach(Arr.groupByT(docs, (doc) => doc._partitionKey), ([partitionKey, partitionDocs]) => Effect.forEach(Arr.chunksOf(partitionDocs, maxCosmosBatchOperations), (chunk) => {
259
- const operations = chunk.map((doc) => ({
260
- operationType: "Patch",
261
- id: doc.id,
262
- resourceBody: [{ op: "set", path: "/processed", value: true }]
263
- }));
250
+ const batchDocs = (docs, operation, fallback) => Effect.forEach(Arr.groupByT(docs, (doc) => doc._partitionKey), ([partitionKey, partitionDocs]) => Effect.forEach(Arr.chunksOf(partitionDocs, maxCosmosBatchOperations), (chunk) => {
251
+ const operations = chunk.map(operation);
264
252
  return Effect
265
253
  .tryPromise(() => container.items.batch(operations, partitionKey))
266
254
  .pipe(Effect.tap(annotateItem), Effect.flatMap((resp) => {
267
255
  const failed = resp.result?.find((result) => !isSuccessfulStatus(result.statusCode));
268
- return failed === undefined
269
- ? Effect.void
270
- : Effect.fail(new Error(`cluster cosmos ack batch failed: ${failed.statusCode}`));
271
- }));
256
+ return failed === undefined ? Effect.void : Effect.fail(failed.statusCode);
257
+ }), Effect.catchIf(() => true, () => Effect.forEach(chunk, fallback, { discard: true })));
272
258
  }, { discard: true }), { discard: true });
273
- const updateMessage = (doc, update) => Effect.suspend(function loop(current = doc) {
274
- if (!update(current))
275
- return Effect.void;
276
- return replaceMessage(current).pipe(Effect.flatMap((replaced) => replaced
277
- ? Effect.void
278
- : readMessage(current.id, current._partitionKey).pipe(Effect.flatMap((found) => Option.match(found, {
279
- onNone: () => Effect.void,
280
- onSome: loop
281
- })))));
282
- });
259
+ const patchDoc = (doc, resourceBody) => Effect.tryPromise(() => container.item(doc.id, doc._partitionKey).patch(resourceBody)).pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void));
260
+ const patchDocs = (docs, resourceBody) => batchDocs(docs, (doc) => ({
261
+ operationType: "Patch",
262
+ id: doc.id,
263
+ resourceBody: resourceBody(doc)
264
+ }), (doc) => patchDoc(doc, resourceBody(doc)));
265
+ const deleteDoc = (doc) => Effect.tryPromise(() => container.item(doc.id, doc._partitionKey).delete()).pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void));
266
+ const deleteDocs = (docs) => batchDocs(docs, (doc) => ({
267
+ operationType: "Delete",
268
+ id: doc.id
269
+ }), deleteDoc);
283
270
  return yield* MessageStorage.makeEncoded({
284
271
  saveEnvelope: ({ deliverAt, envelope, primaryKey }) => Effect
285
272
  .gen(function* () {
@@ -287,7 +274,7 @@ export const makeMessageStorage = Effect.fnUntraced(function* (options) {
287
274
  if (envelope._tag === "AckChunk") {
288
275
  yield* markReplyAcked(envelope.requestId, envelope.replyId);
289
276
  const pendingAcks = yield* queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.kind = 'AckChunk' AND c.processed = false AND c.requestId = @requestId", [{ name: "@requestId", value: envelope.requestId }]);
290
- yield* markAckMessagesProcessed(pendingAcks);
277
+ yield* patchDocs(pendingAcks, () => [{ op: "set", path: "/processed", value: true }]);
291
278
  }
292
279
  return yield* Effect.tryPromise(() => container.items.create(doc)).pipe(Effect.tap(annotateItem), Effect.as(SaveResultEncoded.Success()), Effect.catchIf(isConflict, () => readMessage(doc.id, doc._partitionKey).pipe(Effect.flatMap((found) => Option.match(found, {
293
280
  onNone: () => Effect.succeed(SaveResultEncoded.Success()),
@@ -303,18 +290,15 @@ export const makeMessageStorage = Effect.fnUntraced(function* (options) {
303
290
  const doc = replyToDoc(reply);
304
291
  yield* Effect.tryPromise(() => container.items.create(doc)).pipe(Effect.tap(annotateItem), Effect.catchIf(isConflict, () => Effect.void));
305
292
  const messages = yield* queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.requestId = @requestId", [{ name: "@requestId", value: reply.requestId }]);
306
- yield* Effect.forEach(messages, (message) => {
307
- return updateMessage(message, (doc) => {
308
- if (reply._tag === "WithExit") {
309
- doc.processed = true;
310
- }
311
- else if (doc.id !== reply.requestId && doc.kind !== "Request") {
312
- return false;
313
- }
314
- doc.lastReplyId = reply.id;
315
- return true;
316
- });
317
- }, { discard: true });
293
+ const updatedMessages = reply._tag === "WithExit"
294
+ ? messages
295
+ : messages.filter((message) => message.id === reply.requestId || message.kind === "Request");
296
+ yield* patchDocs(updatedMessages, () => reply._tag === "WithExit"
297
+ ? [
298
+ { op: "set", path: "/processed", value: true },
299
+ { op: "set", path: "/lastReplyId", value: reply.id }
300
+ ]
301
+ : [{ op: "set", path: "/lastReplyId", value: reply.id }]);
318
302
  })
319
303
  .pipe(annotate("saveReply"), refailPersistence, withTracerDisabled),
320
304
  clearReplies: (requestId) => Effect
@@ -323,19 +307,14 @@ export const makeMessageStorage = Effect.fnUntraced(function* (options) {
323
307
  const replies = yield* queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND c.requestId = @requestId AND c.kind = 'WithExit'", [
324
308
  { name: "@requestId", value: id }
325
309
  ]);
326
- yield* Effect.forEach(replies, (reply) => Effect
327
- .tryPromise(() => container.item(reply.id, reply._partitionKey).delete())
328
- .pipe(Effect.tap(annotateItem), Effect.catchIf(isNotFound, () => Effect.void)), { discard: true });
310
+ yield* deleteDocs(replies);
329
311
  const messages = yield* queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.requestId = @requestId", [{ name: "@requestId", value: id }]);
330
- yield* Effect.forEach(messages, (message) => {
331
- if (message.kind === "Interrupt") {
332
- return Effect.tryPromise(() => container.item(message.id, message._partitionKey).delete()).pipe(Effect.tap(annotateItem), Effect.catchIf(isNotFound, () => Effect.void));
333
- }
334
- message.processed = false;
335
- message.lastReplyId = null;
336
- message.lastRead = null;
337
- return replaceMessage(message).pipe(Effect.asVoid);
338
- }, { discard: true });
312
+ yield* deleteDocs(messages.filter((message) => message.kind === "Interrupt"));
313
+ yield* patchDocs(messages.filter((message) => message.kind !== "Interrupt"), () => [
314
+ { op: "set", path: "/processed", value: false },
315
+ { op: "set", path: "/lastReplyId", value: null },
316
+ { op: "set", path: "/lastRead", value: null }
317
+ ]);
339
318
  })
340
319
  .pipe(annotate("clearReplies"), refailPersistence, withTracerDisabled),
341
320
  requestIdForPrimaryKey: (primaryKey) => queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.messageId = @primaryKey", [
@@ -351,60 +330,76 @@ export const makeMessageStorage = Effect.fnUntraced(function* (options) {
351
330
  { name: "@lastReadBefore", value: now - tenMinutes },
352
331
  { name: "@now", value: now }
353
332
  ])
354
- .pipe(Effect.flatMap((docs) => collectUnprocessed(docs, now, lastReply, replaceMessage, queryReplies)), annotate("unprocessedMessages"), refailPersistence, withTracerDisabled),
333
+ .pipe(Effect.flatMap((docs) => collectUnprocessed(docs, now, claimMessageRead, queryReplies)), annotate("unprocessedMessages"), refailPersistence, withTracerDisabled),
355
334
  unprocessedMessagesById: (messageIds, now) => queryMessages("SELECT * FROM c WHERE c.type = 'message' AND (ARRAY_CONTAINS(@messageIds, c.id) OR ARRAY_CONTAINS(@messageIds, c.requestId)) AND c.processed = false AND (NOT IS_DEFINED(c.deliverAt) OR IS_NULL(c.deliverAt) OR c.deliverAt <= @now) ORDER BY c.rowid", [
356
335
  { name: "@messageIds", value: Array.from(messageIds, String) },
357
336
  { name: "@now", value: now }
358
337
  ])
359
- .pipe(Effect.flatMap((docs) => collectUnprocessed(docs, now, lastReply, replaceMessage, queryReplies)), annotate("unprocessedMessagesById"), refailPersistence, withTracerDisabled),
338
+ .pipe(Effect.flatMap((docs) => collectUnprocessedById(docs, queryReplies)), annotate("unprocessedMessagesById"), refailPersistence, withTracerDisabled),
360
339
  resetAddress: (address) => queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.processed = false AND c.shardId = @shardId AND c.entityType = @entityType AND c.entityId = @entityId", [
361
340
  { name: "@shardId", value: ShardId.toString(address.shardId) },
362
341
  { name: "@entityType", value: address.entityType },
363
342
  { name: "@entityId", value: address.entityId }
364
343
  ])
365
- .pipe(Effect.flatMap((docs) => Effect.forEach(docs, (doc) => {
366
- doc.lastRead = null;
367
- return replaceMessage(doc).pipe(Effect.asVoid);
368
- }, { discard: true })), annotate("resetAddress"), refailPersistence, withTracerDisabled),
344
+ .pipe(Effect.flatMap((docs) => patchDocs(docs, () => [{ op: "set", path: "/lastRead", value: null }])), annotate("resetAddress"), refailPersistence, withTracerDisabled),
369
345
  clearAddress: (address) => queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.entityType = @entityType AND c.entityId = @entityId", [
370
346
  { name: "@entityType", value: address.entityType },
371
347
  { name: "@entityId", value: address.entityId }
372
348
  ])
373
- .pipe(Effect.flatMap((messages) => Effect.forEach(messages, (message) => queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND c.requestId = @requestId", [
374
- {
375
- name: "@requestId",
376
- value: message
377
- .requestId
378
- }
379
- ])
380
- .pipe(Effect
381
- .flatMap((replies) => Effect
382
- .forEach(replies, (reply) => Effect
383
- .tryPromise(() => container.item(reply.id, reply._partitionKey).delete())
384
- .pipe(Effect.tap(annotateItem), Effect.catchIf(isNotFound, () => Effect.void)), { discard: true })), Effect.andThen(Effect.tryPromise(() => container.item(message.id, message._partitionKey).delete()).pipe(Effect.tap(annotateItem), Effect.catchIf(isNotFound, () => Effect.void)))), { discard: true })), annotate("clearAddress"), refailPersistence, withTracerDisabled),
349
+ .pipe(Effect.flatMap((messages) => {
350
+ if (!Arr.isArrayNonEmpty(messages))
351
+ return Effect.void;
352
+ const requestIds = Array.from(new Set(messages.map((message) => message.requestId)));
353
+ return queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND ARRAY_CONTAINS(@requestIds, c.requestId)", [{ name: "@requestIds", value: requestIds }])
354
+ .pipe(Effect.flatMap((replies) => deleteDocs(replies)), Effect.andThen(deleteDocs(messages)));
355
+ }), annotate("clearAddress"), refailPersistence, withTracerDisabled),
385
356
  resetShards: (shardIds) => queryMessages("SELECT * FROM c WHERE c.type = 'message' AND c.processed = false AND ARRAY_CONTAINS(@shardIds, c.shardId)", [{ name: "@shardIds", value: Array.from(shardIds) }])
386
- .pipe(Effect.flatMap((docs) => Effect.forEach(docs, (doc) => {
387
- doc.lastRead = null;
388
- return replaceMessage(doc).pipe(Effect.asVoid);
389
- }, { discard: true })), annotate("resetShards"), refailPersistence, withTracerDisabled),
357
+ .pipe(Effect.flatMap((docs) => patchDocs(docs, () => [{ op: "set", path: "/lastRead", value: null }])), annotate("resetShards"), refailPersistence, withTracerDisabled),
390
358
  withTransaction: (effect) => effect
391
359
  });
392
360
  });
393
- const collectUnprocessed = (docs, now, lastReply, replaceMessage, queryReplies) => Effect.gen(function* () {
361
+ const collectUnprocessed = (docs, now, claimMessageRead, queryReplies) => Effect.gen(function* () {
394
362
  const messages = [];
363
+ const activeRequestIds = yield* activeReplyRequestIds(docs, queryReplies);
364
+ const lastReplies = yield* lastRepliesById(docs, activeRequestIds, queryReplies);
395
365
  for (const doc of docs) {
396
- const replies = yield* queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND c.requestId = @requestId AND (c.kind = 'WithExit' OR (c.kind = 'Chunk' AND c.acked = false))", [{ name: "@requestId", value: doc.requestId }]);
397
- if (Arr.isArrayNonEmpty(replies))
366
+ if (activeRequestIds.has(doc.requestId))
398
367
  continue;
399
- const sentReply = yield* lastReply(doc.lastReplyId);
400
- doc.lastRead = now;
401
- const replaced = yield* replaceMessage(doc);
402
- if (replaced) {
403
- messages.push(envelopeFromDoc(doc, sentReply));
368
+ const sentReply = Option.fromNullishOr(doc.lastReplyId === null ? undefined : lastReplies.get(doc.lastReplyId));
369
+ const claimed = yield* claimMessageRead(doc, now);
370
+ if (claimed) {
371
+ messages.push(envelopeFromDoc({ ...doc, lastRead: now }, sentReply));
404
372
  }
405
373
  }
406
374
  return messages;
407
375
  });
376
+ const collectUnprocessedById = (docs, queryReplies) => Effect.gen(function* () {
377
+ const messages = [];
378
+ const activeRequestIds = yield* activeReplyRequestIds(docs, queryReplies);
379
+ const lastReplies = yield* lastRepliesById(docs, activeRequestIds, queryReplies);
380
+ for (const doc of docs) {
381
+ if (activeRequestIds.has(doc.requestId))
382
+ continue;
383
+ const sentReply = Option.fromNullishOr(doc.lastReplyId === null ? undefined : lastReplies.get(doc.lastReplyId));
384
+ messages.push(envelopeFromDoc(doc, sentReply));
385
+ }
386
+ return messages;
387
+ });
388
+ const activeReplyRequestIds = (docs, queryReplies) => {
389
+ const requestIds = Array.from(new Set(docs.map((doc) => doc.requestId)));
390
+ if (!Arr.isArrayNonEmpty(requestIds))
391
+ return Effect.succeed(new Set());
392
+ return queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND ARRAY_CONTAINS(@requestIds, c.requestId) AND (c.kind = 'WithExit' OR (c.kind = 'Chunk' AND c.acked = false))", [{ name: "@requestIds", value: requestIds }])
393
+ .pipe(Effect.map((replies) => new Set(replies.map((reply) => reply.requestId))));
394
+ };
395
+ const lastRepliesById = (docs, activeRequestIds, queryReplies) => {
396
+ const replyIds = Array.from(new Set(docs
397
+ .flatMap((doc) => activeRequestIds.has(doc.requestId) || doc.lastReplyId === null ? [] : [doc.lastReplyId])));
398
+ if (!Arr.isArrayNonEmpty(replyIds))
399
+ return Effect.succeed(new Map());
400
+ return queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND ARRAY_CONTAINS(@replyIds, c.rowid)", [{ name: "@replyIds", value: replyIds }])
401
+ .pipe(Effect.map((replies) => new Map(replies.map((reply) => [reply.rowid, replyFromDoc(reply)]))));
402
+ };
408
403
  export const makeRunnerStorage = Effect.fnUntraced(function* (options) {
409
404
  const prefix = options?.prefix ?? "cluster-";
410
405
  const container = yield* createContainer(prefix)().pipe(Effect.orDie);
@@ -418,12 +413,22 @@ export const makeRunnerStorage = Effect.fnUntraced(function* (options) {
418
413
  .query({ query, parameters: Array.from(parameters) }, { partitionKey: "runner" })
419
414
  .fetchAll())
420
415
  .pipe(Effect.tap(annotateFeed), Effect.map((resp) => resp.resources));
416
+ const deleteRunner = (doc) => Effect
417
+ .tryPromise(() => container.item(doc.id, "runner").delete({
418
+ accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
419
+ }))
420
+ .pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void), Effect.catchIf(isPreconditionFailed, () => Effect.void));
421
421
  const readLock = (shardId) => Effect.tryPromise(() => container.item(lockDocId(shardId), "lock").read()).pipe(Effect.tap(annotateItem), Effect.map((resp) => Option.fromNullishOr(resp.resource)), Effect.catchIf(isNotFound, () => Effect.succeed(Option.none())));
422
422
  const writeLock = (doc) => Effect
423
423
  .tryPromise(() => container.item(doc.id, "lock").replace(doc, {
424
424
  accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
425
425
  }))
426
426
  .pipe(Effect.tap(annotateItem), Effect.as(true), Effect.catchIf(isPreconditionFailed, () => Effect.succeed(false)));
427
+ const deleteLock = (doc) => Effect
428
+ .tryPromise(() => container.item(doc.id, "lock").delete({
429
+ accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
430
+ }))
431
+ .pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void), Effect.catchIf(isPreconditionFailed, () => Effect.void));
427
432
  const createLock = (address, shardId, now) => Effect
428
433
  .tryPromise(() => container.items.create({
429
434
  id: lockDocId(shardId),
@@ -460,25 +465,24 @@ export const makeRunnerStorage = Effect.fnUntraced(function* (options) {
460
465
  lastHeartbeat: now
461
466
  }))
462
467
  .pipe(Effect.tap(annotateItem))), Effect.as(makeMachineId(address)), annotate("register"), refailPersistence, withTracerDisabled),
463
- unregister: (address) => Effect.tryPromise(() => container.item(runnerDocId(address), "runner").delete()).pipe(Effect.tap(annotateItem), Effect.catchIf(isNotFound, () => Effect.void), annotate("unregister"), refailPersistence, withTracerDisabled),
464
- setRunnerHealth: (address, healthy) => Effect.tryPromise(() => container.item(runnerDocId(address), "runner").read()).pipe(Effect.flatMap((resp) => {
465
- const doc = resp.resource;
466
- if (!doc)
467
- return Effect.void;
468
- doc.healthy = healthy;
469
- return Effect.tryPromise(() => container.item(doc.id, "runner").replace(doc)).pipe(Effect.tap(annotateItem));
470
- }), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void), annotate("setRunnerHealth"), refailPersistence, withTracerDisabled),
468
+ unregister: (address) => Effect.sync(() => Date.now()).pipe(Effect.flatMap((now) => queryRunners("SELECT * FROM c WHERE c.type = 'runner' AND (c.address = @address OR c.lastHeartbeat < @expiresAt)", [
469
+ { name: "@address", value: address },
470
+ { name: "@expiresAt", value: now - expires }
471
+ ])), Effect.flatMap((docs) => Effect.forEach(docs, deleteRunner, { discard: true })), annotate("unregister"), refailPersistence, withTracerDisabled),
472
+ setRunnerHealth: (address, healthy) => Effect
473
+ .tryPromise(() => container.item(runnerDocId(address), "runner").patch([
474
+ { op: "set", path: "/healthy", value: healthy }
475
+ ]))
476
+ .pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void), annotate("setRunnerHealth"), refailPersistence, withTracerDisabled),
471
477
  acquire: (address, shardIds) => Effect.sync(() => Date.now()).pipe(Effect.flatMap((now) => Effect.forEach(shardIds, (shardId) => tryAcquire(address, shardId, now))), Effect.map(Arr.getSomes), annotate("acquire"), refailPersistence, withTracerDisabled),
472
478
  refresh: (address, shardIds) => Effect
473
479
  .gen(function* () {
474
480
  const now = Date.now();
475
- yield* Effect.tryPromise(() => container.item(runnerDocId(address), "runner").read()).pipe(Effect.flatMap((resp) => {
476
- const doc = resp.resource;
477
- if (!doc)
478
- return Effect.void;
479
- doc.lastHeartbeat = now;
480
- return Effect.tryPromise(() => container.item(doc.id, "runner").replace(doc)).pipe(Effect.tap(annotateItem));
481
- }), Effect.catchIf(isNotFound, () => Effect.void));
481
+ yield* Effect
482
+ .tryPromise(() => container.item(runnerDocId(address), "runner").patch([
483
+ { op: "set", path: "/lastHeartbeat", value: now }
484
+ ]))
485
+ .pipe(Effect.tap(annotateItem), Effect.asVoid, Effect.catchIf(isNotFound, () => Effect.void));
482
486
  const refreshed = yield* Effect.forEach(shardIds, (shardId) => readLock(shardId).pipe(Effect.flatMap((lock) => Option.match(lock, {
483
487
  onNone: () => Effect.succeed(Option.none()),
484
488
  onSome: (doc) => {
@@ -494,7 +498,7 @@ export const makeRunnerStorage = Effect.fnUntraced(function* (options) {
494
498
  release: (address, shardId) => readLock(shardId).pipe(Effect.flatMap((lock) => Option.match(lock, {
495
499
  onNone: () => Effect.void,
496
500
  onSome: (doc) => doc.address === address
497
- ? Effect.tryPromise(() => container.item(doc.id, "lock").delete()).pipe(Effect.tap(annotateItem), Effect.catchIf(isNotFound, () => Effect.void), Effect.asVoid)
501
+ ? deleteLock(doc)
498
502
  : Effect.void
499
503
  })), annotate("release"), refailPersistence, withTracerDisabled),
500
504
  releaseAll: (address) => Effect
@@ -505,11 +509,11 @@ export const makeRunnerStorage = Effect.fnUntraced(function* (options) {
505
509
  parameters: [{ name: "@address", value: address }]
506
510
  }, { partitionKey: "lock" })
507
511
  .fetchAll())
508
- .pipe(Effect.tap(annotateFeed), Effect.flatMap((resp) => Effect.forEach(resp.resources, (doc) => Effect.tryPromise(() => container.item(doc.id, "lock").delete()).pipe(Effect.tap(annotateItem), Effect.catchIf(isNotFound, () => Effect.void)), { discard: true })), annotate("releaseAll"), refailPersistence, withTracerDisabled)
512
+ .pipe(Effect.tap(annotateFeed), Effect.flatMap((resp) => Effect.forEach(resp.resources, deleteLock, { discard: true })), annotate("releaseAll"), refailPersistence, withTracerDisabled)
509
513
  });
510
514
  });
511
515
  export const layerMessageStorage = (options) => Layer.effect(MessageStorage.MessageStorage, makeMessageStorage(options)).pipe(Layer.provide(Snowflake.layerGenerator));
512
516
  export const layerRunnerStorage = (options) => Layer.effect(RunnerStorage.RunnerStorage, makeRunnerStorage(options));
513
517
  export const layerStorage = (options) => Layer.merge(layerMessageStorage(options), layerRunnerStorage(options));
514
518
  export const layerCosmos = (config) => layerStorage({ prefix: config.prefix }).pipe(Layer.provide(CosmosClientLayer(Redacted.value(config.url), config.dbName)));
515
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2x1c3RlckNvc21vcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9DbHVzdGVyQ29zbW9zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxHQUFHLE1BQU0sa0JBQWtCLENBQUE7QUFDdkMsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssS0FBSyxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxLQUFLLEtBQUssTUFBTSxjQUFjLENBQUE7QUFDckMsT0FBTyxLQUFLLFFBQVEsTUFBTSxpQkFBaUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssUUFBUSxNQUFNLGlCQUFpQixDQUFBO0FBQzNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBRXZFLE9BQU8sS0FBSyxjQUFjLE1BQU0sd0NBQXdDLENBQUE7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0NBQXdDLENBQUE7QUFFMUUsT0FBTyxLQUFLLGFBQWEsTUFBTSx1Q0FBdUMsQ0FBQTtBQUN0RSxPQUFPLEtBQUssT0FBTyxNQUFNLGlDQUFpQyxDQUFBO0FBQzFELE9BQU8sS0FBSyxjQUFjLE1BQU0sd0NBQXdDLENBQUE7QUFDeEUsT0FBTyxLQUFLLFNBQVMsTUFBTSxtQ0FBbUMsQ0FBQTtBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDcEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQWdGOUQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDMUQsTUFBTSxpQkFBaUIsR0FBRyxDQUFVLE1BQThCLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxN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
519
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2x1c3RlckNvc21vcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9DbHVzdGVyQ29zbW9zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxHQUFHLE1BQU0sa0JBQWtCLENBQUE7QUFDdkMsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssS0FBSyxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxLQUFLLEtBQUssTUFBTSxjQUFjLENBQUE7QUFDckMsT0FBTyxLQUFLLFFBQVEsTUFBTSxpQkFBaUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssUUFBUSxNQUFNLGlCQUFpQixDQUFBO0FBQzNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBRXZFLE9BQU8sS0FBSyxjQUFjLE1BQU0sd0NBQXdDLENBQUE7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0NBQXdDLENBQUE7QUFFMUUsT0FBTyxLQUFLLGFBQWEsTUFBTSx1Q0FBdUMsQ0FBQTtBQUN0RSxPQUFPLEtBQUssT0FBTyxNQUFNLGlDQUFpQyxDQUFBO0FBQzFELE9BQU8sS0FBSyxjQUFjLE1BQU0sd0NBQXdDLENBQUE7QUFDeEUsT0FBTyxLQUFLLFNBQVMsTUFBTSxtQ0FBbUMsQ0FBQTtBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDcEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFVBQVUsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQWlGOUQsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDMUQsTUFBTSxpQkFBaUIsR0FBRyxDQUFVLE1BQThCLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxN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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.263",
3
+ "version": "4.0.0-beta.264",
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": "8.4.0",
15
15
  "query-string": "^9.4.0",
16
- "effect-app": "4.0.0-beta.263"
16
+ "effect-app": "4.0.0-beta.264"
17
17
  },
18
18
  "devDependencies": {
19
19
  "@azure/cosmos": "^4.9.3",
package/run.sh CHANGED
@@ -1 +1,7 @@
1
- COSMOS_TEST_URL="AccountEndpoint=https://macs-empasa-dev.documents.azure.com:443/;AccountKey=bu1BPiecISwsSG7cNGrF0RWAX8QhAOPZKIvK9WVNQXelsdt3FJ6jo6YPqnKChvMLvtwO1USsiTKBACDb6Zp1bA==;" pnpm test test/cluster-cosmos.test.ts
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ cd "$(dirname "$0")/../.."
5
+
6
+ COSMOS_TEST_URL="AccountEndpoint=https://macs-empasa-dev.documents.azure.com:443/;AccountKey=bu1BPiecISwsSG7cNGrF0RWAX8QhAOPZKIvK9WVNQXelsdt3FJ6jo6YPqnKChvMLvtwO1USsiTKBACDb6Zp1bA==;" \
7
+ pnpm --filter @effect-app/infra test:run test/cluster-cosmos.test.ts
@@ -1,4 +1,4 @@
1
- import type { OperationInput } from "@azure/cosmos"
1
+ import type { OperationInput, PatchRequestBody } from "@azure/cosmos"
2
2
  import * as Arr from "effect-app/Array"
3
3
  import * as Effect from "effect-app/Effect"
4
4
  import * as Layer from "effect-app/Layer"
@@ -84,6 +84,7 @@ interface RunnerDoc {
84
84
  runner: string
85
85
  healthy: boolean
86
86
  lastHeartbeat: number
87
+ readonly _etag?: string
87
88
  }
88
89
 
89
90
  interface LockDoc {
@@ -395,29 +396,26 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
395
396
  )
396
397
 
397
398
  const markReplyAcked = (requestId: string, replyId: string) =>
398
- Effect.tryPromise(() => container.item(cosmosId(replyId), replyPartition(requestId)).read<ReplyDoc>()).pipe(
399
- Effect.flatMap((resp) => {
400
- const doc = resp.resource
401
- if (!doc) return Effect.void
402
- doc.acked = true
403
- return Effect
404
- .tryPromise(() =>
405
- container.item(cosmosId(replyId), replyPartition(requestId)).replace(doc, {
406
- accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
407
- })
408
- )
409
- .pipe(Effect.tap(annotateItem), Effect.asVoid)
410
- }),
411
- Effect.catchIf(isNotFound, () => Effect.void),
412
- Effect.catchIf(isPreconditionFailed, () => Effect.void)
413
- )
399
+ Effect
400
+ .tryPromise(() =>
401
+ container.item(cosmosId(replyId), replyPartition(requestId)).patch<ReplyDoc>([
402
+ { op: "set", path: "/acked", value: true }
403
+ ])
404
+ )
405
+ .pipe(
406
+ Effect.tap(annotateItem),
407
+ Effect.asVoid,
408
+ Effect.catchIf(isNotFound, () => Effect.void),
409
+ Effect.catchIf(isPreconditionFailed, () => Effect.void)
410
+ )
414
411
 
415
- const replaceMessage = (doc: MessageDoc) =>
412
+ const claimMessageRead = (doc: MessageDoc, now: number) =>
416
413
  Effect
417
414
  .tryPromise(() =>
418
- container.item(doc.id, doc._partitionKey).replace(doc, {
419
- accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
420
- })
415
+ container.item(doc.id, doc._partitionKey).patch<MessageDoc>(
416
+ [{ op: "set", path: "/lastRead", value: now }],
417
+ { accessCondition: { type: "IfMatch", condition: doc._etag ?? "" } }
418
+ )
421
419
  )
422
420
  .pipe(
423
421
  Effect.tap(annotateItem),
@@ -425,28 +423,27 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
425
423
  Effect.catchIf(isPreconditionFailed, () => Effect.succeed(false))
426
424
  )
427
425
 
428
- const markAckMessagesProcessed = (docs: ReadonlyArray<MessageDoc>) =>
426
+ const batchDocs = <A extends { readonly id: string; readonly _partitionKey: string }>(
427
+ docs: ReadonlyArray<A>,
428
+ operation: (doc: A) => OperationInput,
429
+ fallback: (doc: A) => Effect.Effect<void, unknown, never>
430
+ ): Effect.Effect<void, unknown, never> =>
429
431
  Effect.forEach(
430
432
  Arr.groupByT(docs, (doc) => doc._partitionKey),
431
433
  ([partitionKey, partitionDocs]) =>
432
434
  Effect.forEach(
433
435
  Arr.chunksOf(partitionDocs, maxCosmosBatchOperations),
434
436
  (chunk) => {
435
- const operations: Array<OperationInput> = chunk.map((doc) => ({
436
- operationType: "Patch" as const,
437
- id: doc.id,
438
- resourceBody: [{ op: "set" as const, path: "/processed", value: true }]
439
- }))
437
+ const operations: Array<OperationInput> = chunk.map(operation)
440
438
  return Effect
441
439
  .tryPromise(() => container.items.batch(operations, partitionKey))
442
440
  .pipe(
443
441
  Effect.tap(annotateItem),
444
442
  Effect.flatMap((resp) => {
445
443
  const failed = resp.result?.find((result) => !isSuccessfulStatus(result.statusCode))
446
- return failed === undefined
447
- ? Effect.void
448
- : Effect.fail(new Error(`cluster cosmos ack batch failed: ${failed.statusCode}`))
449
- })
444
+ return failed === undefined ? Effect.void : Effect.fail(failed.statusCode)
445
+ }),
446
+ Effect.catchIf(() => true, () => Effect.forEach(chunk, fallback, { discard: true }))
450
447
  )
451
448
  },
452
449
  { discard: true }
@@ -454,27 +451,50 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
454
451
  { discard: true }
455
452
  )
456
453
 
457
- const updateMessage = (
458
- doc: MessageDoc,
459
- update: (doc: MessageDoc) => boolean
460
- ): Effect.Effect<void, unknown> =>
461
- Effect.suspend(function loop(current = doc): Effect.Effect<void, unknown> {
462
- if (!update(current)) return Effect.void
463
- return replaceMessage(current).pipe(
464
- Effect.flatMap((replaced) =>
465
- replaced
466
- ? Effect.void
467
- : readMessage(current.id, current._partitionKey).pipe(
468
- Effect.flatMap((found) =>
469
- Option.match(found, {
470
- onNone: () => Effect.void,
471
- onSome: loop
472
- })
473
- )
474
- )
475
- )
476
- )
477
- })
454
+ const patchDoc = <A extends { readonly id: string; readonly _partitionKey: string }>(
455
+ doc: A,
456
+ resourceBody: PatchRequestBody
457
+ ): Effect.Effect<void, unknown, never> =>
458
+ Effect.tryPromise(() => container.item(doc.id, doc._partitionKey).patch(resourceBody)).pipe(
459
+ Effect.tap(annotateItem),
460
+ Effect.asVoid,
461
+ Effect.catchIf(isNotFound, () => Effect.void)
462
+ )
463
+
464
+ const patchDocs = <A extends { readonly id: string; readonly _partitionKey: string }>(
465
+ docs: ReadonlyArray<A>,
466
+ resourceBody: (doc: A) => PatchRequestBody
467
+ ): Effect.Effect<void, unknown, never> =>
468
+ batchDocs(
469
+ docs,
470
+ (doc) => ({
471
+ operationType: "Patch" as const,
472
+ id: doc.id,
473
+ resourceBody: resourceBody(doc)
474
+ }),
475
+ (doc) => patchDoc(doc, resourceBody(doc))
476
+ )
477
+
478
+ const deleteDoc = <A extends { readonly id: string; readonly _partitionKey: string }>(
479
+ doc: A
480
+ ): Effect.Effect<void, unknown, never> =>
481
+ Effect.tryPromise(() => container.item(doc.id, doc._partitionKey).delete()).pipe(
482
+ Effect.tap(annotateItem),
483
+ Effect.asVoid,
484
+ Effect.catchIf(isNotFound, () => Effect.void)
485
+ )
486
+
487
+ const deleteDocs = <A extends { readonly id: string; readonly _partitionKey: string }>(
488
+ docs: ReadonlyArray<A>
489
+ ): Effect.Effect<void, unknown, never> =>
490
+ batchDocs(
491
+ docs,
492
+ (doc) => ({
493
+ operationType: "Delete" as const,
494
+ id: doc.id
495
+ }),
496
+ deleteDoc
497
+ )
478
498
 
479
499
  return yield* MessageStorage.makeEncoded({
480
500
  saveEnvelope: ({ deliverAt, envelope, primaryKey }) =>
@@ -487,7 +507,7 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
487
507
  "SELECT * FROM c WHERE c.type = 'message' AND c.kind = 'AckChunk' AND c.processed = false AND c.requestId = @requestId",
488
508
  [{ name: "@requestId", value: envelope.requestId }]
489
509
  )
490
- yield* markAckMessagesProcessed(pendingAcks)
510
+ yield* patchDocs(pendingAcks, () => [{ op: "set", path: "/processed", value: true }])
491
511
  }
492
512
  return yield* Effect.tryPromise(() => container.items.create(doc)).pipe(
493
513
  Effect.tap(annotateItem),
@@ -525,17 +545,16 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
525
545
  "SELECT * FROM c WHERE c.type = 'message' AND c.requestId = @requestId",
526
546
  [{ name: "@requestId", value: reply.requestId }]
527
547
  )
528
- yield* Effect.forEach(messages, (message) => {
529
- return updateMessage(message, (doc) => {
530
- if (reply._tag === "WithExit") {
531
- doc.processed = true
532
- } else if (doc.id !== reply.requestId && doc.kind !== "Request") {
533
- return false
534
- }
535
- doc.lastReplyId = reply.id
536
- return true
537
- })
538
- }, { discard: true })
548
+ const updatedMessages = reply._tag === "WithExit"
549
+ ? messages
550
+ : messages.filter((message) => message.id === reply.requestId || message.kind === "Request")
551
+ yield* patchDocs(updatedMessages, () =>
552
+ reply._tag === "WithExit"
553
+ ? [
554
+ { op: "set", path: "/processed", value: true },
555
+ { op: "set", path: "/lastReplyId", value: reply.id }
556
+ ]
557
+ : [{ op: "set", path: "/lastReplyId", value: reply.id }])
539
558
  })
540
559
  .pipe(annotate("saveReply"), refailPersistence, withTracerDisabled),
541
560
 
@@ -549,29 +568,20 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
549
568
  { name: "@requestId", value: id }
550
569
  ]
551
570
  )
552
- yield* Effect.forEach(replies, (reply) =>
553
- Effect
554
- .tryPromise(() => container.item(reply.id, reply._partitionKey).delete())
555
- .pipe(
556
- Effect.tap(annotateItem),
557
- Effect.catchIf(isNotFound, () => Effect.void)
558
- ), { discard: true })
571
+ yield* deleteDocs(replies)
559
572
  const messages = yield* queryMessages(
560
573
  "SELECT * FROM c WHERE c.type = 'message' AND c.requestId = @requestId",
561
574
  [{ name: "@requestId", value: id }]
562
575
  )
563
- yield* Effect.forEach(messages, (message) => {
564
- if (message.kind === "Interrupt") {
565
- return Effect.tryPromise(() => container.item(message.id, message._partitionKey).delete()).pipe(
566
- Effect.tap(annotateItem),
567
- Effect.catchIf(isNotFound, () => Effect.void)
568
- )
569
- }
570
- message.processed = false
571
- message.lastReplyId = null
572
- message.lastRead = null
573
- return replaceMessage(message).pipe(Effect.asVoid)
574
- }, { discard: true })
576
+ yield* deleteDocs(messages.filter((message) => message.kind === "Interrupt"))
577
+ yield* patchDocs(
578
+ messages.filter((message) => message.kind !== "Interrupt"),
579
+ () => [
580
+ { op: "set", path: "/processed", value: false },
581
+ { op: "set", path: "/lastReplyId", value: null },
582
+ { op: "set", path: "/lastRead", value: null }
583
+ ]
584
+ )
575
585
  })
576
586
  .pipe(annotate("clearReplies"), refailPersistence, withTracerDisabled),
577
587
 
@@ -620,7 +630,7 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
620
630
  ]
621
631
  )
622
632
  .pipe(
623
- Effect.flatMap((docs) => collectUnprocessed(docs, now, lastReply, replaceMessage, queryReplies)),
633
+ Effect.flatMap((docs) => collectUnprocessed(docs, now, claimMessageRead, queryReplies)),
624
634
  annotate("unprocessedMessages"),
625
635
  refailPersistence,
626
636
  withTracerDisabled
@@ -635,7 +645,7 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
635
645
  ]
636
646
  )
637
647
  .pipe(
638
- Effect.flatMap((docs) => collectUnprocessed(docs, now, lastReply, replaceMessage, queryReplies)),
648
+ Effect.flatMap((docs) => collectUnprocessedById(docs, queryReplies)),
639
649
  annotate("unprocessedMessagesById"),
640
650
  refailPersistence,
641
651
  withTracerDisabled
@@ -651,12 +661,7 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
651
661
  ]
652
662
  )
653
663
  .pipe(
654
- Effect.flatMap((docs) =>
655
- Effect.forEach(docs, (doc) => {
656
- doc.lastRead = null
657
- return replaceMessage(doc).pipe(Effect.asVoid)
658
- }, { discard: true })
659
- ),
664
+ Effect.flatMap((docs) => patchDocs(docs, () => [{ op: "set", path: "/lastRead", value: null }])),
660
665
  annotate("resetAddress"),
661
666
  refailPersistence,
662
667
  withTracerDisabled
@@ -671,37 +676,18 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
671
676
  ]
672
677
  )
673
678
  .pipe(
674
- Effect.flatMap((messages) =>
675
- Effect.forEach(messages, (message) =>
676
- queryReplies("SELECT * FROM c WHERE c.type = 'reply' AND c.requestId = @requestId", [
677
- {
678
- name: "@requestId",
679
- value: message
680
- .requestId
681
- }
682
- ])
683
- .pipe(
684
- Effect
685
- .flatMap((replies) =>
686
- Effect
687
- .forEach(replies, (reply) =>
688
- Effect
689
- .tryPromise(() =>
690
- container.item(reply.id, reply._partitionKey).delete()
691
- )
692
- .pipe(
693
- Effect.tap(annotateItem),
694
- Effect.catchIf(isNotFound, () => Effect.void)
695
- ), { discard: true })
696
- ),
697
- Effect.andThen(
698
- Effect.tryPromise(() => container.item(message.id, message._partitionKey).delete()).pipe(
699
- Effect.tap(annotateItem),
700
- Effect.catchIf(isNotFound, () => Effect.void)
701
- )
702
- )
703
- ), { discard: true })
704
- ),
679
+ Effect.flatMap((messages) => {
680
+ if (!Arr.isArrayNonEmpty(messages)) return Effect.void
681
+ const requestIds = Array.from(new Set(messages.map((message) => message.requestId)))
682
+ return queryReplies(
683
+ "SELECT * FROM c WHERE c.type = 'reply' AND ARRAY_CONTAINS(@requestIds, c.requestId)",
684
+ [{ name: "@requestIds", value: requestIds }]
685
+ )
686
+ .pipe(
687
+ Effect.flatMap((replies) => deleteDocs(replies)),
688
+ Effect.andThen(deleteDocs(messages))
689
+ )
690
+ }),
705
691
  annotate("clearAddress"),
706
692
  refailPersistence,
707
693
  withTracerDisabled
@@ -713,12 +699,7 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
713
699
  [{ name: "@shardIds", value: Array.from(shardIds) }]
714
700
  )
715
701
  .pipe(
716
- Effect.flatMap((docs) =>
717
- Effect.forEach(docs, (doc) => {
718
- doc.lastRead = null
719
- return replaceMessage(doc).pipe(Effect.asVoid)
720
- }, { discard: true })
721
- ),
702
+ Effect.flatMap((docs) => patchDocs(docs, () => [{ op: "set", path: "/lastRead", value: null }])),
722
703
  annotate("resetShards"),
723
704
  refailPersistence,
724
705
  withTracerDisabled
@@ -731,8 +712,7 @@ export const makeMessageStorage = Effect.fnUntraced(function*(options?: {
731
712
  const collectUnprocessed = <E>(
732
713
  docs: ReadonlyArray<MessageDoc>,
733
714
  now: number,
734
- lastReply: (replyId: string | null) => Effect.Effect<Option.Option<Reply.Encoded>, E>,
735
- replaceMessage: (doc: MessageDoc) => Effect.Effect<boolean, E>,
715
+ claimMessageRead: (doc: MessageDoc, now: number) => Effect.Effect<boolean, E>,
736
716
  queryReplies: (
737
717
  query: string,
738
718
  parameters: ReadonlyArray<CosmosParameter>
@@ -743,22 +723,77 @@ const collectUnprocessed = <E>(
743
723
  readonly envelope: Envelope.Encoded
744
724
  readonly lastSentReply: Option.Option<Reply.Encoded>
745
725
  }> = []
726
+ const activeRequestIds = yield* activeReplyRequestIds(docs, queryReplies)
727
+ const lastReplies = yield* lastRepliesById(docs, activeRequestIds, queryReplies)
746
728
  for (const doc of docs) {
747
- const replies = yield* queryReplies(
748
- "SELECT * FROM c WHERE c.type = 'reply' AND c.requestId = @requestId AND (c.kind = 'WithExit' OR (c.kind = 'Chunk' AND c.acked = false))",
749
- [{ name: "@requestId", value: doc.requestId }]
750
- )
751
- if (Arr.isArrayNonEmpty(replies)) continue
752
- const sentReply = yield* lastReply(doc.lastReplyId)
753
- doc.lastRead = now
754
- const replaced = yield* replaceMessage(doc)
755
- if (replaced) {
756
- messages.push(envelopeFromDoc(doc, sentReply))
729
+ if (activeRequestIds.has(doc.requestId)) continue
730
+ const sentReply = Option.fromNullishOr(doc.lastReplyId === null ? undefined : lastReplies.get(doc.lastReplyId))
731
+ const claimed = yield* claimMessageRead(doc, now)
732
+ if (claimed) {
733
+ messages.push(envelopeFromDoc({ ...doc, lastRead: now }, sentReply))
757
734
  }
758
735
  }
759
736
  return messages
760
737
  })
761
738
 
739
+ const collectUnprocessedById = <E>(
740
+ docs: ReadonlyArray<MessageDoc>,
741
+ queryReplies: (
742
+ query: string,
743
+ parameters: ReadonlyArray<CosmosParameter>
744
+ ) => Effect.Effect<Array<ReplyDoc>, E>
745
+ ) =>
746
+ Effect.gen(function*() {
747
+ const messages: Array<{
748
+ readonly envelope: Envelope.Encoded
749
+ readonly lastSentReply: Option.Option<Reply.Encoded>
750
+ }> = []
751
+ const activeRequestIds = yield* activeReplyRequestIds(docs, queryReplies)
752
+ const lastReplies = yield* lastRepliesById(docs, activeRequestIds, queryReplies)
753
+ for (const doc of docs) {
754
+ if (activeRequestIds.has(doc.requestId)) continue
755
+ const sentReply = Option.fromNullishOr(doc.lastReplyId === null ? undefined : lastReplies.get(doc.lastReplyId))
756
+ messages.push(envelopeFromDoc(doc, sentReply))
757
+ }
758
+ return messages
759
+ })
760
+
761
+ const activeReplyRequestIds = <E>(
762
+ docs: ReadonlyArray<MessageDoc>,
763
+ queryReplies: (
764
+ query: string,
765
+ parameters: ReadonlyArray<CosmosParameter>
766
+ ) => Effect.Effect<Array<ReplyDoc>, E>
767
+ ) => {
768
+ const requestIds = Array.from(new Set(docs.map((doc) => doc.requestId)))
769
+ if (!Arr.isArrayNonEmpty(requestIds)) return Effect.succeed(new Set<string>())
770
+ return queryReplies(
771
+ "SELECT * FROM c WHERE c.type = 'reply' AND ARRAY_CONTAINS(@requestIds, c.requestId) AND (c.kind = 'WithExit' OR (c.kind = 'Chunk' AND c.acked = false))",
772
+ [{ name: "@requestIds", value: requestIds }]
773
+ )
774
+ .pipe(Effect.map((replies) => new Set(replies.map((reply) => reply.requestId))))
775
+ }
776
+
777
+ const lastRepliesById = <E>(
778
+ docs: ReadonlyArray<MessageDoc>,
779
+ activeRequestIds: ReadonlySet<string>,
780
+ queryReplies: (
781
+ query: string,
782
+ parameters: ReadonlyArray<CosmosParameter>
783
+ ) => Effect.Effect<Array<ReplyDoc>, E>
784
+ ) => {
785
+ const replyIds = Array.from(
786
+ new Set(docs
787
+ .flatMap((doc) => activeRequestIds.has(doc.requestId) || doc.lastReplyId === null ? [] : [doc.lastReplyId]))
788
+ )
789
+ if (!Arr.isArrayNonEmpty(replyIds)) return Effect.succeed(new Map<string, Reply.Encoded>())
790
+ return queryReplies(
791
+ "SELECT * FROM c WHERE c.type = 'reply' AND ARRAY_CONTAINS(@replyIds, c.rowid)",
792
+ [{ name: "@replyIds", value: replyIds }]
793
+ )
794
+ .pipe(Effect.map((replies) => new Map(replies.map((reply) => [reply.rowid, replyFromDoc(reply)]))))
795
+ }
796
+
762
797
  export const makeRunnerStorage = Effect.fnUntraced(function*(options?: {
763
798
  readonly prefix?: string | undefined
764
799
  }) {
@@ -780,6 +815,20 @@ export const makeRunnerStorage = Effect.fnUntraced(function*(options?: {
780
815
  )
781
816
  .pipe(Effect.tap(annotateFeed), Effect.map((resp) => resp.resources))
782
817
 
818
+ const deleteRunner = (doc: RunnerDoc) =>
819
+ Effect
820
+ .tryPromise(() =>
821
+ container.item(doc.id, "runner").delete({
822
+ accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
823
+ })
824
+ )
825
+ .pipe(
826
+ Effect.tap(annotateItem),
827
+ Effect.asVoid,
828
+ Effect.catchIf(isNotFound, () => Effect.void),
829
+ Effect.catchIf(isPreconditionFailed, () => Effect.void)
830
+ )
831
+
783
832
  const readLock = (shardId: string) =>
784
833
  Effect.tryPromise(() => container.item(lockDocId(shardId), "lock").read<LockDoc>()).pipe(
785
834
  Effect.tap(annotateItem),
@@ -800,6 +849,20 @@ export const makeRunnerStorage = Effect.fnUntraced(function*(options?: {
800
849
  Effect.catchIf(isPreconditionFailed, () => Effect.succeed(false))
801
850
  )
802
851
 
852
+ const deleteLock = (doc: LockDoc) =>
853
+ Effect
854
+ .tryPromise(() =>
855
+ container.item(doc.id, "lock").delete({
856
+ accessCondition: { type: "IfMatch", condition: doc._etag ?? "" }
857
+ })
858
+ )
859
+ .pipe(
860
+ Effect.tap(annotateItem),
861
+ Effect.asVoid,
862
+ Effect.catchIf(isNotFound, () => Effect.void),
863
+ Effect.catchIf(isPreconditionFailed, () => Effect.void)
864
+ )
865
+
803
866
  const createLock = (address: string, shardId: string, now: number) =>
804
867
  Effect
805
868
  .tryPromise(() =>
@@ -873,28 +936,37 @@ export const makeRunnerStorage = Effect.fnUntraced(function*(options?: {
873
936
  ),
874
937
 
875
938
  unregister: (address) =>
876
- Effect.tryPromise(() => container.item(runnerDocId(address), "runner").delete()).pipe(
877
- Effect.tap(annotateItem),
878
- Effect.catchIf(isNotFound, () => Effect.void),
939
+ Effect.sync(() => Date.now()).pipe(
940
+ Effect.flatMap((now) =>
941
+ queryRunners(
942
+ "SELECT * FROM c WHERE c.type = 'runner' AND (c.address = @address OR c.lastHeartbeat < @expiresAt)",
943
+ [
944
+ { name: "@address", value: address },
945
+ { name: "@expiresAt", value: now - expires }
946
+ ]
947
+ )
948
+ ),
949
+ Effect.flatMap((docs) => Effect.forEach(docs, deleteRunner, { discard: true })),
879
950
  annotate("unregister"),
880
951
  refailPersistence,
881
952
  withTracerDisabled
882
953
  ),
883
954
 
884
955
  setRunnerHealth: (address, healthy) =>
885
- Effect.tryPromise(() => container.item(runnerDocId(address), "runner").read<RunnerDoc>()).pipe(
886
- Effect.flatMap((resp) => {
887
- const doc = resp.resource
888
- if (!doc) return Effect.void
889
- doc.healthy = healthy
890
- return Effect.tryPromise(() => container.item(doc.id, "runner").replace(doc)).pipe(Effect.tap(annotateItem))
891
- }),
892
- Effect.asVoid,
893
- Effect.catchIf(isNotFound, () => Effect.void),
894
- annotate("setRunnerHealth"),
895
- refailPersistence,
896
- withTracerDisabled
897
- ),
956
+ Effect
957
+ .tryPromise(() =>
958
+ container.item(runnerDocId(address), "runner").patch<RunnerDoc>([
959
+ { op: "set", path: "/healthy", value: healthy }
960
+ ])
961
+ )
962
+ .pipe(
963
+ Effect.tap(annotateItem),
964
+ Effect.asVoid,
965
+ Effect.catchIf(isNotFound, () => Effect.void),
966
+ annotate("setRunnerHealth"),
967
+ refailPersistence,
968
+ withTracerDisabled
969
+ ),
898
970
 
899
971
  acquire: (address, shardIds) =>
900
972
  Effect.sync(() => Date.now()).pipe(
@@ -909,17 +981,17 @@ export const makeRunnerStorage = Effect.fnUntraced(function*(options?: {
909
981
  Effect
910
982
  .gen(function*() {
911
983
  const now = Date.now()
912
- yield* Effect.tryPromise(() => container.item(runnerDocId(address), "runner").read<RunnerDoc>()).pipe(
913
- Effect.flatMap((resp) => {
914
- const doc = resp.resource
915
- if (!doc) return Effect.void
916
- doc.lastHeartbeat = now
917
- return Effect.tryPromise(() => container.item(doc.id, "runner").replace(doc)).pipe(
918
- Effect.tap(annotateItem)
919
- )
920
- }),
921
- Effect.catchIf(isNotFound, () => Effect.void)
922
- )
984
+ yield* Effect
985
+ .tryPromise(() =>
986
+ container.item(runnerDocId(address), "runner").patch<RunnerDoc>([
987
+ { op: "set", path: "/lastHeartbeat", value: now }
988
+ ])
989
+ )
990
+ .pipe(
991
+ Effect.tap(annotateItem),
992
+ Effect.asVoid,
993
+ Effect.catchIf(isNotFound, () => Effect.void)
994
+ )
923
995
  const refreshed = yield* Effect.forEach(shardIds, (shardId) =>
924
996
  readLock(shardId).pipe(
925
997
  Effect.flatMap((lock) =>
@@ -944,11 +1016,7 @@ export const makeRunnerStorage = Effect.fnUntraced(function*(options?: {
944
1016
  onNone: () => Effect.void,
945
1017
  onSome: (doc) =>
946
1018
  doc.address === address
947
- ? Effect.tryPromise(() => container.item(doc.id, "lock").delete()).pipe(
948
- Effect.tap(annotateItem),
949
- Effect.catchIf(isNotFound, () => Effect.void),
950
- Effect.asVoid
951
- )
1019
+ ? deleteLock(doc)
952
1020
  : Effect.void
953
1021
  })
954
1022
  ),
@@ -970,13 +1038,7 @@ export const makeRunnerStorage = Effect.fnUntraced(function*(options?: {
970
1038
  )
971
1039
  .pipe(
972
1040
  Effect.tap(annotateFeed),
973
- Effect.flatMap((resp) =>
974
- Effect.forEach(resp.resources, (doc) =>
975
- Effect.tryPromise(() => container.item(doc.id, "lock").delete()).pipe(
976
- Effect.tap(annotateItem),
977
- Effect.catchIf(isNotFound, () => Effect.void)
978
- ), { discard: true })
979
- ),
1041
+ Effect.flatMap((resp) => Effect.forEach(resp.resources, deleteLock, { discard: true })),
980
1042
  annotate("releaseAll"),
981
1043
  refailPersistence,
982
1044
  withTracerDisabled
@@ -11,6 +11,7 @@ const cosmosUrl = process.env["COSMOS_TEST_URL"]
11
11
  const cosmosDb = process.env["COSMOS_TEST_DB"] ?? "cluster-test"
12
12
  const testRunId = `${Date.now()}-${process.pid}-${Math.random().toString(16).slice(2)}`
13
13
  const runnerPortBase = 10000 + Date.now() % 40000
14
+ const liveSnowflake = Layer.effect(Snowflake.Generator, TestClock.withLive(Snowflake.makeGenerator))
14
15
 
15
16
  const layerFor = () =>
16
17
  layerCosmos({
@@ -19,7 +20,7 @@ const layerFor = () =>
19
20
  prefix: "test-cluster-"
20
21
  })
21
22
  .pipe(
22
- Layer.provideMerge(Snowflake.layerGenerator),
23
+ Layer.provideMerge(liveSnowflake),
23
24
  Layer.provide(ShardingConfig.layerDefaults)
24
25
  )
25
26