@stamprally/core 0.1.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/LICENSE +21 -0
- package/dist/index.cjs +1375 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +372 -0
- package/dist/index.d.ts +372 -0
- package/dist/index.js +1346 -0
- package/dist/index.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/engine/evaluate.ts","../src/engine/order.ts","../src/engine/progress.ts","../src/detectors/types.ts","../src/detectors/geolocation.ts","../src/detectors/nfc.ts","../src/detectors/passcode.ts","../src/detectors/qr.ts","../src/engine/transition.ts","../src/client/storage.ts","../src/client/client.ts","../src/domain/i18n.ts","../src/domain/models.ts","../src/domain/themePresets.ts"],"names":["DEFAULT_TIMEOUT_MS","record"],"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 { RallyConfig, StampDefinition } from \"../domain/index.js\";\n\ninterface OrderedStamp {\n readonly stamp: StampDefinition;\n readonly index: number;\n}\n\nexport function getOrderedStamps(config: RallyConfig): ReadonlyArray<StampDefinition> {\n return config.stamps\n .map((stamp, index): OrderedStamp => ({ stamp, index }))\n .sort((left, right) => {\n const orderDifference =\n (left.stamp.order ?? Number.POSITIVE_INFINITY) -\n (right.stamp.order ?? Number.POSITIVE_INFINITY);\n return orderDifference === 0 ? left.index - right.index : orderDifference;\n })\n .map(({ stamp }) => stamp);\n}\n","import type { RallyConfig, StampDefinition, StampRallyState } from \"../domain/index.js\";\nimport { getOrderedStamps } from \"./order.js\";\n\nexport interface StampRallyProgress {\n readonly acquired: number;\n readonly total: number;\n readonly percentage: number;\n readonly isCompleted: boolean;\n /** @deprecated Use isCompleted instead. */\n readonly isComplete: boolean;\n readonly nextAvailableStamps: ReadonlyArray<StampDefinition>;\n}\n\nexport function calculateProgress(state: StampRallyState, config: RallyConfig): StampRallyProgress {\n const configuredStampIds = new Set(config.stamps.map((stamp) => stamp.id));\n const acquiredStampIds = new Set(\n state.records\n .map((record) => record.stampId)\n .filter((stampId) => configuredStampIds.has(stampId)),\n );\n const total = config.stamps.length;\n const acquired = acquiredStampIds.size;\n const isCompleted = total > 0 && acquired === total;\n\n const remainingStamps = config.stamps.filter((stamp) => !acquiredStampIds.has(stamp.id));\n const nextAvailableStamps =\n config.isSequential === true\n ? getOrderedStamps(config)\n .filter((stamp) => !acquiredStampIds.has(stamp.id))\n .slice(0, 1)\n : remainingStamps;\n\n return {\n acquired,\n total,\n percentage: total === 0 ? 0 : (acquired / total) * 100,\n isCompleted,\n isComplete: isCompleted,\n nextAvailableStamps,\n };\n}\n","import type { Result, VerificationContext } from \"../domain/index.js\";\n\nexport type DetectorKind = \"geolocation\" | \"nfc\" | \"qr\";\n\nexport type DetectorErrorCode =\n | \"UNSUPPORTED\"\n | \"PERMISSION_DENIED\"\n | \"POSITION_UNAVAILABLE\"\n | \"TIMEOUT\"\n | \"ABORTED\"\n | \"READ_FAILED\"\n | \"INVALID_DATA\"\n | \"NO_TOKEN\";\n\nexport interface DetectorError {\n readonly detector: DetectorKind;\n readonly code: DetectorErrorCode;\n readonly message: string;\n readonly cause?: unknown;\n}\n\nexport type GeoVerificationContext = Extract<VerificationContext, { readonly type: \"geo\" }>;\nexport type TokenVerificationContext = Extract<VerificationContext, { readonly type: \"token\" }>;\nexport type DetectorResult<T extends VerificationContext> = Result<T, DetectorError>;\n\nexport interface PasscodeCondition {\n readonly passcode: string;\n readonly caseSensitive?: boolean;\n}\n\nexport type CheckInResult =\n | { readonly success: true }\n | {\n readonly success: false;\n readonly reason: \"INVALID_PASSCODE\";\n readonly message: string;\n };\n\nexport function createDetectorError(\n detector: DetectorKind,\n code: DetectorErrorCode,\n message: string,\n cause?: unknown,\n): DetectorError {\n return cause === undefined ? { detector, code, message } : { detector, code, message, cause };\n}\n\nexport function mapBrowserError(detector: DetectorKind, error: unknown): DetectorError {\n if (typeof DOMException !== \"undefined\" && error instanceof DOMException) {\n if (error.name === \"NotAllowedError\" || error.name === \"SecurityError\") {\n return createDetectorError(\n detector,\n \"PERMISSION_DENIED\",\n `${detector} permission was denied.`,\n error,\n );\n }\n if (error.name === \"AbortError\") {\n return createDetectorError(detector, \"ABORTED\", `${detector} detection was aborted.`, error);\n }\n if (error.name === \"NotSupportedError\") {\n return createDetectorError(\n detector,\n \"UNSUPPORTED\",\n `${detector} is not supported in this environment.`,\n error,\n );\n }\n if (error.name === \"TimeoutError\") {\n return createDetectorError(detector, \"TIMEOUT\", `${detector} detection timed out.`, error);\n }\n }\n return createDetectorError(detector, \"READ_FAILED\", `${detector} detection failed.`, error);\n}\n","import type { DetectorResult, GeoVerificationContext } from \"./types.js\";\nimport { createDetectorError } from \"./types.js\";\n\nexport interface GeoDetectorOptions {\n readonly enableHighAccuracy?: boolean;\n readonly timeout?: number;\n}\n\nexport function isGeolocationSupported(): boolean {\n return typeof navigator !== \"undefined\" && navigator.geolocation !== undefined;\n}\n\nexport function getCurrentGeoContext(\n options: GeoDetectorOptions = {},\n): Promise<DetectorResult<GeoVerificationContext>> {\n if (!isGeolocationSupported()) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n \"UNSUPPORTED\",\n \"Geolocation is not supported in this environment.\",\n ),\n });\n }\n if (options.timeout !== undefined && (!Number.isFinite(options.timeout) || options.timeout < 0)) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n \"INVALID_DATA\",\n \"Geolocation timeout must be a non-negative finite number.\",\n ),\n });\n }\n\n const positionOptions: PositionOptions = {\n ...(options.enableHighAccuracy === undefined\n ? {}\n : { enableHighAccuracy: options.enableHighAccuracy }),\n ...(options.timeout === undefined ? {} : { timeout: options.timeout }),\n };\n\n return new Promise((resolve) => {\n try {\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const currentLatitude = position.coords.latitude;\n const currentLongitude = position.coords.longitude;\n if (\n !Number.isFinite(currentLatitude) ||\n currentLatitude < -90 ||\n currentLatitude > 90 ||\n !Number.isFinite(currentLongitude) ||\n currentLongitude < -180 ||\n currentLongitude > 180\n ) {\n resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n \"INVALID_DATA\",\n \"Geolocation returned invalid coordinates.\",\n ),\n });\n return;\n }\n resolve({\n ok: true,\n value: { type: \"geo\", currentLatitude, currentLongitude },\n });\n },\n (error) => {\n const code =\n error.code === 1\n ? \"PERMISSION_DENIED\"\n : error.code === 2\n ? \"POSITION_UNAVAILABLE\"\n : error.code === 3\n ? \"TIMEOUT\"\n : \"READ_FAILED\";\n resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n code,\n `Geolocation failed: ${error.message || code}.`,\n error,\n ),\n });\n },\n positionOptions,\n );\n } catch (error) {\n resolve({\n ok: false,\n error: createDetectorError(\n \"geolocation\",\n \"READ_FAILED\",\n \"Geolocation failed before a position could be requested.\",\n error,\n ),\n });\n }\n });\n}\n","import type { DetectorError, DetectorResult, TokenVerificationContext } from \"./types.js\";\nimport { createDetectorError, mapBrowserError } from \"./types.js\";\n\ninterface NdefRecordLike {\n readonly recordType: string;\n readonly encoding?: string;\n readonly data?: DataView;\n}\n\ninterface NdefReadingEventLike {\n readonly message: {\n readonly records: ReadonlyArray<NdefRecordLike>;\n };\n}\n\ninterface NdefReaderLike {\n onreading: ((event: NdefReadingEventLike) => void) | null;\n onreadingerror: ((event: Event) => void) | null;\n scan(options?: { readonly signal?: AbortSignal }): Promise<void>;\n}\n\ninterface NdefReaderConstructorLike {\n new (): NdefReaderLike;\n}\n\nexport interface NfcDetectorOptions {\n readonly timeout?: number;\n readonly signal?: AbortSignal;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nfunction getNdefReaderConstructor(): NdefReaderConstructorLike | undefined {\n return (globalThis as { readonly NDEFReader?: NdefReaderConstructorLike }).NDEFReader;\n}\n\nexport function isNfcSupported(): boolean {\n return getNdefReaderConstructor() !== undefined;\n}\n\nfunction decodeFirstTextRecord(event: NdefReadingEventLike): string | null {\n for (const record of event.message.records) {\n if (record.recordType !== \"text\" || record.data === undefined) continue;\n try {\n const token = new TextDecoder(record.encoding ?? \"utf-8\").decode(record.data);\n if (token.length > 0) return token;\n } catch {\n // Try the next text record when one payload cannot be decoded.\n }\n }\n return null;\n}\n\nexport function readNfcContext(\n options: NfcDetectorOptions = {},\n): Promise<DetectorResult<TokenVerificationContext>> {\n const Reader = getNdefReaderConstructor();\n if (Reader === undefined) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\"nfc\", \"UNSUPPORTED\", \"Web NFC is not supported.\"),\n });\n }\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeout) || timeout < 0) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\n \"nfc\",\n \"INVALID_DATA\",\n \"NFC timeout must be a non-negative finite number.\",\n ),\n });\n }\n if (options.signal?.aborted === true) {\n return Promise.resolve({\n ok: false,\n error: createDetectorError(\"nfc\", \"ABORTED\", \"NFC detection was aborted.\"),\n });\n }\n\n let reader: NdefReaderLike;\n try {\n reader = new Reader();\n } catch (error) {\n return Promise.resolve({ ok: false, error: mapBrowserError(\"nfc\", error) });\n }\n\n return new Promise((resolve) => {\n const scanController = new AbortController();\n let settled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const finish = (result: DetectorResult<TokenVerificationContext>) => {\n if (settled) return;\n settled = true;\n if (timer !== undefined) clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", handleAbort);\n reader.onreading = null;\n reader.onreadingerror = null;\n scanController.abort();\n resolve(result);\n };\n const fail = (error: DetectorError) => finish({ ok: false, error });\n const handleAbort = () =>\n fail(createDetectorError(\"nfc\", \"ABORTED\", \"NFC detection was aborted.\"));\n\n options.signal?.addEventListener(\"abort\", handleAbort, { once: true });\n timer = setTimeout(\n () => fail(createDetectorError(\"nfc\", \"TIMEOUT\", \"NFC detection timed out.\")),\n timeout,\n );\n reader.onreading = (event) => {\n const token = decodeFirstTextRecord(event);\n if (token === null) {\n fail(createDetectorError(\"nfc\", \"NO_TOKEN\", \"The NFC tag has no text token.\"));\n return;\n }\n finish({ ok: true, value: { type: \"token\", token } });\n };\n reader.onreadingerror = (event) =>\n fail(createDetectorError(\"nfc\", \"READ_FAILED\", \"The NFC tag could not be read.\", event));\n\n try {\n void reader\n .scan({ signal: scanController.signal })\n .catch((error: unknown) => fail(mapBrowserError(\"nfc\", error)));\n } catch (error) {\n fail(mapBrowserError(\"nfc\", error));\n }\n });\n}\n","import type { CheckInResult, PasscodeCondition } from \"./types.js\";\n\nexport function normalizePasscode(input: string, caseSensitive = false): string {\n const normalized = input.normalize(\"NFKC\").trim();\n return caseSensitive ? normalized : normalized.toUpperCase();\n}\n\nexport function verifyPasscode(inputCode: string, condition: PasscodeCondition): CheckInResult {\n const input = normalizePasscode(inputCode, condition.caseSensitive);\n const expected = normalizePasscode(condition.passcode, condition.caseSensitive);\n\n return input === expected\n ? { success: true }\n : {\n success: false,\n reason: \"INVALID_PASSCODE\",\n message: \"The passcode is invalid.\",\n };\n}\n","import type { Result } from \"../domain/index.js\";\nimport type { DetectorError, DetectorResult, TokenVerificationContext } from \"./types.js\";\nimport { createDetectorError, mapBrowserError } from \"./types.js\";\n\ninterface DetectedBarcodeLike {\n readonly rawValue: string;\n}\n\ninterface BarcodeDetectorLike {\n detect(source: HTMLVideoElement): Promise<ReadonlyArray<DetectedBarcodeLike>>;\n}\n\ninterface BarcodeDetectorConstructorLike {\n new (options?: { readonly formats?: ReadonlyArray<string> }): BarcodeDetectorLike;\n}\n\nexport interface QrDetectorOptions {\n readonly timeout?: number;\n readonly signal?: AbortSignal;\n readonly facingMode?: \"user\" | \"environment\";\n}\n\ninterface Termination {\n readonly promise: Promise<DetectorError>;\n readonly cleanup: () => void;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst SCAN_INTERVAL_MS = 120;\n\nfunction getBarcodeDetectorConstructor(): BarcodeDetectorConstructorLike | undefined {\n return (globalThis as { readonly BarcodeDetector?: BarcodeDetectorConstructorLike })\n .BarcodeDetector;\n}\n\nfunction getMediaDevices(): MediaDevices | undefined {\n return typeof navigator === \"undefined\" ? undefined : navigator.mediaDevices;\n}\n\nexport function isQrSupported(): boolean {\n return (\n getBarcodeDetectorConstructor() !== undefined &&\n typeof getMediaDevices()?.getUserMedia === \"function\"\n );\n}\n\nfunction createTermination(timeout: number, signal: AbortSignal | undefined): Termination {\n let settle: ((error: DetectorError) => void) | undefined;\n const promise = new Promise<DetectorError>((resolve) => {\n settle = resolve;\n });\n const handleAbort = () =>\n settle?.(createDetectorError(\"qr\", \"ABORTED\", \"QR detection was aborted.\"));\n signal?.addEventListener(\"abort\", handleAbort, { once: true });\n const timer = setTimeout(\n () => settle?.(createDetectorError(\"qr\", \"TIMEOUT\", \"QR detection timed out.\")),\n timeout,\n );\n return {\n promise,\n cleanup: () => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", handleAbort);\n settle = undefined;\n },\n };\n}\n\nasync function raceWithTermination<T>(\n operation: Promise<T>,\n termination: Promise<DetectorError>,\n): Promise<Result<T, DetectorError>> {\n return Promise.race([\n operation.then(\n (value) => ({ ok: true as const, value }),\n (error: unknown) => ({ ok: false as const, error: mapBrowserError(\"qr\", error) }),\n ),\n termination.then((error) => ({ ok: false as const, error })),\n ]);\n}\n\nfunction stopStream(stream: MediaStream): void {\n for (const track of stream.getTracks()) track.stop();\n}\n\nfunction waitForNextScan(): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, SCAN_INTERVAL_MS));\n}\n\nexport async function readQrContext(\n videoElement: HTMLVideoElement,\n options: QrDetectorOptions = {},\n): Promise<DetectorResult<TokenVerificationContext>> {\n const Detector = getBarcodeDetectorConstructor();\n const mediaDevices = getMediaDevices();\n if (Detector === undefined || typeof mediaDevices?.getUserMedia !== \"function\") {\n return {\n ok: false,\n error: createDetectorError(\n \"qr\",\n \"UNSUPPORTED\",\n \"Live QR detection is not supported in this environment.\",\n ),\n };\n }\n const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isFinite(timeout) || timeout < 0) {\n return {\n ok: false,\n error: createDetectorError(\n \"qr\",\n \"INVALID_DATA\",\n \"QR timeout must be a non-negative finite number.\",\n ),\n };\n }\n if (options.signal?.aborted === true) {\n return {\n ok: false,\n error: createDetectorError(\"qr\", \"ABORTED\", \"QR detection was aborted.\"),\n };\n }\n\n const termination = createTermination(timeout, options.signal);\n let stream: MediaStream | null = null;\n try {\n const mediaPromise = mediaDevices.getUserMedia({\n audio: false,\n video: { facingMode: { ideal: options.facingMode ?? \"environment\" } },\n });\n const mediaResult = await raceWithTermination(mediaPromise, termination.promise);\n if (!mediaResult.ok) {\n void mediaPromise.then(stopStream, () => undefined);\n return mediaResult;\n }\n stream = mediaResult.value;\n videoElement.srcObject = stream;\n videoElement.muted = true;\n videoElement.playsInline = true;\n\n const playResult = await raceWithTermination(videoElement.play(), termination.promise);\n if (!playResult.ok) return playResult;\n\n const detector = new Detector({ formats: [\"qr_code\"] });\n while (true) {\n const detection = await raceWithTermination(\n detector.detect(videoElement),\n termination.promise,\n );\n if (!detection.ok) return detection;\n const token = detection.value.find((barcode) => barcode.rawValue.length > 0)?.rawValue;\n if (token !== undefined) {\n return { ok: true, value: { type: \"token\", token } };\n }\n\n const interval = await raceWithTermination(waitForNextScan(), termination.promise);\n if (!interval.ok) return interval;\n }\n } catch (error) {\n return { ok: false, error: mapBrowserError(\"qr\", error) };\n } finally {\n termination.cleanup();\n if (stream !== null) stopStream(stream);\n try {\n videoElement.srcObject = null;\n } catch {\n // A custom video element implementation may expose a read-only srcObject.\n }\n }\n}\n","import { verifyPasscode } from \"../detectors/index.js\";\nimport type {\n RallyConfig,\n Result,\n RewardItem,\n RewardState,\n StampError,\n StampRallyState,\n StampRecord,\n VerificationContext,\n} from \"../domain/index.js\";\nimport { evaluateConditionDetailed } from \"./evaluate.js\";\nimport { getOrderedStamps } from \"./order.js\";\n\nexport type StampRallyEvent =\n | {\n readonly type: \"stampAcquired\";\n readonly record: StampRecord;\n }\n | {\n readonly type: \"rallyCompleted\";\n readonly rallyId: string;\n readonly completedAt: string;\n };\n\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: \"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}\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 (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 };\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.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 ...(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\n const completed =\n config.stamps.length > 0 &&\n config.stamps.every((stamp) => nextState.records.some((item) => item.stampId === stamp.id));\n\n if (completed) {\n events.push({ type: \"rallyCompleted\", rallyId: config.id, completedAt: now });\n }\n\n return { ok: true, value: { nextState, events } };\n}\n","import type { RewardState, StampRallyState, StampRecord } from \"../domain/index.js\";\n\nexport interface StampStorage {\n load(rallyId: string): Promise<StampRallyState | null>;\n save(state: StampRallyState): Promise<void>;\n remove(rallyId: string): Promise<void>;\n}\n\nexport interface StorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport type StorageOperation = \"open\" | \"load\" | \"save\" | \"remove\";\nexport type StorageAdapterErrorCode =\n | \"STORAGE_UNAVAILABLE\"\n | \"STORAGE_OPEN_FAILED\"\n | \"STORAGE_READ_FAILED\"\n | \"STORAGE_WRITE_FAILED\"\n | \"STORAGE_REMOVE_FAILED\"\n | \"STORAGE_INVALID_DATA\";\n\nexport class StorageAdapterError extends Error {\n readonly code: StorageAdapterErrorCode;\n readonly operation: StorageOperation;\n readonly rallyId: string | undefined;\n\n constructor(\n code: StorageAdapterErrorCode,\n operation: StorageOperation,\n message: string,\n options: { readonly cause?: unknown; readonly rallyId?: string } = {},\n ) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.name = \"StorageAdapterError\";\n this.code = code;\n this.operation = operation;\n this.rallyId = options.rallyId;\n }\n}\n\nfunction cloneRecord(record: StampRecord): StampRecord {\n return record.metadata === undefined\n ? { ...record }\n : { ...record, metadata: { ...record.metadata } };\n}\n\nfunction cloneRewardState(state: RewardState): RewardState {\n return { ...state };\n}\n\nexport function cloneState(state: StampRallyState): StampRallyState {\n return {\n ...state,\n records: state.records.map(cloneRecord),\n ...(state.rewards === undefined ? {} : { rewards: state.rewards.map(cloneRewardState) }),\n };\n}\n\nfunction isRecord(value: unknown): value is StampRecord {\n if (typeof value !== \"object\" || value === null) return false;\n const record = value as Partial<StampRecord>;\n return (\n typeof record.stampId === \"string\" &&\n typeof record.acquiredAt === \"string\" &&\n (record.metadata === undefined ||\n (typeof record.metadata === \"object\" &&\n record.metadata !== null &&\n !Array.isArray(record.metadata)))\n );\n}\n\nconst rewardStatuses = new Set([\"LOCKED\", \"AVAILABLE\", \"CONSUMED\", \"EXPIRED\"]);\n\nfunction isOptionalDate(value: unknown): value is string | undefined {\n return value === undefined || (typeof value === \"string\" && !Number.isNaN(Date.parse(value)));\n}\n\nexport function isRewardState(value: unknown): value is RewardState {\n if (typeof value !== \"object\" || value === null) return false;\n const state = value as Partial<RewardState>;\n return (\n typeof state.rewardId === \"string\" &&\n typeof state.status === \"string\" &&\n rewardStatuses.has(state.status) &&\n isOptionalDate(state.unlockedAt) &&\n isOptionalDate(state.consumedAt) &&\n (state.consumedByStaffId === undefined || typeof state.consumedByStaffId === \"string\")\n );\n}\n\nexport function isStampRallyState(value: unknown): value is StampRallyState {\n if (typeof value !== \"object\" || value === null) return false;\n const state = value as Partial<StampRallyState>;\n return (\n typeof state.rallyId === \"string\" &&\n typeof state.updatedAt === \"string\" &&\n Array.isArray(state.records) &&\n state.records.every(isRecord) &&\n (state.rewards === undefined ||\n (Array.isArray(state.rewards) && state.rewards.every(isRewardState)))\n );\n}\n\nexport interface RallySnapshot {\n readonly version: 1;\n readonly rallyId: string;\n readonly stamps: ReadonlyArray<StampRecord>;\n readonly rewards: ReadonlyArray<RewardState>;\n readonly exportedAt: string;\n}\n\nfunction isValidDate(value: unknown): value is string {\n return typeof value === \"string\" && !Number.isNaN(Date.parse(value));\n}\n\nfunction isSnapshotRecord(value: unknown): value is StampRecord {\n return isRecord(value) && isValidDate(value.acquiredAt);\n}\n\nfunction isRallySnapshot(value: unknown): value is RallySnapshot {\n if (typeof value !== \"object\" || value === null) return false;\n const snapshot = value as Partial<RallySnapshot>;\n return (\n snapshot.version === 1 &&\n typeof snapshot.rallyId === \"string\" &&\n Array.isArray(snapshot.stamps) &&\n snapshot.stamps.every(isSnapshotRecord) &&\n Array.isArray(snapshot.rewards) &&\n snapshot.rewards.every(isRewardState) &&\n isValidDate(snapshot.exportedAt)\n );\n}\n\nexport function exportProgressToken(snapshot: RallySnapshot): string {\n return globalThis.btoa(encodeURIComponent(JSON.stringify(snapshot)));\n}\n\nexport function importProgressToken(token: string, currentRallyId: string): RallySnapshot | null {\n try {\n const parsed: unknown = JSON.parse(decodeURIComponent(globalThis.atob(token)));\n if (!isRallySnapshot(parsed) || parsed.rallyId !== currentRallyId) return null;\n return {\n ...parsed,\n stamps: parsed.stamps.map(cloneRecord),\n rewards: parsed.rewards.map(cloneRewardState),\n };\n } catch {\n return null;\n }\n}\n\nexport class InMemoryStorage implements StampStorage {\n readonly #states = new Map<string, StampRallyState>();\n\n async load(rallyId: string): Promise<StampRallyState | null> {\n const state = this.#states.get(rallyId);\n return state === undefined ? null : cloneState(state);\n }\n\n async save(state: StampRallyState): Promise<void> {\n this.#states.set(state.rallyId, cloneState(state));\n }\n\n async remove(rallyId: string): Promise<void> {\n this.#states.delete(rallyId);\n }\n}\n\nexport interface LocalStorageAdapterOptions {\n readonly storage?: StorageLike | null;\n readonly keyPrefix?: string;\n readonly failureMode?: LocalStorageFailureMode;\n readonly onWarning?: StorageWarningHandler;\n}\n\nexport type LocalStorageFailureMode = \"fallback\" | \"throw\";\nexport type StorageWarningHandler = (error: StorageAdapterError) => void;\n\nconst defaultStorageWarningHandler: StorageWarningHandler = (error) => {\n console.warn(`[@stamprally/core] ${error.message}`, error);\n};\n\nexport class LocalStorageAdapter implements StampStorage {\n readonly #providedStorage: StorageLike | null | undefined;\n readonly #keyPrefix: string;\n readonly #failureMode: LocalStorageFailureMode;\n readonly #onWarning: StorageWarningHandler;\n readonly #fallbackStorage = new InMemoryStorage();\n #isFallbackActive = false;\n\n constructor(options: LocalStorageAdapterOptions = {}) {\n this.#providedStorage = options.storage;\n this.#keyPrefix = options.keyPrefix ?? \"stamprally:\";\n this.#failureMode = options.failureMode ?? \"fallback\";\n this.#onWarning = options.onWarning ?? defaultStorageWarningHandler;\n }\n\n async load(rallyId: string): Promise<StampRallyState | null> {\n if (this.#isFallbackActive) return this.#fallbackStorage.load(rallyId);\n\n try {\n const serialized = this.#getStorage(\"load\", rallyId).getItem(this.#key(rallyId));\n if (serialized === null) return null;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(serialized);\n } catch (cause) {\n throw new StorageAdapterError(\n \"STORAGE_INVALID_DATA\",\n \"load\",\n `Stored rally '${rallyId}' is not valid JSON.`,\n { cause, rallyId },\n );\n }\n if (!isStampRallyState(parsed) || parsed.rallyId !== rallyId) {\n throw new StorageAdapterError(\n \"STORAGE_INVALID_DATA\",\n \"load\",\n `Stored rally '${rallyId}' has an invalid state shape.`,\n { rallyId },\n );\n }\n return cloneState(parsed);\n } catch (cause) {\n return this.#handleFailure(\n this.#normalizeError(\n cause,\n \"STORAGE_READ_FAILED\",\n \"load\",\n `Failed to read rally '${rallyId}' from localStorage.`,\n rallyId,\n ),\n () => this.#fallbackStorage.load(rallyId),\n );\n }\n }\n\n async save(state: StampRallyState): Promise<void> {\n if (this.#isFallbackActive) return this.#fallbackStorage.save(state);\n\n try {\n this.#getStorage(\"save\", state.rallyId).setItem(\n this.#key(state.rallyId),\n JSON.stringify(state),\n );\n } catch (cause) {\n return this.#handleFailure(\n this.#normalizeError(\n cause,\n \"STORAGE_WRITE_FAILED\",\n \"save\",\n `Failed to save rally '${state.rallyId}' to localStorage.`,\n state.rallyId,\n ),\n () => this.#fallbackStorage.save(state),\n );\n }\n }\n\n async remove(rallyId: string): Promise<void> {\n if (this.#isFallbackActive) return this.#fallbackStorage.remove(rallyId);\n\n try {\n this.#getStorage(\"remove\", rallyId).removeItem(this.#key(rallyId));\n } catch (cause) {\n return this.#handleFailure(\n this.#normalizeError(\n cause,\n \"STORAGE_REMOVE_FAILED\",\n \"remove\",\n `Failed to remove rally '${rallyId}' from localStorage.`,\n rallyId,\n ),\n () => this.#fallbackStorage.remove(rallyId),\n );\n }\n }\n\n #key(rallyId: string): string {\n return `${this.#keyPrefix}${rallyId}`;\n }\n\n #getStorage(operation: StorageOperation, rallyId: string): StorageLike {\n if (this.#providedStorage === null) {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n operation,\n \"localStorage is unavailable in this environment.\",\n { rallyId },\n );\n }\n if (this.#providedStorage !== undefined) return this.#providedStorage;\n if (typeof window === \"undefined\") {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n operation,\n \"localStorage is unavailable in this environment.\",\n { rallyId },\n );\n }\n try {\n const storage = window.localStorage;\n if (storage !== undefined) return storage;\n } catch (cause) {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n operation,\n \"localStorage is unavailable in this environment.\",\n { cause, rallyId },\n );\n }\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n operation,\n \"localStorage is unavailable in this environment.\",\n { rallyId },\n );\n }\n\n #normalizeError(\n cause: unknown,\n code: StorageAdapterErrorCode,\n operation: StorageOperation,\n message: string,\n rallyId: string,\n ): StorageAdapterError {\n return cause instanceof StorageAdapterError\n ? cause\n : new StorageAdapterError(code, operation, message, { cause, rallyId });\n }\n\n #handleFailure<T>(error: StorageAdapterError, fallback: () => Promise<T>): Promise<T> {\n if (this.#failureMode === \"throw\") throw error;\n this.#isFallbackActive = true;\n try {\n this.#onWarning(error);\n } catch {\n // Warning handlers must not prevent the safe in-memory fallback.\n }\n return fallback();\n }\n}\n\nexport interface IndexedDBAdapterOptions {\n readonly indexedDB?: IDBFactory | null;\n readonly databaseName?: string;\n}\n\nconst INDEXED_DB_STORE_NAME = \"states\";\n\nexport class IndexedDBAdapter implements StampStorage {\n readonly #providedFactory: IDBFactory | null | undefined;\n readonly #databaseName: string;\n #databasePromise: Promise<IDBDatabase> | null = null;\n\n constructor(options: IndexedDBAdapterOptions = {}) {\n this.#providedFactory = options.indexedDB;\n this.#databaseName = options.databaseName ?? \"stamprally\";\n }\n\n async load(rallyId: string): Promise<StampRallyState | null> {\n const database = await this.#openDatabase(rallyId);\n return new Promise((resolve, reject) => {\n try {\n const transaction = database.transaction(INDEXED_DB_STORE_NAME, \"readonly\");\n const request = transaction.objectStore(INDEXED_DB_STORE_NAME).get(rallyId);\n request.onsuccess = () => {\n const value: unknown = request.result;\n if (value === undefined) {\n resolve(null);\n return;\n }\n if (!isStampRallyState(value) || value.rallyId !== rallyId) {\n reject(\n new StorageAdapterError(\n \"STORAGE_INVALID_DATA\",\n \"load\",\n `Stored rally '${rallyId}' has an invalid state shape.`,\n { rallyId },\n ),\n );\n return;\n }\n resolve(cloneState(value));\n };\n request.onerror = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_READ_FAILED\",\n \"load\",\n `Failed to read rally '${rallyId}' from IndexedDB.`,\n { cause: request.error, rallyId },\n ),\n );\n };\n } catch (cause) {\n reject(\n new StorageAdapterError(\n \"STORAGE_READ_FAILED\",\n \"load\",\n `Failed to read rally '${rallyId}' from IndexedDB.`,\n { cause, rallyId },\n ),\n );\n }\n });\n }\n\n async save(state: StampRallyState): Promise<void> {\n const database = await this.#openDatabase(state.rallyId);\n return new Promise((resolve, reject) => {\n try {\n const transaction = database.transaction(INDEXED_DB_STORE_NAME, \"readwrite\");\n transaction.objectStore(INDEXED_DB_STORE_NAME).put(cloneState(state), state.rallyId);\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_WRITE_FAILED\",\n \"save\",\n `Failed to save rally '${state.rallyId}' to IndexedDB.`,\n { cause: transaction.error, rallyId: state.rallyId },\n ),\n );\n };\n transaction.onabort = transaction.onerror;\n } catch (cause) {\n reject(\n new StorageAdapterError(\n \"STORAGE_WRITE_FAILED\",\n \"save\",\n `Failed to save rally '${state.rallyId}' to IndexedDB.`,\n { cause, rallyId: state.rallyId },\n ),\n );\n }\n });\n }\n\n async remove(rallyId: string): Promise<void> {\n const database = await this.#openDatabase(rallyId);\n return new Promise((resolve, reject) => {\n try {\n const transaction = database.transaction(INDEXED_DB_STORE_NAME, \"readwrite\");\n transaction.objectStore(INDEXED_DB_STORE_NAME).delete(rallyId);\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_REMOVE_FAILED\",\n \"remove\",\n `Failed to remove rally '${rallyId}' from IndexedDB.`,\n { cause: transaction.error, rallyId },\n ),\n );\n };\n transaction.onabort = transaction.onerror;\n } catch (cause) {\n reject(\n new StorageAdapterError(\n \"STORAGE_REMOVE_FAILED\",\n \"remove\",\n `Failed to remove rally '${rallyId}' from IndexedDB.`,\n { cause, rallyId },\n ),\n );\n }\n });\n }\n\n #getFactory(rallyId: string): IDBFactory {\n if (this.#providedFactory === null) {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n \"open\",\n \"IndexedDB is unavailable in this environment.\",\n { rallyId },\n );\n }\n if (this.#providedFactory !== undefined) return this.#providedFactory;\n try {\n const factory = (globalThis as { readonly indexedDB?: IDBFactory }).indexedDB;\n if (factory !== undefined) return factory;\n } catch (cause) {\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n \"open\",\n \"IndexedDB is unavailable in this environment.\",\n { cause, rallyId },\n );\n }\n throw new StorageAdapterError(\n \"STORAGE_UNAVAILABLE\",\n \"open\",\n \"IndexedDB is unavailable in this environment.\",\n { rallyId },\n );\n }\n\n #openDatabase(rallyId: string): Promise<IDBDatabase> {\n if (this.#databasePromise !== null) return this.#databasePromise;\n const factory = this.#getFactory(rallyId);\n const opening = new Promise<IDBDatabase>((resolve, reject) => {\n let request: IDBOpenDBRequest;\n try {\n request = factory.open(this.#databaseName, 1);\n } catch (cause) {\n reject(\n new StorageAdapterError(\n \"STORAGE_OPEN_FAILED\",\n \"open\",\n `Failed to open IndexedDB database '${this.#databaseName}'.`,\n { cause, rallyId },\n ),\n );\n return;\n }\n request.onupgradeneeded = () => {\n const database = request.result;\n if (!database.objectStoreNames.contains(INDEXED_DB_STORE_NAME)) {\n database.createObjectStore(INDEXED_DB_STORE_NAME);\n }\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_OPEN_FAILED\",\n \"open\",\n `Failed to open IndexedDB database '${this.#databaseName}'.`,\n { cause: request.error, rallyId },\n ),\n );\n };\n request.onblocked = () => {\n reject(\n new StorageAdapterError(\n \"STORAGE_OPEN_FAILED\",\n \"open\",\n `Opening IndexedDB database '${this.#databaseName}' was blocked.`,\n { rallyId },\n ),\n );\n };\n });\n this.#databasePromise = opening.catch((error: unknown) => {\n this.#databasePromise = null;\n throw error;\n });\n return this.#databasePromise;\n }\n}\n","import type {\n RallyConfig,\n Result,\n StampError,\n StampRallyState,\n VerificationContext,\n} from \"../domain/index.js\";\nimport { type ProcessStampValue, processStamp, reconcileRewardStates } from \"../engine/index.js\";\nimport { cloneState, type StampStorage } from \"./storage.js\";\n\nexport type StampRallyListener = (state: StampRallyState) => void;\nexport type Clock = () => string;\n\nconst systemClock: Clock = () => new Date().toISOString();\n\nexport class StampRallyClient {\n readonly #listeners = new Set<StampRallyListener>();\n readonly #config: RallyConfig;\n readonly #storage: StampStorage;\n readonly #clock: Clock;\n #currentState: StampRallyState | null = null;\n #initialization: Promise<StampRallyState> | null = null;\n #operationQueue: Promise<unknown> = Promise.resolve();\n\n constructor(config: RallyConfig, storage: StampStorage, clock: Clock = systemClock) {\n this.#config = config;\n this.#storage = storage;\n this.#clock = clock;\n }\n\n getState(): StampRallyState | null {\n return this.#currentState;\n }\n\n getConfig(): RallyConfig {\n return this.#config;\n }\n\n subscribe(listener: StampRallyListener): () => void {\n this.#listeners.add(listener);\n return () => {\n this.#listeners.delete(listener);\n };\n }\n\n init(): Promise<StampRallyState> {\n return this.initialize();\n }\n\n initialize(): Promise<StampRallyState> {\n if (this.#currentState !== null) {\n return Promise.resolve(this.#currentState);\n }\n\n if (this.#initialization === null) {\n this.#initialization = this.#storage\n .load(this.#config.id)\n .then((storedState) => {\n const state =\n storedState === null\n ? this.#createEmptyState(this.#clock())\n : this.#reconcileState(cloneState(storedState), storedState.updatedAt);\n this.#currentState = state;\n this.#emit(state);\n return state;\n })\n .catch((error: unknown) => {\n this.#initialization = null;\n throw error;\n });\n }\n\n return this.#initialization;\n }\n\n acquire(\n stampId: string,\n context: VerificationContext,\n now: string = this.#clock(),\n ): Promise<Result<ProcessStampValue, StampError>> {\n return this.#enqueue(async () => {\n const currentState = await this.initialize();\n const result = processStamp(currentState, this.#config, stampId, context, now);\n\n if (!result.ok) {\n return result;\n }\n\n await this.#storage.save(result.value.nextState);\n this.#currentState = result.value.nextState;\n this.#emit(result.value.nextState);\n return result;\n });\n }\n\n reset(now: string = this.#clock()): Promise<StampRallyState> {\n return this.#enqueue(async () => {\n const initialization = this.#initialization;\n if (initialization !== null) {\n await initialization.catch(() => undefined);\n }\n await this.#storage.remove(this.#config.id);\n const nextState = this.#createEmptyState(now);\n this.#currentState = nextState;\n this.#initialization = Promise.resolve(nextState);\n this.#emit(nextState);\n return nextState;\n });\n }\n\n restore(state: StampRallyState): Promise<StampRallyState> {\n return this.#enqueue(async () => {\n const initialization = this.#initialization;\n if (initialization !== null) {\n await initialization.catch(() => undefined);\n }\n if (state.rallyId !== this.#config.id) {\n throw new Error(\n `Cannot restore rally '${state.rallyId}' into client '${this.#config.id}'.`,\n );\n }\n\n const nextState = this.#reconcileState(cloneState(state), state.updatedAt);\n await this.#storage.save(nextState);\n this.#currentState = nextState;\n this.#initialization = Promise.resolve(nextState);\n this.#emit(nextState);\n return nextState;\n });\n }\n\n #enqueue<T>(operation: () => Promise<T>): Promise<T> {\n const next = this.#operationQueue.then(operation, operation);\n this.#operationQueue = next.then(\n () => undefined,\n () => undefined,\n );\n return next;\n }\n\n #emit(state: StampRallyState): void {\n for (const listener of this.#listeners) {\n listener(state);\n }\n }\n\n #createEmptyState(now: string): StampRallyState {\n const state: StampRallyState = {\n rallyId: this.#config.id,\n records: [],\n ...(this.#config.rewards === undefined\n ? {}\n : {\n rewards: reconcileRewardStates(this.#config.rewards, [], 0, now),\n }),\n updatedAt: now,\n };\n return state;\n }\n\n #reconcileState(state: StampRallyState, now: string): StampRallyState {\n const configuredStampIds = new Set(this.#config.stamps.map((stamp) => stamp.id));\n const seenStampIds = new Set<string>();\n const records = state.records.filter((record) => {\n if (!configuredStampIds.has(record.stampId) || seenStampIds.has(record.stampId)) return false;\n seenStampIds.add(record.stampId);\n return true;\n });\n if (this.#config.rewards === undefined && state.rewards === undefined) {\n return records.length === state.records.length ? state : { ...state, records };\n }\n return {\n ...state,\n records,\n rewards: reconcileRewardStates(\n this.#config.rewards ?? [],\n state.rewards ?? [],\n records.length,\n now,\n ),\n };\n }\n}\n","import type { LocalizedString, LocalizedText, SupportedLocale } from \"./models.js\";\n\nexport function resolveLocalizedText(\n text: LocalizedText | undefined,\n locale: SupportedLocale,\n fallbackLocale: SupportedLocale = \"ja\",\n): string {\n if (text === undefined || text === \"\") return \"\";\n if (typeof text === \"string\") return text;\n return text[locale] || text[fallbackLocale] || \"\";\n}\n\nexport function toLocalizedString(text: LocalizedText | undefined): LocalizedString {\n if (text === undefined) return { ja: \"\", en: \"\" };\n return typeof text === \"string\" ? { ja: text, en: \"\" } : { ...text };\n}\n","import type { StampCondition } from \"./conditions.js\";\n\nexport type SupportedLocale = \"ja\" | \"en\";\nexport type LocalizedString = Record<SupportedLocale, string>;\nexport type LocalizedText = string | LocalizedString;\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 {\n readonly id: ThemePresetId;\n readonly name: LocalizedString;\n readonly description: LocalizedString;\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 readonly id: string;\n readonly name: LocalizedText;\n readonly description?: LocalizedText;\n readonly hint?: LocalizedText;\n readonly condition: StampCondition;\n readonly order?: number;\n}\n\n/** @deprecated Use SpotItem instead. */\nexport type StampDefinition = SpotItem;\n\nexport interface StampRecord {\n readonly stampId: string;\n readonly acquiredAt: string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\nexport type RewardType = \"digital\" | \"in_person\";\n\nexport type RedemptionMethod = \"manual_slide\" | \"staff_passcode\" | \"view_only\";\n\nexport type RewardStatus = \"LOCKED\" | \"AVAILABLE\" | \"CONSUMED\" | \"EXPIRED\";\n\nexport interface RewardItem {\n readonly id: string;\n readonly title: LocalizedText;\n readonly description: LocalizedText;\n readonly type: RewardType;\n readonly redemptionMethod: RedemptionMethod;\n readonly requiredStampCount: number;\n readonly digitalContentUrl?: string;\n readonly staffPasscode?: 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}\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 readonly id: string;\n readonly title?: LocalizedText;\n readonly description?: LocalizedText;\n readonly stamps: ReadonlyArray<StampDefinition>;\n readonly rewards?: ReadonlyArray<RewardItem>;\n readonly isSequential?: boolean;\n readonly theme?: SheetTheme;\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"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@stamprally/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A dependency-free stamp rally domain engine and storage-agnostic client.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/nitta-a/stamprally-core-app.git",
|
|
9
|
+
"directory": "packages/core"
|
|
10
|
+
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/nitta-a/stamprally-core-app/issues"
|
|
13
|
+
},
|
|
14
|
+
"homepage": "https://github.com/nitta-a/stamprally-core-app#readme",
|
|
15
|
+
"type": "module",
|
|
16
|
+
"sideEffects": false,
|
|
17
|
+
"publishConfig": {
|
|
18
|
+
"access": "public"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist"
|
|
22
|
+
],
|
|
23
|
+
"main": "./dist/index.cjs",
|
|
24
|
+
"module": "./dist/index.js",
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"types": "./dist/index.d.ts",
|
|
29
|
+
"import": "./dist/index.js",
|
|
30
|
+
"require": "./dist/index.cjs"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"fake-indexeddb": "^6.2.5",
|
|
35
|
+
"tsup": "^8.5.1",
|
|
36
|
+
"typescript": "^6.0.3",
|
|
37
|
+
"vitest": "^4.1.11"
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "tsup",
|
|
41
|
+
"dev": "tsup --watch",
|
|
42
|
+
"test": "vitest run",
|
|
43
|
+
"typecheck": "tsc -p tsconfig.json"
|
|
44
|
+
}
|
|
45
|
+
}
|