@stamprally/core 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +469 -1077
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +302 -582
- package/dist/index.d.ts +302 -582
- package/dist/index.js +465 -1067
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -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/crypto/token.ts","../src/domain/i18n.ts","../src/domain/validation.ts","../src/domain/migration.ts","../src/domain/models.ts","../src/domain/universalModel.ts","../src/domain/publicConfig.ts","../src/domain/themePresets.ts","../src/domain/universalValidation.ts","../src/security/snapshotToken.ts"],"names":["condition","cryptoApi","DEFAULT_TIMEOUT_MS","record","text","isObject","source","add","hasText","validateCondition","validateDag","encoder","bytes"],"mappings":"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","file":"index.js","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.orderIndex ?? left.stamp.order ?? Number.POSITIVE_INFINITY) -\n (right.stamp.orderIndex ?? 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 const stockLimit = reward.stockLimit ?? reward.maxStock;\n if (stockLimit !== undefined && (current?.redeemedCount ?? 0) >= stockLimit) {\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 const stockLimit = reward.stockLimit ?? reward.maxStock;\n const userClaimLimit = reward.userClaimLimit ?? reward.limitPerUser;\n if (stockLimit !== undefined && (currentState.redeemedCount ?? 0) >= stockLimit) {\n return { ok: false, error: { code: \"OUT_OF_STOCK\", rewardId: reward.id } };\n }\n if (\n userClaimLimit !== undefined &&\n (params.userRedemptionCount ?? currentState.userRedemptionCount ?? 0) >= userClaimLimit\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 ...(stockLimit !== 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 LegacyPublicRallyConfig,\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 StampRallyClientEvent =\n | { readonly type: \"checkIn\"; readonly stampId: string; readonly state: StampRallyState }\n | { readonly type: \"rewardClaimed\"; readonly rewardId: string; readonly state: StampRallyState }\n | { readonly type: \"syncCompleted\"; readonly state: StampRallyState }\n | { readonly type: \"error\"; readonly error: unknown };\nexport type StampRallyEventListener = (event: StampRallyClientEvent) => void;\nexport type Clock = () => string;\n\nconst systemClock: Clock = () => new Date().toISOString();\n\nexport class StampRallyClient {\n readonly #listeners = new Set<StampRallyListener>();\n readonly #eventListeners = new Set<StampRallyEventListener>();\n #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 subscribe(listener: StampRallyEventListener, options: { readonly events: true }): () => void;\n subscribe(\n listener: StampRallyListener | StampRallyEventListener,\n options: { readonly events?: boolean } = {},\n ): () => void {\n if (options.events === true) {\n this.#eventListeners.add(listener as StampRallyEventListener);\n return () => this.#eventListeners.delete(listener as StampRallyEventListener);\n }\n this.#listeners.add(listener as StampRallyListener);\n return () => {\n this.#listeners.delete(listener as StampRallyListener);\n };\n }\n\n subscribeEvents(listener: StampRallyEventListener): () => void {\n this.#eventListeners.add(listener);\n return () => this.#eventListeners.delete(listener);\n }\n\n async updateConfig(newConfig: LegacyPublicRallyConfig): Promise<StampRallyState> {\n return this.#enqueue(async () => {\n const current = await this.initialize();\n this.#config = newConfig;\n const next = this.#reconcileState(cloneState(current), this.#clock());\n await this.#storage.save(next);\n this.#currentState = next;\n this.#initialization = Promise.resolve(next);\n this.#emit(next);\n return next;\n });\n }\n\n notifyRewardClaimed(rewardId: string, state = this.#currentState): void {\n if (state !== null) this.#emitEvent({ type: \"rewardClaimed\", rewardId, state });\n }\n\n notifySyncCompleted(state = this.#currentState): void {\n if (state !== null) this.#emitEvent({ type: \"syncCompleted\", state });\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 this.#emitEvent({ type: \"error\", error: result.error });\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 this.#emitEvent({ type: \"checkIn\", stampId, state: 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 #emitEvent(event: StampRallyClientEvent): void {\n for (const listener of this.#eventListeners) listener(event);\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","export type SecureTokenSecretKey = string | Uint8Array;\n\nexport interface SecureTokenOptions {\n readonly encrypt?: boolean;\n readonly expiresInSeconds?: number;\n}\n\nexport interface SecureTokenPayload {\n readonly [key: string]: unknown;\n readonly exp?: number;\n}\n\nexport type SecureTokenErrorCode =\n | \"MALFORMED\"\n | \"INVALID_SIGNATURE\"\n | \"DECRYPTION_FAILED\"\n | \"INVALID_PAYLOAD\"\n | \"EXPIRED\";\n\nexport interface SecureTokenError {\n readonly code: SecureTokenErrorCode;\n readonly message: string;\n}\n\nexport type SecureTokenVerification<T extends SecureTokenPayload = SecureTokenPayload> =\n | { readonly ok: true; readonly valid: true; readonly payload: T }\n | { readonly ok: false; readonly valid: false; readonly error: SecureTokenError };\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nfunction cryptoApi(): Crypto {\n if (globalThis.crypto?.subtle === undefined) {\n throw new Error(\"Web Crypto API is unavailable in this environment.\");\n }\n return globalThis.crypto;\n}\n\nfunction bytes(value: SecureTokenSecretKey): Uint8Array {\n return typeof value === \"string\" ? encoder.encode(value) : new Uint8Array(value);\n}\n\nfunction source(value: Uint8Array): BufferSource {\n return value.buffer as ArrayBuffer;\n}\n\nfunction encode(value: Uint8Array): string {\n let binary = \"\";\n for (const byte of value) binary += String.fromCharCode(byte);\n return globalThis.btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replace(/=+$/u, \"\");\n}\n\nfunction decode(value: string): Uint8Array {\n const base64 = value.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n const padded = `${base64}${\"=\".repeat((4 - (base64.length % 4)) % 4)}`;\n return Uint8Array.from(globalThis.atob(padded), (character) => character.charCodeAt(0));\n}\n\nasync function hmacKey(secret: Uint8Array): Promise<CryptoKey> {\n return cryptoApi().subtle.importKey(\n \"raw\",\n source(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\", \"verify\"],\n );\n}\n\nasync function aesKey(secret: Uint8Array): Promise<CryptoKey> {\n const digest = await cryptoApi().subtle.digest(\"SHA-256\", source(secret));\n return cryptoApi().subtle.importKey(\"raw\", digest, \"AES-GCM\", false, [\"encrypt\", \"decrypt\"]);\n}\n\nexport async function createSecureToken<T extends SecureTokenPayload>(\n payload: T,\n secretKey: SecureTokenSecretKey,\n options: SecureTokenOptions = {},\n): Promise<string> {\n const api = cryptoApi();\n const expiresInSeconds = options.expiresInSeconds;\n const effectivePayload =\n expiresInSeconds === undefined || payload.exp !== undefined\n ? payload\n : ({ ...payload, exp: Math.floor(Date.now() / 1000) + expiresInSeconds } as T);\n const secret = bytes(secretKey);\n const plaintext = encoder.encode(JSON.stringify(effectivePayload));\n const actualBody =\n options.encrypt === true ? await encryptPayload(plaintext, secret, api) : encode(plaintext);\n const signature = new Uint8Array(\n await api.subtle.sign(\"HMAC\", await hmacKey(secret), encoder.encode(actualBody)),\n );\n return `sr3.${options.encrypt === true ? \"e\" : \"p\"}.${actualBody}.${encode(signature)}`;\n}\n\nasync function encryptPayload(\n plaintext: Uint8Array,\n secret: Uint8Array,\n api: Crypto,\n): Promise<string> {\n const iv = api.getRandomValues(new Uint8Array(12));\n const encrypted = new Uint8Array(\n await api.subtle.encrypt(\n { name: \"AES-GCM\", iv: source(iv) },\n await aesKey(secret),\n source(plaintext),\n ),\n );\n return encode(new Uint8Array([...iv, ...encrypted]));\n}\n\nexport async function verifySecureToken<T extends SecureTokenPayload = SecureTokenPayload>(\n token: string,\n secretKey: SecureTokenSecretKey,\n now = Date.now(),\n): Promise<SecureTokenVerification<T>> {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 4 || parts[0] !== \"sr3\" || (parts[1] !== \"e\" && parts[1] !== \"p\")) {\n return {\n ok: false,\n valid: false,\n error: { code: \"MALFORMED\", message: \"Secure token is malformed.\" },\n };\n }\n const mode = parts[1];\n const body = parts[2];\n const encodedSignature = parts[3];\n if (body === undefined || encodedSignature === undefined || mode === undefined) {\n return {\n ok: false,\n valid: false,\n error: { code: \"MALFORMED\", message: \"Secure token is malformed.\" },\n };\n }\n const secret = bytes(secretKey);\n const valid = await cryptoApi().subtle.verify(\n \"HMAC\",\n await hmacKey(secret),\n source(decode(encodedSignature)),\n source(encoder.encode(body)),\n );\n if (!valid)\n return {\n ok: false,\n valid: false,\n error: { code: \"INVALID_SIGNATURE\", message: \"Secure token signature is invalid.\" },\n };\n const plaintext = mode === \"e\" ? await decryptPayload(body, secret) : decode(body);\n const parsed: unknown = JSON.parse(decoder.decode(plaintext));\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n return {\n ok: false,\n valid: false,\n error: { code: \"INVALID_PAYLOAD\", message: \"Secure token payload is invalid.\" },\n };\n }\n const payload = parsed as T;\n if (typeof payload.exp === \"number\" && now >= payload.exp * 1000) {\n return {\n ok: false,\n valid: false,\n error: { code: \"EXPIRED\", message: \"Secure token has expired.\" },\n };\n }\n return { ok: true, valid: true, payload };\n } catch {\n return {\n ok: false,\n valid: false,\n error: { code: \"DECRYPTION_FAILED\", message: \"Secure token could not be verified.\" },\n };\n }\n}\n\nasync function decryptPayload(body: string, secret: Uint8Array): Promise<Uint8Array> {\n const encrypted = decode(body);\n if (encrypted.length <= 12) throw new Error(\"Invalid encrypted payload.\");\n return new Uint8Array(\n await cryptoApi().subtle.decrypt(\n { name: \"AES-GCM\", iv: source(encrypted.slice(0, 12)) },\n await aesKey(secret),\n source(encrypted.slice(12)),\n ),\n );\n}\n","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 =\n fallbackLocale === undefined\n ? Object.values(text).find((value): value is string => typeof value === \"string\")\n : text[fallbackLocale as TLocale];\n return text[locale as TLocale] || fallback || \"\";\n}\n\nexport function toLocalizedString(text: LocalizedText | undefined): LocalizedString;\nexport function toLocalizedString<TLocale extends string>(\n text: LocalizedText<TLocale> | undefined,\n): LocalizedString<TLocale>;\nexport function toLocalizedString<TLocale extends string>(\n text: LocalizedText<TLocale> | undefined,\n): LocalizedString<TLocale> {\n if (text === undefined) return { ja: \"\", en: \"\" } as LocalizedString<TLocale>;\n return typeof text === \"string\"\n ? ({ ja: text, en: \"\" } as LocalizedString<TLocale>)\n : ({\n ja: text[\"ja\" as TLocale] ?? \"\",\n en: text[\"en\" as TLocale] ?? \"\",\n ...text,\n } as LocalizedString<TLocale>);\n}\n","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 for (const field of [\"order\", \"orderIndex\"] as const) {\n if (\n value[field] !== undefined &&\n (typeof value[field] !== \"number\" || !Number.isFinite(value[field]))\n ) {\n add(errors, `${path}.${field}`, \"INVALID_TYPE\", `${field} must be a finite number.`);\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\", \"stockLimit\", \"userClaimLimit\"] 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, SupportedLocale } 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.orderIndex === \"number\"\n ? { orderIndex: source.orderIndex }\n : typeof source.order === \"number\"\n ? { order: source.order }\n : {}),\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\" ||\n source.redemptionMethod === \"view_only\" ||\n source.redemptionMethod === \"server_claim\"\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.stockLimit === \"number\" ? { stockLimit: source.stockLimit } : {}),\n ...(typeof source.userClaimLimit === \"number\" ? { userClaimLimit: source.userClaimLimit } : {}),\n ...(typeof source.claimTicketNumber === \"string\"\n ? { claimTicketNumber: source.claimTicketNumber }\n : {}),\n };\n}\n\nexport function migrateRallyConfig<TLocale extends string = SupportedLocale>(\n raw: unknown,\n): RallyConfig<TLocale> {\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 } as RallyConfig<TLocale>;\n}\n","import type { StampCondition } from \"./conditions.js\";\nimport type { ExternalReference, VerificationCondition } from \"./universalModel.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>>;\nexport type LocaleDictionary<TLocale extends string = string> = Readonly<\n Record<TLocale, Readonly<Record<string, string>>>\n>;\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 orderIndex?: number;\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 /** Canonical universal-model conditions. Legacy `condition` remains for engine internals. */\n readonly conditions?: ReadonlyArray<VerificationCondition>;\n readonly externalReferences?: ReadonlyArray<ExternalReference>;\n readonly prerequisites?: ReadonlyArray<string>;\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\" | \"server_claim\";\n\nexport type RewardUnlockCondition =\n | { readonly type: \"stamp_count\"; readonly count: number }\n | { readonly type: \"stamps\"; readonly stampIds: ReadonlyArray<string> }\n | { readonly type: \"group_complete\"; readonly groupId: string }\n | {\n readonly type: \"all\" | \"any\";\n readonly conditions: ReadonlyArray<RewardUnlockCondition>;\n };\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 conditions?: ReadonlyArray<RewardUnlockCondition>;\n readonly digitalContentUrl?: string;\n readonly staffPasscode?: string;\n readonly validUntil?: string;\n readonly stockLimit?: number;\n readonly userClaimLimit?: number;\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 { SheetTheme } from \"./models.js\";\n\n/** A human-readable value that may be supplied in one or more locales. */\nexport type UniversalLocalizedText<TLocale extends string = string> =\n | string\n | Partial<Record<TLocale, string>>;\n\n/** A link to an entity owned by the host application or another system. */\nexport interface ExternalReference {\n readonly type: string;\n readonly id: string;\n readonly url?: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\n/** Server-only verification material. Never send this shape to a browser. */\nexport type VerificationCondition =\n | { readonly type: \"qr\"; readonly secretToken: string; readonly qrEntryUrl?: string }\n | { readonly type: \"passcode\"; readonly code: string; readonly caseSensitive?: boolean }\n | {\n readonly type: \"gps\";\n readonly latitude: number;\n readonly longitude: number;\n readonly radiusMeters: number;\n }\n | {\n readonly type: \"custom\";\n readonly validatorName: string;\n readonly secretParams?: Readonly<Record<string, unknown>>;\n };\n\n/** Safe condition metadata intended for a participant client. */\nexport type PublicCheckInCondition =\n | { readonly type: \"qr\"; readonly qrEntryUrl: string }\n | { readonly type: \"passcode\" }\n | {\n readonly type: \"gps\";\n readonly latitude: number;\n readonly longitude: number;\n readonly radiusMeters: number;\n }\n | { readonly type: \"custom\"; readonly validatorName: string };\n\nexport interface UniversalSpotItem<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly id: string;\n readonly orderIndex: number;\n readonly name: UniversalLocalizedText<TLocale>;\n readonly description?: UniversalLocalizedText<TLocale>;\n readonly hint?: UniversalLocalizedText<TLocale>;\n readonly imageUrl?: string;\n readonly iconUrl?: string;\n readonly redirectUrlAfterClaim?: string;\n readonly externalReferences?: ReadonlyArray<ExternalReference>;\n readonly metadata?: TMeta;\n readonly conditions: ReadonlyArray<VerificationCondition>;\n readonly prerequisites?: ReadonlyArray<string>;\n}\n\nexport type AdminReward<TLocale extends string = string> = {\n readonly id: string;\n readonly title: UniversalLocalizedText<TLocale>;\n readonly description?: UniversalLocalizedText<TLocale>;\n readonly type: \"digital\" | \"in_person\";\n readonly redemptionMethod: \"manual_slide\" | \"staff_passcode\" | \"view_only\" | \"server_claim\";\n readonly requiredStampCount: number;\n readonly conditions?: ReadonlyArray<RewardUnlockCondition>;\n readonly stockLimit?: number;\n readonly userClaimLimit?: number;\n readonly staffPasscode?: string;\n readonly digitalContentUrl?: string;\n};\n\nexport type PublicReward<TLocale extends string = string> = Omit<\n AdminReward<TLocale>,\n \"staffPasscode\" | \"digitalContentUrl\"\n>;\n\nexport type RewardUnlockCondition =\n | { readonly type: \"stamp_count\"; readonly count: number }\n | { readonly type: \"stamps\"; readonly stampIds: ReadonlyArray<string> }\n | { readonly type: \"all\" | \"any\"; readonly conditions: ReadonlyArray<RewardUnlockCondition> };\n\nexport interface AdminRallyConfig<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly id: string;\n readonly version: string;\n readonly title: UniversalLocalizedText<TLocale>;\n readonly description?: UniversalLocalizedText<TLocale>;\n readonly theme?: SheetTheme;\n readonly spots: ReadonlyArray<UniversalSpotItem<TLocale, TMeta>>;\n readonly rewards: ReadonlyArray<AdminReward<TLocale>>;\n readonly serverEndpoint?: string;\n readonly metadata?: TMeta;\n}\n\nexport interface PublicRallyConfig<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly id: string;\n readonly version: string;\n readonly title: UniversalLocalizedText<TLocale>;\n readonly description?: UniversalLocalizedText<TLocale>;\n readonly theme?: SheetTheme;\n readonly spots: ReadonlyArray<\n Omit<UniversalSpotItem<TLocale, TMeta>, \"conditions\"> & {\n readonly conditions: ReadonlyArray<PublicCheckInCondition>;\n }\n >;\n readonly rewards: ReadonlyArray<PublicReward<TLocale>>;\n readonly serverEndpoint?: string;\n readonly metadata?: TMeta;\n}\n\nfunction toPublicCondition(condition: VerificationCondition): PublicCheckInCondition {\n switch (condition.type) {\n case \"qr\":\n return { type: \"qr\", qrEntryUrl: condition.qrEntryUrl ?? \"\" };\n case \"passcode\":\n return { type: \"passcode\" };\n case \"gps\":\n return {\n type: \"gps\",\n latitude: condition.latitude,\n longitude: condition.longitude,\n radiusMeters: condition.radiusMeters,\n };\n case \"custom\":\n return { type: \"custom\", validatorName: condition.validatorName };\n }\n}\n\n/** Produce the browser-safe projection without mutating the admin config. */\nexport function toPublicRallyConfig<TLocale extends string, TMeta extends Record<string, unknown>>(\n config: AdminRallyConfig<TLocale, TMeta>,\n): PublicRallyConfig<TLocale, TMeta> {\n return {\n ...config,\n spots: config.spots.map((spot) => ({\n ...spot,\n conditions: spot.conditions.map(toPublicCondition),\n })),\n rewards: config.rewards.map(\n ({ staffPasscode: _staffPasscode, digitalContentUrl: _content, ...reward }) => reward,\n ),\n };\n}\n\n/** Runtime guard for values crossing the public configuration boundary. */\nexport function isPublicRallyConfig(value: unknown): value is PublicRallyConfig {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const candidate = value as {\n spots?: unknown;\n rewards?: unknown;\n secretKey?: unknown;\n verificationSecrets?: unknown;\n };\n if (candidate.secretKey !== undefined || candidate.verificationSecrets !== undefined)\n return false;\n return (\n Array.isArray(candidate.spots) &&\n Array.isArray(candidate.rewards) &&\n candidate.spots.every((spot) => {\n if (typeof spot !== \"object\" || spot === null || Array.isArray(spot)) return false;\n const conditions = (spot as { conditions?: unknown }).conditions;\n return (\n Array.isArray(conditions) &&\n conditions.every((condition) => {\n if (typeof condition !== \"object\" || condition === null) return false;\n const type = (condition as { type?: unknown }).type;\n return type === \"qr\" || type === \"passcode\" || type === \"gps\" || type === \"custom\";\n })\n );\n }) &&\n candidate.rewards.every((reward) => {\n if (typeof reward !== \"object\" || reward === null || Array.isArray(reward)) return false;\n const item = reward as { staffPasscode?: unknown; digitalContentUrl?: unknown };\n return item.staffPasscode === undefined && item.digitalContentUrl === undefined;\n })\n );\n}\n","import type { RallyConfig, RewardItem } from \"./models.js\";\nimport {\n type AdminRallyConfig,\n toPublicRallyConfig,\n type PublicRallyConfig as UniversalPublicRallyConfig,\n} from \"./universalModel.js\";\n\nexport type PublicRewardItem<TLocale extends string = string> = Omit<\n RewardItem<TLocale>,\n \"staffPasscode\"\n>;\nexport type LegacyPublicRallyConfig<\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: AdminRallyConfig<TLocale, TMeta>,\n): UniversalPublicRallyConfig<TLocale, TMeta>;\nexport function stripSensitiveConfig<TLocale extends string, TMeta extends Record<string, unknown>>(\n config: RallyConfig<TLocale, TMeta>,\n): LegacyPublicRallyConfig<TLocale, TMeta>;\nexport function stripSensitiveConfig<TLocale extends string, TMeta extends Record<string, unknown>>(\n config: AdminRallyConfig<TLocale, TMeta> | RallyConfig<TLocale, TMeta>,\n): UniversalPublicRallyConfig<TLocale, TMeta> | LegacyPublicRallyConfig<TLocale, TMeta> {\n if (\"spots\" in config && !(\"stamps\" in config)) {\n return toPublicRallyConfig(config as unknown as AdminRallyConfig<TLocale, TMeta>);\n }\n const rewards = config.rewards?.map(({ staffPasscode: _staffPasscode, ...reward }) => reward);\n return {\n ...config,\n ...(rewards === undefined ? {} : { rewards }),\n } as LegacyPublicRallyConfig<TLocale, TMeta>;\n}\n","import type { ThemePreset } from \"./models.js\";\n\nexport const THEME_PRESETS: ReadonlyArray<ThemePreset> = [\n {\n id: \"default\",\n name: { ja: \"クラシックブルー\", en: \"Classic Blue\" },\n description: {\n ja: \"青を基調にした、明るく親しみやすい定番デザインです。\",\n en: \"A bright, approachable classic built around a crisp blue palette.\",\n },\n theme: {\n primaryColor: \"#2563eb\",\n backgroundColor: \"#eff6ff\",\n cardBackgroundColor: \"#ffffff\",\n textColor: \"#1e293b\",\n slotShape: \"circle\",\n gridColumns: 3,\n unclaimedOpacity: 1,\n completedStampColor: \"#dc2626\",\n fontFamily: \"serif\",\n },\n },\n {\n id: \"modern_dark\",\n name: { ja: \"モダンダーク\", en: \"Modern Dark\" },\n description: {\n ja: \"深いネイビーとエメラルドでまとめた、洗練されたダークテーマです。\",\n en: \"A polished dark theme pairing deep navy with emerald accents.\",\n },\n theme: {\n primaryColor: \"#10b981\",\n backgroundColor: \"#0f172a\",\n cardBackgroundColor: \"#1e293b\",\n textColor: \"#f8fafc\",\n slotShape: \"rounded\",\n gridColumns: 3,\n unclaimedOpacity: 1,\n completedStampColor: \"#34d399\",\n fontFamily: \"system-ui\",\n },\n },\n {\n id: \"pop_candy\",\n name: { ja: \"ポップキャンディ\", en: \"Pop Candy\" },\n description: {\n ja: \"ピンクを主役にした、楽しく華やかなキャンディカラーテーマです。\",\n en: \"A playful candy-colored theme with vivid pink at center stage.\",\n },\n theme: {\n primaryColor: \"#ec4899\",\n backgroundColor: \"#fdf2f8\",\n cardBackgroundColor: \"#ffffff\",\n textColor: \"#831843\",\n slotShape: \"circle\",\n gridColumns: 2,\n unclaimedOpacity: 1,\n completedStampColor: \"#f43f5e\",\n fontFamily: \"rounded-sans\",\n },\n },\n {\n id: \"retro_craft\",\n name: { ja: \"レトロクラフト\", en: \"Retro Craft\" },\n description: {\n ja: \"クラフト紙と赤茶色のインクを思わせる、温かみのあるレトロテーマです。\",\n en: \"A warm retro theme inspired by craft paper and earthy red ink.\",\n },\n theme: {\n primaryColor: \"#9a3412\",\n backgroundColor: \"#fef3c7\",\n cardBackgroundColor: \"#fffbeb\",\n textColor: \"#78350f\",\n slotShape: \"square\",\n gridColumns: 3,\n unclaimedOpacity: 1,\n completedStampColor: \"#b91c1c\",\n fontFamily: \"handwritten\",\n },\n },\n {\n id: \"cyber\",\n name: { ja: \"サイバーネオン\", en: \"Cyber Neon\" },\n description: {\n ja: \"シアンと紫のネオンが映える、シャープな近未来テーマです。\",\n en: \"A sharp futuristic theme illuminated by cyan and violet neon.\",\n },\n theme: {\n primaryColor: \"#06b6d4\",\n backgroundColor: \"#09090b\",\n cardBackgroundColor: \"#18181b\",\n textColor: \"#fafafa\",\n slotShape: \"square\",\n gridColumns: 4,\n unclaimedOpacity: 1,\n completedStampColor: \"#a855f7\",\n fontFamily: \"monospace\",\n },\n },\n];\n","import type {\n AdminRallyConfig,\n PublicRallyConfig,\n VerificationCondition,\n} from \"./universalModel.js\";\n\nexport interface UniversalValidationError {\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_VERSION\"\n | \"INVALID_REWARD\"\n | \"CYCLE_DETECTED\"\n | \"SECRET_IN_PUBLIC_CONFIG\";\n readonly message: string;\n}\n\nexport interface UniversalValidationResult {\n readonly valid: boolean;\n readonly errors: ReadonlyArray<UniversalValidationError>;\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: UniversalValidationError[],\n path: string,\n code: UniversalValidationError[\"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 return (\n isObject(value) &&\n Object.values(value).some((item) => typeof item === \"string\" && item.trim() !== \"\")\n );\n}\n\nfunction validateCondition(\n condition: unknown,\n path: string,\n errors: UniversalValidationError[],\n): void {\n if (!isObject(condition) || typeof condition.type !== \"string\") {\n add(errors, path, \"INVALID_TYPE\", \"Condition must have a type.\");\n return;\n }\n switch (condition.type) {\n case \"qr\":\n if (typeof condition.secretToken !== \"string\" || condition.secretToken.trim() === \"\")\n add(errors, `${path}.secretToken`, \"REQUIRED\", \"QR secretToken is required.\");\n if (condition.qrEntryUrl !== undefined && typeof condition.qrEntryUrl !== \"string\")\n add(errors, `${path}.qrEntryUrl`, \"INVALID_TYPE\", \"QR entry URL must be a string.\");\n return;\n case \"passcode\":\n if (typeof condition.code !== \"string\" || condition.code.trim() === \"\")\n add(errors, `${path}.code`, \"REQUIRED\", \"Passcode is required.\");\n return;\n case \"gps\":\n if (\n typeof condition.latitude !== \"number\" ||\n !Number.isFinite(condition.latitude) ||\n condition.latitude < -90 ||\n condition.latitude > 90 ||\n typeof condition.longitude !== \"number\" ||\n !Number.isFinite(condition.longitude) ||\n condition.longitude < -180 ||\n condition.longitude > 180\n )\n add(errors, path, \"INVALID_COORDINATES\", \"GPS coordinates are invalid.\");\n if (\n typeof condition.radiusMeters !== \"number\" ||\n !Number.isFinite(condition.radiusMeters) ||\n condition.radiusMeters <= 0\n )\n add(errors, `${path}.radiusMeters`, \"INVALID_RADIUS\", \"GPS radius must be positive.\");\n return;\n case \"custom\":\n if (typeof condition.validatorName !== \"string\" || condition.validatorName.trim() === \"\")\n add(errors, `${path}.validatorName`, \"REQUIRED\", \"Custom validatorName is required.\");\n return;\n default:\n add(errors, `${path}.type`, \"INVALID_TYPE\", \"Unsupported verification condition.\");\n }\n}\n\nfunction validateDag(spots: ReadonlyArray<unknown>, errors: UniversalValidationError[]): void {\n const graph = new Map<string, ReadonlyArray<string>>();\n for (const spot of spots) {\n if (!isObject(spot) || typeof spot.id !== \"string\") continue;\n const prerequisites = Array.isArray(spot.prerequisites)\n ? spot.prerequisites.filter((item): item is string => typeof item === \"string\")\n : [];\n graph.set(spot.id, prerequisites);\n }\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const visit = (id: string): void => {\n if (visiting.has(id)) {\n add(\n errors,\n `spots.${id}.prerequisites`,\n \"CYCLE_DETECTED\",\n `Dependency cycle detected at '${id}'.`,\n );\n return;\n }\n if (visited.has(id)) return;\n visiting.add(id);\n for (const prerequisite of graph.get(id) ?? [])\n if (graph.has(prerequisite)) visit(prerequisite);\n visiting.delete(id);\n visited.add(id);\n };\n for (const id of graph.keys()) visit(id);\n}\n\nexport function validateAdminRallyConfig(value: unknown): UniversalValidationResult {\n const errors: UniversalValidationError[] = [];\n if (!isObject(value))\n return {\n valid: false,\n errors: [{ path: \"\", code: \"INVALID_TYPE\", message: \"Admin config must be an object.\" }],\n };\n if (typeof value.id !== \"string\" || value.id.trim() === \"\")\n add(errors, \"id\", \"REQUIRED\", \"Rally ID is required.\");\n if (typeof value.version !== \"string\" || value.version.trim() === \"\")\n add(errors, \"version\", \"INVALID_VERSION\", \"Version is required.\");\n if (!Array.isArray(value.spots)) {\n add(errors, \"spots\", \"INVALID_TYPE\", \"spots must be an array.\");\n } else {\n const ids: string[] = [];\n value.spots.forEach((spot, index) => {\n const path = `spots[${index}]`;\n if (!isObject(spot)) {\n add(errors, path, \"INVALID_TYPE\", \"Spot must be an object.\");\n return;\n }\n if (typeof spot.id !== \"string\" || spot.id.trim() === \"\")\n add(errors, `${path}.id`, \"REQUIRED\", \"Spot ID is required.\");\n else if (ids.includes(spot.id))\n add(errors, `${path}.id`, \"DUPLICATE_ID\", `Duplicate spot ID '${spot.id}'.`);\n else ids.push(spot.id);\n if (!hasText(spot.name)) add(errors, `${path}.name`, \"REQUIRED\", \"Spot name is required.\");\n if (typeof spot.orderIndex !== \"number\" || !Number.isInteger(spot.orderIndex))\n add(errors, `${path}.orderIndex`, \"INVALID_TYPE\", \"orderIndex must be an integer.\");\n if (!Array.isArray(spot.conditions) || spot.conditions.length === 0)\n add(errors, `${path}.conditions`, \"REQUIRED\", \"At least one condition is required.\");\n else {\n spot.conditions.forEach((condition, conditionIndex) => {\n validateCondition(condition, `${path}.conditions[${conditionIndex}]`, errors);\n });\n }\n });\n validateDag(value.spots, errors);\n }\n if (!Array.isArray(value.rewards))\n add(errors, \"rewards\", \"INVALID_TYPE\", \"rewards must be an array.\");\n else {\n const ids: string[] = [];\n value.rewards.forEach((reward, index) => {\n const path = `rewards[${index}]`;\n if (!isObject(reward)) {\n add(errors, path, \"INVALID_TYPE\", \"Reward must be an object.\");\n return;\n }\n if (typeof reward.id !== \"string\" || reward.id.trim() === \"\")\n add(errors, `${path}.id`, \"REQUIRED\", \"Reward ID is required.\");\n else if (ids.includes(reward.id))\n add(errors, `${path}.id`, \"DUPLICATE_ID\", `Duplicate reward ID '${reward.id}'.`);\n else ids.push(reward.id);\n if (!hasText(reward.title))\n add(errors, `${path}.title`, \"REQUIRED\", \"Reward title is required.\");\n if (\n typeof reward.requiredStampCount !== \"number\" ||\n !Number.isInteger(reward.requiredStampCount) ||\n reward.requiredStampCount < 0\n )\n add(\n errors,\n `${path}.requiredStampCount`,\n \"INVALID_REWARD\",\n \"requiredStampCount must be a non-negative integer.\",\n );\n });\n }\n return { valid: errors.length === 0, errors };\n}\n\nexport function validatePublicRallyConfig(value: unknown): UniversalValidationResult {\n const errors: UniversalValidationError[] = [];\n if (!isObject(value))\n return {\n valid: false,\n errors: [{ path: \"\", code: \"INVALID_TYPE\", message: \"Public config must be an object.\" }],\n };\n if (\"secretKey\" in value || \"verificationSecrets\" in value)\n add(\n errors,\n \"\",\n \"SECRET_IN_PUBLIC_CONFIG\",\n \"Public config must not contain server verification secrets.\",\n );\n if (!Array.isArray(value.spots)) add(errors, \"spots\", \"INVALID_TYPE\", \"spots must be an array.\");\n else\n value.spots.forEach((spot, index) => {\n if (!isObject(spot) || !Array.isArray(spot.conditions)) return;\n spot.conditions.forEach((condition, conditionIndex) => {\n if (!isObject(condition)) return;\n if (\"secretToken\" in condition || \"code\" in condition || \"secretParams\" in condition)\n add(\n errors,\n `spots[${index}].conditions[${conditionIndex}]`,\n \"SECRET_IN_PUBLIC_CONFIG\",\n \"Public condition contains verification secret material.\",\n );\n });\n });\n return { valid: errors.length === 0, errors };\n}\n\nexport function isAdminRallyConfig(value: unknown): value is AdminRallyConfig {\n return validateAdminRallyConfig(value).valid;\n}\n\nexport function isPublicRallyConfigShape(value: unknown): value is PublicRallyConfig {\n return validatePublicRallyConfig(value).valid;\n}\n\nexport type { VerificationCondition };\n","export type SnapshotSecretKey = string | Uint8Array;\n\nexport interface SnapshotTokenPayload {\n readonly [key: string]: unknown;\n readonly expiresAt?: string;\n readonly exp?: number;\n}\n\nexport type SnapshotTokenErrorCode =\n | \"MALFORMED\"\n | \"INVALID_SIGNATURE\"\n | \"DECRYPTION_FAILED\"\n | \"EXPIRED\"\n | \"UNSUPPORTED\";\n\nexport interface SnapshotTokenError {\n readonly code: SnapshotTokenErrorCode;\n readonly message: string;\n}\n\nexport type SnapshotTokenVerification<T extends SnapshotTokenPayload = SnapshotTokenPayload> =\n | { readonly ok: true; readonly valid: true; readonly payload: T }\n | { readonly ok: false; readonly valid: false; readonly error: SnapshotTokenError };\n\nconst encoder = new TextEncoder();\n\nfunction cryptoApi(): Crypto {\n if (globalThis.crypto === undefined || globalThis.crypto.subtle === undefined) {\n throw new Error(\"Web Crypto API is unavailable in this environment.\");\n }\n return globalThis.crypto;\n}\n\nfunction secretBytes(secretKey: SnapshotSecretKey): Uint8Array {\n return typeof secretKey === \"string\" ? encoder.encode(secretKey) : new Uint8Array(secretKey);\n}\n\nfunction webCryptoBytes(bytes: Uint8Array): BufferSource {\n return bytes.buffer as ArrayBuffer;\n}\n\nfunction base64Url(bytes: Uint8Array): string {\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return globalThis.btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replace(/=+$/u, \"\");\n}\n\nfunction fromBase64Url(value: string): Uint8Array {\n const base64 = value.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n const padded = `${base64}${\"=\".repeat((4 - (base64.length % 4)) % 4)}`;\n const binary = globalThis.atob(padded);\n return Uint8Array.from(binary, (character) => character.charCodeAt(0));\n}\n\nasync function importHmacKey(secret: Uint8Array): Promise<CryptoKey> {\n return cryptoApi().subtle.importKey(\n \"raw\",\n webCryptoBytes(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\", \"verify\"],\n );\n}\n\nasync function importAesKey(secret: Uint8Array): Promise<CryptoKey> {\n const digest = await cryptoApi().subtle.digest(\"SHA-256\", webCryptoBytes(secret));\n return cryptoApi().subtle.importKey(\"raw\", digest, \"AES-GCM\", false, [\"encrypt\", \"decrypt\"]);\n}\n\nfunction isExpired(payload: SnapshotTokenPayload, now: number): boolean {\n if (typeof payload.exp === \"number\" && now >= payload.exp * 1000) return true;\n return payload.expiresAt !== undefined && Date.parse(payload.expiresAt) <= now;\n}\n\nexport async function createSignedSnapshotToken<T extends SnapshotTokenPayload>(\n payload: T,\n secretKey: SnapshotSecretKey,\n): Promise<string> {\n const api = cryptoApi();\n const secret = secretBytes(secretKey);\n const iv = api.getRandomValues(new Uint8Array(12));\n const plaintext = encoder.encode(JSON.stringify(payload));\n const encrypted = new Uint8Array(\n await api.subtle.encrypt(\n { name: \"AES-GCM\", iv: webCryptoBytes(iv) },\n await importAesKey(secret),\n webCryptoBytes(plaintext),\n ),\n );\n const body = base64Url(new Uint8Array([...iv, ...encrypted]));\n const signature = new Uint8Array(\n await api.subtle.sign(\"HMAC\", await importHmacKey(secret), encoder.encode(body)),\n );\n return `sr2.${body}.${base64Url(signature)}`;\n}\n\nexport async function verifySnapshotToken<T extends SnapshotTokenPayload = SnapshotTokenPayload>(\n token: string,\n secretKey: SnapshotSecretKey,\n now = Date.now(),\n): Promise<SnapshotTokenVerification<T>> {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 3 || parts[0] !== \"sr2\") {\n return {\n ok: false,\n valid: false,\n error: { code: \"MALFORMED\", message: \"Snapshot token is malformed.\" },\n };\n }\n const [, body, encodedSignature] = parts;\n if (body === undefined || encodedSignature === undefined) {\n return {\n ok: false,\n valid: false,\n error: { code: \"MALFORMED\", message: \"Snapshot token is malformed.\" },\n };\n }\n const secret = secretBytes(secretKey);\n const validSignature = await cryptoApi().subtle.verify(\n \"HMAC\",\n await importHmacKey(secret),\n webCryptoBytes(fromBase64Url(encodedSignature)),\n webCryptoBytes(encoder.encode(body)),\n );\n if (!validSignature) {\n return {\n ok: false,\n valid: false,\n error: { code: \"INVALID_SIGNATURE\", message: \"Snapshot token signature is invalid.\" },\n };\n }\n const encrypted = fromBase64Url(body);\n if (encrypted.length <= 12) throw new Error(\"Invalid encrypted payload.\");\n const payloadText = await cryptoApi().subtle.decrypt(\n { name: \"AES-GCM\", iv: webCryptoBytes(encrypted.slice(0, 12)) },\n await importAesKey(secret),\n webCryptoBytes(encrypted.slice(12)),\n );\n const payload: unknown = JSON.parse(new TextDecoder().decode(payloadText));\n if (typeof payload !== \"object\" || payload === null || Array.isArray(payload))\n throw new Error(\"Invalid payload.\");\n if (isExpired(payload as SnapshotTokenPayload, now)) {\n return {\n ok: false,\n valid: false,\n error: { code: \"EXPIRED\", message: \"Snapshot token has expired.\" },\n };\n }\n return { ok: true, valid: true, payload: payload as T };\n } catch {\n return {\n ok: false,\n valid: false,\n error: { code: \"DECRYPTION_FAILED\", message: \"Snapshot token could not be verified.\" },\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/engine/evaluate.ts","../src/engine/order.ts","../src/engine/progress.ts","../src/engine/rewards.ts","../src/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/crypto/token.ts","../src/domain/i18n.ts","../src/domain/models.ts","../src/domain/themePresets.ts","../src/security/snapshotToken.ts"],"names":["value","id","cryptoApi","DEFAULT_TIMEOUT_MS","record","encoder","bytes"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n CheckInCondition,\n ConditionMatch,\n ConditionMismatch,\n Result,\n VerificationContext,\n} from \"../domain/index.js\";\n\nconst EARTH_RADIUS_METERS = 6_371_000;\nexport function calculateDistanceMeters(\n aLat: number,\n aLon: number,\n bLat: number,\n bLon: number,\n): number {\n const radians = (value: number): number => (value * Math.PI) / 180;\n const dLat = radians(bLat - aLat);\n const dLon = radians(bLon - aLon);\n const value =\n Math.sin(dLat / 2) ** 2 +\n Math.cos(radians(aLat)) * Math.cos(radians(bLat)) * Math.sin(dLon / 2) ** 2;\n return 2 * EARTH_RADIUS_METERS * Math.asin(Math.sqrt(Math.min(1, value)));\n}\nfunction mismatch(\n conditionType: CheckInCondition[\"type\"],\n reason: ConditionMismatch[\"reason\"],\n extra: Partial<ConditionMismatch> = {},\n): Result<ConditionMatch, ConditionMismatch> {\n return { ok: false, error: { code: \"CONDITION_MISMATCH\", conditionType, reason, ...extra } };\n}\nexport function evaluateConditionDetailed(\n condition: CheckInCondition,\n context: VerificationContext,\n): Result<ConditionMatch, ConditionMismatch> {\n switch (condition.type) {\n case \"qr\":\n return context.type === \"qr\" && context.token === condition.secretToken\n ? { ok: true, value: { conditionType: \"qr\" } }\n : mismatch(\"qr\", \"INVALID_PROOF\");\n case \"passcode\":\n return context.type === \"passcode\" &&\n (condition.caseSensitive === false\n ? context.code.toLocaleLowerCase() === condition.code.toLocaleLowerCase()\n : context.code === condition.code)\n ? { ok: true, value: { conditionType: \"passcode\" } }\n : mismatch(\"passcode\", \"INVALID_PROOF\");\n case \"nfc\":\n return context.type === \"nfc\" && context.tagId === condition.tagId\n ? { ok: true, value: { conditionType: \"nfc\" } }\n : mismatch(\"nfc\", \"INVALID_PROOF\");\n case \"custom\":\n return mismatch(\"custom\", \"VALIDATOR_FAILED\");\n case \"gps\": {\n if (\n !Number.isFinite(condition.latitude) ||\n !Number.isFinite(condition.longitude) ||\n !Number.isFinite(condition.radiusMeters) ||\n condition.radiusMeters < 0 ||\n context.type !== \"gps\" ||\n !Number.isFinite(context.latitude) ||\n !Number.isFinite(context.longitude)\n )\n return mismatch(\"gps\", \"INVALID_GEO_INPUT\");\n const distanceMeters = calculateDistanceMeters(\n condition.latitude,\n condition.longitude,\n context.latitude,\n context.longitude,\n );\n return distanceMeters <= condition.radiusMeters\n ? { ok: true, value: { conditionType: \"gps\", distanceMeters } }\n : mismatch(\"gps\", \"OUTSIDE_RADIUS\", {\n distanceMeters,\n radiusMeters: condition.radiusMeters,\n });\n }\n }\n}\nexport function evaluateCondition(\n condition: CheckInCondition,\n context: VerificationContext,\n): boolean {\n return evaluateConditionDetailed(condition, context).ok;\n}\n","import type { SpotItem } from \"../domain/index.js\";\nexport function getOrderedSpots<TLocale extends string, TMeta extends Record<string, unknown>>(\n spots: ReadonlyArray<SpotItem<TLocale, TMeta>>,\n): ReadonlyArray<SpotItem<TLocale, TMeta>> {\n return [...spots].sort((left, right) => left.orderIndex - right.orderIndex);\n}\n","import type { PublicSpotItem, RallyConfig, StampRallyState } from \"../domain/index.js\";\nexport interface StampRallyProgress {\n readonly acquired: number;\n readonly total: number;\n readonly percentage: number;\n readonly isCompleted: boolean;\n readonly nextAvailableSpots: ReadonlyArray<PublicSpotItem>;\n}\nexport function calculateProgress(state: StampRallyState, config: RallyConfig): StampRallyProgress {\n const ids = new Set(config.spots.map((spot) => spot.id));\n const acquired = new Set(\n state.records.map((record) => record.stampId).filter((id) => ids.has(id)),\n );\n const remaining = config.spots.filter((spot) => !acquired.has(spot.id));\n return {\n acquired: acquired.size,\n total: config.spots.length,\n percentage: config.spots.length === 0 ? 0 : (acquired.size / config.spots.length) * 100,\n isCompleted: config.spots.length > 0 && acquired.size === config.spots.length,\n nextAvailableSpots: [...remaining].sort((left, right) => left.orderIndex - right.orderIndex),\n };\n}\n","import type { Reward, RewardState } from \"../domain/models.js\";\n\nexport interface ClaimTicketOptions {\n readonly issuedAt?: string;\n readonly sequence?: number;\n}\n\nfunction hash(value: string): string {\n let result = 2_166_136_261;\n for (const character of value) {\n result ^= character.codePointAt(0) ?? 0;\n result = Math.imul(result, 16_777_619) >>> 0;\n }\n return result.toString(36).toUpperCase().padStart(7, \"0\");\n}\n\nfunction createRandomHash(): string {\n const cryptoApi = globalThis.crypto;\n if (cryptoApi !== undefined && typeof cryptoApi.getRandomValues === \"function\") {\n const values = new Uint32Array(2);\n cryptoApi.getRandomValues(values);\n return Array.from(values, (value) => value.toString(36).toUpperCase().padStart(7, \"0\")).join(\n \"\",\n );\n }\n\n return `${Date.now().toString(36).toUpperCase()}${Math.random().toString(36).slice(2).toUpperCase()}`;\n}\n\nexport function createClaimTicketNumber(\n rewardId: string,\n options: ClaimTicketOptions = {},\n): string {\n const issuedAt = options.issuedAt ?? \"\";\n const sequence = options.sequence ?? 0;\n return `SR-${hash(`${rewardId}|${issuedAt}|${sequence}`)}`;\n}\n\n/** Creates a one-time ticket for a successful reward consumption. */\nexport function createUniqueClaimTicketNumber(rewardId: string, issuedAt: string): string {\n const timestamp = Date.parse(issuedAt);\n const timestampPart = Number.isNaN(timestamp) ? Date.now() : timestamp;\n return `CLAIM-${rewardId}-${timestampPart}-${createRandomHash()}`;\n}\n\nexport function issueClaimTicketNumber(\n reward: Reward,\n currentState: RewardState,\n options: ClaimTicketOptions = {},\n): RewardState {\n if (currentState.claimTicketNumber !== undefined) return currentState;\n const claimTicketNumber = createClaimTicketNumber(reward.id, options);\n return { ...currentState, claimTicketNumber };\n}\n","import type { Result, VerificationContext } from \"../domain/index.js\";\n\nexport type DetectorKind = \"geolocation\" | \"nfc\" | \"qr\";\n\nexport type DetectorErrorCode =\n | \"UNSUPPORTED\"\n | \"PERMISSION_DENIED\"\n | \"POSITION_UNAVAILABLE\"\n | \"TIMEOUT\"\n | \"ABORTED\"\n | \"READ_FAILED\"\n | \"INVALID_DATA\"\n | \"NO_TOKEN\";\n\nexport interface DetectorError {\n readonly detector: DetectorKind;\n readonly code: DetectorErrorCode;\n readonly message: string;\n readonly cause?: unknown;\n}\n\nexport type GeoVerificationContext = Extract<VerificationContext, { readonly type: \"gps\" }>;\nexport type QrVerificationContext = Extract<VerificationContext, { readonly type: \"qr\" }>;\nexport type NfcVerificationContext = Extract<VerificationContext, { readonly type: \"nfc\" }>;\nexport type DetectorResult<T extends VerificationContext> = Result<T, DetectorError>;\n\nexport interface PasscodeCondition {\n readonly code: string;\n readonly caseSensitive?: boolean;\n}\n\nexport function createDetectorError(\n detector: DetectorKind,\n code: DetectorErrorCode,\n message: string,\n cause?: unknown,\n): DetectorError {\n return cause === undefined ? { detector, code, message } : { detector, code, message, cause };\n}\n\nexport function mapBrowserError(detector: DetectorKind, error: unknown): DetectorError {\n if (typeof DOMException !== \"undefined\" && error instanceof DOMException) {\n if (error.name === \"NotAllowedError\" || error.name === \"SecurityError\") {\n return createDetectorError(\n detector,\n \"PERMISSION_DENIED\",\n `${detector} permission was denied.`,\n error,\n );\n }\n if (error.name === \"AbortError\") {\n return createDetectorError(detector, \"ABORTED\", `${detector} detection was aborted.`, error);\n }\n if (error.name === \"NotSupportedError\") {\n return createDetectorError(\n detector,\n \"UNSUPPORTED\",\n `${detector} is not supported in this environment.`,\n error,\n );\n }\n if (error.name === \"TimeoutError\") {\n return createDetectorError(detector, \"TIMEOUT\", `${detector} detection timed out.`, error);\n }\n }\n return createDetectorError(detector, \"READ_FAILED\", `${detector} detection failed.`, error);\n}\n","import type { DetectorResult, GeoVerificationContext } from \"./types.js\";\nimport { createDetectorError } from \"./types.js\";\n\nexport interface GeoDetectorOptions {\n readonly enableHighAccuracy?: boolean;\n readonly timeout?: number;\n}\n\nexport function isGeolocationSupported(): boolean {\n return typeof navigator !== \"undefined\" && navigator.geolocation !== undefined;\n}\n\nexport function getCurrentGeoContext(\n options: GeoDetectorOptions = {},\n): Promise<DetectorResult<GeoVerificationContext>> {\n if (!isGeolocationSupported()) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n \"UNSUPPORTED\",\n \"Geolocation is not supported in this environment.\",\n ),\n });\n }\n if (options.timeout !== undefined && (!Number.isFinite(options.timeout) || options.timeout < 0)) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n \"INVALID_DATA\",\n \"Geolocation timeout must be a non-negative finite number.\",\n ),\n });\n }\n\n const positionOptions: PositionOptions = {\n ...(options.enableHighAccuracy === undefined\n ? {}\n : { enableHighAccuracy: options.enableHighAccuracy }),\n ...(options.timeout === undefined ? {} : { timeout: options.timeout }),\n };\n\n return new Promise((resolve) => {\n try {\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const latitude = position.coords.latitude;\n const longitude = position.coords.longitude;\n if (\n !Number.isFinite(latitude) ||\n latitude < -90 ||\n latitude > 90 ||\n !Number.isFinite(longitude) ||\n longitude < -180 ||\n longitude > 180\n ) {\n resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n \"INVALID_DATA\",\n \"Geolocation returned invalid coordinates.\",\n ),\n });\n return;\n }\n resolve({\n ok: true,\n value: { type: \"gps\", latitude, longitude },\n });\n },\n (error) => {\n const code =\n error.code === 1\n ? \"PERMISSION_DENIED\"\n : error.code === 2\n ? \"POSITION_UNAVAILABLE\"\n : error.code === 3\n ? \"TIMEOUT\"\n : \"READ_FAILED\";\n resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n code,\n `Geolocation failed: ${error.message || code}.`,\n error,\n ),\n });\n },\n positionOptions,\n );\n } catch (error) {\n resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n \"READ_FAILED\",\n \"Geolocation failed before a position could be requested.\",\n error,\n ),\n });\n }\n });\n}\n","import type { DetectorError, DetectorResult, NfcVerificationContext } from \"./types.js\";\nimport { createDetectorError, mapBrowserError } from \"./types.js\";\n\ninterface NdefRecordLike {\n readonly recordType: string;\n readonly encoding?: string;\n readonly data?: DataView;\n}\n\ninterface NdefReadingEventLike {\n readonly message: {\n readonly records: ReadonlyArray<NdefRecordLike>;\n };\n}\n\ninterface NdefReaderLike {\n onreading: ((event: NdefReadingEventLike) => void) | null;\n onreadingerror: ((event: Event) => void) | null;\n scan(options?: { readonly signal?: AbortSignal }): Promise<void>;\n}\n\ninterface NdefReaderConstructorLike {\n new (): NdefReaderLike;\n}\n\nexport interface NfcDetectorOptions {\n readonly timeout?: number;\n readonly signal?: AbortSignal;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nfunction getNdefReaderConstructor(): NdefReaderConstructorLike | undefined {\n return (globalThis as { readonly NDEFReader?: NdefReaderConstructorLike }).NDEFReader;\n}\n\nexport function isNfcSupported(): boolean {\n return getNdefReaderConstructor() !== undefined;\n}\n\nfunction decodeFirstTextRecord(event: NdefReadingEventLike): string | null {\n for (const record of event.message.records) {\n if (record.recordType !== \"text\" || record.data === undefined) continue;\n try {\n const token = new TextDecoder(record.encoding ?? \"utf-8\").decode(record.data);\n if (token.length > 0) return token;\n } catch {\n // Try the next text record when one payload cannot be decoded.\n }\n }\n return null;\n}\n\nexport function readNfcContext(\n options: NfcDetectorOptions = {},\n): Promise<DetectorResult<NfcVerificationContext>> {\n const Reader = getNdefReaderConstructor();\n if (Reader === undefined) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\"nfc\", \"UNSUPPORTED\", \"Web NFC is not supported.\"),\n });\n }\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeout) || timeout < 0) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\n \"nfc\",\n \"INVALID_DATA\",\n \"NFC timeout must be a non-negative finite number.\",\n ),\n });\n }\n if (options.signal?.aborted === true) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\"nfc\", \"ABORTED\", \"NFC detection was aborted.\"),\n });\n }\n\n let reader: NdefReaderLike;\n try {\n reader = new Reader();\n } catch (error) {\n return Promise.resolve({ ok: false, error: mapBrowserError(\"nfc\", error) });\n }\n\n return new Promise((resolve) => {\n const scanController = new AbortController();\n let settled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const finish = (result: DetectorResult<NfcVerificationContext>) => {\n if (settled) return;\n settled = true;\n if (timer !== undefined) clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", handleAbort);\n reader.onreading = null;\n reader.onreadingerror = null;\n scanController.abort();\n resolve(result);\n };\n const fail = (error: DetectorError) => finish({ ok: false, error });\n const handleAbort = () =>\n fail(createDetectorError(\"nfc\", \"ABORTED\", \"NFC detection was aborted.\"));\n\n options.signal?.addEventListener(\"abort\", handleAbort, { once: true });\n timer = setTimeout(\n () => fail(createDetectorError(\"nfc\", \"TIMEOUT\", \"NFC detection timed out.\")),\n timeout,\n );\n reader.onreading = (event) => {\n const token = decodeFirstTextRecord(event);\n if (token === null) {\n fail(createDetectorError(\"nfc\", \"NO_TOKEN\", \"The NFC tag has no text token.\"));\n return;\n }\n finish({ ok: true, value: { type: \"nfc\", tagId: token } });\n };\n reader.onreadingerror = (event) =>\n fail(createDetectorError(\"nfc\", \"READ_FAILED\", \"The NFC tag could not be read.\", event));\n\n try {\n void reader\n .scan({ signal: scanController.signal })\n .catch((error: unknown) => fail(mapBrowserError(\"nfc\", error)));\n } catch (error) {\n fail(mapBrowserError(\"nfc\", error));\n }\n });\n}\n","export interface PasscodeCondition {\n readonly code: string;\n readonly caseSensitive?: boolean;\n}\nexport interface PasscodeCheckResult {\n readonly success: boolean;\n readonly message?: string;\n}\nexport function normalizePasscode(input: string, caseSensitive = false): string {\n const normalized = input.normalize(\"NFKC\").trim();\n return caseSensitive ? normalized : normalized.toUpperCase();\n}\nexport function verifyPasscode(\n inputCode: string,\n condition: PasscodeCondition,\n): PasscodeCheckResult {\n return normalizePasscode(inputCode, condition.caseSensitive) ===\n normalizePasscode(condition.code, condition.caseSensitive)\n ? { success: true }\n : { success: false, message: \"The passcode is invalid.\" };\n}\n","import type { Result } from \"../domain/index.js\";\nimport type { DetectorError, DetectorResult, QrVerificationContext } from \"./types.js\";\nimport { createDetectorError, mapBrowserError } from \"./types.js\";\n\ninterface DetectedBarcodeLike {\n readonly rawValue: string;\n}\n\ninterface BarcodeDetectorLike {\n detect(source: HTMLVideoElement): Promise<ReadonlyArray<DetectedBarcodeLike>>;\n}\n\ninterface BarcodeDetectorConstructorLike {\n new (options?: { readonly formats?: ReadonlyArray<string> }): BarcodeDetectorLike;\n}\n\nexport interface QrDetectorOptions {\n readonly timeout?: number;\n readonly signal?: AbortSignal;\n readonly facingMode?: \"user\" | \"environment\";\n}\n\ninterface Termination {\n readonly promise: Promise<DetectorError>;\n readonly cleanup: () => void;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst SCAN_INTERVAL_MS = 120;\n\nfunction getBarcodeDetectorConstructor(): BarcodeDetectorConstructorLike | undefined {\n return (globalThis as { readonly BarcodeDetector?: BarcodeDetectorConstructorLike })\n .BarcodeDetector;\n}\n\nfunction getMediaDevices(): MediaDevices | undefined {\n return typeof navigator === \"undefined\" ? undefined : navigator.mediaDevices;\n}\n\nexport function isQrSupported(): boolean {\n return (\n getBarcodeDetectorConstructor() !== undefined &&\n typeof getMediaDevices()?.getUserMedia === \"function\"\n );\n}\n\nfunction createTermination(timeout: number, signal: AbortSignal | undefined): Termination {\n let settle: ((error: DetectorError) => void) | undefined;\n const promise = new Promise<DetectorError>((resolve) => {\n settle = resolve;\n });\n const handleAbort = () =>\n settle?.(createDetectorError(\"qr\", \"ABORTED\", \"QR detection was aborted.\"));\n signal?.addEventListener(\"abort\", handleAbort, { once: true });\n const timer = setTimeout(\n () => settle?.(createDetectorError(\"qr\", \"TIMEOUT\", \"QR detection timed out.\")),\n timeout,\n );\n return {\n promise,\n cleanup: () => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", handleAbort);\n settle = undefined;\n },\n };\n}\n\nasync function raceWithTermination<T>(\n operation: Promise<T>,\n termination: Promise<DetectorError>,\n): Promise<Result<T, DetectorError>> {\n return Promise.race([\n operation.then(\n (value) => ({ ok: true as const, value }),\n (error: unknown) => ({ ok: false as const, error: mapBrowserError(\"qr\", error) }),\n ),\n termination.then((error) => ({ ok: false as const, error })),\n ]);\n}\n\nfunction stopStream(stream: MediaStream): void {\n for (const track of stream.getTracks()) track.stop();\n}\n\nfunction waitForNextScan(): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, SCAN_INTERVAL_MS));\n}\n\nexport async function readQrContext(\n videoElement: HTMLVideoElement,\n options: QrDetectorOptions = {},\n): Promise<DetectorResult<QrVerificationContext>> {\n const Detector = getBarcodeDetectorConstructor();\n const mediaDevices = getMediaDevices();\n if (Detector === undefined || typeof mediaDevices?.getUserMedia !== \"function\") {\n return {\n ok: false,\n error: createDetectorError(\n \"qr\",\n \"UNSUPPORTED\",\n \"Live QR detection is not supported in this environment.\",\n ),\n };\n }\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeout) || timeout < 0) {\n return {\n ok: false,\n error: createDetectorError(\n \"qr\",\n \"INVALID_DATA\",\n \"QR timeout must be a non-negative finite number.\",\n ),\n };\n }\n if (options.signal?.aborted === true) {\n return {\n ok: false,\n error: createDetectorError(\"qr\", \"ABORTED\", \"QR detection was aborted.\"),\n };\n }\n\n const termination = createTermination(timeout, options.signal);\n let stream: MediaStream | null = null;\n try {\n const mediaPromise = mediaDevices.getUserMedia({\n audio: false,\n video: { facingMode: { ideal: options.facingMode ?? \"environment\" } },\n });\n const mediaResult = await raceWithTermination(mediaPromise, termination.promise);\n if (!mediaResult.ok) {\n void mediaPromise.then(stopStream, () => undefined);\n return mediaResult;\n }\n stream = mediaResult.value;\n videoElement.srcObject = stream;\n videoElement.muted = true;\n videoElement.playsInline = true;\n\n const playResult = await raceWithTermination(videoElement.play(), termination.promise);\n if (!playResult.ok) return playResult;\n\n const detector = new Detector({ formats: [\"qr_code\"] });\n while (true) {\n const detection = await raceWithTermination(\n detector.detect(videoElement),\n termination.promise,\n );\n if (!detection.ok) return detection;\n const token = detection.value.find((barcode) => barcode.rawValue.length > 0)?.rawValue;\n if (token !== undefined) {\n return { ok: true, value: { type: \"qr\", token } };\n }\n\n const interval = await raceWithTermination(waitForNextScan(), termination.promise);\n if (!interval.ok) return interval;\n }\n } catch (error) {\n return { ok: false, error: mapBrowserError(\"qr\", error) };\n } finally {\n termination.cleanup();\n if (stream !== null) stopStream(stream);\n try {\n videoElement.srcObject = null;\n } catch {\n // A custom video element implementation may expose a read-only srcObject.\n }\n }\n}\n","import { verifyPasscode } from \"../detectors/index.js\";\nimport type {\n AdminRallyConfig,\n Result,\n Reward,\n RewardState,\n StampError,\n StampRallyState,\n StampRecord,\n VerificationContext,\n} from \"../domain/index.js\";\nimport { evaluateConditionDetailed } from \"./evaluate.js\";\nimport { createUniqueClaimTicketNumber } from \"./rewards.js\";\n\nexport type RewardConsumeError =\n | {\n readonly code: \"NOT_AVAILABLE\" | \"ALREADY_CONSUMED\" | \"OUT_OF_STOCK\" | \"REWARD_NOT_FOUND\";\n readonly rewardId: string;\n }\n | { readonly code: \"INVALID_PASSCODE\"; readonly rewardId: string; readonly message: string }\n | { readonly code: \"EXPIRED\"; readonly rewardId: string }\n | { readonly code: \"USER_LIMIT_REACHED\"; readonly rewardId: string };\nexport interface ConsumeRewardParams {\n readonly reward: Reward;\n readonly currentState: RewardState;\n readonly inputPasscode?: string;\n readonly staffId?: string;\n readonly now: string;\n readonly userRedemptionCount?: number;\n}\nexport type ConsumeResult = Result<RewardState, RewardConsumeError>;\nexport function reconcileRewardStates(\n rewards: ReadonlyArray<Reward>,\n currentStates: ReadonlyArray<RewardState>,\n acquiredStampCount: number,\n now: string,\n): ReadonlyArray<RewardState> {\n const states = new Map(currentStates.map((state) => [state.rewardId, state]));\n return rewards.map((reward) => {\n const current = states.get(reward.id);\n if (current?.status === \"CONSUMED\" || current?.status === \"EXPIRED\") return current;\n if (reward.validUntil !== undefined && Date.parse(reward.validUntil) <= Date.parse(now))\n return { rewardId: reward.id, status: \"EXPIRED\" };\n if (reward.stockLimit !== undefined && (current?.redeemedCount ?? 0) >= reward.stockLimit)\n return { rewardId: reward.id, status: \"EXPIRED\" };\n if (acquiredStampCount >= reward.requiredStampCount)\n return {\n rewardId: reward.id,\n status: \"AVAILABLE\",\n ...(current?.unlockedAt === undefined\n ? { unlockedAt: now }\n : { unlockedAt: current.unlockedAt }),\n };\n return { rewardId: reward.id, status: \"LOCKED\" };\n });\n}\nexport function consumeReward(params: ConsumeRewardParams): ConsumeResult {\n const { reward, currentState } = params;\n if (currentState.status === \"CONSUMED\")\n return { ok: false, error: { code: \"ALREADY_CONSUMED\", rewardId: reward.id } };\n if (currentState.status !== \"AVAILABLE\")\n return { ok: false, error: { code: \"NOT_AVAILABLE\", rewardId: reward.id } };\n if (reward.validUntil !== undefined && Date.parse(reward.validUntil) <= Date.parse(params.now))\n return { ok: false, error: { code: \"EXPIRED\", rewardId: reward.id } };\n if (reward.stockLimit !== undefined && (currentState.redeemedCount ?? 0) >= reward.stockLimit)\n return { ok: false, error: { code: \"OUT_OF_STOCK\", rewardId: reward.id } };\n if (\n reward.userClaimLimit !== undefined &&\n (params.userRedemptionCount ?? currentState.userRedemptionCount ?? 0) >= reward.userClaimLimit\n )\n return { ok: false, error: { code: \"USER_LIMIT_REACHED\", rewardId: reward.id } };\n if (reward.redemptionMethod === \"staff_passcode\") {\n if (\n reward.staffPasscode === undefined ||\n !verifyPasscode(params.inputPasscode ?? \"\", { code: reward.staffPasscode }).success\n )\n return {\n ok: false,\n error: {\n code: \"INVALID_PASSCODE\",\n rewardId: reward.id,\n message: \"The passcode is invalid.\",\n },\n };\n }\n if (reward.redemptionMethod === \"view_only\") return { ok: true, value: currentState };\n return {\n ok: true,\n value: {\n ...currentState,\n status: \"CONSUMED\",\n consumedAt: params.now,\n claimTicketNumber: createUniqueClaimTicketNumber(reward.id, params.now),\n redeemedCount: (currentState.redeemedCount ?? 0) + 1,\n ...(params.staffId === undefined ? {} : { consumedByStaffId: params.staffId }),\n },\n };\n}\n\nexport interface ProcessStampValue {\n readonly nextState: StampRallyState;\n readonly events: ReadonlyArray<{ readonly type: \"stampAcquired\"; readonly record: StampRecord }>;\n}\nexport function processStamp(\n state: StampRallyState,\n config: AdminRallyConfig,\n spotId: string,\n context: VerificationContext,\n now: string,\n): Result<ProcessStampValue, StampError> {\n const spot = config.spots.find((item) => item.id === spotId);\n if (spot === undefined) return { ok: false, error: { code: \"SPOT_NOT_FOUND\", spotId } };\n if (state.records.some((record) => record.stampId === spotId))\n return { ok: false, error: { code: \"STAMP_ALREADY_ACQUIRED\", spotId } };\n const acquired = new Set(state.records.map((record) => record.stampId));\n if (spot.prerequisites?.some((id) => !acquired.has(id)))\n return { ok: false, error: { code: \"PREREQUISITES_NOT_MET\", spotId } };\n for (const condition of spot.conditions) {\n if (condition.type === \"custom\" || !evaluateConditionDetailed(condition, context).ok)\n return {\n ok: false,\n error:\n condition.type === \"custom\"\n ? {\n code: \"CUSTOM_VALIDATION_FAILED\",\n spotId,\n message: \"Custom validation requires an async validator.\",\n }\n : { code: \"INVALID_PROOF\", spotId },\n };\n }\n const record: StampRecord = { stampId: spotId, acquiredAt: now };\n const records = [...state.records, record];\n const rewards = reconcileRewardStates(config.rewards, state.rewards, records.length, now);\n return {\n ok: true,\n value: {\n nextState: { ...state, records, rewards, updatedAt: now },\n events: [{ type: \"stampAcquired\", record }],\n },\n };\n}\n","import type { RewardState, StampRallyState, StampRecord } from \"../domain/index.js\";\n\nexport interface StampStorage {\n load(rallyId: string, userId: string | null): Promise<StampRallyState | null>;\n save(state: StampRallyState): Promise<void>;\n remove(rallyId: string, userId: string | null): Promise<void>;\n}\n\nexport interface StorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport type StorageOperation = \"open\" | \"load\" | \"save\" | \"remove\";\nexport type StorageAdapterErrorCode =\n | \"STORAGE_UNAVAILABLE\"\n | \"STORAGE_OPEN_FAILED\"\n | \"STORAGE_READ_FAILED\"\n | \"STORAGE_WRITE_FAILED\"\n | \"STORAGE_REMOVE_FAILED\"\n | \"STORAGE_INVALID_DATA\";\n\nexport class StorageAdapterError extends Error {\n readonly code: StorageAdapterErrorCode;\n readonly operation: StorageOperation;\n readonly rallyId: string | undefined;\n\n constructor(\n code: StorageAdapterErrorCode,\n operation: StorageOperation,\n message: string,\n options: { readonly cause?: unknown; readonly rallyId?: string } = {},\n ) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = \"StorageAdapterError\";\n this.code = code;\n this.operation = operation;\n this.rallyId = options.rallyId;\n }\n}\n\nfunction cloneRecord(record: StampRecord): StampRecord {\n return record.metadata === undefined\n ? { ...record }\n : { ...record, metadata: { ...record.metadata } };\n}\n\nfunction cloneRewardState(state: RewardState): RewardState {\n return { ...state };\n}\n\nexport function cloneState(state: StampRallyState): StampRallyState {\n return {\n ...state,\n records: state.records.map(cloneRecord),\n ...(state.rewards === undefined ? {} : { rewards: state.rewards.map(cloneRewardState) }),\n };\n}\n\nfunction isRecord(value: unknown): value is StampRecord {\n if (typeof value !== \"object\" || value === null) return false;\n const record = value as Partial<StampRecord>;\n return (\n typeof record.stampId === \"string\" &&\n typeof record.acquiredAt === \"string\" &&\n (record.metadata === undefined ||\n (typeof record.metadata === \"object\" &&\n record.metadata !== null &&\n !Array.isArray(record.metadata)))\n );\n}\n\nconst rewardStatuses = new Set([\"LOCKED\", \"AVAILABLE\", \"CONSUMED\", \"EXPIRED\"]);\n\nfunction isOptionalDate(value: unknown): value is string | undefined {\n return value === undefined || (typeof value === \"string\" && !Number.isNaN(Date.parse(value)));\n}\n\nexport function isRewardState(value: unknown): value is RewardState {\n if (typeof value !== \"object\" || value === null) return false;\n const state = value as Partial<RewardState>;\n return (\n typeof state.rewardId === \"string\" &&\n typeof state.status === \"string\" &&\n rewardStatuses.has(state.status) &&\n isOptionalDate(state.unlockedAt) &&\n isOptionalDate(state.consumedAt) &&\n (state.consumedByStaffId === undefined || typeof state.consumedByStaffId === \"string\")\n );\n}\n\nexport function isStampRallyState(value: unknown): value is StampRallyState {\n if (typeof value !== \"object\" || value === null) return false;\n const state = value as Partial<StampRallyState>;\n return (\n typeof state.rallyId === \"string\" &&\n (typeof state.userId === \"string\" || state.userId === null) &&\n typeof state.updatedAt === \"string\" &&\n Array.isArray(state.records) &&\n state.records.every(isRecord) &&\n (state.rewards === undefined ||\n (Array.isArray(state.rewards) && state.rewards.every(isRewardState)))\n );\n}\n\nexport interface RallySnapshot {\n readonly version: 1;\n readonly rallyId: string;\n readonly userId: string | null;\n readonly records: ReadonlyArray<StampRecord>;\n readonly rewards: ReadonlyArray<RewardState>;\n readonly exportedAt: string;\n}\n\nfunction isValidDate(value: unknown): value is string {\n return typeof value === \"string\" && !Number.isNaN(Date.parse(value));\n}\n\nfunction isSnapshotRecord(value: unknown): value is StampRecord {\n return isRecord(value) && isValidDate(value.acquiredAt);\n}\n\nfunction isRallySnapshot(value: unknown): value is RallySnapshot {\n if (typeof value !== \"object\" || value === null) return false;\n const snapshot = value as Partial<RallySnapshot>;\n return (\n snapshot.version === 1 &&\n typeof snapshot.rallyId === \"string\" &&\n (typeof snapshot.userId === \"string\" || snapshot.userId === null) &&\n Array.isArray(snapshot.records) &&\n snapshot.records.every(isSnapshotRecord) &&\n Array.isArray(snapshot.rewards) &&\n snapshot.rewards.every(isRewardState) &&\n isValidDate(snapshot.exportedAt)\n );\n}\n\nexport function exportProgressToken(snapshot: RallySnapshot): string {\n return globalThis.btoa(encodeURIComponent(JSON.stringify(snapshot)));\n}\n\nexport function importProgressToken(token: string, currentRallyId: string): RallySnapshot | null {\n try {\n const parsed: unknown = JSON.parse(decodeURIComponent(globalThis.atob(token)));\n if (!isRallySnapshot(parsed) || parsed.rallyId !== currentRallyId) return null;\n return {\n ...parsed,\n records: parsed.records.map(cloneRecord),\n rewards: parsed.rewards.map(cloneRewardState),\n };\n } catch {\n return null;\n }\n}\n\nexport class InMemoryStorage implements StampStorage {\n readonly #states = new Map<string, StampRallyState>();\n\n async load(rallyId: string, userId: string | null): Promise<StampRallyState | null> {\n const state = this.#states.get(storageKey(rallyId, userId));\n return state === undefined ? null : cloneState(state);\n }\n\n async save(state: StampRallyState): Promise<void> {\n this.#states.set(storageKey(state.rallyId, state.userId), cloneState(state));\n }\n\n async remove(rallyId: string, userId: string | null): Promise<void> {\n this.#states.delete(storageKey(rallyId, userId));\n }\n}\n\nexport function storageKey(rallyId: string, userId: string | null): string {\n return `stamprally:${rallyId}:${userId ?? \"anonymous\"}`;\n}\n\nexport interface LocalStorageAdapterOptions {\n readonly storage?: StorageLike | null;\n readonly keyPrefix?: string;\n readonly failureMode?: LocalStorageFailureMode;\n readonly onWarning?: StorageWarningHandler;\n}\n\nexport type LocalStorageFailureMode = \"fallback\" | \"throw\";\nexport type StorageWarningHandler = (error: StorageAdapterError) => void;\n\nconst defaultStorageWarningHandler: StorageWarningHandler = (error) => {\n console.warn(`[@stamprally/core] ${error.message}`, error);\n};\n\nexport class LocalStorageAdapter implements StampStorage {\n readonly #providedStorage: StorageLike | null | undefined;\n readonly #keyPrefix: string;\n readonly #failureMode: LocalStorageFailureMode;\n readonly #onWarning: StorageWarningHandler;\n readonly #fallbackStorage = new InMemoryStorage();\n #isFallbackActive = false;\n\n constructor(options: LocalStorageAdapterOptions = {}) {\n this.#providedStorage = options.storage;\n this.#keyPrefix = options.keyPrefix ?? \"stamprally:\";\n this.#failureMode = options.failureMode ?? \"fallback\";\n this.#onWarning = options.onWarning ?? defaultStorageWarningHandler;\n }\n\n async load(rallyId: string, userId: string | null): Promise<StampRallyState | null> {\n if (this.#isFallbackActive) return this.#fallbackStorage.load(rallyId, userId);\n\n try {\n const serialized = this.#getStorage(\"load\", rallyId).getItem(this.#key(rallyId, userId));\n if (serialized === null) return null;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(serialized);\n } catch (cause) {\n throw new StorageAdapterError(\n \"STORAGE_INVALID_DATA\",\n \"load\",\n `Stored rally '${rallyId}' is not valid JSON.`,\n { cause, rallyId },\n );\n }\n if (!isStampRallyState(parsed) || parsed.rallyId !== rallyId) {\n throw new StorageAdapterError(\n \"STORAGE_INVALID_DATA\",\n \"load\",\n `Stored rally '${rallyId}' has an invalid state shape.`,\n { rallyId },\n );\n }\n return cloneState(parsed);\n } catch (cause) {\n return this.#handleFailure(\n this.#normalizeError(\n cause,\n \"STORAGE_READ_FAILED\",\n \"load\",\n `Failed to read rally '${rallyId}' from localStorage.`,\n rallyId,\n ),\n () => this.#fallbackStorage.load(rallyId, userId),\n );\n }\n }\n\n async save(state: StampRallyState): Promise<void> {\n if (this.#isFallbackActive) return this.#fallbackStorage.save(state);\n\n try {\n this.#getStorage(\"save\", state.rallyId).setItem(\n this.#key(state.rallyId, state.userId),\n JSON.stringify(state),\n );\n } catch (cause) {\n return this.#handleFailure(\n this.#normalizeError(\n cause,\n \"STORAGE_WRITE_FAILED\",\n \"save\",\n `Failed to save rally '${state.rallyId}' to localStorage.`,\n state.rallyId,\n ),\n () => this.#fallbackStorage.save(state),\n );\n }\n }\n\n async remove(rallyId: string, userId: string | null): Promise<void> {\n if (this.#isFallbackActive) return this.#fallbackStorage.remove(rallyId, userId);\n\n try {\n this.#getStorage(\"remove\", rallyId).removeItem(this.#key(rallyId, userId));\n } catch (cause) {\n return this.#handleFailure(\n this.#normalizeError(\n cause,\n \"STORAGE_REMOVE_FAILED\",\n \"remove\",\n `Failed to remove rally '${rallyId}' from localStorage.`,\n rallyId,\n ),\n () => this.#fallbackStorage.remove(rallyId, userId),\n );\n }\n }\n\n #key(rallyId: string, userId: string | null): string {\n return `${this.#keyPrefix}${rallyId}:${userId ?? \"anonymous\"}`;\n }\n\n #getStorage(operation: StorageOperation, rallyId: string): StorageLike {\n if (this.#providedStorage === null) {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n operation,\n \"localStorage is unavailable in this environment.\",\n { rallyId },\n );\n }\n if (this.#providedStorage !== undefined) return this.#providedStorage;\n if (typeof window === \"undefined\") {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n operation,\n \"localStorage is unavailable in this environment.\",\n { rallyId },\n );\n }\n try {\n const storage = window.localStorage;\n if (storage !== undefined) return storage;\n } catch (cause) {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n operation,\n \"localStorage is unavailable in this environment.\",\n { cause, rallyId },\n );\n }\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n operation,\n \"localStorage is unavailable in this environment.\",\n { rallyId },\n );\n }\n\n #normalizeError(\n cause: unknown,\n code: StorageAdapterErrorCode,\n operation: StorageOperation,\n message: string,\n rallyId: string,\n ): StorageAdapterError {\n return cause instanceof StorageAdapterError\n ? cause\n : new StorageAdapterError(code, operation, message, { cause, rallyId });\n }\n\n #handleFailure<T>(error: StorageAdapterError, fallback: () => Promise<T>): Promise<T> {\n if (this.#failureMode === \"throw\") throw error;\n this.#isFallbackActive = true;\n try {\n this.#onWarning(error);\n } catch {\n // Warning handlers must not prevent the safe in-memory fallback.\n }\n return fallback();\n }\n}\n\nexport interface IndexedDBAdapterOptions {\n readonly indexedDB?: IDBFactory | null;\n readonly databaseName?: string;\n}\n\nconst INDEXED_DB_STORE_NAME = \"states\";\n\nexport class IndexedDBAdapter implements StampStorage {\n readonly #providedFactory: IDBFactory | null | undefined;\n readonly #databaseName: string;\n #databasePromise: Promise<IDBDatabase> | null = null;\n\n constructor(options: IndexedDBAdapterOptions = {}) {\n this.#providedFactory = options.indexedDB;\n this.#databaseName = options.databaseName ?? \"stamprally\";\n }\n\n async load(rallyId: string, userId: string | null): Promise<StampRallyState | null> {\n const database = await this.#openDatabase(rallyId);\n return new Promise((resolve, reject) => {\n try {\n const transaction = database.transaction(INDEXED_DB_STORE_NAME, \"readonly\");\n const request = transaction\n .objectStore(INDEXED_DB_STORE_NAME)\n .get(storageKey(rallyId, userId));\n request.onsuccess = () => {\n const value: unknown = request.result;\n if (value === undefined) {\n resolve(null);\n return;\n }\n if (!isStampRallyState(value) || value.rallyId !== rallyId) {\n reject(\n new StorageAdapterError(\n \"STORAGE_INVALID_DATA\",\n \"load\",\n `Stored rally '${rallyId}' has an invalid state shape.`,\n { rallyId },\n ),\n );\n return;\n }\n resolve(cloneState(value));\n };\n request.onerror = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_READ_FAILED\",\n \"load\",\n `Failed to read rally '${rallyId}' from IndexedDB.`,\n { cause: request.error, rallyId },\n ),\n );\n };\n } catch (cause) {\n reject(\n new StorageAdapterError(\n \"STORAGE_READ_FAILED\",\n \"load\",\n `Failed to read rally '${rallyId}' from IndexedDB.`,\n { cause, rallyId },\n ),\n );\n }\n });\n }\n\n async save(state: StampRallyState): Promise<void> {\n const database = await this.#openDatabase(state.rallyId);\n return new Promise((resolve, reject) => {\n try {\n const transaction = database.transaction(INDEXED_DB_STORE_NAME, \"readwrite\");\n transaction\n .objectStore(INDEXED_DB_STORE_NAME)\n .put(cloneState(state), storageKey(state.rallyId, state.userId));\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_WRITE_FAILED\",\n \"save\",\n `Failed to save rally '${state.rallyId}' to IndexedDB.`,\n { cause: transaction.error, rallyId: state.rallyId },\n ),\n );\n };\n transaction.onabort = transaction.onerror;\n } catch (cause) {\n reject(\n new StorageAdapterError(\n \"STORAGE_WRITE_FAILED\",\n \"save\",\n `Failed to save rally '${state.rallyId}' to IndexedDB.`,\n { cause, rallyId: state.rallyId },\n ),\n );\n }\n });\n }\n\n async remove(rallyId: string, userId: string | null): Promise<void> {\n const database = await this.#openDatabase(rallyId);\n return new Promise((resolve, reject) => {\n try {\n const transaction = database.transaction(INDEXED_DB_STORE_NAME, \"readwrite\");\n transaction.objectStore(INDEXED_DB_STORE_NAME).delete(storageKey(rallyId, userId));\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_REMOVE_FAILED\",\n \"remove\",\n `Failed to remove rally '${rallyId}' from IndexedDB.`,\n { cause: transaction.error, rallyId },\n ),\n );\n };\n transaction.onabort = transaction.onerror;\n } catch (cause) {\n reject(\n new StorageAdapterError(\n \"STORAGE_REMOVE_FAILED\",\n \"remove\",\n `Failed to remove rally '${rallyId}' from IndexedDB.`,\n { cause, rallyId },\n ),\n );\n }\n });\n }\n\n #getFactory(rallyId: string): IDBFactory {\n if (this.#providedFactory === null) {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n \"open\",\n \"IndexedDB is unavailable in this environment.\",\n { rallyId },\n );\n }\n if (this.#providedFactory !== undefined) return this.#providedFactory;\n try {\n const factory = (globalThis as { readonly indexedDB?: IDBFactory }).indexedDB;\n if (factory !== undefined) return factory;\n } catch (cause) {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n \"open\",\n \"IndexedDB is unavailable in this environment.\",\n { cause, rallyId },\n );\n }\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n \"open\",\n \"IndexedDB is unavailable in this environment.\",\n { rallyId },\n );\n }\n\n #openDatabase(rallyId: string): Promise<IDBDatabase> {\n if (this.#databasePromise !== null) return this.#databasePromise;\n const factory = this.#getFactory(rallyId);\n const opening = new Promise<IDBDatabase>((resolve, reject) => {\n let request: IDBOpenDBRequest;\n try {\n request = factory.open(this.#databaseName, 1);\n } catch (cause) {\n reject(\n new StorageAdapterError(\n \"STORAGE_OPEN_FAILED\",\n \"open\",\n `Failed to open IndexedDB database '${this.#databaseName}'.`,\n { cause, rallyId },\n ),\n );\n return;\n }\n request.onupgradeneeded = () => {\n const database = request.result;\n if (!database.objectStoreNames.contains(INDEXED_DB_STORE_NAME)) {\n database.createObjectStore(INDEXED_DB_STORE_NAME);\n }\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_OPEN_FAILED\",\n \"open\",\n `Failed to open IndexedDB database '${this.#databaseName}'.`,\n { cause: request.error, rallyId },\n ),\n );\n };\n request.onblocked = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_OPEN_FAILED\",\n \"open\",\n `Opening IndexedDB database '${this.#databaseName}' was blocked.`,\n { rallyId },\n ),\n );\n };\n });\n this.#databasePromise = opening.catch((error: unknown) => {\n this.#databasePromise = null;\n throw error;\n });\n return this.#databasePromise;\n }\n}\n","import type {\n CustomValidationContext,\n PublicCheckInCondition,\n PublicRallyConfig,\n RallyConfig,\n Result,\n Reward,\n RewardState,\n StampRecord,\n UserRallyState,\n Validator,\n} from \"../domain/index.js\";\nimport { consumeReward, type RewardConsumeError, reconcileRewardStates } from \"../engine/index.js\";\nimport { cloneState, InMemoryStorage, type StampStorage, storageKey } from \"./storage.js\";\n\nexport type CheckInOptions = {\n readonly now?: string;\n readonly idempotencyKey?: string;\n readonly sync?: boolean;\n};\nexport type ClaimOptions = {\n readonly now?: string;\n readonly idempotencyKey?: string;\n readonly staffPasscode?: string;\n readonly staffId?: string;\n readonly sync?: boolean;\n};\nexport type ClientError =\n | {\n readonly code:\n | \"SPOT_NOT_FOUND\"\n | \"STAMP_ALREADY_ACQUIRED\"\n | \"PREREQUISITES_NOT_MET\"\n | \"INVALID_PROOF\";\n readonly spotId: string;\n readonly message: string;\n }\n | { readonly code: \"CUSTOM_VALIDATION_FAILED\"; readonly spotId: string; readonly message: string }\n | { readonly code: \"REWARD_NOT_FOUND\"; readonly rewardId: string; readonly message: string }\n | { readonly code: \"SYNC_FAILED\"; readonly message: string }\n | RewardConsumeError;\nexport interface CheckInSuccess {\n readonly state: UserRallyState;\n readonly record: StampRecord;\n}\nexport type CheckInResult = Result<CheckInSuccess, ClientError>;\nexport interface ClaimSuccess {\n readonly state: UserRallyState;\n readonly reward: RewardState;\n}\nexport type ClaimResult = Result<ClaimSuccess, ClientError>;\nexport type ClientEvent =\n | { readonly type: \"checkIn\"; readonly result: CheckInResult }\n | { readonly type: \"rewardClaimed\"; readonly result: ClaimResult }\n | { readonly type: \"sync\"; readonly state: UserRallyState }\n | { readonly type: \"error\"; readonly error: ClientError };\nexport type ClientListener = (state: UserRallyState) => void;\nexport type ClientEventListener = (event: ClientEvent) => void;\n\nexport interface CheckInRequest {\n readonly rallyId: string;\n readonly userId: string | null;\n readonly spotId: string;\n readonly proofData: unknown;\n readonly idempotencyKey: string;\n readonly now: string;\n readonly state: UserRallyState;\n}\nexport interface ClaimRequest {\n readonly rallyId: string;\n readonly userId: string | null;\n readonly rewardId: string;\n readonly idempotencyKey: string;\n readonly now: string;\n readonly options: ClaimOptions;\n readonly state: UserRallyState;\n}\nexport interface SyncAdapter {\n readonly checkIn?: (request: CheckInRequest) => Promise<CheckInResult>;\n readonly claimReward?: (request: ClaimRequest) => Promise<ClaimResult>;\n readonly sync?: (request: {\n readonly rallyId: string;\n readonly userId: string | null;\n readonly state: UserRallyState;\n }) => Promise<UserRallyState>;\n}\nexport interface ClientOptions {\n readonly storage?: StampStorage;\n readonly syncAdapter?: SyncAdapter;\n readonly customValidator?: Validator;\n readonly customValidators?: Readonly<Record<string, Validator>>;\n readonly clock?: () => string;\n readonly userId?: string | null;\n}\ntype StorageOrOptions = StampStorage | ClientOptions;\nfunction isStorage(value: StorageOrOptions): value is StampStorage {\n return \"load\" in value && \"save\" in value && \"remove\" in value;\n}\nfunction id(prefix: string): string {\n return `${prefix}-${globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2)}`}`;\n}\nfunction proof(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"object\" && value !== null) {\n const item = value as Record<string, unknown>;\n for (const key of [\"token\", \"code\", \"passcode\", \"value\", \"tagId\"])\n if (typeof item[key] === \"string\") return item[key];\n }\n return \"\";\n}\nfunction matches(condition: PublicCheckInCondition, value: unknown): boolean {\n if (condition.type === \"gps\") {\n if (typeof value !== \"object\" || value === null) return false;\n const item = value as Record<string, unknown>;\n const latitude = item.latitude;\n const longitude = item.longitude;\n if (typeof latitude !== \"number\" || typeof longitude !== \"number\") return false;\n const radians = (v: number): number => (v * Math.PI) / 180;\n const dLat = radians(latitude - condition.latitude);\n const dLon = radians(longitude - condition.longitude);\n const h =\n Math.sin(dLat / 2) ** 2 +\n Math.cos(radians(condition.latitude)) * Math.cos(radians(latitude)) * Math.sin(dLon / 2) ** 2;\n return 6_371_000 * 2 * Math.asin(Math.sqrt(Math.min(1, h))) <= condition.radiusMeters;\n }\n return proof(value).trim() !== \"\";\n}\nfunction emptyState(config: PublicRallyConfig, userId: string | null, now: string): UserRallyState {\n return {\n rallyId: config.id,\n userId,\n records: [],\n rewards: reconcileRewardStates(config.rewards as ReadonlyArray<Reward>, [], 0, now),\n updatedAt: now,\n };\n}\n\nexport class StampRallyClient {\n readonly #listeners = new Set<ClientListener>();\n readonly #eventListeners = new Set<ClientEventListener>();\n readonly #storage: StampStorage;\n readonly #options: ClientOptions;\n readonly #config: PublicRallyConfig;\n #userId: string | null;\n #state: UserRallyState | null = null;\n #initialization: Promise<UserRallyState> | null = null;\n #queue: Promise<unknown> = Promise.resolve();\n constructor(config: PublicRallyConfig, storageOrOptions: StorageOrOptions = {}) {\n this.#config = config;\n this.#options = isStorage(storageOrOptions) ? { storage: storageOrOptions } : storageOrOptions;\n this.#storage = this.#options.storage ?? new InMemoryStorage();\n this.#userId = this.#options.userId ?? null;\n }\n getConfig(): RallyConfig {\n return this.#config;\n }\n getState(): UserRallyState | null {\n return this.#state;\n }\n getUserId(): string | null {\n return this.#userId;\n }\n subscribe(listener: ClientListener): () => void {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n }\n subscribeEvents(listener: ClientEventListener): () => void {\n this.#eventListeners.add(listener);\n return () => this.#eventListeners.delete(listener);\n }\n init(): Promise<UserRallyState> {\n return this.initialize();\n }\n initialize(): Promise<UserRallyState> {\n if (this.#state !== null) return Promise.resolve(this.#state);\n if (this.#initialization === null) {\n this.#initialization = this.#storage\n .load(this.#config.id, this.#userId)\n .then((state) => {\n const next =\n state === null\n ? emptyState(this.#config, this.#userId, this.#now())\n : this.#reconcile(state);\n this.#state = next;\n this.#emit(next);\n return next;\n })\n .catch((error: unknown) => {\n this.#initialization = null;\n throw error;\n });\n }\n return this.#initialization;\n }\n switchUser(newUserId: string | null): Promise<UserRallyState> {\n return this.#enqueue(async () => {\n if (this.#userId === newUserId && this.#state !== null) return this.#state;\n this.#userId = newUserId;\n this.#state = null;\n this.#initialization = null;\n return this.initialize();\n });\n }\n async getUserState(rallyId: string, userId: string): Promise<UserRallyState | null> {\n return this.#storage.load(rallyId, userId);\n }\n clearUserState(userId = this.#userId): Promise<void> {\n return this.#enqueue(async () => {\n await this.#storage.remove(this.#config.id, userId);\n if (userId === this.#userId) {\n await this.#initializeFresh();\n }\n });\n }\n checkIn(\n spotId: string,\n proofData: unknown,\n options: CheckInOptions = {},\n ): Promise<CheckInResult> {\n return this.#enqueue(async () => {\n const current = await this.initialize();\n const spot = this.#config.spots.find((item) => item.id === spotId);\n if (spot === undefined)\n return this.#fail({ code: \"SPOT_NOT_FOUND\", spotId, message: \"Spot was not found.\" });\n if (current.records.some((record) => record.stampId === spotId))\n return this.#fail({\n code: \"STAMP_ALREADY_ACQUIRED\",\n spotId,\n message: \"Spot was already claimed.\",\n });\n const acquired = new Set(current.records.map((record) => record.stampId));\n if (spot.prerequisites?.some((id) => !acquired.has(id)))\n return this.#fail({\n code: \"PREREQUISITES_NOT_MET\",\n spotId,\n message: \"Prerequisite spots are not complete.\",\n });\n for (const condition of spot.conditions) {\n if (condition.type === \"custom\") {\n const validator =\n this.#options.customValidators?.[condition.validatorName] ??\n this.#options.customValidator;\n if (validator === undefined)\n return this.#fail({\n code: \"CUSTOM_VALIDATION_FAILED\",\n spotId,\n message: \"No custom validator is registered.\",\n });\n const context: CustomValidationContext = {\n rallyId: this.#config.id,\n spotId,\n proofData,\n condition: { type: \"custom\", validatorName: condition.validatorName },\n userState: current,\n };\n const result =\n typeof validator === \"function\"\n ? await validator(context)\n : await validator.validate(context);\n if (result === false || (typeof result === \"object\" && !result.valid))\n return this.#fail({\n code: \"CUSTOM_VALIDATION_FAILED\",\n spotId,\n message:\n typeof result === \"object\" && result.message !== undefined\n ? result.message\n : \"Custom validation failed.\",\n });\n } else if (!matches(condition, proofData))\n return this.#fail({ code: \"INVALID_PROOF\", spotId, message: \"Verification failed.\" });\n }\n const now = options.now ?? this.#now();\n const request: CheckInRequest = {\n rallyId: this.#config.id,\n userId: this.#userId,\n spotId,\n proofData,\n idempotencyKey: options.idempotencyKey ?? id(\"check-in\"),\n now,\n state: current,\n };\n const remote = this.#options.syncAdapter?.checkIn;\n if (options.sync !== false && remote !== undefined) {\n const result = await remote(request);\n return result.ok ? this.#commitCheckIn(result) : this.#fail(result.error);\n }\n const record = { stampId: spotId, acquiredAt: now };\n const next = this.#reconcile({\n ...current,\n records: [...current.records, record],\n updatedAt: now,\n });\n await this.#storage.save(next);\n return this.#commitCheckIn({ ok: true, value: { state: next, record } });\n });\n }\n claimReward(rewardId: string, options: ClaimOptions = {}): Promise<ClaimResult> {\n return this.#enqueue(async () => {\n const current = await this.initialize();\n const configured = this.#config.rewards.find((item) => item.id === rewardId);\n if (configured === undefined)\n return this.#fail({ code: \"REWARD_NOT_FOUND\", rewardId, message: \"Reward was not found.\" });\n const now = options.now ?? this.#now();\n const state = current.rewards.find((item) => item.rewardId === rewardId) ?? {\n rewardId,\n status: \"LOCKED\" as const,\n };\n const local = consumeReward({\n reward: configured as Reward,\n currentState: state,\n now,\n ...(options.staffPasscode === undefined ? {} : { inputPasscode: options.staffPasscode }),\n ...(options.staffId === undefined ? {} : { staffId: options.staffId }),\n });\n if (!local.ok) return this.#fail(local.error);\n const request: ClaimRequest = {\n rallyId: this.#config.id,\n userId: this.#userId,\n rewardId,\n idempotencyKey: options.idempotencyKey ?? id(\"claim\"),\n now,\n options,\n state: current,\n };\n const remote = this.#options.syncAdapter?.claimReward;\n if (options.sync !== false && remote !== undefined) {\n const result = await remote(request);\n return result.ok ? this.#commitClaim(result) : this.#fail(result.error);\n }\n const next = {\n ...current,\n rewards: current.rewards.map((item) => (item.rewardId === rewardId ? local.value : item)),\n updatedAt: now,\n };\n await this.#storage.save(next);\n return this.#commitClaim({ ok: true, value: { state: next, reward: local.value } });\n });\n }\n sync(adapter = this.#options.syncAdapter): Promise<void> {\n return this.#enqueue(async () => {\n const current = await this.initialize();\n if (adapter?.sync === undefined) {\n this.#emitEvent({ type: \"sync\", state: current });\n return;\n }\n const next = this.#reconcile(\n await adapter.sync({ rallyId: this.#config.id, userId: this.#userId, state: current }),\n );\n await this.#storage.save(next);\n this.#state = next;\n this.#emit(next);\n this.#emitEvent({ type: \"sync\", state: next });\n });\n }\n reset(): Promise<UserRallyState> {\n return this.#enqueue(async () => {\n await this.#storage.remove(this.#config.id, this.#userId);\n return this.#initializeFresh();\n });\n }\n restore(state: UserRallyState): Promise<UserRallyState> {\n return this.#enqueue(async () => {\n if (state.rallyId !== this.#config.id || state.userId !== this.#userId)\n throw new Error(\"State belongs to another rally or user.\");\n const next = this.#reconcile(state);\n await this.#storage.save(next);\n this.#state = next;\n this.#initialization = Promise.resolve(next);\n this.#emit(next);\n return next;\n });\n }\n #enqueue<T>(operation: () => Promise<T>): Promise<T> {\n const next = this.#queue.then(operation, operation);\n this.#queue = next.then(\n () => undefined,\n () => undefined,\n );\n return next;\n }\n #initializeFresh(): Promise<UserRallyState> {\n const next = emptyState(this.#config, this.#userId, this.#now());\n this.#state = next;\n this.#initialization = Promise.resolve(next);\n this.#emit(next);\n return Promise.resolve(next);\n }\n #reconcile(state: UserRallyState): UserRallyState {\n const ids = new Set(this.#config.spots.map((spot) => spot.id));\n const records = state.records.filter(\n (record, index, all) =>\n ids.has(record.stampId) &&\n all.findIndex((candidate) => candidate.stampId === record.stampId) === index,\n );\n return {\n ...cloneState(state),\n userId: this.#userId,\n records,\n rewards: reconcileRewardStates(\n this.#config.rewards as ReadonlyArray<Reward>,\n state.rewards,\n records.length,\n state.updatedAt,\n ),\n };\n }\n #now(): string {\n return this.#options.clock?.() ?? new Date().toISOString();\n }\n #fail(error: ClientError): { readonly ok: false; readonly error: ClientError } {\n this.#emitEvent({ type: \"error\", error });\n return { ok: false, error };\n }\n #commitCheckIn(result: CheckInResult): CheckInResult {\n if (result.ok) {\n this.#state = result.value.state;\n this.#emit(this.#state);\n }\n this.#emitEvent({ type: \"checkIn\", result });\n return result;\n }\n #commitClaim(result: ClaimResult): ClaimResult {\n if (result.ok) {\n this.#state = result.value.state;\n this.#emit(this.#state);\n }\n this.#emitEvent({ type: \"rewardClaimed\", result });\n return result;\n }\n #emit(state: UserRallyState): void {\n for (const listener of this.#listeners) listener(state);\n }\n #emitEvent(event: ClientEvent): void {\n for (const listener of this.#eventListeners) listener(event);\n }\n}\nexport { storageKey };\n","export type SecureTokenSecretKey = string | Uint8Array;\n\nexport interface SecureTokenOptions {\n readonly encrypt?: boolean;\n readonly expiresInSeconds?: number;\n}\n\nexport interface SecureTokenPayload {\n readonly [key: string]: unknown;\n readonly exp?: number;\n}\n\nexport type SecureTokenErrorCode =\n | \"MALFORMED\"\n | \"INVALID_SIGNATURE\"\n | \"DECRYPTION_FAILED\"\n | \"INVALID_PAYLOAD\"\n | \"EXPIRED\";\n\nexport interface SecureTokenError {\n readonly code: SecureTokenErrorCode;\n readonly message: string;\n}\n\nexport type SecureTokenVerification<T extends SecureTokenPayload = SecureTokenPayload> =\n | { readonly ok: true; readonly valid: true; readonly payload: T }\n | { readonly ok: false; readonly valid: false; readonly error: SecureTokenError };\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nfunction cryptoApi(): Crypto {\n if (globalThis.crypto?.subtle === undefined) {\n throw new Error(\"Web Crypto API is unavailable in this environment.\");\n }\n return globalThis.crypto;\n}\n\nfunction bytes(value: SecureTokenSecretKey): Uint8Array {\n return typeof value === \"string\" ? encoder.encode(value) : new Uint8Array(value);\n}\n\nfunction source(value: Uint8Array): BufferSource {\n return value.buffer as ArrayBuffer;\n}\n\nfunction encode(value: Uint8Array): string {\n let binary = \"\";\n for (const byte of value) binary += String.fromCharCode(byte);\n return globalThis.btoa(binary).replaceAll(\"+\", \"-\").replaceAll(\"/\", \"_\").replace(/=+$/u, \"\");\n}\n\nfunction decode(value: string): Uint8Array {\n const base64 = value.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n const padded = `${base64}${\"=\".repeat((4 - (base64.length % 4)) % 4)}`;\n return Uint8Array.from(globalThis.atob(padded), (character) => character.charCodeAt(0));\n}\n\nasync function hmacKey(secret: Uint8Array): Promise<CryptoKey> {\n return cryptoApi().subtle.importKey(\n \"raw\",\n source(secret),\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\", \"verify\"],\n );\n}\n\nasync function aesKey(secret: Uint8Array): Promise<CryptoKey> {\n const digest = await cryptoApi().subtle.digest(\"SHA-256\", source(secret));\n return cryptoApi().subtle.importKey(\"raw\", digest, \"AES-GCM\", false, [\"encrypt\", \"decrypt\"]);\n}\n\nexport async function createSecureToken<T extends SecureTokenPayload>(\n payload: T,\n secretKey: SecureTokenSecretKey,\n options: SecureTokenOptions = {},\n): Promise<string> {\n const api = cryptoApi();\n const expiresInSeconds = options.expiresInSeconds;\n const effectivePayload =\n expiresInSeconds === undefined || payload.exp !== undefined\n ? payload\n : ({ ...payload, exp: Math.floor(Date.now() / 1000) + expiresInSeconds } as T);\n const secret = bytes(secretKey);\n const plaintext = encoder.encode(JSON.stringify(effectivePayload));\n const actualBody =\n options.encrypt === true ? await encryptPayload(plaintext, secret, api) : encode(plaintext);\n const signature = new Uint8Array(\n await api.subtle.sign(\"HMAC\", await hmacKey(secret), encoder.encode(actualBody)),\n );\n return `sr3.${options.encrypt === true ? \"e\" : \"p\"}.${actualBody}.${encode(signature)}`;\n}\n\nasync function encryptPayload(\n plaintext: Uint8Array,\n secret: Uint8Array,\n api: Crypto,\n): Promise<string> {\n const iv = api.getRandomValues(new Uint8Array(12));\n const encrypted = new Uint8Array(\n await api.subtle.encrypt(\n { name: \"AES-GCM\", iv: source(iv) },\n await aesKey(secret),\n source(plaintext),\n ),\n );\n return encode(new Uint8Array([...iv, ...encrypted]));\n}\n\nexport async function verifySecureToken<T extends SecureTokenPayload = SecureTokenPayload>(\n token: string,\n secretKey: SecureTokenSecretKey,\n now = Date.now(),\n): Promise<SecureTokenVerification<T>> {\n try {\n const parts = token.split(\".\");\n if (parts.length !== 4 || parts[0] !== \"sr3\" || (parts[1] !== \"e\" && parts[1] !== \"p\")) {\n return {\n ok: false,\n valid: false,\n error: { code: \"MALFORMED\", message: \"Secure token is malformed.\" },\n };\n }\n const mode = parts[1];\n const body = parts[2];\n const encodedSignature = parts[3];\n if (body === undefined || encodedSignature === undefined || mode === undefined) {\n return {\n ok: false,\n valid: false,\n error: { code: \"MALFORMED\", message: \"Secure token is malformed.\" },\n };\n }\n const secret = bytes(secretKey);\n const valid = await cryptoApi().subtle.verify(\n \"HMAC\",\n await hmacKey(secret),\n source(decode(encodedSignature)),\n source(encoder.encode(body)),\n );\n if (!valid)\n return {\n ok: false,\n valid: false,\n error: { code: \"INVALID_SIGNATURE\", message: \"Secure token signature is invalid.\" },\n };\n const plaintext = mode === \"e\" ? await decryptPayload(body, secret) : decode(body);\n const parsed: unknown = JSON.parse(decoder.decode(plaintext));\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n return {\n ok: false,\n valid: false,\n error: { code: \"INVALID_PAYLOAD\", message: \"Secure token payload is invalid.\" },\n };\n }\n const payload = parsed as T;\n if (typeof payload.exp === \"number\" && now >= payload.exp * 1000) {\n return {\n ok: false,\n valid: false,\n error: { code: \"EXPIRED\", message: \"Secure token has expired.\" },\n };\n }\n return { ok: true, valid: true, payload };\n } catch {\n return {\n ok: false,\n valid: false,\n error: { code: \"DECRYPTION_FAILED\", message: \"Secure token could not be verified.\" },\n };\n }\n}\n\nasync function decryptPayload(body: string, secret: Uint8Array): Promise<Uint8Array> {\n const encrypted = decode(body);\n if (encrypted.length <= 12) throw new Error(\"Invalid encrypted payload.\");\n return new Uint8Array(\n await cryptoApi().subtle.decrypt(\n { name: \"AES-GCM\", iv: source(encrypted.slice(0, 12)) },\n await aesKey(secret),\n source(encrypted.slice(12)),\n ),\n );\n}\n","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 =\n fallbackLocale === undefined\n ? Object.values(text).find((value): value is string => typeof value === \"string\")\n : text[fallbackLocale as TLocale];\n return text[locale as TLocale] || fallback || \"\";\n}\n\nexport function toLocalizedString(text: LocalizedText | undefined): LocalizedString;\nexport function toLocalizedString<TLocale extends string>(\n text: LocalizedText<TLocale> | undefined,\n): LocalizedString<TLocale>;\nexport function toLocalizedString<TLocale extends string>(\n text: LocalizedText<TLocale> | undefined,\n): LocalizedString<TLocale> {\n if (text === undefined) return { ja: \"\", en: \"\" } as LocalizedString<TLocale>;\n return typeof text === \"string\"\n ? ({ ja: text, en: \"\" } as LocalizedString<TLocale>)\n : ({\n ja: text[\"ja\" as TLocale] ?? \"\",\n en: text[\"en\" as TLocale] ?? \"\",\n ...text,\n } as LocalizedString<TLocale>);\n}\n","export type SupportedLocale = \"ja\" | \"en\";\nexport type LocalizedText<TLocale extends string = string> =\n | string\n | Partial<Record<TLocale, string>>;\nexport type LocalizedString<TLocale extends string = SupportedLocale> = Record<TLocale, string>;\nexport type LocaleDictionary<TLocale extends string = string> = Readonly<\n Record<TLocale, Readonly<Record<string, string>>>\n>;\nexport type SlotShape = \"circle\" | \"square\" | \"rounded\";\nexport type FontFamily = \"system-ui\" | \"serif\" | \"rounded-sans\" | \"monospace\" | \"handwritten\";\n\nexport interface SheetTheme {\n readonly primaryColor: string;\n readonly backgroundColor?: string;\n readonly backgroundImageUrl?: string;\n readonly cardBackgroundColor: string;\n readonly textColor: string;\n readonly slotShape: SlotShape;\n readonly gridColumns: number;\n readonly unclaimedOpacity?: number;\n readonly completedStampColor?: string;\n readonly fontFamily?: FontFamily;\n}\nexport type ThemePresetId = \"default\" | \"modern_dark\" | \"pop_candy\" | \"retro_craft\" | \"cyber\";\nexport interface ThemePreset<TLocale extends string = SupportedLocale> {\n readonly id: ThemePresetId;\n readonly name: LocalizedString<TLocale>;\n readonly description: LocalizedString<TLocale>;\n readonly theme: SheetTheme;\n}\nexport const DEFAULT_SHEET_THEME: SheetTheme = {\n primaryColor: \"#9e551e\",\n backgroundColor: \"#fbf4df\",\n cardBackgroundColor: \"#fffdf5\",\n textColor: \"#352f25\",\n slotShape: \"rounded\",\n gridColumns: 3,\n unclaimedOpacity: 1,\n fontFamily: \"serif\",\n};\n\nexport interface ExternalReference {\n readonly type: string;\n readonly id: string;\n readonly url?: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\nexport type CheckInCondition =\n | { readonly type: \"qr\"; readonly secretToken: string; readonly qrEntryUrl?: string }\n | { readonly type: \"passcode\"; readonly code: string; readonly caseSensitive?: boolean }\n | {\n readonly type: \"gps\";\n readonly latitude: number;\n readonly longitude: number;\n readonly radiusMeters: number;\n }\n | { readonly type: \"nfc\"; readonly tagId: string }\n | {\n readonly type: \"custom\";\n readonly validatorName: string;\n readonly secretParams?: Readonly<Record<string, unknown>>;\n };\n\nexport type PublicCheckInCondition =\n | { readonly type: \"qr\"; readonly qrEntryUrl?: string }\n | { readonly type: \"passcode\" }\n | {\n readonly type: \"gps\";\n readonly latitude: number;\n readonly longitude: number;\n readonly radiusMeters: number;\n }\n | { readonly type: \"nfc\" }\n | { readonly type: \"custom\"; readonly validatorName: string };\n\nexport interface SpotItem<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly id: string;\n readonly orderIndex: number;\n readonly name: LocalizedText<TLocale>;\n readonly description?: LocalizedText<TLocale>;\n readonly hint?: LocalizedText<TLocale>;\n readonly imageUrl?: string;\n readonly iconUrl?: string;\n readonly redirectUrlAfterClaim?: string;\n readonly externalReferences?: ReadonlyArray<ExternalReference>;\n readonly metadata?: TMeta;\n readonly conditions: ReadonlyArray<CheckInCondition>;\n readonly prerequisites?: ReadonlyArray<string>;\n}\nexport type PublicSpotItem<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> = Omit<SpotItem<TLocale, TMeta>, \"conditions\"> & {\n readonly conditions: ReadonlyArray<PublicCheckInCondition>;\n};\n\nexport type RewardUnlockCondition =\n | { readonly type: \"stamp_count\"; readonly count: number }\n | { readonly type: \"stamps\"; readonly stampIds: ReadonlyArray<string> }\n | { readonly type: \"all\" | \"any\"; readonly conditions: ReadonlyArray<RewardUnlockCondition> };\nexport type RewardType = \"digital\" | \"in_person\";\nexport type RedemptionMethod = \"manual_slide\" | \"staff_passcode\" | \"view_only\" | \"server_claim\";\nexport interface Reward<TLocale extends string = string> {\n readonly id: string;\n readonly title: LocalizedText<TLocale>;\n readonly description?: LocalizedText<TLocale>;\n readonly type: RewardType;\n readonly redemptionMethod: RedemptionMethod;\n readonly requiredStampCount: number;\n readonly conditions?: ReadonlyArray<RewardUnlockCondition>;\n readonly digitalContentUrl?: string;\n readonly staffPasscode?: string;\n readonly validUntil?: string;\n readonly stockLimit?: number;\n readonly userClaimLimit?: number;\n}\nexport type PublicReward<TLocale extends string = string> = Omit<\n Reward<TLocale>,\n \"digitalContentUrl\" | \"staffPasscode\"\n>;\n\nexport interface AdminRallyConfig<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly id: string;\n readonly version: string;\n readonly title: LocalizedText<TLocale>;\n readonly description?: LocalizedText<TLocale>;\n readonly theme?: SheetTheme;\n readonly spots: ReadonlyArray<SpotItem<TLocale, TMeta>>;\n readonly rewards: ReadonlyArray<Reward<TLocale>>;\n readonly staffPasscode?: string;\n readonly inventory?: Readonly<Record<string, number>>;\n readonly serverMetadata?: Readonly<Record<string, unknown>>;\n readonly metadata?: TMeta;\n readonly serverEndpoint?: string;\n}\nexport interface PublicRallyConfig<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> {\n readonly id: string;\n readonly version: string;\n readonly title: LocalizedText<TLocale>;\n readonly description?: LocalizedText<TLocale>;\n readonly theme?: SheetTheme;\n readonly spots: ReadonlyArray<PublicSpotItem<TLocale, TMeta>>;\n readonly rewards: ReadonlyArray<PublicReward<TLocale>>;\n readonly metadata?: TMeta;\n readonly serverEndpoint?: string;\n}\nexport type RallyConfig<\n TLocale extends string = string,\n TMeta extends Record<string, unknown> = Record<string, unknown>,\n> = PublicRallyConfig<TLocale, TMeta>;\n\nfunction publicCondition(condition: CheckInCondition): PublicCheckInCondition {\n switch (condition.type) {\n case \"qr\":\n return condition.qrEntryUrl === undefined\n ? { type: \"qr\" }\n : { type: \"qr\", qrEntryUrl: condition.qrEntryUrl };\n case \"passcode\":\n return { type: \"passcode\" };\n case \"gps\":\n return {\n type: \"gps\",\n latitude: condition.latitude,\n longitude: condition.longitude,\n radiusMeters: condition.radiusMeters,\n };\n case \"nfc\":\n return { type: \"nfc\" };\n case \"custom\":\n return { type: \"custom\", validatorName: condition.validatorName };\n }\n}\nexport function toPublicConfig<TLocale extends string, TMeta extends Record<string, unknown>>(\n config: AdminRallyConfig<TLocale, TMeta>,\n): PublicRallyConfig<TLocale, TMeta> {\n return {\n id: config.id,\n version: config.version,\n title: config.title,\n ...(config.description === undefined ? {} : { description: config.description }),\n ...(config.theme === undefined ? {} : { theme: config.theme }),\n spots: config.spots.map((spot) => ({\n ...spot,\n conditions: spot.conditions.map(publicCondition),\n })),\n rewards: config.rewards.map(\n ({ digitalContentUrl: _content, staffPasscode: _passcode, ...reward }) => reward,\n ),\n ...(config.metadata === undefined ? {} : { metadata: config.metadata }),\n ...(config.serverEndpoint === undefined ? {} : { serverEndpoint: config.serverEndpoint }),\n };\n}\nexport function assertPublicConfig(config: unknown): asserts config is PublicRallyConfig {\n if (!isPublicConfig(config)) throw new Error(\"Configuration contains private rally fields.\");\n}\nexport function isPublicConfig(value: unknown): value is PublicRallyConfig {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const candidate = value as Record<string, unknown>;\n const seen = new Set<object>();\n const containsPrivateField = (item: unknown): boolean => {\n if (typeof item !== \"object\" || item === null) return false;\n if (seen.has(item)) return false;\n seen.add(item);\n if (Array.isArray(item)) return item.some(containsPrivateField);\n const record = item as Record<string, unknown>;\n if (\n [\"staffPasscode\", \"secretToken\", \"serverMetadata\", \"secretParams\", \"digitalContentUrl\"].some(\n (key) => key in record,\n )\n )\n return true;\n return Object.values(record).some(containsPrivateField);\n };\n if (containsPrivateField(candidate)) return false;\n for (const key of [\n \"staffPasscode\",\n \"secretToken\",\n \"serverMetadata\",\n \"secretParams\",\n \"code\",\n \"tagId\",\n ]) {\n if (key in candidate) return false;\n }\n if (\n typeof candidate.id !== \"string\" ||\n typeof candidate.version !== \"string\" ||\n (typeof candidate.title !== \"string\" &&\n (typeof candidate.title !== \"object\" ||\n candidate.title === null ||\n Array.isArray(candidate.title))) ||\n !Array.isArray(candidate.spots) ||\n !Array.isArray(candidate.rewards)\n )\n return false;\n return (\n candidate.spots.every((spot) => {\n if (typeof spot !== \"object\" || spot === null || Array.isArray(spot)) return false;\n const item = spot as Record<string, unknown>;\n if (\n typeof item.id !== \"string\" ||\n typeof item.orderIndex !== \"number\" ||\n item.name === undefined ||\n \"secretToken\" in item ||\n \"code\" in item ||\n \"tagId\" in item ||\n \"secretParams\" in item\n )\n return false;\n return (\n Array.isArray(item.conditions) &&\n item.conditions.every((condition) => {\n if (typeof condition !== \"object\" || condition === null || Array.isArray(condition))\n return false;\n const value = condition as Record<string, unknown>;\n if (\n \"secretToken\" in value ||\n \"code\" in value ||\n \"tagId\" in value ||\n \"secretParams\" in value\n )\n return false;\n const type = value.type;\n if (type === \"qr\" || type === \"passcode\" || type === \"nfc\") return true;\n if (type === \"custom\") return typeof value.validatorName === \"string\";\n return (\n type === \"gps\" &&\n typeof value.latitude === \"number\" &&\n typeof value.longitude === \"number\" &&\n typeof value.radiusMeters === \"number\"\n );\n })\n );\n }) &&\n candidate.rewards.every((reward) => {\n if (typeof reward !== \"object\" || reward === null || Array.isArray(reward)) return false;\n const item = reward as Record<string, unknown>;\n return (\n typeof item.id === \"string\" &&\n typeof item.requiredStampCount === \"number\" &&\n (item.type === \"digital\" || item.type === \"in_person\") &&\n (item.redemptionMethod === \"manual_slide\" ||\n item.redemptionMethod === \"staff_passcode\" ||\n item.redemptionMethod === \"view_only\" ||\n item.redemptionMethod === \"server_claim\") &&\n !(\"staffPasscode\" in item || \"digitalContentUrl\" in item)\n );\n })\n );\n}\n\nexport interface StampRecord {\n readonly stampId: string;\n readonly acquiredAt: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\nexport type RewardStatus = \"LOCKED\" | \"AVAILABLE\" | \"CONSUMED\" | \"EXPIRED\";\nexport interface RewardState {\n readonly rewardId: string;\n readonly status: RewardStatus;\n readonly unlockedAt?: string;\n readonly consumedAt?: string;\n readonly consumedByStaffId?: string;\n readonly claimTicketNumber?: string;\n readonly redeemedCount?: number;\n readonly userRedemptionCount?: number;\n}\nexport interface StampRallyState {\n readonly rallyId: string;\n readonly userId: string | null;\n readonly records: ReadonlyArray<StampRecord>;\n readonly rewards: ReadonlyArray<RewardState>;\n readonly updatedAt: string;\n}\nexport type UserRallyState = StampRallyState;\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"]}
|