@stamprally/server 0.16.0 → 0.18.0
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/README.md +1 -1
- package/dist/index.cjs +101 -33
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +33 -27
- package/dist/index.d.ts +33 -27
- package/dist/index.js +101 -33
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/examples/transaction.ts","../src/persistence.ts","../src/security.ts","../src/server.ts","../src/testing/compliance.ts"],"names":["params","mutation","now","state","record","errors","audit"],"mappings":"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","file":"index.js","sourcesContent":["import type { UserRallyState } from \"@stamprally/core\";\nimport type { AuditLog } from \"../index.js\";\nimport type {\n CheckInTransactionMutation,\n CheckInTransactionParams,\n ClaimRewardTransactionMutation,\n ClaimRewardTransactionParams,\n} from \"../persistence.js\";\n\n/**\n * Minimal database contract for the SQL reference implementation.\n *\n * `readContext` should use SELECT ... FOR UPDATE for the stock, claim-count,\n * and user-state rows. The adapter's transaction implementation must commit\n * or roll back every operation performed through the transaction handle.\n */\nexport interface SqlTransactionDatabase<Tx> {\n transaction<T>(operation: (transaction: Tx) => Promise<T>): Promise<T>;\n}\n\nexport interface SqlClaimRewardStore<Tx> {\n readContext(\n transaction: Tx,\n params: ClaimRewardTransactionParams,\n ): Promise<{\n readonly stock: number | null;\n readonly secondaryStock?: number | null;\n readonly claimCount: number;\n readonly userState: UserRallyState;\n }>;\n writeStock(\n transaction: Tx,\n params: ClaimRewardTransactionParams,\n nextStock: number,\n ): Promise<void>;\n writeSecondaryStock?(\n transaction: Tx,\n params: ClaimRewardTransactionParams,\n nextStock: number,\n ): Promise<void>;\n writeUserState(\n transaction: Tx,\n params: ClaimRewardTransactionParams,\n state: UserRallyState,\n ): Promise<void>;\n writeClaimRecord(\n transaction: Tx,\n params: ClaimRewardTransactionParams,\n state: UserRallyState,\n ): Promise<void>;\n writeAudit(transaction: Tx, log: AuditLog): Promise<void>;\n writeIdempotency(\n transaction: Tx,\n params: ClaimRewardTransactionParams,\n result: unknown,\n ): Promise<void>;\n}\n\n/**\n * Reference implementation for PostgreSQL, MySQL, or another transactional\n * SQL store. Domain rejections still write their audit/idempotency records,\n * while unexpected write failures reject the transaction and roll everything\n * back.\n */\nexport async function executeClaimRewardTransaction<Tx>(\n database: SqlTransactionDatabase<Tx>,\n store: SqlClaimRewardStore<Tx>,\n params: ClaimRewardTransactionParams,\n mutation: (current: {\n readonly stock: number | null;\n readonly claimCount: number;\n readonly userState: UserRallyState;\n }) => ClaimRewardTransactionMutation,\n): Promise<{ readonly success: boolean; readonly error?: string }> {\n try {\n return await database.transaction(async (transaction) => {\n const current = await store.readContext(transaction, params);\n const next = mutation(current);\n if (next.error !== undefined) {\n await store.writeAudit(transaction, next.auditLog);\n if (params.idempotencyKey !== undefined && next.result !== undefined)\n await store.writeIdempotency(transaction, params, next.result);\n return { success: false, error: next.error };\n }\n if (next.nextSecondaryStock !== undefined && store.writeSecondaryStock === undefined)\n return { success: false, error: \"INVENTORY_NOT_SUPPORTED\" };\n if (next.nextStock !== null) await store.writeStock(transaction, params, next.nextStock);\n if (next.nextSecondaryStock !== undefined && store.writeSecondaryStock !== undefined) {\n if (next.nextSecondaryStock !== null)\n await store.writeSecondaryStock(transaction, params, next.nextSecondaryStock);\n }\n await store.writeUserState(transaction, params, next.nextUserState);\n await store.writeClaimRecord(transaction, params, next.nextUserState);\n await store.writeAudit(transaction, next.auditLog);\n if (params.idempotencyKey !== undefined && next.result !== undefined)\n await store.writeIdempotency(transaction, params, next.result);\n return { success: true };\n });\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n}\n\nexport interface SqlCheckInStore<Tx> {\n readUserState?(transaction: Tx, params: CheckInTransactionParams): Promise<UserRallyState>;\n writeUserState(\n transaction: Tx,\n params: CheckInTransactionParams,\n state: UserRallyState,\n ): Promise<void>;\n writeAudit(transaction: Tx, log: AuditLog): Promise<void>;\n writeIdempotency(\n transaction: Tx,\n params: CheckInTransactionParams,\n result: unknown,\n ): Promise<void>;\n}\n\n/** Reference transaction block for a check-in state, audit, and idempotency write. */\nexport async function executeCheckInTransaction<Tx>(\n database: SqlTransactionDatabase<Tx>,\n store: SqlCheckInStore<Tx>,\n params: CheckInTransactionParams,\n mutation: (current: { readonly userState: UserRallyState }) => CheckInTransactionMutation,\n current?: UserRallyState,\n): Promise<{ readonly success: boolean; readonly error?: string }> {\n try {\n return await database.transaction(async (transaction) => {\n const userState =\n current ??\n (store.readUserState === undefined\n ? (() => {\n throw new Error(\"A current user state or readUserState implementation is required.\");\n })()\n : await store.readUserState(transaction, params));\n const next = mutation({ userState });\n if (next.error !== undefined) {\n await store.writeAudit(transaction, next.auditLog);\n if (params.idempotencyKey !== undefined && next.result !== undefined)\n await store.writeIdempotency(transaction, params, next.result);\n return { success: false, error: next.error };\n }\n await store.writeUserState(transaction, params, next.nextUserState);\n await store.writeAudit(transaction, next.auditLog);\n if (params.idempotencyKey !== undefined && next.result !== undefined)\n await store.writeIdempotency(transaction, params, next.result);\n return { success: true };\n });\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n}\n\nexport interface RedisMultiExecutor<TMulti> {\n multi(): TMulti;\n exec(multi: TMulti): Promise<ReadonlyArray<unknown> | null>;\n}\n\n/** Reference for Redis MULTI/EXEC adapters: all queued commands commit together. */\nexport async function executeRedisTransaction<TMulti>(\n redis: RedisMultiExecutor<TMulti>,\n queue: (multi: TMulti) => void,\n): Promise<{ readonly success: boolean; readonly error?: string }> {\n try {\n const multi = redis.multi();\n queue(multi);\n const result = await redis.exec(multi);\n return result === null\n ? { success: false, error: \"Redis transaction was aborted.\" }\n : { success: true };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n}\n","import type { UserRallyState } from \"@stamprally/core\";\nimport type { AuditLog } from \"./index.js\";\n\nexport interface UserClaimRecord {\n readonly rallyId: string;\n readonly userId: string;\n readonly rewardId: string;\n readonly ticketNumber: string;\n readonly timestamp: number;\n}\n\nexport interface ClaimRewardTransactionParams {\n readonly rallyId: string;\n readonly userId: string;\n readonly rewardId: string;\n readonly ticketNumber: string;\n readonly timestamp: number;\n readonly idempotencyKey?: string;\n readonly proofData?: unknown;\n readonly idempotencyTtlMs?: number;\n /** The configured per-reward stock limit, or null for unlimited stock. */\n readonly rewardStockLimit: number | null;\n /** The configured shared stock limit, or null when shared inventory is disabled. */\n readonly sharedStockLimit: number | null;\n /** Used when the first claim is made before a user state has been stored. */\n readonly initialUserState?: UserRallyState;\n readonly stockKey?: string;\n readonly secondaryStockKey?: string;\n readonly initialStock?: number | null;\n readonly initialSecondaryStock?: number | null;\n}\n\nexport interface ClaimRewardTransactionMutation {\n readonly nextStock: number | null;\n readonly nextSecondaryStock?: number | null;\n readonly nextUserState: UserRallyState;\n readonly auditLog: AuditLog;\n /** The server response is persisted by the adapter with the idempotency key. */\n readonly result?: unknown;\n /** A domain rejection is committed as an audit/idempotency record without mutations. */\n readonly error?: string;\n}\n\nexport interface CheckInTransactionParams {\n readonly rallyId: string;\n readonly userId: string;\n readonly spotId: string;\n readonly timestamp: number;\n readonly idempotencyKey?: string;\n readonly proofData?: unknown;\n readonly idempotencyTtlMs?: number;\n readonly initialUserState?: UserRallyState;\n}\n\nexport interface CheckInTransactionMutation {\n readonly nextUserState: UserRallyState;\n readonly auditLog: AuditLog;\n readonly result?: unknown;\n readonly error?: string;\n}\n\nexport interface ServerPersistenceAdapter {\n /** Atomically commits user state, audit log, and idempotency data. */\n executeCheckInTransaction(\n params: CheckInTransactionParams,\n mutation: (current: { readonly userState: UserRallyState }) => CheckInTransactionMutation,\n ): Promise<{ readonly success: boolean; readonly error?: string }>;\n /**\n * Atomically commits stock, user state, claim count, audit log, and idempotency data.\n * Adapters must roll back every write when the callback or any commit operation fails.\n */\n executeClaimRewardTransaction(\n params: ClaimRewardTransactionParams,\n mutation: (current: {\n readonly stock: number | null;\n readonly secondaryStock: number | null;\n readonly claimCount: number;\n readonly userState: UserRallyState;\n }) => ClaimRewardTransactionMutation,\n ): Promise<{ readonly success: boolean; readonly error?: string }>;\n /** Set false when the adapter cannot persist per-reward inventory atomically. */\n readonly supportsRewardStock?: boolean;\n acquireLock(rallyId: string, lockKey: string, ttlMs: number): Promise<boolean>;\n releaseLock(rallyId: string, lockKey: string): Promise<void>;\n getRewardStock(rallyId: string, rewardId: string): Promise<number | null>;\n decrementRewardStock(\n rallyId: string,\n rewardId: string,\n ): Promise<{ readonly success: boolean; readonly remainingStock: number }>;\n getIdempotentResult<T>(rallyId: string, key: string): Promise<T | null>;\n saveIdempotentResult<T>(rallyId: string, key: string, result: T, ttlMs: number): Promise<void>;\n getUserClaimCount(rallyId: string, userId: string, rewardId: string): Promise<number>;\n recordUserClaim(params: UserClaimRecord): Promise<void>;\n recordClaim?(params: UserClaimRecord): Promise<void>;\n incrementUserClaimCount?(rallyId: string, userId: string, rewardId: string): Promise<void>;\n getUserState(rallyId: string, userId: string): Promise<UserRallyState | null>;\n saveUserState(rallyId: string, userId: string, state: UserRallyState): Promise<void>;\n recordAuditLog(log: AuditLog): Promise<void>;\n removeAuditLog?(auditId: string): Promise<void>;\n}\ninterface TimedValue<T> {\n readonly value: T;\n readonly expiresAt: number;\n}\nexport interface InMemoryServerPersistenceOptions {\n readonly stocks?: Readonly<Record<string, number>>;\n}\nexport class InMemoryServerPersistenceAdapter implements ServerPersistenceAdapter {\n readonly supportsRewardStock = true;\n readonly #locks = new Map<string, number>();\n readonly #idempotent = new Map<string, TimedValue<unknown>>();\n readonly #states = new Map<string, UserRallyState>();\n readonly #stocks: Map<string, number>;\n readonly #stockDefaults: Map<string, number>;\n readonly #claims = new Map<string, number>();\n readonly #claimRecords: UserClaimRecord[] = [];\n readonly #auditLogs: AuditLog[] = [];\n readonly #transactionTails = new Map<string, Promise<void>>();\n constructor(options: InMemoryServerPersistenceOptions = {}) {\n this.#stocks = new Map();\n this.#stockDefaults = new Map();\n for (const [key, stock] of Object.entries(options.stocks ?? {})) {\n if (key.includes(\":\")) this.#stocks.set(key, stock);\n else this.#stockDefaults.set(key, stock);\n }\n }\n #key(rallyId: string, key: string): string {\n return `${rallyId}:${key}`;\n }\n #stockKey(rallyId: string, rewardId: string): string {\n const scopedKey = `${rallyId}:${rewardId}`;\n if (this.#stocks.has(scopedKey)) return scopedKey;\n const defaultStock = this.#stockDefaults.get(rewardId);\n if (defaultStock !== undefined) {\n this.#stocks.set(scopedKey, defaultStock);\n return scopedKey;\n }\n return scopedKey;\n }\n async acquireLock(rallyId: string, key: string, ttlMs: number): Promise<boolean> {\n const scopedKey = this.#key(rallyId, key);\n const now = Date.now();\n const until = this.#locks.get(scopedKey);\n if (until !== undefined && until > now) return false;\n this.#locks.set(scopedKey, now + Math.max(1, ttlMs));\n return true;\n }\n async releaseLock(rallyId: string, key: string): Promise<void> {\n this.#locks.delete(this.#key(rallyId, key));\n }\n async getRewardStock(rallyId: string, rewardId: string): Promise<number | null> {\n return this.#stocks.get(this.#stockKey(rallyId, rewardId)) ?? null;\n }\n async decrementRewardStock(\n rallyId: string,\n rewardId: string,\n ): Promise<{ success: boolean; remainingStock: number }> {\n const key = this.#stockKey(rallyId, rewardId);\n const current = this.#stocks.get(key);\n if (current === undefined) return { success: true, remainingStock: Number.POSITIVE_INFINITY };\n if (current <= 0) return { success: false, remainingStock: 0 };\n this.#stocks.set(key, current - 1);\n return { success: true, remainingStock: current - 1 };\n }\n async restoreRewardStock(rallyId: string, rewardId: string, count = 1): Promise<void> {\n const key = this.#stockKey(rallyId, rewardId);\n const current = this.#stocks.get(key);\n if (current !== undefined) this.#stocks.set(key, current + Math.max(0, count));\n }\n\n async executeClaimRewardTransaction(\n params: ClaimRewardTransactionParams,\n mutation: (current: {\n readonly stock: number | null;\n readonly secondaryStock: number | null;\n readonly claimCount: number;\n readonly userState: UserRallyState;\n }) => ClaimRewardTransactionMutation,\n ): Promise<{ readonly success: boolean; readonly error?: string }> {\n try {\n const initialStock =\n params.initialStock !== undefined\n ? params.initialStock\n : params.stockKey === \"__shared__\"\n ? params.sharedStockLimit\n : params.rewardStockLimit;\n const initialSecondaryStock =\n params.initialSecondaryStock !== undefined\n ? params.initialSecondaryStock\n : params.rewardStockLimit;\n return await this.runTransaction(params.rallyId, async () => {\n if (params.idempotencyKey !== undefined) {\n const previous = await this.getIdempotentResult<unknown>(\n params.rallyId,\n params.idempotencyKey,\n );\n if (previous !== null) return { success: true };\n }\n const userState =\n (await this.getUserState(params.rallyId, params.userId)) ?? params.initialUserState;\n if (userState === undefined)\n return { success: false, error: \"A user state is required for this transaction.\" };\n const storedStock = await this.getRewardStock(\n params.rallyId,\n params.stockKey ?? params.rewardId,\n );\n const storedSecondaryStock =\n params.secondaryStockKey === undefined\n ? null\n : await this.getRewardStock(params.rallyId, params.secondaryStockKey);\n const mutationResult = mutation({\n stock: storedStock ?? initialStock,\n secondaryStock: storedSecondaryStock ?? initialSecondaryStock,\n claimCount: await this.getUserClaimCount(params.rallyId, params.userId, params.rewardId),\n userState,\n });\n const idempotencyKey = params.idempotencyKey;\n if (mutationResult.error !== undefined) {\n await this.recordAuditLog(mutationResult.auditLog);\n if (idempotencyKey !== undefined && mutationResult.result !== undefined)\n await this.saveIdempotentResult(\n params.rallyId,\n idempotencyKey,\n mutationResult.result,\n params.idempotencyTtlMs ?? 86_400_000,\n );\n return { success: false, error: mutationResult.error };\n }\n const currentStock = await this.getRewardStock(\n params.rallyId,\n params.stockKey ?? params.rewardId,\n );\n const effectiveStock = currentStock ?? initialStock;\n if (currentStock === null && initialStock !== undefined && initialStock !== null)\n this.#stocks.set(\n this.#stockKey(params.rallyId, params.stockKey ?? params.rewardId),\n initialStock,\n );\n const currentSecondaryStock =\n params.secondaryStockKey === undefined\n ? null\n : await this.getRewardStock(params.rallyId, params.secondaryStockKey);\n const effectiveSecondaryStock = currentSecondaryStock ?? initialSecondaryStock;\n if (\n currentSecondaryStock === null &&\n params.secondaryStockKey !== undefined &&\n initialSecondaryStock !== undefined &&\n initialSecondaryStock !== null\n )\n this.#stocks.set(\n this.#stockKey(params.rallyId, params.secondaryStockKey),\n initialSecondaryStock,\n );\n if (\n effectiveStock !== null &&\n (mutationResult.nextStock === null || mutationResult.nextStock < 0)\n )\n throw new Error(\"The transaction produced an invalid stock value.\");\n if (effectiveStock === null && mutationResult.nextStock !== null)\n throw new Error(\"The transaction changed an unlimited stock to a limited stock.\");\n if (mutationResult.nextStock !== null)\n this.#stocks.set(\n this.#stockKey(params.rallyId, params.stockKey ?? params.rewardId),\n mutationResult.nextStock,\n );\n if (\n params.secondaryStockKey !== undefined &&\n mutationResult.nextSecondaryStock !== undefined\n ) {\n if (\n effectiveSecondaryStock !== null &&\n (mutationResult.nextSecondaryStock === null || mutationResult.nextSecondaryStock < 0)\n )\n throw new Error(\"The transaction produced an invalid secondary stock value.\");\n if (effectiveSecondaryStock === null && mutationResult.nextSecondaryStock !== null)\n throw new Error(\n \"The transaction changed an unlimited secondary stock to a limited stock.\",\n );\n if (mutationResult.nextSecondaryStock !== null)\n this.#stocks.set(\n this.#stockKey(params.rallyId, params.secondaryStockKey),\n mutationResult.nextSecondaryStock,\n );\n }\n await this.saveUserState(params.rallyId, params.userId, mutationResult.nextUserState);\n const reward = mutationResult.nextUserState.rewards.find(\n (item) => item.rewardId === params.rewardId,\n );\n if (reward?.claimTicketNumber !== undefined)\n await this.recordUserClaim({\n rallyId: params.rallyId,\n userId: params.userId,\n rewardId: params.rewardId,\n ticketNumber: reward.claimTicketNumber,\n timestamp: params.timestamp,\n });\n await this.recordAuditLog(mutationResult.auditLog);\n if (idempotencyKey !== undefined && mutationResult.result !== undefined)\n await this.saveIdempotentResult(\n params.rallyId,\n idempotencyKey,\n mutationResult.result,\n params.idempotencyTtlMs ?? 86_400_000,\n );\n return { success: true };\n });\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n\n async executeCheckInTransaction(\n params: CheckInTransactionParams,\n mutation: (current: { readonly userState: UserRallyState }) => CheckInTransactionMutation,\n ): Promise<{ readonly success: boolean; readonly error?: string }> {\n try {\n return await this.runTransaction(params.rallyId, async () => {\n const userState =\n (await this.getUserState(params.rallyId, params.userId)) ?? params.initialUserState;\n if (userState === undefined)\n return { success: false, error: \"A user state is required for this transaction.\" };\n const mutationResult = mutation({ userState });\n if (mutationResult.error !== undefined) {\n await this.recordAuditLog(mutationResult.auditLog);\n if (params.idempotencyKey !== undefined && mutationResult.result !== undefined)\n await this.saveIdempotentResult(\n params.rallyId,\n params.idempotencyKey,\n mutationResult.result,\n params.idempotencyTtlMs ?? 86_400_000,\n );\n return { success: false, error: mutationResult.error };\n }\n await this.saveUserState(params.rallyId, params.userId, mutationResult.nextUserState);\n await this.recordAuditLog(mutationResult.auditLog);\n if (params.idempotencyKey !== undefined && mutationResult.result !== undefined)\n await this.saveIdempotentResult(\n params.rallyId,\n params.idempotencyKey,\n mutationResult.result,\n params.idempotencyTtlMs ?? 86_400_000,\n );\n return { success: true };\n });\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n\n async rollbackUserState(\n rallyId: string,\n userId: string,\n previousState: UserRallyState | null,\n ): Promise<void> {\n const key = `${rallyId}:${userId}`;\n if (previousState === null) this.#states.delete(key);\n else this.#states.set(key, structuredClone(previousState));\n }\n async getIdempotentResult<T>(rallyId: string, key: string): Promise<T | null> {\n const value = this.#idempotent.get(this.#key(rallyId, key));\n if (value === undefined || value.expiresAt <= Date.now()) {\n this.#idempotent.delete(this.#key(rallyId, key));\n return null;\n }\n return structuredClone(value.value) as T;\n }\n async saveIdempotentResult<T>(\n rallyId: string,\n key: string,\n result: T,\n ttlMs: number,\n ): Promise<void> {\n this.#idempotent.set(this.#key(rallyId, key), {\n value: structuredClone(result),\n expiresAt: Date.now() + Math.max(1, ttlMs),\n });\n }\n async getUserClaimCount(rallyId: string, userId: string, rewardId: string): Promise<number> {\n return this.#claims.get(`${rallyId}:${userId}:${rewardId}`) ?? 0;\n }\n async getUserState(rallyId: string, userId: string): Promise<UserRallyState | null> {\n const value = this.#states.get(`${rallyId}:${userId}`);\n return value === undefined ? null : structuredClone(value);\n }\n async saveUserState(rallyId: string, userId: string, state: UserRallyState): Promise<void> {\n this.#states.set(`${rallyId}:${userId}`, structuredClone(state));\n }\n async recordAuditLog(log: AuditLog): Promise<void> {\n this.#auditLogs.push(structuredClone(log));\n }\n async removeAuditLog(auditId: string): Promise<void> {\n const index = this.#auditLogs.findIndex((log) => log.id === auditId);\n if (index >= 0) this.#auditLogs.splice(index, 1);\n }\n getAuditLogs(): ReadonlyArray<AuditLog> {\n return structuredClone(this.#auditLogs);\n }\n async recordUserClaim(params: UserClaimRecord): Promise<void> {\n const { rallyId, userId, rewardId } = params;\n const key = `${rallyId}:${userId}:${rewardId}`;\n this.#claims.set(key, (this.#claims.get(key) ?? 0) + 1);\n this.#claimRecords.push(structuredClone(params));\n }\n async rollbackUserClaim(\n rallyId: string,\n userId: string,\n rewardId: string,\n ticketNumber: string,\n ): Promise<void> {\n const key = `${rallyId}:${userId}:${rewardId}`;\n const count = this.#claims.get(key) ?? 0;\n if (count <= 1) this.#claims.delete(key);\n else this.#claims.set(key, count - 1);\n const index = this.#claimRecords.findIndex(\n (record) =>\n record.rallyId === rallyId &&\n record.userId === userId &&\n record.rewardId === rewardId &&\n record.ticketNumber === ticketNumber,\n );\n if (index >= 0) this.#claimRecords.splice(index, 1);\n }\n async incrementUserClaimCount(rallyId: string, userId: string, rewardId: string): Promise<void> {\n const key = `${rallyId}:${userId}:${rewardId}`;\n this.#claims.set(key, (this.#claims.get(key) ?? 0) + 1);\n }\n getClaimRecords(): ReadonlyArray<UserClaimRecord> {\n return structuredClone(this.#claimRecords);\n }\n /** @deprecated Use recordUserClaim with a ticket number and timestamp. */\n recordClaim(params: UserClaimRecord): Promise<void>;\n recordClaim(rallyId: string, userId: string, rewardId: string): Promise<void>;\n recordClaim(\n paramsOrRallyId: UserClaimRecord | string,\n userId?: string,\n rewardId?: string,\n ): Promise<void> {\n const params: UserClaimRecord =\n typeof paramsOrRallyId === \"string\"\n ? {\n rallyId: paramsOrRallyId,\n userId: userId ?? \"\",\n rewardId: rewardId ?? \"\",\n ticketNumber: \"\",\n timestamp: Date.now(),\n }\n : paramsOrRallyId;\n return this.recordUserClaim(params);\n }\n\n async runTransaction<T>(\n rallyId: string,\n operation: (transaction: ServerPersistenceAdapter) => Promise<T>,\n ): Promise<T> {\n const previous = this.#transactionTails.get(rallyId) ?? Promise.resolve();\n const current = previous.then(async () => {\n const snapshot = {\n stocks: new Map(this.#stocks),\n idempotent: new Map(this.#idempotent),\n states: new Map(this.#states),\n claims: new Map(this.#claims),\n claimRecords: structuredClone(this.#claimRecords),\n auditLogs: structuredClone(this.#auditLogs),\n };\n try {\n return await operation(this);\n } catch (error) {\n this.#stocks.clear();\n for (const [key, value] of snapshot.stocks) this.#stocks.set(key, value);\n this.#idempotent.clear();\n for (const [key, value] of snapshot.idempotent)\n this.#idempotent.set(key, structuredClone(value));\n this.#states.clear();\n for (const [key, value] of snapshot.states) this.#states.set(key, structuredClone(value));\n this.#claims.clear();\n for (const [key, value] of snapshot.claims) this.#claims.set(key, value);\n this.#claimRecords.splice(0, this.#claimRecords.length, ...snapshot.claimRecords);\n this.#auditLogs.splice(0, this.#auditLogs.length, ...snapshot.auditLogs);\n throw error;\n }\n });\n this.#transactionTails.set(\n rallyId,\n current.then(\n () => undefined,\n () => undefined,\n ),\n );\n return current;\n }\n}\n","import type { AdminRallyConfig } from \"@stamprally/core\";\nimport type { CheckInRequest, ClaimRewardRequest } from \"./index.js\";\n\nexport interface RequestValidationError {\n readonly path: string;\n readonly message: string;\n readonly code: string;\n}\nexport type RequestValidationResult<T> =\n | { readonly success: true; readonly data: T }\n | { readonly success: false; readonly errors: ReadonlyArray<RequestValidationError> };\n\nexport class RequestValidationException extends Error {\n readonly code = \"VALIDATION_FAILED\";\n readonly errors: ReadonlyArray<RequestValidationError>;\n\n constructor(errors: ReadonlyArray<RequestValidationError>) {\n super(\"Request validation failed.\");\n this.name = \"RequestValidationException\";\n this.errors = errors;\n }\n}\n\nfunction errors(...items: ReadonlyArray<RequestValidationError>): RequestValidationResult<never> {\n return { success: false, errors: items };\n}\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction nonEmpty(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\nfunction contextErrors(value: unknown): ReadonlyArray<RequestValidationError> {\n if (!record(value) || typeof value.type !== \"string\")\n return [\n {\n path: \"proof\",\n message: \"proof is not a valid verification context.\",\n code: \"INVALID_TYPE\",\n },\n ];\n if (value.type === \"qr\" && !nonEmpty(value.token))\n return [\n { path: \"proof.token\", message: \"token must be a non-empty string.\", code: \"INVALID_TYPE\" },\n ];\n if (value.type === \"passcode\" && !nonEmpty(value.code))\n return [\n { path: \"proof.code\", message: \"code must be a non-empty string.\", code: \"INVALID_TYPE\" },\n ];\n if (value.type === \"nfc\" && !nonEmpty(value.tagId))\n return [\n { path: \"proof.tagId\", message: \"tagId must be a non-empty string.\", code: \"INVALID_TYPE\" },\n ];\n if (value.type === \"custom\")\n return \"value\" in value\n ? []\n : [{ path: \"proof.value\", message: \"value is required.\", code: \"REQUIRED\" }];\n if (value.type === \"qr\" || value.type === \"passcode\" || value.type === \"nfc\") return [];\n if (value.type !== \"gps\")\n return [{ path: \"proof.type\", message: \"Unknown verification type.\", code: \"INVALID_ENUM\" }];\n const result: RequestValidationError[] = [];\n if (typeof value.latitude !== \"number\" || !Number.isFinite(value.latitude))\n result.push({\n path: \"proof.latitude\",\n message: \"Latitude must be a finite number.\",\n code: \"INVALID_TYPE\",\n });\n else if (value.latitude < -90 || value.latitude > 90)\n result.push({\n path: \"proof.latitude\",\n message: \"Latitude must be between -90 and 90.\",\n code: \"INVALID_RANGE\",\n });\n if (typeof value.longitude !== \"number\" || !Number.isFinite(value.longitude))\n result.push({\n path: \"proof.longitude\",\n message: \"Longitude must be a finite number.\",\n code: \"INVALID_TYPE\",\n });\n else if (value.longitude < -180 || value.longitude > 180)\n result.push({\n path: \"proof.longitude\",\n message: \"Longitude must be between -180 and 180.\",\n code: \"INVALID_RANGE\",\n });\n if (\n \"radiusMeters\" in value &&\n (typeof value.radiusMeters !== \"number\" ||\n !Number.isFinite(value.radiusMeters) ||\n value.radiusMeters <= 0)\n )\n result.push({\n path: \"proof.radiusMeters\",\n message: \"Radius must be greater than zero.\",\n code: \"INVALID_RANGE\",\n });\n return result;\n}\nfunction dateInput(value: unknown): boolean {\n if (typeof value === \"number\") return Number.isInteger(value) && value > 0;\n if (typeof value !== \"string\" || value.trim() === \"\") return false;\n return (\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|[+-]\\d{2}:?\\d{2})$/.test(value) &&\n !Number.isNaN(Date.parse(value))\n );\n}\n\nfunction requiredErrors(\n value: unknown,\n fields: ReadonlyArray<string>,\n): ReadonlyArray<RequestValidationError> {\n if (record(value) && fields.every((field) => nonEmpty(value[field]))) return [];\n return fields\n .filter((field) => !record(value) || !nonEmpty(value[field]))\n .map((field) => ({\n path: field,\n message: `${field} must be a non-empty string.`,\n code: \"REQUIRED\",\n }));\n}\n\nexport function validateCheckInRequest(value: unknown): RequestValidationResult<CheckInRequest> {\n const required = requiredErrors(value, [\"rallyId\", \"spotId\", \"idempotencyKey\"]);\n if (required.length > 0) return errors(...required);\n if (!record(value))\n return errors({ path: \"$\", message: \"Expected an object.\", code: \"INVALID_TYPE\" });\n const proof = contextErrors(value.context);\n if (proof.length > 0) return errors(...proof);\n if (value.userId !== undefined && !nonEmpty(value.userId))\n return errors({ path: \"userId\", message: \"userId must be non-empty.\", code: \"INVALID_TYPE\" });\n if (value.now !== undefined && !dateInput(value.now))\n return errors({\n path: \"now\",\n message: \"now must be an ISO 8601 date or positive timestamp.\",\n code: \"INVALID_DATE\",\n });\n return { success: true, data: value as unknown as CheckInRequest };\n}\n\nexport function validateClaimRewardRequest(\n value: unknown,\n): RequestValidationResult<ClaimRewardRequest> {\n const required = requiredErrors(value, [\"rallyId\", \"rewardId\", \"idempotencyKey\"]);\n if (required.length > 0) return errors(...required);\n if (!record(value))\n return errors({ path: \"$\", message: \"Expected an object.\", code: \"INVALID_TYPE\" });\n if (value.userId !== undefined && !nonEmpty(value.userId))\n return errors({ path: \"userId\", message: \"userId must be non-empty.\", code: \"INVALID_TYPE\" });\n if (value.staffPasscode !== undefined && !nonEmpty(value.staffPasscode))\n return errors({\n path: \"staffPasscode\",\n message: \"staffPasscode must be non-empty.\",\n code: \"INVALID_TYPE\",\n });\n if (value.staffId !== undefined && !nonEmpty(value.staffId))\n return errors({ path: \"staffId\", message: \"staffId must be non-empty.\", code: \"INVALID_TYPE\" });\n if (value.now !== undefined && !dateInput(value.now))\n return errors({\n path: \"now\",\n message: \"now must be an ISO 8601 date or positive timestamp.\",\n code: \"INVALID_DATE\",\n });\n return { success: true, data: value as unknown as ClaimRewardRequest };\n}\n\nfunction uuid(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)\n );\n}\n\nfunction identityErrors(value: { readonly userId?: string; readonly anonymousSessionId?: string }) {\n const result: RequestValidationError[] = [];\n if (value.userId === undefined && value.anonymousSessionId === undefined)\n result.push({\n path: \"userId\",\n message: \"An authenticated userId or anonymousSessionId is required.\",\n code: \"REQUIRED\",\n });\n if (value.userId !== undefined && !nonEmpty(value.userId))\n result.push({ path: \"userId\", message: \"userId must be non-empty.\", code: \"INVALID_TYPE\" });\n if (value.anonymousSessionId !== undefined && !uuid(value.anonymousSessionId))\n result.push({\n path: \"anonymousSessionId\",\n message: \"anonymousSessionId must be a UUID v4.\",\n code: \"INVALID_FORMAT\",\n });\n if (\n value.userId !== undefined &&\n value.anonymousSessionId !== undefined &&\n value.userId !== value.anonymousSessionId\n )\n result.push({\n path: \"anonymousSessionId\",\n message: \"userId and anonymousSessionId must identify the same session.\",\n code: \"IDENTITY_MISMATCH\",\n });\n return result;\n}\n\nfunction directErrors(\n value: unknown,\n config: AdminRallyConfig,\n kind: \"check-in\" | \"claim\",\n): ReadonlyArray<RequestValidationError> {\n const validated =\n kind === \"check-in\" ? validateCheckInRequest(value) : validateClaimRewardRequest(value);\n if (!validated.success) return validated.errors;\n const errors: RequestValidationError[] = [];\n if (validated.data.rallyId !== config.id)\n errors.push({\n path: \"rallyId\",\n message: \"The rally does not match this server.\",\n code: \"INVALID_VALUE\",\n });\n const resourceId =\n kind === \"check-in\"\n ? (validated.data as CheckInRequest).spotId\n : (validated.data as ClaimRewardRequest).rewardId;\n const exists =\n kind === \"check-in\"\n ? config.spots.some((spot) => spot.id === resourceId)\n : config.rewards.some((reward) => reward.id === resourceId);\n if (!exists)\n errors.push({\n path: kind === \"check-in\" ? \"spotId\" : \"rewardId\",\n message: `${kind === \"check-in\" ? \"Spot\" : \"Reward\"} was not found.`,\n code: kind === \"check-in\" ? \"SPOT_NOT_FOUND\" : \"REWARD_NOT_FOUND\",\n });\n errors.push(...identityErrors(validated.data));\n return errors;\n}\n\nexport function assertValidCheckInParams(\n value: unknown,\n config: AdminRallyConfig,\n): asserts value is CheckInRequest & { readonly userId: string } {\n const errors = directErrors(value, config, \"check-in\");\n if (errors.length > 0) throw new RequestValidationException(errors);\n}\n\nexport function assertValidClaimParams(\n value: unknown,\n config: AdminRallyConfig,\n): asserts value is ClaimRewardRequest & { readonly userId: string } {\n const errors = directErrors(value, config, \"claim\");\n if (errors.length > 0) throw new RequestValidationException(errors);\n}\n\nexport function assertValidSyncParams(\n value: unknown,\n config: AdminRallyConfig,\n): asserts value is { readonly rallyId: string; readonly userId: string } {\n const validated = validateSyncRequest(value);\n const errors = validated.success\n ? [\n ...(validated.data.rallyId !== config.id\n ? [\n {\n path: \"rallyId\",\n message: \"The rally does not match this server.\",\n code: \"INVALID_VALUE\",\n },\n ]\n : []),\n ]\n : [...validated.errors];\n if (validated.success) errors.push(...identityErrors(validated.data));\n if (errors.length > 0) throw new RequestValidationException(errors);\n}\n\nexport function validateSyncRequest(value: unknown): RequestValidationResult<{\n readonly rallyId: string;\n readonly userId?: string;\n readonly anonymousSessionId?: string;\n}> {\n const required = requiredErrors(value, [\"rallyId\"]);\n if (required.length > 0) return errors(...required);\n if (!record(value))\n return errors({ path: \"$\", message: \"Expected an object.\", code: \"INVALID_TYPE\" });\n if (value.userId !== undefined && !nonEmpty(value.userId))\n return errors({ path: \"userId\", message: \"userId must be non-empty.\", code: \"INVALID_TYPE\" });\n return {\n success: true,\n data: value as {\n readonly rallyId: string;\n readonly userId?: string;\n readonly anonymousSessionId?: string;\n },\n };\n}\n","import {\n type AdminRallyConfig,\n type CheckInCondition,\n consumeReward,\n evaluateConditionDetailed,\n reconcileRewardStates,\n type UserRallyState,\n type Validator,\n type VerificationContext,\n} from \"@stamprally/core\";\nimport type {\n AuditLog,\n CheckInRequest,\n CheckInResponse,\n ClaimRewardRequest,\n ServerOptions,\n SyncOperationStatus,\n} from \"./index.js\";\nimport type { ServerPersistenceAdapter } from \"./persistence.js\";\nimport {\n assertValidCheckInParams,\n assertValidClaimParams,\n assertValidSyncParams,\n RequestValidationException,\n validateCheckInRequest,\n validateClaimRewardRequest,\n validateSyncRequest,\n} from \"./security.js\";\n\ntype ErrorResponse = { readonly ok: false; readonly code: string; readonly message: string };\ntype ClaimResponse =\n | {\n readonly ok: true;\n readonly state: UserRallyState;\n readonly claimTicketNumber?: string;\n readonly inventory?: InventoryStatus;\n }\n | ErrorResponse;\ninterface InventoryStatus {\n readonly sharedRemaining?: number;\n readonly rewardRemaining?: number;\n}\nfunction json(body: unknown, status = 200): Response {\n return new Response(JSON.stringify(body), {\n status,\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n });\n}\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction isUuidV4(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\n}\nfunction requestId(prefix: string): string {\n return `${prefix}-${globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2)}`}`;\n}\nfunction now(options: ServerOptions): string {\n return options.now?.() ?? new Date().toISOString();\n}\nfunction timestampMillis(timestamp: string): number {\n const value = Date.parse(timestamp);\n return Number.isFinite(value) ? value : Date.now();\n}\nfunction validationResponse(\n errors: ReadonlyArray<{ readonly path: string; readonly message: string; readonly code: string }>,\n): Response {\n return json(\n {\n error: \"VALIDATION_FAILED\",\n details: errors.map(({ path, message, code }) => ({ path, message, code })),\n },\n 400,\n );\n}\nfunction initialState(config: AdminRallyConfig, userId: string, timestamp: string): UserRallyState {\n return {\n rallyId: config.id,\n userId,\n records: [],\n rewards: reconcileRewardStates(config.rewards, [], 0, timestamp),\n updatedAt: timestamp,\n };\n}\ninterface InventoryPlan {\n readonly primaryKey: string;\n readonly primaryInitial: number | null;\n readonly secondaryKey?: string;\n readonly secondaryInitial?: number | null;\n}\nfunction rewardStock(\n config: AdminRallyConfig,\n rewardId: string,\n stockLimit: number | undefined,\n): number | null {\n const configured = config.inventory?.[rewardId];\n if (stockLimit === undefined) return configured ?? null;\n if (configured === undefined) return stockLimit;\n return Math.min(stockLimit, configured);\n}\nfunction sharedStock(config: AdminRallyConfig): number | null {\n return config.inventory?.sharedStock ?? config.inventory?.global ?? null;\n}\nfunction inventoryPlan(\n config: AdminRallyConfig,\n rewardId: string,\n stockLimit: number | undefined,\n): InventoryPlan {\n const individual = rewardStock(config, rewardId, stockLimit);\n const shared = sharedStock(config);\n if (config.inventoryMode === \"shared\" && shared !== null) {\n return {\n primaryKey: \"__shared__\",\n primaryInitial: shared,\n ...(individual === null ? {} : { secondaryKey: rewardId, secondaryInitial: individual }),\n };\n }\n return { primaryKey: rewardId, primaryInitial: individual };\n}\nfunction getProof(context: VerificationContext): unknown {\n return context.type === \"qr\"\n ? context.token\n : context.type === \"passcode\"\n ? context.code\n : context.type === \"gps\"\n ? { latitude: context.latitude, longitude: context.longitude }\n : context.type === \"nfc\"\n ? context.tagId\n : context.value;\n}\nasync function evaluate(\n condition: CheckInCondition,\n context: VerificationContext,\n validator: Validator | undefined,\n base: { rallyId: string; spotId: string; state: UserRallyState },\n): Promise<boolean> {\n if (condition.type !== \"custom\") return evaluateConditionDetailed(condition, context).ok;\n if (validator === undefined) return false;\n const validationContext = {\n rallyId: base.rallyId,\n spotId: base.spotId,\n proofData: getProof(context),\n condition,\n userState: base.state,\n };\n const result =\n typeof validator === \"function\"\n ? await validator(validationContext)\n : await validator.validate(validationContext);\n return result === true || (typeof result === \"object\" && result.valid);\n}\nfunction audit(\n rallyId: string,\n userId: string,\n action: AuditLog[\"action\"],\n resourceId: string,\n key: string,\n status: AuditLog[\"status\"],\n timestamp: string,\n code?: string,\n): AuditLog {\n return {\n id: requestId(\"audit\"),\n timestamp,\n rallyId,\n userId,\n action,\n resourceId,\n status,\n idempotencyKey: key,\n ...(code === undefined ? {} : { metadata: { errorCode: code } }),\n };\n}\nfunction operationStatus(result: {\n readonly ok: boolean;\n readonly code?: string;\n}): SyncOperationStatus {\n if (result.ok) return \"ACCEPTED\";\n return result.code === \"CONFLICT\" || result.code === \"PERSISTENCE_FAILED\"\n ? \"RETRYABLE_ERROR\"\n : \"REJECTED_PERMANENT\";\n}\n\nfunction withDirectIdentity<\n T extends { readonly userId?: string; readonly anonymousSessionId?: string },\n>(request: T): T & { readonly userId: string } {\n if (request.userId !== undefined) return { ...request, userId: request.userId };\n if (request.anonymousSessionId !== undefined && isUuidV4(request.anonymousSessionId))\n return { ...request, userId: request.anonymousSessionId };\n throw new RequestValidationException([\n {\n path: \"userId\",\n message: \"An authenticated userId or anonymousSessionId is required.\",\n code: \"REQUIRED\",\n },\n ]);\n}\n\nexport class StampRallyServer {\n readonly #config: AdminRallyConfig;\n readonly #persistence: ServerPersistenceAdapter;\n readonly #options: ServerOptions;\n constructor(\n config: AdminRallyConfig,\n persistence: ServerPersistenceAdapter,\n options: ServerOptions = {},\n ) {\n this.#config = config;\n this.#persistence = persistence;\n this.#options = options;\n }\n async handle(request: Request): Promise<Response> {\n if (request.method !== \"POST\")\n return json({ ok: false, code: \"METHOD_NOT_ALLOWED\", message: \"POST is required.\" }, 405);\n const path = new URL(request.url).pathname;\n if (path.endsWith(\"/check-in\")) return this.handleCheckIn(request);\n if (path.endsWith(\"/claim-reward\")) return this.handleClaimReward(request);\n if (path.endsWith(\"/sync\")) return this.handleSync(request);\n return json({ ok: false, code: \"NOT_FOUND\", message: \"Route not found.\" }, 404);\n }\n async handleCheckIn(request: Request): Promise<Response> {\n const body = validateCheckInRequest(await this.#body(request));\n if (!body.success) return validationResponse(body.errors);\n if (body.data.rallyId !== this.#config.id)\n return validationResponse([\n {\n path: \"rallyId\",\n message: \"The rally does not match this server.\",\n code: \"INVALID_VALUE\",\n },\n ]);\n const userId = await this.#user(request);\n if (userId === null)\n return json(\n { ok: false, code: \"UNAUTHENTICATED\", message: \"Authentication is required.\" },\n 401,\n );\n const sessionId = request.headers.get(\"x-anonymous-session-id\");\n let result: CheckInResponse;\n try {\n result = await this.checkIn({\n ...body.data,\n userId,\n ...(sessionId === null ? {} : { anonymousSessionId: sessionId }),\n });\n } catch (error) {\n if (error instanceof RequestValidationException) return validationResponse(error.errors);\n throw error;\n }\n return json(\n { ...result, status: operationStatus(result) },\n result.ok ? 200 : result.code === \"SPOT_NOT_FOUND\" ? 404 : 422,\n );\n }\n async handleClaimReward(request: Request): Promise<Response> {\n const body = validateClaimRewardRequest(await this.#body(request));\n if (!body.success) return validationResponse(body.errors);\n if (body.data.rallyId !== this.#config.id)\n return validationResponse([\n {\n path: \"rallyId\",\n message: \"The rally does not match this server.\",\n code: \"INVALID_VALUE\",\n },\n ]);\n const userId = await this.#user(request);\n if (userId === null)\n return json(\n { ok: false, code: \"UNAUTHENTICATED\", message: \"Authentication is required.\" },\n 401,\n );\n const sessionId = request.headers.get(\"x-anonymous-session-id\");\n let result: ClaimResponse;\n try {\n result = await this.claimReward({\n ...body.data,\n userId,\n ...(sessionId === null ? {} : { anonymousSessionId: sessionId }),\n });\n } catch (error) {\n if (error instanceof RequestValidationException) return validationResponse(error.errors);\n throw error;\n }\n return json(\n { ...result, status: operationStatus(result) },\n result.ok ? 200 : result.code === \"REWARD_NOT_FOUND\" ? 404 : 422,\n );\n }\n async handleSync(request: Request): Promise<Response> {\n const body = validateSyncRequest(await this.#body(request));\n if (!body.success) return validationResponse(body.errors);\n if (body.data.rallyId !== this.#config.id)\n return validationResponse([\n {\n path: \"rallyId\",\n message: \"The rally does not match this server.\",\n code: \"INVALID_VALUE\",\n },\n ]);\n const userId = await this.#user(request);\n if (userId === null)\n return json(\n { ok: false, code: \"UNAUTHENTICATED\", message: \"Authentication is required.\" },\n 401,\n );\n const sessionId = request.headers.get(\"x-anonymous-session-id\");\n try {\n return json({\n ok: true,\n state: await this.syncProgress({\n rallyId: body.data.rallyId,\n userId,\n ...(sessionId === null ? {} : { anonymousSessionId: sessionId }),\n }),\n });\n } catch (error) {\n if (error instanceof RequestValidationException) return validationResponse(error.errors);\n throw error;\n }\n }\n async checkIn(request: CheckInRequest): Promise<CheckInResponse> {\n const directRequest = withDirectIdentity(request);\n assertValidCheckInParams(directRequest, this.#config);\n const { userId } = directRequest;\n const key = `check-in:${request.rallyId}:${userId}:${request.idempotencyKey}`;\n const previous = await this.#persistence.getIdempotentResult<CheckInResponse>(\n request.rallyId,\n key,\n );\n if (previous !== null) return previous;\n const lockKey = `state:${request.rallyId}:${userId}`;\n if (\n !(await this.#persistence.acquireLock(\n request.rallyId,\n lockKey,\n this.#options.lockTtlMs ?? 5_000,\n ))\n )\n return { ok: false, code: \"CONFLICT\", message: \"The user state is being updated.\" };\n const timestamp = now(this.#options);\n try {\n const current =\n (await this.#persistence.getUserState(request.rallyId, userId)) ??\n initialState(this.#config, userId, timestamp);\n const responseHolder: { value: CheckInResponse | null } = { value: null };\n const makeAudit = (status: \"SUCCESS\" | \"REJECTED\", code?: string): AuditLog =>\n audit(\n request.rallyId,\n userId,\n \"CHECK_IN\",\n request.spotId,\n request.idempotencyKey,\n status,\n timestamp,\n code,\n );\n const spot = this.#config.spots.find((item) => item.id === request.spotId);\n if (spot === undefined) {\n responseHolder.value = {\n ok: false,\n code: \"SPOT_NOT_FOUND\",\n message: \"Spot was not found.\",\n };\n return await this.#rememberCheckInTransaction(\n directRequest,\n timestamp,\n key,\n current,\n {\n nextUserState: current,\n auditLog: makeAudit(\"REJECTED\", \"SPOT_NOT_FOUND\"),\n result: responseHolder.value,\n error: \"SPOT_NOT_FOUND\",\n },\n responseHolder,\n );\n }\n const rejected = (code: string, message: string) => {\n responseHolder.value = { ok: false, code, message };\n return {\n nextUserState: current,\n auditLog: makeAudit(\"REJECTED\", code),\n result: responseHolder.value,\n error: code,\n };\n };\n if (current.records.some((record) => record.stampId === request.spotId))\n return await this.#rememberCheckInTransaction(\n directRequest,\n timestamp,\n key,\n current,\n rejected(\"STAMP_ALREADY_ACQUIRED\", \"Spot was already claimed.\"),\n responseHolder,\n );\n const acquired = new Set(current.records.map((record) => record.stampId));\n if (spot.prerequisites?.some((id) => !acquired.has(id)))\n return await this.#rememberCheckInTransaction(\n directRequest,\n timestamp,\n key,\n current,\n rejected(\"PREREQUISITES_NOT_MET\", \"Prerequisite spots are not complete.\"),\n responseHolder,\n );\n for (const condition of spot.conditions)\n if (\n !(await evaluate(\n condition,\n request.context,\n condition.type === \"custom\"\n ? this.#options.customValidators?.[condition.validatorName]\n : undefined,\n { rallyId: request.rallyId, spotId: request.spotId, state: current },\n ))\n )\n return await this.#rememberCheckInTransaction(\n directRequest,\n timestamp,\n key,\n current,\n rejected(\"INVALID_PROOF\", \"Verification failed.\"),\n responseHolder,\n );\n const next: UserRallyState = {\n ...current,\n records: [...current.records, { stampId: request.spotId, acquiredAt: timestamp }],\n rewards: reconcileRewardStates(\n this.#config.rewards,\n current.rewards,\n current.records.length + 1,\n timestamp,\n ),\n updatedAt: timestamp,\n };\n responseHolder.value = { ok: true, state: next };\n const transaction = await this.#persistence.executeCheckInTransaction(\n {\n rallyId: request.rallyId,\n userId,\n spotId: request.spotId,\n timestamp: timestampMillis(timestamp),\n idempotencyKey: key,\n proofData: request.context,\n ...(this.#options.idempotencyTtlMs === undefined\n ? {}\n : { idempotencyTtlMs: this.#options.idempotencyTtlMs }),\n initialUserState: current,\n },\n () => ({\n nextUserState: next,\n auditLog: makeAudit(\"SUCCESS\"),\n result: responseHolder.value,\n }),\n );\n if (transaction.success && responseHolder.value !== null) return responseHolder.value;\n return {\n ok: false,\n code: \"PERSISTENCE_FAILED\",\n message: transaction.error ?? \"Check-in failed.\",\n };\n } finally {\n await this.#persistence.releaseLock(request.rallyId, lockKey);\n }\n }\n async claimReward(request: ClaimRewardRequest): Promise<ClaimResponse> {\n const directRequest = withDirectIdentity(request);\n assertValidClaimParams(directRequest, this.#config);\n const { userId } = directRequest;\n const key = `claim:${request.rallyId}:${userId}:${request.rewardId}:${request.idempotencyKey}`;\n const previous = await this.#persistence.getIdempotentResult<ClaimResponse>(\n request.rallyId,\n key,\n );\n if (previous !== null) return previous;\n const reward = this.#config.rewards.find((item) => item.id === request.rewardId);\n if (reward === undefined)\n return this.#rememberClaim(\n key,\n { ok: false, code: \"REWARD_NOT_FOUND\", message: \"Reward was not found.\" },\n directRequest,\n now(this.#options),\n );\n const plan = inventoryPlan(this.#config, reward.id, reward.stockLimit);\n if (\n rewardStock(this.#config, reward.id, reward.stockLimit) !== null &&\n (this.#persistence.supportsRewardStock === false ||\n typeof this.#persistence.getRewardStock !== \"function\")\n )\n return this.#rememberClaim(\n key,\n {\n ok: false,\n code: \"INVENTORY_NOT_SUPPORTED\",\n message: \"This persistence adapter cannot store per-reward inventory.\",\n },\n directRequest,\n now(this.#options),\n );\n const lockKey =\n this.#config.inventoryMode === \"shared\"\n ? \"inventory:shared\"\n : `reward:${request.rallyId}:${reward.id}`;\n if (\n !(await this.#persistence.acquireLock(\n request.rallyId,\n lockKey,\n this.#options.lockTtlMs ?? 5_000,\n ))\n )\n return { ok: false, code: \"CONFLICT\", message: \"The reward is being claimed.\" };\n const timestamp = now(this.#options);\n try {\n const checked = await this.#persistence.getIdempotentResult<ClaimResponse>(\n request.rallyId,\n key,\n );\n if (checked !== null) return checked;\n const responseHolder: { value: ClaimResponse | null } = { value: null };\n const result = await this.#persistence.executeClaimRewardTransaction(\n {\n rallyId: request.rallyId,\n userId,\n rewardId: reward.id,\n stockKey: plan.primaryKey,\n ...(plan.secondaryKey === undefined ? {} : { secondaryStockKey: plan.secondaryKey }),\n rewardStockLimit: rewardStock(this.#config, reward.id, reward.stockLimit),\n sharedStockLimit:\n this.#config.inventoryMode === \"shared\" ? sharedStock(this.#config) : null,\n initialStock: plan.primaryInitial,\n ...(plan.secondaryInitial === undefined\n ? {}\n : { initialSecondaryStock: plan.secondaryInitial }),\n ticketNumber: request.idempotencyKey,\n timestamp: Number.isNaN(Date.parse(timestamp)) ? Date.now() : Date.parse(timestamp),\n idempotencyKey: key,\n ...(request.staffPasscode === undefined ? {} : { proofData: request.staffPasscode }),\n ...(this.#options.idempotencyTtlMs === undefined\n ? {}\n : { idempotencyTtlMs: this.#options.idempotencyTtlMs }),\n initialUserState: initialState(this.#config, userId, timestamp),\n },\n ({ stock, secondaryStock, claimCount, userState }) => {\n const storedReward = userState.rewards.find((item) => item.rewardId === reward.id) ?? {\n rewardId: reward.id,\n status: \"LOCKED\" as const,\n };\n const currentReward =\n reward.redemptionMethod === \"server_claim\" &&\n storedReward.status === \"CONSUMED\" &&\n (reward.userClaimLimit === undefined || claimCount < reward.userClaimLimit)\n ? { ...storedReward, status: \"AVAILABLE\" as const }\n : storedReward;\n const makeAudit = (status: \"SUCCESS\" | \"REJECTED\", code?: string): AuditLog =>\n audit(\n request.rallyId,\n userId,\n \"CLAIM_REWARD\",\n reward.id,\n request.idempotencyKey,\n status,\n timestamp,\n code,\n );\n if ((stock !== null && stock <= 0) || (secondaryStock !== null && secondaryStock <= 0)) {\n responseHolder.value = {\n ok: false,\n code: \"OUT_OF_STOCK\",\n message: \"Reward is out of stock.\",\n };\n return {\n nextStock: stock,\n ...(plan.secondaryKey === undefined ? {} : { nextSecondaryStock: secondaryStock }),\n nextUserState: userState,\n auditLog: makeAudit(\"REJECTED\", \"OUT_OF_STOCK\"),\n result: responseHolder.value,\n error: \"OUT_OF_STOCK\",\n };\n }\n const effectiveReward =\n reward.staffPasscode === undefined && this.#config.staffPasscode !== undefined\n ? { ...reward, staffPasscode: this.#config.staffPasscode }\n : reward;\n const local = consumeReward({\n reward: effectiveReward,\n currentState: currentReward,\n now: timestamp,\n userRedemptionCount: claimCount,\n ...(request.staffPasscode === undefined\n ? {}\n : { inputPasscode: request.staffPasscode }),\n ...(request.staffId === undefined ? {} : { staffId: request.staffId }),\n });\n if (!local.ok) {\n responseHolder.value = {\n ok: false,\n code: local.error.code,\n message: \"Reward cannot be claimed.\",\n };\n return {\n nextStock: stock,\n nextUserState: userState,\n auditLog: makeAudit(\"REJECTED\", local.error.code),\n result: responseHolder.value,\n error: local.error.code,\n };\n }\n const nextRewards = userState.rewards.some((item) => item.rewardId === reward.id)\n ? userState.rewards.map((item) => (item.rewardId === reward.id ? local.value : item))\n : [...userState.rewards, local.value];\n const consumed = local.value.claimTicketNumber !== undefined;\n const nextStock = consumed && stock !== null ? Math.max(0, stock - 1) : stock;\n const nextSecondaryStock =\n consumed && secondaryStock !== null ? Math.max(0, secondaryStock - 1) : secondaryStock;\n const next: UserRallyState = {\n ...userState,\n rewards: nextRewards,\n updatedAt: timestamp,\n inventory: {\n ...(plan.primaryKey === \"__shared__\" && nextStock !== null\n ? { sharedRemaining: nextStock }\n : {}),\n ...(plan.secondaryKey !== undefined && nextSecondaryStock !== null\n ? { rewardRemaining: { [reward.id]: nextSecondaryStock } }\n : plan.primaryKey === reward.id && nextStock !== null\n ? { rewardRemaining: { [reward.id]: nextStock } }\n : {}),\n },\n };\n const inventory: InventoryStatus = {\n ...(plan.primaryKey === \"__shared__\" && nextStock !== null\n ? { sharedRemaining: nextStock }\n : {}),\n ...(plan.secondaryKey !== undefined && nextSecondaryStock !== null\n ? { rewardRemaining: nextSecondaryStock }\n : plan.primaryKey === reward.id && nextStock !== null\n ? { rewardRemaining: nextStock }\n : {}),\n };\n responseHolder.value =\n local.value.claimTicketNumber === undefined\n ? {\n ok: true,\n state: next,\n ...(Object.keys(inventory).length === 0 ? {} : { inventory }),\n }\n : {\n ok: true,\n state: next,\n claimTicketNumber: local.value.claimTicketNumber,\n ...(Object.keys(inventory).length === 0 ? {} : { inventory }),\n };\n return {\n nextStock,\n ...(plan.secondaryKey === undefined ? {} : { nextSecondaryStock }),\n nextUserState: next,\n auditLog: makeAudit(\"SUCCESS\"),\n result: responseHolder.value,\n };\n },\n );\n const response = responseHolder.value;\n if (!result.success) {\n if (response !== null && !response.ok && response.code === result.error) return response;\n if (result.error === \"INVENTORY_NOT_SUPPORTED\")\n return {\n ok: false,\n code: \"INVENTORY_NOT_SUPPORTED\",\n message: \"This persistence adapter cannot store per-reward inventory.\",\n };\n return {\n ok: false,\n code: \"PERSISTENCE_FAILED\",\n message: result.error ?? \"Reward claim failed.\",\n };\n }\n if (response !== null && result.success) return response;\n return {\n ok: false,\n code: \"PERSISTENCE_FAILED\",\n message: result.error ?? \"Reward claim failed.\",\n };\n } catch (error) {\n return {\n ok: false,\n code: \"PERSISTENCE_FAILED\",\n message: error instanceof Error ? error.message : \"Reward claim failed.\",\n };\n } finally {\n await this.#persistence.releaseLock(request.rallyId, lockKey);\n }\n }\n async sync(rallyId: string, userId: string): Promise<UserRallyState> {\n assertValidSyncParams({ rallyId, userId }, this.#config);\n const state =\n (await this.#persistence.getUserState(rallyId, userId)) ??\n initialState(this.#config, userId, now(this.#options));\n return this.#attachInventory(state);\n }\n async syncProgress(request: {\n readonly rallyId: string;\n readonly userId?: string;\n readonly anonymousSessionId?: string;\n }): Promise<UserRallyState> {\n const directRequest = withDirectIdentity(request);\n assertValidSyncParams(directRequest, this.#config);\n return this.sync(directRequest.rallyId, directRequest.userId);\n }\n async #attachInventory(state: UserRallyState): Promise<UserRallyState> {\n const rewardRemaining: Record<string, number> = {};\n for (const reward of this.#config.rewards) {\n const plan = inventoryPlan(this.#config, reward.id, reward.stockLimit);\n if (plan.secondaryKey !== undefined) {\n const stock = await this.#persistence.getRewardStock(state.rallyId, plan.secondaryKey);\n const remaining = stock ?? plan.secondaryInitial ?? null;\n if (remaining !== null) rewardRemaining[reward.id] = Math.max(0, remaining);\n } else if (plan.primaryKey !== \"__shared__\") {\n const stock = await this.#persistence.getRewardStock(state.rallyId, plan.primaryKey);\n const remaining = stock ?? plan.primaryInitial;\n if (remaining !== null) rewardRemaining[reward.id] = Math.max(0, remaining);\n }\n }\n const shared = sharedStock(this.#config);\n const storedShared = await this.#persistence.getRewardStock(state.rallyId, \"__shared__\");\n const sharedRemaining =\n this.#config.inventoryMode === \"shared\" && shared !== null\n ? Math.max(0, storedShared ?? shared)\n : undefined;\n return {\n ...state,\n ...(Object.keys(rewardRemaining).length === 0 && sharedRemaining === undefined\n ? {}\n : {\n inventory: {\n ...(sharedRemaining === undefined ? {} : { sharedRemaining }),\n ...(Object.keys(rewardRemaining).length === 0 ? {} : { rewardRemaining }),\n },\n }),\n };\n }\n async #body(request: Request): Promise<unknown> {\n try {\n const value: unknown = await request.json();\n return isObject(value) ? value : null;\n } catch {\n return null;\n }\n }\n async #user(request: Request): Promise<string | null> {\n if (this.#options.authenticate !== undefined) {\n const identity = await this.#options.authenticate(request);\n if (typeof identity === \"string\") return identity.length > 0 ? identity : null;\n if (identity === null) return null;\n const authenticatedUserId = identity.authenticatedUserId;\n return authenticatedUserId.length > 0 ? authenticatedUserId : null;\n }\n const policy = this.#options.anonymousPolicy ?? \"session_scoped\";\n if (policy === \"reject\") return null;\n const sessionId = request.headers.get(\"X-Anonymous-Session-Id\");\n if (sessionId !== null) return isUuidV4(sessionId) ? sessionId : null;\n if (policy === \"session_scoped\") return null;\n return \"anonymous\";\n }\n\n async #rememberCheckInTransaction(\n request: CheckInRequest & { readonly userId: string },\n timestamp: string,\n key: string,\n current: UserRallyState,\n mutation: {\n readonly nextUserState: UserRallyState;\n readonly auditLog: AuditLog;\n readonly result?: unknown;\n readonly error?: string;\n },\n responseHolder: { value: CheckInResponse | null },\n ): Promise<CheckInResponse> {\n const transaction = await this.#persistence.executeCheckInTransaction(\n {\n rallyId: request.rallyId,\n userId: request.userId,\n spotId: request.spotId,\n timestamp: timestampMillis(timestamp),\n idempotencyKey: key,\n ...(this.#options.idempotencyTtlMs === undefined\n ? {}\n : { idempotencyTtlMs: this.#options.idempotencyTtlMs }),\n initialUserState: current,\n },\n () => mutation,\n );\n if (\n responseHolder.value !== null &&\n (transaction.success || transaction.error === mutation.error)\n )\n return responseHolder.value;\n return {\n ok: false,\n code: \"PERSISTENCE_FAILED\",\n message: transaction.error ?? \"Check-in failed.\",\n };\n }\n async #rememberClaim(\n key: string,\n result: ClaimResponse,\n request: ClaimRewardRequest & { readonly userId: string },\n timestamp: string,\n ): Promise<ClaimResponse> {\n await this.#persistence.recordAuditLog(\n audit(\n request.rallyId,\n request.userId,\n \"CLAIM_REWARD\",\n request.rewardId,\n request.idempotencyKey,\n \"REJECTED\",\n timestamp,\n result.ok ? undefined : result.code,\n ),\n );\n await this.#persistence.saveIdempotentResult(\n request.rallyId,\n key,\n result,\n this.#options.idempotencyTtlMs ?? 86_400_000,\n );\n return result;\n }\n}\n","import type { UserRallyState } from \"@stamprally/core\";\nimport type {\n AuditLog,\n ClaimRewardTransactionMutation,\n ClaimRewardTransactionParams,\n} from \"../index.js\";\nimport type { ServerPersistenceAdapter } from \"../persistence.js\";\n\nconst state = (userId: string): UserRallyState => ({\n rallyId: \"compliance-rally\",\n userId,\n records: [],\n rewards: [{ rewardId: \"reward\", status: \"AVAILABLE\" }],\n updatedAt: \"2026-01-01T00:00:00.000Z\",\n});\n\nfunction audit(idempotencyKey: string, userId: string): AuditLog {\n return {\n id: `audit-${idempotencyKey}`,\n timestamp: \"2026-01-01T00:00:00.000Z\",\n rallyId: \"compliance-rally\",\n userId,\n action: \"CLAIM_REWARD\",\n resourceId: \"reward\",\n status: \"SUCCESS\",\n idempotencyKey,\n };\n}\n\nfunction params(userId: string, idempotencyKey: string): ClaimRewardTransactionParams {\n return {\n rallyId: \"compliance-rally\",\n userId,\n rewardId: \"reward\",\n ticketNumber: `ticket-${idempotencyKey}`,\n timestamp: Date.parse(\"2026-01-01T00:00:00.000Z\"),\n idempotencyKey,\n rewardStockLimit: 1,\n sharedStockLimit: 1,\n stockKey: \"__shared__\",\n secondaryStockKey: \"reward\",\n initialStock: 1,\n initialSecondaryStock: 1,\n initialUserState: state(userId),\n };\n}\n\nfunction mutation(current: {\n readonly stock: number | null;\n readonly secondaryStock: number | null;\n readonly userState: UserRallyState;\n}): ClaimRewardTransactionMutation {\n if (current.stock === 0 || current.secondaryStock === 0)\n return {\n nextStock: current.stock,\n nextSecondaryStock: current.secondaryStock,\n nextUserState: current.userState,\n auditLog: audit(\"rejected\", current.userState.userId ?? \"unknown\"),\n error: \"OUT_OF_STOCK\",\n };\n return {\n nextStock: current.stock === null ? null : current.stock - 1,\n nextSecondaryStock: current.secondaryStock === null ? null : current.secondaryStock - 1,\n nextUserState: {\n ...current.userState,\n rewards: [{ rewardId: \"reward\", status: \"CONSUMED\" }],\n updatedAt: \"2026-01-01T00:00:00.000Z\",\n },\n auditLog: audit(\"success\", current.userState.userId ?? \"unknown\"),\n result: { ok: true },\n };\n}\n\nfunction assert(condition: unknown, message: string): asserts condition {\n if (!condition) throw new Error(`Persistence adapter compliance failed: ${message}`);\n}\n\n/**\n * Runs the minimum atomicity and idempotency contract against a persistence adapter.\n * The function throws a descriptive error when the adapter violates the contract.\n */\nexport async function runPersistenceAdapterComplianceTests(\n createAdapter: () => Promise<ServerPersistenceAdapter>,\n): Promise<void> {\n const adapter = await createAdapter();\n assert(\n adapter.supportsRewardStock !== false,\n \"the adapter must explicitly support reward stock for this suite\",\n );\n\n const [first, second] = await Promise.all([\n adapter.executeClaimRewardTransaction(params(\"alice\", \"race-a\"), mutation),\n adapter.executeClaimRewardTransaction(params(\"bob\", \"race-b\"), mutation),\n ]);\n assert([first.success, second.success].filter(Boolean).length === 1, \"race was not serialized\");\n assert(\n (await adapter.getRewardStock(\"compliance-rally\", \"__shared__\")) === 0,\n \"shared stock was not decremented atomically\",\n );\n assert(\n (await adapter.getRewardStock(\"compliance-rally\", \"reward\")) === 0,\n \"per-reward stock was not decremented atomically\",\n );\n\n const idempotentAdapter = await createAdapter();\n const idempotentParams = params(\"alice\", \"same-key\");\n const firstClaim = await idempotentAdapter.executeClaimRewardTransaction(\n idempotentParams,\n mutation,\n );\n const secondClaim = await idempotentAdapter.executeClaimRewardTransaction(\n idempotentParams,\n mutation,\n );\n assert(firstClaim.success && secondClaim.success, \"idempotent claim did not remain successful\");\n assert(\n (await idempotentAdapter.getRewardStock(\"compliance-rally\", \"__shared__\")) === 0,\n \"idempotent retry decremented shared stock twice\",\n );\n\n const rollbackAdapter = await createAdapter();\n const rollbackParams = params(\"alice\", \"rollback\");\n const rollback = await rollbackAdapter.executeClaimRewardTransaction(rollbackParams, () => {\n throw new Error(\"forced rollback\");\n });\n assert(!rollback.success, \"a failed mutation was committed\");\n assert(\n (await rollbackAdapter.getRewardStock(\"compliance-rally\", \"__shared__\")) === null,\n \"rollback changed shared stock\",\n );\n assert(\n (await rollbackAdapter.getRewardStock(\"compliance-rally\", \"reward\")) === null,\n \"rollback changed per-reward stock\",\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/examples/transaction.ts","../src/persistence.ts","../src/security.ts","../src/server.ts","../src/testing/compliance.ts"],"names":["params","mutation","rewardStock","now","sharedStock","state","record","errors","audit"],"mappings":"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","file":"index.js","sourcesContent":["import type { UserRallyState } from \"@stamprally/core\";\nimport type { AuditLog } from \"../index.js\";\nimport type {\n CheckInTransactionMutation,\n CheckInTransactionParams,\n ClaimRewardMutationContext,\n ClaimRewardTransactionMutation,\n ClaimRewardTransactionParams,\n} from \"../persistence.js\";\n\n/**\n * Minimal database contract for the SQL reference implementation.\n *\n * `readContext` should use SELECT ... FOR UPDATE for the stock, claim-count,\n * and user-state rows. The adapter's transaction implementation must commit\n * or roll back every operation performed through the transaction handle.\n */\nexport interface SqlTransactionDatabase<Tx> {\n transaction<T>(operation: (transaction: Tx) => Promise<T>): Promise<T>;\n}\n\nexport interface SqlClaimRewardStore<Tx> {\n readContext(\n transaction: Tx,\n params: ClaimRewardTransactionParams,\n ): Promise<{\n readonly stock: number | null;\n readonly secondaryStock?: number | null;\n readonly claimCount: number;\n readonly userState: UserRallyState;\n }>;\n writeStock(\n transaction: Tx,\n params: ClaimRewardTransactionParams,\n nextStock: number,\n ): Promise<void>;\n writeSecondaryStock?(\n transaction: Tx,\n params: ClaimRewardTransactionParams,\n nextStock: number,\n ): Promise<void>;\n writeUserState(\n transaction: Tx,\n params: ClaimRewardTransactionParams,\n state: UserRallyState,\n ): Promise<void>;\n writeClaimRecord(\n transaction: Tx,\n params: ClaimRewardTransactionParams,\n state: UserRallyState,\n ): Promise<void>;\n writeAudit(transaction: Tx, log: AuditLog): Promise<void>;\n writeIdempotency(\n transaction: Tx,\n params: ClaimRewardTransactionParams,\n result: unknown,\n ): Promise<void>;\n}\n\n/**\n * Reference implementation for PostgreSQL, MySQL, or another transactional\n * SQL store. Domain rejections still write their audit/idempotency records,\n * while unexpected write failures reject the transaction and roll everything\n * back.\n */\nexport async function executeClaimRewardTransaction<Tx>(\n database: SqlTransactionDatabase<Tx>,\n store: SqlClaimRewardStore<Tx>,\n params: ClaimRewardTransactionParams,\n mutation: (current: ClaimRewardMutationContext) => ClaimRewardTransactionMutation,\n): Promise<{ readonly success: boolean; readonly error?: string }> {\n try {\n return await database.transaction(async (transaction) => {\n const current = await store.readContext(transaction, params);\n const secondaryStock = current.secondaryStock ?? null;\n const rewardStock = params.stockKey === \"__shared__\" ? secondaryStock : current.stock;\n const next = mutation({\n ...current,\n rewardStock,\n sharedStock: params.stockKey === \"__shared__\" ? current.stock : null,\n primaryStock: rewardStock,\n secondaryStock,\n stock: current.stock,\n });\n if (next.error !== undefined) {\n await store.writeAudit(transaction, next.auditLog);\n if (params.idempotencyKey !== undefined && next.result !== undefined)\n await store.writeIdempotency(transaction, params, next.result);\n return { success: false, error: next.error };\n }\n if (next.nextSecondaryStock !== undefined && store.writeSecondaryStock === undefined)\n return { success: false, error: \"INVENTORY_STORAGE_NOT_IMPLEMENTED\" };\n if (next.nextStock !== null) await store.writeStock(transaction, params, next.nextStock);\n if (next.nextSecondaryStock !== undefined && store.writeSecondaryStock !== undefined) {\n if (next.nextSecondaryStock !== null)\n await store.writeSecondaryStock(transaction, params, next.nextSecondaryStock);\n }\n await store.writeUserState(transaction, params, next.nextUserState);\n await store.writeClaimRecord(transaction, params, next.nextUserState);\n await store.writeAudit(transaction, next.auditLog);\n if (params.idempotencyKey !== undefined && next.result !== undefined)\n await store.writeIdempotency(transaction, params, next.result);\n return { success: true };\n });\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n}\n\nexport interface SqlCheckInStore<Tx> {\n readUserState?(transaction: Tx, params: CheckInTransactionParams): Promise<UserRallyState>;\n writeUserState(\n transaction: Tx,\n params: CheckInTransactionParams,\n state: UserRallyState,\n ): Promise<void>;\n writeAudit(transaction: Tx, log: AuditLog): Promise<void>;\n writeIdempotency(\n transaction: Tx,\n params: CheckInTransactionParams,\n result: unknown,\n ): Promise<void>;\n}\n\n/** Reference transaction block for a check-in state, audit, and idempotency write. */\nexport async function executeCheckInTransaction<Tx>(\n database: SqlTransactionDatabase<Tx>,\n store: SqlCheckInStore<Tx>,\n params: CheckInTransactionParams,\n mutation: (current: { readonly userState: UserRallyState }) => CheckInTransactionMutation,\n current?: UserRallyState,\n): Promise<{ readonly success: boolean; readonly error?: string }> {\n try {\n return await database.transaction(async (transaction) => {\n const userState =\n current ??\n (store.readUserState === undefined\n ? (() => {\n throw new Error(\"A current user state or readUserState implementation is required.\");\n })()\n : await store.readUserState(transaction, params));\n const next = mutation({ userState });\n if (next.error !== undefined) {\n await store.writeAudit(transaction, next.auditLog);\n if (params.idempotencyKey !== undefined && next.result !== undefined)\n await store.writeIdempotency(transaction, params, next.result);\n return { success: false, error: next.error };\n }\n await store.writeUserState(transaction, params, next.nextUserState);\n await store.writeAudit(transaction, next.auditLog);\n if (params.idempotencyKey !== undefined && next.result !== undefined)\n await store.writeIdempotency(transaction, params, next.result);\n return { success: true };\n });\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n}\n\nexport interface RedisMultiExecutor<TMulti> {\n multi(): TMulti;\n exec(multi: TMulti): Promise<ReadonlyArray<unknown> | null>;\n}\n\n/** Reference for Redis MULTI/EXEC adapters: all queued commands commit together. */\nexport async function executeRedisTransaction<TMulti>(\n redis: RedisMultiExecutor<TMulti>,\n queue: (multi: TMulti) => void,\n): Promise<{ readonly success: boolean; readonly error?: string }> {\n try {\n const multi = redis.multi();\n queue(multi);\n const result = await redis.exec(multi);\n return result === null\n ? { success: false, error: \"Redis transaction was aborted.\" }\n : { success: true };\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n}\n","import type { UserRallyState } from \"@stamprally/core\";\nimport type { AuditLog } from \"./index.js\";\n\nexport interface UserClaimRecord {\n readonly rallyId: string;\n readonly userId: string;\n readonly rewardId: string;\n readonly ticketNumber: string;\n readonly timestamp: number;\n}\n\nexport interface ClaimRewardTransactionParams {\n readonly rallyId: string;\n readonly userId: string;\n readonly rewardId: string;\n readonly ticketNumber: string;\n readonly timestamp: number;\n readonly idempotencyKey?: string;\n readonly proofData?: unknown;\n readonly idempotencyTtlMs?: number;\n /** The configured per-reward stock limit, or null for unlimited stock. */\n readonly rewardStockLimit: number | null;\n /** The configured shared stock limit, or null when shared inventory is disabled. */\n readonly sharedStockLimit: number | null;\n /** Used when the first claim is made before a user state has been stored. */\n readonly initialUserState?: UserRallyState;\n readonly stockKey?: string;\n readonly secondaryStockKey?: string;\n readonly initialStock?: number | null;\n readonly initialSecondaryStock?: number | null;\n}\n\nexport interface ClaimRewardTransactionMutation {\n readonly nextStock: number | null;\n readonly nextSecondaryStock?: number | null;\n readonly nextUserState: UserRallyState;\n readonly auditLog: AuditLog;\n /** The server response is persisted by the adapter with the idempotency key. */\n readonly result?: unknown;\n /** A domain rejection is committed as an audit/idempotency record without mutations. */\n readonly error?: string;\n}\n\nexport interface ClaimRewardMutationContext {\n readonly rewardStock: number | null;\n readonly sharedStock: number | null;\n readonly primaryStock: number | null;\n readonly secondaryStock: number | null;\n /** @deprecated Use rewardStock. */\n readonly stock: number | null;\n readonly claimCount: number;\n readonly userState: UserRallyState;\n}\n\nexport interface CheckInTransactionParams {\n readonly rallyId: string;\n readonly userId: string;\n readonly spotId: string;\n readonly timestamp: number;\n readonly idempotencyKey?: string;\n readonly proofData?: unknown;\n readonly idempotencyTtlMs?: number;\n readonly initialUserState?: UserRallyState;\n}\n\nexport interface CheckInTransactionMutation {\n readonly nextUserState: UserRallyState;\n readonly auditLog: AuditLog;\n readonly result?: unknown;\n readonly error?: string;\n}\n\nexport interface ServerPersistenceAdapter {\n /** Atomically commits user state, audit log, and idempotency data. */\n executeCheckInTransaction(\n params: CheckInTransactionParams,\n mutation: (current: { readonly userState: UserRallyState }) => CheckInTransactionMutation,\n ): Promise<{ readonly success: boolean; readonly error?: string }>;\n /**\n * Atomically commits stock, user state, claim count, audit log, and idempotency data.\n * Adapters must roll back every write when the callback or any commit operation fails.\n */\n executeClaimRewardTransaction(\n params: ClaimRewardTransactionParams,\n mutation: (current: ClaimRewardMutationContext) => ClaimRewardTransactionMutation,\n ): Promise<{ readonly success: boolean; readonly error?: string }>;\n /** Set false when the adapter cannot persist per-reward inventory atomically. */\n readonly supportsRewardStock?: boolean;\n /** Must be true when a claim plan uses `secondaryStockKey`. */\n readonly supportsSecondaryStock?: boolean;\n acquireLock(rallyId: string, lockKey: string, ttlMs: number): Promise<boolean>;\n releaseLock(rallyId: string, lockKey: string): Promise<void>;\n getRewardStock(rallyId: string, rewardId: string): Promise<number | null>;\n decrementRewardStock(\n rallyId: string,\n rewardId: string,\n ): Promise<{ readonly success: boolean; readonly remainingStock: number }>;\n getIdempotentResult<T>(rallyId: string, key: string): Promise<T | null>;\n saveIdempotentResult<T>(rallyId: string, key: string, result: T, ttlMs: number): Promise<void>;\n getUserClaimCount(rallyId: string, userId: string, rewardId: string): Promise<number>;\n recordUserClaim(params: UserClaimRecord): Promise<void>;\n recordClaim?(params: UserClaimRecord): Promise<void>;\n incrementUserClaimCount?(rallyId: string, userId: string, rewardId: string): Promise<void>;\n getUserState(rallyId: string, userId: string): Promise<UserRallyState | null>;\n saveUserState(rallyId: string, userId: string, state: UserRallyState): Promise<void>;\n recordAuditLog(log: AuditLog): Promise<void>;\n removeAuditLog?(auditId: string): Promise<void>;\n}\ninterface TimedValue<T> {\n readonly value: T;\n readonly expiresAt: number;\n}\nexport interface InMemoryServerPersistenceOptions {\n readonly stocks?: Readonly<Record<string, number>>;\n}\nexport class InMemoryServerPersistenceAdapter implements ServerPersistenceAdapter {\n readonly supportsRewardStock: boolean = true;\n readonly supportsSecondaryStock: boolean = true;\n readonly #locks = new Map<string, number>();\n readonly #idempotent = new Map<string, TimedValue<unknown>>();\n readonly #states = new Map<string, UserRallyState>();\n readonly #stocks: Map<string, number>;\n readonly #stockDefaults: Map<string, number>;\n readonly #claims = new Map<string, number>();\n readonly #claimRecords: UserClaimRecord[] = [];\n readonly #auditLogs: AuditLog[] = [];\n readonly #transactionTails = new Map<string, Promise<void>>();\n constructor(options: InMemoryServerPersistenceOptions = {}) {\n this.#stocks = new Map();\n this.#stockDefaults = new Map();\n for (const [key, stock] of Object.entries(options.stocks ?? {})) {\n if (key.includes(\":\")) this.#stocks.set(key, stock);\n else this.#stockDefaults.set(key, stock);\n }\n }\n #key(rallyId: string, key: string): string {\n return `${rallyId}:${key}`;\n }\n #stockKey(rallyId: string, rewardId: string): string {\n const scopedKey = `${rallyId}:${rewardId}`;\n if (this.#stocks.has(scopedKey)) return scopedKey;\n const defaultStock = this.#stockDefaults.get(rewardId);\n if (defaultStock !== undefined) {\n this.#stocks.set(scopedKey, defaultStock);\n return scopedKey;\n }\n return scopedKey;\n }\n async acquireLock(rallyId: string, key: string, ttlMs: number): Promise<boolean> {\n const scopedKey = this.#key(rallyId, key);\n const now = Date.now();\n const until = this.#locks.get(scopedKey);\n if (until !== undefined && until > now) return false;\n this.#locks.set(scopedKey, now + Math.max(1, ttlMs));\n return true;\n }\n async releaseLock(rallyId: string, key: string): Promise<void> {\n this.#locks.delete(this.#key(rallyId, key));\n }\n async getRewardStock(rallyId: string, rewardId: string): Promise<number | null> {\n return this.#stocks.get(this.#stockKey(rallyId, rewardId)) ?? null;\n }\n async decrementRewardStock(\n rallyId: string,\n rewardId: string,\n ): Promise<{ success: boolean; remainingStock: number }> {\n const key = this.#stockKey(rallyId, rewardId);\n const current = this.#stocks.get(key);\n if (current === undefined) return { success: true, remainingStock: Number.POSITIVE_INFINITY };\n if (current <= 0) return { success: false, remainingStock: 0 };\n this.#stocks.set(key, current - 1);\n return { success: true, remainingStock: current - 1 };\n }\n async restoreRewardStock(rallyId: string, rewardId: string, count = 1): Promise<void> {\n const key = this.#stockKey(rallyId, rewardId);\n const current = this.#stocks.get(key);\n if (current !== undefined) this.#stocks.set(key, current + Math.max(0, count));\n }\n\n async executeClaimRewardTransaction(\n params: ClaimRewardTransactionParams,\n mutation: (current: ClaimRewardMutationContext) => ClaimRewardTransactionMutation,\n ): Promise<{ readonly success: boolean; readonly error?: string }> {\n try {\n const initialStock =\n params.initialStock !== undefined\n ? params.initialStock\n : params.stockKey === \"__shared__\"\n ? params.sharedStockLimit\n : params.rewardStockLimit;\n const initialSecondaryStock =\n params.initialSecondaryStock !== undefined\n ? params.initialSecondaryStock\n : params.rewardStockLimit;\n return await this.runTransaction(params.rallyId, async () => {\n if (params.idempotencyKey !== undefined) {\n const previous = await this.getIdempotentResult<unknown>(\n params.rallyId,\n params.idempotencyKey,\n );\n if (previous !== null) return { success: true };\n }\n const userState =\n (await this.getUserState(params.rallyId, params.userId)) ?? params.initialUserState;\n if (userState === undefined)\n return { success: false, error: \"A user state is required for this transaction.\" };\n const storedStock = await this.getRewardStock(\n params.rallyId,\n params.stockKey ?? params.rewardId,\n );\n const storedSecondaryStock =\n params.secondaryStockKey === undefined\n ? null\n : await this.getRewardStock(params.rallyId, params.secondaryStockKey);\n const stock = storedStock ?? initialStock;\n const secondaryStock = storedSecondaryStock ?? initialSecondaryStock;\n const rewardStock = params.stockKey === \"__shared__\" ? secondaryStock : stock;\n const sharedStock = params.stockKey === \"__shared__\" ? stock : null;\n const mutationResult = mutation({\n rewardStock,\n sharedStock,\n primaryStock: rewardStock,\n secondaryStock,\n stock,\n claimCount: await this.getUserClaimCount(params.rallyId, params.userId, params.rewardId),\n userState,\n });\n const idempotencyKey = params.idempotencyKey;\n if (mutationResult.error !== undefined) {\n await this.recordAuditLog(mutationResult.auditLog);\n if (idempotencyKey !== undefined && mutationResult.result !== undefined)\n await this.saveIdempotentResult(\n params.rallyId,\n idempotencyKey,\n mutationResult.result,\n params.idempotencyTtlMs ?? 86_400_000,\n );\n return { success: false, error: mutationResult.error };\n }\n const currentStock = await this.getRewardStock(\n params.rallyId,\n params.stockKey ?? params.rewardId,\n );\n const effectiveStock = currentStock ?? initialStock;\n if (currentStock === null && initialStock !== undefined && initialStock !== null)\n this.#stocks.set(\n this.#stockKey(params.rallyId, params.stockKey ?? params.rewardId),\n initialStock,\n );\n const currentSecondaryStock =\n params.secondaryStockKey === undefined\n ? null\n : await this.getRewardStock(params.rallyId, params.secondaryStockKey);\n const effectiveSecondaryStock = currentSecondaryStock ?? initialSecondaryStock;\n if (\n currentSecondaryStock === null &&\n params.secondaryStockKey !== undefined &&\n initialSecondaryStock !== undefined &&\n initialSecondaryStock !== null\n )\n this.#stocks.set(\n this.#stockKey(params.rallyId, params.secondaryStockKey),\n initialSecondaryStock,\n );\n if (\n effectiveStock !== null &&\n (mutationResult.nextStock === null || mutationResult.nextStock < 0)\n )\n throw new Error(\"The transaction produced an invalid stock value.\");\n if (effectiveStock === null && mutationResult.nextStock !== null)\n throw new Error(\"The transaction changed an unlimited stock to a limited stock.\");\n if (mutationResult.nextStock !== null)\n this.#stocks.set(\n this.#stockKey(params.rallyId, params.stockKey ?? params.rewardId),\n mutationResult.nextStock,\n );\n if (\n params.secondaryStockKey !== undefined &&\n mutationResult.nextSecondaryStock !== undefined\n ) {\n if (\n effectiveSecondaryStock !== null &&\n (mutationResult.nextSecondaryStock === null || mutationResult.nextSecondaryStock < 0)\n )\n throw new Error(\"The transaction produced an invalid secondary stock value.\");\n if (effectiveSecondaryStock === null && mutationResult.nextSecondaryStock !== null)\n throw new Error(\n \"The transaction changed an unlimited secondary stock to a limited stock.\",\n );\n if (mutationResult.nextSecondaryStock !== null)\n this.#stocks.set(\n this.#stockKey(params.rallyId, params.secondaryStockKey),\n mutationResult.nextSecondaryStock,\n );\n }\n await this.saveUserState(params.rallyId, params.userId, mutationResult.nextUserState);\n const reward = mutationResult.nextUserState.rewards.find(\n (item) => item.rewardId === params.rewardId,\n );\n if (reward?.claimTicketNumber !== undefined)\n await this.recordUserClaim({\n rallyId: params.rallyId,\n userId: params.userId,\n rewardId: params.rewardId,\n ticketNumber: reward.claimTicketNumber,\n timestamp: params.timestamp,\n });\n await this.recordAuditLog(mutationResult.auditLog);\n if (idempotencyKey !== undefined && mutationResult.result !== undefined)\n await this.saveIdempotentResult(\n params.rallyId,\n idempotencyKey,\n mutationResult.result,\n params.idempotencyTtlMs ?? 86_400_000,\n );\n return { success: true };\n });\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n\n async executeCheckInTransaction(\n params: CheckInTransactionParams,\n mutation: (current: { readonly userState: UserRallyState }) => CheckInTransactionMutation,\n ): Promise<{ readonly success: boolean; readonly error?: string }> {\n try {\n return await this.runTransaction(params.rallyId, async () => {\n const userState =\n (await this.getUserState(params.rallyId, params.userId)) ?? params.initialUserState;\n if (userState === undefined)\n return { success: false, error: \"A user state is required for this transaction.\" };\n const mutationResult = mutation({ userState });\n if (mutationResult.error !== undefined) {\n await this.recordAuditLog(mutationResult.auditLog);\n if (params.idempotencyKey !== undefined && mutationResult.result !== undefined)\n await this.saveIdempotentResult(\n params.rallyId,\n params.idempotencyKey,\n mutationResult.result,\n params.idempotencyTtlMs ?? 86_400_000,\n );\n return { success: false, error: mutationResult.error };\n }\n await this.saveUserState(params.rallyId, params.userId, mutationResult.nextUserState);\n await this.recordAuditLog(mutationResult.auditLog);\n if (params.idempotencyKey !== undefined && mutationResult.result !== undefined)\n await this.saveIdempotentResult(\n params.rallyId,\n params.idempotencyKey,\n mutationResult.result,\n params.idempotencyTtlMs ?? 86_400_000,\n );\n return { success: true };\n });\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n\n async rollbackUserState(\n rallyId: string,\n userId: string,\n previousState: UserRallyState | null,\n ): Promise<void> {\n const key = `${rallyId}:${userId}`;\n if (previousState === null) this.#states.delete(key);\n else this.#states.set(key, structuredClone(previousState));\n }\n async getIdempotentResult<T>(rallyId: string, key: string): Promise<T | null> {\n const value = this.#idempotent.get(this.#key(rallyId, key));\n if (value === undefined || value.expiresAt <= Date.now()) {\n this.#idempotent.delete(this.#key(rallyId, key));\n return null;\n }\n return structuredClone(value.value) as T;\n }\n async saveIdempotentResult<T>(\n rallyId: string,\n key: string,\n result: T,\n ttlMs: number,\n ): Promise<void> {\n this.#idempotent.set(this.#key(rallyId, key), {\n value: structuredClone(result),\n expiresAt: Date.now() + Math.max(1, ttlMs),\n });\n }\n async getUserClaimCount(rallyId: string, userId: string, rewardId: string): Promise<number> {\n return this.#claims.get(`${rallyId}:${userId}:${rewardId}`) ?? 0;\n }\n async getUserState(rallyId: string, userId: string): Promise<UserRallyState | null> {\n const value = this.#states.get(`${rallyId}:${userId}`);\n return value === undefined ? null : structuredClone(value);\n }\n async saveUserState(rallyId: string, userId: string, state: UserRallyState): Promise<void> {\n this.#states.set(`${rallyId}:${userId}`, structuredClone(state));\n }\n async recordAuditLog(log: AuditLog): Promise<void> {\n this.#auditLogs.push(structuredClone(log));\n }\n async removeAuditLog(auditId: string): Promise<void> {\n const index = this.#auditLogs.findIndex((log) => log.id === auditId);\n if (index >= 0) this.#auditLogs.splice(index, 1);\n }\n getAuditLogs(): ReadonlyArray<AuditLog> {\n return structuredClone(this.#auditLogs);\n }\n async recordUserClaim(params: UserClaimRecord): Promise<void> {\n const { rallyId, userId, rewardId } = params;\n const key = `${rallyId}:${userId}:${rewardId}`;\n this.#claims.set(key, (this.#claims.get(key) ?? 0) + 1);\n this.#claimRecords.push(structuredClone(params));\n }\n async rollbackUserClaim(\n rallyId: string,\n userId: string,\n rewardId: string,\n ticketNumber: string,\n ): Promise<void> {\n const key = `${rallyId}:${userId}:${rewardId}`;\n const count = this.#claims.get(key) ?? 0;\n if (count <= 1) this.#claims.delete(key);\n else this.#claims.set(key, count - 1);\n const index = this.#claimRecords.findIndex(\n (record) =>\n record.rallyId === rallyId &&\n record.userId === userId &&\n record.rewardId === rewardId &&\n record.ticketNumber === ticketNumber,\n );\n if (index >= 0) this.#claimRecords.splice(index, 1);\n }\n async incrementUserClaimCount(rallyId: string, userId: string, rewardId: string): Promise<void> {\n const key = `${rallyId}:${userId}:${rewardId}`;\n this.#claims.set(key, (this.#claims.get(key) ?? 0) + 1);\n }\n getClaimRecords(): ReadonlyArray<UserClaimRecord> {\n return structuredClone(this.#claimRecords);\n }\n /** @deprecated Use recordUserClaim with a ticket number and timestamp. */\n recordClaim(params: UserClaimRecord): Promise<void>;\n recordClaim(rallyId: string, userId: string, rewardId: string): Promise<void>;\n recordClaim(\n paramsOrRallyId: UserClaimRecord | string,\n userId?: string,\n rewardId?: string,\n ): Promise<void> {\n const params: UserClaimRecord =\n typeof paramsOrRallyId === \"string\"\n ? {\n rallyId: paramsOrRallyId,\n userId: userId ?? \"\",\n rewardId: rewardId ?? \"\",\n ticketNumber: \"\",\n timestamp: Date.now(),\n }\n : paramsOrRallyId;\n return this.recordUserClaim(params);\n }\n\n async runTransaction<T>(\n rallyId: string,\n operation: (transaction: ServerPersistenceAdapter) => Promise<T>,\n ): Promise<T> {\n const previous = this.#transactionTails.get(rallyId) ?? Promise.resolve();\n const current = previous.then(async () => {\n const snapshot = {\n stocks: new Map(this.#stocks),\n idempotent: new Map(this.#idempotent),\n states: new Map(this.#states),\n claims: new Map(this.#claims),\n claimRecords: structuredClone(this.#claimRecords),\n auditLogs: structuredClone(this.#auditLogs),\n };\n try {\n return await operation(this);\n } catch (error) {\n this.#stocks.clear();\n for (const [key, value] of snapshot.stocks) this.#stocks.set(key, value);\n this.#idempotent.clear();\n for (const [key, value] of snapshot.idempotent)\n this.#idempotent.set(key, structuredClone(value));\n this.#states.clear();\n for (const [key, value] of snapshot.states) this.#states.set(key, structuredClone(value));\n this.#claims.clear();\n for (const [key, value] of snapshot.claims) this.#claims.set(key, value);\n this.#claimRecords.splice(0, this.#claimRecords.length, ...snapshot.claimRecords);\n this.#auditLogs.splice(0, this.#auditLogs.length, ...snapshot.auditLogs);\n throw error;\n }\n });\n this.#transactionTails.set(\n rallyId,\n current.then(\n () => undefined,\n () => undefined,\n ),\n );\n return current;\n }\n}\n","import type { AdminRallyConfig } from \"@stamprally/core\";\nimport type { CheckInRequest, ClaimRewardRequest } from \"./index.js\";\n\nexport interface RequestValidationError {\n readonly path: string;\n readonly message: string;\n readonly code: string;\n}\nexport type RequestValidationResult<T> =\n | { readonly success: true; readonly data: T }\n | { readonly success: false; readonly errors: ReadonlyArray<RequestValidationError> };\n\nexport class RequestValidationException extends Error {\n readonly code = \"VALIDATION_FAILED\";\n readonly errors: ReadonlyArray<RequestValidationError>;\n\n constructor(errors: ReadonlyArray<RequestValidationError>) {\n super(\"Request validation failed.\");\n this.name = \"RequestValidationException\";\n this.errors = errors;\n }\n}\n\nfunction errors(...items: ReadonlyArray<RequestValidationError>): RequestValidationResult<never> {\n return { success: false, errors: items };\n}\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction nonEmpty(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\nfunction contextErrors(value: unknown): ReadonlyArray<RequestValidationError> {\n if (!record(value) || typeof value.type !== \"string\")\n return [\n {\n path: \"proof\",\n message: \"proof is not a valid verification context.\",\n code: \"INVALID_TYPE\",\n },\n ];\n if (value.type === \"qr\" && !nonEmpty(value.token))\n return [\n { path: \"proof.token\", message: \"token must be a non-empty string.\", code: \"INVALID_TYPE\" },\n ];\n if (value.type === \"passcode\" && !nonEmpty(value.code))\n return [\n { path: \"proof.code\", message: \"code must be a non-empty string.\", code: \"INVALID_TYPE\" },\n ];\n if (value.type === \"nfc\" && !nonEmpty(value.tagId))\n return [\n { path: \"proof.tagId\", message: \"tagId must be a non-empty string.\", code: \"INVALID_TYPE\" },\n ];\n if (value.type === \"custom\")\n return \"value\" in value\n ? []\n : [{ path: \"proof.value\", message: \"value is required.\", code: \"REQUIRED\" }];\n if (value.type === \"qr\" || value.type === \"passcode\" || value.type === \"nfc\") return [];\n if (value.type !== \"gps\")\n return [{ path: \"proof.type\", message: \"Unknown verification type.\", code: \"INVALID_ENUM\" }];\n const result: RequestValidationError[] = [];\n if (typeof value.latitude !== \"number\" || !Number.isFinite(value.latitude))\n result.push({\n path: \"proof.latitude\",\n message: \"Latitude must be a finite number.\",\n code: \"INVALID_TYPE\",\n });\n else if (value.latitude < -90 || value.latitude > 90)\n result.push({\n path: \"proof.latitude\",\n message: \"Latitude must be between -90 and 90.\",\n code: \"INVALID_RANGE\",\n });\n if (typeof value.longitude !== \"number\" || !Number.isFinite(value.longitude))\n result.push({\n path: \"proof.longitude\",\n message: \"Longitude must be a finite number.\",\n code: \"INVALID_TYPE\",\n });\n else if (value.longitude < -180 || value.longitude > 180)\n result.push({\n path: \"proof.longitude\",\n message: \"Longitude must be between -180 and 180.\",\n code: \"INVALID_RANGE\",\n });\n if (\n \"radiusMeters\" in value &&\n (typeof value.radiusMeters !== \"number\" ||\n !Number.isFinite(value.radiusMeters) ||\n value.radiusMeters <= 0)\n )\n result.push({\n path: \"proof.radiusMeters\",\n message: \"Radius must be greater than zero.\",\n code: \"INVALID_RANGE\",\n });\n return result;\n}\nfunction dateInput(value: unknown): boolean {\n if (typeof value === \"number\") return Number.isInteger(value) && value > 0;\n if (typeof value !== \"string\" || value.trim() === \"\") return false;\n return (\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|[+-]\\d{2}:?\\d{2})$/.test(value) &&\n !Number.isNaN(Date.parse(value))\n );\n}\n\nfunction requiredErrors(\n value: unknown,\n fields: ReadonlyArray<string>,\n): ReadonlyArray<RequestValidationError> {\n if (record(value) && fields.every((field) => nonEmpty(value[field]))) return [];\n return fields\n .filter((field) => !record(value) || !nonEmpty(value[field]))\n .map((field) => ({\n path: field,\n message: `${field} must be a non-empty string.`,\n code: \"REQUIRED\",\n }));\n}\n\nexport function validateCheckInRequest(value: unknown): RequestValidationResult<CheckInRequest> {\n const required = requiredErrors(value, [\"rallyId\", \"spotId\", \"idempotencyKey\"]);\n if (required.length > 0) return errors(...required);\n if (!record(value))\n return errors({ path: \"$\", message: \"Expected an object.\", code: \"INVALID_TYPE\" });\n const proof = contextErrors(value.context);\n if (proof.length > 0) return errors(...proof);\n if (value.userId !== undefined && !nonEmpty(value.userId))\n return errors({ path: \"userId\", message: \"userId must be non-empty.\", code: \"INVALID_TYPE\" });\n if (value.now !== undefined && !dateInput(value.now))\n return errors({\n path: \"now\",\n message: \"now must be an ISO 8601 date or positive timestamp.\",\n code: \"INVALID_DATE\",\n });\n return { success: true, data: value as unknown as CheckInRequest };\n}\n\nexport function validateClaimRewardRequest(\n value: unknown,\n): RequestValidationResult<ClaimRewardRequest> {\n const required = requiredErrors(value, [\"rallyId\", \"rewardId\", \"idempotencyKey\"]);\n if (required.length > 0) return errors(...required);\n if (!record(value))\n return errors({ path: \"$\", message: \"Expected an object.\", code: \"INVALID_TYPE\" });\n if (value.userId !== undefined && !nonEmpty(value.userId))\n return errors({ path: \"userId\", message: \"userId must be non-empty.\", code: \"INVALID_TYPE\" });\n if (value.staffPasscode !== undefined && !nonEmpty(value.staffPasscode))\n return errors({\n path: \"staffPasscode\",\n message: \"staffPasscode must be non-empty.\",\n code: \"INVALID_TYPE\",\n });\n if (value.staffId !== undefined && !nonEmpty(value.staffId))\n return errors({ path: \"staffId\", message: \"staffId must be non-empty.\", code: \"INVALID_TYPE\" });\n if (value.now !== undefined && !dateInput(value.now))\n return errors({\n path: \"now\",\n message: \"now must be an ISO 8601 date or positive timestamp.\",\n code: \"INVALID_DATE\",\n });\n return { success: true, data: value as unknown as ClaimRewardRequest };\n}\n\nfunction uuid(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)\n );\n}\n\nfunction identityErrors(value: { readonly userId?: string; readonly anonymousSessionId?: string }) {\n const result: RequestValidationError[] = [];\n if (value.userId === undefined && value.anonymousSessionId === undefined)\n result.push({\n path: \"userId\",\n message: \"An authenticated userId or anonymousSessionId is required.\",\n code: \"REQUIRED\",\n });\n if (value.userId !== undefined && !nonEmpty(value.userId))\n result.push({ path: \"userId\", message: \"userId must be non-empty.\", code: \"INVALID_TYPE\" });\n if (value.anonymousSessionId !== undefined && !uuid(value.anonymousSessionId))\n result.push({\n path: \"anonymousSessionId\",\n message: \"anonymousSessionId must be a UUID v4.\",\n code: \"INVALID_FORMAT\",\n });\n if (\n value.userId !== undefined &&\n value.anonymousSessionId !== undefined &&\n value.userId !== value.anonymousSessionId\n )\n result.push({\n path: \"anonymousSessionId\",\n message: \"userId and anonymousSessionId must identify the same session.\",\n code: \"IDENTITY_MISMATCH\",\n });\n return result;\n}\n\nfunction directErrors(\n value: unknown,\n config: AdminRallyConfig,\n kind: \"check-in\" | \"claim\",\n): ReadonlyArray<RequestValidationError> {\n const validated =\n kind === \"check-in\" ? validateCheckInRequest(value) : validateClaimRewardRequest(value);\n if (!validated.success) return validated.errors;\n const errors: RequestValidationError[] = [];\n if (validated.data.rallyId !== config.id)\n errors.push({\n path: \"rallyId\",\n message: \"The rally does not match this server.\",\n code: \"INVALID_VALUE\",\n });\n const resourceId =\n kind === \"check-in\"\n ? (validated.data as CheckInRequest).spotId\n : (validated.data as ClaimRewardRequest).rewardId;\n const exists =\n kind === \"check-in\"\n ? config.spots.some((spot) => spot.id === resourceId)\n : config.rewards.some((reward) => reward.id === resourceId);\n if (!exists)\n errors.push({\n path: kind === \"check-in\" ? \"spotId\" : \"rewardId\",\n message: `${kind === \"check-in\" ? \"Spot\" : \"Reward\"} was not found.`,\n code: kind === \"check-in\" ? \"SPOT_NOT_FOUND\" : \"REWARD_NOT_FOUND\",\n });\n errors.push(...identityErrors(validated.data));\n return errors;\n}\n\nexport function assertValidCheckInParams(\n value: unknown,\n config: AdminRallyConfig,\n): asserts value is CheckInRequest & { readonly userId: string } {\n const errors = directErrors(value, config, \"check-in\");\n if (errors.length > 0) throw new RequestValidationException(errors);\n}\n\nexport function assertValidClaimParams(\n value: unknown,\n config: AdminRallyConfig,\n): asserts value is ClaimRewardRequest & { readonly userId: string } {\n const errors = directErrors(value, config, \"claim\");\n if (errors.length > 0) throw new RequestValidationException(errors);\n}\n\nexport function assertValidSyncParams(\n value: unknown,\n config: AdminRallyConfig,\n): asserts value is { readonly rallyId: string; readonly userId: string } {\n const validated = validateSyncRequest(value);\n const errors = validated.success\n ? [\n ...(validated.data.rallyId !== config.id\n ? [\n {\n path: \"rallyId\",\n message: \"The rally does not match this server.\",\n code: \"INVALID_VALUE\",\n },\n ]\n : []),\n ]\n : [...validated.errors];\n if (validated.success) errors.push(...identityErrors(validated.data));\n if (errors.length > 0) throw new RequestValidationException(errors);\n}\n\nexport function validateSyncRequest(value: unknown): RequestValidationResult<{\n readonly rallyId: string;\n readonly userId?: string;\n readonly anonymousSessionId?: string;\n}> {\n const required = requiredErrors(value, [\"rallyId\"]);\n if (required.length > 0) return errors(...required);\n if (!record(value))\n return errors({ path: \"$\", message: \"Expected an object.\", code: \"INVALID_TYPE\" });\n if (value.userId !== undefined && !nonEmpty(value.userId))\n return errors({ path: \"userId\", message: \"userId must be non-empty.\", code: \"INVALID_TYPE\" });\n return {\n success: true,\n data: value as {\n readonly rallyId: string;\n readonly userId?: string;\n readonly anonymousSessionId?: string;\n },\n };\n}\n","import {\n type AdminRallyConfig,\n type CheckInCondition,\n consumeReward,\n evaluateConditionDetailed,\n reconcileRewardStates,\n type UserRallyState,\n type Validator,\n type VerificationContext,\n} from \"@stamprally/core\";\nimport type {\n AuditLog,\n CheckInRequest,\n CheckInResponse,\n ClaimRewardRequest,\n ServerOptions,\n SyncOperationStatus,\n} from \"./index.js\";\nimport type { ServerPersistenceAdapter } from \"./persistence.js\";\nimport {\n assertValidCheckInParams,\n assertValidClaimParams,\n assertValidSyncParams,\n RequestValidationException,\n validateCheckInRequest,\n validateClaimRewardRequest,\n validateSyncRequest,\n} from \"./security.js\";\nimport type { TrustedAuthContext } from \"./types.js\";\n\ntype ErrorResponse = { readonly ok: false; readonly code: string; readonly message: string };\ntype ClaimResponse =\n | {\n readonly ok: true;\n readonly state: UserRallyState;\n readonly claimTicketNumber?: string;\n readonly inventory?: InventoryStatus;\n }\n | ErrorResponse;\ninterface InventoryStatus {\n readonly sharedRemaining?: number;\n readonly rewardRemaining?: number;\n}\nfunction json(body: unknown, status = 200): Response {\n return new Response(JSON.stringify(body), {\n status,\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n });\n}\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction isUuidV4(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\n}\nfunction requestId(prefix: string): string {\n return `${prefix}-${globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2)}`}`;\n}\nfunction now(options: ServerOptions): string {\n return options.now?.() ?? new Date().toISOString();\n}\nfunction timestampMillis(timestamp: string): number {\n const value = Date.parse(timestamp);\n return Number.isFinite(value) ? value : Date.now();\n}\nfunction validationResponse(\n errors: ReadonlyArray<{ readonly path: string; readonly message: string; readonly code: string }>,\n): Response {\n return json(\n {\n error: \"VALIDATION_FAILED\",\n details: errors.map(({ path, message, code }) => ({ path, message, code })),\n },\n 400,\n );\n}\nfunction initialState(config: AdminRallyConfig, userId: string, timestamp: string): UserRallyState {\n return {\n rallyId: config.id,\n userId,\n records: [],\n rewards: reconcileRewardStates(config.rewards, [], 0, timestamp),\n updatedAt: timestamp,\n };\n}\ninterface InventoryPlan {\n readonly primaryKey: string;\n readonly primaryInitial: number | null;\n readonly secondaryKey?: string;\n readonly secondaryInitial?: number | null;\n}\nfunction rewardStock(\n config: AdminRallyConfig,\n reward: AdminRallyConfig[\"rewards\"][number],\n): number | null {\n const stockLimit = reward.stockLimit;\n const key = reward.stockKey ?? reward.id;\n const configured = key === \"__shared__\" ? config.inventory?.sharedStock : config.inventory?.[key];\n if (stockLimit === undefined) return configured ?? null;\n if (configured === undefined) return stockLimit;\n return Math.min(stockLimit, configured);\n}\nfunction sharedStock(config: AdminRallyConfig): number | null {\n return config.inventory?.sharedStock ?? null;\n}\nfunction inventoryPlan(\n config: AdminRallyConfig,\n rewardId: string,\n stockLimit: number | undefined,\n): InventoryPlan {\n const reward = config.rewards.find((item) => item.id === rewardId);\n const individual = reward === undefined ? (stockLimit ?? null) : rewardStock(config, reward);\n const shared = sharedStock(config);\n const explicitPrimaryKey = reward?.stockKey;\n const explicitSecondaryKey = reward?.secondaryStockKey;\n if (config.inventoryMode === \"shared\" && shared !== null) {\n return {\n primaryKey: explicitPrimaryKey ?? \"__shared__\",\n primaryInitial: explicitPrimaryKey === undefined ? shared : individual,\n ...(explicitSecondaryKey !== undefined\n ? {\n secondaryKey: explicitSecondaryKey,\n secondaryInitial: config.inventory?.[explicitSecondaryKey] ?? individual,\n }\n : individual === null\n ? {}\n : { secondaryKey: rewardId, secondaryInitial: individual }),\n };\n }\n return {\n primaryKey: explicitPrimaryKey ?? rewardId,\n primaryInitial: individual,\n ...(explicitSecondaryKey === undefined\n ? {}\n : {\n secondaryKey: explicitSecondaryKey,\n secondaryInitial: config.inventory?.[explicitSecondaryKey] ?? null,\n }),\n };\n}\nfunction getProof(context: VerificationContext): unknown {\n return context.type === \"qr\"\n ? context.token\n : context.type === \"passcode\"\n ? context.code\n : context.type === \"gps\"\n ? { latitude: context.latitude, longitude: context.longitude }\n : context.type === \"nfc\"\n ? context.tagId\n : context.value;\n}\nasync function evaluate(\n condition: CheckInCondition,\n context: VerificationContext,\n validator: Validator | undefined,\n base: { rallyId: string; spotId: string; state: UserRallyState },\n): Promise<boolean> {\n if (condition.type !== \"custom\") return evaluateConditionDetailed(condition, context).ok;\n if (validator === undefined) return false;\n const validationContext = {\n rallyId: base.rallyId,\n spotId: base.spotId,\n proofData: getProof(context),\n condition,\n userState: base.state,\n };\n const result =\n typeof validator === \"function\"\n ? await validator(validationContext)\n : await validator.validate(validationContext);\n return result === true || (typeof result === \"object\" && result.valid);\n}\nfunction audit(\n rallyId: string,\n userId: string,\n action: AuditLog[\"action\"],\n resourceId: string,\n key: string,\n status: AuditLog[\"status\"],\n timestamp: string,\n code?: string,\n): AuditLog {\n return {\n id: requestId(\"audit\"),\n timestamp,\n rallyId,\n userId,\n action,\n resourceId,\n status,\n idempotencyKey: key,\n ...(code === undefined ? {} : { metadata: { errorCode: code } }),\n };\n}\nfunction operationStatus(result: {\n readonly ok: boolean;\n readonly code?: string;\n}): SyncOperationStatus {\n if (result.ok) return \"ACCEPTED\";\n return result.code === \"CONFLICT\" || result.code === \"PERSISTENCE_FAILED\"\n ? \"RETRYABLE_ERROR\"\n : \"REJECTED_PERMANENT\";\n}\n\nfunction withDirectIdentity<\n T extends { readonly userId?: string; readonly anonymousSessionId?: string },\n>(request: T, authContext?: TrustedAuthContext): T & { readonly userId: string } {\n if (authContext !== undefined) {\n if (authContext.authenticatedUserId.trim() === \"\")\n throw new RequestValidationException([\n {\n path: \"authContext.authenticatedUserId\",\n message: \"An authenticated userId is required.\",\n code: \"REQUIRED\",\n },\n ]);\n return { ...request, userId: authContext.authenticatedUserId };\n }\n if (request.userId !== undefined) return { ...request, userId: request.userId };\n if (request.anonymousSessionId !== undefined && isUuidV4(request.anonymousSessionId))\n return { ...request, userId: request.anonymousSessionId };\n throw new RequestValidationException([\n {\n path: \"userId\",\n message: \"An authenticated userId or anonymousSessionId is required.\",\n code: \"REQUIRED\",\n },\n ]);\n}\n\nexport class StampRallyServer {\n readonly #config: AdminRallyConfig;\n readonly #persistence: ServerPersistenceAdapter;\n readonly #options: ServerOptions;\n constructor(\n config: AdminRallyConfig,\n persistence: ServerPersistenceAdapter,\n options: ServerOptions = {},\n ) {\n this.#config = config;\n this.#persistence = persistence;\n this.#options = options;\n }\n async handle(request: Request): Promise<Response> {\n if (request.method !== \"POST\")\n return json({ ok: false, code: \"METHOD_NOT_ALLOWED\", message: \"POST is required.\" }, 405);\n const path = new URL(request.url).pathname;\n if (path.endsWith(\"/check-in\")) return this.handleCheckIn(request);\n if (path.endsWith(\"/claim-reward\")) return this.handleClaimReward(request);\n if (path.endsWith(\"/sync\")) return this.handleSync(request);\n return json({ ok: false, code: \"NOT_FOUND\", message: \"Route not found.\" }, 404);\n }\n async handleCheckIn(request: Request): Promise<Response> {\n const body = validateCheckInRequest(await this.#body(request));\n if (!body.success) return validationResponse(body.errors);\n if (body.data.rallyId !== this.#config.id)\n return validationResponse([\n {\n path: \"rallyId\",\n message: \"The rally does not match this server.\",\n code: \"INVALID_VALUE\",\n },\n ]);\n const userId = await this.#user(request);\n if (userId === null)\n return json(\n { ok: false, code: \"UNAUTHENTICATED\", message: \"Authentication is required.\" },\n 401,\n );\n const sessionId = request.headers.get(\"x-anonymous-session-id\");\n let result: CheckInResponse;\n try {\n result = await this.checkIn({\n ...body.data,\n userId,\n ...(sessionId === null ? {} : { anonymousSessionId: sessionId }),\n });\n } catch (error) {\n if (error instanceof RequestValidationException) return validationResponse(error.errors);\n throw error;\n }\n return json(\n { ...result, status: operationStatus(result) },\n result.ok ? 200 : result.code === \"SPOT_NOT_FOUND\" ? 404 : 422,\n );\n }\n async handleClaimReward(request: Request): Promise<Response> {\n const body = validateClaimRewardRequest(await this.#body(request));\n if (!body.success) return validationResponse(body.errors);\n if (body.data.rallyId !== this.#config.id)\n return validationResponse([\n {\n path: \"rallyId\",\n message: \"The rally does not match this server.\",\n code: \"INVALID_VALUE\",\n },\n ]);\n const userId = await this.#user(request);\n if (userId === null)\n return json(\n { ok: false, code: \"UNAUTHENTICATED\", message: \"Authentication is required.\" },\n 401,\n );\n const sessionId = request.headers.get(\"x-anonymous-session-id\");\n let result: ClaimResponse;\n try {\n result = await this.claimReward({\n ...body.data,\n userId,\n ...(sessionId === null ? {} : { anonymousSessionId: sessionId }),\n });\n } catch (error) {\n if (error instanceof RequestValidationException) return validationResponse(error.errors);\n throw error;\n }\n return json(\n { ...result, status: operationStatus(result) },\n result.ok ? 200 : result.code === \"REWARD_NOT_FOUND\" ? 404 : 422,\n );\n }\n async handleSync(request: Request): Promise<Response> {\n const body = validateSyncRequest(await this.#body(request));\n if (!body.success) return validationResponse(body.errors);\n if (body.data.rallyId !== this.#config.id)\n return validationResponse([\n {\n path: \"rallyId\",\n message: \"The rally does not match this server.\",\n code: \"INVALID_VALUE\",\n },\n ]);\n const userId = await this.#user(request);\n if (userId === null)\n return json(\n { ok: false, code: \"UNAUTHENTICATED\", message: \"Authentication is required.\" },\n 401,\n );\n const sessionId = request.headers.get(\"x-anonymous-session-id\");\n const authContext: TrustedAuthContext = {\n authenticatedUserId: userId,\n ...(sessionId === null ? {} : { isAnonymous: true, sessionId }),\n };\n try {\n return json({\n ok: true,\n state: await this.syncProgress(\n {\n rallyId: body.data.rallyId,\n ...(sessionId === null ? {} : { anonymousSessionId: sessionId }),\n },\n authContext,\n ),\n });\n } catch (error) {\n if (error instanceof RequestValidationException) return validationResponse(error.errors);\n throw error;\n }\n }\n async checkIn(\n request: CheckInRequest,\n authContext?: TrustedAuthContext,\n ): Promise<CheckInResponse> {\n const directRequest = withDirectIdentity(request, authContext);\n assertValidCheckInParams(directRequest, this.#config);\n const { userId } = directRequest;\n const key = `check-in:${request.rallyId}:${userId}:${request.idempotencyKey}`;\n const previous = await this.#persistence.getIdempotentResult<CheckInResponse>(\n request.rallyId,\n key,\n );\n if (previous !== null) return previous;\n const lockKey = `state:${request.rallyId}:${userId}`;\n if (\n !(await this.#persistence.acquireLock(\n request.rallyId,\n lockKey,\n this.#options.lockTtlMs ?? 5_000,\n ))\n )\n return { ok: false, code: \"CONFLICT\", message: \"The user state is being updated.\" };\n const timestamp = now(this.#options);\n try {\n const current =\n (await this.#persistence.getUserState(request.rallyId, userId)) ??\n initialState(this.#config, userId, timestamp);\n const responseHolder: { value: CheckInResponse | null } = { value: null };\n const makeAudit = (status: \"SUCCESS\" | \"REJECTED\", code?: string): AuditLog =>\n audit(\n request.rallyId,\n userId,\n \"CHECK_IN\",\n request.spotId,\n request.idempotencyKey,\n status,\n timestamp,\n code,\n );\n const spot = this.#config.spots.find((item) => item.id === request.spotId);\n if (spot === undefined) {\n responseHolder.value = {\n ok: false,\n code: \"SPOT_NOT_FOUND\",\n message: \"Spot was not found.\",\n };\n return await this.#rememberCheckInTransaction(\n directRequest,\n timestamp,\n key,\n current,\n {\n nextUserState: current,\n auditLog: makeAudit(\"REJECTED\", \"SPOT_NOT_FOUND\"),\n result: responseHolder.value,\n error: \"SPOT_NOT_FOUND\",\n },\n responseHolder,\n );\n }\n const rejected = (code: string, message: string) => {\n responseHolder.value = { ok: false, code, message };\n return {\n nextUserState: current,\n auditLog: makeAudit(\"REJECTED\", code),\n result: responseHolder.value,\n error: code,\n };\n };\n if (current.records.some((record) => record.stampId === request.spotId))\n return await this.#rememberCheckInTransaction(\n directRequest,\n timestamp,\n key,\n current,\n rejected(\"STAMP_ALREADY_ACQUIRED\", \"Spot was already claimed.\"),\n responseHolder,\n );\n const acquired = new Set(current.records.map((record) => record.stampId));\n if (spot.prerequisites?.some((id) => !acquired.has(id)))\n return await this.#rememberCheckInTransaction(\n directRequest,\n timestamp,\n key,\n current,\n rejected(\"PREREQUISITES_NOT_MET\", \"Prerequisite spots are not complete.\"),\n responseHolder,\n );\n for (const condition of spot.conditions)\n if (\n !(await evaluate(\n condition,\n request.context,\n condition.type === \"custom\"\n ? this.#options.customValidators?.[condition.validatorName]\n : undefined,\n { rallyId: request.rallyId, spotId: request.spotId, state: current },\n ))\n )\n return await this.#rememberCheckInTransaction(\n directRequest,\n timestamp,\n key,\n current,\n rejected(\"INVALID_PROOF\", \"Verification failed.\"),\n responseHolder,\n );\n const next: UserRallyState = {\n ...current,\n records: [...current.records, { stampId: request.spotId, acquiredAt: timestamp }],\n rewards: reconcileRewardStates(\n this.#config.rewards,\n current.rewards,\n current.records.length + 1,\n timestamp,\n ),\n updatedAt: timestamp,\n };\n responseHolder.value = { ok: true, state: next };\n const transaction = await this.#persistence.executeCheckInTransaction(\n {\n rallyId: request.rallyId,\n userId,\n spotId: request.spotId,\n timestamp: timestampMillis(timestamp),\n idempotencyKey: key,\n proofData: request.context,\n ...(this.#options.idempotencyTtlMs === undefined\n ? {}\n : { idempotencyTtlMs: this.#options.idempotencyTtlMs }),\n initialUserState: current,\n },\n () => ({\n nextUserState: next,\n auditLog: makeAudit(\"SUCCESS\"),\n result: responseHolder.value,\n }),\n );\n if (transaction.success && responseHolder.value !== null) return responseHolder.value;\n return {\n ok: false,\n code: \"PERSISTENCE_FAILED\",\n message: transaction.error ?? \"Check-in failed.\",\n };\n } finally {\n await this.#persistence.releaseLock(request.rallyId, lockKey);\n }\n }\n async claimReward(\n request: ClaimRewardRequest,\n authContext?: TrustedAuthContext,\n ): Promise<ClaimResponse> {\n const directRequest = withDirectIdentity(request, authContext);\n assertValidClaimParams(directRequest, this.#config);\n const { userId } = directRequest;\n const key = `claim:${request.rallyId}:${userId}:${request.rewardId}:${request.idempotencyKey}`;\n const previous = await this.#persistence.getIdempotentResult<ClaimResponse>(\n request.rallyId,\n key,\n );\n if (previous !== null) return previous;\n const reward = this.#config.rewards.find((item) => item.id === request.rewardId);\n if (reward === undefined)\n return this.#rememberClaim(\n key,\n { ok: false, code: \"REWARD_NOT_FOUND\", message: \"Reward was not found.\" },\n directRequest,\n now(this.#options),\n );\n const plan = inventoryPlan(this.#config, reward.id, reward.stockLimit);\n if (plan.secondaryKey !== undefined && this.#persistence.supportsSecondaryStock !== true)\n throw new Error(\"SECONDARY_STOCK_UNSUPPORTED\");\n const inventoryEnabled =\n plan.primaryInitial !== null ||\n (plan.secondaryInitial !== undefined && plan.secondaryInitial !== null);\n if (\n inventoryEnabled &&\n (this.#persistence.supportsRewardStock === false ||\n typeof this.#persistence.getRewardStock !== \"function\" ||\n typeof this.#persistence.executeClaimRewardTransaction !== \"function\")\n )\n return this.#rememberClaim(\n key,\n {\n ok: false,\n code: \"INVENTORY_STORAGE_NOT_IMPLEMENTED\",\n message: \"This persistence adapter cannot atomically store inventory.\",\n },\n directRequest,\n now(this.#options),\n );\n const lockKey =\n this.#config.inventoryMode === \"shared\"\n ? \"inventory:shared\"\n : `reward:${request.rallyId}:${reward.id}`;\n if (\n !(await this.#persistence.acquireLock(\n request.rallyId,\n lockKey,\n this.#options.lockTtlMs ?? 5_000,\n ))\n )\n return { ok: false, code: \"CONFLICT\", message: \"The reward is being claimed.\" };\n const timestamp = now(this.#options);\n try {\n const checked = await this.#persistence.getIdempotentResult<ClaimResponse>(\n request.rallyId,\n key,\n );\n if (checked !== null) return checked;\n const responseHolder: { value: ClaimResponse | null } = { value: null };\n const result = await this.#persistence.executeClaimRewardTransaction(\n {\n rallyId: request.rallyId,\n userId,\n rewardId: reward.id,\n stockKey: plan.primaryKey,\n ...(plan.secondaryKey === undefined ? {} : { secondaryStockKey: plan.secondaryKey }),\n rewardStockLimit: rewardStock(this.#config, reward),\n sharedStockLimit:\n this.#config.inventoryMode === \"shared\" ? sharedStock(this.#config) : null,\n initialStock: plan.primaryInitial,\n ...(plan.secondaryInitial === undefined\n ? {}\n : { initialSecondaryStock: plan.secondaryInitial }),\n ticketNumber: request.idempotencyKey,\n timestamp: Number.isNaN(Date.parse(timestamp)) ? Date.now() : Date.parse(timestamp),\n idempotencyKey: key,\n ...(request.staffPasscode === undefined ? {} : { proofData: request.staffPasscode }),\n ...(this.#options.idempotencyTtlMs === undefined\n ? {}\n : { idempotencyTtlMs: this.#options.idempotencyTtlMs }),\n initialUserState: initialState(this.#config, userId, timestamp),\n },\n ({ stock, secondaryStock, claimCount, userState }) => {\n const storedReward = userState.rewards.find((item) => item.rewardId === reward.id) ?? {\n rewardId: reward.id,\n status: \"LOCKED\" as const,\n };\n const currentReward =\n reward.redemptionMethod === \"server_claim\" &&\n storedReward.status === \"CONSUMED\" &&\n (reward.userClaimLimit === undefined || claimCount < reward.userClaimLimit)\n ? { ...storedReward, status: \"AVAILABLE\" as const }\n : storedReward;\n const makeAudit = (status: \"SUCCESS\" | \"REJECTED\", code?: string): AuditLog =>\n audit(\n request.rallyId,\n userId,\n \"CLAIM_REWARD\",\n reward.id,\n request.idempotencyKey,\n status,\n timestamp,\n code,\n );\n if ((stock !== null && stock <= 0) || (secondaryStock !== null && secondaryStock <= 0)) {\n responseHolder.value = {\n ok: false,\n code: \"OUT_OF_STOCK\",\n message: \"Reward is out of stock.\",\n };\n return {\n nextStock: stock,\n ...(plan.secondaryKey === undefined ? {} : { nextSecondaryStock: secondaryStock }),\n nextUserState: userState,\n auditLog: makeAudit(\"REJECTED\", \"OUT_OF_STOCK\"),\n result: responseHolder.value,\n error: \"OUT_OF_STOCK\",\n };\n }\n const effectiveReward =\n reward.staffPasscode === undefined && this.#config.staffPasscode !== undefined\n ? { ...reward, staffPasscode: this.#config.staffPasscode }\n : reward;\n const local = consumeReward({\n reward: effectiveReward,\n currentState: currentReward,\n now: timestamp,\n userRedemptionCount: claimCount,\n ...(request.staffPasscode === undefined\n ? {}\n : { inputPasscode: request.staffPasscode }),\n ...(request.staffId === undefined ? {} : { staffId: request.staffId }),\n });\n if (!local.ok) {\n responseHolder.value = {\n ok: false,\n code: local.error.code,\n message: \"Reward cannot be claimed.\",\n };\n return {\n nextStock: stock,\n nextUserState: userState,\n auditLog: makeAudit(\"REJECTED\", local.error.code),\n result: responseHolder.value,\n error: local.error.code,\n };\n }\n const nextRewards = userState.rewards.some((item) => item.rewardId === reward.id)\n ? userState.rewards.map((item) => (item.rewardId === reward.id ? local.value : item))\n : [...userState.rewards, local.value];\n const consumed = local.value.claimTicketNumber !== undefined;\n const nextStock = consumed && stock !== null ? Math.max(0, stock - 1) : stock;\n const nextSecondaryStock =\n consumed && secondaryStock !== null ? Math.max(0, secondaryStock - 1) : secondaryStock;\n const next: UserRallyState = {\n ...userState,\n rewards: nextRewards,\n updatedAt: timestamp,\n inventory: {\n ...(plan.primaryKey === \"__shared__\" && nextStock !== null\n ? { sharedRemaining: nextStock }\n : {}),\n ...(plan.secondaryKey !== undefined && nextSecondaryStock !== null\n ? { rewardRemaining: { [reward.id]: nextSecondaryStock } }\n : plan.primaryKey === reward.id && nextStock !== null\n ? { rewardRemaining: { [reward.id]: nextStock } }\n : {}),\n },\n };\n const inventory: InventoryStatus = {\n ...(plan.primaryKey === \"__shared__\" && nextStock !== null\n ? { sharedRemaining: nextStock }\n : {}),\n ...(plan.secondaryKey !== undefined && nextSecondaryStock !== null\n ? { rewardRemaining: nextSecondaryStock }\n : plan.primaryKey === reward.id && nextStock !== null\n ? { rewardRemaining: nextStock }\n : {}),\n };\n responseHolder.value =\n local.value.claimTicketNumber === undefined\n ? {\n ok: true,\n state: next,\n ...(Object.keys(inventory).length === 0 ? {} : { inventory }),\n }\n : {\n ok: true,\n state: next,\n claimTicketNumber: local.value.claimTicketNumber,\n ...(Object.keys(inventory).length === 0 ? {} : { inventory }),\n };\n return {\n nextStock,\n ...(plan.secondaryKey === undefined ? {} : { nextSecondaryStock }),\n nextUserState: next,\n auditLog: makeAudit(\"SUCCESS\"),\n result: responseHolder.value,\n };\n },\n );\n const response = responseHolder.value;\n if (!result.success) {\n if (response !== null && !response.ok && response.code === result.error) return response;\n if (result.error === \"INVENTORY_STORAGE_NOT_IMPLEMENTED\")\n return {\n ok: false,\n code: \"INVENTORY_STORAGE_NOT_IMPLEMENTED\",\n message: \"This persistence adapter cannot atomically store inventory.\",\n };\n return {\n ok: false,\n code: \"PERSISTENCE_FAILED\",\n message: result.error ?? \"Reward claim failed.\",\n };\n }\n if (response !== null && result.success) return response;\n return {\n ok: false,\n code: \"PERSISTENCE_FAILED\",\n message: result.error ?? \"Reward claim failed.\",\n };\n } catch (error) {\n return {\n ok: false,\n code: \"PERSISTENCE_FAILED\",\n message: error instanceof Error ? error.message : \"Reward claim failed.\",\n };\n } finally {\n await this.#persistence.releaseLock(request.rallyId, lockKey);\n }\n }\n async sync(rallyId: string, identity: string | TrustedAuthContext): Promise<UserRallyState> {\n const userId = typeof identity === \"string\" ? identity : identity.authenticatedUserId;\n assertValidSyncParams({ rallyId, userId }, this.#config);\n const state =\n (await this.#persistence.getUserState(rallyId, userId)) ??\n initialState(this.#config, userId, now(this.#options));\n return this.#attachInventory(state);\n }\n async syncProgress(\n request: {\n readonly rallyId: string;\n readonly userId?: string;\n readonly anonymousSessionId?: string;\n },\n authContext: TrustedAuthContext,\n ): Promise<UserRallyState> {\n const directRequest = withDirectIdentity(request, authContext);\n assertValidSyncParams(directRequest, this.#config);\n return this.sync(directRequest.rallyId, authContext);\n }\n async #attachInventory(state: UserRallyState): Promise<UserRallyState> {\n const rewardRemaining: Record<string, number> = {};\n for (const reward of this.#config.rewards) {\n const plan = inventoryPlan(this.#config, reward.id, reward.stockLimit);\n if (plan.secondaryKey !== undefined) {\n if (this.#persistence.supportsSecondaryStock !== true)\n throw new Error(\"SECONDARY_STOCK_UNSUPPORTED\");\n const stock = await this.#persistence.getRewardStock(state.rallyId, plan.secondaryKey);\n const remaining = stock ?? plan.secondaryInitial ?? null;\n if (remaining !== null) rewardRemaining[reward.id] = Math.max(0, remaining);\n } else if (plan.primaryKey !== \"__shared__\") {\n const stock = await this.#persistence.getRewardStock(state.rallyId, plan.primaryKey);\n const remaining = stock ?? plan.primaryInitial;\n if (remaining !== null) rewardRemaining[reward.id] = Math.max(0, remaining);\n }\n }\n const shared = sharedStock(this.#config);\n const storedShared = await this.#persistence.getRewardStock(state.rallyId, \"__shared__\");\n const sharedRemaining =\n this.#config.inventoryMode === \"shared\" && shared !== null\n ? Math.max(0, storedShared ?? shared)\n : undefined;\n return {\n ...state,\n ...(Object.keys(rewardRemaining).length === 0 && sharedRemaining === undefined\n ? {}\n : {\n inventory: {\n ...(sharedRemaining === undefined ? {} : { sharedRemaining }),\n ...(Object.keys(rewardRemaining).length === 0 ? {} : { rewardRemaining }),\n },\n }),\n };\n }\n async #body(request: Request): Promise<unknown> {\n try {\n const value: unknown = await request.json();\n return isObject(value) ? value : null;\n } catch {\n return null;\n }\n }\n async #user(request: Request): Promise<string | null> {\n if (this.#options.authenticate !== undefined) {\n const identity = await this.#options.authenticate(request);\n if (typeof identity === \"string\") return identity.length > 0 ? identity : null;\n if (identity === null) return null;\n const authenticatedUserId = identity.authenticatedUserId;\n return authenticatedUserId.length > 0 ? authenticatedUserId : null;\n }\n const policy = this.#options.anonymousPolicy ?? \"session_scoped\";\n if (policy === \"reject\") return null;\n const sessionId = request.headers.get(\"X-Anonymous-Session-Id\");\n if (sessionId !== null) return isUuidV4(sessionId) ? sessionId : null;\n if (policy === \"session_scoped\") return null;\n return \"anonymous\";\n }\n\n async #rememberCheckInTransaction(\n request: CheckInRequest & { readonly userId: string },\n timestamp: string,\n key: string,\n current: UserRallyState,\n mutation: {\n readonly nextUserState: UserRallyState;\n readonly auditLog: AuditLog;\n readonly result?: unknown;\n readonly error?: string;\n },\n responseHolder: { value: CheckInResponse | null },\n ): Promise<CheckInResponse> {\n const transaction = await this.#persistence.executeCheckInTransaction(\n {\n rallyId: request.rallyId,\n userId: request.userId,\n spotId: request.spotId,\n timestamp: timestampMillis(timestamp),\n idempotencyKey: key,\n ...(this.#options.idempotencyTtlMs === undefined\n ? {}\n : { idempotencyTtlMs: this.#options.idempotencyTtlMs }),\n initialUserState: current,\n },\n () => mutation,\n );\n if (\n responseHolder.value !== null &&\n (transaction.success || transaction.error === mutation.error)\n )\n return responseHolder.value;\n return {\n ok: false,\n code: \"PERSISTENCE_FAILED\",\n message: transaction.error ?? \"Check-in failed.\",\n };\n }\n async #rememberClaim(\n key: string,\n result: ClaimResponse,\n request: ClaimRewardRequest & { readonly userId: string },\n timestamp: string,\n ): Promise<ClaimResponse> {\n await this.#persistence.recordAuditLog(\n audit(\n request.rallyId,\n request.userId,\n \"CLAIM_REWARD\",\n request.rewardId,\n request.idempotencyKey,\n \"REJECTED\",\n timestamp,\n result.ok ? undefined : result.code,\n ),\n );\n await this.#persistence.saveIdempotentResult(\n request.rallyId,\n key,\n result,\n this.#options.idempotencyTtlMs ?? 86_400_000,\n );\n return result;\n }\n}\n","import type { UserRallyState } from \"@stamprally/core\";\nimport type {\n AuditLog,\n ClaimRewardTransactionMutation,\n ClaimRewardTransactionParams,\n} from \"../index.js\";\nimport type { ServerPersistenceAdapter } from \"../persistence.js\";\n\nconst state = (userId: string): UserRallyState => ({\n rallyId: \"compliance-rally\",\n userId,\n records: [],\n rewards: [{ rewardId: \"reward\", status: \"AVAILABLE\" }],\n updatedAt: \"2026-01-01T00:00:00.000Z\",\n});\n\nfunction audit(idempotencyKey: string, userId: string): AuditLog {\n return {\n id: `audit-${idempotencyKey}`,\n timestamp: \"2026-01-01T00:00:00.000Z\",\n rallyId: \"compliance-rally\",\n userId,\n action: \"CLAIM_REWARD\",\n resourceId: \"reward\",\n status: \"SUCCESS\",\n idempotencyKey,\n };\n}\n\nfunction params(userId: string, idempotencyKey: string): ClaimRewardTransactionParams {\n return {\n rallyId: \"compliance-rally\",\n userId,\n rewardId: \"reward\",\n ticketNumber: `ticket-${idempotencyKey}`,\n timestamp: Date.parse(\"2026-01-01T00:00:00.000Z\"),\n idempotencyKey,\n rewardStockLimit: 1,\n sharedStockLimit: 1,\n stockKey: \"__shared__\",\n secondaryStockKey: \"reward\",\n initialStock: 1,\n initialSecondaryStock: 1,\n initialUserState: state(userId),\n };\n}\n\nfunction mutation(current: {\n readonly stock: number | null;\n readonly secondaryStock: number | null;\n readonly userState: UserRallyState;\n}): ClaimRewardTransactionMutation {\n if (current.stock === 0 || current.secondaryStock === 0)\n return {\n nextStock: current.stock,\n nextSecondaryStock: current.secondaryStock,\n nextUserState: current.userState,\n auditLog: audit(\"rejected\", current.userState.userId ?? \"unknown\"),\n error: \"OUT_OF_STOCK\",\n };\n return {\n nextStock: current.stock === null ? null : current.stock - 1,\n nextSecondaryStock: current.secondaryStock === null ? null : current.secondaryStock - 1,\n nextUserState: {\n ...current.userState,\n rewards: [{ rewardId: \"reward\", status: \"CONSUMED\" }],\n updatedAt: \"2026-01-01T00:00:00.000Z\",\n },\n auditLog: audit(\"success\", current.userState.userId ?? \"unknown\"),\n result: { ok: true },\n };\n}\n\nfunction assert(condition: unknown, message: string): asserts condition {\n if (!condition) throw new Error(`Persistence adapter compliance failed: ${message}`);\n}\n\n/**\n * Runs the minimum atomicity and idempotency contract against a persistence adapter.\n * The function throws a descriptive error when the adapter violates the contract.\n */\nexport async function runPersistenceAdapterComplianceTests(\n createAdapter: () => Promise<ServerPersistenceAdapter>,\n): Promise<void> {\n const adapter = await createAdapter();\n assert(\n adapter.supportsRewardStock !== false,\n \"the adapter must explicitly support reward stock for this suite\",\n );\n\n const [first, second] = await Promise.all([\n adapter.executeClaimRewardTransaction(params(\"alice\", \"race-a\"), mutation),\n adapter.executeClaimRewardTransaction(params(\"bob\", \"race-b\"), mutation),\n ]);\n assert([first.success, second.success].filter(Boolean).length === 1, \"race was not serialized\");\n assert(\n (await adapter.getRewardStock(\"compliance-rally\", \"__shared__\")) === 0,\n \"shared stock was not decremented atomically\",\n );\n assert(\n (await adapter.getRewardStock(\"compliance-rally\", \"reward\")) === 0,\n \"per-reward stock was not decremented atomically\",\n );\n\n const exhausted = await adapter.executeClaimRewardTransaction(\n params(\"carol\", \"boundary\"),\n mutation,\n );\n assert(!exhausted.success, \"a zero-stock claim was accepted\");\n assert(\n (await adapter.getRewardStock(\"compliance-rally\", \"__shared__\")) === 0 &&\n (await adapter.getRewardStock(\"compliance-rally\", \"reward\")) === 0,\n \"zero-stock rejection did not preserve both stock boundaries\",\n );\n\n const idempotentAdapter = await createAdapter();\n const idempotentParams = params(\"alice\", \"same-key\");\n const firstClaim = await idempotentAdapter.executeClaimRewardTransaction(\n idempotentParams,\n mutation,\n );\n const secondClaim = await idempotentAdapter.executeClaimRewardTransaction(\n idempotentParams,\n mutation,\n );\n assert(firstClaim.success && secondClaim.success, \"idempotent claim did not remain successful\");\n assert(\n (await idempotentAdapter.getRewardStock(\"compliance-rally\", \"__shared__\")) === 0,\n \"idempotent retry decremented shared stock twice\",\n );\n assert(\n (await idempotentAdapter.getRewardStock(\"compliance-rally\", \"reward\")) === 0,\n \"idempotent retry decremented per-reward stock twice\",\n );\n\n const rollbackAdapter = await createAdapter();\n const rollbackParams = params(\"alice\", \"rollback\");\n const rollback = await rollbackAdapter.executeClaimRewardTransaction(rollbackParams, () => {\n throw new Error(\"forced rollback\");\n });\n assert(!rollback.success, \"a failed mutation was committed\");\n assert(\n (await rollbackAdapter.getRewardStock(\"compliance-rally\", \"__shared__\")) === null,\n \"rollback changed shared stock\",\n );\n assert(\n (await rollbackAdapter.getRewardStock(\"compliance-rally\", \"reward\")) === null,\n \"rollback changed per-reward stock\",\n );\n}\n"]}
|