@effect-agent/storage-memory 0.1.0-beta.49 → 0.1.0-beta.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/MemorySubmissionLedger.mjs +30 -5
- package/dist/MemorySubmissionLedger.mjs.map +1 -1
- package/dist/MemorySubscriptionStore.mjs +266 -17
- package/dist/MemorySubscriptionStore.mjs.map +1 -1
- package/package.json +1 -1
- package/src/MemorySubmissionLedger.ts +76 -3
- package/src/MemorySubscriptionStore.ts +499 -17
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
|
|
2
|
-
import { Clock, DateTime, Duration, Effect, Layer, Option, Ref, Schema, Stream } from "effect";
|
|
2
|
+
import { Cause, Clock, DateTime, Duration, Effect, Exit, Fiber, Layer, Option, Ref, Schema, Stream } from "effect";
|
|
3
3
|
import { AttemptId, ReceiptId, SubmissionId } from "@effect-agent/core/Identifiers";
|
|
4
4
|
import { PersistedJson, ProducerEpoch } from "@effect-agent/thread/Records";
|
|
5
|
-
import { AbortCommand, AbortIntent, AbortIntentRequest, AdmissionAdmitted, AdmissionConflict, AdmissionIndeterminate, AdmissionNotAdmitted, AdmissionRequest, AdmissionResult, ApprovalConflict, ApprovalDecisionCommand, ApprovalDecisionIntent, AttachChildToReservationRequest, BeginChildBudgetReleaseRequest, ChildAttachmentSnapshot, ChildBudgetReservationRequest, ChildBudgetReservationSnapshot, ChildReservationConflict, ChildSettledNotification, Claim, ClaimJoiningRequest, ClaimRequest, DEFAULT_OWNERSHIP_LEASE_DURATION, InputAppliedMarker, JoinSnapshot, JoinedToHost, JoiningClaim, LedgerCapabilities, LedgerError, MarkInputAppliedRequest, MarkJoinedRequest, MarkReadyRequest, MarkUnknownRequest, OwnershipLost, OwnershipRenewal, OwnershipSnapshot, OwnershipToken, QueueSequence, RecoverySnapshot, RecoverySnapshotRequest, ReleaseChildBudgetRequest, ReleaseOwnershipRequest, RenewOwnershipRequest, ReservedChildBudget, ReservedSettlement, RevertJoiningRequest, Settlement, SettlementConflict, SettlementFinalization, SettlementReservation, SettlementReservationSnapshot, SubmissionLedger, SubmissionLookup, SubmissionLookupByKey, SubmissionSnapshot, SuspendRequest, SuspensionSnapshot, UnknownResolution, UnknownResolutionCommand, UnknownResolutionConflict, UnknownResolutionIntent, settlementFailureFromRecord } from "@effect-agent/thread/SubmissionLedger";
|
|
5
|
+
import { AbortCommand, AbortIntent, AbortIntentRequest, AdmissionAdmitted, AdmissionConflict, AdmissionIndeterminate, AdmissionNotAdmitted, AdmissionPolicyError, AdmissionRequest, AdmissionResult, ApprovalConflict, ApprovalDecisionCommand, ApprovalDecisionIntent, AttachChildToReservationRequest, BeginChildBudgetReleaseRequest, ChildAttachmentSnapshot, ChildBudgetReservationRequest, ChildBudgetReservationSnapshot, ChildReservationConflict, ChildSettledNotification, Claim, ClaimJoiningRequest, ClaimRequest, DEFAULT_OWNERSHIP_LEASE_DURATION, InputAppliedMarker, JoinSnapshot, JoinedToHost, JoiningClaim, LedgerCapabilities, LedgerError, MarkInputAppliedRequest, MarkJoinedRequest, MarkReadyRequest, MarkUnknownRequest, OwnershipLost, OwnershipRenewal, OwnershipSnapshot, OwnershipToken, QueueSequence, RecoverySnapshot, RecoverySnapshotRequest, ReleaseChildBudgetRequest, ReleaseOwnershipRequest, RenewOwnershipRequest, ReservedChildBudget, ReservedSettlement, RevertJoiningRequest, Settlement, SettlementConflict, SettlementFinalization, SettlementReservation, SettlementReservationSnapshot, SubmissionAdmissionFence, SubmissionLedger, SubmissionLookup, SubmissionLookupByKey, SubmissionSnapshot, SuspendRequest, SuspensionSnapshot, UnknownResolution, UnknownResolutionCommand, UnknownResolutionConflict, UnknownResolutionIntent, settlementFailureFromRecord } from "@effect-agent/thread/SubmissionLedger";
|
|
6
6
|
//#region src/MemorySubmissionLedger.ts
|
|
7
7
|
var MemorySubmissionLedger_exports = /* @__PURE__ */ __exportAll({
|
|
8
8
|
MemorySubmissionLedgerLive: () => MemorySubmissionLedgerLive,
|
|
@@ -77,6 +77,8 @@ const toSnapshot = (row) => SubmissionSnapshot.make({
|
|
|
77
77
|
receiptId: row.receiptId,
|
|
78
78
|
state: row.state,
|
|
79
79
|
createdAt: utc(row.createdAtMillis),
|
|
80
|
+
...row.admissionGroup === void 0 ? {} : { admissionGroup: row.admissionGroup },
|
|
81
|
+
...row.admissionFence === void 0 ? {} : { admissionFence: row.admissionFence },
|
|
80
82
|
...row.settledOutcome === void 0 ? {} : { settledOutcome: row.settledOutcome },
|
|
81
83
|
...row.readyAtMillis === void 0 ? {} : { readyAt: utc(row.readyAtMillis) },
|
|
82
84
|
...row.parentLinkage === void 0 ? {} : { parentLinkage: row.parentLinkage }
|
|
@@ -161,18 +163,20 @@ const makeSubmissionLedger = (options = {}) => Effect.gen(function* () {
|
|
|
161
163
|
childReservations: /* @__PURE__ */ new Map(),
|
|
162
164
|
mintCounter: 0
|
|
163
165
|
});
|
|
166
|
+
const admissionFence = yield* SubmissionAdmissionFence;
|
|
164
167
|
const leaseMillis = Duration.toMillis(DEFAULT_OWNERSHIP_LEASE_DURATION);
|
|
165
168
|
const capabilities = Effect.succeed(LedgerCapabilities.make({ durability: "non-durable" }));
|
|
166
169
|
const admit = Effect.fn("MemorySubmissionLedger.admit")((unvalidated) => Effect.gen(function* () {
|
|
167
170
|
const request = yield* validate(AdmissionRequest, "admit", unvalidated);
|
|
168
171
|
const nowMillis = yield* Clock.currentTimeMillis;
|
|
172
|
+
const services = yield* Effect.context();
|
|
169
173
|
const decision = yield* Ref.modify(state, (current) => {
|
|
170
174
|
const key = admissionKey(request.threadId, request.principal, request.idempotencyKey);
|
|
171
175
|
const existingId = current.admissionIndex.get(key);
|
|
172
176
|
if (existingId !== void 0) {
|
|
173
177
|
const existing = current.submissions.get(existingId);
|
|
174
178
|
if (existing === void 0) return [failure(ledgerError("admit", "Admission index references a missing Submission")), current];
|
|
175
|
-
if (existing.row.inputDigest !== request.inputDigest || !sameParentLinkage(existing.row.parentLinkage, request.parentLinkage)) return [failure(AdmissionConflict.make({
|
|
179
|
+
if (existing.row.inputDigest !== request.inputDigest || !sameParentLinkage(existing.row.parentLinkage, request.parentLinkage) || existing.row.admissionGroup !== request.admissionGroup || !Schema.toEquivalence(Schema.optional(Schema.Json))(existing.row.admissionFence, request.admissionFence)) return [failure(AdmissionConflict.make({
|
|
176
180
|
threadId: request.threadId,
|
|
177
181
|
principal: request.principal,
|
|
178
182
|
idempotencyKey: request.idempotencyKey,
|
|
@@ -187,6 +191,15 @@ const makeSubmissionLedger = (options = {}) => Effect.gen(function* () {
|
|
|
187
191
|
replayed: true
|
|
188
192
|
})), current];
|
|
189
193
|
}
|
|
194
|
+
const checked = Effect.runSyncExitWith(services)(admissionFence.check(request));
|
|
195
|
+
if (Exit.isFailure(checked)) return [{
|
|
196
|
+
_tag: "cause",
|
|
197
|
+
cause: checked.cause
|
|
198
|
+
}, current];
|
|
199
|
+
if (request.admissionGroup !== void 0 && [...current.submissions.values()].some(({ row }) => row.threadId === request.threadId && row.admissionGroup === request.admissionGroup && row.state !== "settled")) return [failure(AdmissionPolicyError.make({
|
|
200
|
+
reason: "occupied",
|
|
201
|
+
code: "admission-group"
|
|
202
|
+
})), current];
|
|
190
203
|
if (current.submissions.size >= MAX_SUBMISSIONS) return [failure(ledgerError("admit", `In-memory submission limit ${MAX_SUBMISSIONS} exceeded`)), current];
|
|
191
204
|
const lane = current.lanes.get(request.threadId) ?? {
|
|
192
205
|
nextQueueSequence: 1,
|
|
@@ -209,7 +222,9 @@ const makeSubmissionLedger = (options = {}) => Effect.gen(function* () {
|
|
|
209
222
|
settledOutcome: void 0,
|
|
210
223
|
createdAtMillis: nowMillis,
|
|
211
224
|
readyAtMillis: void 0,
|
|
212
|
-
parentLinkage: request.parentLinkage
|
|
225
|
+
parentLinkage: request.parentLinkage,
|
|
226
|
+
...request.admissionGroup === void 0 ? {} : { admissionGroup: request.admissionGroup },
|
|
227
|
+
...request.admissionFence === void 0 ? {} : { admissionFence: request.admissionFence }
|
|
213
228
|
};
|
|
214
229
|
const submissions = new Map(current.submissions).set(row.submissionId, {
|
|
215
230
|
row,
|
|
@@ -243,8 +258,18 @@ const makeSubmissionLedger = (options = {}) => Effect.gen(function* () {
|
|
|
243
258
|
}];
|
|
244
259
|
});
|
|
245
260
|
if (decision._tag === "failure") return yield* decision.error;
|
|
261
|
+
if (decision._tag === "cause") {
|
|
262
|
+
for (const reason of decision.cause.reasons) if (Cause.isDieReason(reason) && Cause.isAsyncFiberError(reason.defect)) {
|
|
263
|
+
yield* Fiber.interrupt(reason.defect.fiber);
|
|
264
|
+
return yield* AdmissionPolicyError.make({
|
|
265
|
+
reason: "unavailable",
|
|
266
|
+
code: "synchronous-memory-policy-required"
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
return yield* Effect.failCause(decision.cause);
|
|
270
|
+
}
|
|
246
271
|
return decision.value;
|
|
247
|
-
}));
|
|
272
|
+
}), Effect.uninterruptible);
|
|
248
273
|
const markReady = Effect.fn("MemorySubmissionLedger.markReady")((unvalidated) => Effect.gen(function* () {
|
|
249
274
|
const request = yield* validate(MarkReadyRequest, "markReady", unvalidated);
|
|
250
275
|
const nowMillis = yield* Clock.currentTimeMillis;
|