{"version":3,"sources":["../../../src/worker/expo/taskQueue.ts","../../../src/worker/expo/asyncStorageTaskQueue.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * A task item represents a unit of work in the inbox.\n */\nexport interface TaskItem {\n    id: string;\n    type: string;\n    data: Record<string, unknown>;\n    createdAt: number;\n}\n\n/**\n * A task result represents the outcome of processing a task item.\n */\nexport interface TaskResult {\n    id: string;\n    taskItemId: string;\n    type: string;\n    status: \"success\" | \"failed\" | \"noop\";\n    data?: Record<string, unknown>;\n    executedAt: number;\n}\n\n/**\n * Persistence layer for handing off work between foreground and background.\n *\n * - **Inbox**: tasks waiting to be processed.\n * - **Outbox**: results produced by processors, waiting to be consumed.\n */\nexport interface TaskQueue {\n    // Inbox\n    addTask(task: TaskItem): Promise<void>;\n    removeTask(id: string): Promise<void>;\n    getTasks(type?: string): Promise<TaskItem[]>;\n    clearTasks(): Promise<void>;\n\n    // Outbox\n    pushResult(result: TaskResult): Promise<void>;\n    getResults(): Promise<TaskResult[]>;\n    acknowledgeResults(ids: string[]): Promise<void>;\n}\n\n/**\n * In-memory TaskQueue for testing and lightweight use.\n * State is lost when the process exits.\n */\nexport class InMemoryTaskQueue implements TaskQueue {\n    private inbox = new Map<string, TaskItem>();\n    private outbox = new Map<string, TaskResult>();\n\n    async addTask(task: TaskItem): Promise<void> {\n        this.inbox.set(task.id, task);\n    }\n\n    async removeTask(id: string): Promise<void> {\n        this.inbox.delete(id);\n    }\n\n    async getTasks(type?: string): Promise<TaskItem[]> {\n        const tasks = Array.from(this.inbox.values());\n        if (type) {\n            return tasks.filter((t) => t.type === type);\n        }\n        return tasks;\n    }\n\n    async clearTasks(): Promise<void> {\n        this.inbox.clear();\n    }\n\n    async pushResult(result: TaskResult): Promise<void> {\n        this.outbox.set(result.id, result);\n    }\n\n    async getResults(): Promise<TaskResult[]> {\n        return Array.from(this.outbox.values());\n    }\n\n    async acknowledgeResults(ids: string[]): Promise<void> {\n        for (const id of ids) {\n            this.outbox.delete(id);\n        }\n    }\n}\n","import type { TaskItem, TaskResult, TaskQueue } from \"./taskQueue\";\n\n/**\n * Minimal async key-value storage interface.\n *\n * Compatible with `@react-native-async-storage/async-storage` and\n * any other storage that exposes the same three methods.\n */\nexport interface AsyncStorageLike {\n    getItem(key: string): Promise<string | null>;\n    setItem(key: string, value: string): Promise<void>;\n    removeItem(key: string): Promise<void>;\n}\n\n/**\n * AsyncStorage-backed TaskQueue for Expo/React Native.\n *\n * Persists inbox, outbox, and an optional config blob to AsyncStorage\n * so that data survives process restarts and can be shared between\n * foreground and background execution contexts.\n */\nexport class AsyncStorageTaskQueue implements TaskQueue {\n    private readonly inboxKey: string;\n    private readonly outboxKey: string;\n    private readonly configKey: string;\n\n    constructor(\n        private readonly storage: AsyncStorageLike,\n        prefix = \"ark:task-queue\",\n    ) {\n        this.inboxKey = `${prefix}:inbox`;\n        this.outboxKey = `${prefix}:outbox`;\n        this.configKey = `${prefix}:config`;\n    }\n\n    // ── Inbox ────────────────────────────────────────────────────────\n\n    async addTask(task: TaskItem): Promise<void> {\n        const tasks = await this.readList<TaskItem>(this.inboxKey);\n        tasks.push(task);\n        await this.writeList(this.inboxKey, tasks);\n    }\n\n    async removeTask(id: string): Promise<void> {\n        const tasks = await this.readList<TaskItem>(this.inboxKey);\n        await this.writeList(\n            this.inboxKey,\n            tasks.filter((t) => t.id !== id),\n        );\n    }\n\n    async getTasks(type?: string): Promise<TaskItem[]> {\n        const tasks = await this.readList<TaskItem>(this.inboxKey);\n        if (type) {\n            return tasks.filter((t) => t.type === type);\n        }\n        return tasks;\n    }\n\n    async clearTasks(): Promise<void> {\n        await this.storage.removeItem(this.inboxKey);\n    }\n\n    // ── Outbox ───────────────────────────────────────────────────────\n\n    async pushResult(result: TaskResult): Promise<void> {\n        const results = await this.readList<TaskResult>(this.outboxKey);\n        results.push(result);\n        await this.writeList(this.outboxKey, results);\n    }\n\n    async getResults(): Promise<TaskResult[]> {\n        return this.readList<TaskResult>(this.outboxKey);\n    }\n\n    async acknowledgeResults(ids: string[]): Promise<void> {\n        const idSet = new Set(ids);\n        const results = await this.readList<TaskResult>(this.outboxKey);\n        await this.writeList(\n            this.outboxKey,\n            results.filter((r) => !idSet.has(r.id)),\n        );\n    }\n\n    // ── Config persistence (for background handler rehydration) ──────\n\n    /**\n     * Persist a config blob alongside the queue data.\n     * Used by @see ExpoWallet.setup to store the wallet parameters\n     * that the background handler needs to reconstruct providers.\n     */\n    async persistConfig(config: Record<string, unknown> | object): Promise<void> {\n        await this.storage.setItem(this.configKey, JSON.stringify(config));\n    }\n\n    /**\n     * Load the persisted config blob.\n     * Used by the background handler to rehydrate wallet dependencies.\n     */\n    async loadConfig<T = Record<string, unknown>>(): Promise<T | null> {\n        const raw = await this.storage.getItem(this.configKey);\n        return raw ? JSON.parse(raw) : null;\n    }\n\n    // ── Helpers ──────────────────────────────────────────────────────\n\n    private async readList<T>(key: string): Promise<T[]> {\n        const raw = await this.storage.getItem(key);\n        return raw ? JSON.parse(raw) : [];\n    }\n\n    private async writeList<T>(key: string, list: T[]): Promise<void> {\n        await this.storage.setItem(key, JSON.stringify(list));\n    }\n}\n"]}