@stamprally/core 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/engine/evaluate.ts","../src/engine/checkIn.ts","../src/engine/order.ts","../src/engine/progress.ts","../src/engine/rewards.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/client.ts","../src/domain/i18n.ts","../src/domain/validation.ts","../src/domain/migration.ts","../src/domain/models.ts","../src/domain/publicConfig.ts","../src/domain/themePresets.ts","../src/security/snapshotToken.ts"],"names":["condition","DEFAULT_TIMEOUT_MS","record","text","isObject"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n CompositeConditionFailure,\n ConditionMatch,\n ConditionMismatch,\n Result,\n StampCondition,\n VerificationContext,\n} from \"../domain/index.js\";\n\nconst EARTH_RADIUS_METERS = 6_371_000;\n\nfunction toRadians(degrees: number): number {\n return (degrees * Math.PI) / 180;\n}\n\nexport function calculateDistanceMeters(\n latitudeA: number,\n longitudeA: number,\n latitudeB: number,\n longitudeB: number,\n): number {\n const latitudeDelta = toRadians(latitudeB - latitudeA);\n const longitudeDelta = toRadians(longitudeB - longitudeA);\n const latitudeARadians = toRadians(latitudeA);\n const latitudeBRadians = toRadians(latitudeB);\n\n const haversine =\n Math.sin(latitudeDelta / 2) ** 2 +\n Math.cos(latitudeARadians) * Math.cos(latitudeBRadians) * Math.sin(longitudeDelta / 2) ** 2;\n\n return 2 * EARTH_RADIUS_METERS * Math.asin(Math.sqrt(Math.min(1, haversine)));\n}\n\nfunction isValidCoordinate(latitude: number, longitude: number): boolean {\n return (\n Number.isFinite(latitude) &&\n latitude >= -90 &&\n latitude <= 90 &&\n Number.isFinite(longitude) &&\n longitude >= -180 &&\n longitude <= 180\n );\n}\n\nfunction contextTypeMismatch(\n conditionType: Exclude<StampCondition[\"type\"], \"time_window\">,\n expectedContextType: VerificationContext[\"type\"],\n actualContextType: VerificationContext[\"type\"],\n): Result<ConditionMatch, ConditionMismatch> {\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType,\n reason: \"CONTEXT_TYPE_MISMATCH\",\n expectedContextType,\n actualContextType,\n },\n };\n}\n\nfunction assertNever(value: never): never {\n throw new Error(`Unexpected condition: ${JSON.stringify(value)}`);\n}\n\nexport function evaluateConditionDetailed(\n condition: StampCondition,\n context: VerificationContext,\n now: string,\n): Result<ConditionMatch, ConditionMismatch> {\n switch (condition.type) {\n case \"instant\":\n return context.type === \"instant\"\n ? { ok: true, value: { conditionType: \"instant\" } }\n : contextTypeMismatch(\"instant\", \"instant\", context.type);\n case \"token\":\n if (context.type !== \"token\") {\n return contextTypeMismatch(\"token\", \"token\", context.type);\n }\n return context.token === condition.token\n ? { ok: true, value: { conditionType: \"token\" } }\n : {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType: \"token\",\n reason: \"TOKEN_MISMATCH\",\n },\n };\n case \"geo\": {\n if (context.type !== \"geo\") {\n return contextTypeMismatch(\"geo\", \"geo\", context.type);\n }\n if (\n !isValidCoordinate(condition.latitude, condition.longitude) ||\n !isValidCoordinate(context.currentLatitude, context.currentLongitude) ||\n !Number.isFinite(condition.radiusMeters) ||\n condition.radiusMeters < 0\n ) {\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType: \"geo\",\n reason: \"INVALID_GEO_INPUT\",\n },\n };\n }\n\n const distanceMeters = calculateDistanceMeters(\n condition.latitude,\n condition.longitude,\n context.currentLatitude,\n context.currentLongitude,\n );\n if (distanceMeters <= condition.radiusMeters) {\n return { ok: true, value: { conditionType: \"geo\", distanceMeters } };\n }\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType: \"geo\",\n reason: \"OUTSIDE_RADIUS\",\n distanceMeters,\n radiusMeters: condition.radiusMeters,\n differenceMeters: distanceMeters - condition.radiusMeters,\n },\n };\n }\n case \"composite\": {\n if (context.type !== \"composite\") {\n return contextTypeMismatch(\"composite\", \"composite\", context.type);\n }\n if (condition.conditions.length !== context.contexts.length) {\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType: \"composite\",\n reason: \"CONTEXT_LENGTH_MISMATCH\",\n expectedCount: condition.conditions.length,\n actualCount: context.contexts.length,\n },\n };\n }\n\n const failures: CompositeConditionFailure[] = [];\n let matchedCount = 0;\n for (const [index, childCondition] of condition.conditions.entries()) {\n const childContext = context.contexts[index];\n if (childContext === undefined) continue;\n const result = evaluateConditionDetailed(childCondition, childContext, now);\n if (result.ok) matchedCount += 1;\n else failures.push({ index, error: result.error });\n }\n\n if (condition.operator === \"AND\" && failures.length === 0) {\n return { ok: true, value: { conditionType: \"composite\" } };\n }\n if (condition.operator === \"OR\" && matchedCount > 0) {\n return { ok: true, value: { conditionType: \"composite\" } };\n }\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType: \"composite\",\n reason: condition.operator === \"AND\" ? \"AND_CHILD_FAILED\" : \"OR_ALL_FAILED\",\n failures,\n },\n };\n }\n case \"time_window\": {\n const startsAt = Date.parse(condition.startsAt);\n const endsAt = Date.parse(condition.endsAt);\n const currentTime = Date.parse(now);\n if (!Number.isFinite(currentTime)) {\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType: \"time_window\",\n reason: \"INVALID_NOW\",\n now,\n startsAt: condition.startsAt,\n endsAt: condition.endsAt,\n },\n };\n }\n if (!Number.isFinite(startsAt) || !Number.isFinite(endsAt) || startsAt > endsAt) {\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType: \"time_window\",\n reason: \"INVALID_TIME_WINDOW\",\n now,\n startsAt: condition.startsAt,\n endsAt: condition.endsAt,\n },\n };\n }\n if (currentTime < startsAt || currentTime > endsAt) {\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType: \"time_window\",\n reason: currentTime < startsAt ? \"BEFORE_START\" : \"AFTER_END\",\n now,\n startsAt: condition.startsAt,\n endsAt: condition.endsAt,\n },\n };\n }\n const childResult = evaluateConditionDetailed(condition.condition, context, now);\n return childResult.ok ? { ok: true, value: { conditionType: \"time_window\" } } : childResult;\n }\n default:\n return assertNever(condition);\n }\n}\n\nexport function evaluateCondition(\n condition: StampCondition,\n context: VerificationContext,\n now?: string,\n): boolean {\n return evaluateConditionDetailed(condition, context, now ?? \"\").ok;\n}\n","import type { SpotItem, VerificationContext } from \"../domain/index.js\";\nimport { evaluateConditionDetailed } from \"./evaluate.js\";\n\nexport type CheckInErrorCode =\n | \"ORDER_VIOLATION\"\n | \"OUT_OF_RANGE\"\n | \"EXPIRED\"\n | \"INVALID_PROOF\"\n | \"INVALID_CONTEXT\"\n | \"ALREADY_CLAIMED\";\n\nexport interface CheckInContext {\n readonly verificationContext: VerificationContext;\n readonly now?: string;\n readonly expectedStampId?: string;\n readonly proof?: string;\n readonly alreadyClaimed?: boolean;\n}\n\nexport type CheckInInput =\n | VerificationContext\n | (VerificationContext & {\n readonly now?: string;\n readonly expectedStampId?: string;\n readonly alreadyClaimed?: boolean;\n })\n | CheckInContext;\n\nexport type CheckInResult =\n | {\n readonly ok: true;\n readonly success: true;\n readonly stampId: string;\n readonly checkedAt: string;\n }\n | {\n readonly ok: false;\n readonly success: false;\n readonly code: CheckInErrorCode;\n readonly stampId: string;\n readonly message: string;\n };\n\nfunction unwrapContext(input: CheckInInput): {\n readonly context: VerificationContext;\n readonly now: string;\n readonly expectedStampId?: string;\n readonly alreadyClaimed: boolean;\n} {\n if (\"verificationContext\" in input) {\n return {\n context: input.verificationContext,\n now: input.now ?? new Date().toISOString(),\n ...(input.expectedStampId === undefined ? {} : { expectedStampId: input.expectedStampId }),\n alreadyClaimed: input.alreadyClaimed ?? false,\n };\n }\n return {\n context: input,\n now: \"now\" in input && typeof input.now === \"string\" ? input.now : new Date().toISOString(),\n ...(\"expectedStampId\" in input && typeof input.expectedStampId === \"string\"\n ? { expectedStampId: input.expectedStampId }\n : {}),\n alreadyClaimed: \"alreadyClaimed\" in input && input.alreadyClaimed === true,\n };\n}\n\nexport function evaluateCheckIn(spot: SpotItem, input: CheckInInput): CheckInResult {\n const context = unwrapContext(input);\n if (context.alreadyClaimed) {\n return {\n ok: false,\n success: false,\n code: \"ALREADY_CLAIMED\",\n stampId: spot.id,\n message: \"This spot has already been claimed.\",\n };\n }\n if (context.expectedStampId !== undefined && context.expectedStampId !== spot.id) {\n return {\n ok: false,\n success: false,\n code: \"ORDER_VIOLATION\",\n stampId: spot.id,\n message: `The next required spot is '${context.expectedStampId}'.`,\n };\n }\n const evaluated = evaluateConditionDetailed(spot.condition, context.context, context.now);\n if (evaluated.ok) {\n return { ok: true, success: true, stampId: spot.id, checkedAt: context.now };\n }\n const code =\n evaluated.error.reason === \"OUTSIDE_RADIUS\"\n ? \"OUT_OF_RANGE\"\n : evaluated.error.reason === \"BEFORE_START\" || evaluated.error.reason === \"AFTER_END\"\n ? \"EXPIRED\"\n : evaluated.error.reason === \"TOKEN_MISMATCH\"\n ? \"INVALID_PROOF\"\n : \"INVALID_CONTEXT\";\n return { ok: false, success: false, code, stampId: spot.id, message: evaluated.error.reason };\n}\n","import type { RallyConfig, StampDefinition } from \"../domain/index.js\";\n\ninterface OrderedStamp {\n readonly stamp: StampDefinition;\n readonly index: number;\n}\n\nexport function getOrderedStamps(config: RallyConfig): ReadonlyArray<StampDefinition> {\n return config.stamps\n .map((stamp, index): OrderedStamp => ({ stamp, index }))\n .sort((left, right) => {\n const orderDifference =\n (left.stamp.order ?? Number.POSITIVE_INFINITY) -\n (right.stamp.order ?? Number.POSITIVE_INFINITY);\n return orderDifference === 0 ? left.index - right.index : orderDifference;\n })\n .map(({ stamp }) => stamp);\n}\n","import type { RallyConfig, StampDefinition, StampRallyState } from \"../domain/index.js\";\nimport { getOrderedStamps } from \"./order.js\";\n\nexport interface StampRallyProgress {\n readonly acquired: number;\n readonly total: number;\n readonly percentage: number;\n readonly isCompleted: boolean;\n /** @deprecated Use isCompleted instead. */\n readonly isComplete: boolean;\n readonly nextAvailableStamps: ReadonlyArray<StampDefinition>;\n}\n\nexport function calculateProgress(state: StampRallyState, config: RallyConfig): StampRallyProgress {\n const configuredStampIds = new Set(config.stamps.map((stamp) => stamp.id));\n const acquiredStampIds = new Set(\n state.records\n .map((record) => record.stampId)\n .filter((stampId) => configuredStampIds.has(stampId)),\n );\n const total = config.stamps.length;\n const acquired = acquiredStampIds.size;\n const isCompleted = total > 0 && acquired === total;\n\n const remainingStamps = config.stamps.filter((stamp) => !acquiredStampIds.has(stamp.id));\n const nextAvailableStamps =\n config.isSequential === true\n ? getOrderedStamps(config)\n .filter((stamp) => !acquiredStampIds.has(stamp.id))\n .slice(0, 1)\n : remainingStamps;\n\n return {\n acquired,\n total,\n percentage: total === 0 ? 0 : (acquired / total) * 100,\n isCompleted,\n isComplete: isCompleted,\n nextAvailableStamps,\n };\n}\n","import type { RewardItem, 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\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\nexport function issueClaimTicketNumber(\n reward: RewardItem,\n currentState: RewardState,\n options: ClaimTicketOptions = {},\n): RewardState {\n if (currentState.claimTicketNumber !== undefined) return currentState;\n const claimTicketNumber = reward.claimTicketNumber ?? createClaimTicketNumber(reward.id, options);\n return { ...currentState, claimTicketNumber };\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: \"geo\" }>;\nexport type TokenVerificationContext = Extract<VerificationContext, { readonly type: \"token\" }>;\nexport type DetectorResult<T extends VerificationContext> = Result<T, DetectorError>;\n\nexport interface PasscodeCondition {\n readonly passcode: string;\n readonly caseSensitive?: boolean;\n}\n\nexport type CheckInResult =\n | { readonly success: true }\n | {\n readonly success: false;\n readonly reason: \"INVALID_PASSCODE\";\n readonly message: string;\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 currentLatitude = position.coords.latitude;\n const currentLongitude = position.coords.longitude;\n if (\n !Number.isFinite(currentLatitude) ||\n currentLatitude < -90 ||\n currentLatitude > 90 ||\n !Number.isFinite(currentLongitude) ||\n currentLongitude < -180 ||\n currentLongitude > 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: \"geo\", currentLatitude, currentLongitude },\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, TokenVerificationContext } 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<TokenVerificationContext>> {\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<TokenVerificationContext>) => {\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: \"token\", 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","import type { CheckInResult, PasscodeCondition } from \"./types.js\";\n\nexport function normalizePasscode(input: string, caseSensitive = false): string {\n const normalized = input.normalize(\"NFKC\").trim();\n return caseSensitive ? normalized : normalized.toUpperCase();\n}\n\nexport function verifyPasscode(inputCode: string, condition: PasscodeCondition): CheckInResult {\n const input = normalizePasscode(inputCode, condition.caseSensitive);\n const expected = normalizePasscode(condition.passcode, condition.caseSensitive);\n\n return input === expected\n ? { success: true }\n : {\n success: false,\n reason: \"INVALID_PASSCODE\",\n message: \"The passcode is invalid.\",\n };\n}\n","import type { Result } from \"../domain/index.js\";\nimport type { DetectorError, DetectorResult, TokenVerificationContext } 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<TokenVerificationContext>> {\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: \"token\", 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 RallyConfig,\n Result,\n RewardItem,\n RewardState,\n StampError,\n StampRallyState,\n StampRecord,\n VerificationContext,\n} from \"../domain/index.js\";\nimport { evaluateConditionDetailed } from \"./evaluate.js\";\nimport { getOrderedStamps } from \"./order.js\";\n\nexport type StampRallyEvent =\n | {\n readonly type: \"stampAcquired\";\n readonly record: StampRecord;\n }\n | {\n readonly type: \"rallyCompleted\";\n readonly rallyId: string;\n readonly completedAt: string;\n }\n | {\n readonly type: \"rewardUnlocked\";\n readonly rewardId: string;\n readonly unlockedAt: string;\n };\n\nexport interface ProcessStampValue {\n readonly nextState: StampRallyState;\n readonly events: ReadonlyArray<StampRallyEvent>;\n}\n\nexport type RewardConsumeError =\n | { readonly code: \"NOT_AVAILABLE\"; readonly rewardId: string }\n | { readonly code: \"ALREADY_CONSUMED\"; readonly rewardId: string }\n | {\n readonly code: \"INVALID_PASSCODE\";\n readonly rewardId: string;\n readonly message: string;\n }\n | { readonly code: \"EXPIRED\"; readonly rewardId: string }\n | { readonly code: \"OUT_OF_STOCK\"; readonly rewardId: string }\n | { readonly code: \"USER_LIMIT_REACHED\"; readonly rewardId: string }\n | { readonly code: \"REWARD_NOT_FOUND\"; readonly rewardId: string };\n\nexport interface ConsumeRewardParams {\n readonly reward: RewardItem;\n readonly currentState: RewardState;\n readonly inputPasscode?: string;\n readonly staffId?: string;\n readonly now: string;\n readonly userId?: string;\n readonly userRedemptionCount?: number;\n}\n\nexport type ConsumeResult = Result<RewardState, RewardConsumeError>;\n\nexport function reconcileRewardStates(\n rewards: ReadonlyArray<RewardItem>,\n currentStates: ReadonlyArray<RewardState>,\n acquiredStampCount: number,\n now: string,\n): ReadonlyArray<RewardState> {\n const statesById = new Map(currentStates.map((state) => [state.rewardId, state]));\n\n return rewards.map((reward) => {\n const current = statesById.get(reward.id);\n if (current?.status === \"CONSUMED\" || current?.status === \"EXPIRED\") {\n return current;\n }\n\n if (reward.validUntil !== undefined && Date.parse(reward.validUntil) <= Date.parse(now)) {\n return { rewardId: reward.id, status: \"EXPIRED\" };\n }\n\n if (reward.maxStock !== undefined && (current?.redeemedCount ?? 0) >= reward.maxStock) {\n return {\n rewardId: reward.id,\n status: \"EXPIRED\",\n ...(current?.claimTicketNumber === undefined\n ? {}\n : { claimTicketNumber: current.claimTicketNumber }),\n };\n }\n\n if (acquiredStampCount >= reward.requiredStampCount) {\n if (current?.status === \"AVAILABLE\") return current;\n return {\n rewardId: reward.id,\n status: \"AVAILABLE\",\n unlockedAt: current?.unlockedAt ?? now,\n ...(current?.claimTicketNumber === undefined\n ? {}\n : { claimTicketNumber: current.claimTicketNumber }),\n };\n }\n\n if (current?.status === \"LOCKED\" && current.unlockedAt === undefined) return current;\n return { rewardId: reward.id, status: \"LOCKED\" };\n });\n}\n\nexport function consumeReward(params: ConsumeRewardParams): ConsumeResult {\n const { reward, currentState } = params;\n\n if (currentState.status === \"CONSUMED\") {\n return {\n ok: false,\n error: { code: \"ALREADY_CONSUMED\", rewardId: reward.id },\n };\n }\n\n if (currentState.status !== \"AVAILABLE\") {\n return {\n ok: false,\n error: { code: \"NOT_AVAILABLE\", rewardId: reward.id },\n };\n }\n\n if (reward.validUntil !== undefined && Date.parse(reward.validUntil) <= Date.parse(params.now)) {\n return { ok: false, error: { code: \"EXPIRED\", rewardId: reward.id } };\n }\n if (reward.maxStock !== undefined && (currentState.redeemedCount ?? 0) >= reward.maxStock) {\n return { ok: false, error: { code: \"OUT_OF_STOCK\", rewardId: reward.id } };\n }\n if (\n reward.limitPerUser !== undefined &&\n (params.userRedemptionCount ?? currentState.userRedemptionCount ?? 0) >= reward.limitPerUser\n ) {\n return { ok: false, error: { code: \"USER_LIMIT_REACHED\", rewardId: reward.id } };\n }\n\n if (reward.redemptionMethod === \"staff_passcode\") {\n const passcodeResult =\n reward.staffPasscode === undefined\n ? null\n : verifyPasscode(params.inputPasscode ?? \"\", { passcode: reward.staffPasscode });\n if (passcodeResult === null || !passcodeResult.success) {\n return {\n ok: false,\n error: {\n code: \"INVALID_PASSCODE\",\n rewardId: reward.id,\n message: passcodeResult?.message ?? \"The passcode is invalid.\",\n },\n };\n }\n }\n\n if (reward.redemptionMethod === \"view_only\") {\n return { ok: true, value: currentState };\n }\n\n return {\n ok: true,\n value: {\n ...currentState,\n status: \"CONSUMED\",\n consumedAt: params.now,\n ...(reward.maxStock !== undefined ||\n params.userId !== undefined ||\n params.userRedemptionCount !== undefined\n ? { redeemedCount: (currentState.redeemedCount ?? 0) + 1 }\n : {}),\n ...(params.userId === undefined\n ? {}\n : { userRedemptionCount: (currentState.userRedemptionCount ?? 0) + 1 }),\n ...(params.staffId === undefined ? {} : { consumedByStaffId: params.staffId }),\n },\n };\n}\n\nexport function processStamp(\n state: StampRallyState,\n config: RallyConfig,\n targetStampId: string,\n context: VerificationContext,\n now: string,\n): Result<ProcessStampValue, StampError> {\n const targetStamp = config.stamps.find((stamp) => stamp.id === targetStampId);\n if (targetStamp === undefined) {\n return { ok: false, error: { code: \"STAMP_NOT_FOUND\", stampId: targetStampId } };\n }\n\n const acquiredStampIds = new Set(state.records.map((record) => record.stampId));\n if (acquiredStampIds.has(targetStampId)) {\n return {\n ok: false,\n error: { code: \"STAMP_ALREADY_ACQUIRED\", stampId: targetStampId },\n };\n }\n\n if (config.isSequential === true) {\n const expectedStamp = getOrderedStamps(config).find((stamp) => !acquiredStampIds.has(stamp.id));\n if (expectedStamp !== undefined && expectedStamp.id !== targetStampId) {\n return {\n ok: false,\n error: {\n code: \"INVALID_ORDER\",\n stampId: targetStampId,\n expectedStampId: expectedStamp.id,\n },\n };\n }\n }\n\n const conditionResult = evaluateConditionDetailed(targetStamp.condition, context, now);\n if (!conditionResult.ok) {\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n stampId: targetStampId,\n mismatch: conditionResult.error,\n },\n };\n }\n\n const record: StampRecord = { stampId: targetStampId, acquiredAt: now };\n const nextRecords = [...state.records, record];\n const nextRewards =\n config.rewards === undefined && state.rewards === undefined\n ? undefined\n : reconcileRewardStates(config.rewards ?? [], state.rewards ?? [], nextRecords.length, now);\n const nextState: StampRallyState = {\n ...state,\n records: nextRecords,\n ...(nextRewards === undefined ? {} : { rewards: nextRewards }),\n updatedAt: now,\n };\n const events: StampRallyEvent[] = [{ type: \"stampAcquired\", record }];\n if (nextRewards !== undefined) {\n for (const rewardState of nextRewards) {\n const previous = state.rewards?.find((item) => item.rewardId === rewardState.rewardId);\n if (rewardState.status === \"AVAILABLE\" && previous?.status !== \"AVAILABLE\") {\n events.push({ type: \"rewardUnlocked\", rewardId: rewardState.rewardId, unlockedAt: now });\n }\n }\n }\n\n const completed =\n config.stamps.length > 0 &&\n config.stamps.every((stamp) => nextState.records.some((item) => item.stampId === stamp.id));\n\n if (completed) {\n events.push({ type: \"rallyCompleted\", rallyId: config.id, completedAt: now });\n }\n\n return { ok: true, value: { nextState, events } };\n}\n","import type { RewardState, StampRallyState, StampRecord } from \"../domain/index.js\";\n\nexport interface StampStorage {\n load(rallyId: string): Promise<StampRallyState | null>;\n save(state: StampRallyState): Promise<void>;\n remove(rallyId: string): 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 };\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.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 );\n}\n\nexport interface RallySnapshot {\n readonly version: 1;\n readonly rallyId: string;\n readonly stamps: 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 Array.isArray(snapshot.stamps) &&\n snapshot.stamps.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 stamps: parsed.stamps.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): Promise<StampRallyState | null> {\n const state = this.#states.get(rallyId);\n return state === undefined ? null : cloneState(state);\n }\n\n async save(state: StampRallyState): Promise<void> {\n this.#states.set(state.rallyId, cloneState(state));\n }\n\n async remove(rallyId: string): Promise<void> {\n this.#states.delete(rallyId);\n }\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): Promise<StampRallyState | null> {\n if (this.#isFallbackActive) return this.#fallbackStorage.load(rallyId);\n\n try {\n const serialized = this.#getStorage(\"load\", rallyId).getItem(this.#key(rallyId));\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),\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),\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): Promise<void> {\n if (this.#isFallbackActive) return this.#fallbackStorage.remove(rallyId);\n\n try {\n this.#getStorage(\"remove\", rallyId).removeItem(this.#key(rallyId));\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),\n );\n }\n }\n\n #key(rallyId: string): string {\n return `${this.#keyPrefix}${rallyId}`;\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): 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.objectStore(INDEXED_DB_STORE_NAME).get(rallyId);\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.objectStore(INDEXED_DB_STORE_NAME).put(cloneState(state), state.rallyId);\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): 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(rallyId);\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 {\n RallyConfig,\n Result,\n StampError,\n StampRallyState,\n VerificationContext,\n} from \"../domain/index.js\";\nimport { type ProcessStampValue, processStamp, reconcileRewardStates } from \"../engine/index.js\";\nimport { cloneState, type StampStorage } from \"./storage.js\";\n\nexport type StampRallyListener = (state: StampRallyState) => void;\nexport type Clock = () => string;\n\nconst systemClock: Clock = () => new Date().toISOString();\n\nexport class StampRallyClient {\n readonly #listeners = new Set<StampRallyListener>();\n readonly #config: RallyConfig;\n readonly #storage: StampStorage;\n readonly #clock: Clock;\n #currentState: StampRallyState | null = null;\n #initialization: Promise<StampRallyState> | null = null;\n #operationQueue: Promise<unknown> = Promise.resolve();\n\n constructor(config: RallyConfig, storage: StampStorage, clock: Clock = systemClock) {\n this.#config = config;\n this.#storage = storage;\n this.#clock = clock;\n }\n\n getState(): StampRallyState | null {\n return this.#currentState;\n }\n\n getConfig(): RallyConfig {\n return this.#config;\n }\n\n subscribe(listener: StampRallyListener): () => void {\n this.#listeners.add(listener);\n return () => {\n this.#listeners.delete(listener);\n };\n }\n\n init(): Promise<StampRallyState> {\n return this.initialize();\n }\n\n initialize(): Promise<StampRallyState> {\n if (this.#currentState !== null) {\n return Promise.resolve(this.#currentState);\n }\n\n if (this.#initialization === null) {\n this.#initialization = this.#storage\n .load(this.#config.id)\n .then((storedState) => {\n const state =\n storedState === null\n ? this.#createEmptyState(this.#clock())\n : this.#reconcileState(cloneState(storedState), storedState.updatedAt);\n this.#currentState = state;\n this.#emit(state);\n return state;\n })\n .catch((error: unknown) => {\n this.#initialization = null;\n throw error;\n });\n }\n\n return this.#initialization;\n }\n\n acquire(\n stampId: string,\n context: VerificationContext,\n now: string = this.#clock(),\n ): Promise<Result<ProcessStampValue, StampError>> {\n return this.#enqueue(async () => {\n const currentState = await this.initialize();\n const result = processStamp(currentState, this.#config, stampId, context, now);\n\n if (!result.ok) {\n return result;\n }\n\n await this.#storage.save(result.value.nextState);\n this.#currentState = result.value.nextState;\n this.#emit(result.value.nextState);\n return result;\n });\n }\n\n reset(now: string = this.#clock()): Promise<StampRallyState> {\n return this.#enqueue(async () => {\n const initialization = this.#initialization;\n if (initialization !== null) {\n await initialization.catch(() => undefined);\n }\n await this.#storage.remove(this.#config.id);\n const nextState = this.#createEmptyState(now);\n this.#currentState = nextState;\n this.#initialization = Promise.resolve(nextState);\n this.#emit(nextState);\n return nextState;\n });\n }\n\n restore(state: StampRallyState): Promise<StampRallyState> {\n return this.#enqueue(async () => {\n const initialization = this.#initialization;\n if (initialization !== null) {\n await initialization.catch(() => undefined);\n }\n if (state.rallyId !== this.#config.id) {\n throw new Error(\n `Cannot restore rally '${state.rallyId}' into client '${this.#config.id}'.`,\n );\n }\n\n const nextState = this.#reconcileState(cloneState(state), state.updatedAt);\n await this.#storage.save(nextState);\n this.#currentState = nextState;\n this.#initialization = Promise.resolve(nextState);\n this.#emit(nextState);\n return nextState;\n });\n }\n\n #enqueue<T>(operation: () => Promise<T>): Promise<T> {\n const next = this.#operationQueue.then(operation, operation);\n this.#operationQueue = next.then(\n () => undefined,\n () => undefined,\n );\n return next;\n }\n\n #emit(state: StampRallyState): void {\n for (const listener of this.#listeners) {\n listener(state);\n }\n }\n\n #createEmptyState(now: string): StampRallyState {\n const state: StampRallyState = {\n rallyId: this.#config.id,\n records: [],\n ...(this.#config.rewards === undefined\n ? {}\n : {\n rewards: reconcileRewardStates(this.#config.rewards, [], 0, now),\n }),\n updatedAt: now,\n };\n return state;\n }\n\n #reconcileState(state: StampRallyState, now: string): StampRallyState {\n const configuredStampIds = new Set(this.#config.stamps.map((stamp) => stamp.id));\n const seenStampIds = new Set<string>();\n const records = state.records.filter((record) => {\n if (!configuredStampIds.has(record.stampId) || seenStampIds.has(record.stampId)) return false;\n seenStampIds.add(record.stampId);\n return true;\n });\n if (this.#config.rewards === undefined && state.rewards === undefined) {\n return records.length === state.records.length ? state : { ...state, records };\n }\n return {\n ...state,\n records,\n rewards: reconcileRewardStates(\n this.#config.rewards ?? [],\n state.rewards ?? [],\n records.length,\n now,\n ),\n };\n }\n}\n","import type { LocalizedString, LocalizedText, SupportedLocale } from \"./models.js\";\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 = fallbackLocale ?? \"ja\";\n return text[locale as TLocale] || text[fallback as TLocale] || \"\";\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","export const CURRENT_RALLY_CONFIG_VERSION = 2;\n\nexport interface ValidationError {\n readonly path: string;\n readonly code:\n | \"INVALID_TYPE\"\n | \"REQUIRED\"\n | \"EMPTY_STRING\"\n | \"DUPLICATE_ID\"\n | \"INVALID_COORDINATES\"\n | \"INVALID_RADIUS\"\n | \"INVALID_DATE\"\n | \"INVALID_VERSION\"\n | \"INVALID_REWARD\"\n | \"CYCLE_DETECTED\";\n readonly message: string;\n}\n\nexport interface RallyConfigValidationResult {\n readonly valid: boolean;\n readonly errors: ReadonlyArray<ValidationError>;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction add(\n errors: ValidationError[],\n path: string,\n code: ValidationError[\"code\"],\n message: string,\n): void {\n errors.push({ path, code, message });\n}\n\nfunction hasText(value: unknown): boolean {\n if (typeof value === \"string\") return value.trim() !== \"\";\n if (!isObject(value)) return false;\n return Object.values(value).some((item) => typeof item === \"string\" && item.trim() !== \"\");\n}\n\nfunction validateCondition(value: unknown, path: string, errors: ValidationError[]): void {\n if (!isObject(value) || typeof value.type !== \"string\") {\n add(errors, path, \"INVALID_TYPE\", \"Condition must be an object with a type.\");\n return;\n }\n switch (value.type) {\n case \"instant\":\n return;\n case \"token\":\n if (typeof value.token !== \"string\" || value.token.trim() === \"\") {\n add(errors, `${path}.token`, \"REQUIRED\", \"Token must not be empty.\");\n }\n return;\n case \"geo\": {\n const latitude = value.latitude;\n const longitude = value.longitude;\n if (\n typeof latitude !== \"number\" ||\n !Number.isFinite(latitude) ||\n latitude < -90 ||\n latitude > 90 ||\n typeof longitude !== \"number\" ||\n !Number.isFinite(longitude) ||\n longitude < -180 ||\n longitude > 180\n ) {\n add(\n errors,\n path,\n \"INVALID_COORDINATES\",\n \"Latitude must be between -90 and 90 and longitude between -180 and 180.\",\n );\n }\n if (\n typeof value.radiusMeters !== \"number\" ||\n !Number.isFinite(value.radiusMeters) ||\n value.radiusMeters <= 0\n ) {\n add(errors, `${path}.radiusMeters`, \"INVALID_RADIUS\", \"Radius must be greater than zero.\");\n }\n return;\n }\n case \"composite\":\n if (value.operator !== \"AND\" && value.operator !== \"OR\") {\n add(errors, `${path}.operator`, \"INVALID_TYPE\", \"Operator must be AND or OR.\");\n }\n if (!Array.isArray(value.conditions)) {\n add(errors, `${path}.conditions`, \"INVALID_TYPE\", \"Composite conditions must be an array.\");\n return;\n }\n value.conditions.forEach((child, index) => {\n validateCondition(child, `${path}.conditions[${index}]`, errors);\n });\n return;\n case \"time_window\":\n if (typeof value.startsAt !== \"string\" || Number.isNaN(Date.parse(value.startsAt))) {\n add(errors, `${path}.startsAt`, \"INVALID_DATE\", \"Start must be a valid ISO date.\");\n }\n if (typeof value.endsAt !== \"string\" || Number.isNaN(Date.parse(value.endsAt))) {\n add(errors, `${path}.endsAt`, \"INVALID_DATE\", \"End must be a valid ISO date.\");\n }\n if (\n typeof value.startsAt === \"string\" &&\n typeof value.endsAt === \"string\" &&\n !Number.isNaN(Date.parse(value.startsAt)) &&\n !Number.isNaN(Date.parse(value.endsAt)) &&\n Date.parse(value.startsAt) >= Date.parse(value.endsAt)\n ) {\n add(errors, path, \"INVALID_DATE\", \"Time window start must be before its end.\");\n }\n validateCondition(value.condition, `${path}.condition`, errors);\n return;\n default:\n add(errors, `${path}.type`, \"INVALID_TYPE\", \"Unsupported condition type.\");\n }\n}\n\nfunction validateSpot(value: unknown, index: number, errors: ValidationError[]): void {\n const path = `stamps[${index}]`;\n if (!isObject(value)) {\n add(errors, path, \"INVALID_TYPE\", \"Spot must be an object.\");\n return;\n }\n if (typeof value.id !== \"string\") add(errors, `${path}.id`, \"REQUIRED\", \"Spot ID is required.\");\n else if (value.id.trim() === \"\")\n add(errors, `${path}.id`, \"EMPTY_STRING\", \"Spot ID must not be empty.\");\n if (value.name === undefined) add(errors, `${path}.name`, \"REQUIRED\", \"Spot name is required.\");\n else if (!hasText(value.name))\n add(errors, `${path}.name`, \"EMPTY_STRING\", \"Spot name must not be empty.\");\n if (\n value.order !== undefined &&\n (typeof value.order !== \"number\" || !Number.isFinite(value.order))\n ) {\n add(errors, `${path}.order`, \"INVALID_TYPE\", \"Spot order must be a finite number.\");\n }\n validateCondition(value.condition, `${path}.condition`, errors);\n for (const field of [\"dependsOn\", \"requiresStampIds\"] as const) {\n if (\n value[field] !== undefined &&\n (!Array.isArray(value[field]) || value[field].some((item) => typeof item !== \"string\"))\n ) {\n add(errors, `${path}.${field}`, \"INVALID_TYPE\", `${field} must be an array of IDs.`);\n }\n }\n}\n\nfunction validateReward(\n value: unknown,\n index: number,\n stampCount: number,\n errors: ValidationError[],\n): void {\n const path = `rewards[${index}]`;\n if (!isObject(value)) {\n add(errors, path, \"INVALID_TYPE\", \"Reward must be an object.\");\n return;\n }\n if (typeof value.id !== \"string\" || value.id.trim() === \"\") {\n add(errors, `${path}.id`, \"REQUIRED\", \"Reward ID must not be empty.\");\n }\n if (!hasText(value.title)) {\n add(errors, `${path}.title`, \"EMPTY_STRING\", \"Reward title must not be empty.\");\n }\n if (!hasText(value.description)) {\n add(errors, `${path}.description`, \"EMPTY_STRING\", \"Reward description must not be empty.\");\n }\n const required = value.requiredStampCount;\n if (\n typeof required !== \"number\" ||\n !Number.isInteger(required) ||\n required < 0 ||\n required > stampCount\n ) {\n add(\n errors,\n `${path}.requiredStampCount`,\n \"INVALID_REWARD\",\n \"Required stamps must be an integer within the rally.\",\n );\n }\n if (\n value.validUntil !== undefined &&\n (typeof value.validUntil !== \"string\" || Number.isNaN(Date.parse(value.validUntil)))\n ) {\n add(errors, `${path}.validUntil`, \"INVALID_DATE\", \"Reward expiry must be a valid ISO date.\");\n }\n for (const field of [\"maxStock\", \"limitPerUser\"] as const) {\n const count = value[field];\n if (\n count !== undefined &&\n (typeof count !== \"number\" || !Number.isInteger(count) || count <= 0)\n ) {\n add(errors, `${path}.${field}`, \"INVALID_REWARD\", `${field} must be a positive integer.`);\n }\n }\n}\n\nfunction collectDependencies(spot: Record<string, unknown>): ReadonlyArray<string> {\n const dependencies = new Set<string>();\n for (const field of [\"dependsOn\", \"requiresStampIds\"] as const) {\n const values = spot[field];\n if (Array.isArray(values))\n for (const value of values) if (typeof value === \"string\") dependencies.add(value);\n }\n return [...dependencies];\n}\n\nfunction validateDag(stamps: ReadonlyArray<unknown>, errors: ValidationError[]): void {\n const graph = new Map<string, ReadonlyArray<string>>();\n for (const value of stamps) {\n if (!isObject(value) || typeof value.id !== \"string\") continue;\n graph.set(value.id, [...(graph.get(value.id) ?? []), ...collectDependencies(value)]);\n }\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const visit = (id: string, path: string): void => {\n if (visiting.has(id)) {\n add(errors, path, \"CYCLE_DETECTED\", `Dependency cycle detected at '${id}'.`);\n return;\n }\n if (visited.has(id)) return;\n visiting.add(id);\n for (const dependency of graph.get(id) ?? [])\n if (graph.has(dependency)) visit(dependency, path);\n visiting.delete(id);\n visited.add(id);\n };\n for (const id of graph.keys()) visit(id, `stamps[${id}]`);\n}\n\nexport function validateRallyConfig(config: unknown): RallyConfigValidationResult {\n const errors: ValidationError[] = [];\n if (!isObject(config))\n return {\n valid: false,\n errors: [{ path: \"\", code: \"INVALID_TYPE\", message: \"Rally config must be an object.\" }],\n };\n if (typeof config.id !== \"string\") add(errors, \"id\", \"REQUIRED\", \"Rally ID is required.\");\n else if (config.id.trim() === \"\")\n add(errors, \"id\", \"EMPTY_STRING\", \"Rally ID must not be empty.\");\n if (config.title !== undefined && !hasText(config.title))\n add(errors, \"title\", \"EMPTY_STRING\", \"Rally title must not be empty.\");\n if (config.version !== undefined && config.version !== CURRENT_RALLY_CONFIG_VERSION) {\n add(\n errors,\n \"version\",\n \"INVALID_VERSION\",\n `Config version must be ${CURRENT_RALLY_CONFIG_VERSION}.`,\n );\n }\n for (const field of [\"startDate\", \"endDate\"] as const) {\n if (\n config[field] !== undefined &&\n (typeof config[field] !== \"string\" || Number.isNaN(Date.parse(config[field] as string)))\n ) {\n add(errors, field, \"INVALID_DATE\", `${field} must be a valid ISO date.`);\n }\n }\n if (\n typeof config.startDate === \"string\" &&\n typeof config.endDate === \"string\" &&\n !Number.isNaN(Date.parse(config.startDate)) &&\n !Number.isNaN(Date.parse(config.endDate)) &&\n Date.parse(config.startDate) >= Date.parse(config.endDate)\n ) {\n add(errors, \"startDate\", \"INVALID_DATE\", \"startDate must be before endDate.\");\n }\n if (!Array.isArray(config.stamps)) {\n add(errors, \"stamps\", \"INVALID_TYPE\", \"stamps must be an array.\");\n } else {\n config.stamps.forEach((spot, index) => {\n validateSpot(spot, index, errors);\n });\n const ids = config.stamps.map((spot) =>\n isObject(spot) && typeof spot.id === \"string\" ? spot.id : \"\",\n );\n ids.forEach((id, index) => {\n if (id !== \"\" && ids.indexOf(id) !== index)\n add(errors, `stamps[${index}].id`, \"DUPLICATE_ID\", `Duplicate spot ID '${id}'.`);\n });\n validateDag(config.stamps, errors);\n }\n if (config.rewards !== undefined && !Array.isArray(config.rewards)) {\n add(errors, \"rewards\", \"INVALID_TYPE\", \"rewards must be an array.\");\n } else if (Array.isArray(config.rewards)) {\n const stampCount = Array.isArray(config.stamps) ? config.stamps.length : 0;\n config.rewards.forEach((reward, index) => {\n validateReward(reward, index, stampCount, errors);\n });\n const ids = config.rewards.map((reward) =>\n isObject(reward) && typeof reward.id === \"string\" ? reward.id : \"\",\n );\n ids.forEach((id, index) => {\n if (id !== \"\" && ids.indexOf(id) !== index)\n add(errors, `rewards[${index}].id`, \"DUPLICATE_ID\", `Duplicate reward ID '${id}'.`);\n });\n if (Array.isArray(config.stamps)) {\n const stampIds = new Set(\n config.stamps.map((spot) => (isObject(spot) && typeof spot.id === \"string\" ? spot.id : \"\")),\n );\n ids.forEach((id, index) => {\n if (id !== \"\" && stampIds.has(id))\n add(\n errors,\n `rewards[${index}].id`,\n \"DUPLICATE_ID\",\n `Reward ID '${id}' is already used by a spot.`,\n );\n });\n }\n }\n return { valid: errors.length === 0, errors };\n}\n","import type { StampCondition } from \"./conditions.js\";\nimport type { RallyConfig, RewardItem, SheetTheme, SpotItem } from \"./models.js\";\nimport { CURRENT_RALLY_CONFIG_VERSION } from \"./validation.js\";\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction text(value: unknown): string | Partial<Record<string, string>> | undefined {\n if (typeof value === \"string\") return value;\n if (!isObject(value)) return undefined;\n const entries = Object.entries(value).filter(([, item]) => typeof item === \"string\");\n return entries.length === 0\n ? undefined\n : (Object.fromEntries(entries) as Partial<Record<string, string>>);\n}\n\nfunction condition(value: unknown): StampCondition {\n if (!isObject(value) || typeof value.type !== \"string\") return { type: \"instant\" };\n switch (value.type) {\n case \"instant\":\n return { type: \"instant\" };\n case \"token\":\n case \"passcode\":\n return {\n type: \"token\",\n token:\n typeof value.token === \"string\"\n ? value.token\n : typeof value.passcode === \"string\"\n ? value.passcode\n : \"\",\n };\n case \"geo\":\n return {\n type: \"geo\",\n latitude: typeof value.latitude === \"number\" ? value.latitude : 0,\n longitude: typeof value.longitude === \"number\" ? value.longitude : 0,\n radiusMeters:\n typeof value.radiusMeters === \"number\"\n ? value.radiusMeters\n : typeof value.radius === \"number\"\n ? value.radius\n : 1,\n };\n case \"composite\":\n return {\n type: \"composite\",\n operator: value.operator === \"OR\" ? \"OR\" : \"AND\",\n conditions: Array.isArray(value.conditions) ? value.conditions.map(condition) : [],\n };\n case \"time_window\":\n return {\n type: \"time_window\",\n startsAt: typeof value.startsAt === \"string\" ? value.startsAt : \"1970-01-01T00:00:00.000Z\",\n endsAt: typeof value.endsAt === \"string\" ? value.endsAt : \"9999-12-31T23:59:59.999Z\",\n condition: condition(value.condition),\n };\n default:\n return { type: \"instant\" };\n }\n}\n\nfunction migrateSpot(value: unknown, index: number): SpotItem {\n const source = isObject(value) ? value : {};\n const id =\n typeof source.id === \"string\" && source.id.trim() !== \"\"\n ? source.id.trim()\n : `spot-${index + 1}`;\n const description = text(source.description);\n const hint = text(source.hint);\n return {\n id,\n name: text(source.name) ?? `Spot ${index + 1}`,\n ...(description === undefined ? {} : { description }),\n ...(hint === undefined ? {} : { hint }),\n condition: condition(\n source.condition ??\n (typeof source.token === \"string\" ? { type: \"token\", token: source.token } : undefined),\n ),\n ...(typeof source.order === \"number\" ? { order: source.order } : {}),\n ...(typeof source.deckId === \"string\" ? { deckId: source.deckId } : {}),\n ...(typeof source.groupId === \"string\" ? { groupId: source.groupId } : {}),\n ...(typeof source.guideId === \"string\" ? { guideId: source.guideId } : {}),\n ...(typeof source.iconUrl === \"string\" ? { iconUrl: source.iconUrl } : {}),\n ...(typeof source.imageUrl === \"string\" ? { imageUrl: source.imageUrl } : {}),\n ...(typeof source.externalUrl === \"string\" ? { externalUrl: source.externalUrl } : {}),\n ...(typeof source.redirectUrlAfterClaim === \"string\"\n ? { redirectUrlAfterClaim: source.redirectUrlAfterClaim }\n : {}),\n ...(isObject(source.metadata) ? { metadata: source.metadata } : {}),\n ...(Array.isArray(source.dependsOn)\n ? { dependsOn: source.dependsOn.filter((item): item is string => typeof item === \"string\") }\n : {}),\n };\n}\n\nfunction migrateReward(value: unknown, index: number): RewardItem {\n const source = isObject(value) ? value : {};\n return {\n id:\n typeof source.id === \"string\" && source.id.trim() !== \"\"\n ? source.id.trim()\n : `reward-${index + 1}`,\n title: text(source.title) ?? `Reward ${index + 1}`,\n description: text(source.description) ?? \"\",\n type: source.type === \"digital\" ? \"digital\" : \"in_person\",\n redemptionMethod:\n source.redemptionMethod === \"staff_passcode\" || source.redemptionMethod === \"view_only\"\n ? source.redemptionMethod\n : \"manual_slide\",\n requiredStampCount:\n typeof source.requiredStampCount === \"number\" && Number.isFinite(source.requiredStampCount)\n ? Math.max(0, Math.trunc(source.requiredStampCount))\n : 0,\n ...(typeof source.digitalContentUrl === \"string\"\n ? { digitalContentUrl: source.digitalContentUrl }\n : {}),\n ...(typeof source.staffPasscode === \"string\" ? { staffPasscode: source.staffPasscode } : {}),\n ...(typeof source.validUntil === \"string\" ? { validUntil: source.validUntil } : {}),\n ...(typeof source.maxStock === \"number\" ? { maxStock: source.maxStock } : {}),\n ...(typeof source.limitPerUser === \"number\" ? { limitPerUser: source.limitPerUser } : {}),\n ...(typeof source.claimTicketNumber === \"string\"\n ? { claimTicketNumber: source.claimTicketNumber }\n : {}),\n };\n}\n\nexport function migrateRallyConfig(raw: unknown): RallyConfig {\n const source = isObject(raw) ? raw : {};\n const rawStamps = Array.isArray(source.stamps)\n ? source.stamps\n : Array.isArray(source.spots)\n ? source.spots\n : [];\n const rawRewards = Array.isArray(source.rewards) ? source.rewards : [];\n const id =\n typeof source.id === \"string\" && source.id.trim() !== \"\" ? source.id.trim() : \"migrated-rally\";\n const title = text(source.title);\n const description = text(source.description);\n const theme = isObject(source.theme) ? source.theme : undefined;\n return {\n id,\n ...(title === undefined ? {} : { title }),\n ...(description === undefined ? {} : { description }),\n stamps: rawStamps.map(migrateSpot),\n ...(rawRewards.length === 0 ? {} : { rewards: rawRewards.map(migrateReward) }),\n ...(typeof source.isSequential === \"boolean\" ? { isSequential: source.isSequential } : {}),\n ...(theme === undefined ? {} : { theme: theme as unknown as SheetTheme }),\n version: CURRENT_RALLY_CONFIG_VERSION,\n ...(typeof source.startDate === \"string\"\n ? { startDate: source.startDate }\n : typeof source.startsAt === \"string\"\n ? { startDate: source.startsAt }\n : {}),\n ...(typeof source.endDate === \"string\"\n ? { endDate: source.endDate }\n : typeof source.endsAt === \"string\"\n ? { endDate: source.endsAt }\n : {}),\n };\n}\n","import type { StampCondition } from \"./conditions.js\";\n\nexport type SupportedLocale = \"ja\" | \"en\";\nexport type LocalizedString<TLocale extends string = SupportedLocale> = Record<TLocale, string>;\nexport type LocalizedText<TLocale extends string = string> =\n | string\n | Partial<Record<TLocale, 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}\n\nexport type ThemePresetId = \"default\" | \"modern_dark\" | \"pop_candy\" | \"retro_craft\" | \"cyber\";\n\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}\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 SpotItem<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly id: string;\n readonly name: LocalizedText<TLocale>;\n readonly description?: LocalizedText<TLocale>;\n readonly hint?: LocalizedText<TLocale>;\n readonly condition: StampCondition;\n readonly order?: number;\n readonly deckId?: string;\n readonly groupId?: string;\n readonly guideId?: string;\n readonly iconUrl?: string;\n readonly imageUrl?: string;\n readonly externalUrl?: string;\n readonly redirectUrlAfterClaim?: string;\n readonly metadata?: TMeta;\n readonly dependsOn?: ReadonlyArray<string>;\n readonly requiresStampIds?: ReadonlyArray<string>;\n}\n\n/** @deprecated Use SpotItem instead. */\nexport type StampDefinition<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> = SpotItem<TLocale, TMeta>;\n\nexport interface StampRecord {\n readonly stampId: string;\n readonly acquiredAt: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\nexport type RewardType = \"digital\" | \"in_person\";\n\nexport type RedemptionMethod = \"manual_slide\" | \"staff_passcode\" | \"view_only\";\n\nexport type RewardStatus = \"LOCKED\" | \"AVAILABLE\" | \"CONSUMED\" | \"EXPIRED\";\n\nexport interface RewardItem<TLocale extends string = SupportedLocale> {\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 digitalContentUrl?: string;\n readonly staffPasscode?: string;\n readonly validUntil?: string;\n readonly maxStock?: number;\n readonly limitPerUser?: number;\n readonly claimTicketNumber?: string;\n}\n\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}\n\nexport interface StampRallyState {\n readonly rallyId: string;\n readonly records: ReadonlyArray<StampRecord>;\n readonly rewards?: ReadonlyArray<RewardState>;\n readonly updatedAt: string;\n}\n\nexport interface RallyConfig<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly id: string;\n readonly title?: LocalizedText<TLocale>;\n readonly description?: LocalizedText<TLocale>;\n readonly stamps: ReadonlyArray<StampDefinition<TLocale, TMeta>>;\n readonly rewards?: ReadonlyArray<RewardItem<TLocale>>;\n readonly isSequential?: boolean;\n readonly theme?: SheetTheme;\n readonly version?: number;\n readonly startDate?: string;\n readonly endDate?: string;\n}\n","import type { RallyConfig, RewardItem } from \"./models.js\";\n\nexport type PublicRewardItem<TLocale extends string = string> = Omit<\n RewardItem<TLocale>,\n \"staffPasscode\"\n>;\nexport type PublicRallyConfig<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> = Omit<RallyConfig<TLocale, TMeta>, \"rewards\"> & {\n readonly rewards?: ReadonlyArray<PublicRewardItem<TLocale>>;\n};\n\nexport function stripSensitiveConfig<TLocale extends string, TMeta extends Record<string, unknown>>(\n config: RallyConfig<TLocale, TMeta>,\n): PublicRallyConfig<TLocale, TMeta> {\n const rewards = config.rewards?.map(({ staffPasscode: _staffPasscode, ...reward }) => reward);\n return {\n ...config,\n ...(rewards === undefined ? {} : { rewards }),\n };\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","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/checkIn.ts","../src/engine/order.ts","../src/engine/progress.ts","../src/engine/rewards.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/client.ts","../src/domain/i18n.ts","../src/domain/validation.ts","../src/domain/migration.ts","../src/domain/models.ts","../src/domain/publicConfig.ts","../src/domain/themePresets.ts","../src/security/snapshotToken.ts"],"names":["condition","cryptoApi","DEFAULT_TIMEOUT_MS","record","text","isObject"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n CompositeConditionFailure,\n ConditionMatch,\n ConditionMismatch,\n Result,\n StampCondition,\n VerificationContext,\n} from \"../domain/index.js\";\n\nconst EARTH_RADIUS_METERS = 6_371_000;\n\nfunction toRadians(degrees: number): number {\n return (degrees * Math.PI) / 180;\n}\n\nexport function calculateDistanceMeters(\n latitudeA: number,\n longitudeA: number,\n latitudeB: number,\n longitudeB: number,\n): number {\n const latitudeDelta = toRadians(latitudeB - latitudeA);\n const longitudeDelta = toRadians(longitudeB - longitudeA);\n const latitudeARadians = toRadians(latitudeA);\n const latitudeBRadians = toRadians(latitudeB);\n\n const haversine =\n Math.sin(latitudeDelta / 2) ** 2 +\n Math.cos(latitudeARadians) * Math.cos(latitudeBRadians) * Math.sin(longitudeDelta / 2) ** 2;\n\n return 2 * EARTH_RADIUS_METERS * Math.asin(Math.sqrt(Math.min(1, haversine)));\n}\n\nfunction isValidCoordinate(latitude: number, longitude: number): boolean {\n return (\n Number.isFinite(latitude) &&\n latitude >= -90 &&\n latitude <= 90 &&\n Number.isFinite(longitude) &&\n longitude >= -180 &&\n longitude <= 180\n );\n}\n\nfunction contextTypeMismatch(\n conditionType: Exclude<StampCondition[\"type\"], \"time_window\">,\n expectedContextType: VerificationContext[\"type\"],\n actualContextType: VerificationContext[\"type\"],\n): Result<ConditionMatch, ConditionMismatch> {\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType,\n reason: \"CONTEXT_TYPE_MISMATCH\",\n expectedContextType,\n actualContextType,\n },\n };\n}\n\nfunction assertNever(value: never): never {\n throw new Error(`Unexpected condition: ${JSON.stringify(value)}`);\n}\n\nexport function evaluateConditionDetailed(\n condition: StampCondition,\n context: VerificationContext,\n now: string,\n): Result<ConditionMatch, ConditionMismatch> {\n switch (condition.type) {\n case \"instant\":\n return context.type === \"instant\"\n ? { ok: true, value: { conditionType: \"instant\" } }\n : contextTypeMismatch(\"instant\", \"instant\", context.type);\n case \"token\":\n if (context.type !== \"token\") {\n return contextTypeMismatch(\"token\", \"token\", context.type);\n }\n return context.token === condition.token\n ? { ok: true, value: { conditionType: \"token\" } }\n : {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType: \"token\",\n reason: \"TOKEN_MISMATCH\",\n },\n };\n case \"geo\": {\n if (context.type !== \"geo\") {\n return contextTypeMismatch(\"geo\", \"geo\", context.type);\n }\n if (\n !isValidCoordinate(condition.latitude, condition.longitude) ||\n !isValidCoordinate(context.currentLatitude, context.currentLongitude) ||\n !Number.isFinite(condition.radiusMeters) ||\n condition.radiusMeters < 0\n ) {\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType: \"geo\",\n reason: \"INVALID_GEO_INPUT\",\n },\n };\n }\n\n const distanceMeters = calculateDistanceMeters(\n condition.latitude,\n condition.longitude,\n context.currentLatitude,\n context.currentLongitude,\n );\n if (distanceMeters <= condition.radiusMeters) {\n return { ok: true, value: { conditionType: \"geo\", distanceMeters } };\n }\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType: \"geo\",\n reason: \"OUTSIDE_RADIUS\",\n distanceMeters,\n radiusMeters: condition.radiusMeters,\n differenceMeters: distanceMeters - condition.radiusMeters,\n },\n };\n }\n case \"composite\": {\n if (context.type !== \"composite\") {\n return contextTypeMismatch(\"composite\", \"composite\", context.type);\n }\n if (condition.conditions.length !== context.contexts.length) {\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType: \"composite\",\n reason: \"CONTEXT_LENGTH_MISMATCH\",\n expectedCount: condition.conditions.length,\n actualCount: context.contexts.length,\n },\n };\n }\n\n const failures: CompositeConditionFailure[] = [];\n let matchedCount = 0;\n for (const [index, childCondition] of condition.conditions.entries()) {\n const childContext = context.contexts[index];\n if (childContext === undefined) continue;\n const result = evaluateConditionDetailed(childCondition, childContext, now);\n if (result.ok) matchedCount += 1;\n else failures.push({ index, error: result.error });\n }\n\n if (condition.operator === \"AND\" && failures.length === 0) {\n return { ok: true, value: { conditionType: \"composite\" } };\n }\n if (condition.operator === \"OR\" && matchedCount > 0) {\n return { ok: true, value: { conditionType: \"composite\" } };\n }\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType: \"composite\",\n reason: condition.operator === \"AND\" ? \"AND_CHILD_FAILED\" : \"OR_ALL_FAILED\",\n failures,\n },\n };\n }\n case \"time_window\": {\n const startsAt = Date.parse(condition.startsAt);\n const endsAt = Date.parse(condition.endsAt);\n const currentTime = Date.parse(now);\n if (!Number.isFinite(currentTime)) {\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType: \"time_window\",\n reason: \"INVALID_NOW\",\n now,\n startsAt: condition.startsAt,\n endsAt: condition.endsAt,\n },\n };\n }\n if (!Number.isFinite(startsAt) || !Number.isFinite(endsAt) || startsAt > endsAt) {\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType: \"time_window\",\n reason: \"INVALID_TIME_WINDOW\",\n now,\n startsAt: condition.startsAt,\n endsAt: condition.endsAt,\n },\n };\n }\n if (currentTime < startsAt || currentTime > endsAt) {\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n conditionType: \"time_window\",\n reason: currentTime < startsAt ? \"BEFORE_START\" : \"AFTER_END\",\n now,\n startsAt: condition.startsAt,\n endsAt: condition.endsAt,\n },\n };\n }\n const childResult = evaluateConditionDetailed(condition.condition, context, now);\n return childResult.ok ? { ok: true, value: { conditionType: \"time_window\" } } : childResult;\n }\n default:\n return assertNever(condition);\n }\n}\n\nexport function evaluateCondition(\n condition: StampCondition,\n context: VerificationContext,\n now?: string,\n): boolean {\n return evaluateConditionDetailed(condition, context, now ?? \"\").ok;\n}\n","import type { SpotItem, VerificationContext } from \"../domain/index.js\";\nimport { evaluateConditionDetailed } from \"./evaluate.js\";\n\nexport type CheckInErrorCode =\n | \"ORDER_VIOLATION\"\n | \"OUT_OF_RANGE\"\n | \"EXPIRED\"\n | \"INVALID_PROOF\"\n | \"INVALID_CONTEXT\"\n | \"ALREADY_CLAIMED\";\n\nexport interface CheckInContext {\n readonly verificationContext: VerificationContext;\n readonly now?: string;\n readonly expectedStampId?: string;\n readonly proof?: string;\n readonly alreadyClaimed?: boolean;\n}\n\nexport type CheckInInput =\n | VerificationContext\n | (VerificationContext & {\n readonly now?: string;\n readonly expectedStampId?: string;\n readonly alreadyClaimed?: boolean;\n })\n | CheckInContext;\n\nexport type CheckInResult =\n | {\n readonly ok: true;\n readonly success: true;\n readonly stampId: string;\n readonly checkedAt: string;\n }\n | {\n readonly ok: false;\n readonly success: false;\n readonly code: CheckInErrorCode;\n readonly stampId: string;\n readonly message: string;\n };\n\nfunction unwrapContext(input: CheckInInput): {\n readonly context: VerificationContext;\n readonly now: string;\n readonly expectedStampId?: string;\n readonly alreadyClaimed: boolean;\n} {\n if (\"verificationContext\" in input) {\n return {\n context: input.verificationContext,\n now: input.now ?? new Date().toISOString(),\n ...(input.expectedStampId === undefined ? {} : { expectedStampId: input.expectedStampId }),\n alreadyClaimed: input.alreadyClaimed ?? false,\n };\n }\n return {\n context: input,\n now: \"now\" in input && typeof input.now === \"string\" ? input.now : new Date().toISOString(),\n ...(\"expectedStampId\" in input && typeof input.expectedStampId === \"string\"\n ? { expectedStampId: input.expectedStampId }\n : {}),\n alreadyClaimed: \"alreadyClaimed\" in input && input.alreadyClaimed === true,\n };\n}\n\nexport function evaluateCheckIn(spot: SpotItem, input: CheckInInput): CheckInResult {\n const context = unwrapContext(input);\n if (context.alreadyClaimed) {\n return {\n ok: false,\n success: false,\n code: \"ALREADY_CLAIMED\",\n stampId: spot.id,\n message: \"This spot has already been claimed.\",\n };\n }\n if (context.expectedStampId !== undefined && context.expectedStampId !== spot.id) {\n return {\n ok: false,\n success: false,\n code: \"ORDER_VIOLATION\",\n stampId: spot.id,\n message: `The next required spot is '${context.expectedStampId}'.`,\n };\n }\n const evaluated = evaluateConditionDetailed(spot.condition, context.context, context.now);\n if (evaluated.ok) {\n return { ok: true, success: true, stampId: spot.id, checkedAt: context.now };\n }\n const code =\n evaluated.error.reason === \"OUTSIDE_RADIUS\"\n ? \"OUT_OF_RANGE\"\n : evaluated.error.reason === \"BEFORE_START\" || evaluated.error.reason === \"AFTER_END\"\n ? \"EXPIRED\"\n : evaluated.error.reason === \"TOKEN_MISMATCH\"\n ? \"INVALID_PROOF\"\n : \"INVALID_CONTEXT\";\n return { ok: false, success: false, code, stampId: spot.id, message: evaluated.error.reason };\n}\n","import type { RallyConfig, StampDefinition } from \"../domain/index.js\";\n\ninterface OrderedStamp {\n readonly stamp: StampDefinition;\n readonly index: number;\n}\n\nexport function getOrderedStamps(config: RallyConfig): ReadonlyArray<StampDefinition> {\n return config.stamps\n .map((stamp, index): OrderedStamp => ({ stamp, index }))\n .sort((left, right) => {\n const orderDifference =\n (left.stamp.order ?? Number.POSITIVE_INFINITY) -\n (right.stamp.order ?? Number.POSITIVE_INFINITY);\n return orderDifference === 0 ? left.index - right.index : orderDifference;\n })\n .map(({ stamp }) => stamp);\n}\n","import type { RallyConfig, StampDefinition, StampRallyState } from \"../domain/index.js\";\nimport { getOrderedStamps } from \"./order.js\";\n\nexport interface StampRallyProgress {\n readonly acquired: number;\n readonly total: number;\n readonly percentage: number;\n readonly isCompleted: boolean;\n /** @deprecated Use isCompleted instead. */\n readonly isComplete: boolean;\n readonly nextAvailableStamps: ReadonlyArray<StampDefinition>;\n}\n\nexport function calculateProgress(state: StampRallyState, config: RallyConfig): StampRallyProgress {\n const configuredStampIds = new Set(config.stamps.map((stamp) => stamp.id));\n const acquiredStampIds = new Set(\n state.records\n .map((record) => record.stampId)\n .filter((stampId) => configuredStampIds.has(stampId)),\n );\n const total = config.stamps.length;\n const acquired = acquiredStampIds.size;\n const isCompleted = total > 0 && acquired === total;\n\n const remainingStamps = config.stamps.filter((stamp) => !acquiredStampIds.has(stamp.id));\n const nextAvailableStamps =\n config.isSequential === true\n ? getOrderedStamps(config)\n .filter((stamp) => !acquiredStampIds.has(stamp.id))\n .slice(0, 1)\n : remainingStamps;\n\n return {\n acquired,\n total,\n percentage: total === 0 ? 0 : (acquired / total) * 100,\n isCompleted,\n isComplete: isCompleted,\n nextAvailableStamps,\n };\n}\n","import type { RewardItem, 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: RewardItem,\n currentState: RewardState,\n options: ClaimTicketOptions = {},\n): RewardState {\n if (currentState.claimTicketNumber !== undefined) return currentState;\n const claimTicketNumber = reward.claimTicketNumber ?? createClaimTicketNumber(reward.id, options);\n return { ...currentState, claimTicketNumber };\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: \"geo\" }>;\nexport type TokenVerificationContext = Extract<VerificationContext, { readonly type: \"token\" }>;\nexport type DetectorResult<T extends VerificationContext> = Result<T, DetectorError>;\n\nexport interface PasscodeCondition {\n readonly passcode: string;\n readonly caseSensitive?: boolean;\n}\n\nexport type CheckInResult =\n | { readonly success: true }\n | {\n readonly success: false;\n readonly reason: \"INVALID_PASSCODE\";\n readonly message: string;\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 currentLatitude = position.coords.latitude;\n const currentLongitude = position.coords.longitude;\n if (\n !Number.isFinite(currentLatitude) ||\n currentLatitude < -90 ||\n currentLatitude > 90 ||\n !Number.isFinite(currentLongitude) ||\n currentLongitude < -180 ||\n currentLongitude > 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: \"geo\", currentLatitude, currentLongitude },\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, TokenVerificationContext } 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<TokenVerificationContext>> {\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<TokenVerificationContext>) => {\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: \"token\", 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","import type { CheckInResult, PasscodeCondition } from \"./types.js\";\n\nexport function normalizePasscode(input: string, caseSensitive = false): string {\n const normalized = input.normalize(\"NFKC\").trim();\n return caseSensitive ? normalized : normalized.toUpperCase();\n}\n\nexport function verifyPasscode(inputCode: string, condition: PasscodeCondition): CheckInResult {\n const input = normalizePasscode(inputCode, condition.caseSensitive);\n const expected = normalizePasscode(condition.passcode, condition.caseSensitive);\n\n return input === expected\n ? { success: true }\n : {\n success: false,\n reason: \"INVALID_PASSCODE\",\n message: \"The passcode is invalid.\",\n };\n}\n","import type { Result } from \"../domain/index.js\";\nimport type { DetectorError, DetectorResult, TokenVerificationContext } 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<TokenVerificationContext>> {\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: \"token\", 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 RallyConfig,\n Result,\n RewardItem,\n RewardState,\n StampError,\n StampRallyState,\n StampRecord,\n VerificationContext,\n} from \"../domain/index.js\";\nimport { evaluateConditionDetailed } from \"./evaluate.js\";\nimport { getOrderedStamps } from \"./order.js\";\nimport { createUniqueClaimTicketNumber } from \"./rewards.js\";\n\nexport type StampRallyEvent =\n | {\n readonly type: \"stampAcquired\";\n readonly record: StampRecord;\n }\n | {\n readonly type: \"rallyCompleted\";\n readonly rallyId: string;\n readonly completedAt: string;\n }\n | {\n readonly type: \"rewardUnlocked\";\n readonly rewardId: string;\n readonly unlockedAt: string;\n };\n\nexport interface ProcessStampValue {\n readonly nextState: StampRallyState;\n readonly events: ReadonlyArray<StampRallyEvent>;\n}\n\nexport type RewardConsumeError =\n | { readonly code: \"NOT_AVAILABLE\"; readonly rewardId: string }\n | { readonly code: \"ALREADY_CONSUMED\"; readonly rewardId: string }\n | {\n readonly code: \"INVALID_PASSCODE\";\n readonly rewardId: string;\n readonly message: string;\n }\n | { readonly code: \"EXPIRED\"; readonly reason: \"EXPIRED\"; readonly rewardId: string }\n | { readonly code: \"OUT_OF_STOCK\"; readonly rewardId: string }\n | {\n readonly code: \"USER_LIMIT_REACHED\";\n readonly reason: \"LIMIT_EXCEEDED\";\n readonly rewardId: string;\n }\n | { readonly code: \"REWARD_NOT_FOUND\"; readonly rewardId: string };\n\nexport interface ConsumeRewardParams {\n readonly reward: RewardItem;\n readonly currentState: RewardState;\n readonly inputPasscode?: string;\n readonly staffId?: string;\n readonly now: string;\n readonly userId?: string;\n readonly userRedemptionCount?: number;\n}\n\nexport type ConsumeResult = Result<RewardState, RewardConsumeError>;\n\nexport function reconcileRewardStates(\n rewards: ReadonlyArray<RewardItem>,\n currentStates: ReadonlyArray<RewardState>,\n acquiredStampCount: number,\n now: string,\n): ReadonlyArray<RewardState> {\n const statesById = new Map(currentStates.map((state) => [state.rewardId, state]));\n\n return rewards.map((reward) => {\n const current = statesById.get(reward.id);\n if (current?.status === \"CONSUMED\" || current?.status === \"EXPIRED\") {\n return current;\n }\n\n if (reward.validUntil !== undefined && Date.parse(reward.validUntil) <= Date.parse(now)) {\n return { rewardId: reward.id, status: \"EXPIRED\" };\n }\n\n if (reward.maxStock !== undefined && (current?.redeemedCount ?? 0) >= reward.maxStock) {\n return {\n rewardId: reward.id,\n status: \"EXPIRED\",\n ...(current?.claimTicketNumber === undefined\n ? {}\n : { claimTicketNumber: current.claimTicketNumber }),\n };\n }\n\n if (acquiredStampCount >= reward.requiredStampCount) {\n if (current?.status === \"AVAILABLE\") return current;\n return {\n rewardId: reward.id,\n status: \"AVAILABLE\",\n unlockedAt: current?.unlockedAt ?? now,\n ...(current?.claimTicketNumber === undefined\n ? {}\n : { claimTicketNumber: current.claimTicketNumber }),\n };\n }\n\n if (current?.status === \"LOCKED\" && current.unlockedAt === undefined) return current;\n return { rewardId: reward.id, status: \"LOCKED\" };\n });\n}\n\nexport function consumeReward(params: ConsumeRewardParams): ConsumeResult {\n const { reward, currentState } = params;\n\n if (currentState.status === \"CONSUMED\") {\n return {\n ok: false,\n error: { code: \"ALREADY_CONSUMED\", rewardId: reward.id },\n };\n }\n\n if (currentState.status !== \"AVAILABLE\") {\n return {\n ok: false,\n error: { code: \"NOT_AVAILABLE\", rewardId: reward.id },\n };\n }\n\n if (reward.validUntil !== undefined && Date.parse(reward.validUntil) <= Date.parse(params.now)) {\n return { ok: false, error: { code: \"EXPIRED\", reason: \"EXPIRED\", rewardId: reward.id } };\n }\n if (reward.maxStock !== undefined && (currentState.redeemedCount ?? 0) >= reward.maxStock) {\n return { ok: false, error: { code: \"OUT_OF_STOCK\", rewardId: reward.id } };\n }\n if (\n reward.limitPerUser !== undefined &&\n (params.userRedemptionCount ?? currentState.userRedemptionCount ?? 0) >= reward.limitPerUser\n ) {\n return {\n ok: false,\n error: { code: \"USER_LIMIT_REACHED\", reason: \"LIMIT_EXCEEDED\", rewardId: reward.id },\n };\n }\n\n if (reward.redemptionMethod === \"staff_passcode\") {\n const passcodeResult =\n reward.staffPasscode === undefined\n ? null\n : verifyPasscode(params.inputPasscode ?? \"\", { passcode: reward.staffPasscode });\n if (passcodeResult === null || !passcodeResult.success) {\n return {\n ok: false,\n error: {\n code: \"INVALID_PASSCODE\",\n rewardId: reward.id,\n message: passcodeResult?.message ?? \"The passcode is invalid.\",\n },\n };\n }\n }\n\n if (reward.redemptionMethod === \"view_only\") {\n return { ok: true, value: currentState };\n }\n\n return {\n ok: true,\n value: {\n ...currentState,\n status: \"CONSUMED\",\n consumedAt: params.now,\n claimTicketNumber: createUniqueClaimTicketNumber(reward.id, params.now),\n ...(reward.maxStock !== undefined ||\n params.userId !== undefined ||\n params.userRedemptionCount !== undefined\n ? { redeemedCount: (currentState.redeemedCount ?? 0) + 1 }\n : {}),\n ...(params.userId === undefined\n ? {}\n : { userRedemptionCount: (currentState.userRedemptionCount ?? 0) + 1 }),\n ...(params.staffId === undefined ? {} : { consumedByStaffId: params.staffId }),\n },\n };\n}\n\nexport function processStamp(\n state: StampRallyState,\n config: RallyConfig,\n targetStampId: string,\n context: VerificationContext,\n now: string,\n): Result<ProcessStampValue, StampError> {\n const targetStamp = config.stamps.find((stamp) => stamp.id === targetStampId);\n if (targetStamp === undefined) {\n return { ok: false, error: { code: \"STAMP_NOT_FOUND\", stampId: targetStampId } };\n }\n\n const acquiredStampIds = new Set(state.records.map((record) => record.stampId));\n if (acquiredStampIds.has(targetStampId)) {\n return {\n ok: false,\n error: { code: \"STAMP_ALREADY_ACQUIRED\", stampId: targetStampId },\n };\n }\n\n if (config.isSequential === true) {\n const expectedStamp = getOrderedStamps(config).find((stamp) => !acquiredStampIds.has(stamp.id));\n if (expectedStamp !== undefined && expectedStamp.id !== targetStampId) {\n return {\n ok: false,\n error: {\n code: \"INVALID_ORDER\",\n stampId: targetStampId,\n expectedStampId: expectedStamp.id,\n },\n };\n }\n }\n\n const conditionResult = evaluateConditionDetailed(targetStamp.condition, context, now);\n if (!conditionResult.ok) {\n return {\n ok: false,\n error: {\n code: \"CONDITION_MISMATCH\",\n stampId: targetStampId,\n mismatch: conditionResult.error,\n },\n };\n }\n\n const record: StampRecord = { stampId: targetStampId, acquiredAt: now };\n const nextRecords = [...state.records, record];\n const nextRewards =\n config.rewards === undefined && state.rewards === undefined\n ? undefined\n : reconcileRewardStates(config.rewards ?? [], state.rewards ?? [], nextRecords.length, now);\n const nextState: StampRallyState = {\n ...state,\n records: nextRecords,\n ...(nextRewards === undefined ? {} : { rewards: nextRewards }),\n updatedAt: now,\n };\n const events: StampRallyEvent[] = [{ type: \"stampAcquired\", record }];\n if (nextRewards !== undefined) {\n for (const rewardState of nextRewards) {\n const previous = state.rewards?.find((item) => item.rewardId === rewardState.rewardId);\n if (rewardState.status === \"AVAILABLE\" && previous?.status !== \"AVAILABLE\") {\n events.push({ type: \"rewardUnlocked\", rewardId: rewardState.rewardId, unlockedAt: now });\n }\n }\n }\n\n const completed =\n config.stamps.length > 0 &&\n config.stamps.every((stamp) => nextState.records.some((item) => item.stampId === stamp.id));\n\n if (completed) {\n events.push({ type: \"rallyCompleted\", rallyId: config.id, completedAt: now });\n }\n\n return { ok: true, value: { nextState, events } };\n}\n","import type { RewardState, StampRallyState, StampRecord } from \"../domain/index.js\";\n\nexport interface StampStorage {\n load(rallyId: string): Promise<StampRallyState | null>;\n save(state: StampRallyState): Promise<void>;\n remove(rallyId: string): 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 };\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.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 );\n}\n\nexport interface RallySnapshot {\n readonly version: 1;\n readonly rallyId: string;\n readonly stamps: 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 Array.isArray(snapshot.stamps) &&\n snapshot.stamps.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 stamps: parsed.stamps.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): Promise<StampRallyState | null> {\n const state = this.#states.get(rallyId);\n return state === undefined ? null : cloneState(state);\n }\n\n async save(state: StampRallyState): Promise<void> {\n this.#states.set(state.rallyId, cloneState(state));\n }\n\n async remove(rallyId: string): Promise<void> {\n this.#states.delete(rallyId);\n }\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): Promise<StampRallyState | null> {\n if (this.#isFallbackActive) return this.#fallbackStorage.load(rallyId);\n\n try {\n const serialized = this.#getStorage(\"load\", rallyId).getItem(this.#key(rallyId));\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),\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),\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): Promise<void> {\n if (this.#isFallbackActive) return this.#fallbackStorage.remove(rallyId);\n\n try {\n this.#getStorage(\"remove\", rallyId).removeItem(this.#key(rallyId));\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),\n );\n }\n }\n\n #key(rallyId: string): string {\n return `${this.#keyPrefix}${rallyId}`;\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): 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.objectStore(INDEXED_DB_STORE_NAME).get(rallyId);\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.objectStore(INDEXED_DB_STORE_NAME).put(cloneState(state), state.rallyId);\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): 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(rallyId);\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 {\n RallyConfig,\n Result,\n StampError,\n StampRallyState,\n VerificationContext,\n} from \"../domain/index.js\";\nimport { type ProcessStampValue, processStamp, reconcileRewardStates } from \"../engine/index.js\";\nimport { cloneState, type StampStorage } from \"./storage.js\";\n\nexport type StampRallyListener = (state: StampRallyState) => void;\nexport type Clock = () => string;\n\nconst systemClock: Clock = () => new Date().toISOString();\n\nexport class StampRallyClient {\n readonly #listeners = new Set<StampRallyListener>();\n readonly #config: RallyConfig;\n readonly #storage: StampStorage;\n readonly #clock: Clock;\n #currentState: StampRallyState | null = null;\n #initialization: Promise<StampRallyState> | null = null;\n #operationQueue: Promise<unknown> = Promise.resolve();\n\n constructor(config: RallyConfig, storage: StampStorage, clock: Clock = systemClock) {\n this.#config = config;\n this.#storage = storage;\n this.#clock = clock;\n }\n\n getState(): StampRallyState | null {\n return this.#currentState;\n }\n\n getConfig(): RallyConfig {\n return this.#config;\n }\n\n subscribe(listener: StampRallyListener): () => void {\n this.#listeners.add(listener);\n return () => {\n this.#listeners.delete(listener);\n };\n }\n\n init(): Promise<StampRallyState> {\n return this.initialize();\n }\n\n initialize(): Promise<StampRallyState> {\n if (this.#currentState !== null) {\n return Promise.resolve(this.#currentState);\n }\n\n if (this.#initialization === null) {\n this.#initialization = this.#storage\n .load(this.#config.id)\n .then((storedState) => {\n const state =\n storedState === null\n ? this.#createEmptyState(this.#clock())\n : this.#reconcileState(cloneState(storedState), storedState.updatedAt);\n this.#currentState = state;\n this.#emit(state);\n return state;\n })\n .catch((error: unknown) => {\n this.#initialization = null;\n throw error;\n });\n }\n\n return this.#initialization;\n }\n\n acquire(\n stampId: string,\n context: VerificationContext,\n now: string = this.#clock(),\n ): Promise<Result<ProcessStampValue, StampError>> {\n return this.#enqueue(async () => {\n const currentState = await this.initialize();\n const result = processStamp(currentState, this.#config, stampId, context, now);\n\n if (!result.ok) {\n return result;\n }\n\n await this.#storage.save(result.value.nextState);\n this.#currentState = result.value.nextState;\n this.#emit(result.value.nextState);\n return result;\n });\n }\n\n reset(now: string = this.#clock()): Promise<StampRallyState> {\n return this.#enqueue(async () => {\n const initialization = this.#initialization;\n if (initialization !== null) {\n await initialization.catch(() => undefined);\n }\n await this.#storage.remove(this.#config.id);\n const nextState = this.#createEmptyState(now);\n this.#currentState = nextState;\n this.#initialization = Promise.resolve(nextState);\n this.#emit(nextState);\n return nextState;\n });\n }\n\n restore(state: StampRallyState): Promise<StampRallyState> {\n return this.#enqueue(async () => {\n const initialization = this.#initialization;\n if (initialization !== null) {\n await initialization.catch(() => undefined);\n }\n if (state.rallyId !== this.#config.id) {\n throw new Error(\n `Cannot restore rally '${state.rallyId}' into client '${this.#config.id}'.`,\n );\n }\n\n const nextState = this.#reconcileState(cloneState(state), state.updatedAt);\n await this.#storage.save(nextState);\n this.#currentState = nextState;\n this.#initialization = Promise.resolve(nextState);\n this.#emit(nextState);\n return nextState;\n });\n }\n\n #enqueue<T>(operation: () => Promise<T>): Promise<T> {\n const next = this.#operationQueue.then(operation, operation);\n this.#operationQueue = next.then(\n () => undefined,\n () => undefined,\n );\n return next;\n }\n\n #emit(state: StampRallyState): void {\n for (const listener of this.#listeners) {\n listener(state);\n }\n }\n\n #createEmptyState(now: string): StampRallyState {\n const state: StampRallyState = {\n rallyId: this.#config.id,\n records: [],\n ...(this.#config.rewards === undefined\n ? {}\n : {\n rewards: reconcileRewardStates(this.#config.rewards, [], 0, now),\n }),\n updatedAt: now,\n };\n return state;\n }\n\n #reconcileState(state: StampRallyState, now: string): StampRallyState {\n const configuredStampIds = new Set(this.#config.stamps.map((stamp) => stamp.id));\n const seenStampIds = new Set<string>();\n const records = state.records.filter((record) => {\n if (!configuredStampIds.has(record.stampId) || seenStampIds.has(record.stampId)) return false;\n seenStampIds.add(record.stampId);\n return true;\n });\n if (this.#config.rewards === undefined && state.rewards === undefined) {\n return records.length === state.records.length ? state : { ...state, records };\n }\n return {\n ...state,\n records,\n rewards: reconcileRewardStates(\n this.#config.rewards ?? [],\n state.rewards ?? [],\n records.length,\n now,\n ),\n };\n }\n}\n","import type { LocalizedString, LocalizedText, SupportedLocale } from \"./models.js\";\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 = fallbackLocale ?? \"ja\";\n return text[locale as TLocale] || text[fallback as TLocale] || \"\";\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","export const CURRENT_RALLY_CONFIG_VERSION = 2;\n\nexport interface ValidationError {\n readonly path: string;\n readonly code:\n | \"INVALID_TYPE\"\n | \"REQUIRED\"\n | \"EMPTY_STRING\"\n | \"DUPLICATE_ID\"\n | \"INVALID_COORDINATES\"\n | \"INVALID_RADIUS\"\n | \"INVALID_DATE\"\n | \"INVALID_VERSION\"\n | \"INVALID_REWARD\"\n | \"CYCLE_DETECTED\";\n readonly message: string;\n}\n\nexport interface RallyConfigValidationResult {\n readonly valid: boolean;\n readonly errors: ReadonlyArray<ValidationError>;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction add(\n errors: ValidationError[],\n path: string,\n code: ValidationError[\"code\"],\n message: string,\n): void {\n errors.push({ path, code, message });\n}\n\nfunction hasText(value: unknown): boolean {\n if (typeof value === \"string\") return value.trim() !== \"\";\n if (!isObject(value)) return false;\n return Object.values(value).some((item) => typeof item === \"string\" && item.trim() !== \"\");\n}\n\nfunction validateCondition(value: unknown, path: string, errors: ValidationError[]): void {\n if (!isObject(value) || typeof value.type !== \"string\") {\n add(errors, path, \"INVALID_TYPE\", \"Condition must be an object with a type.\");\n return;\n }\n switch (value.type) {\n case \"instant\":\n return;\n case \"token\":\n if (typeof value.token !== \"string\" || value.token.trim() === \"\") {\n add(errors, `${path}.token`, \"REQUIRED\", \"Token must not be empty.\");\n }\n return;\n case \"geo\": {\n const latitude = value.latitude;\n const longitude = value.longitude;\n if (\n typeof latitude !== \"number\" ||\n !Number.isFinite(latitude) ||\n latitude < -90 ||\n latitude > 90 ||\n typeof longitude !== \"number\" ||\n !Number.isFinite(longitude) ||\n longitude < -180 ||\n longitude > 180\n ) {\n add(\n errors,\n path,\n \"INVALID_COORDINATES\",\n \"Latitude must be between -90 and 90 and longitude between -180 and 180.\",\n );\n }\n if (\n typeof value.radiusMeters !== \"number\" ||\n !Number.isFinite(value.radiusMeters) ||\n value.radiusMeters <= 0\n ) {\n add(errors, `${path}.radiusMeters`, \"INVALID_RADIUS\", \"Radius must be greater than zero.\");\n }\n return;\n }\n case \"composite\":\n if (value.operator !== \"AND\" && value.operator !== \"OR\") {\n add(errors, `${path}.operator`, \"INVALID_TYPE\", \"Operator must be AND or OR.\");\n }\n if (!Array.isArray(value.conditions)) {\n add(errors, `${path}.conditions`, \"INVALID_TYPE\", \"Composite conditions must be an array.\");\n return;\n }\n value.conditions.forEach((child, index) => {\n validateCondition(child, `${path}.conditions[${index}]`, errors);\n });\n return;\n case \"time_window\":\n if (typeof value.startsAt !== \"string\" || Number.isNaN(Date.parse(value.startsAt))) {\n add(errors, `${path}.startsAt`, \"INVALID_DATE\", \"Start must be a valid ISO date.\");\n }\n if (typeof value.endsAt !== \"string\" || Number.isNaN(Date.parse(value.endsAt))) {\n add(errors, `${path}.endsAt`, \"INVALID_DATE\", \"End must be a valid ISO date.\");\n }\n if (\n typeof value.startsAt === \"string\" &&\n typeof value.endsAt === \"string\" &&\n !Number.isNaN(Date.parse(value.startsAt)) &&\n !Number.isNaN(Date.parse(value.endsAt)) &&\n Date.parse(value.startsAt) >= Date.parse(value.endsAt)\n ) {\n add(errors, path, \"INVALID_DATE\", \"Time window start must be before its end.\");\n }\n validateCondition(value.condition, `${path}.condition`, errors);\n return;\n default:\n add(errors, `${path}.type`, \"INVALID_TYPE\", \"Unsupported condition type.\");\n }\n}\n\nfunction validateSpot(value: unknown, index: number, errors: ValidationError[]): void {\n const path = `stamps[${index}]`;\n if (!isObject(value)) {\n add(errors, path, \"INVALID_TYPE\", \"Spot must be an object.\");\n return;\n }\n if (typeof value.id !== \"string\") add(errors, `${path}.id`, \"REQUIRED\", \"Spot ID is required.\");\n else if (value.id.trim() === \"\")\n add(errors, `${path}.id`, \"EMPTY_STRING\", \"Spot ID must not be empty.\");\n if (value.name === undefined) add(errors, `${path}.name`, \"REQUIRED\", \"Spot name is required.\");\n else if (!hasText(value.name))\n add(errors, `${path}.name`, \"EMPTY_STRING\", \"Spot name must not be empty.\");\n if (\n value.order !== undefined &&\n (typeof value.order !== \"number\" || !Number.isFinite(value.order))\n ) {\n add(errors, `${path}.order`, \"INVALID_TYPE\", \"Spot order must be a finite number.\");\n }\n validateCondition(value.condition, `${path}.condition`, errors);\n for (const field of [\"dependsOn\", \"requiresStampIds\"] as const) {\n if (\n value[field] !== undefined &&\n (!Array.isArray(value[field]) || value[field].some((item) => typeof item !== \"string\"))\n ) {\n add(errors, `${path}.${field}`, \"INVALID_TYPE\", `${field} must be an array of IDs.`);\n }\n }\n}\n\nfunction validateReward(\n value: unknown,\n index: number,\n stampCount: number,\n errors: ValidationError[],\n): void {\n const path = `rewards[${index}]`;\n if (!isObject(value)) {\n add(errors, path, \"INVALID_TYPE\", \"Reward must be an object.\");\n return;\n }\n if (typeof value.id !== \"string\" || value.id.trim() === \"\") {\n add(errors, `${path}.id`, \"REQUIRED\", \"Reward ID must not be empty.\");\n }\n if (!hasText(value.title)) {\n add(errors, `${path}.title`, \"EMPTY_STRING\", \"Reward title must not be empty.\");\n }\n if (!hasText(value.description)) {\n add(errors, `${path}.description`, \"EMPTY_STRING\", \"Reward description must not be empty.\");\n }\n const required = value.requiredStampCount;\n if (\n typeof required !== \"number\" ||\n !Number.isInteger(required) ||\n required < 0 ||\n required > stampCount\n ) {\n add(\n errors,\n `${path}.requiredStampCount`,\n \"INVALID_REWARD\",\n \"Required stamps must be an integer within the rally.\",\n );\n }\n if (\n value.validUntil !== undefined &&\n (typeof value.validUntil !== \"string\" || Number.isNaN(Date.parse(value.validUntil)))\n ) {\n add(errors, `${path}.validUntil`, \"INVALID_DATE\", \"Reward expiry must be a valid ISO date.\");\n }\n for (const field of [\"maxStock\", \"limitPerUser\"] as const) {\n const count = value[field];\n if (\n count !== undefined &&\n (typeof count !== \"number\" || !Number.isInteger(count) || count <= 0)\n ) {\n add(errors, `${path}.${field}`, \"INVALID_REWARD\", `${field} must be a positive integer.`);\n }\n }\n}\n\nfunction collectDependencies(spot: Record<string, unknown>): ReadonlyArray<string> {\n const dependencies = new Set<string>();\n for (const field of [\"dependsOn\", \"requiresStampIds\"] as const) {\n const values = spot[field];\n if (Array.isArray(values))\n for (const value of values) if (typeof value === \"string\") dependencies.add(value);\n }\n return [...dependencies];\n}\n\nfunction validateDag(stamps: ReadonlyArray<unknown>, errors: ValidationError[]): void {\n const graph = new Map<string, ReadonlyArray<string>>();\n for (const value of stamps) {\n if (!isObject(value) || typeof value.id !== \"string\") continue;\n graph.set(value.id, [...(graph.get(value.id) ?? []), ...collectDependencies(value)]);\n }\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const visit = (id: string, path: string): void => {\n if (visiting.has(id)) {\n add(errors, path, \"CYCLE_DETECTED\", `Dependency cycle detected at '${id}'.`);\n return;\n }\n if (visited.has(id)) return;\n visiting.add(id);\n for (const dependency of graph.get(id) ?? [])\n if (graph.has(dependency)) visit(dependency, path);\n visiting.delete(id);\n visited.add(id);\n };\n for (const id of graph.keys()) visit(id, `stamps[${id}]`);\n}\n\nexport function validateRallyConfig(config: unknown): RallyConfigValidationResult {\n const errors: ValidationError[] = [];\n if (!isObject(config))\n return {\n valid: false,\n errors: [{ path: \"\", code: \"INVALID_TYPE\", message: \"Rally config must be an object.\" }],\n };\n if (typeof config.id !== \"string\") add(errors, \"id\", \"REQUIRED\", \"Rally ID is required.\");\n else if (config.id.trim() === \"\")\n add(errors, \"id\", \"EMPTY_STRING\", \"Rally ID must not be empty.\");\n if (config.title !== undefined && !hasText(config.title))\n add(errors, \"title\", \"EMPTY_STRING\", \"Rally title must not be empty.\");\n if (config.version !== undefined && config.version !== CURRENT_RALLY_CONFIG_VERSION) {\n add(\n errors,\n \"version\",\n \"INVALID_VERSION\",\n `Config version must be ${CURRENT_RALLY_CONFIG_VERSION}.`,\n );\n }\n for (const field of [\"startDate\", \"endDate\"] as const) {\n if (\n config[field] !== undefined &&\n (typeof config[field] !== \"string\" || Number.isNaN(Date.parse(config[field] as string)))\n ) {\n add(errors, field, \"INVALID_DATE\", `${field} must be a valid ISO date.`);\n }\n }\n if (\n typeof config.startDate === \"string\" &&\n typeof config.endDate === \"string\" &&\n !Number.isNaN(Date.parse(config.startDate)) &&\n !Number.isNaN(Date.parse(config.endDate)) &&\n Date.parse(config.startDate) >= Date.parse(config.endDate)\n ) {\n add(errors, \"startDate\", \"INVALID_DATE\", \"startDate must be before endDate.\");\n }\n if (!Array.isArray(config.stamps)) {\n add(errors, \"stamps\", \"INVALID_TYPE\", \"stamps must be an array.\");\n } else {\n config.stamps.forEach((spot, index) => {\n validateSpot(spot, index, errors);\n });\n const ids = config.stamps.map((spot) =>\n isObject(spot) && typeof spot.id === \"string\" ? spot.id : \"\",\n );\n ids.forEach((id, index) => {\n if (id !== \"\" && ids.indexOf(id) !== index)\n add(errors, `stamps[${index}].id`, \"DUPLICATE_ID\", `Duplicate spot ID '${id}'.`);\n });\n validateDag(config.stamps, errors);\n }\n if (config.rewards !== undefined && !Array.isArray(config.rewards)) {\n add(errors, \"rewards\", \"INVALID_TYPE\", \"rewards must be an array.\");\n } else if (Array.isArray(config.rewards)) {\n const stampCount = Array.isArray(config.stamps) ? config.stamps.length : 0;\n config.rewards.forEach((reward, index) => {\n validateReward(reward, index, stampCount, errors);\n });\n const ids = config.rewards.map((reward) =>\n isObject(reward) && typeof reward.id === \"string\" ? reward.id : \"\",\n );\n ids.forEach((id, index) => {\n if (id !== \"\" && ids.indexOf(id) !== index)\n add(errors, `rewards[${index}].id`, \"DUPLICATE_ID\", `Duplicate reward ID '${id}'.`);\n });\n if (Array.isArray(config.stamps)) {\n const stampIds = new Set(\n config.stamps.map((spot) => (isObject(spot) && typeof spot.id === \"string\" ? spot.id : \"\")),\n );\n ids.forEach((id, index) => {\n if (id !== \"\" && stampIds.has(id))\n add(\n errors,\n `rewards[${index}].id`,\n \"DUPLICATE_ID\",\n `Reward ID '${id}' is already used by a spot.`,\n );\n });\n }\n }\n return { valid: errors.length === 0, errors };\n}\n","import type { StampCondition } from \"./conditions.js\";\nimport type { RallyConfig, RewardItem, SheetTheme, SpotItem } from \"./models.js\";\nimport { CURRENT_RALLY_CONFIG_VERSION } from \"./validation.js\";\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction text(value: unknown): string | Partial<Record<string, string>> | undefined {\n if (typeof value === \"string\") return value;\n if (!isObject(value)) return undefined;\n const entries = Object.entries(value).filter(([, item]) => typeof item === \"string\");\n return entries.length === 0\n ? undefined\n : (Object.fromEntries(entries) as Partial<Record<string, string>>);\n}\n\nfunction condition(value: unknown): StampCondition {\n if (!isObject(value) || typeof value.type !== \"string\") return { type: \"instant\" };\n switch (value.type) {\n case \"instant\":\n return { type: \"instant\" };\n case \"token\":\n case \"passcode\":\n return {\n type: \"token\",\n token:\n typeof value.token === \"string\"\n ? value.token\n : typeof value.passcode === \"string\"\n ? value.passcode\n : \"\",\n };\n case \"geo\":\n return {\n type: \"geo\",\n latitude: typeof value.latitude === \"number\" ? value.latitude : 0,\n longitude: typeof value.longitude === \"number\" ? value.longitude : 0,\n radiusMeters:\n typeof value.radiusMeters === \"number\"\n ? value.radiusMeters\n : typeof value.radius === \"number\"\n ? value.radius\n : 1,\n };\n case \"composite\":\n return {\n type: \"composite\",\n operator: value.operator === \"OR\" ? \"OR\" : \"AND\",\n conditions: Array.isArray(value.conditions) ? value.conditions.map(condition) : [],\n };\n case \"time_window\":\n return {\n type: \"time_window\",\n startsAt: typeof value.startsAt === \"string\" ? value.startsAt : \"1970-01-01T00:00:00.000Z\",\n endsAt: typeof value.endsAt === \"string\" ? value.endsAt : \"9999-12-31T23:59:59.999Z\",\n condition: condition(value.condition),\n };\n default:\n return { type: \"instant\" };\n }\n}\n\nfunction migrateSpot(value: unknown, index: number): SpotItem {\n const source = isObject(value) ? value : {};\n const id =\n typeof source.id === \"string\" && source.id.trim() !== \"\"\n ? source.id.trim()\n : `spot-${index + 1}`;\n const description = text(source.description);\n const hint = text(source.hint);\n return {\n id,\n name: text(source.name) ?? `Spot ${index + 1}`,\n ...(description === undefined ? {} : { description }),\n ...(hint === undefined ? {} : { hint }),\n condition: condition(\n source.condition ??\n (typeof source.token === \"string\" ? { type: \"token\", token: source.token } : undefined),\n ),\n ...(typeof source.order === \"number\" ? { order: source.order } : {}),\n ...(typeof source.deckId === \"string\" ? { deckId: source.deckId } : {}),\n ...(typeof source.groupId === \"string\" ? { groupId: source.groupId } : {}),\n ...(typeof source.guideId === \"string\" ? { guideId: source.guideId } : {}),\n ...(typeof source.iconUrl === \"string\" ? { iconUrl: source.iconUrl } : {}),\n ...(typeof source.imageUrl === \"string\" ? { imageUrl: source.imageUrl } : {}),\n ...(typeof source.externalUrl === \"string\" ? { externalUrl: source.externalUrl } : {}),\n ...(typeof source.redirectUrlAfterClaim === \"string\"\n ? { redirectUrlAfterClaim: source.redirectUrlAfterClaim }\n : {}),\n ...(isObject(source.metadata) ? { metadata: source.metadata } : {}),\n ...(Array.isArray(source.dependsOn)\n ? { dependsOn: source.dependsOn.filter((item): item is string => typeof item === \"string\") }\n : {}),\n };\n}\n\nfunction migrateReward(value: unknown, index: number): RewardItem {\n const source = isObject(value) ? value : {};\n return {\n id:\n typeof source.id === \"string\" && source.id.trim() !== \"\"\n ? source.id.trim()\n : `reward-${index + 1}`,\n title: text(source.title) ?? `Reward ${index + 1}`,\n description: text(source.description) ?? \"\",\n type: source.type === \"digital\" ? \"digital\" : \"in_person\",\n redemptionMethod:\n source.redemptionMethod === \"staff_passcode\" || source.redemptionMethod === \"view_only\"\n ? source.redemptionMethod\n : \"manual_slide\",\n requiredStampCount:\n typeof source.requiredStampCount === \"number\" && Number.isFinite(source.requiredStampCount)\n ? Math.max(0, Math.trunc(source.requiredStampCount))\n : 0,\n ...(typeof source.digitalContentUrl === \"string\"\n ? { digitalContentUrl: source.digitalContentUrl }\n : {}),\n ...(typeof source.staffPasscode === \"string\" ? { staffPasscode: source.staffPasscode } : {}),\n ...(typeof source.validUntil === \"string\" ? { validUntil: source.validUntil } : {}),\n ...(typeof source.maxStock === \"number\" ? { maxStock: source.maxStock } : {}),\n ...(typeof source.limitPerUser === \"number\" ? { limitPerUser: source.limitPerUser } : {}),\n ...(typeof source.claimTicketNumber === \"string\"\n ? { claimTicketNumber: source.claimTicketNumber }\n : {}),\n };\n}\n\nexport function migrateRallyConfig(raw: unknown): RallyConfig {\n const source = isObject(raw) ? raw : {};\n const rawStamps = Array.isArray(source.stamps)\n ? source.stamps\n : Array.isArray(source.spots)\n ? source.spots\n : [];\n const rawRewards = Array.isArray(source.rewards) ? source.rewards : [];\n const id =\n typeof source.id === \"string\" && source.id.trim() !== \"\" ? source.id.trim() : \"migrated-rally\";\n const title = text(source.title);\n const description = text(source.description);\n const theme = isObject(source.theme) ? source.theme : undefined;\n return {\n id,\n ...(title === undefined ? {} : { title }),\n ...(description === undefined ? {} : { description }),\n stamps: rawStamps.map(migrateSpot),\n ...(rawRewards.length === 0 ? {} : { rewards: rawRewards.map(migrateReward) }),\n ...(typeof source.isSequential === \"boolean\" ? { isSequential: source.isSequential } : {}),\n ...(theme === undefined ? {} : { theme: theme as unknown as SheetTheme }),\n version: CURRENT_RALLY_CONFIG_VERSION,\n ...(typeof source.startDate === \"string\"\n ? { startDate: source.startDate }\n : typeof source.startsAt === \"string\"\n ? { startDate: source.startsAt }\n : {}),\n ...(typeof source.endDate === \"string\"\n ? { endDate: source.endDate }\n : typeof source.endsAt === \"string\"\n ? { endDate: source.endsAt }\n : {}),\n };\n}\n","import type { StampCondition } from \"./conditions.js\";\n\nexport type SupportedLocale = \"ja\" | \"en\";\nexport type LocalizedString<TLocale extends string = SupportedLocale> = Record<TLocale, string>;\nexport type LocalizedText<TLocale extends string = string> =\n | string\n | Partial<Record<TLocale, 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}\n\nexport type ThemePresetId = \"default\" | \"modern_dark\" | \"pop_candy\" | \"retro_craft\" | \"cyber\";\n\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}\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 SpotItem<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly id: string;\n readonly name: LocalizedText<TLocale>;\n readonly description?: LocalizedText<TLocale>;\n readonly hint?: LocalizedText<TLocale>;\n readonly condition: StampCondition;\n readonly order?: number;\n readonly deckId?: string;\n readonly groupId?: string;\n readonly guideId?: string;\n readonly iconUrl?: string;\n readonly imageUrl?: string;\n readonly externalUrl?: string;\n readonly redirectUrlAfterClaim?: string;\n readonly metadata?: TMeta;\n readonly dependsOn?: ReadonlyArray<string>;\n readonly requiresStampIds?: ReadonlyArray<string>;\n}\n\n/** @deprecated Use SpotItem instead. */\nexport type StampDefinition<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> = SpotItem<TLocale, TMeta>;\n\nexport interface StampRecord {\n readonly stampId: string;\n readonly acquiredAt: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\nexport type RewardType = \"digital\" | \"in_person\";\n\nexport type RedemptionMethod = \"manual_slide\" | \"staff_passcode\" | \"view_only\";\n\nexport type RewardStatus = \"LOCKED\" | \"AVAILABLE\" | \"CONSUMED\" | \"EXPIRED\";\n\nexport interface RewardItem<TLocale extends string = SupportedLocale> {\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 digitalContentUrl?: string;\n readonly staffPasscode?: string;\n readonly validUntil?: string;\n readonly maxStock?: number;\n readonly limitPerUser?: number;\n readonly claimTicketNumber?: string;\n}\n\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}\n\nexport interface StampRallyState {\n readonly rallyId: string;\n readonly records: ReadonlyArray<StampRecord>;\n readonly rewards?: ReadonlyArray<RewardState>;\n readonly updatedAt: string;\n}\n\nexport interface RallyConfig<\n TLocale extends string = SupportedLocale,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly id: string;\n readonly title?: LocalizedText<TLocale>;\n readonly description?: LocalizedText<TLocale>;\n readonly stamps: ReadonlyArray<StampDefinition<TLocale, TMeta>>;\n readonly rewards?: ReadonlyArray<RewardItem<TLocale>>;\n readonly isSequential?: boolean;\n readonly theme?: SheetTheme;\n readonly version?: number;\n readonly startDate?: string;\n readonly endDate?: string;\n}\n","import type { RallyConfig, RewardItem } from \"./models.js\";\n\nexport type PublicRewardItem<TLocale extends string = string> = Omit<\n RewardItem<TLocale>,\n \"staffPasscode\"\n>;\nexport type PublicRallyConfig<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> = Omit<RallyConfig<TLocale, TMeta>, \"rewards\"> & {\n readonly rewards?: ReadonlyArray<PublicRewardItem<TLocale>>;\n};\n\nexport function stripSensitiveConfig<TLocale extends string, TMeta extends Record<string, unknown>>(\n config: RallyConfig<TLocale, TMeta>,\n): PublicRallyConfig<TLocale, TMeta> {\n const rewards = config.rewards?.map(({ staffPasscode: _staffPasscode, ...reward }) => reward);\n return {\n ...config,\n ...(rewards === undefined ? {} : { rewards }),\n };\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","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"]}