@stamprally/server 0.14.0 → 0.15.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 +10 -3
- package/dist/index.cjs +326 -63
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +41 -4
- package/dist/index.d.ts +41 -4
- package/dist/index.js +325 -64
- package/dist/index.js.map +1 -1
- package/package.json +5 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/examples/transaction.ts","../src/persistence.ts","../src/security.ts","../src/server.ts"],"names":["error","now","record","reconcileRewardStates","context","evaluateConditionDetailed","consumeReward"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { UserRallyState } from \"@stamprally/core\";\nimport type { AuditLog } from \"../index.js\";\nimport type {\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 claimCount: number;\n readonly userState: UserRallyState;\n }>;\n writeStock(\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.nextStock !== null) await store.writeStock(transaction, params, next.nextStock);\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","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 /** Used when the first claim is made before a user state has been stored. */\n readonly initialUserState?: UserRallyState;\n}\n\nexport interface ClaimRewardTransactionMutation {\n readonly nextStock: 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 claimCount: number;\n readonly userState: UserRallyState;\n }) => ClaimRewardTransactionMutation,\n ): Promise<{ readonly success: boolean; readonly error?: string }>;\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 #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 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 claimCount: number;\n readonly userState: UserRallyState;\n }) => ClaimRewardTransactionMutation,\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({\n stock: await this.getRewardStock(params.rallyId, params.rewardId),\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(params.rallyId, params.rewardId);\n if (\n currentStock !== null &&\n (mutationResult.nextStock === null || mutationResult.nextStock < 0)\n )\n throw new Error(\"The transaction produced an invalid stock value.\");\n if (currentStock === 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.rewardId),\n mutationResult.nextStock,\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 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}\n","import type { VerificationContext } 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: \"invalid_request\";\n}\nexport type RequestValidationResult<T> =\n | { readonly success: true; readonly data: T }\n | { readonly success: false; readonly errors: ReadonlyArray<RequestValidationError> };\n\nfunction error(path: string, message: string): RequestValidationResult<never> {\n return { success: false, errors: [{ path, message, code: \"invalid_request\" }] };\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 context(value: unknown): value is VerificationContext {\n if (!record(value) || typeof value.type !== \"string\") return false;\n if (value.type === \"qr\") return nonEmpty(value.token);\n if (value.type === \"passcode\") return nonEmpty(value.code);\n if (value.type === \"nfc\") return nonEmpty(value.tagId);\n if (value.type === \"custom\") return \"value\" in value;\n return (\n value.type === \"gps\" &&\n typeof value.latitude === \"number\" &&\n Number.isFinite(value.latitude) &&\n typeof value.longitude === \"number\" &&\n Number.isFinite(value.longitude)\n );\n}\nfunction common(value: unknown, fields: ReadonlyArray<string>): value is Record<string, unknown> {\n if (!record(value)) return false;\n return fields.every((field) => nonEmpty(value[field]));\n}\n\nexport function validateCheckInRequest(value: unknown): RequestValidationResult<CheckInRequest> {\n if (!common(value, [\"rallyId\", \"spotId\", \"idempotencyKey\"]))\n return error(\"$\", \"rallyId, spotId, and idempotencyKey must be non-empty strings.\");\n if (!context(value.context))\n return error(\"context\", \"context is not a valid verification context.\");\n if (value.userId !== undefined && !nonEmpty(value.userId))\n return error(\"userId\", \"userId must be non-empty.\");\n if (value.now !== undefined && !nonEmpty(value.now))\n return error(\"now\", \"now must be non-empty when provided.\");\n return { success: true, data: value as unknown as CheckInRequest };\n}\n\nexport function validateClaimRewardRequest(\n value: unknown,\n): RequestValidationResult<ClaimRewardRequest> {\n if (!common(value, [\"rallyId\", \"rewardId\", \"idempotencyKey\"]))\n return error(\"$\", \"rallyId, rewardId, and idempotencyKey must be non-empty strings.\");\n if (value.userId !== undefined && !nonEmpty(value.userId))\n return error(\"userId\", \"userId must be non-empty.\");\n if (value.staffPasscode !== undefined && !nonEmpty(value.staffPasscode))\n return error(\"staffPasscode\", \"staffPasscode must be non-empty.\");\n if (value.staffId !== undefined && !nonEmpty(value.staffId))\n return error(\"staffId\", \"staffId must be non-empty.\");\n if (value.now !== undefined && !nonEmpty(value.now))\n return error(\"now\", \"now must be non-empty when provided.\");\n return { success: true, data: value as unknown as ClaimRewardRequest };\n}\n\nexport function validateSyncRequest(\n value: unknown,\n): RequestValidationResult<{ readonly rallyId: string; readonly userId?: string }> {\n if (!common(value, [\"rallyId\"])) return error(\"rallyId\", \"rallyId must be a non-empty string.\");\n if (value.userId !== undefined && !nonEmpty(value.userId))\n return error(\"userId\", \"userId must be non-empty.\");\n return { success: true, data: value as { readonly rallyId: string; readonly userId?: string } };\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 validateCheckInRequest,\n validateClaimRewardRequest,\n validateSyncRequest,\n} from \"./security.js\";\n\ntype ErrorResponse = { readonly ok: false; readonly code: string; readonly message: string };\ntype ClaimResponse =\n | { readonly ok: true; readonly state: UserRallyState; readonly claimTicketNumber?: string }\n | ErrorResponse;\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 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 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}\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\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 || body.data.rallyId !== this.#config.id)\n return json(\n { ok: false, code: \"INVALID_REQUEST\", message: \"Invalid check-in request.\" },\n 400,\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 result = await this.checkIn({ ...body.data, userId });\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 || body.data.rallyId !== this.#config.id)\n return json({ ok: false, code: \"INVALID_REQUEST\", message: \"Invalid reward request.\" }, 400);\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 result = await this.claimReward({ ...body.data, userId });\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 || body.data.rallyId !== this.#config.id)\n return json({ ok: false, code: \"INVALID_REQUEST\", message: \"Invalid sync request.\" }, 400);\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 return json({ ok: true, state: await this.sync(body.data.rallyId, userId) });\n }\n async checkIn(request: CheckInRequest & { readonly userId: string }): Promise<CheckInResponse> {\n const key = `check-in:${request.rallyId}:${request.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}:${request.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, request.userId)) ??\n initialState(this.#config, request.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 request.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 request,\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 request,\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 request,\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 request,\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: request.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 & { readonly userId: string },\n ): Promise<ClaimResponse> {\n const key = `claim:${request.rallyId}:${request.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 request,\n now(this.#options),\n );\n const lockKey = `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: request.userId,\n rewardId: reward.id,\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, request.userId, timestamp),\n },\n ({ stock, 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 request.userId,\n \"CLAIM_REWARD\",\n reward.id,\n request.idempotencyKey,\n status,\n timestamp,\n code,\n );\n if (stock !== null && stock <= 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 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 next: UserRallyState = {\n ...userState,\n rewards: nextRewards,\n updatedAt: timestamp,\n };\n responseHolder.value =\n local.value.claimTicketNumber === undefined\n ? { ok: true, state: next }\n : { ok: true, state: next, claimTicketNumber: local.value.claimTicketNumber };\n return {\n nextStock: stock === null ? null : stock - 1,\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 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 return (\n (await this.#persistence.getUserState(rallyId, userId)) ??\n initialState(this.#config, userId, now(this.#options))\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 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"]}
|
|
1
|
+
{"version":3,"sources":["../src/examples/transaction.ts","../src/persistence.ts","../src/security.ts","../src/server.ts"],"names":["now","record","errors","reconcileRewardStates","evaluateConditionDetailed","consumeReward"],"mappings":"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","file":"index.cjs","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.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 /** 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 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 #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 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 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 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 ?? params.initialStock ?? null,\n secondaryStock: storedSecondaryStock ?? params.initialSecondaryStock ?? null,\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 ?? params.initialStock ?? null;\n if (\n currentStock === null &&\n params.initialStock !== undefined &&\n params.initialStock !== null\n )\n this.#stocks.set(\n this.#stockKey(params.rallyId, params.stockKey ?? params.rewardId),\n params.initialStock,\n );\n const currentSecondaryStock =\n params.secondaryStockKey === undefined\n ? null\n : await this.getRewardStock(params.rallyId, params.secondaryStockKey);\n const effectiveSecondaryStock =\n currentSecondaryStock ?? params.initialSecondaryStock ?? null;\n if (\n currentSecondaryStock === null &&\n params.secondaryStockKey !== undefined &&\n params.initialSecondaryStock !== undefined &&\n params.initialSecondaryStock !== null\n )\n this.#stocks.set(\n this.#stockKey(params.rallyId, params.secondaryStockKey),\n params.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 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}\n","import 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\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 && !nonEmpty(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\nexport function validateSyncRequest(\n value: unknown,\n): RequestValidationResult<{ readonly rallyId: string; readonly userId?: string }> {\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 { success: true, data: value as { readonly rallyId: string; readonly userId?: string } };\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 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\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 result = await this.checkIn({ ...body.data, userId });\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 result = await this.claimReward({ ...body.data, userId });\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 return json({ ok: true, state: await this.sync(body.data.rallyId, userId) });\n }\n async checkIn(request: CheckInRequest & { readonly userId: string }): Promise<CheckInResponse> {\n const key = `check-in:${request.rallyId}:${request.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}:${request.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, request.userId)) ??\n initialState(this.#config, request.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 request.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 request,\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 request,\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 request,\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 request,\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: request.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 & { readonly userId: string },\n ): Promise<ClaimResponse> {\n const key = `claim:${request.rallyId}:${request.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 request,\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 const plan = inventoryPlan(this.#config, reward.id, reward.stockLimit);\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: request.userId,\n rewardId: reward.id,\n stockKey: plan.primaryKey,\n ...(plan.secondaryKey === undefined ? {} : { secondaryStockKey: plan.secondaryKey }),\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, request.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 request.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 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 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 #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 if (this.#options.anonymousPolicy === \"reject\") return null;\n const sessionId = request.headers.get(\"X-Anonymous-Session-Id\");\n if (sessionId !== null && isUuidV4(sessionId)) return sessionId;\n if (this.#options.anonymousPolicy === \"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"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -20,9 +20,14 @@ interface ClaimRewardTransactionParams {
|
|
|
20
20
|
readonly idempotencyTtlMs?: number;
|
|
21
21
|
/** Used when the first claim is made before a user state has been stored. */
|
|
22
22
|
readonly initialUserState?: UserRallyState;
|
|
23
|
+
readonly stockKey?: string;
|
|
24
|
+
readonly secondaryStockKey?: string;
|
|
25
|
+
readonly initialStock?: number | null;
|
|
26
|
+
readonly initialSecondaryStock?: number | null;
|
|
23
27
|
}
|
|
24
28
|
interface ClaimRewardTransactionMutation {
|
|
25
29
|
readonly nextStock: number | null;
|
|
30
|
+
readonly nextSecondaryStock?: number | null;
|
|
26
31
|
readonly nextUserState: UserRallyState;
|
|
27
32
|
readonly auditLog: AuditLog;
|
|
28
33
|
/** The server response is persisted by the adapter with the idempotency key. */
|
|
@@ -60,6 +65,7 @@ interface ServerPersistenceAdapter {
|
|
|
60
65
|
*/
|
|
61
66
|
executeClaimRewardTransaction(params: ClaimRewardTransactionParams, mutation: (current: {
|
|
62
67
|
readonly stock: number | null;
|
|
68
|
+
readonly secondaryStock: number | null;
|
|
63
69
|
readonly claimCount: number;
|
|
64
70
|
readonly userState: UserRallyState;
|
|
65
71
|
}) => ClaimRewardTransactionMutation): Promise<{
|
|
@@ -100,6 +106,7 @@ declare class InMemoryServerPersistenceAdapter implements ServerPersistenceAdapt
|
|
|
100
106
|
restoreRewardStock(rallyId: string, rewardId: string, count?: number): Promise<void>;
|
|
101
107
|
executeClaimRewardTransaction(params: ClaimRewardTransactionParams, mutation: (current: {
|
|
102
108
|
readonly stock: number | null;
|
|
109
|
+
readonly secondaryStock: number | null;
|
|
103
110
|
readonly claimCount: number;
|
|
104
111
|
readonly userState: UserRallyState;
|
|
105
112
|
}) => ClaimRewardTransactionMutation): Promise<{
|
|
@@ -144,10 +151,12 @@ interface SqlTransactionDatabase<Tx> {
|
|
|
144
151
|
interface SqlClaimRewardStore<Tx> {
|
|
145
152
|
readContext(transaction: Tx, params: ClaimRewardTransactionParams): Promise<{
|
|
146
153
|
readonly stock: number | null;
|
|
154
|
+
readonly secondaryStock?: number | null;
|
|
147
155
|
readonly claimCount: number;
|
|
148
156
|
readonly userState: UserRallyState;
|
|
149
157
|
}>;
|
|
150
158
|
writeStock(transaction: Tx, params: ClaimRewardTransactionParams, nextStock: number): Promise<void>;
|
|
159
|
+
writeSecondaryStock?(transaction: Tx, params: ClaimRewardTransactionParams, nextStock: number): Promise<void>;
|
|
151
160
|
writeUserState(transaction: Tx, params: ClaimRewardTransactionParams, state: UserRallyState): Promise<void>;
|
|
152
161
|
writeClaimRecord(transaction: Tx, params: ClaimRewardTransactionParams, state: UserRallyState): Promise<void>;
|
|
153
162
|
writeAudit(transaction: Tx, log: AuditLog): Promise<void>;
|
|
@@ -167,11 +176,33 @@ declare function executeClaimRewardTransaction<Tx>(database: SqlTransactionDatab
|
|
|
167
176
|
readonly success: boolean;
|
|
168
177
|
readonly error?: string;
|
|
169
178
|
}>;
|
|
179
|
+
interface SqlCheckInStore<Tx> {
|
|
180
|
+
readUserState?(transaction: Tx, params: CheckInTransactionParams): Promise<UserRallyState>;
|
|
181
|
+
writeUserState(transaction: Tx, params: CheckInTransactionParams, state: UserRallyState): Promise<void>;
|
|
182
|
+
writeAudit(transaction: Tx, log: AuditLog): Promise<void>;
|
|
183
|
+
writeIdempotency(transaction: Tx, params: CheckInTransactionParams, result: unknown): Promise<void>;
|
|
184
|
+
}
|
|
185
|
+
/** Reference transaction block for a check-in state, audit, and idempotency write. */
|
|
186
|
+
declare function executeCheckInTransaction<Tx>(database: SqlTransactionDatabase<Tx>, store: SqlCheckInStore<Tx>, params: CheckInTransactionParams, mutation: (current: {
|
|
187
|
+
readonly userState: UserRallyState;
|
|
188
|
+
}) => CheckInTransactionMutation, current?: UserRallyState): Promise<{
|
|
189
|
+
readonly success: boolean;
|
|
190
|
+
readonly error?: string;
|
|
191
|
+
}>;
|
|
192
|
+
interface RedisMultiExecutor<TMulti> {
|
|
193
|
+
multi(): TMulti;
|
|
194
|
+
exec(multi: TMulti): Promise<ReadonlyArray<unknown> | null>;
|
|
195
|
+
}
|
|
196
|
+
/** Reference for Redis MULTI/EXEC adapters: all queued commands commit together. */
|
|
197
|
+
declare function executeRedisTransaction<TMulti>(redis: RedisMultiExecutor<TMulti>, queue: (multi: TMulti) => void): Promise<{
|
|
198
|
+
readonly success: boolean;
|
|
199
|
+
readonly error?: string;
|
|
200
|
+
}>;
|
|
170
201
|
|
|
171
202
|
interface RequestValidationError {
|
|
172
203
|
readonly path: string;
|
|
173
204
|
readonly message: string;
|
|
174
|
-
readonly code:
|
|
205
|
+
readonly code: string;
|
|
175
206
|
}
|
|
176
207
|
type RequestValidationResult<T> = {
|
|
177
208
|
readonly success: true;
|
|
@@ -196,7 +227,12 @@ type ClaimResponse = {
|
|
|
196
227
|
readonly ok: true;
|
|
197
228
|
readonly state: UserRallyState;
|
|
198
229
|
readonly claimTicketNumber?: string;
|
|
230
|
+
readonly inventory?: InventoryStatus;
|
|
199
231
|
} | ErrorResponse;
|
|
232
|
+
interface InventoryStatus {
|
|
233
|
+
readonly sharedRemaining?: number;
|
|
234
|
+
readonly rewardRemaining?: number;
|
|
235
|
+
}
|
|
200
236
|
declare class StampRallyServer {
|
|
201
237
|
#private;
|
|
202
238
|
constructor(config: AdminRallyConfig, persistence: ServerPersistenceAdapter, options?: ServerOptions);
|
|
@@ -231,7 +267,7 @@ interface CheckInRequest {
|
|
|
231
267
|
readonly spotId: string;
|
|
232
268
|
readonly context: _stamprally_core.VerificationContext;
|
|
233
269
|
readonly idempotencyKey: string;
|
|
234
|
-
readonly now?: string;
|
|
270
|
+
readonly now?: string | number;
|
|
235
271
|
}
|
|
236
272
|
interface ClaimRewardRequest {
|
|
237
273
|
readonly rallyId: string;
|
|
@@ -240,7 +276,7 @@ interface ClaimRewardRequest {
|
|
|
240
276
|
readonly idempotencyKey: string;
|
|
241
277
|
readonly staffPasscode?: string;
|
|
242
278
|
readonly staffId?: string;
|
|
243
|
-
readonly now?: string;
|
|
279
|
+
readonly now?: string | number;
|
|
244
280
|
}
|
|
245
281
|
type CheckInResponse = {
|
|
246
282
|
readonly ok: true;
|
|
@@ -258,9 +294,10 @@ interface ServerOptions {
|
|
|
258
294
|
readonly authenticate?: (request: Request) => Promise<string | AuthenticationContext | null> | string | AuthenticationContext | null;
|
|
259
295
|
readonly customValidators?: Readonly<Record<string, _stamprally_core.Validator>>;
|
|
260
296
|
readonly now?: () => string;
|
|
297
|
+
readonly anonymousPolicy?: "session_scoped" | "reject";
|
|
261
298
|
}
|
|
262
299
|
interface AuthenticationContext {
|
|
263
300
|
readonly authenticatedUserId: string;
|
|
264
301
|
}
|
|
265
302
|
|
|
266
|
-
export { type AuditLog, type AuthenticationContext, type CheckInRequest, type CheckInResponse, type CheckInTransactionMutation, type CheckInTransactionParams, type ClaimRewardRequest, type ClaimRewardTransactionMutation, type ClaimRewardTransactionParams, InMemoryServerPersistenceAdapter, type InMemoryServerPersistenceOptions, type RequestValidationError, type RequestValidationResult, type ServerOptions, type ServerPersistenceAdapter, type SqlClaimRewardStore, type SqlTransactionDatabase, StampRallyServer, type SyncOperationStatus, type UserClaimRecord, executeClaimRewardTransaction, validateCheckInRequest, validateClaimRewardRequest, validateSyncRequest };
|
|
303
|
+
export { type AuditLog, type AuthenticationContext, type CheckInRequest, type CheckInResponse, type CheckInTransactionMutation, type CheckInTransactionParams, type ClaimRewardRequest, type ClaimRewardTransactionMutation, type ClaimRewardTransactionParams, InMemoryServerPersistenceAdapter, type InMemoryServerPersistenceOptions, type RedisMultiExecutor, type RequestValidationError, type RequestValidationResult, type ServerOptions, type ServerPersistenceAdapter, type SqlCheckInStore, type SqlClaimRewardStore, type SqlTransactionDatabase, StampRallyServer, type SyncOperationStatus, type UserClaimRecord, executeCheckInTransaction, executeClaimRewardTransaction, executeRedisTransaction, validateCheckInRequest, validateClaimRewardRequest, validateSyncRequest };
|