@stamprally/core 0.19.0 → 0.20.1
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 +29 -2
- package/dist/index.cjs +99 -100
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +111 -79
- package/dist/index.d.ts +111 -79
- package/dist/index.js +99 -100
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/evaluate.ts","../src/engine/order.ts","../src/engine/progress.ts","../src/engine/rewards.ts","../src/engine/sync.ts","../src/detectors/types.ts","../src/detectors/geolocation.ts","../src/detectors/nfc.ts","../src/detectors/passcode.ts","../src/detectors/qr.ts","../src/engine/transition.ts","../src/client/storage.ts","../src/client/offlineQueue.ts","../src/client/sync.ts","../src/client/client.ts","../src/crypto/token.ts","../src/domain/models.ts","../src/domain/configTransform.ts","../src/domain/i18n.ts","../src/domain/themePresets.ts","../src/domain/validation.ts","../src/security/snapshotToken.ts"],"names":["value","condition","spot","id","cryptoApi","reward","DEFAULT_TIMEOUT_MS","record","bytes","rewards","operationId","error","next","isRecord","encoder"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n CheckInCondition,\n ConditionMatch,\n ConditionMismatch,\n Result,\n SpotItem,\n SpotStatus,\n UserRallyState,\n VerificationContext,\n} from \"../domain/index.js\";\n\nconst EARTH_RADIUS_METERS = 6_371_000;\nexport function calculateDistanceMeters(\n aLat: number,\n aLon: number,\n bLat: number,\n bLon: number,\n): number {\n const radians = (value: number): number => (value * Math.PI) / 180;\n const dLat = radians(bLat - aLat);\n const dLon = radians(bLon - aLon);\n const value =\n Math.sin(dLat / 2) ** 2 +\n Math.cos(radians(aLat)) * Math.cos(radians(bLat)) * Math.sin(dLon / 2) ** 2;\n return 2 * EARTH_RADIUS_METERS * Math.asin(Math.sqrt(Math.min(1, value)));\n}\nfunction mismatch(\n conditionType: CheckInCondition[\"type\"],\n reason: ConditionMismatch[\"reason\"],\n extra: Partial<ConditionMismatch> = {},\n): Result<ConditionMatch, ConditionMismatch> {\n return { ok: false, error: { code: \"CONDITION_MISMATCH\", conditionType, reason, ...extra } };\n}\nexport function evaluateConditionDetailed(\n condition: CheckInCondition,\n context: VerificationContext,\n): Result<ConditionMatch, ConditionMismatch> {\n switch (condition.type) {\n case \"qr\":\n return context.type === \"qr\" && context.token === condition.secretToken\n ? { ok: true, value: { conditionType: \"qr\" } }\n : mismatch(\"qr\", \"INVALID_PROOF\");\n case \"passcode\":\n return context.type === \"passcode\" &&\n (condition.caseSensitive === false\n ? context.code.toLocaleLowerCase() === condition.code.toLocaleLowerCase()\n : context.code === condition.code)\n ? { ok: true, value: { conditionType: \"passcode\" } }\n : mismatch(\"passcode\", \"INVALID_PROOF\");\n case \"nfc\":\n return context.type === \"nfc\" && context.tagId === condition.tagId\n ? { ok: true, value: { conditionType: \"nfc\" } }\n : mismatch(\"nfc\", \"INVALID_PROOF\");\n case \"custom\":\n return mismatch(\"custom\", \"VALIDATOR_FAILED\");\n case \"gps\": {\n if (\n !Number.isFinite(condition.latitude) ||\n !Number.isFinite(condition.longitude) ||\n !Number.isFinite(condition.radiusMeters) ||\n condition.radiusMeters < 0 ||\n context.type !== \"gps\" ||\n !Number.isFinite(context.latitude) ||\n !Number.isFinite(context.longitude)\n )\n return mismatch(\"gps\", \"INVALID_GEO_INPUT\");\n const distanceMeters = calculateDistanceMeters(\n condition.latitude,\n condition.longitude,\n context.latitude,\n context.longitude,\n );\n return distanceMeters <= condition.radiusMeters\n ? { ok: true, value: { conditionType: \"gps\", distanceMeters } }\n : mismatch(\"gps\", \"OUTSIDE_RADIUS\", {\n distanceMeters,\n radiusMeters: condition.radiusMeters,\n });\n }\n }\n}\nexport function evaluateCondition(\n condition: CheckInCondition,\n context: VerificationContext,\n): boolean {\n return evaluateConditionDetailed(condition, context).ok;\n}\n\n/** Derives a viewer-safe spot status without changing the supplied state. */\nexport function evaluateSpotStatus(\n spot: Pick<SpotItem, \"id\" | \"prerequisites\">,\n state: Pick<UserRallyState, \"records\">,\n options: { readonly verifying?: boolean } = {},\n): SpotStatus {\n if (options.verifying === true) return \"VERIFYING\";\n if (state.records.some((record) => record.stampId === spot.id)) return \"CLAIMED\";\n const acquired = new Set(state.records.map((record) => record.stampId));\n if (spot.prerequisites?.some((prerequisite) => !acquired.has(prerequisite))) return \"LOCKED\";\n return \"UNCLAIMED\";\n}\n\nexport const getSpotStatus = evaluateSpotStatus;\n","import type { SpotItem } from \"../domain/index.js\";\nexport function getOrderedSpots<TLocale extends string, TMeta extends Record<string, unknown>>(\n spots: ReadonlyArray<SpotItem<TLocale, TMeta>>,\n): ReadonlyArray<SpotItem<TLocale, TMeta>> {\n return [...spots].sort((left, right) => left.orderIndex - right.orderIndex);\n}\n","import type { PublicSpotItem, RallyConfig, StampRallyState } from \"../domain/index.js\";\nexport interface StampRallyProgress {\n readonly acquired: number;\n readonly total: number;\n readonly percentage: number;\n readonly isCompleted: boolean;\n readonly nextAvailableSpots: ReadonlyArray<PublicSpotItem>;\n}\nexport function calculateProgress(state: StampRallyState, config: RallyConfig): StampRallyProgress {\n const ids = new Set(config.spots.map((spot) => spot.id));\n const acquired = new Set(\n state.records.map((record) => record.stampId).filter((id) => ids.has(id)),\n );\n const remaining = config.spots.filter(\n (spot) =>\n !acquired.has(spot.id) &&\n (spot.prerequisites === undefined || spot.prerequisites.every((id) => acquired.has(id))),\n );\n return {\n acquired: acquired.size,\n total: config.spots.length,\n percentage: config.spots.length === 0 ? 0 : (acquired.size / config.spots.length) * 100,\n isCompleted: config.spots.length > 0 && acquired.size === config.spots.length,\n nextAvailableSpots: [...remaining].sort((left, right) => left.orderIndex - right.orderIndex),\n };\n}\n","import type { Reward, RewardState } from \"../domain/models.js\";\n\nexport interface ClaimTicketOptions {\n readonly issuedAt?: string;\n readonly sequence?: number;\n}\n\nfunction hash(value: string): string {\n let result = 2_166_136_261;\n for (const character of value) {\n result ^= character.codePointAt(0) ?? 0;\n result = Math.imul(result, 16_777_619) >>> 0;\n }\n return result.toString(36).toUpperCase().padStart(7, \"0\");\n}\n\nfunction createRandomHash(): string {\n const cryptoApi = globalThis.crypto;\n if (cryptoApi !== undefined && typeof cryptoApi.getRandomValues === \"function\") {\n const values = new Uint32Array(2);\n cryptoApi.getRandomValues(values);\n return Array.from(values, (value) => value.toString(36).toUpperCase().padStart(7, \"0\")).join(\n \"\",\n );\n }\n\n return `${Date.now().toString(36).toUpperCase()}${Math.random().toString(36).slice(2).toUpperCase()}`;\n}\n\nexport function createClaimTicketNumber(\n rewardId: string,\n options: ClaimTicketOptions = {},\n): string {\n const issuedAt = options.issuedAt ?? \"\";\n const sequence = options.sequence ?? 0;\n return `SR-${hash(`${rewardId}|${issuedAt}|${sequence}`)}`;\n}\n\n/** Creates a one-time ticket for a successful reward consumption. */\nexport function createUniqueClaimTicketNumber(rewardId: string, issuedAt: string): string {\n const timestamp = Date.parse(issuedAt);\n const timestampPart = Number.isNaN(timestamp) ? Date.now() : timestamp;\n return `CLAIM-${rewardId}-${timestampPart}-${createRandomHash()}`;\n}\n\nexport function issueClaimTicketNumber(\n reward: Reward,\n currentState: RewardState,\n options: ClaimTicketOptions = {},\n): RewardState {\n if (currentState.claimTicketNumber !== undefined) return currentState;\n const claimTicketNumber = createClaimTicketNumber(reward.id, options);\n return { ...currentState, claimTicketNumber };\n}\n","import type { UserRallyState } from \"../domain/index.js\";\n\nexport type ConflictResolutionPolicy = \"authoritative_replay\";\n\n/** Uses the server snapshot as the immutable replay baseline. */\nexport function resolveRallyStateConflict(\n serverState: UserRallyState,\n _localState: UserRallyState,\n): UserRallyState {\n return {\n ...serverState,\n records: serverState.records.map((record) => ({\n ...record,\n ...(record.metadata === undefined ? {} : { metadata: { ...record.metadata } }),\n })),\n rewards: serverState.rewards.map((reward) => ({ ...reward })),\n ...(serverState.inventory === undefined\n ? {}\n : {\n inventory: {\n ...serverState.inventory,\n ...(serverState.inventory.rewardRemaining === undefined\n ? {}\n : { rewardRemaining: { ...serverState.inventory.rewardRemaining } }),\n },\n }),\n };\n}\n","import type { Result, VerificationContext } from \"../domain/index.js\";\n\nexport type DetectorKind = \"geolocation\" | \"nfc\" | \"qr\";\n\nexport type DetectorErrorCode =\n | \"UNSUPPORTED\"\n | \"PERMISSION_DENIED\"\n | \"POSITION_UNAVAILABLE\"\n | \"TIMEOUT\"\n | \"ABORTED\"\n | \"READ_FAILED\"\n | \"INVALID_DATA\"\n | \"NO_TOKEN\";\n\nexport interface DetectorError {\n readonly detector: DetectorKind;\n readonly code: DetectorErrorCode;\n readonly message: string;\n readonly cause?: unknown;\n}\n\nexport type GeoVerificationContext = Extract<VerificationContext, { readonly type: \"gps\" }>;\nexport type QrVerificationContext = Extract<VerificationContext, { readonly type: \"qr\" }>;\nexport type NfcVerificationContext = Extract<VerificationContext, { readonly type: \"nfc\" }>;\nexport type DetectorResult<T extends VerificationContext> = Result<T, DetectorError>;\n\nexport interface PasscodeCondition {\n readonly code: string;\n readonly caseSensitive?: boolean;\n}\n\nexport function createDetectorError(\n detector: DetectorKind,\n code: DetectorErrorCode,\n message: string,\n cause?: unknown,\n): DetectorError {\n return cause === undefined ? { detector, code, message } : { detector, code, message, cause };\n}\n\nexport function mapBrowserError(detector: DetectorKind, error: unknown): DetectorError {\n if (typeof DOMException !== \"undefined\" && error instanceof DOMException) {\n if (error.name === \"NotAllowedError\" || error.name === \"SecurityError\") {\n return createDetectorError(\n detector,\n \"PERMISSION_DENIED\",\n `${detector} permission was denied.`,\n error,\n );\n }\n if (error.name === \"AbortError\") {\n return createDetectorError(detector, \"ABORTED\", `${detector} detection was aborted.`, error);\n }\n if (error.name === \"NotSupportedError\") {\n return createDetectorError(\n detector,\n \"UNSUPPORTED\",\n `${detector} is not supported in this environment.`,\n error,\n );\n }\n if (error.name === \"TimeoutError\") {\n return createDetectorError(detector, \"TIMEOUT\", `${detector} detection timed out.`, error);\n }\n }\n return createDetectorError(detector, \"READ_FAILED\", `${detector} detection failed.`, error);\n}\n","import type { DetectorResult, GeoVerificationContext } from \"./types.js\";\nimport { createDetectorError } from \"./types.js\";\n\nexport interface GeoDetectorOptions {\n readonly enableHighAccuracy?: boolean;\n readonly timeout?: number;\n}\n\nexport function isGeolocationSupported(): boolean {\n return typeof navigator !== \"undefined\" && navigator.geolocation !== undefined;\n}\n\nexport function getCurrentGeoContext(\n options: GeoDetectorOptions = {},\n): Promise<DetectorResult<GeoVerificationContext>> {\n if (!isGeolocationSupported()) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n \"UNSUPPORTED\",\n \"Geolocation is not supported in this environment.\",\n ),\n });\n }\n if (options.timeout !== undefined && (!Number.isFinite(options.timeout) || options.timeout < 0)) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n \"INVALID_DATA\",\n \"Geolocation timeout must be a non-negative finite number.\",\n ),\n });\n }\n\n const positionOptions: PositionOptions = {\n ...(options.enableHighAccuracy === undefined\n ? {}\n : { enableHighAccuracy: options.enableHighAccuracy }),\n ...(options.timeout === undefined ? {} : { timeout: options.timeout }),\n };\n\n return new Promise((resolve) => {\n try {\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const latitude = position.coords.latitude;\n const longitude = position.coords.longitude;\n if (\n !Number.isFinite(latitude) ||\n latitude < -90 ||\n latitude > 90 ||\n !Number.isFinite(longitude) ||\n longitude < -180 ||\n longitude > 180\n ) {\n resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n \"INVALID_DATA\",\n \"Geolocation returned invalid coordinates.\",\n ),\n });\n return;\n }\n resolve({\n ok: true,\n value: { type: \"gps\", latitude, longitude },\n });\n },\n (error) => {\n const code =\n error.code === 1\n ? \"PERMISSION_DENIED\"\n : error.code === 2\n ? \"POSITION_UNAVAILABLE\"\n : error.code === 3\n ? \"TIMEOUT\"\n : \"READ_FAILED\";\n resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n code,\n `Geolocation failed: ${error.message || code}.`,\n error,\n ),\n });\n },\n positionOptions,\n );\n } catch (error) {\n resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n \"READ_FAILED\",\n \"Geolocation failed before a position could be requested.\",\n error,\n ),\n });\n }\n });\n}\n","import type { DetectorError, DetectorResult, NfcVerificationContext } from \"./types.js\";\nimport { createDetectorError, mapBrowserError } from \"./types.js\";\n\ninterface NdefRecordLike {\n readonly recordType: string;\n readonly encoding?: string;\n readonly data?: DataView;\n}\n\ninterface NdefReadingEventLike {\n readonly message: {\n readonly records: ReadonlyArray<NdefRecordLike>;\n };\n}\n\ninterface NdefReaderLike {\n onreading: ((event: NdefReadingEventLike) => void) | null;\n onreadingerror: ((event: Event) => void) | null;\n scan(options?: { readonly signal?: AbortSignal }): Promise<void>;\n}\n\ninterface NdefReaderConstructorLike {\n new (): NdefReaderLike;\n}\n\nexport interface NfcDetectorOptions {\n readonly timeout?: number;\n readonly signal?: AbortSignal;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nfunction getNdefReaderConstructor(): NdefReaderConstructorLike | undefined {\n return (globalThis as { readonly NDEFReader?: NdefReaderConstructorLike }).NDEFReader;\n}\n\nexport function isNfcSupported(): boolean {\n return getNdefReaderConstructor() !== undefined;\n}\n\nfunction decodeFirstTextRecord(event: NdefReadingEventLike): string | null {\n for (const record of event.message.records) {\n if (record.recordType !== \"text\" || record.data === undefined) continue;\n try {\n const token = new TextDecoder(record.encoding ?? \"utf-8\").decode(record.data);\n if (token.length > 0) return token;\n } catch {\n // Try the next text record when one payload cannot be decoded.\n }\n }\n return null;\n}\n\nexport function readNfcContext(\n options: NfcDetectorOptions = {},\n): Promise<DetectorResult<NfcVerificationContext>> {\n const Reader = getNdefReaderConstructor();\n if (Reader === undefined) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\"nfc\", \"UNSUPPORTED\", \"Web NFC is not supported.\"),\n });\n }\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeout) || timeout < 0) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\n \"nfc\",\n \"INVALID_DATA\",\n \"NFC timeout must be a non-negative finite number.\",\n ),\n });\n }\n if (options.signal?.aborted === true) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\"nfc\", \"ABORTED\", \"NFC detection was aborted.\"),\n });\n }\n\n let reader: NdefReaderLike;\n try {\n reader = new Reader();\n } catch (error) {\n return Promise.resolve({ ok: false, error: mapBrowserError(\"nfc\", error) });\n }\n\n return new Promise((resolve) => {\n const scanController = new AbortController();\n let settled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const finish = (result: DetectorResult<NfcVerificationContext>) => {\n if (settled) return;\n settled = true;\n if (timer !== undefined) clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", handleAbort);\n reader.onreading = null;\n reader.onreadingerror = null;\n scanController.abort();\n resolve(result);\n };\n const fail = (error: DetectorError) => finish({ ok: false, error });\n const handleAbort = () =>\n fail(createDetectorError(\"nfc\", \"ABORTED\", \"NFC detection was aborted.\"));\n\n options.signal?.addEventListener(\"abort\", handleAbort, { once: true });\n timer = setTimeout(\n () => fail(createDetectorError(\"nfc\", \"TIMEOUT\", \"NFC detection timed out.\")),\n timeout,\n );\n reader.onreading = (event) => {\n const token = decodeFirstTextRecord(event);\n if (token === null) {\n fail(createDetectorError(\"nfc\", \"NO_TOKEN\", \"The NFC tag has no text token.\"));\n return;\n }\n finish({ ok: true, value: { type: \"nfc\", tagId: token } });\n };\n reader.onreadingerror = (event) =>\n fail(createDetectorError(\"nfc\", \"READ_FAILED\", \"The NFC tag could not be read.\", event));\n\n try {\n void reader\n .scan({ signal: scanController.signal })\n .catch((error: unknown) => fail(mapBrowserError(\"nfc\", error)));\n } catch (error) {\n fail(mapBrowserError(\"nfc\", error));\n }\n });\n}\n","export interface PasscodeCondition {\n readonly code: string;\n readonly caseSensitive?: boolean;\n}\nexport interface PasscodeCheckResult {\n readonly success: boolean;\n readonly message?: string;\n}\nexport function normalizePasscode(input: string, caseSensitive = false): string {\n const normalized = input.normalize(\"NFKC\").trim();\n return caseSensitive ? normalized : normalized.toUpperCase();\n}\nexport function verifyPasscode(\n inputCode: string,\n condition: PasscodeCondition,\n): PasscodeCheckResult {\n return normalizePasscode(inputCode, condition.caseSensitive) ===\n normalizePasscode(condition.code, condition.caseSensitive)\n ? { success: true }\n : { success: false, message: \"The passcode is invalid.\" };\n}\n","import type { Result } from \"../domain/index.js\";\nimport type { DetectorError, DetectorResult, QrVerificationContext } from \"./types.js\";\nimport { createDetectorError, mapBrowserError } from \"./types.js\";\n\ninterface DetectedBarcodeLike {\n readonly rawValue: string;\n}\n\ninterface BarcodeDetectorLike {\n detect(source: HTMLVideoElement): Promise<ReadonlyArray<DetectedBarcodeLike>>;\n}\n\ninterface BarcodeDetectorConstructorLike {\n new (options?: { readonly formats?: ReadonlyArray<string> }): BarcodeDetectorLike;\n}\n\nexport interface QrDetectorOptions {\n readonly timeout?: number;\n readonly signal?: AbortSignal;\n readonly facingMode?: \"user\" | \"environment\";\n}\n\ninterface Termination {\n readonly promise: Promise<DetectorError>;\n readonly cleanup: () => void;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst SCAN_INTERVAL_MS = 120;\n\nfunction getBarcodeDetectorConstructor(): BarcodeDetectorConstructorLike | undefined {\n return (globalThis as { readonly BarcodeDetector?: BarcodeDetectorConstructorLike })\n .BarcodeDetector;\n}\n\nfunction getMediaDevices(): MediaDevices | undefined {\n return typeof navigator === \"undefined\" ? undefined : navigator.mediaDevices;\n}\n\nexport function isQrSupported(): boolean {\n return (\n getBarcodeDetectorConstructor() !== undefined &&\n typeof getMediaDevices()?.getUserMedia === \"function\"\n );\n}\n\nfunction createTermination(timeout: number, signal: AbortSignal | undefined): Termination {\n let settle: ((error: DetectorError) => void) | undefined;\n const promise = new Promise<DetectorError>((resolve) => {\n settle = resolve;\n });\n const handleAbort = () =>\n settle?.(createDetectorError(\"qr\", \"ABORTED\", \"QR detection was aborted.\"));\n signal?.addEventListener(\"abort\", handleAbort, { once: true });\n const timer = setTimeout(\n () => settle?.(createDetectorError(\"qr\", \"TIMEOUT\", \"QR detection timed out.\")),\n timeout,\n );\n return {\n promise,\n cleanup: () => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", handleAbort);\n settle = undefined;\n },\n };\n}\n\nasync function raceWithTermination<T>(\n operation: Promise<T>,\n termination: Promise<DetectorError>,\n): Promise<Result<T, DetectorError>> {\n return Promise.race([\n operation.then(\n (value) => ({ ok: true as const, value }),\n (error: unknown) => ({ ok: false as const, error: mapBrowserError(\"qr\", error) }),\n ),\n termination.then((error) => ({ ok: false as const, error })),\n ]);\n}\n\nfunction stopStream(stream: MediaStream): void {\n for (const track of stream.getTracks()) track.stop();\n}\n\nfunction waitForNextScan(): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, SCAN_INTERVAL_MS));\n}\n\nexport async function readQrContext(\n videoElement: HTMLVideoElement,\n options: QrDetectorOptions = {},\n): Promise<DetectorResult<QrVerificationContext>> {\n const Detector = getBarcodeDetectorConstructor();\n const mediaDevices = getMediaDevices();\n if (Detector === undefined || typeof mediaDevices?.getUserMedia !== \"function\") {\n return {\n ok: false,\n error: createDetectorError(\n \"qr\",\n \"UNSUPPORTED\",\n \"Live QR detection is not supported in this environment.\",\n ),\n };\n }\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeout) || timeout < 0) {\n return {\n ok: false,\n error: createDetectorError(\n \"qr\",\n \"INVALID_DATA\",\n \"QR timeout must be a non-negative finite number.\",\n ),\n };\n }\n if (options.signal?.aborted === true) {\n return {\n ok: false,\n error: createDetectorError(\"qr\", \"ABORTED\", \"QR detection was aborted.\"),\n };\n }\n\n const termination = createTermination(timeout, options.signal);\n let stream: MediaStream | null = null;\n try {\n const mediaPromise = mediaDevices.getUserMedia({\n audio: false,\n video: { facingMode: { ideal: options.facingMode ?? \"environment\" } },\n });\n const mediaResult = await raceWithTermination(mediaPromise, termination.promise);\n if (!mediaResult.ok) {\n void mediaPromise.then(stopStream, () => undefined);\n return mediaResult;\n }\n stream = mediaResult.value;\n videoElement.srcObject = stream;\n videoElement.muted = true;\n videoElement.playsInline = true;\n\n const playResult = await raceWithTermination(videoElement.play(), termination.promise);\n if (!playResult.ok) return playResult;\n\n const detector = new Detector({ formats: [\"qr_code\"] });\n while (true) {\n const detection = await raceWithTermination(\n detector.detect(videoElement),\n termination.promise,\n );\n if (!detection.ok) return detection;\n const token = detection.value.find((barcode) => barcode.rawValue.length > 0)?.rawValue;\n if (token !== undefined) {\n return { ok: true, value: { type: \"qr\", token } };\n }\n\n const interval = await raceWithTermination(waitForNextScan(), termination.promise);\n if (!interval.ok) return interval;\n }\n } catch (error) {\n return { ok: false, error: mapBrowserError(\"qr\", error) };\n } finally {\n termination.cleanup();\n if (stream !== null) stopStream(stream);\n try {\n videoElement.srcObject = null;\n } catch {\n // A custom video element implementation may expose a read-only srcObject.\n }\n }\n}\n","import { verifyPasscode } from \"../detectors/index.js\";\nimport type {\n AdminRallyConfig,\n Result,\n Reward,\n RewardState,\n StampError,\n StampRallyState,\n StampRecord,\n VerificationContext,\n} from \"../domain/index.js\";\nimport { evaluateConditionDetailed } from \"./evaluate.js\";\nimport { createUniqueClaimTicketNumber } from \"./rewards.js\";\n\nexport type RewardConsumeError =\n | {\n readonly code: \"NOT_AVAILABLE\" | \"ALREADY_CONSUMED\" | \"OUT_OF_STOCK\" | \"REWARD_NOT_FOUND\";\n readonly rewardId: string;\n }\n | { readonly code: \"INVALID_PASSCODE\"; readonly rewardId: string; readonly message: string }\n | { readonly code: \"EXPIRED\"; readonly rewardId: string }\n | { readonly code: \"USER_LIMIT_REACHED\"; readonly rewardId: string };\nexport interface ConsumeRewardParams {\n readonly reward: Reward;\n readonly currentState: RewardState;\n readonly inputPasscode?: string;\n readonly staffId?: string;\n readonly now: string;\n readonly userRedemptionCount?: number;\n}\nexport type ConsumeResult = Result<RewardState, RewardConsumeError>;\nexport function reconcileRewardStates(\n rewards: ReadonlyArray<Reward>,\n currentStates: ReadonlyArray<RewardState>,\n acquiredStampCount: number,\n now: string,\n): ReadonlyArray<RewardState> {\n const states = new Map(currentStates.map((state) => [state.rewardId, state]));\n return rewards.map((reward) => {\n const current = states.get(reward.id);\n if (current?.status === \"CONSUMED\" || current?.status === \"EXPIRED\") return current;\n if (reward.validUntil !== undefined && Date.parse(reward.validUntil) <= Date.parse(now))\n return { rewardId: reward.id, status: \"EXPIRED\" };\n if (reward.stockLimit !== undefined && (current?.redeemedCount ?? 0) >= reward.stockLimit)\n return { rewardId: reward.id, status: \"EXPIRED\" };\n if (acquiredStampCount >= reward.requiredStampCount)\n return {\n rewardId: reward.id,\n status: \"AVAILABLE\",\n ...(current?.unlockedAt === undefined\n ? { unlockedAt: now }\n : { unlockedAt: current.unlockedAt }),\n };\n return { rewardId: reward.id, status: \"LOCKED\" };\n });\n}\nexport function consumeReward(params: ConsumeRewardParams): ConsumeResult {\n const { reward, currentState } = params;\n if (currentState.status === \"CONSUMED\")\n return { ok: false, error: { code: \"ALREADY_CONSUMED\", rewardId: reward.id } };\n if (currentState.status !== \"AVAILABLE\")\n return { ok: false, error: { code: \"NOT_AVAILABLE\", rewardId: reward.id } };\n if (reward.validUntil !== undefined && Date.parse(reward.validUntil) <= Date.parse(params.now))\n return { ok: false, error: { code: \"EXPIRED\", rewardId: reward.id } };\n if (reward.stockLimit !== undefined && (currentState.redeemedCount ?? 0) >= reward.stockLimit)\n return { ok: false, error: { code: \"OUT_OF_STOCK\", rewardId: reward.id } };\n if (\n reward.userClaimLimit !== undefined &&\n (params.userRedemptionCount ?? currentState.userRedemptionCount ?? 0) >= reward.userClaimLimit\n )\n return { ok: false, error: { code: \"USER_LIMIT_REACHED\", rewardId: reward.id } };\n if (reward.redemptionMethod === \"staff_passcode\") {\n if (\n reward.staffPasscode === undefined ||\n !verifyPasscode(params.inputPasscode ?? \"\", { code: reward.staffPasscode }).success\n )\n return {\n ok: false,\n error: {\n code: \"INVALID_PASSCODE\",\n rewardId: reward.id,\n message: \"The passcode is invalid.\",\n },\n };\n }\n if (reward.redemptionMethod === \"view_only\") return { ok: true, value: currentState };\n return {\n ok: true,\n value: {\n ...currentState,\n status: \"CONSUMED\",\n consumedAt: params.now,\n claimTicketNumber: createUniqueClaimTicketNumber(reward.id, params.now),\n redeemedCount: (currentState.redeemedCount ?? 0) + 1,\n ...(params.staffId === undefined ? {} : { consumedByStaffId: params.staffId }),\n },\n };\n}\n\nexport interface ProcessStampValue {\n readonly nextState: StampRallyState;\n readonly events: ReadonlyArray<{ readonly type: \"stampAcquired\"; readonly record: StampRecord }>;\n}\nexport function processStamp(\n state: StampRallyState,\n config: AdminRallyConfig,\n spotId: string,\n context: VerificationContext,\n now: string,\n): Result<ProcessStampValue, StampError> {\n const spot = config.spots.find((item) => item.id === spotId);\n if (spot === undefined) return { ok: false, error: { code: \"SPOT_NOT_FOUND\", spotId } };\n if (state.records.some((record) => record.stampId === spotId))\n return { ok: false, error: { code: \"STAMP_ALREADY_ACQUIRED\", spotId } };\n const acquired = new Set(state.records.map((record) => record.stampId));\n if (spot.prerequisites?.some((id) => !acquired.has(id)))\n return { ok: false, error: { code: \"PREREQUISITES_NOT_MET\", spotId } };\n for (const condition of spot.conditions) {\n if (condition.type === \"custom\" || !evaluateConditionDetailed(condition, context).ok)\n return {\n ok: false,\n error:\n condition.type === \"custom\"\n ? {\n code: \"CUSTOM_VALIDATION_FAILED\",\n spotId,\n message: \"Custom validation requires an async validator.\",\n }\n : { code: \"INVALID_PROOF\", spotId },\n };\n }\n const record: StampRecord = { stampId: spotId, acquiredAt: now };\n const records = [...state.records, record];\n const rewards = reconcileRewardStates(config.rewards, state.rewards, records.length, now);\n return {\n ok: true,\n value: {\n nextState: { ...state, records, rewards, updatedAt: now },\n events: [{ type: \"stampAcquired\", record }],\n },\n };\n}\n","import type { RewardState, StampRallyState, StampRecord } from \"../domain/index.js\";\n\nexport interface StampStorage {\n load(rallyId: string, userId: string | null): Promise<StampRallyState | null>;\n save(state: StampRallyState): Promise<void>;\n remove(rallyId: string, userId: string | null): Promise<void>;\n}\n\nexport interface StorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport type StorageOperation = \"open\" | \"load\" | \"save\" | \"remove\";\nexport type StorageAdapterErrorCode =\n | \"STORAGE_UNAVAILABLE\"\n | \"STORAGE_OPEN_FAILED\"\n | \"STORAGE_READ_FAILED\"\n | \"STORAGE_WRITE_FAILED\"\n | \"STORAGE_REMOVE_FAILED\"\n | \"STORAGE_INVALID_DATA\";\n\nexport class StorageAdapterError extends Error {\n readonly code: StorageAdapterErrorCode;\n readonly operation: StorageOperation;\n readonly rallyId: string | undefined;\n\n constructor(\n code: StorageAdapterErrorCode,\n operation: StorageOperation,\n message: string,\n options: { readonly cause?: unknown; readonly rallyId?: string } = {},\n ) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = \"StorageAdapterError\";\n this.code = code;\n this.operation = operation;\n this.rallyId = options.rallyId;\n }\n}\n\nfunction cloneRecord(record: StampRecord): StampRecord {\n return record.metadata === undefined\n ? { ...record }\n : { ...record, metadata: { ...record.metadata } };\n}\n\nfunction cloneRewardState(state: RewardState): RewardState {\n return { ...state };\n}\n\nexport function cloneState(state: StampRallyState): StampRallyState {\n return {\n ...state,\n records: state.records.map(cloneRecord),\n ...(state.rewards === undefined ? {} : { rewards: state.rewards.map(cloneRewardState) }),\n ...(state.inventory === undefined\n ? {}\n : {\n inventory: {\n ...state.inventory,\n ...(state.inventory.rewardRemaining === undefined\n ? {}\n : { rewardRemaining: { ...state.inventory.rewardRemaining } }),\n },\n }),\n };\n}\n\nfunction isRecord(value: unknown): value is StampRecord {\n if (typeof value !== \"object\" || value === null) return false;\n const record = value as Partial<StampRecord>;\n return (\n typeof record.stampId === \"string\" &&\n typeof record.acquiredAt === \"string\" &&\n (record.metadata === undefined ||\n (typeof record.metadata === \"object\" &&\n record.metadata !== null &&\n !Array.isArray(record.metadata)))\n );\n}\n\nconst rewardStatuses = new Set([\"LOCKED\", \"AVAILABLE\", \"CONSUMED\", \"EXPIRED\"]);\n\nfunction isOptionalDate(value: unknown): value is string | undefined {\n return value === undefined || (typeof value === \"string\" && !Number.isNaN(Date.parse(value)));\n}\n\nexport function isRewardState(value: unknown): value is RewardState {\n if (typeof value !== \"object\" || value === null) return false;\n const state = value as Partial<RewardState>;\n return (\n typeof state.rewardId === \"string\" &&\n typeof state.status === \"string\" &&\n rewardStatuses.has(state.status) &&\n isOptionalDate(state.unlockedAt) &&\n isOptionalDate(state.consumedAt) &&\n (state.consumedByStaffId === undefined || typeof state.consumedByStaffId === \"string\")\n );\n}\n\nexport function isStampRallyState(value: unknown): value is StampRallyState {\n if (typeof value !== \"object\" || value === null) return false;\n const state = value as Partial<StampRallyState>;\n return (\n typeof state.rallyId === \"string\" &&\n (typeof state.userId === \"string\" || state.userId === null) &&\n typeof state.updatedAt === \"string\" &&\n Array.isArray(state.records) &&\n state.records.every(isRecord) &&\n (state.rewards === undefined ||\n (Array.isArray(state.rewards) && state.rewards.every(isRewardState))) &&\n (state.inventory === undefined ||\n (typeof state.inventory === \"object\" &&\n state.inventory !== null &&\n !Array.isArray(state.inventory) &&\n (state.inventory.sharedRemaining === undefined ||\n (typeof state.inventory.sharedRemaining === \"number\" &&\n Number.isInteger(state.inventory.sharedRemaining) &&\n state.inventory.sharedRemaining >= 0)) &&\n (state.inventory.rewardRemaining === undefined ||\n (typeof state.inventory.rewardRemaining === \"object\" &&\n state.inventory.rewardRemaining !== null &&\n !Array.isArray(state.inventory.rewardRemaining)))))\n );\n}\n\nexport interface RallySnapshot {\n readonly version: 1;\n readonly rallyId: string;\n readonly userId: string | null;\n readonly records: ReadonlyArray<StampRecord>;\n readonly rewards: ReadonlyArray<RewardState>;\n readonly exportedAt: string;\n}\n\nfunction isValidDate(value: unknown): value is string {\n return typeof value === \"string\" && !Number.isNaN(Date.parse(value));\n}\n\nfunction isSnapshotRecord(value: unknown): value is StampRecord {\n return isRecord(value) && isValidDate(value.acquiredAt);\n}\n\nfunction isRallySnapshot(value: unknown): value is RallySnapshot {\n if (typeof value !== \"object\" || value === null) return false;\n const snapshot = value as Partial<RallySnapshot>;\n return (\n snapshot.version === 1 &&\n typeof snapshot.rallyId === \"string\" &&\n (typeof snapshot.userId === \"string\" || snapshot.userId === null) &&\n Array.isArray(snapshot.records) &&\n snapshot.records.every(isSnapshotRecord) &&\n Array.isArray(snapshot.rewards) &&\n snapshot.rewards.every(isRewardState) &&\n isValidDate(snapshot.exportedAt)\n );\n}\n\nexport function exportProgressToken(snapshot: RallySnapshot): string {\n return globalThis.btoa(encodeURIComponent(JSON.stringify(snapshot)));\n}\n\nexport function importProgressToken(token: string, currentRallyId: string): RallySnapshot | null {\n try {\n const parsed: unknown = JSON.parse(decodeURIComponent(globalThis.atob(token)));\n if (!isRallySnapshot(parsed) || parsed.rallyId !== currentRallyId) return null;\n return {\n ...parsed,\n records: parsed.records.map(cloneRecord),\n rewards: parsed.rewards.map(cloneRewardState),\n };\n } catch {\n return null;\n }\n}\n\nexport class InMemoryStorage implements StampStorage {\n readonly #states = new Map<string, StampRallyState>();\n\n async load(rallyId: string, userId: string | null): Promise<StampRallyState | null> {\n const state = this.#states.get(storageKey(rallyId, userId));\n return state === undefined ? null : cloneState(state);\n }\n\n async save(state: StampRallyState): Promise<void> {\n this.#states.set(storageKey(state.rallyId, state.userId), cloneState(state));\n }\n\n async remove(rallyId: string, userId: string | null): Promise<void> {\n this.#states.delete(storageKey(rallyId, userId));\n }\n}\n\nexport function storageKey(rallyId: string, userId: string | null): string {\n return `stamprally:${rallyId}:${userId ?? \"anonymous\"}`;\n}\n\nexport function createAnonymousSessionId(storage?: StorageLike | null): string {\n const key = \"stamprally:anonymous-session-id\";\n try {\n const browserStorage = typeof window === \"undefined\" ? null : window.localStorage;\n const value = storage?.getItem(key) ?? browserStorage?.getItem(key);\n if (value !== null && value !== undefined && isUuidV4(value)) return value;\n const generated = randomUuidV4();\n (storage ?? browserStorage)?.setItem(key, generated);\n return generated;\n } catch {\n return randomUuidV4();\n }\n}\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}\n\nfunction randomUuidV4(): string {\n const cryptoApi = globalThis.crypto;\n if (cryptoApi?.randomUUID !== undefined) return cryptoApi.randomUUID();\n if (cryptoApi?.getRandomValues !== undefined) {\n const bytes = cryptoApi.getRandomValues(new Uint8Array(16));\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40;\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80;\n const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n }\n const random = `${Date.now().toString(16)}${Math.random().toString(16).slice(2)}`\n .padEnd(32, \"0\")\n .slice(0, 32);\n return `${random.slice(0, 8)}-${random.slice(8, 12)}-4${random.slice(13, 16)}-8${random.slice(17, 20)}-${random.slice(20)}`;\n}\n\nexport interface LocalStorageAdapterOptions {\n readonly storage?: StorageLike | null;\n readonly keyPrefix?: string;\n readonly failureMode?: LocalStorageFailureMode;\n readonly onWarning?: StorageWarningHandler;\n}\n\nexport type LocalStorageFailureMode = \"fallback\" | \"throw\";\nexport type StorageWarningHandler = (error: StorageAdapterError) => void;\n\nconst defaultStorageWarningHandler: StorageWarningHandler = (error) => {\n console.warn(`[@stamprally/core] ${error.message}`, error);\n};\n\nexport class LocalStorageAdapter implements StampStorage {\n readonly #providedStorage: StorageLike | null | undefined;\n readonly #keyPrefix: string;\n readonly #failureMode: LocalStorageFailureMode;\n readonly #onWarning: StorageWarningHandler;\n readonly #fallbackStorage = new InMemoryStorage();\n #isFallbackActive = false;\n\n constructor(options: LocalStorageAdapterOptions = {}) {\n this.#providedStorage = options.storage;\n this.#keyPrefix = options.keyPrefix ?? \"stamprally:\";\n this.#failureMode = options.failureMode ?? \"fallback\";\n this.#onWarning = options.onWarning ?? defaultStorageWarningHandler;\n }\n\n async load(rallyId: string, userId: string | null): Promise<StampRallyState | null> {\n if (this.#isFallbackActive) return this.#fallbackStorage.load(rallyId, userId);\n\n try {\n const serialized = this.#getStorage(\"load\", rallyId).getItem(this.#key(rallyId, userId));\n if (serialized === null) return null;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(serialized);\n } catch (cause) {\n throw new StorageAdapterError(\n \"STORAGE_INVALID_DATA\",\n \"load\",\n `Stored rally '${rallyId}' is not valid JSON.`,\n { cause, rallyId },\n );\n }\n if (!isStampRallyState(parsed) || parsed.rallyId !== rallyId) {\n throw new StorageAdapterError(\n \"STORAGE_INVALID_DATA\",\n \"load\",\n `Stored rally '${rallyId}' has an invalid state shape.`,\n { rallyId },\n );\n }\n return cloneState(parsed);\n } catch (cause) {\n return this.#handleFailure(\n this.#normalizeError(\n cause,\n \"STORAGE_READ_FAILED\",\n \"load\",\n `Failed to read rally '${rallyId}' from localStorage.`,\n rallyId,\n ),\n () => this.#fallbackStorage.load(rallyId, userId),\n );\n }\n }\n\n async save(state: StampRallyState): Promise<void> {\n if (this.#isFallbackActive) return this.#fallbackStorage.save(state);\n\n try {\n this.#getStorage(\"save\", state.rallyId).setItem(\n this.#key(state.rallyId, state.userId),\n JSON.stringify(state),\n );\n } catch (cause) {\n return this.#handleFailure(\n this.#normalizeError(\n cause,\n \"STORAGE_WRITE_FAILED\",\n \"save\",\n `Failed to save rally '${state.rallyId}' to localStorage.`,\n state.rallyId,\n ),\n () => this.#fallbackStorage.save(state),\n );\n }\n }\n\n async remove(rallyId: string, userId: string | null): Promise<void> {\n if (this.#isFallbackActive) return this.#fallbackStorage.remove(rallyId, userId);\n\n try {\n this.#getStorage(\"remove\", rallyId).removeItem(this.#key(rallyId, userId));\n } catch (cause) {\n return this.#handleFailure(\n this.#normalizeError(\n cause,\n \"STORAGE_REMOVE_FAILED\",\n \"remove\",\n `Failed to remove rally '${rallyId}' from localStorage.`,\n rallyId,\n ),\n () => this.#fallbackStorage.remove(rallyId, userId),\n );\n }\n }\n\n #key(rallyId: string, userId: string | null): string {\n return `${this.#keyPrefix}${rallyId}:${userId ?? \"anonymous\"}`;\n }\n\n #getStorage(operation: StorageOperation, rallyId: string): StorageLike {\n if (this.#providedStorage === null) {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n operation,\n \"localStorage is unavailable in this environment.\",\n { rallyId },\n );\n }\n if (this.#providedStorage !== undefined) return this.#providedStorage;\n if (typeof window === \"undefined\") {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n operation,\n \"localStorage is unavailable in this environment.\",\n { rallyId },\n );\n }\n try {\n const storage = window.localStorage;\n if (storage !== undefined) return storage;\n } catch (cause) {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n operation,\n \"localStorage is unavailable in this environment.\",\n { cause, rallyId },\n );\n }\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n operation,\n \"localStorage is unavailable in this environment.\",\n { rallyId },\n );\n }\n\n #normalizeError(\n cause: unknown,\n code: StorageAdapterErrorCode,\n operation: StorageOperation,\n message: string,\n rallyId: string,\n ): StorageAdapterError {\n return cause instanceof StorageAdapterError\n ? cause\n : new StorageAdapterError(code, operation, message, { cause, rallyId });\n }\n\n #handleFailure<T>(error: StorageAdapterError, fallback: () => Promise<T>): Promise<T> {\n if (this.#failureMode === \"throw\") throw error;\n this.#isFallbackActive = true;\n try {\n this.#onWarning(error);\n } catch {\n // Warning handlers must not prevent the safe in-memory fallback.\n }\n return fallback();\n }\n}\n\nexport interface IndexedDBAdapterOptions {\n readonly indexedDB?: IDBFactory | null;\n readonly databaseName?: string;\n}\n\nconst INDEXED_DB_STORE_NAME = \"states\";\n\nexport class IndexedDBAdapter implements StampStorage {\n readonly #providedFactory: IDBFactory | null | undefined;\n readonly #databaseName: string;\n #databasePromise: Promise<IDBDatabase> | null = null;\n\n constructor(options: IndexedDBAdapterOptions = {}) {\n this.#providedFactory = options.indexedDB;\n this.#databaseName = options.databaseName ?? \"stamprally\";\n }\n\n async load(rallyId: string, userId: string | null): Promise<StampRallyState | null> {\n const database = await this.#openDatabase(rallyId);\n return new Promise((resolve, reject) => {\n try {\n const transaction = database.transaction(INDEXED_DB_STORE_NAME, \"readonly\");\n const request = transaction\n .objectStore(INDEXED_DB_STORE_NAME)\n .get(storageKey(rallyId, userId));\n request.onsuccess = () => {\n const value: unknown = request.result;\n if (value === undefined) {\n resolve(null);\n return;\n }\n if (!isStampRallyState(value) || value.rallyId !== rallyId) {\n reject(\n new StorageAdapterError(\n \"STORAGE_INVALID_DATA\",\n \"load\",\n `Stored rally '${rallyId}' has an invalid state shape.`,\n { rallyId },\n ),\n );\n return;\n }\n resolve(cloneState(value));\n };\n request.onerror = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_READ_FAILED\",\n \"load\",\n `Failed to read rally '${rallyId}' from IndexedDB.`,\n { cause: request.error, rallyId },\n ),\n );\n };\n } catch (cause) {\n reject(\n new StorageAdapterError(\n \"STORAGE_READ_FAILED\",\n \"load\",\n `Failed to read rally '${rallyId}' from IndexedDB.`,\n { cause, rallyId },\n ),\n );\n }\n });\n }\n\n async save(state: StampRallyState): Promise<void> {\n const database = await this.#openDatabase(state.rallyId);\n return new Promise((resolve, reject) => {\n try {\n const transaction = database.transaction(INDEXED_DB_STORE_NAME, \"readwrite\");\n transaction\n .objectStore(INDEXED_DB_STORE_NAME)\n .put(cloneState(state), storageKey(state.rallyId, state.userId));\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_WRITE_FAILED\",\n \"save\",\n `Failed to save rally '${state.rallyId}' to IndexedDB.`,\n { cause: transaction.error, rallyId: state.rallyId },\n ),\n );\n };\n transaction.onabort = transaction.onerror;\n } catch (cause) {\n reject(\n new StorageAdapterError(\n \"STORAGE_WRITE_FAILED\",\n \"save\",\n `Failed to save rally '${state.rallyId}' to IndexedDB.`,\n { cause, rallyId: state.rallyId },\n ),\n );\n }\n });\n }\n\n async remove(rallyId: string, userId: string | null): Promise<void> {\n const database = await this.#openDatabase(rallyId);\n return new Promise((resolve, reject) => {\n try {\n const transaction = database.transaction(INDEXED_DB_STORE_NAME, \"readwrite\");\n transaction.objectStore(INDEXED_DB_STORE_NAME).delete(storageKey(rallyId, userId));\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_REMOVE_FAILED\",\n \"remove\",\n `Failed to remove rally '${rallyId}' from IndexedDB.`,\n { cause: transaction.error, rallyId },\n ),\n );\n };\n transaction.onabort = transaction.onerror;\n } catch (cause) {\n reject(\n new StorageAdapterError(\n \"STORAGE_REMOVE_FAILED\",\n \"remove\",\n `Failed to remove rally '${rallyId}' from IndexedDB.`,\n { cause, rallyId },\n ),\n );\n }\n });\n }\n\n #getFactory(rallyId: string): IDBFactory {\n if (this.#providedFactory === null) {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n \"open\",\n \"IndexedDB is unavailable in this environment.\",\n { rallyId },\n );\n }\n if (this.#providedFactory !== undefined) return this.#providedFactory;\n try {\n const factory = (globalThis as { readonly indexedDB?: IDBFactory }).indexedDB;\n if (factory !== undefined) return factory;\n } catch (cause) {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n \"open\",\n \"IndexedDB is unavailable in this environment.\",\n { cause, rallyId },\n );\n }\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n \"open\",\n \"IndexedDB is unavailable in this environment.\",\n { rallyId },\n );\n }\n\n #openDatabase(rallyId: string): Promise<IDBDatabase> {\n if (this.#databasePromise !== null) return this.#databasePromise;\n const factory = this.#getFactory(rallyId);\n const opening = new Promise<IDBDatabase>((resolve, reject) => {\n let request: IDBOpenDBRequest;\n try {\n request = factory.open(this.#databaseName, 1);\n } catch (cause) {\n reject(\n new StorageAdapterError(\n \"STORAGE_OPEN_FAILED\",\n \"open\",\n `Failed to open IndexedDB database '${this.#databaseName}'.`,\n { cause, rallyId },\n ),\n );\n return;\n }\n request.onupgradeneeded = () => {\n const database = request.result;\n if (!database.objectStoreNames.contains(INDEXED_DB_STORE_NAME)) {\n database.createObjectStore(INDEXED_DB_STORE_NAME);\n }\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_OPEN_FAILED\",\n \"open\",\n `Failed to open IndexedDB database '${this.#databaseName}'.`,\n { cause: request.error, rallyId },\n ),\n );\n };\n request.onblocked = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_OPEN_FAILED\",\n \"open\",\n `Opening IndexedDB database '${this.#databaseName}' was blocked.`,\n { rallyId },\n ),\n );\n };\n });\n this.#databasePromise = opening.catch((error: unknown) => {\n this.#databasePromise = null;\n throw error;\n });\n return this.#databasePromise;\n }\n}\n","import type { AdminRallyConfig, PublicRallyConfig, UserRallyState } from \"../domain/index.js\";\nimport type {\n CheckInRequest,\n CheckInResult,\n ClaimRequest,\n ClaimResult,\n ClientError,\n} from \"./client.js\";\nimport { cloneState } from \"./storage.js\";\n\nexport type QueueOperationStatus =\n | \"PENDING\"\n | \"IN_FLIGHT\"\n | \"ACCEPTED\"\n | \"REJECTED_PERMANENT\"\n | \"FAILED_RETRYABLE\";\nexport type OfflineQueueCapability = \"indexeddb\" | \"localstorage\" | \"memory\" | \"custom\";\nexport type OfflineStorageCapability = OfflineQueueCapability | \"volatile_single_tab\";\n\nexport type OfflineOperation =\n | {\n readonly kind: \"checkIn\";\n readonly request: CheckInRequest;\n readonly optimisticState?: UserRallyState;\n readonly status?: QueueOperationStatus;\n readonly attempts?: number;\n }\n | {\n readonly kind: \"claimReward\";\n readonly request: ClaimRequest;\n readonly optimisticState?: UserRallyState;\n readonly status?: QueueOperationStatus;\n readonly attempts?: number;\n };\nexport type OfflineResult = CheckInResult | ClaimResult | UserRallyState;\nexport type SyncState = \"idle\" | \"syncing\" | \"error\";\nexport type SyncConflictPolicy = \"authoritative_replay\";\nexport interface OfflineConflictResult {\n readonly conflict: true;\n readonly localState: UserRallyState;\n readonly serverState: UserRallyState;\n}\n\nexport interface OfflineQueueStorage {\n load(key: string): Promise<ReadonlyArray<OfflineOperation>>;\n save(key: string, operations: ReadonlyArray<OfflineOperation>): Promise<void>;\n loadRejectedHistory?(key: string): Promise<ReadonlyArray<RejectedOperationHistoryEntry>>;\n saveRejectedHistory?(\n key: string,\n history: ReadonlyArray<RejectedOperationHistoryEntry>,\n ): Promise<void>;\n}\n\nexport interface OfflineQueueCapabilityWarning {\n readonly type: \"STORAGE_CAPABILITY_WARNING\";\n readonly storageCapability: \"volatile_single_tab\" | \"memory\";\n readonly isStoragePersistent: boolean;\n readonly message: string;\n}\n\nexport interface OfflineQueueOptions {\n readonly storage?: OfflineQueueStorage;\n readonly storageLike?: {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem?(key: string): void;\n } | null;\n readonly key?: string;\n /** Rally scope used by the default durable key. */\n readonly rallyId?: string;\n /** User scope used by the default durable key. */\n readonly userId?: string | null;\n readonly databaseName?: string;\n /** Enables storage-event/BroadcastChannel synchronization when browser APIs exist. */\n readonly synchronizeInstances?: boolean;\n readonly retryOptions?: SyncRetryOptions;\n readonly retry?: SyncRetryOptions;\n /** Alias accepted for callers that configure retry behavior at sync time. */\n readonly syncRetryOptions?: SyncRetryOptions;\n}\n\nexport interface SyncRetryOptions {\n readonly maxRetries?: number;\n readonly initialIntervalMs?: number;\n readonly backoffMultiplier?: number;\n}\n\nexport type OfflineSender = (\n operation: OfflineOperation,\n) => Promise<OfflineResult | OfflineConflictResult | OfflineOperationResponse>;\nexport type OfflineOperationStatus = QueueOperationStatus | \"REJECTED\" | \"RETRYABLE_ERROR\";\nexport type OfflineOperationLifecycleStatus = QueueOperationStatus;\nexport interface OfflineOperationError {\n readonly code: string;\n readonly message: string;\n readonly [key: string]: unknown;\n}\nexport interface RejectedOperationHistoryEntry {\n readonly operation: OfflineOperation;\n readonly reason: OfflineOperationError;\n readonly errorCode: string;\n readonly rejectedAt: string;\n readonly attempts: number;\n}\nexport type RejectedOperation = RejectedOperationHistoryEntry;\nexport type OfflineOperationResponse =\n | {\n readonly status: \"ACCEPTED\";\n readonly result?: OfflineResult | OfflineConflictResult;\n readonly state?: UserRallyState;\n }\n | {\n readonly status: \"REJECTED_PERMANENT\";\n readonly error?: ClientError | OfflineOperationError;\n readonly reason?: ClientError | OfflineOperationError;\n readonly state?: UserRallyState;\n }\n | {\n readonly status: \"RETRYABLE_ERROR\";\n readonly error?: ClientError | OfflineOperationError;\n readonly reason?: ClientError | OfflineOperationError;\n };\nexport interface OfflineSyncResultEvent {\n readonly operation: OfflineOperation;\n readonly result?: OfflineResult | OfflineConflictResult;\n readonly status?: OfflineOperationStatus;\n readonly error?: ClientError | OfflineOperationError;\n readonly state?: UserRallyState;\n}\nexport type OfflineSyncResultListener = (event: OfflineSyncResultEvent) => void | Promise<void>;\nexport type OfflineQueueChangeListener = () => void;\n\n/** Removes only an operation's optimistic changes without mutating its inputs. */\nexport function rollbackOptimisticOperation(\n state: UserRallyState,\n operation: OfflineOperation,\n): UserRallyState {\n const previous = operation.request.state;\n if (operation.kind === \"checkIn\") {\n const records = state.records.filter(\n (record) =>\n record.stampId !== operation.request.spotId || record.acquiredAt !== operation.request.now,\n );\n const previousRewards = new Map(previous.rewards.map((reward) => [reward.rewardId, reward]));\n const rewards = state.rewards.map((reward) => previousRewards.get(reward.rewardId) ?? reward);\n return { ...cloneState(state), records, rewards, updatedAt: previous.updatedAt };\n }\n const previousReward = previous.rewards.find(\n (reward) => reward.rewardId === operation.request.rewardId,\n );\n const rewards = state.rewards\n .filter(\n (reward) => reward.rewardId !== operation.request.rewardId || previousReward !== undefined,\n )\n .map((reward) =>\n reward.rewardId === operation.request.rewardId && previousReward !== undefined\n ? { ...previousReward }\n : reward,\n );\n const cloned = cloneState(state);\n const { inventory: _inventory, ...stateWithoutInventory } = cloned;\n const previousInventory = previous.inventory;\n return previousInventory === undefined\n ? { ...stateWithoutInventory, rewards, updatedAt: previous.updatedAt }\n : {\n ...stateWithoutInventory,\n rewards,\n inventory: {\n ...previousInventory,\n ...(previousInventory.rewardRemaining === undefined\n ? {}\n : { rewardRemaining: { ...previousInventory.rewardRemaining } }),\n },\n updatedAt: previous.updatedAt,\n };\n}\n\nclass MemoryQueueStorage implements OfflineQueueStorage {\n readonly #values = new Map<string, ReadonlyArray<OfflineOperation>>();\n readonly #rejected = new Map<string, ReadonlyArray<RejectedOperationHistoryEntry>>();\n async load(key: string): Promise<ReadonlyArray<OfflineOperation>> {\n return this.#values.get(key) ?? [];\n }\n async save(key: string, operations: ReadonlyArray<OfflineOperation>): Promise<void> {\n this.#values.set(key, structuredClone(operations));\n }\n async loadRejectedHistory(key: string): Promise<ReadonlyArray<RejectedOperationHistoryEntry>> {\n return this.#rejected.get(key) ?? [];\n }\n async saveRejectedHistory(\n key: string,\n history: ReadonlyArray<RejectedOperationHistoryEntry>,\n ): Promise<void> {\n this.#rejected.set(key, structuredClone(history));\n }\n}\n\nclass LocalStorageQueueStorage implements OfflineQueueStorage {\n constructor(readonly storage: NonNullable<OfflineQueueOptions[\"storageLike\"]>) {}\n async load(key: string): Promise<ReadonlyArray<OfflineOperation>> {\n const value = this.storage.getItem(key);\n if (value === null) return [];\n try {\n const parsed: unknown = JSON.parse(value);\n return Array.isArray(parsed) ? (parsed as ReadonlyArray<OfflineOperation>) : [];\n } catch {\n return [];\n }\n }\n async save(key: string, operations: ReadonlyArray<OfflineOperation>): Promise<void> {\n this.storage.setItem(key, JSON.stringify(operations));\n }\n async loadRejectedHistory(key: string): Promise<ReadonlyArray<RejectedOperationHistoryEntry>> {\n const value = this.storage.getItem(`${key}:rejected-history`);\n if (value === null) return [];\n try {\n const parsed: unknown = JSON.parse(value);\n return Array.isArray(parsed) ? (parsed as ReadonlyArray<RejectedOperationHistoryEntry>) : [];\n } catch {\n return [];\n }\n }\n async saveRejectedHistory(\n key: string,\n history: ReadonlyArray<RejectedOperationHistoryEntry>,\n ): Promise<void> {\n this.storage.setItem(`${key}:rejected-history`, JSON.stringify(history));\n }\n}\n\nexport interface IndexedDBOfflineQueueOptions {\n readonly indexedDB?: IDBFactory | null;\n readonly databaseName?: string;\n}\n\nexport class IndexedDBOfflineQueueStorage implements OfflineQueueStorage {\n readonly #providedFactory: IDBFactory | null | undefined;\n readonly #databaseName: string;\n #databasePromise: Promise<IDBDatabase> | null = null;\n\n constructor(options: IndexedDBOfflineQueueOptions = {}) {\n this.#providedFactory = options.indexedDB;\n this.#databaseName = options.databaseName ?? \"stamprally-offline-queue\";\n }\n async load(key: string): Promise<ReadonlyArray<OfflineOperation>> {\n const database = await this.#open();\n return new Promise((resolve, reject) => {\n const request = database\n .transaction(\"operations\", \"readonly\")\n .objectStore(\"operations\")\n .get(key);\n request.onsuccess = () => resolve(Array.isArray(request.result) ? request.result : []);\n request.onerror = () => reject(request.error ?? new Error(\"Failed to read offline queue.\"));\n });\n }\n async save(key: string, operations: ReadonlyArray<OfflineOperation>): Promise<void> {\n const database = await this.#open();\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(\"operations\", \"readwrite\");\n transaction.objectStore(\"operations\").put(structuredClone(operations), key);\n transaction.oncomplete = () => resolve();\n transaction.onerror = () =>\n reject(transaction.error ?? new Error(\"Failed to save offline queue.\"));\n transaction.onabort = () =>\n reject(transaction.error ?? new Error(\"Offline queue write aborted.\"));\n });\n }\n async loadRejectedHistory(key: string): Promise<ReadonlyArray<RejectedOperationHistoryEntry>> {\n const database = await this.#open();\n return new Promise((resolve, reject) => {\n const request = database\n .transaction(\"operations\", \"readonly\")\n .objectStore(\"operations\")\n .get(`${key}:rejected-history`);\n request.onsuccess = () =>\n resolve(\n Array.isArray(request.result)\n ? (request.result as ReadonlyArray<RejectedOperationHistoryEntry>)\n : [],\n );\n request.onerror = () =>\n reject(request.error ?? new Error(\"Failed to read rejected operation history.\"));\n });\n }\n async saveRejectedHistory(\n key: string,\n history: ReadonlyArray<RejectedOperationHistoryEntry>,\n ): Promise<void> {\n const database = await this.#open();\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(\"operations\", \"readwrite\");\n transaction\n .objectStore(\"operations\")\n .put(structuredClone(history), `${key}:rejected-history`);\n transaction.oncomplete = () => resolve();\n transaction.onerror = () =>\n reject(transaction.error ?? new Error(\"Failed to save rejected operation history.\"));\n transaction.onabort = () =>\n reject(transaction.error ?? new Error(\"Rejected operation history write aborted.\"));\n });\n }\n #open(): Promise<IDBDatabase> {\n if (this.#databasePromise !== null) return this.#databasePromise;\n let factory = this.#providedFactory;\n if (factory === undefined)\n factory = (globalThis as { readonly indexedDB?: IDBFactory }).indexedDB;\n if (factory === undefined || factory === null)\n return Promise.reject(new Error(\"IndexedDB is unavailable in this environment.\"));\n this.#databasePromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request = factory.open(this.#databaseName, 1);\n request.onupgradeneeded = () => {\n if (!request.result.objectStoreNames.contains(\"operations\"))\n request.result.createObjectStore(\"operations\");\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error(\"Failed to open offline queue.\"));\n }).catch((error: unknown) => {\n this.#databasePromise = null;\n throw error;\n });\n return this.#databasePromise;\n }\n}\n\nfunction availableLocalStorage(): NonNullable<OfflineQueueOptions[\"storageLike\"]> | null {\n try {\n const storage = (\n globalThis as {\n readonly localStorage?: OfflineQueueOptions[\"storageLike\"];\n }\n ).localStorage;\n return storage ?? null;\n } catch {\n return null;\n }\n}\n\nfunction defaultStorage(databaseName?: string): {\n readonly storage: OfflineQueueStorage;\n readonly capability: OfflineQueueCapability;\n} {\n try {\n const indexedDB = (globalThis as { readonly indexedDB?: IDBFactory }).indexedDB;\n if (indexedDB !== undefined)\n return {\n storage: new IndexedDBOfflineQueueStorage({\n indexedDB,\n ...(databaseName === undefined ? {} : { databaseName }),\n }),\n capability: \"indexeddb\",\n };\n const storage = availableLocalStorage();\n if (storage !== undefined && storage !== null)\n return { storage: new LocalStorageQueueStorage(storage), capability: \"localstorage\" };\n } catch {\n // Access to localStorage can be denied by privacy mode or a sandbox.\n }\n return { storage: new MemoryQueueStorage(), capability: \"memory\" };\n}\n\nexport function offlineOperationId(operation: OfflineOperation): string {\n const identity = operation.request.userId ?? operation.request.anonymousSessionId ?? \"anonymous\";\n return operation.kind === \"checkIn\"\n ? `checkIn:${operation.request.rallyId}:${identity}:${operation.request.idempotencyKey}`\n : `claimReward:${operation.request.rallyId}:${identity}:${operation.request.idempotencyKey}`;\n}\n\nfunction requestScope(operation: OfflineOperation): { rallyId: string; userId: string | null } {\n return {\n rallyId: operation.request.rallyId,\n userId: operation.request.userId,\n };\n}\n\nfunction errorValue(value: unknown, fallbackCode: string): OfflineOperationError {\n if (typeof value === \"object\" && value !== null) {\n const candidate = value as Record<string, unknown>;\n if (typeof candidate.code === \"string\" && typeof candidate.message === \"string\")\n return { ...candidate, code: candidate.code, message: candidate.message };\n }\n if (value instanceof Error) return { code: fallbackCode, message: value.message };\n if (typeof value === \"string\") return { code: fallbackCode, message: value };\n return { code: fallbackCode, message: \"Offline operation was rejected.\" };\n}\n\nconst syncLocks = new Map<string, { readonly owner: string; readonly expiresAt: number }>();\nconst SYNC_LOCK_TTL_MS = 30_000;\nconst DEFAULT_RETRY_OPTIONS: Required<SyncRetryOptions> = {\n maxRetries: 0,\n initialIntervalMs: 250,\n backoffMultiplier: 2,\n};\n\nfunction randomId(): string {\n return (\n globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2)}`\n );\n}\n\n/** Durable, sequential retry queue for operations created while disconnected. */\nexport class OfflineQueue {\n #storage: OfflineQueueStorage;\n #queueCapability: OfflineQueueCapability;\n readonly #configuredKey: string | undefined;\n #rallyId: string | undefined;\n #userId: string | null;\n #operations: OfflineOperation[] = [];\n #rejectedHistory: RejectedOperationHistoryEntry[] = [];\n #loaded = false;\n #state: SyncState = \"idle\";\n #error: Error | null = null;\n #sender: OfflineSender | undefined;\n #syncPromise: Promise<void> | null = null;\n #syncResultListener: OfflineSyncResultListener | undefined;\n #changeListener: OfflineQueueChangeListener | undefined;\n readonly #synchronizeInstances: boolean;\n readonly #retryOptions: Required<SyncRetryOptions>;\n readonly #instanceId = randomId();\n readonly #lockStorage: NonNullable<OfflineQueueOptions[\"storageLike\"]> | null;\n readonly #observedLocks = new Map<\n string,\n { readonly owner: string; readonly expiresAt: number }\n >();\n #warnedMemoryLock = false;\n #capabilityWarningListener: ((event: OfflineQueueCapabilityWarning) => void) | undefined;\n #replayConfig: AdminRallyConfig | PublicRallyConfig | undefined;\n #storageListener: ((event: StorageEvent) => void) | undefined;\n #channel: BroadcastChannel | null = null;\n\n constructor(options: OfflineQueueOptions = {}) {\n if (options.storage !== undefined) {\n this.#storage = options.storage;\n this.#queueCapability = \"custom\";\n } else if (options.storageLike !== undefined && options.storageLike !== null) {\n this.#storage = new LocalStorageQueueStorage(options.storageLike);\n this.#queueCapability = \"localstorage\";\n } else {\n const selected = defaultStorage(options.databaseName);\n this.#storage = selected.storage;\n this.#queueCapability = selected.capability;\n }\n this.#configuredKey = options.key;\n this.#rallyId = options.rallyId;\n this.#userId = options.userId ?? null;\n this.#synchronizeInstances = options.synchronizeInstances ?? true;\n const retryOptions = {\n ...DEFAULT_RETRY_OPTIONS,\n ...(options.retryOptions ?? options.syncRetryOptions ?? options.retry ?? {}),\n };\n this.#retryOptions = {\n maxRetries: Math.max(0, Math.floor(retryOptions.maxRetries)),\n initialIntervalMs: Math.max(0, retryOptions.initialIntervalMs),\n backoffMultiplier: Math.max(1, retryOptions.backoffMultiplier),\n };\n this.#lockStorage = options.storageLike ?? availableLocalStorage();\n if (this.#synchronizeInstances) this.#subscribeToExternalChanges();\n }\n\n get syncState(): SyncState {\n return this.#state;\n }\n get pendingCount(): number {\n return this.#operations.length;\n }\n get queueCapability(): OfflineQueueCapability {\n return this.#queueCapability;\n }\n get storageCapability(): OfflineStorageCapability {\n if (this.#queueCapability === \"memory\") return \"memory\";\n const locks = (globalThis as { readonly navigator?: { readonly locks?: unknown } }).navigator\n ?.locks;\n return locks !== undefined || this.#lockStorage !== null\n ? this.#queueCapability\n : \"volatile_single_tab\";\n }\n get isStoragePersistent(): boolean {\n return this.#queueCapability !== \"memory\";\n }\n get rejectedHistory(): ReadonlyArray<RejectedOperationHistoryEntry> {\n return this.#rejectedHistory;\n }\n get error(): Error | null {\n return this.#error;\n }\n get operations(): ReadonlyArray<OfflineOperation> {\n return this.#operations;\n }\n\n get storageKey(): string {\n return this.#storageKey();\n }\n\n get rallyId(): string | undefined {\n return this.#rallyId;\n }\n\n get userId(): string | null {\n return this.#userId;\n }\n\n setSyncResultListener(listener: OfflineSyncResultListener | undefined): void {\n this.#syncResultListener = listener;\n }\n\n setChangeListener(listener: OfflineQueueChangeListener | undefined): void {\n this.#changeListener = listener;\n }\n\n setCapabilityWarningListener(\n listener: ((event: OfflineQueueCapabilityWarning) => void) | undefined,\n ): void {\n this.#capabilityWarningListener = listener;\n }\n\n setReplayConfig(config: AdminRallyConfig | PublicRallyConfig): void {\n this.#replayConfig = config;\n }\n\n async initialize(): Promise<void> {\n if (this.#loaded) return;\n try {\n const key = this.#storageKey();\n this.#operations = (await this.#storage.load(key)).map(normalizeOperation);\n this.#rejectedHistory =\n (await this.#storage.loadRejectedHistory?.(key))?.map(normalizeRejectedHistory) ?? [];\n } catch (error) {\n if (this.#queueCapability === \"memory\") throw error;\n this.#storage = new MemoryQueueStorage();\n this.#queueCapability = \"memory\";\n this.#operations = [];\n this.#rejectedHistory = [];\n this.#warnMemoryLock(\n `Offline queue persistence is unavailable; queued data can be lost after reload (${String(error)}).`,\n );\n }\n if (this.#queueCapability === \"memory\")\n this.#warnMemoryLock(\"Offline queue persistence is unavailable; queued data is memory-only.\");\n this.#loaded = true;\n }\n\n /** Releases browser listeners when the queue is no longer used. */\n dispose(): void {\n const windowLike = (globalThis as { readonly window?: Window }).window;\n if (windowLike !== undefined && this.#storageListener !== undefined)\n windowLike.removeEventListener(\"storage\", this.#storageListener);\n this.#storageListener = undefined;\n this.#channel?.close();\n this.#channel = null;\n this.#releaseSyncLock();\n }\n\n /** Selects a rally/user queue scope and loads its pending operations. */\n async setScope(rallyId: string, userId: string | null): Promise<void> {\n if (this.#configuredKey !== undefined) {\n this.#rallyId = rallyId;\n this.#userId = userId;\n return this.initialize();\n }\n if (this.#rallyId === rallyId && this.#userId === userId && this.#loaded) return;\n this.#rallyId = rallyId;\n this.#userId = userId;\n this.#operations = [];\n this.#loaded = false;\n await this.initialize();\n }\n\n async switchUser(newUserId: string | null): Promise<void> {\n if (this.#rallyId === undefined)\n throw new Error(\"OfflineQueue.switchUser requires a rally scope.\");\n await this.setScope(this.#rallyId, newUserId);\n }\n\n setSender(sender: OfflineSender): void {\n this.#sender = sender;\n }\n\n async enqueue(operation: OfflineOperation): Promise<void> {\n if (this.#configuredKey === undefined) {\n const scope = requestScope(operation);\n if (this.#rallyId === undefined) await this.setScope(scope.rallyId, scope.userId);\n if (this.#rallyId !== scope.rallyId || this.#userId !== scope.userId)\n throw new Error(\"Offline operation belongs to another rally or user queue.\");\n }\n await this.initialize();\n const id = offlineOperationId(operation);\n if (this.#operations.some((item) => offlineOperationId(item) === id)) return;\n this.#operations = [...this.#operations, { ...operation, status: \"PENDING\", attempts: 0 }];\n await this.#storage.save(this.#storageKey(), this.#operations);\n this.#announceChange();\n }\n\n async enqueueCheckIn(request: CheckInRequest, optimisticState?: UserRallyState): Promise<void> {\n return this.enqueue({\n kind: \"checkIn\",\n request,\n ...(optimisticState === undefined ? {} : { optimisticState }),\n });\n }\n\n async enqueueClaimReward(request: ClaimRequest, optimisticState?: UserRallyState): Promise<void> {\n return this.enqueue({\n kind: \"claimReward\",\n request,\n ...(optimisticState === undefined ? {} : { optimisticState }),\n });\n }\n\n async clear(): Promise<void> {\n await this.initialize();\n this.#operations = [];\n await this.#storage.save(this.#storageKey(), this.#operations);\n this.#announceChange();\n }\n\n async discardRejected(operationId: string): Promise<boolean> {\n await this.initialize();\n const next = this.#rejectedHistory.filter(\n (entry) => offlineOperationId(entry.operation) !== operationId,\n );\n if (next.length === this.#rejectedHistory.length) return false;\n this.#rejectedHistory = next;\n await this.#saveRejectedHistory();\n this.#announceChange();\n return true;\n }\n\n async retryRejected(operationId: string): Promise<boolean> {\n await this.initialize();\n const entry = this.#rejectedHistory.find(\n (candidate) => offlineOperationId(candidate.operation) === operationId,\n );\n if (entry === undefined) return false;\n if (!this.#operations.some((operation) => offlineOperationId(operation) === operationId))\n this.#operations = [\n ...this.#operations,\n { ...entry.operation, status: \"PENDING\", attempts: 0 },\n ];\n this.#rejectedHistory = this.#rejectedHistory.filter((candidate) => candidate !== entry);\n await this.#storage.save(this.#storageKey(), this.#operations);\n await this.#saveRejectedHistory();\n this.#announceChange();\n return true;\n }\n\n async discardRejectedOperation(operationId: string): Promise<boolean> {\n return this.discardRejected(operationId);\n }\n\n async retryRejectedOperation(operationId: string): Promise<boolean> {\n return this.retryRejected(operationId);\n }\n\n async clearRejectedHistory(): Promise<void> {\n await this.initialize();\n if (this.#rejectedHistory.length === 0) return;\n this.#rejectedHistory = [];\n await this.#saveRejectedHistory();\n this.#announceChange();\n }\n\n async sync(sender = this.#sender): Promise<void> {\n await this.initialize();\n if (sender === undefined) throw new Error(\"OfflineQueue.sync requires a sender.\");\n if (this.#syncPromise !== null) return this.#syncPromise;\n this.#sender = sender;\n this.#syncPromise = this.#run(sender).finally(() => {\n this.#syncPromise = null;\n });\n return this.#syncPromise;\n }\n\n async retrySync(sender = this.#sender): Promise<void> {\n return this.sync(sender);\n }\n\n async #run(sender: OfflineSender): Promise<void> {\n const locks = (\n globalThis as {\n readonly navigator?: {\n readonly locks?: {\n request<T>(\n name: string,\n options: { ifAvailable: boolean },\n callback: (lock: unknown) => Promise<T>,\n ): Promise<T>;\n };\n };\n }\n ).navigator?.locks;\n if (locks !== undefined && typeof locks.request === \"function\") {\n let callbackStarted = false;\n try {\n const acquired = await locks.request(\n `stamprally:${this.#storageKey()}:sync`,\n { ifAvailable: true },\n async (lock) => {\n if (lock === null) {\n await this.#reloadFromStorage();\n this.#state = \"idle\";\n this.#changeListener?.();\n return false;\n }\n callbackStarted = true;\n await this.#runWithStorageLock(sender);\n return true;\n },\n );\n if (!acquired) return;\n return;\n } catch (error) {\n // Older browsers and test doubles can expose a partial Locks API.\n if (callbackStarted) throw error;\n }\n }\n if (this.storageCapability === \"volatile_single_tab\")\n this.#warnMemoryLock(\n \"No cross-tab storage lock is available; offline sync is single-tab only.\",\n );\n await this.#runWithStorageLock(sender);\n }\n\n async #runWithStorageLock(sender: OfflineSender): Promise<void> {\n this.#state = \"syncing\";\n this.#error = null;\n this.#changeListener?.();\n if (!this.#acquireSyncLock()) {\n await this.#reloadFromStorage();\n this.#state = \"idle\";\n this.#changeListener?.();\n return;\n }\n try {\n while (this.#operations.length > 0) {\n const operation = this.#operations[0];\n if (operation === undefined) break;\n if (await this.#rejectFailedPrerequisite(operation)) continue;\n let attempt = 0;\n let response: {\n readonly status: OfflineOperationStatus;\n readonly result?: OfflineResult | OfflineConflictResult;\n readonly state?: UserRallyState;\n readonly error?: ClientError | OfflineOperationError;\n readonly reason?: ClientError | OfflineOperationError;\n };\n while (true) {\n await this.#updateOperationStatus(\"IN_FLIGHT\", attempt);\n try {\n response = this.#normalizeResponse(await sender(operation));\n } catch (cause) {\n response = {\n status: \"RETRYABLE_ERROR\",\n error: errorValue(cause, \"RETRYABLE_ERROR\"),\n };\n }\n if (response.status !== \"RETRYABLE_ERROR\") break;\n const error = errorValue(response.error ?? response.reason, \"RETRYABLE_ERROR\");\n await this.#updateOperationStatus(\"PENDING\", attempt + 1);\n await this.#syncResultListener?.({ operation, status: response.status, error });\n if (attempt >= this.#retryOptions.maxRetries) {\n await this.#updateOperationStatus(\"FAILED_RETRYABLE\", attempt + 1);\n throw new Error(error.message);\n }\n const interval =\n this.#retryOptions.initialIntervalMs * this.#retryOptions.backoffMultiplier ** attempt;\n await new Promise<void>((resolve) => setTimeout(resolve, Math.max(0, interval)));\n attempt += 1;\n }\n const result = response.result;\n const state =\n response.state ??\n (result !== undefined && \"conflict\" in result && result.conflict === true\n ? result.serverState\n : result !== undefined && \"ok\" in result && result.ok\n ? result.value.state\n : undefined);\n const error =\n response.status === \"REJECTED_PERMANENT\"\n ? errorValue(\n response.error ??\n response.reason ??\n (result !== undefined && \"ok\" in result && !result.ok ? result.error : undefined),\n \"REJECTED_PERMANENT\",\n )\n : undefined;\n await this.#updateOperationStatus(\n response.status === \"ACCEPTED\" ? \"ACCEPTED\" : \"REJECTED_PERMANENT\",\n attempt + 1,\n );\n const eventState = state;\n if (response.status === \"REJECTED_PERMANENT\" && error !== undefined) {\n this.#rejectedHistory = [\n ...this.#rejectedHistory,\n {\n operation: { ...operation, status: \"REJECTED_PERMANENT\", attempts: attempt + 1 },\n reason: error,\n errorCode: error.code,\n rejectedAt: new Date().toISOString(),\n attempts: attempt + 1,\n },\n ];\n await this.#saveRejectedHistory();\n }\n this.#operations = this.#operations.slice(1);\n await this.#storage.save(this.#storageKey(), this.#operations);\n this.#announceChange();\n await this.#syncResultListener?.({\n operation,\n ...(result === undefined ? {} : { result }),\n status: response.status,\n ...(error === undefined ? {} : { error }),\n ...(eventState === undefined ? {} : { state: eventState }),\n });\n }\n this.#state = \"idle\";\n this.#changeListener?.();\n } catch (cause) {\n this.#state = \"error\";\n this.#error = cause instanceof Error ? cause : new Error(String(cause));\n this.#changeListener?.();\n throw this.#error;\n } finally {\n this.#releaseSyncLock();\n }\n }\n\n async #updateOperationStatus(status: QueueOperationStatus, attempts: number): Promise<void> {\n const operation = this.#operations[0];\n if (operation === undefined) return;\n this.#operations = [{ ...operation, status, attempts }, ...this.#operations.slice(1)];\n await this.#storage.save(this.#storageKey(), this.#operations);\n this.#announceChange();\n }\n\n async #rejectFailedPrerequisite(operation: OfflineOperation): Promise<boolean> {\n if (operation.kind !== \"checkIn\" || this.#replayConfig === undefined) return false;\n const spot = this.#replayConfig.spots.find(\n (candidate) => candidate.id === operation.request.spotId,\n );\n if (spot === undefined) return false;\n const failedSpots = new Set(\n [\n ...this.#rejectedHistory.map((entry) => entry.operation),\n ...this.#operations.filter((candidate) => candidate.status === \"REJECTED_PERMANENT\"),\n ]\n .filter((candidate) => candidate.kind === \"checkIn\")\n .map((candidate) => (candidate.kind === \"checkIn\" ? candidate.request.spotId : undefined))\n .filter((spotId): spotId is string => spotId !== undefined),\n );\n if (!spot.prerequisites?.some((prerequisite) => failedSpots.has(prerequisite))) return false;\n const error: OfflineOperationError = {\n code: \"REJECTED_PREREQUISITE_FAILED\",\n message: \"A prerequisite operation was rejected by the server.\",\n };\n const rejectedOperation = { ...operation, status: \"REJECTED_PERMANENT\" as const };\n this.#rejectedHistory = [\n ...this.#rejectedHistory,\n {\n operation: rejectedOperation,\n reason: error,\n errorCode: error.code,\n rejectedAt: new Date().toISOString(),\n attempts: operation.attempts ?? 0,\n },\n ];\n this.#operations = this.#operations.slice(1);\n await this.#storage.save(this.#storageKey(), this.#operations);\n await this.#saveRejectedHistory();\n this.#announceChange();\n await this.#syncResultListener?.({\n operation,\n status: \"REJECTED_PERMANENT\",\n error,\n });\n return true;\n }\n\n #subscribeToExternalChanges(): void {\n const windowLike = (globalThis as { readonly window?: Window }).window;\n if (windowLike !== undefined) {\n this.#storageListener = (event) => {\n if (\n event.key === this.#storageKey() ||\n event.key === `${this.#storageKey()}:rejected-history`\n )\n void this.#reloadFromStorage();\n };\n windowLike.addEventListener(\"storage\", this.#storageListener);\n }\n const Channel = (globalThis as { readonly BroadcastChannel?: typeof BroadcastChannel })\n .BroadcastChannel;\n if (Channel !== undefined) {\n try {\n this.#channel = new Channel(\"stamprally:queue-sync\");\n this.#channel.addEventListener(\"message\", (event: MessageEvent<unknown>) => {\n if (typeof event.data === \"object\" && event.data !== null) {\n const data = event.data as {\n readonly type?: unknown;\n readonly lockKey?: unknown;\n readonly owner?: unknown;\n readonly expiresAt?: unknown;\n };\n if (data.type === \"lock\" && data.lockKey === this.#lockKey()) {\n this.#observedLocks.set(data.lockKey, {\n owner: typeof data.owner === \"string\" ? data.owner : \"unknown\",\n expiresAt: typeof data.expiresAt === \"number\" ? data.expiresAt : 0,\n });\n return;\n }\n if (data.type === \"unlock\" && data.lockKey === this.#lockKey()) {\n this.#observedLocks.delete(data.lockKey);\n return;\n }\n }\n if (\n typeof event.data === \"object\" &&\n event.data !== null &&\n \"key\" in event.data &&\n (event.data as { readonly key?: unknown }).key === this.#storageKey()\n )\n void this.#reloadFromStorage();\n });\n } catch {\n this.#channel = null;\n }\n }\n }\n\n #announceChange(): void {\n this.#changeListener?.();\n this.#channel?.postMessage({\n type: \"change\",\n key: this.#storageKey(),\n owner: this.#instanceId,\n });\n }\n\n async #reloadFromStorage(): Promise<void> {\n if (this.#state === \"syncing\") return;\n try {\n const key = this.#storageKey();\n this.#operations = (await this.#storage.load(key)).map(normalizeOperation);\n this.#rejectedHistory =\n (await this.#storage.loadRejectedHistory?.(key))?.map(normalizeRejectedHistory) ??\n this.#rejectedHistory;\n this.#loaded = true;\n } catch {\n // A transient storage failure must not destroy the in-memory queue.\n }\n }\n\n #lockKey(): string {\n return `${this.#storageKey()}:sync-lock`;\n }\n\n #acquireSyncLock(): boolean {\n const key = this.#lockKey();\n const now = Date.now();\n const local = syncLocks.get(key);\n if (local !== undefined && local.expiresAt > now && local.owner !== this.#instanceId)\n return false;\n const observed = this.#observedLocks.get(key);\n if (observed !== undefined && observed.expiresAt > now && observed.owner !== this.#instanceId)\n return false;\n if (this.#lockStorage !== null) {\n try {\n const existing = this.#lockStorage.getItem(key);\n if (existing !== null) {\n const parsed: unknown = JSON.parse(existing);\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n typeof (parsed as { readonly expiresAt?: unknown }).expiresAt === \"number\" &&\n (parsed as { readonly expiresAt: number }).expiresAt > now &&\n (parsed as { readonly owner?: unknown }).owner !== this.#instanceId\n )\n return false;\n }\n this.#lockStorage.setItem(\n key,\n JSON.stringify({ owner: this.#instanceId, expiresAt: now + SYNC_LOCK_TTL_MS }),\n );\n this.#channel?.postMessage({\n type: \"lock\",\n lockKey: key,\n owner: this.#instanceId,\n expiresAt: now + SYNC_LOCK_TTL_MS,\n });\n } catch {\n this.#warnMemoryLock(\"Persistent lock access failed; offline sync is single-tab only.\");\n }\n }\n syncLocks.set(key, { owner: this.#instanceId, expiresAt: now + SYNC_LOCK_TTL_MS });\n return true;\n }\n\n #releaseSyncLock(): void {\n const key = this.#lockKey();\n const current = syncLocks.get(key);\n if (current?.owner === this.#instanceId) syncLocks.delete(key);\n if (this.#lockStorage !== null) {\n try {\n const value = this.#lockStorage.getItem(key);\n if (\n value !== null &&\n (JSON.parse(value) as { readonly owner?: unknown }).owner === this.#instanceId\n )\n this.#lockStorage.removeItem?.(key);\n this.#channel?.postMessage({ type: \"unlock\", lockKey: key, owner: this.#instanceId });\n } catch {\n // Lock expiry protects against an unreadable lock record.\n }\n }\n }\n\n #storageKey(): string {\n if (this.#configuredKey !== undefined) return this.#configuredKey;\n return `stamprally:queue:${this.#rallyId ?? \"unscoped\"}:${this.#userId ?? \"anonymous\"}`;\n }\n\n #normalizeResponse(value: OfflineResult | OfflineConflictResult | OfflineOperationResponse): {\n readonly status: OfflineOperationStatus;\n readonly result?: OfflineResult | OfflineConflictResult;\n readonly state?: UserRallyState;\n readonly error?: ClientError | OfflineOperationError;\n readonly reason?: ClientError | OfflineOperationError;\n } {\n if (\"ok\" in value) {\n if (value.ok === false) {\n if (\"status\" in value && value.status === \"RETRYABLE_ERROR\")\n return { status: \"RETRYABLE_ERROR\", error: errorValue(value.error, \"RETRYABLE_ERROR\") };\n return { status: \"REJECTED_PERMANENT\", result: value };\n }\n return { status: \"ACCEPTED\", result: value };\n }\n if (\"status\" in value) {\n if (value.status === \"ACCEPTED\") return value;\n return value;\n }\n return { status: \"ACCEPTED\", result: value };\n }\n\n async #saveRejectedHistory(): Promise<void> {\n await this.#storage.saveRejectedHistory?.(this.#storageKey(), this.#rejectedHistory);\n }\n\n #warnMemoryLock(message: string): void {\n if (this.#warnedMemoryLock) return;\n this.#warnedMemoryLock = true;\n console.warn(`[@stamprally/core] ${message}`);\n this.#capabilityWarningListener?.({\n type: \"STORAGE_CAPABILITY_WARNING\",\n storageCapability: this.storageCapability === \"memory\" ? \"memory\" : \"volatile_single_tab\",\n isStoragePersistent: this.isStoragePersistent,\n message,\n });\n }\n}\n\nfunction normalizeOperation(operation: OfflineOperation): OfflineOperation {\n const status = (operation as { readonly status?: string }).status;\n return {\n ...operation,\n status:\n status === \"IN_FLIGHT\" || status === \"REJECTED\"\n ? \"PENDING\"\n : status === \"RETRYABLE_ERROR\"\n ? \"FAILED_RETRYABLE\"\n : (operation.status ?? \"PENDING\"),\n attempts: operation.attempts ?? 0,\n };\n}\n\nfunction normalizeRejectedHistory(\n entry: RejectedOperationHistoryEntry,\n): RejectedOperationHistoryEntry {\n return {\n ...entry,\n operation: normalizeOperation(entry.operation),\n reason: errorValue(entry.reason, \"REJECTED_PERMANENT\"),\n errorCode: entry.errorCode || entry.reason.code,\n rejectedAt: entry.rejectedAt || new Date(0).toISOString(),\n attempts: entry.attempts ?? entry.operation.attempts ?? 0,\n };\n}\n\nexport { MemoryQueueStorage as InMemoryOfflineQueueStorage };\n","import type { AdminRallyConfig, PublicRallyConfig, UserRallyState } from \"../domain/index.js\";\nimport { reconcileRewardStates } from \"../engine/transition.js\";\nimport type { OfflineOperation } from \"./offlineQueue.js\";\nimport { cloneState } from \"./storage.js\";\n\nexport interface RebuildUserStateOptions {\n readonly baseline: UserRallyState;\n readonly operations: ReadonlyArray<OfflineOperation>;\n readonly config?: AdminRallyConfig | PublicRallyConfig;\n}\n\nexport interface RebuildUserStateResult {\n readonly state: UserRallyState;\n readonly rejectedOperationIds: ReadonlyArray<string>;\n}\n\nfunction isReplayable(operation: OfflineOperation): boolean {\n return (\n operation.status === undefined ||\n operation.status === \"ACCEPTED\" ||\n operation.status === \"PENDING\" ||\n operation.status === \"IN_FLIGHT\" ||\n operation.status === \"FAILED_RETRYABLE\"\n );\n}\n\nfunction operationId(operation: OfflineOperation): string {\n const identity = operation.request.userId ?? operation.request.anonymousSessionId ?? \"anonymous\";\n return `${operation.kind}:${operation.request.rallyId}:${identity}:${operation.request.idempotencyKey}`;\n}\n\nfunction applyInventoryDelta(\n state: UserRallyState,\n previous: UserRallyState,\n optimistic: UserRallyState,\n): UserRallyState {\n const previousInventory = previous.inventory;\n const optimisticInventory = optimistic.inventory;\n if (previousInventory === undefined || optimisticInventory === undefined) return state;\n const currentInventory = state.inventory ?? {};\n const sharedDelta =\n previousInventory.sharedRemaining === undefined ||\n optimisticInventory.sharedRemaining === undefined\n ? undefined\n : optimisticInventory.sharedRemaining - previousInventory.sharedRemaining;\n const previousRewards = previousInventory.rewardRemaining ?? {};\n const optimisticRewards = optimisticInventory.rewardRemaining ?? {};\n const currentRewards = currentInventory.rewardRemaining ?? {};\n const rewardRemaining: Record<string, number> = { ...currentRewards };\n for (const key of new Set([...Object.keys(previousRewards), ...Object.keys(optimisticRewards)])) {\n const before = previousRewards[key];\n const after = optimisticRewards[key];\n if (before !== undefined && after !== undefined)\n rewardRemaining[key] = Math.max(0, (currentRewards[key] ?? before) + after - before);\n }\n const nextInventory: {\n readonly sharedRemaining?: number;\n readonly rewardRemaining?: Readonly<Record<string, number>>;\n } = {\n ...(currentInventory.sharedRemaining === undefined || sharedDelta === undefined\n ? optimisticInventory.sharedRemaining === undefined || sharedDelta === undefined\n ? {}\n : { sharedRemaining: Math.max(0, optimisticInventory.sharedRemaining) }\n : { sharedRemaining: Math.max(0, currentInventory.sharedRemaining + sharedDelta) }),\n ...(Object.keys(rewardRemaining).length === 0 ? {} : { rewardRemaining }),\n };\n return { ...state, inventory: nextInventory };\n}\n\nfunction applyOperation(\n state: UserRallyState,\n operation: OfflineOperation,\n config: AdminRallyConfig | PublicRallyConfig | undefined,\n rejectedCheckIns: ReadonlySet<string>,\n): { readonly state: UserRallyState; readonly prerequisiteFailed: boolean } {\n if (operation.kind === \"checkIn\") {\n const spot = config?.spots.find((candidate) => candidate.id === operation.request.spotId);\n if (\n spot?.prerequisites?.some(\n (id) => rejectedCheckIns.has(id) || !state.records.some((record) => record.stampId === id),\n )\n )\n return { state, prerequisiteFailed: true };\n if (state.records.some((record) => record.stampId === operation.request.spotId))\n return { state, prerequisiteFailed: false };\n const optimisticRecord = operation.optimisticState?.records.find(\n (record) => record.stampId === operation.request.spotId,\n );\n const record = optimisticRecord ?? {\n stampId: operation.request.spotId,\n acquiredAt: operation.request.now,\n };\n const records = [...state.records, { ...record }];\n const rewards =\n config === undefined\n ? state.rewards\n : reconcileRewardStates(config.rewards, state.rewards, records.length, record.acquiredAt);\n return {\n state: { ...state, records, rewards, updatedAt: record.acquiredAt },\n prerequisiteFailed: false,\n };\n }\n\n const optimisticState = operation.optimisticState;\n if (optimisticState === undefined) return { state, prerequisiteFailed: false };\n const optimisticReward = optimisticState?.rewards.find(\n (reward) => reward.rewardId === operation.request.rewardId,\n );\n if (optimisticReward === undefined) return { state, prerequisiteFailed: false };\n const rewards = state.rewards.some((reward) => reward.rewardId === optimisticReward.rewardId)\n ? state.rewards.map((reward) =>\n reward.rewardId === optimisticReward.rewardId ? { ...optimisticReward } : reward,\n )\n : [...state.rewards, { ...optimisticReward }];\n return {\n state: applyInventoryDelta(\n { ...state, rewards, updatedAt: optimisticReward.consumedAt ?? state.updatedAt },\n operation.request.state,\n optimisticState,\n ),\n prerequisiteFailed: false,\n };\n}\n\n/** Replays the durable operation log on top of a server-confirmed baseline. */\nexport function rebuildUserStateFromLog(\n baseline: UserRallyState,\n operations: ReadonlyArray<OfflineOperation>,\n config?: AdminRallyConfig | PublicRallyConfig,\n): UserRallyState;\nexport function rebuildUserStateFromLog(options: RebuildUserStateOptions): UserRallyState;\nexport function rebuildUserStateFromLog(\n baselineOrOptions: UserRallyState | RebuildUserStateOptions,\n operationsArgument?: ReadonlyArray<OfflineOperation>,\n configArgument?: AdminRallyConfig | PublicRallyConfig,\n): UserRallyState {\n const { state } = rebuildUserStateLog(\n \"baseline\" in baselineOrOptions ? baselineOrOptions.baseline : baselineOrOptions,\n \"baseline\" in baselineOrOptions ? baselineOrOptions.operations : (operationsArgument ?? []),\n \"baseline\" in baselineOrOptions ? baselineOrOptions.config : configArgument,\n );\n return state;\n}\n\nexport function rebuildUserStateLog(\n baseline: UserRallyState,\n operations: ReadonlyArray<OfflineOperation>,\n config?: AdminRallyConfig | PublicRallyConfig,\n): RebuildUserStateResult {\n let state = cloneState(baseline);\n const rejectedOperationIds: string[] = [];\n const rejectedCheckIns = new Set(\n operations\n .filter(\n (operation) => operation.status === \"REJECTED_PERMANENT\" && operation.kind === \"checkIn\",\n )\n .map((operation) => (operation.kind === \"checkIn\" ? operation.request.spotId : undefined))\n .filter((spotId): spotId is string => spotId !== undefined),\n );\n for (const operation of operations) {\n if (operation.status === \"REJECTED_PERMANENT\") {\n if (operation.kind === \"checkIn\") rejectedCheckIns.add(operation.request.spotId);\n continue;\n }\n if (!isReplayable(operation)) continue;\n const replay = applyOperation(state, operation, config, rejectedCheckIns);\n if (replay.prerequisiteFailed) {\n rejectedOperationIds.push(operationId(operation));\n if (operation.kind === \"checkIn\") rejectedCheckIns.add(operation.request.spotId);\n continue;\n }\n state = replay.state;\n }\n return { state, rejectedOperationIds };\n}\n","import type {\n CustomValidationContext,\n PublicCheckInCondition,\n PublicRallyConfig,\n RallyConfig,\n Result,\n Reward,\n RewardState,\n StampRecord,\n UserRallyState,\n Validator,\n} from \"../domain/index.js\";\nimport { consumeReward, type RewardConsumeError, reconcileRewardStates } from \"../engine/index.js\";\nimport type {\n OfflineOperationError,\n OfflineQueue,\n OfflineQueueCapability,\n OfflineQueueCapabilityWarning,\n OfflineStorageCapability,\n OfflineSyncResultEvent,\n RejectedOperationHistoryEntry,\n SyncState,\n} from \"./offlineQueue.js\";\nimport { rollbackOptimisticOperation } from \"./offlineQueue.js\";\nimport {\n cloneState,\n createAnonymousSessionId,\n InMemoryStorage,\n type StampStorage,\n storageKey,\n} from \"./storage.js\";\nimport { rebuildUserStateFromLog } from \"./sync.js\";\n\nexport type CheckInOptions = {\n readonly now?: string;\n readonly idempotencyKey?: string;\n readonly sync?: boolean;\n};\nexport type ClaimOptions = {\n readonly now?: string;\n readonly idempotencyKey?: string;\n readonly staffPasscode?: string;\n readonly staffId?: string;\n readonly sync?: boolean;\n};\nexport type ClientError =\n | {\n readonly code:\n | \"SPOT_NOT_FOUND\"\n | \"STAMP_ALREADY_ACQUIRED\"\n | \"PREREQUISITES_NOT_MET\"\n | \"INVALID_PROOF\";\n readonly spotId: string;\n readonly message: string;\n }\n | { readonly code: \"CUSTOM_VALIDATION_FAILED\"; readonly spotId: string; readonly message: string }\n | { readonly code: \"REWARD_NOT_FOUND\"; readonly rewardId: string; readonly message: string }\n | { readonly code: \"SYNC_FAILED\"; readonly message: string }\n | RewardConsumeError;\nexport interface CheckInSuccess {\n readonly state: UserRallyState;\n readonly record: StampRecord;\n}\nexport type CheckInResult = Result<CheckInSuccess, ClientError>;\nexport interface ClaimSuccess {\n readonly state: UserRallyState;\n readonly reward: RewardState;\n}\nexport type ClaimResult = Result<ClaimSuccess, ClientError>;\nexport type ClientEvent =\n | { readonly type: \"checkIn\"; readonly result: CheckInResult }\n | { readonly type: \"rewardClaimed\"; readonly result: ClaimResult }\n | { readonly type: \"sync\"; readonly state: UserRallyState }\n | { readonly type: \"syncLifecycle\"; readonly event: SyncLifecycleEvent }\n | { readonly type: \"storageCapabilityWarning\"; readonly warning: OfflineQueueCapabilityWarning }\n | { readonly type: \"error\"; readonly error: ClientError | OfflineOperationError };\nexport type ClientListener = (state: UserRallyState) => void;\nexport type ClientEventListener = (event: ClientEvent) => void;\nexport type SyncLifecycleEvent =\n | { readonly type: \"SYNC_STARTED\" }\n | {\n readonly type: \"OPERATION_ACCEPTED\";\n readonly operationId: string;\n readonly resourceId: string;\n }\n | {\n readonly type: \"OPERATION_ROLLED_BACK\";\n readonly operationId: string;\n readonly resourceId: string;\n readonly reason: string;\n readonly errorCode: string;\n }\n | {\n readonly type: \"OPERATION_RETRYABLE_ERROR\";\n readonly operationId: string;\n readonly error: string;\n }\n | {\n readonly type: \"SYNC_COMPLETED\";\n readonly totalProcessed: number;\n readonly failedCount: number;\n };\nexport type SyncEventListener = (event: SyncLifecycleEvent) => void;\n\nexport interface CheckInRequest {\n readonly rallyId: string;\n readonly userId: string | null;\n readonly spotId: string;\n readonly proofData: unknown;\n readonly idempotencyKey: string;\n readonly now: string;\n readonly state: UserRallyState;\n readonly anonymousSessionId?: string;\n}\nexport interface ClaimRequest {\n readonly rallyId: string;\n readonly userId: string | null;\n readonly rewardId: string;\n readonly idempotencyKey: string;\n readonly now: string;\n readonly options: ClaimOptions;\n readonly state: UserRallyState;\n readonly anonymousSessionId?: string;\n}\nexport interface SyncAdapter {\n readonly checkIn?: (request: CheckInRequest) => Promise<CheckInResult>;\n readonly claimReward?: (request: ClaimRequest) => Promise<ClaimResult>;\n readonly sync?: (request: {\n readonly rallyId: string;\n readonly userId: string | null;\n readonly state: UserRallyState;\n readonly anonymousSessionId?: string;\n }) => Promise<UserRallyState>;\n}\nexport interface ClientOptions {\n readonly storage?: StampStorage;\n readonly syncAdapter?: SyncAdapter;\n readonly customValidator?: Validator;\n readonly customValidators?: Readonly<Record<string, Validator>>;\n readonly clock?: () => string;\n readonly userId?: string | null;\n readonly anonymousSessionId?: string;\n readonly offlineQueue?: OfflineQueue;\n}\ntype StorageOrOptions = StampStorage | ClientOptions;\nfunction isStorage(value: StorageOrOptions): value is StampStorage {\n return \"load\" in value && \"save\" in value && \"remove\" in value;\n}\nfunction id(prefix: string): string {\n return `${prefix}-${globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2)}`}`;\n}\nfunction proof(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"object\" && value !== null) {\n const item = value as Record<string, unknown>;\n for (const key of [\"token\", \"code\", \"passcode\", \"value\", \"tagId\"])\n if (typeof item[key] === \"string\") return item[key];\n }\n return \"\";\n}\nfunction matches(condition: PublicCheckInCondition, value: unknown): boolean {\n if (condition.type === \"gps\") {\n if (typeof value !== \"object\" || value === null) return false;\n const item = value as Record<string, unknown>;\n const latitude = item.latitude;\n const longitude = item.longitude;\n if (typeof latitude !== \"number\" || typeof longitude !== \"number\") return false;\n const radians = (v: number): number => (v * Math.PI) / 180;\n const dLat = radians(latitude - condition.latitude);\n const dLon = radians(longitude - condition.longitude);\n const h =\n Math.sin(dLat / 2) ** 2 +\n Math.cos(radians(condition.latitude)) * Math.cos(radians(latitude)) * Math.sin(dLon / 2) ** 2;\n return 6_371_000 * 2 * Math.asin(Math.sqrt(Math.min(1, h))) <= condition.radiusMeters;\n }\n return proof(value).trim() !== \"\";\n}\nfunction emptyState(config: PublicRallyConfig, userId: string | null, now: string): UserRallyState {\n return {\n rallyId: config.id,\n userId,\n records: [],\n rewards: reconcileRewardStates(config.rewards as ReadonlyArray<Reward>, [], 0, now),\n updatedAt: now,\n };\n}\nfunction applyOptimisticRewardClaim(\n state: UserRallyState,\n rewardId: string,\n reward: RewardState,\n now: string,\n): UserRallyState {\n if (reward.claimTicketNumber === undefined || state.inventory === undefined)\n return {\n ...state,\n rewards: state.rewards.map((item) => (item.rewardId === rewardId ? reward : item)),\n updatedAt: now,\n };\n const currentInventory = state.inventory;\n const currentRewardRemaining = currentInventory.rewardRemaining?.[rewardId];\n return {\n ...state,\n rewards: state.rewards.map((item) => (item.rewardId === rewardId ? reward : item)),\n updatedAt: now,\n inventory: {\n ...(currentInventory.sharedRemaining === undefined\n ? {}\n : { sharedRemaining: Math.max(0, currentInventory.sharedRemaining - 1) }),\n ...(currentInventory.rewardRemaining === undefined || currentRewardRemaining === undefined\n ? {}\n : {\n rewardRemaining: {\n ...currentInventory.rewardRemaining,\n [rewardId]: Math.max(0, currentRewardRemaining - 1),\n },\n }),\n },\n };\n}\nfunction errorMessage(\n error: ClientError | OfflineOperationError | undefined,\n fallback: string,\n): string {\n return error !== undefined && \"message\" in error && typeof error.message === \"string\"\n ? error.message\n : fallback;\n}\n\nexport class StampRallyClient {\n readonly #listeners = new Set<ClientListener>();\n readonly #eventListeners = new Set<ClientEventListener>();\n readonly #syncEventListeners = new Set<SyncEventListener>();\n readonly #storage: StampStorage;\n readonly #options: ClientOptions;\n readonly #config: PublicRallyConfig;\n readonly #offlineQueue: OfflineQueue | undefined;\n #userId: string | null;\n readonly #anonymousSessionId: string;\n #state: UserRallyState | null = null;\n #initialization: Promise<UserRallyState> | null = null;\n #queue: Promise<unknown> = Promise.resolve();\n #syncRevision = 0;\n #syncMetrics: { processed: number; failed: number } | null = null;\n constructor(config: PublicRallyConfig, storageOrOptions: StorageOrOptions = {}) {\n this.#config = config;\n this.#options = isStorage(storageOrOptions) ? { storage: storageOrOptions } : storageOrOptions;\n this.#storage = this.#options.storage ?? new InMemoryStorage();\n this.#anonymousSessionId = this.#options.anonymousSessionId ?? createAnonymousSessionId();\n this.#userId = this.#options.userId ?? this.#anonymousSessionId;\n this.#offlineQueue = this.#options.offlineQueue;\n this.#offlineQueue?.setReplayConfig(config);\n this.#offlineQueue?.setSyncResultListener((event) => this.#handleOfflineSyncResult(event));\n this.#offlineQueue?.setCapabilityWarningListener((warning) =>\n this.#emitEvent({ type: \"storageCapabilityWarning\", warning }),\n );\n this.#offlineQueue?.setChangeListener(() => {\n this.#syncRevision += 1;\n if (this.#state !== null) this.#emit(this.#state);\n });\n }\n getConfig(): RallyConfig {\n return this.#config;\n }\n getState(): UserRallyState | null {\n return this.#state;\n }\n getUserId(): string | null {\n return this.#userId;\n }\n getAnonymousSessionId(): string {\n return this.#anonymousSessionId;\n }\n get syncState(): SyncState {\n return this.#offlineQueue?.syncState ?? \"idle\";\n }\n get pendingCount(): number {\n return this.#offlineQueue?.pendingCount ?? 0;\n }\n get rejectedHistory(): ReadonlyArray<RejectedOperationHistoryEntry> {\n return this.#offlineQueue?.rejectedHistory ?? [];\n }\n getSyncRevision(): number {\n return this.#syncRevision;\n }\n get queueCapability(): OfflineQueueCapability {\n return this.#offlineQueue?.queueCapability ?? \"custom\";\n }\n get storageCapability(): OfflineStorageCapability {\n return this.#offlineQueue?.storageCapability ?? \"custom\";\n }\n get isStoragePersistent(): boolean {\n return this.#offlineQueue?.isStoragePersistent ?? true;\n }\n discardRejected(operationId: string): Promise<boolean> {\n return this.#offlineQueue?.discardRejected(operationId) ?? Promise.resolve(false);\n }\n retryRejected(operationId: string): Promise<boolean> {\n return this.#offlineQueue?.retryRejected(operationId) ?? Promise.resolve(false);\n }\n dismissRejectedOperation(operationId: string): Promise<boolean> {\n return this.discardRejected(operationId);\n }\n retryOperation(operationId: string): Promise<boolean> {\n return this.retryRejected(operationId);\n }\n subscribe(listener: ClientListener): () => void {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n }\n subscribeEvents(listener: ClientEventListener): () => void {\n this.#eventListeners.add(listener);\n return () => this.#eventListeners.delete(listener);\n }\n subscribeSyncEvents(listener: SyncEventListener): () => void {\n this.#syncEventListeners.add(listener);\n return () => this.#syncEventListeners.delete(listener);\n }\n subscribeSyncState(listener: () => void): () => void {\n const wrapped: ClientListener = () => listener();\n this.#listeners.add(wrapped);\n return () => this.#listeners.delete(wrapped);\n }\n init(): Promise<UserRallyState> {\n return this.initialize();\n }\n initialize(): Promise<UserRallyState> {\n if (this.#state !== null) return Promise.resolve(this.#state);\n if (this.#initialization === null) {\n this.#initialization = (async () => {\n await this.#offlineQueue?.setScope(this.#config.id, this.#userId);\n return this.#storage.load(this.#config.id, this.#userId);\n })()\n .then((state) => {\n const next =\n state === null\n ? emptyState(this.#config, this.#userId, this.#now())\n : this.#reconcile(state);\n this.#state = next;\n this.#emit(next);\n return next;\n })\n .catch((error: unknown) => {\n this.#initialization = null;\n throw error;\n });\n }\n return this.#initialization;\n }\n switchUser(newUserId: string | null): Promise<UserRallyState> {\n return this.#enqueue(async () => {\n const nextUserId = newUserId ?? this.#anonymousSessionId;\n if (this.#userId === nextUserId && this.#state !== null) return this.#state;\n this.#userId = nextUserId;\n this.#state = null;\n this.#initialization = null;\n await this.#offlineQueue?.switchUser(nextUserId);\n return this.initialize();\n });\n }\n async getUserState(rallyId: string, userId: string): Promise<UserRallyState | null> {\n return this.#storage.load(rallyId, userId);\n }\n clearUserState(userId = this.#userId): Promise<void> {\n return this.#enqueue(async () => {\n await this.#storage.remove(this.#config.id, userId);\n if (userId === this.#userId) {\n await this.#initializeFresh();\n }\n });\n }\n checkIn(\n spotId: string,\n proofData: unknown,\n options: CheckInOptions = {},\n ): Promise<CheckInResult> {\n return this.#enqueue(async () => {\n const current = await this.initialize();\n const spot = this.#config.spots.find((item) => item.id === spotId);\n if (spot === undefined)\n return this.#fail({ code: \"SPOT_NOT_FOUND\", spotId, message: \"Spot was not found.\" });\n if (current.records.some((record) => record.stampId === spotId))\n return this.#fail({\n code: \"STAMP_ALREADY_ACQUIRED\",\n spotId,\n message: \"Spot was already claimed.\",\n });\n const acquired = new Set(current.records.map((record) => record.stampId));\n if (spot.prerequisites?.some((id) => !acquired.has(id)))\n return this.#fail({\n code: \"PREREQUISITES_NOT_MET\",\n spotId,\n message: \"Prerequisite spots are not complete.\",\n });\n for (const condition of spot.conditions) {\n if (condition.type === \"custom\") {\n const validator =\n this.#options.customValidators?.[condition.validatorName] ??\n this.#options.customValidator;\n if (validator === undefined)\n return this.#fail({\n code: \"CUSTOM_VALIDATION_FAILED\",\n spotId,\n message: \"No custom validator is registered.\",\n });\n const context: CustomValidationContext = {\n rallyId: this.#config.id,\n spotId,\n proofData,\n condition: { type: \"custom\", validatorName: condition.validatorName },\n userState: current,\n };\n const result =\n typeof validator === \"function\"\n ? await validator(context)\n : await validator.validate(context);\n if (result === false || (typeof result === \"object\" && !result.valid))\n return this.#fail({\n code: \"CUSTOM_VALIDATION_FAILED\",\n spotId,\n message:\n typeof result === \"object\" && result.message !== undefined\n ? result.message\n : \"Custom validation failed.\",\n });\n } else if (!matches(condition, proofData))\n return this.#fail({ code: \"INVALID_PROOF\", spotId, message: \"Verification failed.\" });\n }\n const now = options.now ?? this.#now();\n const request: CheckInRequest = {\n rallyId: this.#config.id,\n userId: this.#userId,\n spotId,\n proofData,\n idempotencyKey: options.idempotencyKey ?? id(\"check-in\"),\n now,\n state: current,\n ...(this.#userId === this.#anonymousSessionId\n ? { anonymousSessionId: this.#anonymousSessionId }\n : {}),\n };\n const remote = this.#options.syncAdapter?.checkIn;\n if (options.sync !== false && remote !== undefined) {\n try {\n const result = await remote(request);\n return result.ok ? this.#commitCheckIn(result) : this.#fail(result.error);\n } catch (error) {\n if (this.#offlineQueue === undefined) throw error;\n const record = { stampId: spotId, acquiredAt: now };\n const next = this.#reconcile({\n ...current,\n records: [...current.records, record],\n updatedAt: now,\n });\n await this.#offlineQueue.enqueueCheckIn(request, next);\n await this.#storage.save(next);\n return this.#commitCheckIn({ ok: true, value: { state: next, record } });\n }\n }\n const record = { stampId: spotId, acquiredAt: now };\n const next = this.#reconcile({\n ...current,\n records: [...current.records, record],\n updatedAt: now,\n });\n await this.#storage.save(next);\n return this.#commitCheckIn({ ok: true, value: { state: next, record } });\n });\n }\n claimReward(rewardId: string, options: ClaimOptions = {}): Promise<ClaimResult> {\n return this.#enqueue(async () => {\n const current = await this.initialize();\n const configured = this.#config.rewards.find((item) => item.id === rewardId);\n if (configured === undefined)\n return this.#fail({ code: \"REWARD_NOT_FOUND\", rewardId, message: \"Reward was not found.\" });\n const now = options.now ?? this.#now();\n const state = current.rewards.find((item) => item.rewardId === rewardId) ?? {\n rewardId,\n status: \"LOCKED\" as const,\n };\n const local = consumeReward({\n reward: configured as Reward,\n currentState: state,\n now,\n ...(options.staffPasscode === undefined ? {} : { inputPasscode: options.staffPasscode }),\n ...(options.staffId === undefined ? {} : { staffId: options.staffId }),\n });\n if (!local.ok) return this.#fail(local.error);\n const request: ClaimRequest = {\n rallyId: this.#config.id,\n userId: this.#userId,\n rewardId,\n idempotencyKey: options.idempotencyKey ?? id(\"claim\"),\n now,\n options,\n state: current,\n ...(this.#userId === this.#anonymousSessionId\n ? { anonymousSessionId: this.#anonymousSessionId }\n : {}),\n };\n const remote = this.#options.syncAdapter?.claimReward;\n if (options.sync !== false && remote !== undefined) {\n try {\n const result = await remote(request);\n return result.ok ? this.#commitClaim(result) : this.#fail(result.error);\n } catch (error) {\n if (this.#offlineQueue === undefined) throw error;\n const next = applyOptimisticRewardClaim(current, rewardId, local.value, now);\n await this.#offlineQueue.enqueueClaimReward(request, next);\n await this.#storage.save(next);\n return this.#commitClaim({ ok: true, value: { state: next, reward: local.value } });\n }\n }\n const next = applyOptimisticRewardClaim(current, rewardId, local.value, now);\n await this.#storage.save(next);\n return this.#commitClaim({ ok: true, value: { state: next, reward: local.value } });\n });\n }\n sync(adapter = this.#options.syncAdapter): Promise<void> {\n return this.#enqueue(async () => {\n this.#emitSyncEvent({ type: \"SYNC_STARTED\" });\n this.#syncMetrics = { processed: 0, failed: 0 };\n try {\n const current = await this.initialize();\n if (this.#offlineQueue !== undefined && adapter !== undefined) {\n await this.#offlineQueue.sync(async (operation) => {\n if (operation.kind === \"checkIn\") {\n if (adapter.checkIn === undefined)\n throw new Error(\"No check-in sync adapter is configured.\");\n return adapter.checkIn(operation.request);\n }\n if (adapter.claimReward === undefined)\n throw new Error(\"No reward sync adapter is configured.\");\n return adapter.claimReward(operation.request);\n });\n }\n if (adapter?.sync === undefined) {\n this.#emitEvent({ type: \"sync\", state: this.#state ?? current });\n return;\n }\n const localState = this.#state ?? current;\n const serverState = await adapter.sync({\n rallyId: this.#config.id,\n userId: this.#userId,\n state: localState,\n ...(this.#userId === this.#anonymousSessionId\n ? { anonymousSessionId: this.#anonymousSessionId }\n : {}),\n });\n const resolved = rebuildUserStateFromLog(\n serverState,\n this.#offlineQueue?.operations ?? [],\n this.#config,\n );\n const next = this.#reconcile(resolved);\n await this.#storage.save(next);\n this.#state = next;\n this.#emit(next);\n this.#emitEvent({ type: \"sync\", state: next });\n } finally {\n const metrics = this.#syncMetrics ?? { processed: 0, failed: 0 };\n this.#syncMetrics = null;\n this.#emitSyncEvent({\n type: \"SYNC_COMPLETED\",\n totalProcessed: metrics.processed,\n failedCount: metrics.failed,\n });\n }\n });\n }\n retrySync(): Promise<void> {\n return this.sync();\n }\n reset(): Promise<UserRallyState> {\n return this.#enqueue(async () => {\n await this.#storage.remove(this.#config.id, this.#userId);\n return this.#initializeFresh();\n });\n }\n restore(state: UserRallyState): Promise<UserRallyState> {\n return this.#enqueue(async () => {\n if (state.rallyId !== this.#config.id || state.userId !== this.#userId)\n throw new Error(\"State belongs to another rally or user.\");\n const next = this.#reconcile(state);\n await this.#storage.save(next);\n this.#state = next;\n this.#initialization = Promise.resolve(next);\n this.#emit(next);\n return next;\n });\n }\n #enqueue<T>(operation: () => Promise<T>): Promise<T> {\n const next = this.#queue.then(operation, operation);\n this.#queue = next.then(\n () => undefined,\n () => undefined,\n );\n return next;\n }\n #initializeFresh(): Promise<UserRallyState> {\n const next = emptyState(this.#config, this.#userId, this.#now());\n this.#state = next;\n this.#initialization = Promise.resolve(next);\n this.#emit(next);\n return Promise.resolve(next);\n }\n #reconcile(state: UserRallyState): UserRallyState {\n const ids = new Set(this.#config.spots.map((spot) => spot.id));\n const records = state.records.filter(\n (record, index, all) =>\n ids.has(record.stampId) &&\n all.findIndex((candidate) => candidate.stampId === record.stampId) === index,\n );\n return {\n ...cloneState(state),\n userId: this.#userId,\n records,\n rewards: reconcileRewardStates(\n this.#config.rewards as ReadonlyArray<Reward>,\n state.rewards,\n records.length,\n state.updatedAt,\n ),\n };\n }\n async #handleOfflineSyncResult(event: OfflineSyncResultEvent): Promise<void> {\n if (event.status === \"ACCEPTED\") {\n if (this.#syncMetrics !== null) this.#syncMetrics.processed += 1;\n if (event.state !== undefined) {\n const rebuilt = rebuildUserStateFromLog(\n event.state,\n this.#offlineQueue?.operations ?? [],\n this.#config,\n );\n const next = this.#reconcile(rebuilt);\n await this.#storage.save(next);\n this.#state = next;\n this.#emit(next);\n }\n this.#emitSyncEvent({\n type: \"OPERATION_ACCEPTED\",\n operationId: this.#operationId(event.operation),\n resourceId: this.#resourceId(event.operation),\n });\n } else if (event.status === \"REJECTED_PERMANENT\") {\n const error = event.error ?? {\n code: \"REJECTED_PERMANENT\",\n message: \"Offline operation was rejected.\",\n };\n if (this.#syncMetrics !== null) {\n this.#syncMetrics.processed += 1;\n this.#syncMetrics.failed += 1;\n }\n const base = event.state ?? this.#state ?? event.operation.request.state;\n const rollbackBase =\n event.state === undefined ? rollbackOptimisticOperation(base, event.operation) : base;\n const rebuilt = rebuildUserStateFromLog(\n rollbackBase,\n this.#offlineQueue?.operations ?? [],\n this.#config,\n );\n const next = this.#reconcile(rebuilt);\n await this.#storage.save(next);\n this.#state = next;\n this.#emit(next);\n this.#emitSyncEvent({\n type: \"OPERATION_ROLLED_BACK\",\n operationId: this.#operationId(event.operation),\n resourceId: this.#resourceId(event.operation),\n reason: errorMessage(error, \"Offline operation was rejected.\"),\n errorCode: error.code,\n });\n } else if (event.status === \"RETRYABLE_ERROR\") {\n if (this.#syncMetrics !== null) this.#syncMetrics.failed += 1;\n this.#emitSyncEvent({\n type: \"OPERATION_RETRYABLE_ERROR\",\n operationId: this.#operationId(event.operation),\n error: errorMessage(event.error, \"Retryable sync error.\"),\n });\n }\n if (event.state !== undefined && event.status === undefined) {\n const next = this.#reconcile(event.state);\n await this.#storage.save(next);\n this.#state = next;\n this.#emit(next);\n }\n if (event.error !== undefined) this.#emitEvent({ type: \"error\", error: event.error });\n else if (event.result !== undefined && \"ok\" in event.result && !event.result.ok)\n this.#emitEvent({ type: \"error\", error: event.result.error });\n }\n #now(): string {\n return this.#options.clock?.() ?? new Date().toISOString();\n }\n #fail(error: ClientError): { readonly ok: false; readonly error: ClientError } {\n this.#emitEvent({ type: \"error\", error });\n return { ok: false, error };\n }\n #commitCheckIn(result: CheckInResult): CheckInResult {\n if (result.ok) {\n this.#state = result.value.state;\n this.#emit(this.#state);\n }\n this.#emitEvent({ type: \"checkIn\", result });\n return result;\n }\n #commitClaim(result: ClaimResult): ClaimResult {\n if (result.ok) {\n this.#state = result.value.state;\n this.#emit(this.#state);\n }\n this.#emitEvent({ type: \"rewardClaimed\", result });\n return result;\n }\n #emit(state: UserRallyState): void {\n for (const listener of this.#listeners) listener(state);\n }\n #emitEvent(event: ClientEvent): void {\n for (const listener of this.#eventListeners) listener(event);\n }\n #emitSyncEvent(event: SyncLifecycleEvent): void {\n for (const listener of this.#syncEventListeners) listener(event);\n this.#emitEvent({ type: \"syncLifecycle\", event });\n }\n #operationId(operation: import(\"./offlineQueue.js\").OfflineOperation): string {\n const identity =\n operation.request.userId ?? operation.request.anonymousSessionId ?? \"anonymous\";\n return `${operation.kind}:${operation.request.rallyId}:${identity}:${operation.request.idempotencyKey}`;\n }\n #resourceId(operation: import(\"./offlineQueue.js\").OfflineOperation): string {\n return operation.kind === \"checkIn\" ? operation.request.spotId : operation.request.rewardId;\n }\n}\nexport { storageKey };\n","export type SecureTokenSecretKey = string | Uint8Array;\n\nexport interface SecureTokenOptions {\n readonly encrypt?: boolean;\n readonly expiresInSeconds?: number;\n}\n\nexport interface SecureTokenPayload {\n readonly [key: string]: unknown;\n readonly exp?: number;\n}\n\nexport type SecureTokenErrorCode =\n | \"MALFORMED\"\n | \"INVALID_SIGNATURE\"\n | \"DECRYPTION_FAILED\"\n | \"INVALID_PAYLOAD\"\n | \"EXPIRED\";\n\nexport interface SecureTokenError {\n readonly code: SecureTokenErrorCode;\n readonly message: string;\n}\n\nexport type SecureTokenVerification<T extends SecureTokenPayload = SecureTokenPayload> =\n | { readonly ok: true; readonly valid: true; readonly payload: T }\n | { readonly ok: false; readonly valid: false; readonly error: SecureTokenError };\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nfunction cryptoApi(): Crypto {\n if (globalThis.crypto?.subtle === undefined) {\n throw new Error(\"Web Crypto API is unavailable in this environment.\");\n }\n return globalThis.crypto;\n}\n\nfunction bytes(value: SecureTokenSecretKey): Uint8Array {\n return typeof value === \"string\" ? encoder.encode(value) : new Uint8Array(value);\n}\n\nfunction source(value: Uint8Array): BufferSource {\n return value.buffer as ArrayBuffer;\n}\n\nfunction encode(value: Uint8Array): string {\n let binary = \"\";\n for (const byte of value) binary += String.fromCharCode(byte);\n return globalThis.btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replace(/=+$/u, \"\");\n}\n\nfunction decode(value: string): Uint8Array {\n const base64 = value.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n const padded = `${base64}${\"=\".repeat((4 - (base64.length % 4)) % 4)}`;\n return Uint8Array.from(globalThis.atob(padded), (character) => character.charCodeAt(0));\n}\n\nasync function hmacKey(secret: Uint8Array): Promise<CryptoKey> {\n return cryptoApi().subtle.importKey(\n \"raw\",\n source(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\", \"verify\"],\n );\n}\n\nasync function aesKey(secret: Uint8Array): Promise<CryptoKey> {\n const digest = await cryptoApi().subtle.digest(\"SHA-256\", source(secret));\n return cryptoApi().subtle.importKey(\"raw\", digest, \"AES-GCM\", false, [\"encrypt\", \"decrypt\"]);\n}\n\nexport async function createSecureToken<T extends SecureTokenPayload>(\n payload: T,\n secretKey: SecureTokenSecretKey,\n options: SecureTokenOptions = {},\n): Promise<string> {\n const api = cryptoApi();\n const expiresInSeconds = options.expiresInSeconds;\n const effectivePayload =\n expiresInSeconds === undefined || payload.exp !== undefined\n ? payload\n : ({ ...payload, exp: Math.floor(Date.now() / 1000) + expiresInSeconds } as T);\n const secret = bytes(secretKey);\n const plaintext = encoder.encode(JSON.stringify(effectivePayload));\n const actualBody =\n options.encrypt === true ? await encryptPayload(plaintext, secret, api) : encode(plaintext);\n const signature = new Uint8Array(\n await api.subtle.sign(\"HMAC\", await hmacKey(secret), encoder.encode(actualBody)),\n );\n return `sr3.${options.encrypt === true ? \"e\" : \"p\"}.${actualBody}.${encode(signature)}`;\n}\n\nasync function encryptPayload(\n plaintext: Uint8Array,\n secret: Uint8Array,\n api: Crypto,\n): Promise<string> {\n const iv = api.getRandomValues(new Uint8Array(12));\n const encrypted = new Uint8Array(\n await api.subtle.encrypt(\n { name: \"AES-GCM\", iv: source(iv) },\n await aesKey(secret),\n source(plaintext),\n ),\n );\n return encode(new Uint8Array([...iv, ...encrypted]));\n}\n\nexport async function verifySecureToken<T extends SecureTokenPayload = SecureTokenPayload>(\n token: string,\n secretKey: SecureTokenSecretKey,\n now = Date.now(),\n): Promise<SecureTokenVerification<T>> {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 4 || parts[0] !== \"sr3\" || (parts[1] !== \"e\" && parts[1] !== \"p\")) {\n return {\n ok: false,\n valid: false,\n error: { code: \"MALFORMED\", message: \"Secure token is malformed.\" },\n };\n }\n const mode = parts[1];\n const body = parts[2];\n const encodedSignature = parts[3];\n if (body === undefined || encodedSignature === undefined || mode === undefined) {\n return {\n ok: false,\n valid: false,\n error: { code: \"MALFORMED\", message: \"Secure token is malformed.\" },\n };\n }\n const secret = bytes(secretKey);\n const valid = await cryptoApi().subtle.verify(\n \"HMAC\",\n await hmacKey(secret),\n source(decode(encodedSignature)),\n source(encoder.encode(body)),\n );\n if (!valid)\n return {\n ok: false,\n valid: false,\n error: { code: \"INVALID_SIGNATURE\", message: \"Secure token signature is invalid.\" },\n };\n const plaintext = mode === \"e\" ? await decryptPayload(body, secret) : decode(body);\n const parsed: unknown = JSON.parse(decoder.decode(plaintext));\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n return {\n ok: false,\n valid: false,\n error: { code: \"INVALID_PAYLOAD\", message: \"Secure token payload is invalid.\" },\n };\n }\n const payload = parsed as T;\n if (typeof payload.exp === \"number\" && now >= payload.exp * 1000) {\n return {\n ok: false,\n valid: false,\n error: { code: \"EXPIRED\", message: \"Secure token has expired.\" },\n };\n }\n return { ok: true, valid: true, payload };\n } catch {\n return {\n ok: false,\n valid: false,\n error: { code: \"DECRYPTION_FAILED\", message: \"Secure token could not be verified.\" },\n };\n }\n}\n\nasync function decryptPayload(body: string, secret: Uint8Array): Promise<Uint8Array> {\n const encrypted = decode(body);\n if (encrypted.length <= 12) throw new Error(\"Invalid encrypted payload.\");\n return new Uint8Array(\n await cryptoApi().subtle.decrypt(\n { name: \"AES-GCM\", iv: source(encrypted.slice(0, 12)) },\n await aesKey(secret),\n source(encrypted.slice(12)),\n ),\n );\n}\n","export type SupportedLocale = \"ja\" | \"en\";\nexport type LocalizedText<TLocale extends string = string> =\n | string\n | Partial<Record<TLocale, string>>;\nexport type LocalizedString<TLocale extends string = SupportedLocale> = Record<TLocale, string>;\nexport type LocaleDictionary<TLocale extends string = string> = Readonly<\n Record<TLocale, Readonly<Record<string, string>>>\n>;\nexport type SlotShape = \"circle\" | \"square\" | \"rounded\";\nexport type FontFamily = \"system-ui\" | \"serif\" | \"rounded-sans\" | \"monospace\" | \"handwritten\";\n\nexport interface SheetTheme {\n readonly primaryColor: string;\n readonly backgroundColor?: string;\n readonly backgroundImageUrl?: string;\n readonly cardBackgroundColor: string;\n readonly textColor: string;\n readonly slotShape: SlotShape;\n readonly gridColumns: number;\n readonly unclaimedOpacity?: number;\n readonly completedStampColor?: string;\n readonly fontFamily?: FontFamily;\n}\nexport type ThemePresetId = \"default\" | \"modern_dark\" | \"pop_candy\" | \"retro_craft\" | \"cyber\";\nexport interface ThemePreset<TLocale extends string = SupportedLocale> {\n readonly id: ThemePresetId;\n readonly name: LocalizedString<TLocale>;\n readonly description: LocalizedString<TLocale>;\n readonly theme: SheetTheme;\n}\nexport const DEFAULT_SHEET_THEME: SheetTheme = {\n primaryColor: \"#9e551e\",\n backgroundColor: \"#fbf4df\",\n cardBackgroundColor: \"#fffdf5\",\n textColor: \"#352f25\",\n slotShape: \"rounded\",\n gridColumns: 3,\n unclaimedOpacity: 1,\n fontFamily: \"serif\",\n};\n\nexport interface ExternalReference {\n readonly type: string;\n readonly id: string;\n readonly url?: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\nexport type CheckInCondition =\n | { readonly type: \"qr\"; readonly secretToken: string; readonly qrEntryUrl?: string }\n | { readonly type: \"passcode\"; readonly code: string; readonly caseSensitive?: boolean }\n | {\n readonly type: \"gps\";\n readonly latitude: number;\n readonly longitude: number;\n readonly radiusMeters: number;\n }\n | { readonly type: \"nfc\"; readonly tagId: string }\n | {\n readonly type: \"custom\";\n readonly validatorName: string;\n readonly secretParams?: Readonly<Record<string, unknown>>;\n };\n\nexport type PublicCheckInCondition =\n | { readonly type: \"qr\"; readonly qrEntryUrl?: string }\n | { readonly type: \"passcode\" }\n | {\n readonly type: \"gps\";\n readonly latitude: number;\n readonly longitude: number;\n readonly radiusMeters: number;\n }\n | { readonly type: \"nfc\" }\n | { readonly type: \"custom\"; readonly validatorName: string };\n\nexport interface SpotItem<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly id: string;\n readonly orderIndex: number;\n readonly name: LocalizedText<TLocale>;\n readonly description?: LocalizedText<TLocale>;\n readonly hint?: LocalizedText<TLocale>;\n readonly imageUrl?: string;\n readonly iconUrl?: string;\n readonly redirectUrlAfterClaim?: string;\n readonly externalReferences?: ReadonlyArray<ExternalReference>;\n readonly metadata?: TMeta;\n readonly conditions: ReadonlyArray<CheckInCondition>;\n readonly prerequisites?: ReadonlyArray<string>;\n}\nexport type PublicSpotItem<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> = Omit<SpotItem<TLocale, TMeta>, \"conditions\"> & {\n readonly conditions: ReadonlyArray<PublicCheckInCondition>;\n};\n\nexport type RewardUnlockCondition =\n | { readonly type: \"stamp_count\"; readonly count: number }\n | { readonly type: \"stamps\"; readonly stampIds: ReadonlyArray<string> }\n | { readonly type: \"all\" | \"any\"; readonly conditions: ReadonlyArray<RewardUnlockCondition> };\nexport type RewardType = \"digital\" | \"in_person\";\nexport type RedemptionMethod = \"manual_slide\" | \"staff_passcode\" | \"view_only\" | \"server_claim\";\nexport type InventoryAggregationMode = \"shared\" | \"per_reward\";\nexport type RallyInventory = Readonly<Record<string, number>> & {\n readonly sharedStock?: number;\n};\nexport interface RallyInventoryState {\n readonly sharedRemaining?: number;\n readonly rewardRemaining?: Readonly<Record<string, number>>;\n}\nexport interface Reward<TLocale extends string = string> {\n readonly id: string;\n readonly title: LocalizedText<TLocale>;\n readonly description?: LocalizedText<TLocale>;\n readonly type: RewardType;\n readonly redemptionMethod: RedemptionMethod;\n readonly requiredStampCount: number;\n readonly conditions?: ReadonlyArray<RewardUnlockCondition>;\n readonly digitalContentUrl?: string;\n readonly staffPasscode?: string;\n readonly validUntil?: string;\n readonly stockLimit?: number;\n readonly userClaimLimit?: number;\n /** Explicit primary inventory key. Defaults to the reward id. */\n readonly stockKey?: string;\n /** Optional second inventory bucket that must be decremented atomically. */\n readonly secondaryStockKey?: string;\n}\nexport type PublicReward<TLocale extends string = string> = Omit<\n Reward<TLocale>,\n \"digitalContentUrl\" | \"staffPasscode\"\n>;\n\nexport interface AdminRallyConfig<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly id: string;\n readonly version: string;\n readonly title: LocalizedText<TLocale>;\n readonly description?: LocalizedText<TLocale>;\n readonly theme?: SheetTheme;\n readonly spots: ReadonlyArray<SpotItem<TLocale, TMeta>>;\n readonly rewards: ReadonlyArray<Reward<TLocale>>;\n readonly staffPasscode?: string;\n readonly inventory?: RallyInventory;\n /** How the optional top-level inventory limit is aggregated. */\n readonly inventoryMode?: InventoryAggregationMode;\n readonly serverMetadata?: Readonly<Record<string, unknown>>;\n readonly metadata?: TMeta;\n /** Explicit public metadata name. `metadata` remains supported for compatibility. */\n readonly publicMetadata?: TMeta;\n readonly serverEndpoint?: string;\n}\nexport interface PublicRallyConfig<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly id: string;\n readonly version: string;\n readonly title: LocalizedText<TLocale>;\n readonly description?: LocalizedText<TLocale>;\n readonly theme?: SheetTheme;\n readonly spots: ReadonlyArray<PublicSpotItem<TLocale, TMeta>>;\n readonly rewards: ReadonlyArray<PublicReward<TLocale>>;\n readonly metadata?: TMeta;\n readonly serverEndpoint?: string;\n}\nexport type RallyConfig<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> = PublicRallyConfig<TLocale, TMeta>;\n\nfunction publicCondition(condition: CheckInCondition): PublicCheckInCondition {\n switch (condition.type) {\n case \"qr\":\n return condition.qrEntryUrl === undefined\n ? { type: \"qr\" }\n : { type: \"qr\", qrEntryUrl: condition.qrEntryUrl };\n case \"passcode\":\n return { type: \"passcode\" };\n case \"gps\":\n return {\n type: \"gps\",\n latitude: condition.latitude,\n longitude: condition.longitude,\n radiusMeters: condition.radiusMeters,\n };\n case \"nfc\":\n return { type: \"nfc\" };\n case \"custom\":\n return { type: \"custom\", validatorName: condition.validatorName };\n }\n}\nexport function toPublicConfig<TLocale extends string, TMeta extends Record<string, unknown>>(\n config: AdminRallyConfig<TLocale, TMeta>,\n): PublicRallyConfig<TLocale, TMeta> {\n return {\n id: config.id,\n version: config.version,\n title: config.title,\n ...(config.description === undefined ? {} : { description: config.description }),\n ...(config.theme === undefined ? {} : { theme: config.theme }),\n spots: config.spots.map((spot) => ({\n ...spot,\n conditions: spot.conditions.map(publicCondition),\n })),\n rewards: config.rewards.map(\n ({ digitalContentUrl: _content, staffPasscode: _passcode, ...reward }) => reward,\n ),\n ...(config.publicMetadata !== undefined\n ? { metadata: config.publicMetadata }\n : config.metadata === undefined\n ? {}\n : { metadata: config.metadata }),\n ...(config.serverEndpoint === undefined ? {} : { serverEndpoint: config.serverEndpoint }),\n };\n}\nexport function assertPublicConfig(config: unknown): asserts config is PublicRallyConfig {\n if (!isPublicConfig(config)) throw new Error(\"Configuration contains private rally fields.\");\n}\nexport function isPublicConfig(value: unknown): value is PublicRallyConfig {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const candidate = value as Record<string, unknown>;\n const seen = new Set<object>();\n const containsPrivateField = (item: unknown): boolean => {\n if (typeof item !== \"object\" || item === null) return false;\n if (seen.has(item)) return false;\n seen.add(item);\n if (Array.isArray(item)) return item.some(containsPrivateField);\n const record = item as Record<string, unknown>;\n if (\n [\"staffPasscode\", \"secretToken\", \"serverMetadata\", \"secretParams\", \"digitalContentUrl\"].some(\n (key) => key in record,\n )\n )\n return true;\n return Object.values(record).some(containsPrivateField);\n };\n if (containsPrivateField(candidate)) return false;\n for (const key of [\n \"staffPasscode\",\n \"secretToken\",\n \"serverMetadata\",\n \"secretParams\",\n \"code\",\n \"tagId\",\n ]) {\n if (key in candidate) return false;\n }\n if (\n typeof candidate.id !== \"string\" ||\n typeof candidate.version !== \"string\" ||\n (typeof candidate.title !== \"string\" &&\n (typeof candidate.title !== \"object\" ||\n candidate.title === null ||\n Array.isArray(candidate.title))) ||\n !Array.isArray(candidate.spots) ||\n !Array.isArray(candidate.rewards)\n )\n return false;\n return (\n candidate.spots.every((spot) => {\n if (typeof spot !== \"object\" || spot === null || Array.isArray(spot)) return false;\n const item = spot as Record<string, unknown>;\n if (\n typeof item.id !== \"string\" ||\n typeof item.orderIndex !== \"number\" ||\n item.name === undefined ||\n \"secretToken\" in item ||\n \"code\" in item ||\n \"tagId\" in item ||\n \"secretParams\" in item\n )\n return false;\n return (\n Array.isArray(item.conditions) &&\n item.conditions.every((condition) => {\n if (typeof condition !== \"object\" || condition === null || Array.isArray(condition))\n return false;\n const value = condition as Record<string, unknown>;\n if (\n \"secretToken\" in value ||\n \"code\" in value ||\n \"tagId\" in value ||\n \"secretParams\" in value\n )\n return false;\n const type = value.type;\n if (type === \"qr\" || type === \"passcode\" || type === \"nfc\") return true;\n if (type === \"custom\") return typeof value.validatorName === \"string\";\n return (\n type === \"gps\" &&\n typeof value.latitude === \"number\" &&\n typeof value.longitude === \"number\" &&\n typeof value.radiusMeters === \"number\"\n );\n })\n );\n }) &&\n candidate.rewards.every((reward) => {\n if (typeof reward !== \"object\" || reward === null || Array.isArray(reward)) return false;\n const item = reward as Record<string, unknown>;\n return (\n typeof item.id === \"string\" &&\n typeof item.requiredStampCount === \"number\" &&\n (item.type === \"digital\" || item.type === \"in_person\") &&\n (item.redemptionMethod === \"manual_slide\" ||\n item.redemptionMethod === \"staff_passcode\" ||\n item.redemptionMethod === \"view_only\" ||\n item.redemptionMethod === \"server_claim\") &&\n !(\"staffPasscode\" in item || \"digitalContentUrl\" in item)\n );\n })\n );\n}\n\nexport interface StampRecord {\n readonly stampId: string;\n readonly acquiredAt: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\nexport type SpotStatus = \"UNCLAIMED\" | \"CLAIMED\" | \"LOCKED\" | \"VERIFYING\";\nexport type RewardStatus = \"LOCKED\" | \"AVAILABLE\" | \"CONSUMED\" | \"EXPIRED\";\nexport interface RewardState {\n readonly rewardId: string;\n readonly status: RewardStatus;\n readonly unlockedAt?: string;\n readonly consumedAt?: string;\n readonly consumedByStaffId?: string;\n readonly claimTicketNumber?: string;\n readonly redeemedCount?: number;\n readonly userRedemptionCount?: number;\n}\nexport interface StampRallyState {\n readonly rallyId: string;\n readonly userId: string | null;\n readonly records: ReadonlyArray<StampRecord>;\n readonly rewards: ReadonlyArray<RewardState>;\n readonly inventory?: RallyInventoryState;\n readonly updatedAt: string;\n}\nexport type UserRallyState = StampRallyState;\n","import type {\n AdminRallyConfig,\n PublicRallyConfig,\n PublicSpotItem,\n Reward,\n SpotItem,\n} from \"./models.js\";\nimport { toPublicConfig } from \"./models.js\";\n\n/** Keys that must never cross the public configuration boundary. */\nconst PRIVATE_KEYS = new Set([\n \"staffPasscode\",\n \"serverMetadata\",\n \"inventory\",\n \"secretToken\",\n \"secretParams\",\n \"digitalContentUrl\",\n \"code\",\n \"tagId\",\n]);\n\nconst SENSITIVE_KEY_PATTERN =\n /^(?:api[_-]?key|access[_-]?token|auth[_-]?token|password|private[_-]?key|secret)$/i;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isPrivateKey(key: string): boolean {\n return PRIVATE_KEYS.has(key) || SENSITIVE_KEY_PATTERN.test(key);\n}\n\nfunction sanitizeValue(\n value: unknown,\n customFilter: ((key: string, value: unknown) => boolean) | undefined,\n seen: WeakSet<object>,\n): unknown {\n if (Array.isArray(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n const items = value\n .map((item) => sanitizeValue(item, customFilter, seen))\n .filter((item): item is unknown => item !== undefined);\n return items;\n }\n if (!isRecord(value)) return value;\n if (seen.has(value)) return undefined;\n seen.add(value);\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n if (isPrivateKey(key) || customFilter?.(key, item) === false) continue;\n const sanitized = sanitizeValue(item, customFilter, seen);\n if (sanitized !== undefined) result[key] = sanitized;\n }\n return result;\n}\n\nfunction sanitizeSpot<TLocale extends string, TMeta extends Record<string, unknown>>(\n spot: SpotItem<TLocale, TMeta>,\n customFilter: ((key: string, value: unknown) => boolean) | undefined,\n): PublicSpotItem<TLocale, TMeta> {\n return sanitizeValue(\n toPublicConfig({\n id: \"__spot__\",\n version: \"1\",\n title: \"__spot__\",\n spots: [spot],\n rewards: [],\n }).spots[0],\n customFilter,\n new WeakSet<object>(),\n ) as PublicSpotItem<TLocale, TMeta>;\n}\n\nfunction sanitizeReward<TLocale extends string>(\n reward: Reward<TLocale>,\n customFilter: ((key: string, value: unknown) => boolean) | undefined,\n): PublicRallyConfig<TLocale>[\"rewards\"][number] {\n return sanitizeValue(\n toPublicConfig({\n id: \"__reward__\",\n version: \"1\",\n title: \"__reward__\",\n spots: [],\n rewards: [reward],\n }).rewards[0],\n customFilter,\n new WeakSet<object>(),\n ) as PublicRallyConfig<TLocale>[\"rewards\"][number];\n}\n\n/**\n * Creates the client-facing configuration and removes private values at every\n * nesting level. `customFilter` is an allow-list predicate: returning false\n * removes that key.\n */\nexport function sanitizeAdminConfig<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>(\n admin: AdminRallyConfig<TLocale, TMeta>,\n customFilter?: (key: string, value: unknown) => boolean,\n): PublicRallyConfig<TLocale, TMeta> {\n const publicConfig = toPublicConfig(admin);\n const sanitized = sanitizeValue(publicConfig, customFilter, new WeakSet<object>()) as Record<\n string,\n unknown\n >;\n sanitized.spots = admin.spots.map((spot) => sanitizeSpot(spot, customFilter));\n sanitized.rewards = admin.rewards.map((reward) => sanitizeReward(reward, customFilter));\n return sanitized as unknown as PublicRallyConfig<TLocale, TMeta>;\n}\n\nexport interface PublicConfigSafety {\n readonly safe: boolean;\n readonly leakedKeys: string[];\n}\n\n/** Finds private keys, including keys nested in metadata or custom values. */\nexport function validatePublicConfigSafety(publicConfig: PublicRallyConfig): PublicConfigSafety {\n const leakedKeys: string[] = [];\n const seen = new WeakSet<object>();\n const visit = (value: unknown, path: string): void => {\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n visit(item, `${path}[${index}]`);\n });\n return;\n }\n if (!isRecord(value) || seen.has(value)) return;\n seen.add(value);\n for (const [key, item] of Object.entries(value)) {\n const nextPath = path === \"$\" ? key : `${path}.${key}`;\n if (isPrivateKey(key)) leakedKeys.push(nextPath);\n visit(item, nextPath);\n }\n };\n visit(publicConfig, \"$\");\n return { safe: leakedKeys.length === 0, leakedKeys };\n}\n","import type { LocalizedString, LocalizedText, SupportedLocale } from \"./models.js\";\n\nexport function updateLocalizedField<TLocale extends string>(\n current: LocalizedText<TLocale> | undefined,\n locale: TLocale,\n newValue: string,\n): LocalizedText<TLocale> {\n if (typeof current === \"string\" || current === undefined)\n return { [locale]: newValue } as LocalizedText<TLocale>;\n return { ...current, [locale]: newValue };\n}\n\nexport function resolveLocalizedText<TLocale extends string = SupportedLocale>(\n text: LocalizedText<TLocale> | undefined,\n locale: string,\n fallbackLocale?: string,\n): string {\n if (text === undefined || text === \"\") return \"\";\n if (typeof text === \"string\") return text;\n const fallback =\n fallbackLocale === undefined\n ? Object.values(text).find((value): value is string => typeof value === \"string\")\n : text[fallbackLocale as TLocale];\n return text[locale as TLocale] || fallback || \"\";\n}\n\nexport function toLocalizedString(text: LocalizedText | undefined): LocalizedString;\nexport function toLocalizedString<TLocale extends string>(\n text: LocalizedText<TLocale> | undefined,\n): LocalizedString<TLocale>;\nexport function toLocalizedString<TLocale extends string>(\n text: LocalizedText<TLocale> | undefined,\n): LocalizedString<TLocale> {\n if (text === undefined) return { ja: \"\", en: \"\" } as LocalizedString<TLocale>;\n return typeof text === \"string\"\n ? ({ ja: text, en: \"\" } as LocalizedString<TLocale>)\n : ({\n ja: text[\"ja\" as TLocale] ?? \"\",\n en: text[\"en\" as TLocale] ?? \"\",\n ...text,\n } as LocalizedString<TLocale>);\n}\n","import type { ThemePreset } from \"./models.js\";\n\nexport const THEME_PRESETS: ReadonlyArray<ThemePreset> = [\n {\n id: \"default\",\n name: { ja: \"クラシックブルー\", en: \"Classic Blue\" },\n description: {\n ja: \"青を基調にした、明るく親しみやすい定番デザインです。\",\n en: \"A bright, approachable classic built around a crisp blue palette.\",\n },\n theme: {\n primaryColor: \"#2563eb\",\n backgroundColor: \"#eff6ff\",\n cardBackgroundColor: \"#ffffff\",\n textColor: \"#1e293b\",\n slotShape: \"circle\",\n gridColumns: 3,\n unclaimedOpacity: 1,\n completedStampColor: \"#dc2626\",\n fontFamily: \"serif\",\n },\n },\n {\n id: \"modern_dark\",\n name: { ja: \"モダンダーク\", en: \"Modern Dark\" },\n description: {\n ja: \"深いネイビーとエメラルドでまとめた、洗練されたダークテーマです。\",\n en: \"A polished dark theme pairing deep navy with emerald accents.\",\n },\n theme: {\n primaryColor: \"#10b981\",\n backgroundColor: \"#0f172a\",\n cardBackgroundColor: \"#1e293b\",\n textColor: \"#f8fafc\",\n slotShape: \"rounded\",\n gridColumns: 3,\n unclaimedOpacity: 1,\n completedStampColor: \"#34d399\",\n fontFamily: \"system-ui\",\n },\n },\n {\n id: \"pop_candy\",\n name: { ja: \"ポップキャンディ\", en: \"Pop Candy\" },\n description: {\n ja: \"ピンクを主役にした、楽しく華やかなキャンディカラーテーマです。\",\n en: \"A playful candy-colored theme with vivid pink at center stage.\",\n },\n theme: {\n primaryColor: \"#ec4899\",\n backgroundColor: \"#fdf2f8\",\n cardBackgroundColor: \"#ffffff\",\n textColor: \"#831843\",\n slotShape: \"circle\",\n gridColumns: 2,\n unclaimedOpacity: 1,\n completedStampColor: \"#f43f5e\",\n fontFamily: \"rounded-sans\",\n },\n },\n {\n id: \"retro_craft\",\n name: { ja: \"レトロクラフト\", en: \"Retro Craft\" },\n description: {\n ja: \"クラフト紙と赤茶色のインクを思わせる、温かみのあるレトロテーマです。\",\n en: \"A warm retro theme inspired by craft paper and earthy red ink.\",\n },\n theme: {\n primaryColor: \"#9a3412\",\n backgroundColor: \"#fef3c7\",\n cardBackgroundColor: \"#fffbeb\",\n textColor: \"#78350f\",\n slotShape: \"square\",\n gridColumns: 3,\n unclaimedOpacity: 1,\n completedStampColor: \"#b91c1c\",\n fontFamily: \"handwritten\",\n },\n },\n {\n id: \"cyber\",\n name: { ja: \"サイバーネオン\", en: \"Cyber Neon\" },\n description: {\n ja: \"シアンと紫のネオンが映える、シャープな近未来テーマです。\",\n en: \"A sharp futuristic theme illuminated by cyan and violet neon.\",\n },\n theme: {\n primaryColor: \"#06b6d4\",\n backgroundColor: \"#09090b\",\n cardBackgroundColor: \"#18181b\",\n textColor: \"#fafafa\",\n slotShape: \"square\",\n gridColumns: 4,\n unclaimedOpacity: 1,\n completedStampColor: \"#a855f7\",\n fontFamily: \"monospace\",\n },\n },\n];\n","import type {\n AdminRallyConfig,\n CheckInCondition,\n PublicRallyConfig,\n Reward,\n RewardUnlockCondition,\n SheetTheme,\n} from \"./models.js\";\n\nexport interface ValidationError {\n readonly path: string;\n readonly message: string;\n readonly code: string;\n}\n\nexport type ParseResult<T> =\n | { readonly success: true; readonly data: T }\n | { readonly success: false; readonly errors: ReadonlyArray<ValidationError> };\n\nexport class ConfigValidationError extends Error {\n readonly name = \"ConfigValidationError\";\n constructor(readonly errors: ReadonlyArray<ValidationError>) {\n super(errors.map((error) => `${error.path}: ${error.message}`).join(\"; \"));\n }\n}\n\ntype RecordValue = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is RecordValue {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasOwn(value: RecordValue, key: string): boolean {\n return Object.hasOwn(value, key);\n}\n\nfunction add(errors: ValidationError[], path: string, message: string, code: string): void {\n errors.push({ path, message, code });\n}\n\nfunction requiredString(\n value: RecordValue,\n key: string,\n path: string,\n errors: ValidationError[],\n): boolean {\n if (typeof value[key] !== \"string\" || value[key].length === 0) {\n add(errors, `${path}.${key}`, \"A non-empty string is required.\", \"required_string\");\n return false;\n }\n return true;\n}\n\nfunction optionalString(\n value: RecordValue,\n key: string,\n path: string,\n errors: ValidationError[],\n): void {\n if (hasOwn(value, key) && value[key] !== undefined && typeof value[key] !== \"string\")\n add(errors, `${path}.${key}`, \"Expected a string.\", \"invalid_type\");\n}\n\nfunction optionalBoolean(\n value: RecordValue,\n key: string,\n path: string,\n errors: ValidationError[],\n): void {\n if (hasOwn(value, key) && value[key] !== undefined && typeof value[key] !== \"boolean\")\n add(errors, `${path}.${key}`, \"Expected a boolean.\", \"invalid_type\");\n}\n\nfunction finiteNumber(\n value: RecordValue,\n key: string,\n path: string,\n errors: ValidationError[],\n minimum?: number,\n): void {\n const item = value[key];\n if (typeof item !== \"number\" || !Number.isFinite(item)) {\n add(errors, `${path}.${key}`, \"Expected a finite number.\", \"invalid_number\");\n } else if (minimum !== undefined && item < minimum) {\n add(\n errors,\n `${path}.${key}`,\n `Expected a number greater than or equal to ${minimum}.`,\n \"out_of_range\",\n );\n }\n}\n\nfunction nonNegativeInteger(\n value: RecordValue,\n key: string,\n path: string,\n errors: ValidationError[],\n): void {\n const item = value[key];\n if (typeof item !== \"number\" || !Number.isFinite(item)) {\n add(errors, `${path}.${key}`, \"Expected a finite number.\", \"invalid_number\");\n return;\n }\n if (!Number.isInteger(item)) {\n add(errors, `${path}.${key}`, \"Expected a non-negative integer.\", \"invalid_integer\");\n return;\n }\n if (item < 0) add(errors, `${path}.${key}`, \"Expected a non-negative integer.\", \"out_of_range\");\n}\n\nfunction localizedText(value: unknown, path: string, errors: ValidationError[]): void {\n if (typeof value === \"string\") return;\n if (!isRecord(value)) {\n add(errors, path, \"Expected a string or a locale map.\", \"invalid_localized_text\");\n return;\n }\n for (const [locale, text] of Object.entries(value)) {\n if (typeof text !== \"string\")\n add(errors, `${path}.${locale}`, \"Expected a string.\", \"invalid_type\");\n }\n}\n\nfunction theme(value: unknown, path: string, errors: ValidationError[]): void {\n if (!isRecord(value)) {\n add(errors, path, \"Expected a theme object.\", \"invalid_type\");\n return;\n }\n for (const key of [\"primaryColor\", \"cardBackgroundColor\", \"textColor\"])\n requiredString(value, key, path, errors);\n optionalString(value, \"backgroundColor\", path, errors);\n optionalString(value, \"backgroundImageUrl\", path, errors);\n optionalString(value, \"completedStampColor\", path, errors);\n optionalString(value, \"fontFamily\", path, errors);\n const slotShape = value.slotShape;\n if (slotShape !== \"circle\" && slotShape !== \"square\" && slotShape !== \"rounded\")\n add(errors, `${path}.slotShape`, \"Expected circle, square, or rounded.\", \"invalid_enum\");\n finiteNumber(value, \"gridColumns\", path, errors, 1);\n if (typeof value.gridColumns === \"number\" && !Number.isInteger(value.gridColumns))\n add(errors, `${path}.gridColumns`, \"Expected an integer.\", \"invalid_integer\");\n if (hasOwn(value, \"unclaimedOpacity\")) {\n finiteNumber(value, \"unclaimedOpacity\", path, errors, 0);\n if (typeof value.unclaimedOpacity === \"number\" && value.unclaimedOpacity > 1)\n add(errors, `${path}.unclaimedOpacity`, \"Expected a value between 0 and 1.\", \"out_of_range\");\n }\n}\n\nfunction externalReferences(value: unknown, path: string, errors: ValidationError[]): void {\n if (!Array.isArray(value)) {\n add(errors, path, \"Expected an array.\", \"invalid_type\");\n return;\n }\n value.forEach((item, index) => {\n const itemPath = `${path}[${index}]`;\n if (!isRecord(item)) {\n add(errors, itemPath, \"Expected an object.\", \"invalid_type\");\n return;\n }\n requiredString(item, \"type\", itemPath, errors);\n requiredString(item, \"id\", itemPath, errors);\n optionalString(item, \"url\", itemPath, errors);\n });\n}\n\nfunction condition(\n value: unknown,\n path: string,\n errors: ValidationError[],\n isPublic: boolean,\n): void {\n if (!isRecord(value)) {\n add(errors, path, \"Expected a condition object.\", \"invalid_type\");\n return;\n }\n const type = value.type;\n if (type === \"qr\") {\n if (isPublic) {\n if (hasOwn(value, \"secretToken\"))\n add(errors, `${path}.secretToken`, \"Private field is not allowed.\", \"private_field\");\n } else requiredString(value, \"secretToken\", path, errors);\n optionalString(value, \"qrEntryUrl\", path, errors);\n return;\n }\n if (type === \"passcode\") {\n if (isPublic) {\n for (const key of [\"code\", \"caseSensitive\"])\n if (hasOwn(value, key))\n add(errors, `${path}.${key}`, \"Private field is not allowed.\", \"private_field\");\n } else {\n requiredString(value, \"code\", path, errors);\n optionalBoolean(value, \"caseSensitive\", path, errors);\n }\n return;\n }\n if (type === \"gps\") {\n finiteNumber(value, \"latitude\", path, errors);\n finiteNumber(value, \"longitude\", path, errors);\n finiteNumber(value, \"radiusMeters\", path, errors, 0);\n if (typeof value.radiusMeters === \"number\" && value.radiusMeters <= 0)\n add(errors, `${path}.radiusMeters`, \"Expected a radius greater than 0.\", \"out_of_range\");\n if (typeof value.latitude === \"number\" && (value.latitude < -90 || value.latitude > 90))\n add(errors, `${path}.latitude`, \"Expected a latitude between -90 and 90.\", \"out_of_range\");\n if (typeof value.longitude === \"number\" && (value.longitude < -180 || value.longitude > 180))\n add(\n errors,\n `${path}.longitude`,\n \"Expected a longitude between -180 and 180.\",\n \"out_of_range\",\n );\n return;\n }\n if (type === \"nfc\") {\n if (isPublic) {\n if (hasOwn(value, \"tagId\"))\n add(errors, `${path}.tagId`, \"Private field is not allowed.\", \"private_field\");\n } else requiredString(value, \"tagId\", path, errors);\n return;\n }\n if (type === \"custom\") {\n requiredString(value, \"validatorName\", path, errors);\n if (isPublic && hasOwn(value, \"secretParams\"))\n add(errors, `${path}.secretParams`, \"Private field is not allowed.\", \"private_field\");\n if (!isPublic && hasOwn(value, \"secretParams\") && !isRecord(value.secretParams))\n add(errors, `${path}.secretParams`, \"Expected an object.\", \"invalid_type\");\n return;\n }\n add(errors, `${path}.type`, \"Unknown condition type.\", \"invalid_enum\");\n}\n\nfunction unlockCondition(value: unknown, path: string, errors: ValidationError[]): void {\n if (!isRecord(value)) {\n add(errors, path, \"Expected an unlock condition object.\", \"invalid_type\");\n return;\n }\n if (value.type === \"stamp_count\") {\n finiteNumber(value, \"count\", path, errors, 0);\n return;\n }\n if (value.type === \"stamps\") {\n if (!Array.isArray(value.stampIds))\n add(errors, `${path}.stampIds`, \"Expected an array.\", \"invalid_type\");\n else\n value.stampIds.forEach((item, index) => {\n if (typeof item !== \"string\" || item.length === 0)\n add(\n errors,\n `${path}.stampIds[${index}]`,\n \"Expected a non-empty string.\",\n \"required_string\",\n );\n });\n return;\n }\n if (value.type === \"all\" || value.type === \"any\") {\n if (!Array.isArray(value.conditions))\n add(errors, `${path}.conditions`, \"Expected an array.\", \"invalid_type\");\n else\n value.conditions.forEach((item, index) => {\n unlockCondition(item, `${path}.conditions[${index}]`, errors);\n });\n return;\n }\n add(errors, `${path}.type`, \"Unknown unlock condition type.\", \"invalid_enum\");\n}\n\nfunction spot(value: unknown, path: string, errors: ValidationError[], isPublic: boolean): void {\n if (!isRecord(value)) {\n add(errors, path, \"Expected a spot object.\", \"invalid_type\");\n return;\n }\n requiredString(value, \"id\", path, errors);\n finiteNumber(value, \"orderIndex\", path, errors, 0);\n if (typeof value.orderIndex === \"number\" && !Number.isInteger(value.orderIndex))\n add(errors, `${path}.orderIndex`, \"Expected an integer.\", \"invalid_integer\");\n localizedText(value.name, `${path}.name`, errors);\n for (const key of [\"description\", \"hint\"])\n if (hasOwn(value, key)) localizedText(value[key], `${path}.${key}`, errors);\n for (const key of [\"imageUrl\", \"iconUrl\", \"redirectUrlAfterClaim\"])\n optionalString(value, key, path, errors);\n if (hasOwn(value, \"externalReferences\") && value.externalReferences !== undefined)\n externalReferences(value.externalReferences, `${path}.externalReferences`, errors);\n if (hasOwn(value, \"prerequisites\") && value.prerequisites !== undefined) {\n if (!Array.isArray(value.prerequisites))\n add(errors, `${path}.prerequisites`, \"Expected an array.\", \"invalid_type\");\n else\n value.prerequisites.forEach((item, index) => {\n if (typeof item !== \"string\" || item.length === 0)\n add(\n errors,\n `${path}.prerequisites[${index}]`,\n \"Expected a non-empty string.\",\n \"required_string\",\n );\n });\n }\n if (!Array.isArray(value.conditions))\n add(errors, `${path}.conditions`, \"Expected an array.\", \"invalid_type\");\n else\n value.conditions.forEach((item, index) => {\n condition(item, `${path}.conditions[${index}]`, errors, isPublic);\n });\n}\n\nfunction reward(value: unknown, path: string, errors: ValidationError[], isPublic: boolean): void {\n if (!isRecord(value)) {\n add(errors, path, \"Expected a reward object.\", \"invalid_type\");\n return;\n }\n requiredString(value, \"id\", path, errors);\n localizedText(value.title, `${path}.title`, errors);\n if (hasOwn(value, \"description\")) localizedText(value.description, `${path}.description`, errors);\n if (value.type !== \"digital\" && value.type !== \"in_person\")\n add(errors, `${path}.type`, \"Unknown reward type.\", \"invalid_enum\");\n if (\n ![\"manual_slide\", \"staff_passcode\", \"view_only\", \"server_claim\"].includes(\n String(value.redemptionMethod),\n )\n )\n add(errors, `${path}.redemptionMethod`, \"Unknown redemption method.\", \"invalid_enum\");\n nonNegativeInteger(value, \"requiredStampCount\", path, errors);\n for (const key of [\"stockLimit\", \"userClaimLimit\"]) {\n if (hasOwn(value, key) && value[key] !== undefined) {\n nonNegativeInteger(value, key, path, errors);\n }\n }\n optionalString(value, \"stockKey\", path, errors);\n optionalString(value, \"secondaryStockKey\", path, errors);\n optionalString(value, \"validUntil\", path, errors);\n if (typeof value.validUntil === \"string\" && Number.isNaN(Date.parse(value.validUntil)))\n add(errors, `${path}.validUntil`, \"Expected a valid date string.\", \"invalid_date\");\n if (isPublic) {\n for (const key of [\"staffPasscode\", \"digitalContentUrl\"])\n if (hasOwn(value, key))\n add(errors, `${path}.${key}`, \"Private field is not allowed.\", \"private_field\");\n } else {\n optionalString(value, \"staffPasscode\", path, errors);\n optionalString(value, \"digitalContentUrl\", path, errors);\n }\n if (hasOwn(value, \"conditions\") && value.conditions !== undefined) {\n if (!Array.isArray(value.conditions))\n add(errors, `${path}.conditions`, \"Expected an array.\", \"invalid_type\");\n else\n value.conditions.forEach((item, index) => {\n unlockCondition(item, `${path}.conditions[${index}]`, errors);\n });\n }\n}\n\nfunction validate(value: unknown, isPublic: boolean): ReadonlyArray<ValidationError> {\n const errors: ValidationError[] = [];\n if (!isRecord(value)) {\n add(errors, \"$\", \"Expected a configuration object.\", \"invalid_type\");\n return errors;\n }\n requiredString(value, \"id\", \"$\", errors);\n requiredString(value, \"version\", \"$\", errors);\n localizedText(value.title, \"$.title\", errors);\n if (hasOwn(value, \"description\")) localizedText(value.description, \"$.description\", errors);\n if (hasOwn(value, \"theme\") && value.theme !== undefined) theme(value.theme, \"$.theme\", errors);\n if (!Array.isArray(value.spots)) add(errors, \"spots\", \"Expected an array.\", \"invalid_type\");\n else\n value.spots.forEach((item, index) => {\n spot(item, `spots[${index}]`, errors, isPublic);\n });\n if (!Array.isArray(value.rewards)) add(errors, \"rewards\", \"Expected an array.\", \"invalid_type\");\n else\n value.rewards.forEach((item, index) => {\n reward(item, `rewards[${index}]`, errors, isPublic);\n });\n if (!isPublic) {\n optionalString(value, \"staffPasscode\", \"$\", errors);\n if (hasOwn(value, \"inventory\") && value.inventory !== undefined) {\n if (!isRecord(value.inventory))\n add(errors, \"$.inventory\", \"Expected an object.\", \"invalid_type\");\n else {\n for (const [key, item] of Object.entries(value.inventory)) {\n if (key === \"global\") {\n add(\n errors,\n \"$.inventory.global\",\n \"Use sharedStock instead of global.\",\n \"deprecated_field\",\n );\n continue;\n }\n if (item !== undefined) nonNegativeInteger(value.inventory, key, \"$.inventory\", errors);\n }\n if (hasOwn(value.inventory, \"sharedStock\") && hasOwn(value.inventory, \"global\"))\n add(\n errors,\n \"$.inventory\",\n \"sharedStock and global cannot be configured together.\",\n \"conflicting_fields\",\n );\n }\n }\n if (\n hasOwn(value, \"inventoryMode\") &&\n value.inventoryMode !== undefined &&\n value.inventoryMode !== \"shared\" &&\n value.inventoryMode !== \"per_reward\"\n )\n add(errors, \"$.inventoryMode\", \"Expected shared or per_reward.\", \"invalid_enum\");\n if (\n hasOwn(value, \"serverMetadata\") &&\n value.serverMetadata !== undefined &&\n !isRecord(value.serverMetadata)\n )\n add(errors, \"$.serverMetadata\", \"Expected an object.\", \"invalid_type\");\n if (\n hasOwn(value, \"publicMetadata\") &&\n value.publicMetadata !== undefined &&\n !isRecord(value.publicMetadata)\n )\n add(errors, \"$.publicMetadata\", \"Expected an object.\", \"invalid_type\");\n optionalString(value, \"serverEndpoint\", \"$\", errors);\n } else {\n for (const key of [\"staffPasscode\", \"serverMetadata\", \"inventory\", \"inventoryMode\"])\n if (hasOwn(value, key))\n add(errors, `$.${key}`, \"Private field is not allowed.\", \"private_field\");\n optionalString(value, \"serverEndpoint\", \"$\", errors);\n }\n return errors;\n}\n\n/** Validates relationships that can only be checked after all entities exist. */\nexport function validateRallyConfigRelations(\n config: AdminRallyConfig | PublicRallyConfig,\n): ReadonlyArray<ValidationError> {\n const errors: ValidationError[] = [];\n const spotIds = new Set<string>();\n const rewardIds = new Set<string>();\n const orderIndexes = new Map<number, number>();\n\n config.spots.forEach((spot, index) => {\n if (spotIds.has(spot.id))\n add(errors, `spots[${index}].id`, \"Spot ID must be unique.\", \"duplicate_spot_id\");\n spotIds.add(spot.id);\n const previousIndex = orderIndexes.get(spot.orderIndex);\n if (previousIndex !== undefined)\n add(\n errors,\n `spots[${index}].orderIndex`,\n `orderIndex duplicates spots[${previousIndex}].`,\n \"duplicate_order_index\",\n );\n else orderIndexes.set(spot.orderIndex, index);\n if (spot.orderIndex < 0)\n add(\n errors,\n `spots[${index}].orderIndex`,\n \"orderIndex must not be negative.\",\n \"negative_order_index\",\n );\n spot.prerequisites?.forEach((prerequisite, prerequisiteIndex) => {\n if (\n !spotIds.has(prerequisite) &&\n !config.spots.some((candidate) => candidate.id === prerequisite)\n )\n add(\n errors,\n `spots[${index}].prerequisites[${prerequisiteIndex}]`,\n \"Prerequisite spot does not exist.\",\n \"missing_prerequisite\",\n );\n });\n });\n\n config.rewards.forEach((reward, index) => {\n if (rewardIds.has(reward.id))\n add(errors, `rewards[${index}].id`, \"Reward ID must be unique.\", \"duplicate_reward_id\");\n rewardIds.add(reward.id);\n const visit = (condition: RewardUnlockCondition, path: string): void => {\n if (condition.type === \"stamps\")\n condition.stampIds.forEach((stampId, stampIndex) => {\n if (!spotIds.has(stampId))\n add(\n errors,\n `${path}.stampIds[${stampIndex}]`,\n \"Referenced spot does not exist.\",\n \"missing_reward_spot\",\n );\n });\n else if (condition.type === \"all\" || condition.type === \"any\")\n condition.conditions.forEach((nested, nestedIndex) => {\n visit(nested, `${path}.conditions[${nestedIndex}]`);\n });\n };\n reward.conditions?.forEach((condition, conditionIndex) => {\n visit(condition, `rewards[${index}].conditions[${conditionIndex}]`);\n });\n if (reward.requiredStampCount > config.spots.length)\n add(\n errors,\n `rewards[${index}].requiredStampCount`,\n \"requiredStampCount cannot exceed the number of spots.\",\n \"required_stamp_count_exceeds_spots\",\n );\n const inventory = \"inventory\" in config ? config.inventory : undefined;\n for (const [field, key] of [\n [\"stockKey\", reward.stockKey],\n [\"secondaryStockKey\", reward.secondaryStockKey],\n ] as const) {\n if (\n key !== undefined &&\n ((key === \"__shared__\" && inventory?.sharedStock === undefined) ||\n (key !== \"__shared__\" && inventory?.[key] === undefined))\n )\n add(\n errors,\n `rewards[${index}].${field}`,\n \"Referenced inventory key does not exist.\",\n \"missing_inventory_key\",\n );\n }\n });\n\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const cycleNodes = new Set<string>();\n const visitSpot = (spotId: string): void => {\n if (visiting.has(spotId)) {\n cycleNodes.add(spotId);\n return;\n }\n if (visited.has(spotId)) return;\n visiting.add(spotId);\n const spot = config.spots.find((candidate) => candidate.id === spotId);\n spot?.prerequisites?.forEach(visitSpot);\n visiting.delete(spotId);\n visited.add(spotId);\n };\n config.spots.forEach((spot) => {\n visitSpot(spot.id);\n });\n cycleNodes.forEach((spotId) => {\n const index = config.spots.findIndex((spot) => spot.id === spotId);\n add(\n errors,\n `spots[${index}].prerequisites`,\n \"Prerequisites must form a DAG.\",\n \"cyclic_prerequisites\",\n );\n });\n return errors;\n}\n\nexport function safeParseAdminConfig(input: unknown): ParseResult<AdminRallyConfig> {\n const errors: ValidationError[] = [...validate(input, false)];\n if (errors.length === 0) errors.push(...validateRallyConfigRelations(input as AdminRallyConfig));\n return errors.length === 0\n ? { success: true, data: input as AdminRallyConfig }\n : { success: false, errors };\n}\n\nexport function parseAdminConfig(input: unknown): AdminRallyConfig {\n const result = safeParseAdminConfig(input);\n if (!result.success) throw new ConfigValidationError(result.errors);\n return result.data;\n}\n\nexport function safeParsePublicConfig(input: unknown): ParseResult<PublicRallyConfig> {\n const errors: ValidationError[] = [...validate(input, true)];\n if (errors.length === 0) errors.push(...validateRallyConfigRelations(input as PublicRallyConfig));\n return errors.length === 0\n ? { success: true, data: input as PublicRallyConfig }\n : { success: false, errors };\n}\n\nexport function parsePublicConfig(input: unknown): PublicRallyConfig {\n const result = safeParsePublicConfig(input);\n if (!result.success) throw new ConfigValidationError(result.errors);\n return result.data;\n}\n\nexport type {\n AdminRallyConfig,\n CheckInCondition,\n PublicRallyConfig,\n Reward,\n RewardUnlockCondition,\n SheetTheme,\n};\n","export type SnapshotSecretKey = string | Uint8Array;\n\nexport interface SnapshotTokenPayload {\n readonly [key: string]: unknown;\n readonly expiresAt?: string;\n readonly exp?: number;\n}\n\nexport type SnapshotTokenErrorCode =\n | \"MALFORMED\"\n | \"INVALID_SIGNATURE\"\n | \"DECRYPTION_FAILED\"\n | \"EXPIRED\"\n | \"UNSUPPORTED\";\n\nexport interface SnapshotTokenError {\n readonly code: SnapshotTokenErrorCode;\n readonly message: string;\n}\n\nexport type SnapshotTokenVerification<T extends SnapshotTokenPayload = SnapshotTokenPayload> =\n | { readonly ok: true; readonly valid: true; readonly payload: T }\n | { readonly ok: false; readonly valid: false; readonly error: SnapshotTokenError };\n\nconst encoder = new TextEncoder();\n\nfunction cryptoApi(): Crypto {\n if (globalThis.crypto === undefined || globalThis.crypto.subtle === undefined) {\n throw new Error(\"Web Crypto API is unavailable in this environment.\");\n }\n return globalThis.crypto;\n}\n\nfunction secretBytes(secretKey: SnapshotSecretKey): Uint8Array {\n return typeof secretKey === \"string\" ? encoder.encode(secretKey) : new Uint8Array(secretKey);\n}\n\nfunction webCryptoBytes(bytes: Uint8Array): BufferSource {\n return bytes.buffer as ArrayBuffer;\n}\n\nfunction base64Url(bytes: Uint8Array): string {\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return globalThis.btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replace(/=+$/u, \"\");\n}\n\nfunction fromBase64Url(value: string): Uint8Array {\n const base64 = value.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n const padded = `${base64}${\"=\".repeat((4 - (base64.length % 4)) % 4)}`;\n const binary = globalThis.atob(padded);\n return Uint8Array.from(binary, (character) => character.charCodeAt(0));\n}\n\nasync function importHmacKey(secret: Uint8Array): Promise<CryptoKey> {\n return cryptoApi().subtle.importKey(\n \"raw\",\n webCryptoBytes(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\", \"verify\"],\n );\n}\n\nasync function importAesKey(secret: Uint8Array): Promise<CryptoKey> {\n const digest = await cryptoApi().subtle.digest(\"SHA-256\", webCryptoBytes(secret));\n return cryptoApi().subtle.importKey(\"raw\", digest, \"AES-GCM\", false, [\"encrypt\", \"decrypt\"]);\n}\n\nfunction isExpired(payload: SnapshotTokenPayload, now: number): boolean {\n if (typeof payload.exp === \"number\" && now >= payload.exp * 1000) return true;\n return payload.expiresAt !== undefined && Date.parse(payload.expiresAt) <= now;\n}\n\nexport async function createSignedSnapshotToken<T extends SnapshotTokenPayload>(\n payload: T,\n secretKey: SnapshotSecretKey,\n): Promise<string> {\n const api = cryptoApi();\n const secret = secretBytes(secretKey);\n const iv = api.getRandomValues(new Uint8Array(12));\n const plaintext = encoder.encode(JSON.stringify(payload));\n const encrypted = new Uint8Array(\n await api.subtle.encrypt(\n { name: \"AES-GCM\", iv: webCryptoBytes(iv) },\n await importAesKey(secret),\n webCryptoBytes(plaintext),\n ),\n );\n const body = base64Url(new Uint8Array([...iv, ...encrypted]));\n const signature = new Uint8Array(\n await api.subtle.sign(\"HMAC\", await importHmacKey(secret), encoder.encode(body)),\n );\n return `sr2.${body}.${base64Url(signature)}`;\n}\n\nexport async function verifySnapshotToken<T extends SnapshotTokenPayload = SnapshotTokenPayload>(\n token: string,\n secretKey: SnapshotSecretKey,\n now = Date.now(),\n): Promise<SnapshotTokenVerification<T>> {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3 || parts[0] !== \"sr2\") {\n return {\n ok: false,\n valid: false,\n error: { code: \"MALFORMED\", message: \"Snapshot token is malformed.\" },\n };\n }\n const [, body, encodedSignature] = parts;\n if (body === undefined || encodedSignature === undefined) {\n return {\n ok: false,\n valid: false,\n error: { code: \"MALFORMED\", message: \"Snapshot token is malformed.\" },\n };\n }\n const secret = secretBytes(secretKey);\n const validSignature = await cryptoApi().subtle.verify(\n \"HMAC\",\n await importHmacKey(secret),\n webCryptoBytes(fromBase64Url(encodedSignature)),\n webCryptoBytes(encoder.encode(body)),\n );\n if (!validSignature) {\n return {\n ok: false,\n valid: false,\n error: { code: \"INVALID_SIGNATURE\", message: \"Snapshot token signature is invalid.\" },\n };\n }\n const encrypted = fromBase64Url(body);\n if (encrypted.length <= 12) throw new Error(\"Invalid encrypted payload.\");\n const payloadText = await cryptoApi().subtle.decrypt(\n { name: \"AES-GCM\", iv: webCryptoBytes(encrypted.slice(0, 12)) },\n await importAesKey(secret),\n webCryptoBytes(encrypted.slice(12)),\n );\n const payload: unknown = JSON.parse(new TextDecoder().decode(payloadText));\n if (typeof payload !== \"object\" || payload === null || Array.isArray(payload))\n throw new Error(\"Invalid payload.\");\n if (isExpired(payload as SnapshotTokenPayload, now)) {\n return {\n ok: false,\n valid: false,\n error: { code: \"EXPIRED\", message: \"Snapshot token has expired.\" },\n };\n }\n return { ok: true, valid: true, payload: payload as T };\n } catch {\n return {\n ok: false,\n valid: false,\n error: { code: \"DECRYPTION_FAILED\", message: \"Snapshot token could not be verified.\" },\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/engine/evaluate.ts","../src/engine/order.ts","../src/engine/progress.ts","../src/engine/rewards.ts","../src/engine/sync.ts","../src/detectors/types.ts","../src/detectors/geolocation.ts","../src/detectors/nfc.ts","../src/detectors/passcode.ts","../src/detectors/qr.ts","../src/engine/transition.ts","../src/client/storage.ts","../src/client/offlineQueue.ts","../src/client/sync.ts","../src/client/client.ts","../src/crypto/token.ts","../src/domain/models.ts","../src/domain/configTransform.ts","../src/domain/i18n.ts","../src/domain/themePresets.ts","../src/domain/validation.ts","../src/security/snapshotToken.ts"],"names":["value","condition","spot","id","cryptoApi","reward","DEFAULT_TIMEOUT_MS","record","bytes","rewards","operationId","error","operation","next","isRecord","encoder"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n CheckInCondition,\n ConditionMatch,\n ConditionMismatch,\n Result,\n SpotItem,\n SpotStatus,\n UserRallyState,\n VerificationContext,\n} from \"../domain/index.js\";\n\nconst EARTH_RADIUS_METERS = 6_371_000;\nexport function calculateDistanceMeters(\n aLat: number,\n aLon: number,\n bLat: number,\n bLon: number,\n): number {\n const radians = (value: number): number => (value * Math.PI) / 180;\n const dLat = radians(bLat - aLat);\n const dLon = radians(bLon - aLon);\n const value =\n Math.sin(dLat / 2) ** 2 +\n Math.cos(radians(aLat)) * Math.cos(radians(bLat)) * Math.sin(dLon / 2) ** 2;\n return 2 * EARTH_RADIUS_METERS * Math.asin(Math.sqrt(Math.min(1, value)));\n}\nfunction mismatch(\n conditionType: CheckInCondition[\"type\"],\n reason: ConditionMismatch[\"reason\"],\n extra: Partial<ConditionMismatch> = {},\n): Result<ConditionMatch, ConditionMismatch> {\n return { ok: false, error: { code: \"CONDITION_MISMATCH\", conditionType, reason, ...extra } };\n}\nexport function evaluateConditionDetailed(\n condition: CheckInCondition,\n context: VerificationContext,\n): Result<ConditionMatch, ConditionMismatch> {\n switch (condition.type) {\n case \"qr\":\n return context.type === \"qr\" && context.token === condition.secretToken\n ? { ok: true, value: { conditionType: \"qr\" } }\n : mismatch(\"qr\", \"INVALID_PROOF\");\n case \"passcode\":\n return context.type === \"passcode\" &&\n (condition.caseSensitive === false\n ? context.code.toLocaleLowerCase() === condition.code.toLocaleLowerCase()\n : context.code === condition.code)\n ? { ok: true, value: { conditionType: \"passcode\" } }\n : mismatch(\"passcode\", \"INVALID_PROOF\");\n case \"nfc\":\n return context.type === \"nfc\" && context.tagId === condition.tagId\n ? { ok: true, value: { conditionType: \"nfc\" } }\n : mismatch(\"nfc\", \"INVALID_PROOF\");\n case \"custom\":\n return mismatch(\"custom\", \"VALIDATOR_FAILED\");\n case \"gps\": {\n if (\n !Number.isFinite(condition.latitude) ||\n !Number.isFinite(condition.longitude) ||\n !Number.isFinite(condition.radiusMeters) ||\n condition.radiusMeters < 0 ||\n context.type !== \"gps\" ||\n !Number.isFinite(context.latitude) ||\n !Number.isFinite(context.longitude)\n )\n return mismatch(\"gps\", \"INVALID_GEO_INPUT\");\n const distanceMeters = calculateDistanceMeters(\n condition.latitude,\n condition.longitude,\n context.latitude,\n context.longitude,\n );\n return distanceMeters <= condition.radiusMeters\n ? { ok: true, value: { conditionType: \"gps\", distanceMeters } }\n : mismatch(\"gps\", \"OUTSIDE_RADIUS\", {\n distanceMeters,\n radiusMeters: condition.radiusMeters,\n });\n }\n }\n}\nexport function evaluateCondition(\n condition: CheckInCondition,\n context: VerificationContext,\n): boolean {\n return evaluateConditionDetailed(condition, context).ok;\n}\n\n/** Derives a viewer-safe spot status without changing the supplied state. */\nexport function evaluateSpotStatus(\n spot: Pick<SpotItem, \"id\" | \"prerequisites\">,\n state: Pick<UserRallyState, \"records\">,\n options: { readonly verifying?: boolean } = {},\n): SpotStatus {\n if (options.verifying === true) return \"VERIFYING\";\n if (state.records.some((record) => record.stampId === spot.id)) return \"CLAIMED\";\n const acquired = new Set(state.records.map((record) => record.stampId));\n if (spot.prerequisites?.some((prerequisite) => !acquired.has(prerequisite))) return \"LOCKED\";\n return \"UNCLAIMED\";\n}\n\nexport const getSpotStatus = evaluateSpotStatus;\n","import type { SpotItem } from \"../domain/index.js\";\nexport function getOrderedSpots<TLocale extends string, TMeta extends Record<string, unknown>>(\n spots: ReadonlyArray<SpotItem<TLocale, TMeta>>,\n): ReadonlyArray<SpotItem<TLocale, TMeta>> {\n return [...spots].sort((left, right) => left.orderIndex - right.orderIndex);\n}\n","import type { PublicSpotItem, RallyConfig, StampRallyState } from \"../domain/index.js\";\nexport interface StampRallyProgress {\n readonly acquired: number;\n readonly total: number;\n readonly percentage: number;\n readonly isCompleted: boolean;\n readonly nextAvailableSpots: ReadonlyArray<PublicSpotItem>;\n}\nexport function calculateProgress(state: StampRallyState, config: RallyConfig): StampRallyProgress {\n const ids = new Set(config.spots.map((spot) => spot.id));\n const acquired = new Set(\n state.records.map((record) => record.stampId).filter((id) => ids.has(id)),\n );\n const remaining = config.spots.filter(\n (spot) =>\n !acquired.has(spot.id) &&\n (spot.prerequisites === undefined || spot.prerequisites.every((id) => acquired.has(id))),\n );\n return {\n acquired: acquired.size,\n total: config.spots.length,\n percentage: config.spots.length === 0 ? 0 : (acquired.size / config.spots.length) * 100,\n isCompleted: config.spots.length > 0 && acquired.size === config.spots.length,\n nextAvailableSpots: [...remaining].sort((left, right) => left.orderIndex - right.orderIndex),\n };\n}\n","import type { Reward, RewardState } from \"../domain/models.js\";\n\nexport interface ClaimTicketOptions {\n readonly issuedAt?: string;\n readonly sequence?: number;\n}\n\nfunction hash(value: string): string {\n let result = 2_166_136_261;\n for (const character of value) {\n result ^= character.codePointAt(0) ?? 0;\n result = Math.imul(result, 16_777_619) >>> 0;\n }\n return result.toString(36).toUpperCase().padStart(7, \"0\");\n}\n\nfunction createRandomHash(): string {\n const cryptoApi = globalThis.crypto;\n if (cryptoApi !== undefined && typeof cryptoApi.getRandomValues === \"function\") {\n const values = new Uint32Array(2);\n cryptoApi.getRandomValues(values);\n return Array.from(values, (value) => value.toString(36).toUpperCase().padStart(7, \"0\")).join(\n \"\",\n );\n }\n\n return `${Date.now().toString(36).toUpperCase()}${Math.random().toString(36).slice(2).toUpperCase()}`;\n}\n\nexport function createClaimTicketNumber(\n rewardId: string,\n options: ClaimTicketOptions = {},\n): string {\n const issuedAt = options.issuedAt ?? \"\";\n const sequence = options.sequence ?? 0;\n return `SR-${hash(`${rewardId}|${issuedAt}|${sequence}`)}`;\n}\n\n/** Creates a one-time ticket for a successful reward consumption. */\nexport function createUniqueClaimTicketNumber(rewardId: string, issuedAt: string): string {\n const timestamp = Date.parse(issuedAt);\n const timestampPart = Number.isNaN(timestamp) ? Date.now() : timestamp;\n return `CLAIM-${rewardId}-${timestampPart}-${createRandomHash()}`;\n}\n\nexport function issueClaimTicketNumber(\n reward: Reward,\n currentState: RewardState,\n options: ClaimTicketOptions = {},\n): RewardState {\n if (currentState.claimTicketNumber !== undefined) return currentState;\n const claimTicketNumber = createClaimTicketNumber(reward.id, options);\n return { ...currentState, claimTicketNumber };\n}\n","import type { UserRallyState } from \"../domain/index.js\";\n\nexport type ConflictResolutionPolicy = \"authoritative_replay\";\n\n/** Uses the server snapshot as the immutable replay baseline. */\nexport function resolveRallyStateConflict(\n serverState: UserRallyState,\n _localState: UserRallyState,\n): UserRallyState {\n return {\n ...serverState,\n records: serverState.records.map((record) => ({\n ...record,\n ...(record.metadata === undefined ? {} : { metadata: { ...record.metadata } }),\n })),\n rewards: serverState.rewards.map((reward) => ({ ...reward })),\n ...(serverState.inventory === undefined\n ? {}\n : {\n inventory: {\n ...serverState.inventory,\n ...(serverState.inventory.rewardRemaining === undefined\n ? {}\n : { rewardRemaining: { ...serverState.inventory.rewardRemaining } }),\n },\n }),\n };\n}\n","import type { Result, VerificationContext } from \"../domain/index.js\";\n\nexport type DetectorKind = \"geolocation\" | \"nfc\" | \"qr\";\n\nexport type DetectorErrorCode =\n | \"UNSUPPORTED\"\n | \"PERMISSION_DENIED\"\n | \"POSITION_UNAVAILABLE\"\n | \"TIMEOUT\"\n | \"ABORTED\"\n | \"READ_FAILED\"\n | \"INVALID_DATA\"\n | \"NO_TOKEN\";\n\nexport interface DetectorError {\n readonly detector: DetectorKind;\n readonly code: DetectorErrorCode;\n readonly message: string;\n readonly cause?: unknown;\n}\n\nexport type GeoVerificationContext = Extract<VerificationContext, { readonly type: \"gps\" }>;\nexport type QrVerificationContext = Extract<VerificationContext, { readonly type: \"qr\" }>;\nexport type NfcVerificationContext = Extract<VerificationContext, { readonly type: \"nfc\" }>;\nexport type DetectorResult<T extends VerificationContext> = Result<T, DetectorError>;\n\nexport interface PasscodeCondition {\n readonly code: string;\n readonly caseSensitive?: boolean;\n}\n\nexport function createDetectorError(\n detector: DetectorKind,\n code: DetectorErrorCode,\n message: string,\n cause?: unknown,\n): DetectorError {\n return cause === undefined ? { detector, code, message } : { detector, code, message, cause };\n}\n\nexport function mapBrowserError(detector: DetectorKind, error: unknown): DetectorError {\n if (typeof DOMException !== \"undefined\" && error instanceof DOMException) {\n if (error.name === \"NotAllowedError\" || error.name === \"SecurityError\") {\n return createDetectorError(\n detector,\n \"PERMISSION_DENIED\",\n `${detector} permission was denied.`,\n error,\n );\n }\n if (error.name === \"AbortError\") {\n return createDetectorError(detector, \"ABORTED\", `${detector} detection was aborted.`, error);\n }\n if (error.name === \"NotSupportedError\") {\n return createDetectorError(\n detector,\n \"UNSUPPORTED\",\n `${detector} is not supported in this environment.`,\n error,\n );\n }\n if (error.name === \"TimeoutError\") {\n return createDetectorError(detector, \"TIMEOUT\", `${detector} detection timed out.`, error);\n }\n }\n return createDetectorError(detector, \"READ_FAILED\", `${detector} detection failed.`, error);\n}\n","import type { DetectorResult, GeoVerificationContext } from \"./types.js\";\nimport { createDetectorError } from \"./types.js\";\n\nexport interface GeoDetectorOptions {\n readonly enableHighAccuracy?: boolean;\n readonly timeout?: number;\n}\n\nexport function isGeolocationSupported(): boolean {\n return typeof navigator !== \"undefined\" && navigator.geolocation !== undefined;\n}\n\nexport function getCurrentGeoContext(\n options: GeoDetectorOptions = {},\n): Promise<DetectorResult<GeoVerificationContext>> {\n if (!isGeolocationSupported()) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n \"UNSUPPORTED\",\n \"Geolocation is not supported in this environment.\",\n ),\n });\n }\n if (options.timeout !== undefined && (!Number.isFinite(options.timeout) || options.timeout < 0)) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n \"INVALID_DATA\",\n \"Geolocation timeout must be a non-negative finite number.\",\n ),\n });\n }\n\n const positionOptions: PositionOptions = {\n ...(options.enableHighAccuracy === undefined\n ? {}\n : { enableHighAccuracy: options.enableHighAccuracy }),\n ...(options.timeout === undefined ? {} : { timeout: options.timeout }),\n };\n\n return new Promise((resolve) => {\n try {\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const latitude = position.coords.latitude;\n const longitude = position.coords.longitude;\n if (\n !Number.isFinite(latitude) ||\n latitude < -90 ||\n latitude > 90 ||\n !Number.isFinite(longitude) ||\n longitude < -180 ||\n longitude > 180\n ) {\n resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n \"INVALID_DATA\",\n \"Geolocation returned invalid coordinates.\",\n ),\n });\n return;\n }\n resolve({\n ok: true,\n value: { type: \"gps\", latitude, longitude },\n });\n },\n (error) => {\n const code =\n error.code === 1\n ? \"PERMISSION_DENIED\"\n : error.code === 2\n ? \"POSITION_UNAVAILABLE\"\n : error.code === 3\n ? \"TIMEOUT\"\n : \"READ_FAILED\";\n resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n code,\n `Geolocation failed: ${error.message || code}.`,\n error,\n ),\n });\n },\n positionOptions,\n );\n } catch (error) {\n resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n \"READ_FAILED\",\n \"Geolocation failed before a position could be requested.\",\n error,\n ),\n });\n }\n });\n}\n","import type { DetectorError, DetectorResult, NfcVerificationContext } from \"./types.js\";\nimport { createDetectorError, mapBrowserError } from \"./types.js\";\n\ninterface NdefRecordLike {\n readonly recordType: string;\n readonly encoding?: string;\n readonly data?: DataView;\n}\n\ninterface NdefReadingEventLike {\n readonly message: {\n readonly records: ReadonlyArray<NdefRecordLike>;\n };\n}\n\ninterface NdefReaderLike {\n onreading: ((event: NdefReadingEventLike) => void) | null;\n onreadingerror: ((event: Event) => void) | null;\n scan(options?: { readonly signal?: AbortSignal }): Promise<void>;\n}\n\ninterface NdefReaderConstructorLike {\n new (): NdefReaderLike;\n}\n\nexport interface NfcDetectorOptions {\n readonly timeout?: number;\n readonly signal?: AbortSignal;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nfunction getNdefReaderConstructor(): NdefReaderConstructorLike | undefined {\n return (globalThis as { readonly NDEFReader?: NdefReaderConstructorLike }).NDEFReader;\n}\n\nexport function isNfcSupported(): boolean {\n return getNdefReaderConstructor() !== undefined;\n}\n\nfunction decodeFirstTextRecord(event: NdefReadingEventLike): string | null {\n for (const record of event.message.records) {\n if (record.recordType !== \"text\" || record.data === undefined) continue;\n try {\n const token = new TextDecoder(record.encoding ?? \"utf-8\").decode(record.data);\n if (token.length > 0) return token;\n } catch {\n // Try the next text record when one payload cannot be decoded.\n }\n }\n return null;\n}\n\nexport function readNfcContext(\n options: NfcDetectorOptions = {},\n): Promise<DetectorResult<NfcVerificationContext>> {\n const Reader = getNdefReaderConstructor();\n if (Reader === undefined) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\"nfc\", \"UNSUPPORTED\", \"Web NFC is not supported.\"),\n });\n }\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeout) || timeout < 0) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\n \"nfc\",\n \"INVALID_DATA\",\n \"NFC timeout must be a non-negative finite number.\",\n ),\n });\n }\n if (options.signal?.aborted === true) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\"nfc\", \"ABORTED\", \"NFC detection was aborted.\"),\n });\n }\n\n let reader: NdefReaderLike;\n try {\n reader = new Reader();\n } catch (error) {\n return Promise.resolve({ ok: false, error: mapBrowserError(\"nfc\", error) });\n }\n\n return new Promise((resolve) => {\n const scanController = new AbortController();\n let settled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const finish = (result: DetectorResult<NfcVerificationContext>) => {\n if (settled) return;\n settled = true;\n if (timer !== undefined) clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", handleAbort);\n reader.onreading = null;\n reader.onreadingerror = null;\n scanController.abort();\n resolve(result);\n };\n const fail = (error: DetectorError) => finish({ ok: false, error });\n const handleAbort = () =>\n fail(createDetectorError(\"nfc\", \"ABORTED\", \"NFC detection was aborted.\"));\n\n options.signal?.addEventListener(\"abort\", handleAbort, { once: true });\n timer = setTimeout(\n () => fail(createDetectorError(\"nfc\", \"TIMEOUT\", \"NFC detection timed out.\")),\n timeout,\n );\n reader.onreading = (event) => {\n const token = decodeFirstTextRecord(event);\n if (token === null) {\n fail(createDetectorError(\"nfc\", \"NO_TOKEN\", \"The NFC tag has no text token.\"));\n return;\n }\n finish({ ok: true, value: { type: \"nfc\", tagId: token } });\n };\n reader.onreadingerror = (event) =>\n fail(createDetectorError(\"nfc\", \"READ_FAILED\", \"The NFC tag could not be read.\", event));\n\n try {\n void reader\n .scan({ signal: scanController.signal })\n .catch((error: unknown) => fail(mapBrowserError(\"nfc\", error)));\n } catch (error) {\n fail(mapBrowserError(\"nfc\", error));\n }\n });\n}\n","export interface PasscodeCondition {\n readonly code: string;\n readonly caseSensitive?: boolean;\n}\nexport interface PasscodeCheckResult {\n readonly success: boolean;\n readonly message?: string;\n}\nexport function normalizePasscode(input: string, caseSensitive = false): string {\n const normalized = input.normalize(\"NFKC\").trim();\n return caseSensitive ? normalized : normalized.toUpperCase();\n}\nexport function verifyPasscode(\n inputCode: string,\n condition: PasscodeCondition,\n): PasscodeCheckResult {\n return normalizePasscode(inputCode, condition.caseSensitive) ===\n normalizePasscode(condition.code, condition.caseSensitive)\n ? { success: true }\n : { success: false, message: \"The passcode is invalid.\" };\n}\n","import type { Result } from \"../domain/index.js\";\nimport type { DetectorError, DetectorResult, QrVerificationContext } from \"./types.js\";\nimport { createDetectorError, mapBrowserError } from \"./types.js\";\n\ninterface DetectedBarcodeLike {\n readonly rawValue: string;\n}\n\ninterface BarcodeDetectorLike {\n detect(source: HTMLVideoElement): Promise<ReadonlyArray<DetectedBarcodeLike>>;\n}\n\ninterface BarcodeDetectorConstructorLike {\n new (options?: { readonly formats?: ReadonlyArray<string> }): BarcodeDetectorLike;\n}\n\nexport interface QrDetectorOptions {\n readonly timeout?: number;\n readonly signal?: AbortSignal;\n readonly facingMode?: \"user\" | \"environment\";\n}\n\ninterface Termination {\n readonly promise: Promise<DetectorError>;\n readonly cleanup: () => void;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst SCAN_INTERVAL_MS = 120;\n\nfunction getBarcodeDetectorConstructor(): BarcodeDetectorConstructorLike | undefined {\n return (globalThis as { readonly BarcodeDetector?: BarcodeDetectorConstructorLike })\n .BarcodeDetector;\n}\n\nfunction getMediaDevices(): MediaDevices | undefined {\n return typeof navigator === \"undefined\" ? undefined : navigator.mediaDevices;\n}\n\nexport function isQrSupported(): boolean {\n return (\n getBarcodeDetectorConstructor() !== undefined &&\n typeof getMediaDevices()?.getUserMedia === \"function\"\n );\n}\n\nfunction createTermination(timeout: number, signal: AbortSignal | undefined): Termination {\n let settle: ((error: DetectorError) => void) | undefined;\n const promise = new Promise<DetectorError>((resolve) => {\n settle = resolve;\n });\n const handleAbort = () =>\n settle?.(createDetectorError(\"qr\", \"ABORTED\", \"QR detection was aborted.\"));\n signal?.addEventListener(\"abort\", handleAbort, { once: true });\n const timer = setTimeout(\n () => settle?.(createDetectorError(\"qr\", \"TIMEOUT\", \"QR detection timed out.\")),\n timeout,\n );\n return {\n promise,\n cleanup: () => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", handleAbort);\n settle = undefined;\n },\n };\n}\n\nasync function raceWithTermination<T>(\n operation: Promise<T>,\n termination: Promise<DetectorError>,\n): Promise<Result<T, DetectorError>> {\n return Promise.race([\n operation.then(\n (value) => ({ ok: true as const, value }),\n (error: unknown) => ({ ok: false as const, error: mapBrowserError(\"qr\", error) }),\n ),\n termination.then((error) => ({ ok: false as const, error })),\n ]);\n}\n\nfunction stopStream(stream: MediaStream): void {\n for (const track of stream.getTracks()) track.stop();\n}\n\nfunction waitForNextScan(): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, SCAN_INTERVAL_MS));\n}\n\nexport async function readQrContext(\n videoElement: HTMLVideoElement,\n options: QrDetectorOptions = {},\n): Promise<DetectorResult<QrVerificationContext>> {\n const Detector = getBarcodeDetectorConstructor();\n const mediaDevices = getMediaDevices();\n if (Detector === undefined || typeof mediaDevices?.getUserMedia !== \"function\") {\n return {\n ok: false,\n error: createDetectorError(\n \"qr\",\n \"UNSUPPORTED\",\n \"Live QR detection is not supported in this environment.\",\n ),\n };\n }\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeout) || timeout < 0) {\n return {\n ok: false,\n error: createDetectorError(\n \"qr\",\n \"INVALID_DATA\",\n \"QR timeout must be a non-negative finite number.\",\n ),\n };\n }\n if (options.signal?.aborted === true) {\n return {\n ok: false,\n error: createDetectorError(\"qr\", \"ABORTED\", \"QR detection was aborted.\"),\n };\n }\n\n const termination = createTermination(timeout, options.signal);\n let stream: MediaStream | null = null;\n try {\n const mediaPromise = mediaDevices.getUserMedia({\n audio: false,\n video: { facingMode: { ideal: options.facingMode ?? \"environment\" } },\n });\n const mediaResult = await raceWithTermination(mediaPromise, termination.promise);\n if (!mediaResult.ok) {\n void mediaPromise.then(stopStream, () => undefined);\n return mediaResult;\n }\n stream = mediaResult.value;\n videoElement.srcObject = stream;\n videoElement.muted = true;\n videoElement.playsInline = true;\n\n const playResult = await raceWithTermination(videoElement.play(), termination.promise);\n if (!playResult.ok) return playResult;\n\n const detector = new Detector({ formats: [\"qr_code\"] });\n while (true) {\n const detection = await raceWithTermination(\n detector.detect(videoElement),\n termination.promise,\n );\n if (!detection.ok) return detection;\n const token = detection.value.find((barcode) => barcode.rawValue.length > 0)?.rawValue;\n if (token !== undefined) {\n return { ok: true, value: { type: \"qr\", token } };\n }\n\n const interval = await raceWithTermination(waitForNextScan(), termination.promise);\n if (!interval.ok) return interval;\n }\n } catch (error) {\n return { ok: false, error: mapBrowserError(\"qr\", error) };\n } finally {\n termination.cleanup();\n if (stream !== null) stopStream(stream);\n try {\n videoElement.srcObject = null;\n } catch {\n // A custom video element implementation may expose a read-only srcObject.\n }\n }\n}\n","import { verifyPasscode } from \"../detectors/index.js\";\nimport type {\n AdminRallyConfig,\n Result,\n Reward,\n RewardState,\n StampError,\n StampRallyState,\n StampRecord,\n VerificationContext,\n} from \"../domain/index.js\";\nimport { evaluateConditionDetailed } from \"./evaluate.js\";\nimport { createUniqueClaimTicketNumber } from \"./rewards.js\";\n\nexport type RewardConsumeError =\n | {\n readonly code: \"NOT_AVAILABLE\" | \"ALREADY_CONSUMED\" | \"OUT_OF_STOCK\" | \"REWARD_NOT_FOUND\";\n readonly rewardId: string;\n }\n | { readonly code: \"INVALID_PASSCODE\"; readonly rewardId: string; readonly message: string }\n | { readonly code: \"EXPIRED\"; readonly rewardId: string }\n | { readonly code: \"USER_LIMIT_REACHED\"; readonly rewardId: string };\nexport interface ConsumeRewardParams {\n readonly reward: Reward;\n readonly currentState: RewardState;\n readonly inputPasscode?: string;\n readonly staffId?: string;\n readonly now: string;\n readonly userRedemptionCount?: number;\n}\nexport type ConsumeResult = Result<RewardState, RewardConsumeError>;\nexport function reconcileRewardStates(\n rewards: ReadonlyArray<Reward>,\n currentStates: ReadonlyArray<RewardState>,\n acquiredStampCount: number,\n now: string,\n): ReadonlyArray<RewardState> {\n const states = new Map(currentStates.map((state) => [state.rewardId, state]));\n return rewards.map((reward) => {\n const current = states.get(reward.id);\n if (current?.status === \"CONSUMED\" || current?.status === \"EXPIRED\") return current;\n if (reward.validUntil !== undefined && Date.parse(reward.validUntil) <= Date.parse(now))\n return { rewardId: reward.id, status: \"EXPIRED\" };\n if (reward.stockLimit !== undefined && (current?.redeemedCount ?? 0) >= reward.stockLimit)\n return { rewardId: reward.id, status: \"EXPIRED\" };\n if (acquiredStampCount >= reward.requiredStampCount)\n return {\n rewardId: reward.id,\n status: \"AVAILABLE\",\n ...(current?.unlockedAt === undefined\n ? { unlockedAt: now }\n : { unlockedAt: current.unlockedAt }),\n };\n return { rewardId: reward.id, status: \"LOCKED\" };\n });\n}\nexport function consumeReward(params: ConsumeRewardParams): ConsumeResult {\n const { reward, currentState } = params;\n if (currentState.status === \"CONSUMED\")\n return { ok: false, error: { code: \"ALREADY_CONSUMED\", rewardId: reward.id } };\n if (currentState.status !== \"AVAILABLE\")\n return { ok: false, error: { code: \"NOT_AVAILABLE\", rewardId: reward.id } };\n if (reward.validUntil !== undefined && Date.parse(reward.validUntil) <= Date.parse(params.now))\n return { ok: false, error: { code: \"EXPIRED\", rewardId: reward.id } };\n if (reward.stockLimit !== undefined && (currentState.redeemedCount ?? 0) >= reward.stockLimit)\n return { ok: false, error: { code: \"OUT_OF_STOCK\", rewardId: reward.id } };\n if (\n reward.userClaimLimit !== undefined &&\n (params.userRedemptionCount ?? currentState.userRedemptionCount ?? 0) >= reward.userClaimLimit\n )\n return { ok: false, error: { code: \"USER_LIMIT_REACHED\", rewardId: reward.id } };\n if (reward.redemptionMethod === \"staff_passcode\") {\n if (\n reward.staffPasscode === undefined ||\n !verifyPasscode(params.inputPasscode ?? \"\", { code: reward.staffPasscode }).success\n )\n return {\n ok: false,\n error: {\n code: \"INVALID_PASSCODE\",\n rewardId: reward.id,\n message: \"The passcode is invalid.\",\n },\n };\n }\n if (reward.redemptionMethod === \"view_only\") return { ok: true, value: currentState };\n return {\n ok: true,\n value: {\n ...currentState,\n status: \"CONSUMED\",\n consumedAt: params.now,\n claimTicketNumber: createUniqueClaimTicketNumber(reward.id, params.now),\n redeemedCount: (currentState.redeemedCount ?? 0) + 1,\n ...(params.staffId === undefined ? {} : { consumedByStaffId: params.staffId }),\n },\n };\n}\n\nexport interface ProcessStampValue {\n readonly nextState: StampRallyState;\n readonly events: ReadonlyArray<{ readonly type: \"stampAcquired\"; readonly record: StampRecord }>;\n}\nexport function processStamp(\n state: StampRallyState,\n config: AdminRallyConfig,\n spotId: string,\n context: VerificationContext,\n now: string,\n): Result<ProcessStampValue, StampError> {\n const spot = config.spots.find((item) => item.id === spotId);\n if (spot === undefined) return { ok: false, error: { code: \"SPOT_NOT_FOUND\", spotId } };\n if (state.records.some((record) => record.stampId === spotId))\n return { ok: false, error: { code: \"STAMP_ALREADY_ACQUIRED\", spotId } };\n const acquired = new Set(state.records.map((record) => record.stampId));\n if (spot.prerequisites?.some((id) => !acquired.has(id)))\n return { ok: false, error: { code: \"PREREQUISITES_NOT_MET\", spotId } };\n for (const condition of spot.conditions) {\n if (condition.type === \"custom\" || !evaluateConditionDetailed(condition, context).ok)\n return {\n ok: false,\n error:\n condition.type === \"custom\"\n ? {\n code: \"CUSTOM_VALIDATION_FAILED\",\n spotId,\n message: \"Custom validation requires an async validator.\",\n }\n : { code: \"INVALID_PROOF\", spotId },\n };\n }\n const record: StampRecord = { stampId: spotId, acquiredAt: now };\n const records = [...state.records, record];\n const rewards = reconcileRewardStates(config.rewards, state.rewards, records.length, now);\n return {\n ok: true,\n value: {\n nextState: { ...state, records, rewards, updatedAt: now },\n events: [{ type: \"stampAcquired\", record }],\n },\n };\n}\n","import type { RewardState, StampRallyState, StampRecord } from \"../domain/index.js\";\n\nexport interface StampStorage {\n load(rallyId: string, userId: string | null): Promise<StampRallyState | null>;\n save(state: StampRallyState): Promise<void>;\n remove(rallyId: string, userId: string | null): Promise<void>;\n}\n\nexport interface StorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport type StorageOperation = \"open\" | \"load\" | \"save\" | \"remove\";\nexport type StorageAdapterErrorCode =\n | \"STORAGE_UNAVAILABLE\"\n | \"STORAGE_OPEN_FAILED\"\n | \"STORAGE_READ_FAILED\"\n | \"STORAGE_WRITE_FAILED\"\n | \"STORAGE_REMOVE_FAILED\"\n | \"STORAGE_INVALID_DATA\";\n\nexport class StorageAdapterError extends Error {\n readonly code: StorageAdapterErrorCode;\n readonly operation: StorageOperation;\n readonly rallyId: string | undefined;\n\n constructor(\n code: StorageAdapterErrorCode,\n operation: StorageOperation,\n message: string,\n options: { readonly cause?: unknown; readonly rallyId?: string } = {},\n ) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = \"StorageAdapterError\";\n this.code = code;\n this.operation = operation;\n this.rallyId = options.rallyId;\n }\n}\n\nfunction cloneRecord(record: StampRecord): StampRecord {\n return record.metadata === undefined\n ? { ...record }\n : { ...record, metadata: { ...record.metadata } };\n}\n\nfunction cloneRewardState(state: RewardState): RewardState {\n return { ...state };\n}\n\nexport function cloneState(state: StampRallyState): StampRallyState {\n return {\n ...state,\n records: state.records.map(cloneRecord),\n ...(state.rewards === undefined ? {} : { rewards: state.rewards.map(cloneRewardState) }),\n ...(state.inventory === undefined\n ? {}\n : {\n inventory: {\n ...state.inventory,\n ...(state.inventory.rewardRemaining === undefined\n ? {}\n : { rewardRemaining: { ...state.inventory.rewardRemaining } }),\n },\n }),\n };\n}\n\nfunction isRecord(value: unknown): value is StampRecord {\n if (typeof value !== \"object\" || value === null) return false;\n const record = value as Partial<StampRecord>;\n return (\n typeof record.stampId === \"string\" &&\n typeof record.acquiredAt === \"string\" &&\n (record.metadata === undefined ||\n (typeof record.metadata === \"object\" &&\n record.metadata !== null &&\n !Array.isArray(record.metadata)))\n );\n}\n\nconst rewardStatuses = new Set([\"LOCKED\", \"AVAILABLE\", \"CONSUMED\", \"EXPIRED\"]);\n\nfunction isOptionalDate(value: unknown): value is string | undefined {\n return value === undefined || (typeof value === \"string\" && !Number.isNaN(Date.parse(value)));\n}\n\nexport function isRewardState(value: unknown): value is RewardState {\n if (typeof value !== \"object\" || value === null) return false;\n const state = value as Partial<RewardState>;\n return (\n typeof state.rewardId === \"string\" &&\n typeof state.status === \"string\" &&\n rewardStatuses.has(state.status) &&\n isOptionalDate(state.unlockedAt) &&\n isOptionalDate(state.consumedAt) &&\n (state.consumedByStaffId === undefined || typeof state.consumedByStaffId === \"string\")\n );\n}\n\nexport function isStampRallyState(value: unknown): value is StampRallyState {\n if (typeof value !== \"object\" || value === null) return false;\n const state = value as Partial<StampRallyState>;\n return (\n typeof state.rallyId === \"string\" &&\n (typeof state.userId === \"string\" || state.userId === null) &&\n typeof state.updatedAt === \"string\" &&\n Array.isArray(state.records) &&\n state.records.every(isRecord) &&\n (state.rewards === undefined ||\n (Array.isArray(state.rewards) && state.rewards.every(isRewardState))) &&\n (state.inventory === undefined ||\n (typeof state.inventory === \"object\" &&\n state.inventory !== null &&\n !Array.isArray(state.inventory) &&\n (state.inventory.sharedRemaining === undefined ||\n (typeof state.inventory.sharedRemaining === \"number\" &&\n Number.isInteger(state.inventory.sharedRemaining) &&\n state.inventory.sharedRemaining >= 0)) &&\n (state.inventory.rewardRemaining === undefined ||\n (typeof state.inventory.rewardRemaining === \"object\" &&\n state.inventory.rewardRemaining !== null &&\n !Array.isArray(state.inventory.rewardRemaining)))))\n );\n}\n\nexport interface RallySnapshot {\n readonly version: 1;\n readonly rallyId: string;\n readonly userId: string | null;\n readonly records: ReadonlyArray<StampRecord>;\n readonly rewards: ReadonlyArray<RewardState>;\n readonly exportedAt: string;\n}\n\nfunction isValidDate(value: unknown): value is string {\n return typeof value === \"string\" && !Number.isNaN(Date.parse(value));\n}\n\nfunction isSnapshotRecord(value: unknown): value is StampRecord {\n return isRecord(value) && isValidDate(value.acquiredAt);\n}\n\nfunction isRallySnapshot(value: unknown): value is RallySnapshot {\n if (typeof value !== \"object\" || value === null) return false;\n const snapshot = value as Partial<RallySnapshot>;\n return (\n snapshot.version === 1 &&\n typeof snapshot.rallyId === \"string\" &&\n (typeof snapshot.userId === \"string\" || snapshot.userId === null) &&\n Array.isArray(snapshot.records) &&\n snapshot.records.every(isSnapshotRecord) &&\n Array.isArray(snapshot.rewards) &&\n snapshot.rewards.every(isRewardState) &&\n isValidDate(snapshot.exportedAt)\n );\n}\n\nexport function exportProgressToken(snapshot: RallySnapshot): string {\n return globalThis.btoa(encodeURIComponent(JSON.stringify(snapshot)));\n}\n\nexport function importProgressToken(token: string, currentRallyId: string): RallySnapshot | null {\n try {\n const parsed: unknown = JSON.parse(decodeURIComponent(globalThis.atob(token)));\n if (!isRallySnapshot(parsed) || parsed.rallyId !== currentRallyId) return null;\n return {\n ...parsed,\n records: parsed.records.map(cloneRecord),\n rewards: parsed.rewards.map(cloneRewardState),\n };\n } catch {\n return null;\n }\n}\n\nexport class InMemoryStorage implements StampStorage {\n readonly #states = new Map<string, StampRallyState>();\n\n async load(rallyId: string, userId: string | null): Promise<StampRallyState | null> {\n const state = this.#states.get(storageKey(rallyId, userId));\n return state === undefined ? null : cloneState(state);\n }\n\n async save(state: StampRallyState): Promise<void> {\n this.#states.set(storageKey(state.rallyId, state.userId), cloneState(state));\n }\n\n async remove(rallyId: string, userId: string | null): Promise<void> {\n this.#states.delete(storageKey(rallyId, userId));\n }\n}\n\nexport function storageKey(rallyId: string, userId: string | null): string {\n return `stamprally:${rallyId}:${userId ?? \"anonymous\"}`;\n}\n\nexport function createAnonymousSessionId(storage?: StorageLike | null): string {\n const key = \"stamprally:anonymous-session-id\";\n try {\n const browserStorage = typeof window === \"undefined\" ? null : window.localStorage;\n const value = storage?.getItem(key) ?? browserStorage?.getItem(key);\n if (value !== null && value !== undefined && isUuidV4(value)) return value;\n const generated = randomUuidV4();\n (storage ?? browserStorage)?.setItem(key, generated);\n return generated;\n } catch {\n return randomUuidV4();\n }\n}\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}\n\nfunction randomUuidV4(): string {\n const cryptoApi = globalThis.crypto;\n if (cryptoApi?.randomUUID !== undefined) return cryptoApi.randomUUID();\n if (cryptoApi?.getRandomValues !== undefined) {\n const bytes = cryptoApi.getRandomValues(new Uint8Array(16));\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40;\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80;\n const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n }\n const random = `${Date.now().toString(16)}${Math.random().toString(16).slice(2)}`\n .padEnd(32, \"0\")\n .slice(0, 32);\n return `${random.slice(0, 8)}-${random.slice(8, 12)}-4${random.slice(13, 16)}-8${random.slice(17, 20)}-${random.slice(20)}`;\n}\n\nexport interface LocalStorageAdapterOptions {\n readonly storage?: StorageLike | null;\n readonly keyPrefix?: string;\n readonly failureMode?: LocalStorageFailureMode;\n readonly onWarning?: StorageWarningHandler;\n}\n\nexport type LocalStorageFailureMode = \"fallback\" | \"throw\";\nexport type StorageWarningHandler = (error: StorageAdapterError) => void;\n\nconst defaultStorageWarningHandler: StorageWarningHandler = (error) => {\n console.warn(`[@stamprally/core] ${error.message}`, error);\n};\n\nexport class LocalStorageAdapter implements StampStorage {\n readonly #providedStorage: StorageLike | null | undefined;\n readonly #keyPrefix: string;\n readonly #failureMode: LocalStorageFailureMode;\n readonly #onWarning: StorageWarningHandler;\n readonly #fallbackStorage = new InMemoryStorage();\n #isFallbackActive = false;\n\n constructor(options: LocalStorageAdapterOptions = {}) {\n this.#providedStorage = options.storage;\n this.#keyPrefix = options.keyPrefix ?? \"stamprally:\";\n this.#failureMode = options.failureMode ?? \"fallback\";\n this.#onWarning = options.onWarning ?? defaultStorageWarningHandler;\n }\n\n async load(rallyId: string, userId: string | null): Promise<StampRallyState | null> {\n if (this.#isFallbackActive) return this.#fallbackStorage.load(rallyId, userId);\n\n try {\n const serialized = this.#getStorage(\"load\", rallyId).getItem(this.#key(rallyId, userId));\n if (serialized === null) return null;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(serialized);\n } catch (cause) {\n throw new StorageAdapterError(\n \"STORAGE_INVALID_DATA\",\n \"load\",\n `Stored rally '${rallyId}' is not valid JSON.`,\n { cause, rallyId },\n );\n }\n if (!isStampRallyState(parsed) || parsed.rallyId !== rallyId) {\n throw new StorageAdapterError(\n \"STORAGE_INVALID_DATA\",\n \"load\",\n `Stored rally '${rallyId}' has an invalid state shape.`,\n { rallyId },\n );\n }\n return cloneState(parsed);\n } catch (cause) {\n return this.#handleFailure(\n this.#normalizeError(\n cause,\n \"STORAGE_READ_FAILED\",\n \"load\",\n `Failed to read rally '${rallyId}' from localStorage.`,\n rallyId,\n ),\n () => this.#fallbackStorage.load(rallyId, userId),\n );\n }\n }\n\n async save(state: StampRallyState): Promise<void> {\n if (this.#isFallbackActive) return this.#fallbackStorage.save(state);\n\n try {\n this.#getStorage(\"save\", state.rallyId).setItem(\n this.#key(state.rallyId, state.userId),\n JSON.stringify(state),\n );\n } catch (cause) {\n return this.#handleFailure(\n this.#normalizeError(\n cause,\n \"STORAGE_WRITE_FAILED\",\n \"save\",\n `Failed to save rally '${state.rallyId}' to localStorage.`,\n state.rallyId,\n ),\n () => this.#fallbackStorage.save(state),\n );\n }\n }\n\n async remove(rallyId: string, userId: string | null): Promise<void> {\n if (this.#isFallbackActive) return this.#fallbackStorage.remove(rallyId, userId);\n\n try {\n this.#getStorage(\"remove\", rallyId).removeItem(this.#key(rallyId, userId));\n } catch (cause) {\n return this.#handleFailure(\n this.#normalizeError(\n cause,\n \"STORAGE_REMOVE_FAILED\",\n \"remove\",\n `Failed to remove rally '${rallyId}' from localStorage.`,\n rallyId,\n ),\n () => this.#fallbackStorage.remove(rallyId, userId),\n );\n }\n }\n\n #key(rallyId: string, userId: string | null): string {\n return `${this.#keyPrefix}${rallyId}:${userId ?? \"anonymous\"}`;\n }\n\n #getStorage(operation: StorageOperation, rallyId: string): StorageLike {\n if (this.#providedStorage === null) {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n operation,\n \"localStorage is unavailable in this environment.\",\n { rallyId },\n );\n }\n if (this.#providedStorage !== undefined) return this.#providedStorage;\n if (typeof window === \"undefined\") {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n operation,\n \"localStorage is unavailable in this environment.\",\n { rallyId },\n );\n }\n try {\n const storage = window.localStorage;\n if (storage !== undefined) return storage;\n } catch (cause) {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n operation,\n \"localStorage is unavailable in this environment.\",\n { cause, rallyId },\n );\n }\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n operation,\n \"localStorage is unavailable in this environment.\",\n { rallyId },\n );\n }\n\n #normalizeError(\n cause: unknown,\n code: StorageAdapterErrorCode,\n operation: StorageOperation,\n message: string,\n rallyId: string,\n ): StorageAdapterError {\n return cause instanceof StorageAdapterError\n ? cause\n : new StorageAdapterError(code, operation, message, { cause, rallyId });\n }\n\n #handleFailure<T>(error: StorageAdapterError, fallback: () => Promise<T>): Promise<T> {\n if (this.#failureMode === \"throw\") throw error;\n this.#isFallbackActive = true;\n try {\n this.#onWarning(error);\n } catch {\n // Warning handlers must not prevent the safe in-memory fallback.\n }\n return fallback();\n }\n}\n\nexport interface IndexedDBAdapterOptions {\n readonly indexedDB?: IDBFactory | null;\n readonly databaseName?: string;\n}\n\nconst INDEXED_DB_STORE_NAME = \"states\";\n\nexport class IndexedDBAdapter implements StampStorage {\n readonly #providedFactory: IDBFactory | null | undefined;\n readonly #databaseName: string;\n #databasePromise: Promise<IDBDatabase> | null = null;\n\n constructor(options: IndexedDBAdapterOptions = {}) {\n this.#providedFactory = options.indexedDB;\n this.#databaseName = options.databaseName ?? \"stamprally\";\n }\n\n async load(rallyId: string, userId: string | null): Promise<StampRallyState | null> {\n const database = await this.#openDatabase(rallyId);\n return new Promise((resolve, reject) => {\n try {\n const transaction = database.transaction(INDEXED_DB_STORE_NAME, \"readonly\");\n const request = transaction\n .objectStore(INDEXED_DB_STORE_NAME)\n .get(storageKey(rallyId, userId));\n request.onsuccess = () => {\n const value: unknown = request.result;\n if (value === undefined) {\n resolve(null);\n return;\n }\n if (!isStampRallyState(value) || value.rallyId !== rallyId) {\n reject(\n new StorageAdapterError(\n \"STORAGE_INVALID_DATA\",\n \"load\",\n `Stored rally '${rallyId}' has an invalid state shape.`,\n { rallyId },\n ),\n );\n return;\n }\n resolve(cloneState(value));\n };\n request.onerror = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_READ_FAILED\",\n \"load\",\n `Failed to read rally '${rallyId}' from IndexedDB.`,\n { cause: request.error, rallyId },\n ),\n );\n };\n } catch (cause) {\n reject(\n new StorageAdapterError(\n \"STORAGE_READ_FAILED\",\n \"load\",\n `Failed to read rally '${rallyId}' from IndexedDB.`,\n { cause, rallyId },\n ),\n );\n }\n });\n }\n\n async save(state: StampRallyState): Promise<void> {\n const database = await this.#openDatabase(state.rallyId);\n return new Promise((resolve, reject) => {\n try {\n const transaction = database.transaction(INDEXED_DB_STORE_NAME, \"readwrite\");\n transaction\n .objectStore(INDEXED_DB_STORE_NAME)\n .put(cloneState(state), storageKey(state.rallyId, state.userId));\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_WRITE_FAILED\",\n \"save\",\n `Failed to save rally '${state.rallyId}' to IndexedDB.`,\n { cause: transaction.error, rallyId: state.rallyId },\n ),\n );\n };\n transaction.onabort = transaction.onerror;\n } catch (cause) {\n reject(\n new StorageAdapterError(\n \"STORAGE_WRITE_FAILED\",\n \"save\",\n `Failed to save rally '${state.rallyId}' to IndexedDB.`,\n { cause, rallyId: state.rallyId },\n ),\n );\n }\n });\n }\n\n async remove(rallyId: string, userId: string | null): Promise<void> {\n const database = await this.#openDatabase(rallyId);\n return new Promise((resolve, reject) => {\n try {\n const transaction = database.transaction(INDEXED_DB_STORE_NAME, \"readwrite\");\n transaction.objectStore(INDEXED_DB_STORE_NAME).delete(storageKey(rallyId, userId));\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_REMOVE_FAILED\",\n \"remove\",\n `Failed to remove rally '${rallyId}' from IndexedDB.`,\n { cause: transaction.error, rallyId },\n ),\n );\n };\n transaction.onabort = transaction.onerror;\n } catch (cause) {\n reject(\n new StorageAdapterError(\n \"STORAGE_REMOVE_FAILED\",\n \"remove\",\n `Failed to remove rally '${rallyId}' from IndexedDB.`,\n { cause, rallyId },\n ),\n );\n }\n });\n }\n\n #getFactory(rallyId: string): IDBFactory {\n if (this.#providedFactory === null) {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n \"open\",\n \"IndexedDB is unavailable in this environment.\",\n { rallyId },\n );\n }\n if (this.#providedFactory !== undefined) return this.#providedFactory;\n try {\n const factory = (globalThis as { readonly indexedDB?: IDBFactory }).indexedDB;\n if (factory !== undefined) return factory;\n } catch (cause) {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n \"open\",\n \"IndexedDB is unavailable in this environment.\",\n { cause, rallyId },\n );\n }\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n \"open\",\n \"IndexedDB is unavailable in this environment.\",\n { rallyId },\n );\n }\n\n #openDatabase(rallyId: string): Promise<IDBDatabase> {\n if (this.#databasePromise !== null) return this.#databasePromise;\n const factory = this.#getFactory(rallyId);\n const opening = new Promise<IDBDatabase>((resolve, reject) => {\n let request: IDBOpenDBRequest;\n try {\n request = factory.open(this.#databaseName, 1);\n } catch (cause) {\n reject(\n new StorageAdapterError(\n \"STORAGE_OPEN_FAILED\",\n \"open\",\n `Failed to open IndexedDB database '${this.#databaseName}'.`,\n { cause, rallyId },\n ),\n );\n return;\n }\n request.onupgradeneeded = () => {\n const database = request.result;\n if (!database.objectStoreNames.contains(INDEXED_DB_STORE_NAME)) {\n database.createObjectStore(INDEXED_DB_STORE_NAME);\n }\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_OPEN_FAILED\",\n \"open\",\n `Failed to open IndexedDB database '${this.#databaseName}'.`,\n { cause: request.error, rallyId },\n ),\n );\n };\n request.onblocked = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_OPEN_FAILED\",\n \"open\",\n `Opening IndexedDB database '${this.#databaseName}' was blocked.`,\n { rallyId },\n ),\n );\n };\n });\n this.#databasePromise = opening.catch((error: unknown) => {\n this.#databasePromise = null;\n throw error;\n });\n return this.#databasePromise;\n }\n}\n","import type { AdminRallyConfig, PublicRallyConfig, UserRallyState } from \"../domain/index.js\";\nimport type {\n CheckInRequest,\n CheckInResult,\n ClaimRequest,\n ClaimResult,\n ClientError,\n} from \"./client.js\";\nimport { cloneState } from \"./storage.js\";\nimport type { SyncOperationResult, SyncProgressResponse } from \"./sync.js\";\n\nexport type QueueOperationStatus =\n | \"PENDING\"\n | \"IN_FLIGHT\"\n | \"ACCEPTED\"\n | \"REJECTED_PERMANENT\"\n | \"FAILED_RETRYABLE\";\nexport type OfflineStorageCapability =\n | \"indexeddb\"\n | \"localstorage\"\n | \"memory\"\n | \"custom\"\n | \"volatile_single_tab\";\nexport type MultiTabSyncCapability = \"supported_web_locks\" | \"disabled_unsafe_environment\";\nexport interface OfflineQueueCapability {\n readonly storage: OfflineStorageCapability;\n readonly multiTabSync: MultiTabSyncCapability;\n}\ntype OfflineQueueStorageCapability = Exclude<OfflineStorageCapability, \"volatile_single_tab\">;\n\nexport type OfflineOperation =\n | {\n readonly kind: \"checkIn\";\n readonly request: CheckInRequest;\n readonly optimisticState?: UserRallyState;\n readonly status?: QueueOperationStatus;\n readonly attempts?: number;\n }\n | {\n readonly kind: \"claimReward\";\n readonly request: ClaimRequest;\n readonly optimisticState?: UserRallyState;\n readonly status?: QueueOperationStatus;\n readonly attempts?: number;\n };\nexport type OfflineResult = CheckInResult | ClaimResult | UserRallyState;\nexport type SyncState = \"idle\" | \"syncing\" | \"error\";\nexport type SyncConflictPolicy = \"authoritative_replay\";\nexport interface OfflineConflictResult {\n readonly conflict: true;\n readonly localState: UserRallyState;\n readonly serverState: UserRallyState;\n}\n\nexport interface OfflineQueueStorage {\n load(key: string): Promise<ReadonlyArray<OfflineOperation>>;\n save(key: string, operations: ReadonlyArray<OfflineOperation>): Promise<void>;\n loadRejectedHistory?(key: string): Promise<ReadonlyArray<RejectedOperationHistoryEntry>>;\n saveRejectedHistory?(\n key: string,\n history: ReadonlyArray<RejectedOperationHistoryEntry>,\n ): Promise<void>;\n}\n\nexport interface OfflineQueueCapabilityWarning {\n readonly type: \"STORAGE_CAPABILITY_WARNING\";\n readonly storageCapability: \"volatile_single_tab\" | \"memory\";\n readonly multiTabSync: \"disabled_unsafe_environment\";\n readonly isStoragePersistent: boolean;\n readonly message: string;\n}\n\nexport interface OfflineQueueOptions {\n readonly storage?: OfflineQueueStorage;\n readonly storageLike?: {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem?(key: string): void;\n } | null;\n readonly key?: string;\n /** Rally scope used by the default durable key. */\n readonly rallyId?: string;\n /** User scope used by the default durable key. */\n readonly userId?: string | null;\n readonly databaseName?: string;\n /** Enables storage-event/BroadcastChannel synchronization when browser APIs exist. */\n readonly synchronizeInstances?: boolean;\n readonly retryOptions?: SyncRetryOptions;\n readonly retry?: SyncRetryOptions;\n /** Alias accepted for callers that configure retry behavior at sync time. */\n readonly syncRetryOptions?: SyncRetryOptions;\n}\n\nexport interface SyncRetryOptions {\n readonly maxRetries?: number;\n readonly initialIntervalMs?: number;\n readonly backoffMultiplier?: number;\n}\n\nexport type OfflineSender = (\n operation: OfflineOperation,\n) => Promise<OfflineResult | OfflineConflictResult | OfflineOperationResponse>;\nexport type OfflineOperationStatus = QueueOperationStatus | \"REJECTED\" | \"RETRYABLE_ERROR\";\nexport type OfflineOperationLifecycleStatus = QueueOperationStatus;\nexport interface OfflineOperationError {\n readonly code: string;\n readonly message: string;\n readonly [key: string]: unknown;\n}\nexport interface RejectedOperationHistoryEntry {\n readonly operation: OfflineOperation;\n readonly reason: OfflineOperationError;\n readonly errorCode: string;\n readonly rejectedAt: string;\n readonly attempts: number;\n}\nexport type RejectedOperation = RejectedOperationHistoryEntry;\nexport type OfflineOperationResponse =\n | {\n readonly status: \"ACCEPTED\";\n readonly result?: OfflineResult | OfflineConflictResult;\n readonly state?: UserRallyState;\n }\n | {\n readonly status: \"REJECTED_PERMANENT\";\n readonly error?: ClientError | OfflineOperationError;\n readonly reason?: ClientError | OfflineOperationError;\n readonly state?: UserRallyState;\n }\n | {\n readonly status: \"RETRYABLE_ERROR\";\n readonly error?: ClientError | OfflineOperationError;\n readonly reason?: ClientError | OfflineOperationError;\n };\nexport interface OfflineSyncResultEvent {\n readonly operation: OfflineOperation;\n readonly result?: OfflineResult | OfflineConflictResult;\n readonly status?: OfflineOperationStatus;\n readonly error?: ClientError | OfflineOperationError;\n readonly state?: UserRallyState;\n}\nexport type OfflineSyncResultListener = (event: OfflineSyncResultEvent) => void | Promise<void>;\nexport type OfflineQueueChangeListener = () => void;\n\n/** Removes only an operation's optimistic changes without mutating its inputs. */\nexport function rollbackOptimisticOperation(\n state: UserRallyState,\n operation: OfflineOperation,\n): UserRallyState {\n const previous = operation.request.state;\n if (operation.kind === \"checkIn\") {\n const records = state.records.filter(\n (record) =>\n record.stampId !== operation.request.spotId || record.acquiredAt !== operation.request.now,\n );\n const previousRewards = new Map(previous.rewards.map((reward) => [reward.rewardId, reward]));\n const rewards = state.rewards.map((reward) => previousRewards.get(reward.rewardId) ?? reward);\n return { ...cloneState(state), records, rewards, updatedAt: previous.updatedAt };\n }\n const previousReward = previous.rewards.find(\n (reward) => reward.rewardId === operation.request.rewardId,\n );\n const rewards = state.rewards\n .filter(\n (reward) => reward.rewardId !== operation.request.rewardId || previousReward !== undefined,\n )\n .map((reward) =>\n reward.rewardId === operation.request.rewardId && previousReward !== undefined\n ? { ...previousReward }\n : reward,\n );\n const cloned = cloneState(state);\n const { inventory: _inventory, ...stateWithoutInventory } = cloned;\n const previousInventory = previous.inventory;\n return previousInventory === undefined\n ? { ...stateWithoutInventory, rewards, updatedAt: previous.updatedAt }\n : {\n ...stateWithoutInventory,\n rewards,\n inventory: {\n ...previousInventory,\n ...(previousInventory.rewardRemaining === undefined\n ? {}\n : { rewardRemaining: { ...previousInventory.rewardRemaining } }),\n },\n updatedAt: previous.updatedAt,\n };\n}\n\nclass MemoryQueueStorage implements OfflineQueueStorage {\n readonly #values = new Map<string, ReadonlyArray<OfflineOperation>>();\n readonly #rejected = new Map<string, ReadonlyArray<RejectedOperationHistoryEntry>>();\n async load(key: string): Promise<ReadonlyArray<OfflineOperation>> {\n return this.#values.get(key) ?? [];\n }\n async save(key: string, operations: ReadonlyArray<OfflineOperation>): Promise<void> {\n this.#values.set(key, structuredClone(operations));\n }\n async loadRejectedHistory(key: string): Promise<ReadonlyArray<RejectedOperationHistoryEntry>> {\n return this.#rejected.get(key) ?? [];\n }\n async saveRejectedHistory(\n key: string,\n history: ReadonlyArray<RejectedOperationHistoryEntry>,\n ): Promise<void> {\n this.#rejected.set(key, structuredClone(history));\n }\n}\n\nclass LocalStorageQueueStorage implements OfflineQueueStorage {\n constructor(readonly storage: NonNullable<OfflineQueueOptions[\"storageLike\"]>) {}\n async load(key: string): Promise<ReadonlyArray<OfflineOperation>> {\n const value = this.storage.getItem(key);\n if (value === null) return [];\n try {\n const parsed: unknown = JSON.parse(value);\n return Array.isArray(parsed) ? (parsed as ReadonlyArray<OfflineOperation>) : [];\n } catch {\n return [];\n }\n }\n async save(key: string, operations: ReadonlyArray<OfflineOperation>): Promise<void> {\n this.storage.setItem(key, JSON.stringify(operations));\n }\n async loadRejectedHistory(key: string): Promise<ReadonlyArray<RejectedOperationHistoryEntry>> {\n const value = this.storage.getItem(`${key}:rejected-history`);\n if (value === null) return [];\n try {\n const parsed: unknown = JSON.parse(value);\n return Array.isArray(parsed) ? (parsed as ReadonlyArray<RejectedOperationHistoryEntry>) : [];\n } catch {\n return [];\n }\n }\n async saveRejectedHistory(\n key: string,\n history: ReadonlyArray<RejectedOperationHistoryEntry>,\n ): Promise<void> {\n this.storage.setItem(`${key}:rejected-history`, JSON.stringify(history));\n }\n}\n\nexport interface IndexedDBOfflineQueueOptions {\n readonly indexedDB?: IDBFactory | null;\n readonly databaseName?: string;\n}\n\nexport class IndexedDBOfflineQueueStorage implements OfflineQueueStorage {\n readonly #providedFactory: IDBFactory | null | undefined;\n readonly #databaseName: string;\n #databasePromise: Promise<IDBDatabase> | null = null;\n\n constructor(options: IndexedDBOfflineQueueOptions = {}) {\n this.#providedFactory = options.indexedDB;\n this.#databaseName = options.databaseName ?? \"stamprally-offline-queue\";\n }\n async load(key: string): Promise<ReadonlyArray<OfflineOperation>> {\n const database = await this.#open();\n return new Promise((resolve, reject) => {\n const request = database\n .transaction(\"operations\", \"readonly\")\n .objectStore(\"operations\")\n .get(key);\n request.onsuccess = () => resolve(Array.isArray(request.result) ? request.result : []);\n request.onerror = () => reject(request.error ?? new Error(\"Failed to read offline queue.\"));\n });\n }\n async save(key: string, operations: ReadonlyArray<OfflineOperation>): Promise<void> {\n const database = await this.#open();\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(\"operations\", \"readwrite\");\n transaction.objectStore(\"operations\").put(structuredClone(operations), key);\n transaction.oncomplete = () => resolve();\n transaction.onerror = () =>\n reject(transaction.error ?? new Error(\"Failed to save offline queue.\"));\n transaction.onabort = () =>\n reject(transaction.error ?? new Error(\"Offline queue write aborted.\"));\n });\n }\n async loadRejectedHistory(key: string): Promise<ReadonlyArray<RejectedOperationHistoryEntry>> {\n const database = await this.#open();\n return new Promise((resolve, reject) => {\n const request = database\n .transaction(\"operations\", \"readonly\")\n .objectStore(\"operations\")\n .get(`${key}:rejected-history`);\n request.onsuccess = () =>\n resolve(\n Array.isArray(request.result)\n ? (request.result as ReadonlyArray<RejectedOperationHistoryEntry>)\n : [],\n );\n request.onerror = () =>\n reject(request.error ?? new Error(\"Failed to read rejected operation history.\"));\n });\n }\n async saveRejectedHistory(\n key: string,\n history: ReadonlyArray<RejectedOperationHistoryEntry>,\n ): Promise<void> {\n const database = await this.#open();\n return new Promise((resolve, reject) => {\n const transaction = database.transaction(\"operations\", \"readwrite\");\n transaction\n .objectStore(\"operations\")\n .put(structuredClone(history), `${key}:rejected-history`);\n transaction.oncomplete = () => resolve();\n transaction.onerror = () =>\n reject(transaction.error ?? new Error(\"Failed to save rejected operation history.\"));\n transaction.onabort = () =>\n reject(transaction.error ?? new Error(\"Rejected operation history write aborted.\"));\n });\n }\n #open(): Promise<IDBDatabase> {\n if (this.#databasePromise !== null) return this.#databasePromise;\n let factory = this.#providedFactory;\n if (factory === undefined)\n factory = (globalThis as { readonly indexedDB?: IDBFactory }).indexedDB;\n if (factory === undefined || factory === null)\n return Promise.reject(new Error(\"IndexedDB is unavailable in this environment.\"));\n this.#databasePromise = new Promise<IDBDatabase>((resolve, reject) => {\n const request = factory.open(this.#databaseName, 1);\n request.onupgradeneeded = () => {\n if (!request.result.objectStoreNames.contains(\"operations\"))\n request.result.createObjectStore(\"operations\");\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error(\"Failed to open offline queue.\"));\n }).catch((error: unknown) => {\n this.#databasePromise = null;\n throw error;\n });\n return this.#databasePromise;\n }\n}\n\nfunction availableLocalStorage(): NonNullable<OfflineQueueOptions[\"storageLike\"]> | null {\n try {\n const storage = (\n globalThis as {\n readonly localStorage?: OfflineQueueOptions[\"storageLike\"];\n }\n ).localStorage;\n return storage ?? null;\n } catch {\n return null;\n }\n}\n\nfunction defaultStorage(databaseName?: string): {\n readonly storage: OfflineQueueStorage;\n readonly capability: OfflineQueueStorageCapability;\n} {\n try {\n const indexedDB = (globalThis as { readonly indexedDB?: IDBFactory }).indexedDB;\n if (indexedDB !== undefined)\n return {\n storage: new IndexedDBOfflineQueueStorage({\n indexedDB,\n ...(databaseName === undefined ? {} : { databaseName }),\n }),\n capability: \"indexeddb\",\n };\n const storage = availableLocalStorage();\n if (storage !== undefined && storage !== null)\n return { storage: new LocalStorageQueueStorage(storage), capability: \"localstorage\" };\n } catch {\n // Access to localStorage can be denied by privacy mode or a sandbox.\n }\n return { storage: new MemoryQueueStorage(), capability: \"memory\" };\n}\n\nexport function offlineOperationId(operation: OfflineOperation): string {\n const identity = operation.request.userId ?? operation.request.anonymousSessionId ?? \"anonymous\";\n return operation.kind === \"checkIn\"\n ? `checkIn:${operation.request.rallyId}:${identity}:${operation.request.idempotencyKey}`\n : `claimReward:${operation.request.rallyId}:${identity}:${operation.request.idempotencyKey}`;\n}\n\nfunction requestScope(operation: OfflineOperation): { rallyId: string; userId: string | null } {\n return {\n rallyId: operation.request.rallyId,\n userId: operation.request.userId,\n };\n}\n\nfunction errorValue(value: unknown, fallbackCode: string): OfflineOperationError {\n if (typeof value === \"object\" && value !== null) {\n const candidate = value as Record<string, unknown>;\n if (typeof candidate.code === \"string\" && typeof candidate.message === \"string\")\n return { ...candidate, code: candidate.code, message: candidate.message };\n }\n if (value instanceof Error) return { code: fallbackCode, message: value.message };\n if (typeof value === \"string\") return { code: fallbackCode, message: value };\n return { code: fallbackCode, message: \"Offline operation was rejected.\" };\n}\n\nconst DEFAULT_RETRY_OPTIONS: Required<SyncRetryOptions> = {\n maxRetries: 0,\n initialIntervalMs: 250,\n backoffMultiplier: 2,\n};\n\nfunction randomId(): string {\n return (\n globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2)}`\n );\n}\n\n/** Durable, sequential retry queue for operations created while disconnected. */\nexport class OfflineQueue {\n #storage: OfflineQueueStorage;\n #queueCapability: OfflineQueueStorageCapability;\n readonly #configuredKey: string | undefined;\n #rallyId: string | undefined;\n #userId: string | null;\n #operations: OfflineOperation[] = [];\n #rejectedHistory: RejectedOperationHistoryEntry[] = [];\n #loaded = false;\n #state: SyncState = \"idle\";\n #error: Error | null = null;\n #sender: OfflineSender | undefined;\n #syncPromise: Promise<void> | null = null;\n #syncResultListener: OfflineSyncResultListener | undefined;\n #changeListener: OfflineQueueChangeListener | undefined;\n readonly #synchronizeInstances: boolean;\n readonly #retryOptions: Required<SyncRetryOptions>;\n readonly #instanceId = randomId();\n readonly #warnedCapabilityMessages = new Set<string>();\n #capabilityWarningListener: ((event: OfflineQueueCapabilityWarning) => void) | undefined;\n #replayConfig: AdminRallyConfig | PublicRallyConfig | undefined;\n #storageListener: ((event: StorageEvent) => void) | undefined;\n #channel: BroadcastChannel | null = null;\n\n constructor(options: OfflineQueueOptions = {}) {\n if (options.storage !== undefined) {\n this.#storage = options.storage;\n this.#queueCapability = \"custom\";\n } else if (options.storageLike !== undefined && options.storageLike !== null) {\n this.#storage = new LocalStorageQueueStorage(options.storageLike);\n this.#queueCapability = \"localstorage\";\n } else {\n const selected = defaultStorage(options.databaseName);\n this.#storage = selected.storage;\n this.#queueCapability = selected.capability;\n }\n this.#configuredKey = options.key;\n this.#rallyId = options.rallyId;\n this.#userId = options.userId ?? null;\n this.#synchronizeInstances = options.synchronizeInstances ?? true;\n const retryOptions = {\n ...DEFAULT_RETRY_OPTIONS,\n ...(options.retryOptions ?? options.syncRetryOptions ?? options.retry ?? {}),\n };\n this.#retryOptions = {\n maxRetries: Math.max(0, Math.floor(retryOptions.maxRetries)),\n initialIntervalMs: Math.max(0, retryOptions.initialIntervalMs),\n backoffMultiplier: Math.max(1, retryOptions.backoffMultiplier),\n };\n if (this.#synchronizeInstances && this.#hasWebLocks()) this.#subscribeToExternalChanges();\n }\n\n get syncState(): SyncState {\n return this.#state;\n }\n get pendingCount(): number {\n return this.#operations.length;\n }\n get queueCapability(): OfflineQueueCapability {\n return {\n storage: this.#queueCapability,\n multiTabSync: this.#hasWebLocks() ? \"supported_web_locks\" : \"disabled_unsafe_environment\",\n };\n }\n get storageCapability(): OfflineStorageCapability {\n if (this.#queueCapability === \"memory\") return \"memory\";\n return this.#hasWebLocks() ? this.#queueCapability : \"volatile_single_tab\";\n }\n get isStoragePersistent(): boolean {\n return this.#queueCapability !== \"memory\";\n }\n get rejectedHistory(): ReadonlyArray<RejectedOperationHistoryEntry> {\n return this.#rejectedHistory;\n }\n get error(): Error | null {\n return this.#error;\n }\n get operations(): ReadonlyArray<OfflineOperation> {\n return this.#operations;\n }\n\n get storageKey(): string {\n return this.#storageKey();\n }\n\n get rallyId(): string | undefined {\n return this.#rallyId;\n }\n\n get userId(): string | null {\n return this.#userId;\n }\n\n setSyncResultListener(listener: OfflineSyncResultListener | undefined): void {\n this.#syncResultListener = listener;\n }\n\n setChangeListener(listener: OfflineQueueChangeListener | undefined): void {\n this.#changeListener = listener;\n }\n\n setCapabilityWarningListener(\n listener: ((event: OfflineQueueCapabilityWarning) => void) | undefined,\n ): void {\n this.#capabilityWarningListener = listener;\n }\n\n setReplayConfig(config: AdminRallyConfig | PublicRallyConfig): void {\n this.#replayConfig = config;\n }\n\n async initialize(): Promise<void> {\n if (this.#loaded) return;\n try {\n const key = this.#storageKey();\n this.#operations = (await this.#storage.load(key)).map(normalizeOperation);\n this.#rejectedHistory =\n (await this.#storage.loadRejectedHistory?.(key))?.map(normalizeRejectedHistory) ?? [];\n } catch (error) {\n if (this.#queueCapability === \"memory\") throw error;\n this.#storage = new MemoryQueueStorage();\n this.#queueCapability = \"memory\";\n this.#operations = [];\n this.#rejectedHistory = [];\n this.#warnCapability(\n `Offline queue persistence is unavailable; queued data can be lost after reload (${String(error)}).`,\n );\n }\n if (this.#queueCapability === \"memory\")\n this.#warnCapability(\"Offline queue persistence is unavailable; queued data is memory-only.\");\n if (this.queueCapability.multiTabSync === \"disabled_unsafe_environment\")\n this.#warnCapability(\n \"Web Locks is unavailable; automatic cross-tab synchronization is disabled. Sync must be triggered by the foreground tab.\",\n );\n this.#loaded = true;\n }\n\n /** Releases browser listeners when the queue is no longer used. */\n dispose(): void {\n const windowLike = (globalThis as { readonly window?: Window }).window;\n if (windowLike !== undefined && this.#storageListener !== undefined)\n windowLike.removeEventListener(\"storage\", this.#storageListener);\n this.#storageListener = undefined;\n this.#channel?.close();\n this.#channel = null;\n }\n\n /** Selects a rally/user queue scope and loads its pending operations. */\n async setScope(rallyId: string, userId: string | null): Promise<void> {\n if (this.#configuredKey !== undefined) {\n this.#rallyId = rallyId;\n this.#userId = userId;\n return this.initialize();\n }\n if (this.#rallyId === rallyId && this.#userId === userId && this.#loaded) return;\n this.#rallyId = rallyId;\n this.#userId = userId;\n this.#operations = [];\n this.#loaded = false;\n await this.initialize();\n }\n\n async switchUser(newUserId: string | null): Promise<void> {\n if (this.#rallyId === undefined)\n throw new Error(\"OfflineQueue.switchUser requires a rally scope.\");\n await this.setScope(this.#rallyId, newUserId);\n }\n\n setSender(sender: OfflineSender): void {\n this.#sender = sender;\n }\n\n async enqueue(operation: OfflineOperation): Promise<void> {\n if (this.#configuredKey === undefined) {\n const scope = requestScope(operation);\n if (this.#rallyId === undefined) await this.setScope(scope.rallyId, scope.userId);\n if (this.#rallyId !== scope.rallyId || this.#userId !== scope.userId)\n throw new Error(\"Offline operation belongs to another rally or user queue.\");\n }\n await this.initialize();\n const id = offlineOperationId(operation);\n if (this.#operations.some((item) => offlineOperationId(item) === id)) return;\n this.#operations = [...this.#operations, { ...operation, status: \"PENDING\", attempts: 0 }];\n await this.#storage.save(this.#storageKey(), this.#operations);\n this.#announceChange();\n }\n\n async enqueueCheckIn(request: CheckInRequest, optimisticState?: UserRallyState): Promise<void> {\n return this.enqueue({\n kind: \"checkIn\",\n request,\n ...(optimisticState === undefined ? {} : { optimisticState }),\n });\n }\n\n async enqueueClaimReward(request: ClaimRequest, optimisticState?: UserRallyState): Promise<void> {\n return this.enqueue({\n kind: \"claimReward\",\n request,\n ...(optimisticState === undefined ? {} : { optimisticState }),\n });\n }\n\n async clear(): Promise<void> {\n await this.initialize();\n this.#operations = [];\n await this.#storage.save(this.#storageKey(), this.#operations);\n this.#announceChange();\n }\n\n async discardRejected(operationId: string): Promise<boolean> {\n await this.initialize();\n const next = this.#rejectedHistory.filter(\n (entry) => offlineOperationId(entry.operation) !== operationId,\n );\n if (next.length === this.#rejectedHistory.length) return false;\n this.#rejectedHistory = next;\n await this.#saveRejectedHistory();\n this.#announceChange();\n return true;\n }\n\n async retryRejected(operationId: string): Promise<boolean> {\n await this.initialize();\n const entry = this.#rejectedHistory.find(\n (candidate) => offlineOperationId(candidate.operation) === operationId,\n );\n if (entry === undefined) return false;\n if (!this.#operations.some((operation) => offlineOperationId(operation) === operationId))\n this.#operations = [\n ...this.#operations,\n { ...entry.operation, status: \"PENDING\", attempts: 0 },\n ];\n this.#rejectedHistory = this.#rejectedHistory.filter((candidate) => candidate !== entry);\n await this.#storage.save(this.#storageKey(), this.#operations);\n await this.#saveRejectedHistory();\n this.#announceChange();\n return true;\n }\n\n async discardRejectedOperation(operationId: string): Promise<boolean> {\n return this.discardRejected(operationId);\n }\n\n async retryRejectedOperation(operationId: string): Promise<boolean> {\n return this.retryRejected(operationId);\n }\n\n async clearRejectedHistory(): Promise<void> {\n await this.initialize();\n if (this.#rejectedHistory.length === 0) return;\n this.#rejectedHistory = [];\n await this.#saveRejectedHistory();\n this.#announceChange();\n }\n\n async sync(sender = this.#sender): Promise<void> {\n await this.initialize();\n if (sender === undefined) throw new Error(\"OfflineQueue.sync requires a sender.\");\n if (this.#syncPromise !== null) return this.#syncPromise;\n this.#sender = sender;\n this.#syncPromise = this.#run(sender).finally(() => {\n this.#syncPromise = null;\n });\n return this.#syncPromise;\n }\n\n async retrySync(sender = this.#sender): Promise<void> {\n return this.sync(sender);\n }\n\n /** Applies a server-side batch response while preserving retryable operations. */\n async applySyncProgress(response: SyncProgressResponse): Promise<void> {\n await this.initialize();\n for (const result of response.results)\n await this.#applySyncOperationResult(result, response.currentState);\n }\n\n async #run(sender: OfflineSender): Promise<void> {\n const locks = (\n globalThis as {\n readonly navigator?: {\n readonly locks?: {\n request<T>(\n name: string,\n options: { ifAvailable: boolean },\n callback: (lock: unknown) => Promise<T>,\n ): Promise<T>;\n };\n };\n }\n ).navigator?.locks;\n if (locks !== undefined && typeof locks.request === \"function\") {\n let callbackStarted = false;\n try {\n const acquired = await locks.request(\n `stamprally:${this.#storageKey()}:sync`,\n { ifAvailable: true },\n async (lock) => {\n if (lock === null) {\n await this.#reloadFromStorage();\n this.#state = \"idle\";\n this.#changeListener?.();\n return false;\n }\n callbackStarted = true;\n await this.#runSingleTab(sender);\n return true;\n },\n );\n if (!acquired) return;\n return;\n } catch (error) {\n // Older browsers and test doubles can expose a partial Locks API.\n if (callbackStarted) throw error;\n }\n }\n await this.#runSingleTab(sender);\n }\n\n async #runSingleTab(sender: OfflineSender): Promise<void> {\n this.#state = \"syncing\";\n this.#error = null;\n this.#changeListener?.();\n try {\n while (this.#operations.length > 0) {\n const operation = this.#operations[0];\n if (operation === undefined) break;\n if (await this.#rejectFailedPrerequisite(operation)) continue;\n let attempt = 0;\n let response: {\n readonly status: OfflineOperationStatus;\n readonly result?: OfflineResult | OfflineConflictResult;\n readonly state?: UserRallyState;\n readonly error?: ClientError | OfflineOperationError;\n readonly reason?: ClientError | OfflineOperationError;\n };\n while (true) {\n await this.#updateOperationStatus(\"IN_FLIGHT\", attempt);\n try {\n response = this.#normalizeResponse(await sender(operation));\n } catch (cause) {\n response = {\n status: \"RETRYABLE_ERROR\",\n error: errorValue(cause, \"RETRYABLE_ERROR\"),\n };\n }\n if (response.status !== \"RETRYABLE_ERROR\") break;\n const error = errorValue(response.error ?? response.reason, \"RETRYABLE_ERROR\");\n await this.#updateOperationStatus(\"PENDING\", attempt + 1);\n await this.#syncResultListener?.({ operation, status: response.status, error });\n if (attempt >= this.#retryOptions.maxRetries) {\n await this.#updateOperationStatus(\"FAILED_RETRYABLE\", attempt + 1);\n throw new Error(error.message);\n }\n const interval =\n this.#retryOptions.initialIntervalMs * this.#retryOptions.backoffMultiplier ** attempt;\n await new Promise<void>((resolve) => setTimeout(resolve, Math.max(0, interval)));\n attempt += 1;\n }\n const result = response.result;\n const state =\n response.state ??\n (result !== undefined && \"conflict\" in result && result.conflict === true\n ? result.serverState\n : result !== undefined && \"ok\" in result && result.ok\n ? result.value.state\n : undefined);\n const error =\n response.status === \"REJECTED_PERMANENT\"\n ? errorValue(\n response.error ??\n response.reason ??\n (result !== undefined && \"ok\" in result && !result.ok ? result.error : undefined),\n \"REJECTED_PERMANENT\",\n )\n : undefined;\n await this.#updateOperationStatus(\n response.status === \"ACCEPTED\" ? \"ACCEPTED\" : \"REJECTED_PERMANENT\",\n attempt + 1,\n );\n const eventState = state;\n if (response.status === \"REJECTED_PERMANENT\" && error !== undefined) {\n this.#rejectedHistory = [\n ...this.#rejectedHistory,\n {\n operation: { ...operation, status: \"REJECTED_PERMANENT\", attempts: attempt + 1 },\n reason: error,\n errorCode: error.code,\n rejectedAt: new Date().toISOString(),\n attempts: attempt + 1,\n },\n ];\n await this.#saveRejectedHistory();\n }\n this.#operations = this.#operations.slice(1);\n await this.#storage.save(this.#storageKey(), this.#operations);\n this.#announceChange();\n await this.#syncResultListener?.({\n operation,\n ...(result === undefined ? {} : { result }),\n status: response.status,\n ...(error === undefined ? {} : { error }),\n ...(eventState === undefined ? {} : { state: eventState }),\n });\n }\n this.#state = \"idle\";\n this.#changeListener?.();\n } catch (cause) {\n this.#state = \"error\";\n this.#error = cause instanceof Error ? cause : new Error(String(cause));\n this.#changeListener?.();\n throw this.#error;\n }\n }\n\n async #updateOperationStatus(status: QueueOperationStatus, attempts: number): Promise<void> {\n const operation = this.#operations[0];\n if (operation === undefined) return;\n this.#operations = [{ ...operation, status, attempts }, ...this.#operations.slice(1)];\n await this.#storage.save(this.#storageKey(), this.#operations);\n this.#announceChange();\n }\n\n async #applySyncOperationResult(\n result: SyncOperationResult,\n currentState: UserRallyState,\n ): Promise<void> {\n const operationIndex = this.#operations.findIndex(\n (operation) => offlineOperationId(operation) === result.operationId,\n );\n const operation = operationIndex < 0 ? undefined : this.#operations[operationIndex];\n if (operation === undefined) return;\n if (result.status === \"FAILED_RETRYABLE\") {\n const attempts = (operation.attempts ?? 0) + 1;\n this.#operations = [\n ...this.#operations.slice(0, operationIndex),\n { ...operation, status: \"FAILED_RETRYABLE\", attempts },\n ...this.#operations.slice(operationIndex + 1),\n ];\n await this.#storage.save(this.#storageKey(), this.#operations);\n this.#announceChange();\n await this.#syncResultListener?.({\n operation,\n status: \"RETRYABLE_ERROR\",\n error: { code: \"FAILED_RETRYABLE\", message: result.error },\n });\n return;\n }\n\n this.#operations = [\n ...this.#operations.slice(0, operationIndex),\n ...this.#operations.slice(operationIndex + 1),\n ];\n if (result.status === \"REJECTED_PERMANENT\") {\n const attempts = (operation.attempts ?? 0) + 1;\n const error: OfflineOperationError = {\n code: result.errorCode,\n message: result.reason,\n };\n this.#rejectedHistory = [\n ...this.#rejectedHistory,\n {\n operation: { ...operation, status: \"REJECTED_PERMANENT\", attempts },\n reason: error,\n errorCode: result.errorCode,\n rejectedAt: new Date().toISOString(),\n attempts,\n },\n ];\n await this.#saveRejectedHistory();\n }\n await this.#storage.save(this.#storageKey(), this.#operations);\n this.#announceChange();\n await this.#syncResultListener?.({\n operation,\n status: result.status,\n state: currentState,\n ...(result.status === \"REJECTED_PERMANENT\"\n ? { error: { code: result.errorCode, message: result.reason } }\n : {}),\n });\n }\n\n async #rejectFailedPrerequisite(operation: OfflineOperation): Promise<boolean> {\n if (operation.kind !== \"checkIn\" || this.#replayConfig === undefined) return false;\n const spot = this.#replayConfig.spots.find(\n (candidate) => candidate.id === operation.request.spotId,\n );\n if (spot === undefined) return false;\n const failedSpots = new Set(\n [\n ...this.#rejectedHistory.map((entry) => entry.operation),\n ...this.#operations.filter((candidate) => candidate.status === \"REJECTED_PERMANENT\"),\n ]\n .filter((candidate) => candidate.kind === \"checkIn\")\n .map((candidate) => (candidate.kind === \"checkIn\" ? candidate.request.spotId : undefined))\n .filter((spotId): spotId is string => spotId !== undefined),\n );\n if (!spot.prerequisites?.some((prerequisite) => failedSpots.has(prerequisite))) return false;\n const error: OfflineOperationError = {\n code: \"REJECTED_PREREQUISITE_FAILED\",\n message: \"A prerequisite operation was rejected by the server.\",\n };\n const rejectedOperation = { ...operation, status: \"REJECTED_PERMANENT\" as const };\n this.#rejectedHistory = [\n ...this.#rejectedHistory,\n {\n operation: rejectedOperation,\n reason: error,\n errorCode: error.code,\n rejectedAt: new Date().toISOString(),\n attempts: operation.attempts ?? 0,\n },\n ];\n this.#operations = this.#operations.slice(1);\n await this.#storage.save(this.#storageKey(), this.#operations);\n await this.#saveRejectedHistory();\n this.#announceChange();\n await this.#syncResultListener?.({\n operation,\n status: \"REJECTED_PERMANENT\",\n error,\n });\n return true;\n }\n\n #subscribeToExternalChanges(): void {\n const windowLike = (globalThis as { readonly window?: Window }).window;\n if (windowLike !== undefined) {\n this.#storageListener = (event) => {\n if (\n event.key === this.#storageKey() ||\n event.key === `${this.#storageKey()}:rejected-history`\n )\n void this.#reloadFromStorage();\n };\n windowLike.addEventListener(\"storage\", this.#storageListener);\n }\n const Channel = (globalThis as { readonly BroadcastChannel?: typeof BroadcastChannel })\n .BroadcastChannel;\n if (Channel !== undefined) {\n try {\n this.#channel = new Channel(\"stamprally:queue-sync\");\n this.#channel.addEventListener(\"message\", (event: MessageEvent<unknown>) => {\n if (\n typeof event.data === \"object\" &&\n event.data !== null &&\n \"key\" in event.data &&\n (event.data as { readonly key?: unknown }).key === this.#storageKey()\n )\n void this.#reloadFromStorage();\n });\n } catch {\n this.#channel = null;\n }\n }\n }\n\n #announceChange(): void {\n this.#changeListener?.();\n this.#channel?.postMessage({\n type: \"change\",\n key: this.#storageKey(),\n owner: this.#instanceId,\n });\n }\n\n async #reloadFromStorage(): Promise<void> {\n if (this.#state === \"syncing\") return;\n try {\n const key = this.#storageKey();\n this.#operations = (await this.#storage.load(key)).map(normalizeOperation);\n this.#rejectedHistory =\n (await this.#storage.loadRejectedHistory?.(key))?.map(normalizeRejectedHistory) ??\n this.#rejectedHistory;\n this.#loaded = true;\n } catch {\n // A transient storage failure must not destroy the in-memory queue.\n }\n }\n\n #storageKey(): string {\n if (this.#configuredKey !== undefined) return this.#configuredKey;\n return `stamprally:queue:${this.#rallyId ?? \"unscoped\"}:${this.#userId ?? \"anonymous\"}`;\n }\n\n #normalizeResponse(value: OfflineResult | OfflineConflictResult | OfflineOperationResponse): {\n readonly status: OfflineOperationStatus;\n readonly result?: OfflineResult | OfflineConflictResult;\n readonly state?: UserRallyState;\n readonly error?: ClientError | OfflineOperationError;\n readonly reason?: ClientError | OfflineOperationError;\n } {\n if (\"ok\" in value) {\n if (value.ok === false) {\n if (\"status\" in value && value.status === \"RETRYABLE_ERROR\")\n return { status: \"RETRYABLE_ERROR\", error: errorValue(value.error, \"RETRYABLE_ERROR\") };\n return { status: \"REJECTED_PERMANENT\", result: value };\n }\n return { status: \"ACCEPTED\", result: value };\n }\n if (\"status\" in value) {\n if (value.status === \"ACCEPTED\") return value;\n return value;\n }\n return { status: \"ACCEPTED\", result: value };\n }\n\n async #saveRejectedHistory(): Promise<void> {\n await this.#storage.saveRejectedHistory?.(this.#storageKey(), this.#rejectedHistory);\n }\n\n #warnCapability(message: string): void {\n if (this.#warnedCapabilityMessages.has(message)) return;\n this.#warnedCapabilityMessages.add(message);\n console.warn(`[@stamprally/core] ${message}`);\n this.#capabilityWarningListener?.({\n type: \"STORAGE_CAPABILITY_WARNING\",\n storageCapability: this.storageCapability === \"memory\" ? \"memory\" : \"volatile_single_tab\",\n multiTabSync: \"disabled_unsafe_environment\",\n isStoragePersistent: this.isStoragePersistent,\n message,\n });\n }\n\n #hasWebLocks(): boolean {\n const locks = (\n globalThis as {\n readonly navigator?: {\n readonly locks?: { readonly request?: unknown };\n };\n }\n ).navigator?.locks;\n return locks !== undefined && typeof locks.request === \"function\";\n }\n}\n\nfunction normalizeOperation(operation: OfflineOperation): OfflineOperation {\n const status = (operation as { readonly status?: string }).status;\n return {\n ...operation,\n status:\n status === \"IN_FLIGHT\" || status === \"REJECTED\"\n ? \"PENDING\"\n : status === \"RETRYABLE_ERROR\"\n ? \"FAILED_RETRYABLE\"\n : (operation.status ?? \"PENDING\"),\n attempts: operation.attempts ?? 0,\n };\n}\n\nfunction normalizeRejectedHistory(\n entry: RejectedOperationHistoryEntry,\n): RejectedOperationHistoryEntry {\n return {\n ...entry,\n operation: normalizeOperation(entry.operation),\n reason: errorValue(entry.reason, \"REJECTED_PERMANENT\"),\n errorCode: entry.errorCode || entry.reason.code,\n rejectedAt: entry.rejectedAt || new Date(0).toISOString(),\n attempts: entry.attempts ?? entry.operation.attempts ?? 0,\n };\n}\n\nexport { MemoryQueueStorage as InMemoryOfflineQueueStorage };\n","import type { AdminRallyConfig, PublicRallyConfig, UserRallyState } from \"../domain/index.js\";\nimport { reconcileRewardStates } from \"../engine/transition.js\";\nimport type { OfflineOperation } from \"./offlineQueue.js\";\nimport { cloneState } from \"./storage.js\";\n\nexport type SyncOperationAction = \"CHECK_IN\" | \"CLAIM_REWARD\";\n\nexport type SyncOperationResult =\n | {\n readonly operationId: string;\n readonly status: \"ACCEPTED\";\n readonly resourceId: string;\n readonly action: SyncOperationAction;\n readonly appliedAt: number;\n }\n | {\n readonly operationId: string;\n readonly status: \"REJECTED_PERMANENT\";\n readonly resourceId: string;\n readonly errorCode: string;\n readonly reason: string;\n }\n | {\n readonly operationId: string;\n readonly status: \"FAILED_RETRYABLE\";\n readonly resourceId: string;\n readonly error: string;\n };\n\nexport interface SyncProgressResponse {\n readonly results: ReadonlyArray<SyncOperationResult>;\n readonly currentState: UserRallyState;\n readonly syncTimestamp: number;\n}\n\nexport interface RebuildUserStateOptions {\n readonly baseline: UserRallyState;\n readonly operations: ReadonlyArray<OfflineOperation>;\n readonly config?: AdminRallyConfig | PublicRallyConfig;\n}\n\nexport interface RebuildUserStateResult {\n readonly state: UserRallyState;\n readonly rejectedOperationIds: ReadonlyArray<string>;\n}\n\nfunction isReplayable(operation: OfflineOperation): boolean {\n return (\n operation.status === undefined ||\n operation.status === \"ACCEPTED\" ||\n operation.status === \"PENDING\" ||\n operation.status === \"IN_FLIGHT\" ||\n operation.status === \"FAILED_RETRYABLE\"\n );\n}\n\nfunction operationId(operation: OfflineOperation): string {\n const identity = operation.request.userId ?? operation.request.anonymousSessionId ?? \"anonymous\";\n return `${operation.kind}:${operation.request.rallyId}:${identity}:${operation.request.idempotencyKey}`;\n}\n\nfunction applyInventoryDelta(\n state: UserRallyState,\n previous: UserRallyState,\n optimistic: UserRallyState,\n): UserRallyState {\n const previousInventory = previous.inventory;\n const optimisticInventory = optimistic.inventory;\n if (previousInventory === undefined || optimisticInventory === undefined) return state;\n const currentInventory = state.inventory ?? {};\n const sharedDelta =\n previousInventory.sharedRemaining === undefined ||\n optimisticInventory.sharedRemaining === undefined\n ? undefined\n : optimisticInventory.sharedRemaining - previousInventory.sharedRemaining;\n const previousRewards = previousInventory.rewardRemaining ?? {};\n const optimisticRewards = optimisticInventory.rewardRemaining ?? {};\n const currentRewards = currentInventory.rewardRemaining ?? {};\n const rewardRemaining: Record<string, number> = { ...currentRewards };\n for (const key of new Set([...Object.keys(previousRewards), ...Object.keys(optimisticRewards)])) {\n const before = previousRewards[key];\n const after = optimisticRewards[key];\n if (before !== undefined && after !== undefined)\n rewardRemaining[key] = Math.max(0, (currentRewards[key] ?? before) + after - before);\n }\n const nextInventory: {\n readonly sharedRemaining?: number;\n readonly rewardRemaining?: Readonly<Record<string, number>>;\n } = {\n ...(currentInventory.sharedRemaining === undefined || sharedDelta === undefined\n ? optimisticInventory.sharedRemaining === undefined || sharedDelta === undefined\n ? {}\n : { sharedRemaining: Math.max(0, optimisticInventory.sharedRemaining) }\n : { sharedRemaining: Math.max(0, currentInventory.sharedRemaining + sharedDelta) }),\n ...(Object.keys(rewardRemaining).length === 0 ? {} : { rewardRemaining }),\n };\n return { ...state, inventory: nextInventory };\n}\n\nfunction applyOperation(\n state: UserRallyState,\n operation: OfflineOperation,\n config: AdminRallyConfig | PublicRallyConfig | undefined,\n rejectedCheckIns: ReadonlySet<string>,\n): { readonly state: UserRallyState; readonly prerequisiteFailed: boolean } {\n if (operation.kind === \"checkIn\") {\n const spot = config?.spots.find((candidate) => candidate.id === operation.request.spotId);\n if (\n spot?.prerequisites?.some(\n (id) => rejectedCheckIns.has(id) || !state.records.some((record) => record.stampId === id),\n )\n )\n return { state, prerequisiteFailed: true };\n if (state.records.some((record) => record.stampId === operation.request.spotId))\n return { state, prerequisiteFailed: false };\n const optimisticRecord = operation.optimisticState?.records.find(\n (record) => record.stampId === operation.request.spotId,\n );\n const record = optimisticRecord ?? {\n stampId: operation.request.spotId,\n acquiredAt: operation.request.now,\n };\n const records = [...state.records, { ...record }];\n const rewards =\n config === undefined\n ? state.rewards\n : reconcileRewardStates(config.rewards, state.rewards, records.length, record.acquiredAt);\n return {\n state: { ...state, records, rewards, updatedAt: record.acquiredAt },\n prerequisiteFailed: false,\n };\n }\n\n const optimisticState = operation.optimisticState;\n if (optimisticState === undefined) return { state, prerequisiteFailed: false };\n const optimisticReward = optimisticState?.rewards.find(\n (reward) => reward.rewardId === operation.request.rewardId,\n );\n if (optimisticReward === undefined) return { state, prerequisiteFailed: false };\n const rewards = state.rewards.some((reward) => reward.rewardId === optimisticReward.rewardId)\n ? state.rewards.map((reward) =>\n reward.rewardId === optimisticReward.rewardId ? { ...optimisticReward } : reward,\n )\n : [...state.rewards, { ...optimisticReward }];\n return {\n state: applyInventoryDelta(\n { ...state, rewards, updatedAt: optimisticReward.consumedAt ?? state.updatedAt },\n operation.request.state,\n optimisticState,\n ),\n prerequisiteFailed: false,\n };\n}\n\n/** Replays the durable operation log on top of a server-confirmed baseline. */\nexport function rebuildUserStateFromLog(\n baseline: UserRallyState,\n operations: ReadonlyArray<OfflineOperation>,\n config?: AdminRallyConfig | PublicRallyConfig,\n): UserRallyState;\nexport function rebuildUserStateFromLog(options: RebuildUserStateOptions): UserRallyState;\nexport function rebuildUserStateFromLog(\n baselineOrOptions: UserRallyState | RebuildUserStateOptions,\n operationsArgument?: ReadonlyArray<OfflineOperation>,\n configArgument?: AdminRallyConfig | PublicRallyConfig,\n): UserRallyState {\n const { state } = rebuildUserStateLog(\n \"baseline\" in baselineOrOptions ? baselineOrOptions.baseline : baselineOrOptions,\n \"baseline\" in baselineOrOptions ? baselineOrOptions.operations : (operationsArgument ?? []),\n \"baseline\" in baselineOrOptions ? baselineOrOptions.config : configArgument,\n );\n return state;\n}\n\nexport function rebuildUserStateLog(\n baseline: UserRallyState,\n operations: ReadonlyArray<OfflineOperation>,\n config?: AdminRallyConfig | PublicRallyConfig,\n): RebuildUserStateResult {\n let state = cloneState(baseline);\n const rejectedOperationIds: string[] = [];\n const rejectedCheckIns = new Set(\n operations\n .filter(\n (operation) => operation.status === \"REJECTED_PERMANENT\" && operation.kind === \"checkIn\",\n )\n .map((operation) => (operation.kind === \"checkIn\" ? operation.request.spotId : undefined))\n .filter((spotId): spotId is string => spotId !== undefined),\n );\n for (const operation of operations) {\n if (operation.status === \"REJECTED_PERMANENT\") {\n if (operation.kind === \"checkIn\") rejectedCheckIns.add(operation.request.spotId);\n continue;\n }\n if (!isReplayable(operation)) continue;\n const replay = applyOperation(state, operation, config, rejectedCheckIns);\n if (replay.prerequisiteFailed) {\n rejectedOperationIds.push(operationId(operation));\n if (operation.kind === \"checkIn\") rejectedCheckIns.add(operation.request.spotId);\n continue;\n }\n state = replay.state;\n }\n return { state, rejectedOperationIds };\n}\n","import type {\n CustomValidationContext,\n PublicCheckInCondition,\n PublicRallyConfig,\n RallyConfig,\n Result,\n Reward,\n RewardState,\n StampRecord,\n UserRallyState,\n Validator,\n} from \"../domain/index.js\";\nimport { consumeReward, type RewardConsumeError, reconcileRewardStates } from \"../engine/index.js\";\nimport type {\n OfflineOperationError,\n OfflineQueue,\n OfflineQueueCapability,\n OfflineQueueCapabilityWarning,\n OfflineStorageCapability,\n OfflineSyncResultEvent,\n RejectedOperationHistoryEntry,\n SyncState,\n} from \"./offlineQueue.js\";\nimport { rollbackOptimisticOperation } from \"./offlineQueue.js\";\nimport {\n cloneState,\n createAnonymousSessionId,\n InMemoryStorage,\n type StampStorage,\n storageKey,\n} from \"./storage.js\";\nimport { rebuildUserStateFromLog, type SyncProgressResponse } from \"./sync.js\";\n\nexport type CheckInOptions = {\n readonly now?: string;\n readonly idempotencyKey?: string;\n readonly sync?: boolean;\n};\nexport type ClaimOptions = {\n readonly now?: string;\n readonly idempotencyKey?: string;\n readonly staffPasscode?: string;\n readonly staffId?: string;\n readonly sync?: boolean;\n};\nexport type ClientError =\n | {\n readonly code:\n | \"SPOT_NOT_FOUND\"\n | \"STAMP_ALREADY_ACQUIRED\"\n | \"PREREQUISITES_NOT_MET\"\n | \"INVALID_PROOF\";\n readonly spotId: string;\n readonly message: string;\n }\n | { readonly code: \"CUSTOM_VALIDATION_FAILED\"; readonly spotId: string; readonly message: string }\n | { readonly code: \"REWARD_NOT_FOUND\"; readonly rewardId: string; readonly message: string }\n | { readonly code: \"SYNC_FAILED\"; readonly message: string }\n | RewardConsumeError;\nexport interface CheckInSuccess {\n readonly state: UserRallyState;\n readonly record: StampRecord;\n}\nexport type CheckInResult = Result<CheckInSuccess, ClientError>;\nexport interface ClaimSuccess {\n readonly state: UserRallyState;\n readonly reward: RewardState;\n}\nexport type ClaimResult = Result<ClaimSuccess, ClientError>;\nexport type ClientEvent =\n | { readonly type: \"checkIn\"; readonly result: CheckInResult }\n | { readonly type: \"rewardClaimed\"; readonly result: ClaimResult }\n | { readonly type: \"sync\"; readonly state: UserRallyState }\n | { readonly type: \"syncLifecycle\"; readonly event: SyncLifecycleEvent }\n | { readonly type: \"storageCapabilityWarning\"; readonly warning: OfflineQueueCapabilityWarning }\n | { readonly type: \"error\"; readonly error: ClientError | OfflineOperationError };\nexport type ClientListener = (state: UserRallyState) => void;\nexport type ClientEventListener = (event: ClientEvent) => void;\nexport type SyncLifecycleEvent =\n | { readonly type: \"SYNC_STARTED\" }\n | {\n readonly type: \"OPERATION_ACCEPTED\";\n readonly operationId: string;\n readonly resourceId: string;\n }\n | {\n readonly type: \"OPERATION_ROLLED_BACK\";\n readonly operationId: string;\n readonly resourceId: string;\n readonly reason: string;\n readonly errorCode: string;\n }\n | {\n readonly type: \"OPERATION_RETRYABLE_ERROR\";\n readonly operationId: string;\n readonly error: string;\n }\n | {\n readonly type: \"SYNC_COMPLETED\";\n readonly totalProcessed: number;\n readonly failedCount: number;\n };\nexport type SyncEventListener = (event: SyncLifecycleEvent) => void;\n\nexport interface CheckInRequest {\n readonly rallyId: string;\n readonly userId: string | null;\n readonly spotId: string;\n readonly proofData: unknown;\n readonly idempotencyKey: string;\n readonly now: string;\n readonly state: UserRallyState;\n readonly anonymousSessionId?: string;\n}\nexport interface ClaimRequest {\n readonly rallyId: string;\n readonly userId: string | null;\n readonly rewardId: string;\n readonly idempotencyKey: string;\n readonly now: string;\n readonly options: ClaimOptions;\n readonly state: UserRallyState;\n readonly anonymousSessionId?: string;\n}\nexport interface SyncAdapter {\n readonly checkIn?: (request: CheckInRequest) => Promise<CheckInResult>;\n readonly claimReward?: (request: ClaimRequest) => Promise<ClaimResult>;\n readonly sync?: (request: {\n readonly rallyId: string;\n readonly userId: string | null;\n readonly state: UserRallyState;\n readonly anonymousSessionId?: string;\n readonly operations?: ReadonlyArray<import(\"./offlineQueue.js\").OfflineOperation>;\n }) => Promise<UserRallyState | SyncProgressResponse>;\n}\nexport interface ClientOptions {\n readonly storage?: StampStorage;\n readonly syncAdapter?: SyncAdapter;\n readonly customValidator?: Validator;\n readonly customValidators?: Readonly<Record<string, Validator>>;\n readonly clock?: () => string;\n readonly userId?: string | null;\n readonly anonymousSessionId?: string;\n readonly offlineQueue?: OfflineQueue;\n}\ntype StorageOrOptions = StampStorage | ClientOptions;\nfunction isStorage(value: StorageOrOptions): value is StampStorage {\n return \"load\" in value && \"save\" in value && \"remove\" in value;\n}\nfunction id(prefix: string): string {\n return `${prefix}-${globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2)}`}`;\n}\nfunction proof(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"object\" && value !== null) {\n const item = value as Record<string, unknown>;\n for (const key of [\"token\", \"code\", \"passcode\", \"value\", \"tagId\"])\n if (typeof item[key] === \"string\") return item[key];\n }\n return \"\";\n}\nfunction matches(condition: PublicCheckInCondition, value: unknown): boolean {\n if (condition.type === \"gps\") {\n if (typeof value !== \"object\" || value === null) return false;\n const item = value as Record<string, unknown>;\n const latitude = item.latitude;\n const longitude = item.longitude;\n if (typeof latitude !== \"number\" || typeof longitude !== \"number\") return false;\n const radians = (v: number): number => (v * Math.PI) / 180;\n const dLat = radians(latitude - condition.latitude);\n const dLon = radians(longitude - condition.longitude);\n const h =\n Math.sin(dLat / 2) ** 2 +\n Math.cos(radians(condition.latitude)) * Math.cos(radians(latitude)) * Math.sin(dLon / 2) ** 2;\n return 6_371_000 * 2 * Math.asin(Math.sqrt(Math.min(1, h))) <= condition.radiusMeters;\n }\n return proof(value).trim() !== \"\";\n}\nfunction emptyState(config: PublicRallyConfig, userId: string | null, now: string): UserRallyState {\n return {\n rallyId: config.id,\n userId,\n records: [],\n rewards: reconcileRewardStates(config.rewards as ReadonlyArray<Reward>, [], 0, now),\n updatedAt: now,\n };\n}\nfunction applyOptimisticRewardClaim(\n state: UserRallyState,\n rewardId: string,\n reward: RewardState,\n now: string,\n): UserRallyState {\n if (reward.claimTicketNumber === undefined || state.inventory === undefined)\n return {\n ...state,\n rewards: state.rewards.map((item) => (item.rewardId === rewardId ? reward : item)),\n updatedAt: now,\n };\n const currentInventory = state.inventory;\n const currentRewardRemaining = currentInventory.rewardRemaining?.[rewardId];\n return {\n ...state,\n rewards: state.rewards.map((item) => (item.rewardId === rewardId ? reward : item)),\n updatedAt: now,\n inventory: {\n ...(currentInventory.sharedRemaining === undefined\n ? {}\n : { sharedRemaining: Math.max(0, currentInventory.sharedRemaining - 1) }),\n ...(currentInventory.rewardRemaining === undefined || currentRewardRemaining === undefined\n ? {}\n : {\n rewardRemaining: {\n ...currentInventory.rewardRemaining,\n [rewardId]: Math.max(0, currentRewardRemaining - 1),\n },\n }),\n },\n };\n}\nfunction errorMessage(\n error: ClientError | OfflineOperationError | undefined,\n fallback: string,\n): string {\n return error !== undefined && \"message\" in error && typeof error.message === \"string\"\n ? error.message\n : fallback;\n}\n\nfunction isSyncProgressResponse(\n value: UserRallyState | SyncProgressResponse,\n): value is SyncProgressResponse {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"results\" in value &&\n Array.isArray(value.results) &&\n \"currentState\" in value &&\n \"syncTimestamp\" in value\n );\n}\n\nexport class StampRallyClient {\n readonly #listeners = new Set<ClientListener>();\n readonly #eventListeners = new Set<ClientEventListener>();\n readonly #syncEventListeners = new Set<SyncEventListener>();\n readonly #storage: StampStorage;\n readonly #options: ClientOptions;\n readonly #config: PublicRallyConfig;\n readonly #offlineQueue: OfflineQueue | undefined;\n #userId: string | null;\n readonly #anonymousSessionId: string;\n #state: UserRallyState | null = null;\n #initialization: Promise<UserRallyState> | null = null;\n #queue: Promise<unknown> = Promise.resolve();\n #syncRevision = 0;\n #syncMetrics: { processed: number; failed: number } | null = null;\n constructor(config: PublicRallyConfig, storageOrOptions: StorageOrOptions = {}) {\n this.#config = config;\n this.#options = isStorage(storageOrOptions) ? { storage: storageOrOptions } : storageOrOptions;\n this.#storage = this.#options.storage ?? new InMemoryStorage();\n this.#anonymousSessionId = this.#options.anonymousSessionId ?? createAnonymousSessionId();\n this.#userId = this.#options.userId ?? this.#anonymousSessionId;\n this.#offlineQueue = this.#options.offlineQueue;\n this.#offlineQueue?.setReplayConfig(config);\n this.#offlineQueue?.setSyncResultListener((event) => this.#handleOfflineSyncResult(event));\n this.#offlineQueue?.setCapabilityWarningListener((warning) =>\n this.#emitEvent({ type: \"storageCapabilityWarning\", warning }),\n );\n this.#offlineQueue?.setChangeListener(() => {\n this.#syncRevision += 1;\n if (this.#state !== null) this.#emit(this.#state);\n });\n }\n getConfig(): RallyConfig {\n return this.#config;\n }\n getState(): UserRallyState | null {\n return this.#state;\n }\n getUserId(): string | null {\n return this.#userId;\n }\n getAnonymousSessionId(): string {\n return this.#anonymousSessionId;\n }\n get syncState(): SyncState {\n return this.#offlineQueue?.syncState ?? \"idle\";\n }\n get pendingCount(): number {\n return this.#offlineQueue?.pendingCount ?? 0;\n }\n get rejectedHistory(): ReadonlyArray<RejectedOperationHistoryEntry> {\n return this.#offlineQueue?.rejectedHistory ?? [];\n }\n getSyncRevision(): number {\n return this.#syncRevision;\n }\n get queueCapability(): OfflineQueueCapability {\n return (\n this.#offlineQueue?.queueCapability ?? {\n storage: \"custom\",\n multiTabSync: \"disabled_unsafe_environment\",\n }\n );\n }\n get storageCapability(): OfflineStorageCapability {\n return this.#offlineQueue?.storageCapability ?? \"custom\";\n }\n get isStoragePersistent(): boolean {\n return this.#offlineQueue?.isStoragePersistent ?? true;\n }\n discardRejected(operationId: string): Promise<boolean> {\n return this.#offlineQueue?.discardRejected(operationId) ?? Promise.resolve(false);\n }\n retryRejected(operationId: string): Promise<boolean> {\n return this.#offlineQueue?.retryRejected(operationId) ?? Promise.resolve(false);\n }\n dismissRejectedOperation(operationId: string): Promise<boolean> {\n return this.discardRejected(operationId);\n }\n retryOperation(operationId: string): Promise<boolean> {\n return this.retryRejected(operationId);\n }\n subscribe(listener: ClientListener): () => void {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n }\n subscribeEvents(listener: ClientEventListener): () => void {\n this.#eventListeners.add(listener);\n return () => this.#eventListeners.delete(listener);\n }\n subscribeSyncEvents(listener: SyncEventListener): () => void {\n this.#syncEventListeners.add(listener);\n return () => this.#syncEventListeners.delete(listener);\n }\n subscribeSyncState(listener: () => void): () => void {\n const wrapped: ClientListener = () => listener();\n this.#listeners.add(wrapped);\n return () => this.#listeners.delete(wrapped);\n }\n init(): Promise<UserRallyState> {\n return this.initialize();\n }\n initialize(): Promise<UserRallyState> {\n if (this.#state !== null) return Promise.resolve(this.#state);\n if (this.#initialization === null) {\n this.#initialization = (async () => {\n await this.#offlineQueue?.setScope(this.#config.id, this.#userId);\n return this.#storage.load(this.#config.id, this.#userId);\n })()\n .then((state) => {\n const next =\n state === null\n ? emptyState(this.#config, this.#userId, this.#now())\n : this.#reconcile(state);\n this.#state = next;\n this.#emit(next);\n return next;\n })\n .catch((error: unknown) => {\n this.#initialization = null;\n throw error;\n });\n }\n return this.#initialization;\n }\n switchUser(newUserId: string | null): Promise<UserRallyState> {\n return this.#enqueue(async () => {\n const nextUserId = newUserId ?? this.#anonymousSessionId;\n if (this.#userId === nextUserId && this.#state !== null) return this.#state;\n this.#userId = nextUserId;\n this.#state = null;\n this.#initialization = null;\n await this.#offlineQueue?.switchUser(nextUserId);\n return this.initialize();\n });\n }\n async getUserState(rallyId: string, userId: string): Promise<UserRallyState | null> {\n return this.#storage.load(rallyId, userId);\n }\n clearUserState(userId = this.#userId): Promise<void> {\n return this.#enqueue(async () => {\n await this.#storage.remove(this.#config.id, userId);\n if (userId === this.#userId) {\n await this.#initializeFresh();\n }\n });\n }\n checkIn(\n spotId: string,\n proofData: unknown,\n options: CheckInOptions = {},\n ): Promise<CheckInResult> {\n return this.#enqueue(async () => {\n const current = await this.initialize();\n const spot = this.#config.spots.find((item) => item.id === spotId);\n if (spot === undefined)\n return this.#fail({ code: \"SPOT_NOT_FOUND\", spotId, message: \"Spot was not found.\" });\n if (current.records.some((record) => record.stampId === spotId))\n return this.#fail({\n code: \"STAMP_ALREADY_ACQUIRED\",\n spotId,\n message: \"Spot was already claimed.\",\n });\n const acquired = new Set(current.records.map((record) => record.stampId));\n if (spot.prerequisites?.some((id) => !acquired.has(id)))\n return this.#fail({\n code: \"PREREQUISITES_NOT_MET\",\n spotId,\n message: \"Prerequisite spots are not complete.\",\n });\n for (const condition of spot.conditions) {\n if (condition.type === \"custom\") {\n const validator =\n this.#options.customValidators?.[condition.validatorName] ??\n this.#options.customValidator;\n if (validator === undefined)\n return this.#fail({\n code: \"CUSTOM_VALIDATION_FAILED\",\n spotId,\n message: \"No custom validator is registered.\",\n });\n const context: CustomValidationContext = {\n rallyId: this.#config.id,\n spotId,\n proofData,\n condition: { type: \"custom\", validatorName: condition.validatorName },\n userState: current,\n };\n const result =\n typeof validator === \"function\"\n ? await validator(context)\n : await validator.validate(context);\n if (result === false || (typeof result === \"object\" && !result.valid))\n return this.#fail({\n code: \"CUSTOM_VALIDATION_FAILED\",\n spotId,\n message:\n typeof result === \"object\" && result.message !== undefined\n ? result.message\n : \"Custom validation failed.\",\n });\n } else if (!matches(condition, proofData))\n return this.#fail({ code: \"INVALID_PROOF\", spotId, message: \"Verification failed.\" });\n }\n const now = options.now ?? this.#now();\n const request: CheckInRequest = {\n rallyId: this.#config.id,\n userId: this.#userId,\n spotId,\n proofData,\n idempotencyKey: options.idempotencyKey ?? id(\"check-in\"),\n now,\n state: current,\n ...(this.#userId === this.#anonymousSessionId\n ? { anonymousSessionId: this.#anonymousSessionId }\n : {}),\n };\n const remote = this.#options.syncAdapter?.checkIn;\n if (options.sync !== false && remote !== undefined) {\n try {\n const result = await remote(request);\n return result.ok ? this.#commitCheckIn(result) : this.#fail(result.error);\n } catch (error) {\n if (this.#offlineQueue === undefined) throw error;\n const record = { stampId: spotId, acquiredAt: now };\n const next = this.#reconcile({\n ...current,\n records: [...current.records, record],\n updatedAt: now,\n });\n await this.#offlineQueue.enqueueCheckIn(request, next);\n await this.#storage.save(next);\n return this.#commitCheckIn({ ok: true, value: { state: next, record } });\n }\n }\n const record = { stampId: spotId, acquiredAt: now };\n const next = this.#reconcile({\n ...current,\n records: [...current.records, record],\n updatedAt: now,\n });\n await this.#storage.save(next);\n return this.#commitCheckIn({ ok: true, value: { state: next, record } });\n });\n }\n claimReward(rewardId: string, options: ClaimOptions = {}): Promise<ClaimResult> {\n return this.#enqueue(async () => {\n const current = await this.initialize();\n const configured = this.#config.rewards.find((item) => item.id === rewardId);\n if (configured === undefined)\n return this.#fail({ code: \"REWARD_NOT_FOUND\", rewardId, message: \"Reward was not found.\" });\n const now = options.now ?? this.#now();\n const state = current.rewards.find((item) => item.rewardId === rewardId) ?? {\n rewardId,\n status: \"LOCKED\" as const,\n };\n const local = consumeReward({\n reward: configured as Reward,\n currentState: state,\n now,\n ...(options.staffPasscode === undefined ? {} : { inputPasscode: options.staffPasscode }),\n ...(options.staffId === undefined ? {} : { staffId: options.staffId }),\n });\n if (!local.ok) return this.#fail(local.error);\n const request: ClaimRequest = {\n rallyId: this.#config.id,\n userId: this.#userId,\n rewardId,\n idempotencyKey: options.idempotencyKey ?? id(\"claim\"),\n now,\n options,\n state: current,\n ...(this.#userId === this.#anonymousSessionId\n ? { anonymousSessionId: this.#anonymousSessionId }\n : {}),\n };\n const remote = this.#options.syncAdapter?.claimReward;\n if (options.sync !== false && remote !== undefined) {\n try {\n const result = await remote(request);\n return result.ok ? this.#commitClaim(result) : this.#fail(result.error);\n } catch (error) {\n if (this.#offlineQueue === undefined) throw error;\n const next = applyOptimisticRewardClaim(current, rewardId, local.value, now);\n await this.#offlineQueue.enqueueClaimReward(request, next);\n await this.#storage.save(next);\n return this.#commitClaim({ ok: true, value: { state: next, reward: local.value } });\n }\n }\n const next = applyOptimisticRewardClaim(current, rewardId, local.value, now);\n await this.#storage.save(next);\n return this.#commitClaim({ ok: true, value: { state: next, reward: local.value } });\n });\n }\n sync(adapter = this.#options.syncAdapter): Promise<void> {\n return this.#enqueue(async () => {\n this.#emitSyncEvent({ type: \"SYNC_STARTED\" });\n this.#syncMetrics = { processed: 0, failed: 0 };\n try {\n const current = await this.initialize();\n const queuedOperations = this.#offlineQueue?.operations ?? [];\n const hasPerOperationAdapters =\n adapter?.checkIn !== undefined || adapter?.claimReward !== undefined;\n if (this.#offlineQueue !== undefined && adapter !== undefined && hasPerOperationAdapters) {\n await this.#offlineQueue.sync(async (operation) => {\n if (operation.kind === \"checkIn\") {\n if (adapter.checkIn === undefined)\n throw new Error(\"No check-in sync adapter is configured.\");\n return adapter.checkIn(operation.request);\n }\n if (adapter.claimReward === undefined)\n throw new Error(\"No reward sync adapter is configured.\");\n return adapter.claimReward(operation.request);\n });\n }\n if (adapter?.sync === undefined) {\n this.#emitEvent({ type: \"sync\", state: this.#state ?? current });\n return;\n }\n const localState = this.#state ?? current;\n const syncResult = await adapter.sync({\n rallyId: this.#config.id,\n userId: this.#userId,\n state: localState,\n ...(this.#userId === this.#anonymousSessionId\n ? { anonymousSessionId: this.#anonymousSessionId }\n : {}),\n ...(this.#offlineQueue !== undefined &&\n !hasPerOperationAdapters &&\n queuedOperations.length > 0\n ? { operations: queuedOperations }\n : {}),\n });\n const progress = isSyncProgressResponse(syncResult) ? syncResult : undefined;\n if (progress !== undefined) await this.#offlineQueue?.applySyncProgress(progress);\n const serverState = isSyncProgressResponse(syncResult)\n ? syncResult.currentState\n : syncResult;\n const resolved = rebuildUserStateFromLog(\n serverState,\n this.#offlineQueue?.operations ?? [],\n this.#config,\n );\n const next = this.#reconcile(resolved);\n await this.#storage.save(next);\n this.#state = next;\n this.#emit(next);\n this.#emitEvent({ type: \"sync\", state: next });\n } finally {\n const metrics = this.#syncMetrics ?? { processed: 0, failed: 0 };\n this.#syncMetrics = null;\n this.#emitSyncEvent({\n type: \"SYNC_COMPLETED\",\n totalProcessed: metrics.processed,\n failedCount: metrics.failed,\n });\n }\n });\n }\n retrySync(): Promise<void> {\n return this.sync();\n }\n reset(): Promise<UserRallyState> {\n return this.#enqueue(async () => {\n await this.#storage.remove(this.#config.id, this.#userId);\n return this.#initializeFresh();\n });\n }\n restore(state: UserRallyState): Promise<UserRallyState> {\n return this.#enqueue(async () => {\n if (state.rallyId !== this.#config.id || state.userId !== this.#userId)\n throw new Error(\"State belongs to another rally or user.\");\n const next = this.#reconcile(state);\n await this.#storage.save(next);\n this.#state = next;\n this.#initialization = Promise.resolve(next);\n this.#emit(next);\n return next;\n });\n }\n #enqueue<T>(operation: () => Promise<T>): Promise<T> {\n const next = this.#queue.then(operation, operation);\n this.#queue = next.then(\n () => undefined,\n () => undefined,\n );\n return next;\n }\n #initializeFresh(): Promise<UserRallyState> {\n const next = emptyState(this.#config, this.#userId, this.#now());\n this.#state = next;\n this.#initialization = Promise.resolve(next);\n this.#emit(next);\n return Promise.resolve(next);\n }\n #reconcile(state: UserRallyState): UserRallyState {\n const ids = new Set(this.#config.spots.map((spot) => spot.id));\n const records = state.records.filter(\n (record, index, all) =>\n ids.has(record.stampId) &&\n all.findIndex((candidate) => candidate.stampId === record.stampId) === index,\n );\n return {\n ...cloneState(state),\n userId: this.#userId,\n records,\n rewards: reconcileRewardStates(\n this.#config.rewards as ReadonlyArray<Reward>,\n state.rewards,\n records.length,\n state.updatedAt,\n ),\n };\n }\n async #handleOfflineSyncResult(event: OfflineSyncResultEvent): Promise<void> {\n if (event.status === \"ACCEPTED\") {\n if (this.#syncMetrics !== null) this.#syncMetrics.processed += 1;\n if (event.state !== undefined) {\n const rebuilt = rebuildUserStateFromLog(\n event.state,\n this.#offlineQueue?.operations ?? [],\n this.#config,\n );\n const next = this.#reconcile(rebuilt);\n await this.#storage.save(next);\n this.#state = next;\n this.#emit(next);\n }\n this.#emitSyncEvent({\n type: \"OPERATION_ACCEPTED\",\n operationId: this.#operationId(event.operation),\n resourceId: this.#resourceId(event.operation),\n });\n } else if (event.status === \"REJECTED_PERMANENT\") {\n const error = event.error ?? {\n code: \"REJECTED_PERMANENT\",\n message: \"Offline operation was rejected.\",\n };\n if (this.#syncMetrics !== null) {\n this.#syncMetrics.processed += 1;\n this.#syncMetrics.failed += 1;\n }\n const base = event.state ?? this.#state ?? event.operation.request.state;\n const rollbackBase =\n event.state === undefined ? rollbackOptimisticOperation(base, event.operation) : base;\n const rebuilt = rebuildUserStateFromLog(\n rollbackBase,\n this.#offlineQueue?.operations ?? [],\n this.#config,\n );\n const next = this.#reconcile(rebuilt);\n await this.#storage.save(next);\n this.#state = next;\n this.#emit(next);\n this.#emitSyncEvent({\n type: \"OPERATION_ROLLED_BACK\",\n operationId: this.#operationId(event.operation),\n resourceId: this.#resourceId(event.operation),\n reason: errorMessage(error, \"Offline operation was rejected.\"),\n errorCode: error.code,\n });\n } else if (event.status === \"RETRYABLE_ERROR\") {\n if (this.#syncMetrics !== null) this.#syncMetrics.failed += 1;\n this.#emitSyncEvent({\n type: \"OPERATION_RETRYABLE_ERROR\",\n operationId: this.#operationId(event.operation),\n error: errorMessage(event.error, \"Retryable sync error.\"),\n });\n }\n if (event.state !== undefined && event.status === undefined) {\n const next = this.#reconcile(event.state);\n await this.#storage.save(next);\n this.#state = next;\n this.#emit(next);\n }\n if (event.error !== undefined) this.#emitEvent({ type: \"error\", error: event.error });\n else if (event.result !== undefined && \"ok\" in event.result && !event.result.ok)\n this.#emitEvent({ type: \"error\", error: event.result.error });\n }\n #now(): string {\n return this.#options.clock?.() ?? new Date().toISOString();\n }\n #fail(error: ClientError): { readonly ok: false; readonly error: ClientError } {\n this.#emitEvent({ type: \"error\", error });\n return { ok: false, error };\n }\n #commitCheckIn(result: CheckInResult): CheckInResult {\n if (result.ok) {\n this.#state = result.value.state;\n this.#emit(this.#state);\n }\n this.#emitEvent({ type: \"checkIn\", result });\n return result;\n }\n #commitClaim(result: ClaimResult): ClaimResult {\n if (result.ok) {\n this.#state = result.value.state;\n this.#emit(this.#state);\n }\n this.#emitEvent({ type: \"rewardClaimed\", result });\n return result;\n }\n #emit(state: UserRallyState): void {\n for (const listener of this.#listeners) listener(state);\n }\n #emitEvent(event: ClientEvent): void {\n for (const listener of this.#eventListeners) listener(event);\n }\n #emitSyncEvent(event: SyncLifecycleEvent): void {\n for (const listener of this.#syncEventListeners) listener(event);\n this.#emitEvent({ type: \"syncLifecycle\", event });\n }\n #operationId(operation: import(\"./offlineQueue.js\").OfflineOperation): string {\n const identity =\n operation.request.userId ?? operation.request.anonymousSessionId ?? \"anonymous\";\n return `${operation.kind}:${operation.request.rallyId}:${identity}:${operation.request.idempotencyKey}`;\n }\n #resourceId(operation: import(\"./offlineQueue.js\").OfflineOperation): string {\n return operation.kind === \"checkIn\" ? operation.request.spotId : operation.request.rewardId;\n }\n}\nexport { storageKey };\n","export type SecureTokenSecretKey = string | Uint8Array;\n\nexport interface SecureTokenOptions {\n readonly encrypt?: boolean;\n readonly expiresInSeconds?: number;\n}\n\nexport interface SecureTokenPayload {\n readonly [key: string]: unknown;\n readonly exp?: number;\n}\n\nexport type SecureTokenErrorCode =\n | \"MALFORMED\"\n | \"INVALID_SIGNATURE\"\n | \"DECRYPTION_FAILED\"\n | \"INVALID_PAYLOAD\"\n | \"EXPIRED\";\n\nexport interface SecureTokenError {\n readonly code: SecureTokenErrorCode;\n readonly message: string;\n}\n\nexport type SecureTokenVerification<T extends SecureTokenPayload = SecureTokenPayload> =\n | { readonly ok: true; readonly valid: true; readonly payload: T }\n | { readonly ok: false; readonly valid: false; readonly error: SecureTokenError };\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nfunction cryptoApi(): Crypto {\n if (globalThis.crypto?.subtle === undefined) {\n throw new Error(\"Web Crypto API is unavailable in this environment.\");\n }\n return globalThis.crypto;\n}\n\nfunction bytes(value: SecureTokenSecretKey): Uint8Array {\n return typeof value === \"string\" ? encoder.encode(value) : new Uint8Array(value);\n}\n\nfunction source(value: Uint8Array): BufferSource {\n return value.buffer as ArrayBuffer;\n}\n\nfunction encode(value: Uint8Array): string {\n let binary = \"\";\n for (const byte of value) binary += String.fromCharCode(byte);\n return globalThis.btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replace(/=+$/u, \"\");\n}\n\nfunction decode(value: string): Uint8Array {\n const base64 = value.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n const padded = `${base64}${\"=\".repeat((4 - (base64.length % 4)) % 4)}`;\n return Uint8Array.from(globalThis.atob(padded), (character) => character.charCodeAt(0));\n}\n\nasync function hmacKey(secret: Uint8Array): Promise<CryptoKey> {\n return cryptoApi().subtle.importKey(\n \"raw\",\n source(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\", \"verify\"],\n );\n}\n\nasync function aesKey(secret: Uint8Array): Promise<CryptoKey> {\n const digest = await cryptoApi().subtle.digest(\"SHA-256\", source(secret));\n return cryptoApi().subtle.importKey(\"raw\", digest, \"AES-GCM\", false, [\"encrypt\", \"decrypt\"]);\n}\n\nexport async function createSecureToken<T extends SecureTokenPayload>(\n payload: T,\n secretKey: SecureTokenSecretKey,\n options: SecureTokenOptions = {},\n): Promise<string> {\n const api = cryptoApi();\n const expiresInSeconds = options.expiresInSeconds;\n const effectivePayload =\n expiresInSeconds === undefined || payload.exp !== undefined\n ? payload\n : ({ ...payload, exp: Math.floor(Date.now() / 1000) + expiresInSeconds } as T);\n const secret = bytes(secretKey);\n const plaintext = encoder.encode(JSON.stringify(effectivePayload));\n const actualBody =\n options.encrypt === true ? await encryptPayload(plaintext, secret, api) : encode(plaintext);\n const signature = new Uint8Array(\n await api.subtle.sign(\"HMAC\", await hmacKey(secret), encoder.encode(actualBody)),\n );\n return `sr3.${options.encrypt === true ? \"e\" : \"p\"}.${actualBody}.${encode(signature)}`;\n}\n\nasync function encryptPayload(\n plaintext: Uint8Array,\n secret: Uint8Array,\n api: Crypto,\n): Promise<string> {\n const iv = api.getRandomValues(new Uint8Array(12));\n const encrypted = new Uint8Array(\n await api.subtle.encrypt(\n { name: \"AES-GCM\", iv: source(iv) },\n await aesKey(secret),\n source(plaintext),\n ),\n );\n return encode(new Uint8Array([...iv, ...encrypted]));\n}\n\nexport async function verifySecureToken<T extends SecureTokenPayload = SecureTokenPayload>(\n token: string,\n secretKey: SecureTokenSecretKey,\n now = Date.now(),\n): Promise<SecureTokenVerification<T>> {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 4 || parts[0] !== \"sr3\" || (parts[1] !== \"e\" && parts[1] !== \"p\")) {\n return {\n ok: false,\n valid: false,\n error: { code: \"MALFORMED\", message: \"Secure token is malformed.\" },\n };\n }\n const mode = parts[1];\n const body = parts[2];\n const encodedSignature = parts[3];\n if (body === undefined || encodedSignature === undefined || mode === undefined) {\n return {\n ok: false,\n valid: false,\n error: { code: \"MALFORMED\", message: \"Secure token is malformed.\" },\n };\n }\n const secret = bytes(secretKey);\n const valid = await cryptoApi().subtle.verify(\n \"HMAC\",\n await hmacKey(secret),\n source(decode(encodedSignature)),\n source(encoder.encode(body)),\n );\n if (!valid)\n return {\n ok: false,\n valid: false,\n error: { code: \"INVALID_SIGNATURE\", message: \"Secure token signature is invalid.\" },\n };\n const plaintext = mode === \"e\" ? await decryptPayload(body, secret) : decode(body);\n const parsed: unknown = JSON.parse(decoder.decode(plaintext));\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n return {\n ok: false,\n valid: false,\n error: { code: \"INVALID_PAYLOAD\", message: \"Secure token payload is invalid.\" },\n };\n }\n const payload = parsed as T;\n if (typeof payload.exp === \"number\" && now >= payload.exp * 1000) {\n return {\n ok: false,\n valid: false,\n error: { code: \"EXPIRED\", message: \"Secure token has expired.\" },\n };\n }\n return { ok: true, valid: true, payload };\n } catch {\n return {\n ok: false,\n valid: false,\n error: { code: \"DECRYPTION_FAILED\", message: \"Secure token could not be verified.\" },\n };\n }\n}\n\nasync function decryptPayload(body: string, secret: Uint8Array): Promise<Uint8Array> {\n const encrypted = decode(body);\n if (encrypted.length <= 12) throw new Error(\"Invalid encrypted payload.\");\n return new Uint8Array(\n await cryptoApi().subtle.decrypt(\n { name: \"AES-GCM\", iv: source(encrypted.slice(0, 12)) },\n await aesKey(secret),\n source(encrypted.slice(12)),\n ),\n );\n}\n","export type SupportedLocale = \"ja\" | \"en\";\nexport type LocalizedText<TLocale extends string = string> =\n | string\n | Partial<Record<TLocale, string>>;\nexport type LocalizedString<TLocale extends string = SupportedLocale> = Record<TLocale, string>;\nexport type LocaleDictionary<TLocale extends string = string> = Readonly<\n Record<TLocale, Readonly<Record<string, string>>>\n>;\nexport type SlotShape = \"circle\" | \"square\" | \"rounded\";\nexport type FontFamily = \"system-ui\" | \"serif\" | \"rounded-sans\" | \"monospace\" | \"handwritten\";\n\nexport interface SheetTheme {\n readonly primaryColor: string;\n readonly backgroundColor?: string;\n readonly backgroundImageUrl?: string;\n readonly cardBackgroundColor: string;\n readonly textColor: string;\n readonly slotShape: SlotShape;\n readonly gridColumns: number;\n readonly unclaimedOpacity?: number;\n readonly completedStampColor?: string;\n readonly fontFamily?: FontFamily;\n}\nexport type ThemePresetId = \"default\" | \"modern_dark\" | \"pop_candy\" | \"retro_craft\" | \"cyber\";\nexport interface ThemePreset<TLocale extends string = SupportedLocale> {\n readonly id: ThemePresetId;\n readonly name: LocalizedString<TLocale>;\n readonly description: LocalizedString<TLocale>;\n readonly theme: SheetTheme;\n}\nexport const DEFAULT_SHEET_THEME: SheetTheme = {\n primaryColor: \"#9e551e\",\n backgroundColor: \"#fbf4df\",\n cardBackgroundColor: \"#fffdf5\",\n textColor: \"#352f25\",\n slotShape: \"rounded\",\n gridColumns: 3,\n unclaimedOpacity: 1,\n fontFamily: \"serif\",\n};\n\nexport interface ExternalReference {\n readonly type: string;\n readonly id: string;\n readonly url?: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\nexport type CheckInCondition =\n | { readonly type: \"qr\"; readonly secretToken: string; readonly qrEntryUrl?: string }\n | { readonly type: \"passcode\"; readonly code: string; readonly caseSensitive?: boolean }\n | {\n readonly type: \"gps\";\n readonly latitude: number;\n readonly longitude: number;\n readonly radiusMeters: number;\n }\n | { readonly type: \"nfc\"; readonly tagId: string }\n | {\n readonly type: \"custom\";\n readonly validatorName: string;\n readonly secretParams?: Readonly<Record<string, unknown>>;\n };\n\nexport type PublicCheckInCondition =\n | { readonly type: \"qr\"; readonly qrEntryUrl?: string }\n | { readonly type: \"passcode\" }\n | {\n readonly type: \"gps\";\n readonly latitude: number;\n readonly longitude: number;\n readonly radiusMeters: number;\n }\n | { readonly type: \"nfc\" }\n | { readonly type: \"custom\"; readonly validatorName: string };\n\nexport interface SpotItem<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly id: string;\n readonly orderIndex: number;\n readonly name: LocalizedText<TLocale>;\n readonly description?: LocalizedText<TLocale>;\n readonly hint?: LocalizedText<TLocale>;\n readonly imageUrl?: string;\n readonly iconUrl?: string;\n readonly redirectUrlAfterClaim?: string;\n readonly externalReferences?: ReadonlyArray<ExternalReference>;\n readonly metadata?: TMeta;\n readonly conditions: ReadonlyArray<CheckInCondition>;\n readonly prerequisites?: ReadonlyArray<string>;\n}\nexport type PublicSpotItem<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> = Omit<SpotItem<TLocale, TMeta>, \"conditions\"> & {\n readonly conditions: ReadonlyArray<PublicCheckInCondition>;\n};\n\nexport type RewardUnlockCondition =\n | { readonly type: \"stamp_count\"; readonly count: number }\n | { readonly type: \"stamps\"; readonly stampIds: ReadonlyArray<string> }\n | { readonly type: \"all\" | \"any\"; readonly conditions: ReadonlyArray<RewardUnlockCondition> };\nexport type RewardType = \"digital\" | \"in_person\";\nexport type RedemptionMethod = \"manual_slide\" | \"staff_passcode\" | \"view_only\" | \"server_claim\";\nexport type InventoryAggregationMode = \"shared\" | \"per_reward\";\nexport type RallyInventory = Readonly<Record<string, number>> & {\n readonly sharedStock?: number;\n};\nexport interface RallyInventoryState {\n readonly sharedRemaining?: number;\n readonly rewardRemaining?: Readonly<Record<string, number>>;\n}\nexport interface Reward<TLocale extends string = string> {\n readonly id: string;\n readonly title: LocalizedText<TLocale>;\n readonly description?: LocalizedText<TLocale>;\n readonly type: RewardType;\n readonly redemptionMethod: RedemptionMethod;\n readonly requiredStampCount: number;\n readonly conditions?: ReadonlyArray<RewardUnlockCondition>;\n readonly digitalContentUrl?: string;\n readonly staffPasscode?: string;\n readonly validUntil?: string;\n readonly stockLimit?: number;\n readonly userClaimLimit?: number;\n /** Explicit primary inventory key. Defaults to the reward id. */\n readonly stockKey?: string;\n /** Optional second inventory bucket that must be decremented atomically. */\n readonly secondaryStockKey?: string;\n}\nexport type PublicReward<TLocale extends string = string> = Omit<\n Reward<TLocale>,\n \"digitalContentUrl\" | \"staffPasscode\"\n>;\n\nexport interface AdminRallyConfig<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly id: string;\n readonly version: string;\n readonly title: LocalizedText<TLocale>;\n readonly description?: LocalizedText<TLocale>;\n readonly theme?: SheetTheme;\n readonly spots: ReadonlyArray<SpotItem<TLocale, TMeta>>;\n readonly rewards: ReadonlyArray<Reward<TLocale>>;\n readonly staffPasscode?: string;\n readonly inventory?: RallyInventory;\n /** How the optional top-level inventory limit is aggregated. */\n readonly inventoryMode?: InventoryAggregationMode;\n readonly serverMetadata?: Readonly<Record<string, unknown>>;\n readonly metadata?: TMeta;\n /** Explicit public metadata name. `metadata` remains supported for compatibility. */\n readonly publicMetadata?: TMeta;\n readonly serverEndpoint?: string;\n}\nexport interface PublicRallyConfig<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly id: string;\n readonly version: string;\n readonly title: LocalizedText<TLocale>;\n readonly description?: LocalizedText<TLocale>;\n readonly theme?: SheetTheme;\n readonly spots: ReadonlyArray<PublicSpotItem<TLocale, TMeta>>;\n readonly rewards: ReadonlyArray<PublicReward<TLocale>>;\n readonly metadata?: TMeta;\n readonly serverEndpoint?: string;\n}\nexport type RallyConfig<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> = PublicRallyConfig<TLocale, TMeta>;\n\nfunction publicCondition(condition: CheckInCondition): PublicCheckInCondition {\n switch (condition.type) {\n case \"qr\":\n return condition.qrEntryUrl === undefined\n ? { type: \"qr\" }\n : { type: \"qr\", qrEntryUrl: condition.qrEntryUrl };\n case \"passcode\":\n return { type: \"passcode\" };\n case \"gps\":\n return {\n type: \"gps\",\n latitude: condition.latitude,\n longitude: condition.longitude,\n radiusMeters: condition.radiusMeters,\n };\n case \"nfc\":\n return { type: \"nfc\" };\n case \"custom\":\n return { type: \"custom\", validatorName: condition.validatorName };\n }\n}\nexport function toPublicConfig<TLocale extends string, TMeta extends Record<string, unknown>>(\n config: AdminRallyConfig<TLocale, TMeta>,\n): PublicRallyConfig<TLocale, TMeta> {\n return {\n id: config.id,\n version: config.version,\n title: config.title,\n ...(config.description === undefined ? {} : { description: config.description }),\n ...(config.theme === undefined ? {} : { theme: config.theme }),\n spots: config.spots.map((spot) => ({\n ...spot,\n conditions: spot.conditions.map(publicCondition),\n })),\n rewards: config.rewards.map(\n ({ digitalContentUrl: _content, staffPasscode: _passcode, ...reward }) => reward,\n ),\n ...(config.publicMetadata !== undefined\n ? { metadata: config.publicMetadata }\n : config.metadata === undefined\n ? {}\n : { metadata: config.metadata }),\n ...(config.serverEndpoint === undefined ? {} : { serverEndpoint: config.serverEndpoint }),\n };\n}\nexport function assertPublicConfig(config: unknown): asserts config is PublicRallyConfig {\n if (!isPublicConfig(config)) throw new Error(\"Configuration contains private rally fields.\");\n}\nexport function isPublicConfig(value: unknown): value is PublicRallyConfig {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const candidate = value as Record<string, unknown>;\n const seen = new Set<object>();\n const containsPrivateField = (item: unknown): boolean => {\n if (typeof item !== \"object\" || item === null) return false;\n if (seen.has(item)) return false;\n seen.add(item);\n if (Array.isArray(item)) return item.some(containsPrivateField);\n const record = item as Record<string, unknown>;\n if (\n [\"staffPasscode\", \"secretToken\", \"serverMetadata\", \"secretParams\", \"digitalContentUrl\"].some(\n (key) => key in record,\n )\n )\n return true;\n return Object.values(record).some(containsPrivateField);\n };\n if (containsPrivateField(candidate)) return false;\n for (const key of [\n \"staffPasscode\",\n \"secretToken\",\n \"serverMetadata\",\n \"secretParams\",\n \"code\",\n \"tagId\",\n ]) {\n if (key in candidate) return false;\n }\n if (\n typeof candidate.id !== \"string\" ||\n typeof candidate.version !== \"string\" ||\n (typeof candidate.title !== \"string\" &&\n (typeof candidate.title !== \"object\" ||\n candidate.title === null ||\n Array.isArray(candidate.title))) ||\n !Array.isArray(candidate.spots) ||\n !Array.isArray(candidate.rewards)\n )\n return false;\n return (\n candidate.spots.every((spot) => {\n if (typeof spot !== \"object\" || spot === null || Array.isArray(spot)) return false;\n const item = spot as Record<string, unknown>;\n if (\n typeof item.id !== \"string\" ||\n typeof item.orderIndex !== \"number\" ||\n item.name === undefined ||\n \"secretToken\" in item ||\n \"code\" in item ||\n \"tagId\" in item ||\n \"secretParams\" in item\n )\n return false;\n return (\n Array.isArray(item.conditions) &&\n item.conditions.every((condition) => {\n if (typeof condition !== \"object\" || condition === null || Array.isArray(condition))\n return false;\n const value = condition as Record<string, unknown>;\n if (\n \"secretToken\" in value ||\n \"code\" in value ||\n \"tagId\" in value ||\n \"secretParams\" in value\n )\n return false;\n const type = value.type;\n if (type === \"qr\" || type === \"passcode\" || type === \"nfc\") return true;\n if (type === \"custom\") return typeof value.validatorName === \"string\";\n return (\n type === \"gps\" &&\n typeof value.latitude === \"number\" &&\n typeof value.longitude === \"number\" &&\n typeof value.radiusMeters === \"number\"\n );\n })\n );\n }) &&\n candidate.rewards.every((reward) => {\n if (typeof reward !== \"object\" || reward === null || Array.isArray(reward)) return false;\n const item = reward as Record<string, unknown>;\n return (\n typeof item.id === \"string\" &&\n typeof item.requiredStampCount === \"number\" &&\n (item.type === \"digital\" || item.type === \"in_person\") &&\n (item.redemptionMethod === \"manual_slide\" ||\n item.redemptionMethod === \"staff_passcode\" ||\n item.redemptionMethod === \"view_only\" ||\n item.redemptionMethod === \"server_claim\") &&\n !(\"staffPasscode\" in item || \"digitalContentUrl\" in item)\n );\n })\n );\n}\n\nexport interface StampRecord {\n readonly stampId: string;\n readonly acquiredAt: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\nexport type SpotStatus = \"UNCLAIMED\" | \"CLAIMED\" | \"LOCKED\" | \"VERIFYING\";\nexport type RewardStatus = \"LOCKED\" | \"AVAILABLE\" | \"CONSUMED\" | \"EXPIRED\";\nexport interface RewardState {\n readonly rewardId: string;\n readonly status: RewardStatus;\n readonly unlockedAt?: string;\n readonly consumedAt?: string;\n readonly consumedByStaffId?: string;\n readonly claimTicketNumber?: string;\n readonly redeemedCount?: number;\n readonly userRedemptionCount?: number;\n}\nexport interface StampRallyState {\n readonly rallyId: string;\n readonly userId: string | null;\n readonly records: ReadonlyArray<StampRecord>;\n readonly rewards: ReadonlyArray<RewardState>;\n readonly inventory?: RallyInventoryState;\n readonly updatedAt: string;\n}\nexport type UserRallyState = StampRallyState;\n","import type {\n AdminRallyConfig,\n PublicRallyConfig,\n PublicSpotItem,\n Reward,\n SpotItem,\n} from \"./models.js\";\nimport { toPublicConfig } from \"./models.js\";\n\n/** Keys that must never cross the public configuration boundary. */\nconst PRIVATE_KEYS = new Set([\n \"staffPasscode\",\n \"serverMetadata\",\n \"inventory\",\n \"secretToken\",\n \"secretParams\",\n \"digitalContentUrl\",\n \"code\",\n \"tagId\",\n]);\n\nconst SENSITIVE_KEY_PATTERN =\n /^(?:api[_-]?key|access[_-]?token|auth[_-]?token|password|private[_-]?key|secret)$/i;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isPrivateKey(key: string): boolean {\n return PRIVATE_KEYS.has(key) || SENSITIVE_KEY_PATTERN.test(key);\n}\n\nfunction sanitizeValue(\n value: unknown,\n customFilter: ((key: string, value: unknown) => boolean) | undefined,\n seen: WeakSet<object>,\n): unknown {\n if (Array.isArray(value)) {\n if (seen.has(value)) return undefined;\n seen.add(value);\n const items = value\n .map((item) => sanitizeValue(item, customFilter, seen))\n .filter((item): item is unknown => item !== undefined);\n return items;\n }\n if (!isRecord(value)) return value;\n if (seen.has(value)) return undefined;\n seen.add(value);\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n if (isPrivateKey(key) || customFilter?.(key, item) === false) continue;\n const sanitized = sanitizeValue(item, customFilter, seen);\n if (sanitized !== undefined) result[key] = sanitized;\n }\n return result;\n}\n\nfunction sanitizeSpot<TLocale extends string, TMeta extends Record<string, unknown>>(\n spot: SpotItem<TLocale, TMeta>,\n customFilter: ((key: string, value: unknown) => boolean) | undefined,\n): PublicSpotItem<TLocale, TMeta> {\n return sanitizeValue(\n toPublicConfig({\n id: \"__spot__\",\n version: \"1\",\n title: \"__spot__\",\n spots: [spot],\n rewards: [],\n }).spots[0],\n customFilter,\n new WeakSet<object>(),\n ) as PublicSpotItem<TLocale, TMeta>;\n}\n\nfunction sanitizeReward<TLocale extends string>(\n reward: Reward<TLocale>,\n customFilter: ((key: string, value: unknown) => boolean) | undefined,\n): PublicRallyConfig<TLocale>[\"rewards\"][number] {\n return sanitizeValue(\n toPublicConfig({\n id: \"__reward__\",\n version: \"1\",\n title: \"__reward__\",\n spots: [],\n rewards: [reward],\n }).rewards[0],\n customFilter,\n new WeakSet<object>(),\n ) as PublicRallyConfig<TLocale>[\"rewards\"][number];\n}\n\n/**\n * Creates the client-facing configuration and removes private values at every\n * nesting level. `customFilter` is an allow-list predicate: returning false\n * removes that key.\n */\nexport function sanitizeAdminConfig<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n>(\n admin: AdminRallyConfig<TLocale, TMeta>,\n customFilter?: (key: string, value: unknown) => boolean,\n): PublicRallyConfig<TLocale, TMeta> {\n const publicConfig = toPublicConfig(admin);\n const sanitized = sanitizeValue(publicConfig, customFilter, new WeakSet<object>()) as Record<\n string,\n unknown\n >;\n sanitized.spots = admin.spots.map((spot) => sanitizeSpot(spot, customFilter));\n sanitized.rewards = admin.rewards.map((reward) => sanitizeReward(reward, customFilter));\n return sanitized as unknown as PublicRallyConfig<TLocale, TMeta>;\n}\n\nexport interface PublicConfigSafety {\n readonly safe: boolean;\n readonly leakedKeys: string[];\n}\n\n/** Finds private keys, including keys nested in metadata or custom values. */\nexport function validatePublicConfigSafety(publicConfig: PublicRallyConfig): PublicConfigSafety {\n const leakedKeys: string[] = [];\n const seen = new WeakSet<object>();\n const visit = (value: unknown, path: string): void => {\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n visit(item, `${path}[${index}]`);\n });\n return;\n }\n if (!isRecord(value) || seen.has(value)) return;\n seen.add(value);\n for (const [key, item] of Object.entries(value)) {\n const nextPath = path === \"$\" ? key : `${path}.${key}`;\n if (isPrivateKey(key)) leakedKeys.push(nextPath);\n visit(item, nextPath);\n }\n };\n visit(publicConfig, \"$\");\n return { safe: leakedKeys.length === 0, leakedKeys };\n}\n","import type { LocalizedString, LocalizedText, SupportedLocale } from \"./models.js\";\n\nexport function updateLocalizedField<TLocale extends string>(\n current: LocalizedText<TLocale> | undefined,\n locale: TLocale,\n newValue: string,\n): LocalizedText<TLocale> {\n if (typeof current === \"string\" || current === undefined)\n return { [locale]: newValue } as LocalizedText<TLocale>;\n return { ...current, [locale]: newValue };\n}\n\nexport function resolveLocalizedText<TLocale extends string = SupportedLocale>(\n text: LocalizedText<TLocale> | undefined,\n locale: string,\n fallbackLocale?: string,\n): string {\n if (text === undefined || text === \"\") return \"\";\n if (typeof text === \"string\") return text;\n const fallback =\n fallbackLocale === undefined\n ? Object.values(text).find((value): value is string => typeof value === \"string\")\n : text[fallbackLocale as TLocale];\n return text[locale as TLocale] || fallback || \"\";\n}\n\nexport function toLocalizedString(text: LocalizedText | undefined): LocalizedString;\nexport function toLocalizedString<TLocale extends string>(\n text: LocalizedText<TLocale> | undefined,\n): LocalizedString<TLocale>;\nexport function toLocalizedString<TLocale extends string>(\n text: LocalizedText<TLocale> | undefined,\n): LocalizedString<TLocale> {\n if (text === undefined) return { ja: \"\", en: \"\" } as LocalizedString<TLocale>;\n return typeof text === \"string\"\n ? ({ ja: text, en: \"\" } as LocalizedString<TLocale>)\n : ({\n ja: text[\"ja\" as TLocale] ?? \"\",\n en: text[\"en\" as TLocale] ?? \"\",\n ...text,\n } as LocalizedString<TLocale>);\n}\n","import type { ThemePreset } from \"./models.js\";\n\nexport const THEME_PRESETS: ReadonlyArray<ThemePreset> = [\n {\n id: \"default\",\n name: { ja: \"クラシックブルー\", en: \"Classic Blue\" },\n description: {\n ja: \"青を基調にした、明るく親しみやすい定番デザインです。\",\n en: \"A bright, approachable classic built around a crisp blue palette.\",\n },\n theme: {\n primaryColor: \"#2563eb\",\n backgroundColor: \"#eff6ff\",\n cardBackgroundColor: \"#ffffff\",\n textColor: \"#1e293b\",\n slotShape: \"circle\",\n gridColumns: 3,\n unclaimedOpacity: 1,\n completedStampColor: \"#dc2626\",\n fontFamily: \"serif\",\n },\n },\n {\n id: \"modern_dark\",\n name: { ja: \"モダンダーク\", en: \"Modern Dark\" },\n description: {\n ja: \"深いネイビーとエメラルドでまとめた、洗練されたダークテーマです。\",\n en: \"A polished dark theme pairing deep navy with emerald accents.\",\n },\n theme: {\n primaryColor: \"#10b981\",\n backgroundColor: \"#0f172a\",\n cardBackgroundColor: \"#1e293b\",\n textColor: \"#f8fafc\",\n slotShape: \"rounded\",\n gridColumns: 3,\n unclaimedOpacity: 1,\n completedStampColor: \"#34d399\",\n fontFamily: \"system-ui\",\n },\n },\n {\n id: \"pop_candy\",\n name: { ja: \"ポップキャンディ\", en: \"Pop Candy\" },\n description: {\n ja: \"ピンクを主役にした、楽しく華やかなキャンディカラーテーマです。\",\n en: \"A playful candy-colored theme with vivid pink at center stage.\",\n },\n theme: {\n primaryColor: \"#ec4899\",\n backgroundColor: \"#fdf2f8\",\n cardBackgroundColor: \"#ffffff\",\n textColor: \"#831843\",\n slotShape: \"circle\",\n gridColumns: 2,\n unclaimedOpacity: 1,\n completedStampColor: \"#f43f5e\",\n fontFamily: \"rounded-sans\",\n },\n },\n {\n id: \"retro_craft\",\n name: { ja: \"レトロクラフト\", en: \"Retro Craft\" },\n description: {\n ja: \"クラフト紙と赤茶色のインクを思わせる、温かみのあるレトロテーマです。\",\n en: \"A warm retro theme inspired by craft paper and earthy red ink.\",\n },\n theme: {\n primaryColor: \"#9a3412\",\n backgroundColor: \"#fef3c7\",\n cardBackgroundColor: \"#fffbeb\",\n textColor: \"#78350f\",\n slotShape: \"square\",\n gridColumns: 3,\n unclaimedOpacity: 1,\n completedStampColor: \"#b91c1c\",\n fontFamily: \"handwritten\",\n },\n },\n {\n id: \"cyber\",\n name: { ja: \"サイバーネオン\", en: \"Cyber Neon\" },\n description: {\n ja: \"シアンと紫のネオンが映える、シャープな近未来テーマです。\",\n en: \"A sharp futuristic theme illuminated by cyan and violet neon.\",\n },\n theme: {\n primaryColor: \"#06b6d4\",\n backgroundColor: \"#09090b\",\n cardBackgroundColor: \"#18181b\",\n textColor: \"#fafafa\",\n slotShape: \"square\",\n gridColumns: 4,\n unclaimedOpacity: 1,\n completedStampColor: \"#a855f7\",\n fontFamily: \"monospace\",\n },\n },\n];\n","import type {\n AdminRallyConfig,\n CheckInCondition,\n PublicRallyConfig,\n Reward,\n RewardUnlockCondition,\n SheetTheme,\n} from \"./models.js\";\n\nexport interface ValidationError {\n readonly path: string;\n readonly message: string;\n readonly code: string;\n}\n\nexport type ParseResult<T> =\n | { readonly success: true; readonly data: T }\n | { readonly success: false; readonly errors: ReadonlyArray<ValidationError> };\n\nexport class ConfigValidationError extends Error {\n readonly name = \"ConfigValidationError\";\n constructor(readonly errors: ReadonlyArray<ValidationError>) {\n super(errors.map((error) => `${error.path}: ${error.message}`).join(\"; \"));\n }\n}\n\ntype RecordValue = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is RecordValue {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasOwn(value: RecordValue, key: string): boolean {\n return Object.hasOwn(value, key);\n}\n\nfunction add(errors: ValidationError[], path: string, message: string, code: string): void {\n errors.push({ path, message, code });\n}\n\nfunction requiredString(\n value: RecordValue,\n key: string,\n path: string,\n errors: ValidationError[],\n): boolean {\n if (typeof value[key] !== \"string\" || value[key].length === 0) {\n add(errors, `${path}.${key}`, \"A non-empty string is required.\", \"required_string\");\n return false;\n }\n return true;\n}\n\nfunction optionalString(\n value: RecordValue,\n key: string,\n path: string,\n errors: ValidationError[],\n): void {\n if (hasOwn(value, key) && value[key] !== undefined && typeof value[key] !== \"string\")\n add(errors, `${path}.${key}`, \"Expected a string.\", \"invalid_type\");\n}\n\nfunction optionalBoolean(\n value: RecordValue,\n key: string,\n path: string,\n errors: ValidationError[],\n): void {\n if (hasOwn(value, key) && value[key] !== undefined && typeof value[key] !== \"boolean\")\n add(errors, `${path}.${key}`, \"Expected a boolean.\", \"invalid_type\");\n}\n\nfunction finiteNumber(\n value: RecordValue,\n key: string,\n path: string,\n errors: ValidationError[],\n minimum?: number,\n): void {\n const item = value[key];\n if (typeof item !== \"number\" || !Number.isFinite(item)) {\n add(errors, `${path}.${key}`, \"Expected a finite number.\", \"invalid_number\");\n } else if (minimum !== undefined && item < minimum) {\n add(\n errors,\n `${path}.${key}`,\n `Expected a number greater than or equal to ${minimum}.`,\n \"out_of_range\",\n );\n }\n}\n\nfunction nonNegativeInteger(\n value: RecordValue,\n key: string,\n path: string,\n errors: ValidationError[],\n): void {\n const item = value[key];\n if (typeof item !== \"number\" || !Number.isFinite(item)) {\n add(errors, `${path}.${key}`, \"Expected a finite number.\", \"invalid_number\");\n return;\n }\n if (!Number.isInteger(item)) {\n add(errors, `${path}.${key}`, \"Expected a non-negative integer.\", \"invalid_integer\");\n return;\n }\n if (item < 0) add(errors, `${path}.${key}`, \"Expected a non-negative integer.\", \"out_of_range\");\n}\n\nfunction localizedText(value: unknown, path: string, errors: ValidationError[]): void {\n if (typeof value === \"string\") return;\n if (!isRecord(value)) {\n add(errors, path, \"Expected a string or a locale map.\", \"invalid_localized_text\");\n return;\n }\n for (const [locale, text] of Object.entries(value)) {\n if (typeof text !== \"string\")\n add(errors, `${path}.${locale}`, \"Expected a string.\", \"invalid_type\");\n }\n}\n\nfunction theme(value: unknown, path: string, errors: ValidationError[]): void {\n if (!isRecord(value)) {\n add(errors, path, \"Expected a theme object.\", \"invalid_type\");\n return;\n }\n for (const key of [\"primaryColor\", \"cardBackgroundColor\", \"textColor\"])\n requiredString(value, key, path, errors);\n optionalString(value, \"backgroundColor\", path, errors);\n optionalString(value, \"backgroundImageUrl\", path, errors);\n optionalString(value, \"completedStampColor\", path, errors);\n optionalString(value, \"fontFamily\", path, errors);\n const slotShape = value.slotShape;\n if (slotShape !== \"circle\" && slotShape !== \"square\" && slotShape !== \"rounded\")\n add(errors, `${path}.slotShape`, \"Expected circle, square, or rounded.\", \"invalid_enum\");\n finiteNumber(value, \"gridColumns\", path, errors, 1);\n if (typeof value.gridColumns === \"number\" && !Number.isInteger(value.gridColumns))\n add(errors, `${path}.gridColumns`, \"Expected an integer.\", \"invalid_integer\");\n if (hasOwn(value, \"unclaimedOpacity\")) {\n finiteNumber(value, \"unclaimedOpacity\", path, errors, 0);\n if (typeof value.unclaimedOpacity === \"number\" && value.unclaimedOpacity > 1)\n add(errors, `${path}.unclaimedOpacity`, \"Expected a value between 0 and 1.\", \"out_of_range\");\n }\n}\n\nfunction externalReferences(value: unknown, path: string, errors: ValidationError[]): void {\n if (!Array.isArray(value)) {\n add(errors, path, \"Expected an array.\", \"invalid_type\");\n return;\n }\n value.forEach((item, index) => {\n const itemPath = `${path}[${index}]`;\n if (!isRecord(item)) {\n add(errors, itemPath, \"Expected an object.\", \"invalid_type\");\n return;\n }\n requiredString(item, \"type\", itemPath, errors);\n requiredString(item, \"id\", itemPath, errors);\n optionalString(item, \"url\", itemPath, errors);\n });\n}\n\nfunction condition(\n value: unknown,\n path: string,\n errors: ValidationError[],\n isPublic: boolean,\n): void {\n if (!isRecord(value)) {\n add(errors, path, \"Expected a condition object.\", \"invalid_type\");\n return;\n }\n const type = value.type;\n if (type === \"qr\") {\n if (isPublic) {\n if (hasOwn(value, \"secretToken\"))\n add(errors, `${path}.secretToken`, \"Private field is not allowed.\", \"private_field\");\n } else requiredString(value, \"secretToken\", path, errors);\n optionalString(value, \"qrEntryUrl\", path, errors);\n return;\n }\n if (type === \"passcode\") {\n if (isPublic) {\n for (const key of [\"code\", \"caseSensitive\"])\n if (hasOwn(value, key))\n add(errors, `${path}.${key}`, \"Private field is not allowed.\", \"private_field\");\n } else {\n requiredString(value, \"code\", path, errors);\n optionalBoolean(value, \"caseSensitive\", path, errors);\n }\n return;\n }\n if (type === \"gps\") {\n finiteNumber(value, \"latitude\", path, errors);\n finiteNumber(value, \"longitude\", path, errors);\n finiteNumber(value, \"radiusMeters\", path, errors, 0);\n if (typeof value.radiusMeters === \"number\" && value.radiusMeters <= 0)\n add(errors, `${path}.radiusMeters`, \"Expected a radius greater than 0.\", \"out_of_range\");\n if (typeof value.latitude === \"number\" && (value.latitude < -90 || value.latitude > 90))\n add(errors, `${path}.latitude`, \"Expected a latitude between -90 and 90.\", \"out_of_range\");\n if (typeof value.longitude === \"number\" && (value.longitude < -180 || value.longitude > 180))\n add(\n errors,\n `${path}.longitude`,\n \"Expected a longitude between -180 and 180.\",\n \"out_of_range\",\n );\n return;\n }\n if (type === \"nfc\") {\n if (isPublic) {\n if (hasOwn(value, \"tagId\"))\n add(errors, `${path}.tagId`, \"Private field is not allowed.\", \"private_field\");\n } else requiredString(value, \"tagId\", path, errors);\n return;\n }\n if (type === \"custom\") {\n requiredString(value, \"validatorName\", path, errors);\n if (isPublic && hasOwn(value, \"secretParams\"))\n add(errors, `${path}.secretParams`, \"Private field is not allowed.\", \"private_field\");\n if (!isPublic && hasOwn(value, \"secretParams\") && !isRecord(value.secretParams))\n add(errors, `${path}.secretParams`, \"Expected an object.\", \"invalid_type\");\n return;\n }\n add(errors, `${path}.type`, \"Unknown condition type.\", \"invalid_enum\");\n}\n\nfunction unlockCondition(value: unknown, path: string, errors: ValidationError[]): void {\n if (!isRecord(value)) {\n add(errors, path, \"Expected an unlock condition object.\", \"invalid_type\");\n return;\n }\n if (value.type === \"stamp_count\") {\n finiteNumber(value, \"count\", path, errors, 0);\n return;\n }\n if (value.type === \"stamps\") {\n if (!Array.isArray(value.stampIds))\n add(errors, `${path}.stampIds`, \"Expected an array.\", \"invalid_type\");\n else\n value.stampIds.forEach((item, index) => {\n if (typeof item !== \"string\" || item.length === 0)\n add(\n errors,\n `${path}.stampIds[${index}]`,\n \"Expected a non-empty string.\",\n \"required_string\",\n );\n });\n return;\n }\n if (value.type === \"all\" || value.type === \"any\") {\n if (!Array.isArray(value.conditions))\n add(errors, `${path}.conditions`, \"Expected an array.\", \"invalid_type\");\n else\n value.conditions.forEach((item, index) => {\n unlockCondition(item, `${path}.conditions[${index}]`, errors);\n });\n return;\n }\n add(errors, `${path}.type`, \"Unknown unlock condition type.\", \"invalid_enum\");\n}\n\nfunction spot(value: unknown, path: string, errors: ValidationError[], isPublic: boolean): void {\n if (!isRecord(value)) {\n add(errors, path, \"Expected a spot object.\", \"invalid_type\");\n return;\n }\n requiredString(value, \"id\", path, errors);\n finiteNumber(value, \"orderIndex\", path, errors, 0);\n if (typeof value.orderIndex === \"number\" && !Number.isInteger(value.orderIndex))\n add(errors, `${path}.orderIndex`, \"Expected an integer.\", \"invalid_integer\");\n localizedText(value.name, `${path}.name`, errors);\n for (const key of [\"description\", \"hint\"])\n if (hasOwn(value, key)) localizedText(value[key], `${path}.${key}`, errors);\n for (const key of [\"imageUrl\", \"iconUrl\", \"redirectUrlAfterClaim\"])\n optionalString(value, key, path, errors);\n if (hasOwn(value, \"externalReferences\") && value.externalReferences !== undefined)\n externalReferences(value.externalReferences, `${path}.externalReferences`, errors);\n if (hasOwn(value, \"prerequisites\") && value.prerequisites !== undefined) {\n if (!Array.isArray(value.prerequisites))\n add(errors, `${path}.prerequisites`, \"Expected an array.\", \"invalid_type\");\n else\n value.prerequisites.forEach((item, index) => {\n if (typeof item !== \"string\" || item.length === 0)\n add(\n errors,\n `${path}.prerequisites[${index}]`,\n \"Expected a non-empty string.\",\n \"required_string\",\n );\n });\n }\n if (!Array.isArray(value.conditions))\n add(errors, `${path}.conditions`, \"Expected an array.\", \"invalid_type\");\n else\n value.conditions.forEach((item, index) => {\n condition(item, `${path}.conditions[${index}]`, errors, isPublic);\n });\n}\n\nfunction reward(value: unknown, path: string, errors: ValidationError[], isPublic: boolean): void {\n if (!isRecord(value)) {\n add(errors, path, \"Expected a reward object.\", \"invalid_type\");\n return;\n }\n requiredString(value, \"id\", path, errors);\n localizedText(value.title, `${path}.title`, errors);\n if (hasOwn(value, \"description\")) localizedText(value.description, `${path}.description`, errors);\n if (value.type !== \"digital\" && value.type !== \"in_person\")\n add(errors, `${path}.type`, \"Unknown reward type.\", \"invalid_enum\");\n if (\n ![\"manual_slide\", \"staff_passcode\", \"view_only\", \"server_claim\"].includes(\n String(value.redemptionMethod),\n )\n )\n add(errors, `${path}.redemptionMethod`, \"Unknown redemption method.\", \"invalid_enum\");\n nonNegativeInteger(value, \"requiredStampCount\", path, errors);\n for (const key of [\"stockLimit\", \"userClaimLimit\"]) {\n if (hasOwn(value, key) && value[key] !== undefined) {\n nonNegativeInteger(value, key, path, errors);\n }\n }\n optionalString(value, \"stockKey\", path, errors);\n optionalString(value, \"secondaryStockKey\", path, errors);\n optionalString(value, \"validUntil\", path, errors);\n if (typeof value.validUntil === \"string\" && Number.isNaN(Date.parse(value.validUntil)))\n add(errors, `${path}.validUntil`, \"Expected a valid date string.\", \"invalid_date\");\n if (isPublic) {\n for (const key of [\"staffPasscode\", \"digitalContentUrl\"])\n if (hasOwn(value, key))\n add(errors, `${path}.${key}`, \"Private field is not allowed.\", \"private_field\");\n } else {\n optionalString(value, \"staffPasscode\", path, errors);\n optionalString(value, \"digitalContentUrl\", path, errors);\n }\n if (hasOwn(value, \"conditions\") && value.conditions !== undefined) {\n if (!Array.isArray(value.conditions))\n add(errors, `${path}.conditions`, \"Expected an array.\", \"invalid_type\");\n else\n value.conditions.forEach((item, index) => {\n unlockCondition(item, `${path}.conditions[${index}]`, errors);\n });\n }\n}\n\nfunction validate(value: unknown, isPublic: boolean): ReadonlyArray<ValidationError> {\n const errors: ValidationError[] = [];\n if (!isRecord(value)) {\n add(errors, \"$\", \"Expected a configuration object.\", \"invalid_type\");\n return errors;\n }\n requiredString(value, \"id\", \"$\", errors);\n requiredString(value, \"version\", \"$\", errors);\n localizedText(value.title, \"$.title\", errors);\n if (hasOwn(value, \"description\")) localizedText(value.description, \"$.description\", errors);\n if (hasOwn(value, \"theme\") && value.theme !== undefined) theme(value.theme, \"$.theme\", errors);\n if (!Array.isArray(value.spots)) add(errors, \"spots\", \"Expected an array.\", \"invalid_type\");\n else\n value.spots.forEach((item, index) => {\n spot(item, `spots[${index}]`, errors, isPublic);\n });\n if (!Array.isArray(value.rewards)) add(errors, \"rewards\", \"Expected an array.\", \"invalid_type\");\n else\n value.rewards.forEach((item, index) => {\n reward(item, `rewards[${index}]`, errors, isPublic);\n });\n if (!isPublic) {\n optionalString(value, \"staffPasscode\", \"$\", errors);\n if (hasOwn(value, \"inventory\") && value.inventory !== undefined) {\n if (!isRecord(value.inventory))\n add(errors, \"$.inventory\", \"Expected an object.\", \"invalid_type\");\n else {\n for (const [key, item] of Object.entries(value.inventory)) {\n if (key === \"global\") {\n add(\n errors,\n \"$.inventory.global\",\n \"Use sharedStock instead of global.\",\n \"deprecated_field\",\n );\n continue;\n }\n if (item !== undefined) nonNegativeInteger(value.inventory, key, \"$.inventory\", errors);\n }\n if (hasOwn(value.inventory, \"sharedStock\") && hasOwn(value.inventory, \"global\"))\n add(\n errors,\n \"$.inventory\",\n \"sharedStock and global cannot be configured together.\",\n \"conflicting_fields\",\n );\n }\n }\n if (\n hasOwn(value, \"inventoryMode\") &&\n value.inventoryMode !== undefined &&\n value.inventoryMode !== \"shared\" &&\n value.inventoryMode !== \"per_reward\"\n )\n add(errors, \"$.inventoryMode\", \"Expected shared or per_reward.\", \"invalid_enum\");\n if (\n hasOwn(value, \"serverMetadata\") &&\n value.serverMetadata !== undefined &&\n !isRecord(value.serverMetadata)\n )\n add(errors, \"$.serverMetadata\", \"Expected an object.\", \"invalid_type\");\n if (\n hasOwn(value, \"publicMetadata\") &&\n value.publicMetadata !== undefined &&\n !isRecord(value.publicMetadata)\n )\n add(errors, \"$.publicMetadata\", \"Expected an object.\", \"invalid_type\");\n optionalString(value, \"serverEndpoint\", \"$\", errors);\n } else {\n for (const key of [\"staffPasscode\", \"serverMetadata\", \"inventory\", \"inventoryMode\"])\n if (hasOwn(value, key))\n add(errors, `$.${key}`, \"Private field is not allowed.\", \"private_field\");\n optionalString(value, \"serverEndpoint\", \"$\", errors);\n }\n return errors;\n}\n\n/** Validates relationships that can only be checked after all entities exist. */\nexport function validateRallyConfigRelations(\n config: AdminRallyConfig | PublicRallyConfig,\n): ReadonlyArray<ValidationError> {\n const errors: ValidationError[] = [];\n const spotIds = new Set<string>();\n const rewardIds = new Set<string>();\n const orderIndexes = new Map<number, number>();\n\n config.spots.forEach((spot, index) => {\n if (spotIds.has(spot.id))\n add(errors, `spots[${index}].id`, \"Spot ID must be unique.\", \"duplicate_spot_id\");\n spotIds.add(spot.id);\n const previousIndex = orderIndexes.get(spot.orderIndex);\n if (previousIndex !== undefined)\n add(\n errors,\n `spots[${index}].orderIndex`,\n `orderIndex duplicates spots[${previousIndex}].`,\n \"duplicate_order_index\",\n );\n else orderIndexes.set(spot.orderIndex, index);\n if (spot.orderIndex < 0)\n add(\n errors,\n `spots[${index}].orderIndex`,\n \"orderIndex must not be negative.\",\n \"negative_order_index\",\n );\n spot.prerequisites?.forEach((prerequisite, prerequisiteIndex) => {\n if (\n !spotIds.has(prerequisite) &&\n !config.spots.some((candidate) => candidate.id === prerequisite)\n )\n add(\n errors,\n `spots[${index}].prerequisites[${prerequisiteIndex}]`,\n \"Prerequisite spot does not exist.\",\n \"missing_prerequisite\",\n );\n });\n });\n\n config.rewards.forEach((reward, index) => {\n if (rewardIds.has(reward.id))\n add(errors, `rewards[${index}].id`, \"Reward ID must be unique.\", \"duplicate_reward_id\");\n rewardIds.add(reward.id);\n const visit = (condition: RewardUnlockCondition, path: string): void => {\n if (condition.type === \"stamps\")\n condition.stampIds.forEach((stampId, stampIndex) => {\n if (!spotIds.has(stampId))\n add(\n errors,\n `${path}.stampIds[${stampIndex}]`,\n \"Referenced spot does not exist.\",\n \"missing_reward_spot\",\n );\n });\n else if (condition.type === \"all\" || condition.type === \"any\")\n condition.conditions.forEach((nested, nestedIndex) => {\n visit(nested, `${path}.conditions[${nestedIndex}]`);\n });\n };\n reward.conditions?.forEach((condition, conditionIndex) => {\n visit(condition, `rewards[${index}].conditions[${conditionIndex}]`);\n });\n if (reward.requiredStampCount > config.spots.length)\n add(\n errors,\n `rewards[${index}].requiredStampCount`,\n \"requiredStampCount cannot exceed the number of spots.\",\n \"required_stamp_count_exceeds_spots\",\n );\n const inventory = \"inventory\" in config ? config.inventory : undefined;\n for (const [field, key] of [\n [\"stockKey\", reward.stockKey],\n [\"secondaryStockKey\", reward.secondaryStockKey],\n ] as const) {\n if (\n key !== undefined &&\n ((key === \"__shared__\" && inventory?.sharedStock === undefined) ||\n (key !== \"__shared__\" && inventory?.[key] === undefined))\n )\n add(\n errors,\n `rewards[${index}].${field}`,\n \"Referenced inventory key does not exist.\",\n \"missing_inventory_key\",\n );\n }\n });\n\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const cycleNodes = new Set<string>();\n const visitSpot = (spotId: string): void => {\n if (visiting.has(spotId)) {\n cycleNodes.add(spotId);\n return;\n }\n if (visited.has(spotId)) return;\n visiting.add(spotId);\n const spot = config.spots.find((candidate) => candidate.id === spotId);\n spot?.prerequisites?.forEach(visitSpot);\n visiting.delete(spotId);\n visited.add(spotId);\n };\n config.spots.forEach((spot) => {\n visitSpot(spot.id);\n });\n cycleNodes.forEach((spotId) => {\n const index = config.spots.findIndex((spot) => spot.id === spotId);\n add(\n errors,\n `spots[${index}].prerequisites`,\n \"Prerequisites must form a DAG.\",\n \"cyclic_prerequisites\",\n );\n });\n return errors;\n}\n\nexport function safeParseAdminConfig(input: unknown): ParseResult<AdminRallyConfig> {\n const errors: ValidationError[] = [...validate(input, false)];\n if (errors.length === 0) errors.push(...validateRallyConfigRelations(input as AdminRallyConfig));\n return errors.length === 0\n ? { success: true, data: input as AdminRallyConfig }\n : { success: false, errors };\n}\n\nexport function parseAdminConfig(input: unknown): AdminRallyConfig {\n const result = safeParseAdminConfig(input);\n if (!result.success) throw new ConfigValidationError(result.errors);\n return result.data;\n}\n\nexport function safeParsePublicConfig(input: unknown): ParseResult<PublicRallyConfig> {\n const errors: ValidationError[] = [...validate(input, true)];\n if (errors.length === 0) errors.push(...validateRallyConfigRelations(input as PublicRallyConfig));\n return errors.length === 0\n ? { success: true, data: input as PublicRallyConfig }\n : { success: false, errors };\n}\n\nexport function parsePublicConfig(input: unknown): PublicRallyConfig {\n const result = safeParsePublicConfig(input);\n if (!result.success) throw new ConfigValidationError(result.errors);\n return result.data;\n}\n\nexport type {\n AdminRallyConfig,\n CheckInCondition,\n PublicRallyConfig,\n Reward,\n RewardUnlockCondition,\n SheetTheme,\n};\n","export type SnapshotSecretKey = string | Uint8Array;\n\nexport interface SnapshotTokenPayload {\n readonly [key: string]: unknown;\n readonly expiresAt?: string;\n readonly exp?: number;\n}\n\nexport type SnapshotTokenErrorCode =\n | \"MALFORMED\"\n | \"INVALID_SIGNATURE\"\n | \"DECRYPTION_FAILED\"\n | \"EXPIRED\"\n | \"UNSUPPORTED\";\n\nexport interface SnapshotTokenError {\n readonly code: SnapshotTokenErrorCode;\n readonly message: string;\n}\n\nexport type SnapshotTokenVerification<T extends SnapshotTokenPayload = SnapshotTokenPayload> =\n | { readonly ok: true; readonly valid: true; readonly payload: T }\n | { readonly ok: false; readonly valid: false; readonly error: SnapshotTokenError };\n\nconst encoder = new TextEncoder();\n\nfunction cryptoApi(): Crypto {\n if (globalThis.crypto === undefined || globalThis.crypto.subtle === undefined) {\n throw new Error(\"Web Crypto API is unavailable in this environment.\");\n }\n return globalThis.crypto;\n}\n\nfunction secretBytes(secretKey: SnapshotSecretKey): Uint8Array {\n return typeof secretKey === \"string\" ? encoder.encode(secretKey) : new Uint8Array(secretKey);\n}\n\nfunction webCryptoBytes(bytes: Uint8Array): BufferSource {\n return bytes.buffer as ArrayBuffer;\n}\n\nfunction base64Url(bytes: Uint8Array): string {\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return globalThis.btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replace(/=+$/u, \"\");\n}\n\nfunction fromBase64Url(value: string): Uint8Array {\n const base64 = value.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n const padded = `${base64}${\"=\".repeat((4 - (base64.length % 4)) % 4)}`;\n const binary = globalThis.atob(padded);\n return Uint8Array.from(binary, (character) => character.charCodeAt(0));\n}\n\nasync function importHmacKey(secret: Uint8Array): Promise<CryptoKey> {\n return cryptoApi().subtle.importKey(\n \"raw\",\n webCryptoBytes(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\", \"verify\"],\n );\n}\n\nasync function importAesKey(secret: Uint8Array): Promise<CryptoKey> {\n const digest = await cryptoApi().subtle.digest(\"SHA-256\", webCryptoBytes(secret));\n return cryptoApi().subtle.importKey(\"raw\", digest, \"AES-GCM\", false, [\"encrypt\", \"decrypt\"]);\n}\n\nfunction isExpired(payload: SnapshotTokenPayload, now: number): boolean {\n if (typeof payload.exp === \"number\" && now >= payload.exp * 1000) return true;\n return payload.expiresAt !== undefined && Date.parse(payload.expiresAt) <= now;\n}\n\nexport async function createSignedSnapshotToken<T extends SnapshotTokenPayload>(\n payload: T,\n secretKey: SnapshotSecretKey,\n): Promise<string> {\n const api = cryptoApi();\n const secret = secretBytes(secretKey);\n const iv = api.getRandomValues(new Uint8Array(12));\n const plaintext = encoder.encode(JSON.stringify(payload));\n const encrypted = new Uint8Array(\n await api.subtle.encrypt(\n { name: \"AES-GCM\", iv: webCryptoBytes(iv) },\n await importAesKey(secret),\n webCryptoBytes(plaintext),\n ),\n );\n const body = base64Url(new Uint8Array([...iv, ...encrypted]));\n const signature = new Uint8Array(\n await api.subtle.sign(\"HMAC\", await importHmacKey(secret), encoder.encode(body)),\n );\n return `sr2.${body}.${base64Url(signature)}`;\n}\n\nexport async function verifySnapshotToken<T extends SnapshotTokenPayload = SnapshotTokenPayload>(\n token: string,\n secretKey: SnapshotSecretKey,\n now = Date.now(),\n): Promise<SnapshotTokenVerification<T>> {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3 || parts[0] !== \"sr2\") {\n return {\n ok: false,\n valid: false,\n error: { code: \"MALFORMED\", message: \"Snapshot token is malformed.\" },\n };\n }\n const [, body, encodedSignature] = parts;\n if (body === undefined || encodedSignature === undefined) {\n return {\n ok: false,\n valid: false,\n error: { code: \"MALFORMED\", message: \"Snapshot token is malformed.\" },\n };\n }\n const secret = secretBytes(secretKey);\n const validSignature = await cryptoApi().subtle.verify(\n \"HMAC\",\n await importHmacKey(secret),\n webCryptoBytes(fromBase64Url(encodedSignature)),\n webCryptoBytes(encoder.encode(body)),\n );\n if (!validSignature) {\n return {\n ok: false,\n valid: false,\n error: { code: \"INVALID_SIGNATURE\", message: \"Snapshot token signature is invalid.\" },\n };\n }\n const encrypted = fromBase64Url(body);\n if (encrypted.length <= 12) throw new Error(\"Invalid encrypted payload.\");\n const payloadText = await cryptoApi().subtle.decrypt(\n { name: \"AES-GCM\", iv: webCryptoBytes(encrypted.slice(0, 12)) },\n await importAesKey(secret),\n webCryptoBytes(encrypted.slice(12)),\n );\n const payload: unknown = JSON.parse(new TextDecoder().decode(payloadText));\n if (typeof payload !== \"object\" || payload === null || Array.isArray(payload))\n throw new Error(\"Invalid payload.\");\n if (isExpired(payload as SnapshotTokenPayload, now)) {\n return {\n ok: false,\n valid: false,\n error: { code: \"EXPIRED\", message: \"Snapshot token has expired.\" },\n };\n }\n return { ok: true, valid: true, payload: payload as T };\n } catch {\n return {\n ok: false,\n valid: false,\n error: { code: \"DECRYPTION_FAILED\", message: \"Snapshot token could not be verified.\" },\n };\n }\n}\n"]}
|