{"version":3,"file":"OfflineTransaction.cjs","sources":["../../../src/api/OfflineTransaction.ts"],"sourcesContent":["import { createTransaction } from '@tanstack/db'\nimport { NonRetriableError } from '../types'\nimport type { PendingMutation, Transaction } from '@tanstack/db'\nimport type {\n  CreateOfflineTransactionOptions,\n  OfflineMutationFn,\n  OfflineTransaction as OfflineTransactionType,\n} from '../types'\n\nexport class OfflineTransaction {\n  private offlineId: string\n  private mutationFnName: string\n  private autoCommit: boolean\n  private idempotencyKey: string\n  private metadata: Record<string, any>\n  private transaction: Transaction | null = null\n  private persistTransaction: (tx: OfflineTransactionType) => Promise<void>\n  private executor: any // Will be typed properly - reference to OfflineExecutor\n\n  constructor(\n    options: CreateOfflineTransactionOptions,\n    mutationFn: OfflineMutationFn,\n    persistTransaction: (tx: OfflineTransactionType) => Promise<void>,\n    executor: any,\n  ) {\n    this.offlineId = crypto.randomUUID()\n    this.mutationFnName = options.mutationFnName\n    this.autoCommit = options.autoCommit ?? true\n    this.idempotencyKey = options.idempotencyKey ?? crypto.randomUUID()\n    this.metadata = options.metadata ?? {}\n    this.persistTransaction = persistTransaction\n    this.executor = executor\n  }\n\n  mutate(callback: () => void): Transaction {\n    this.transaction = createTransaction({\n      id: this.offlineId,\n      autoCommit: false,\n      mutationFn: async () => {\n        // This is the blocking mutationFn that waits for the executor\n        // First persist the transaction to the outbox\n        const offlineTransaction: OfflineTransactionType = {\n          id: this.offlineId,\n          mutationFnName: this.mutationFnName,\n          mutations: this.transaction!.mutations,\n          keys: this.extractKeys(this.transaction!.mutations),\n          idempotencyKey: this.idempotencyKey,\n          createdAt: new Date(),\n          retryCount: 0,\n          nextAttemptAt: Date.now(),\n          metadata: this.metadata,\n          spanContext: undefined,\n          version: 1,\n        }\n\n        const completionPromise = this.executor.waitForTransactionCompletion(\n          this.offlineId,\n        )\n\n        try {\n          await this.persistTransaction(offlineTransaction)\n          // Now block and wait for the executor to complete the real mutation\n          await completionPromise\n        } catch (error) {\n          const normalizedError =\n            error instanceof Error ? error : new Error(String(error))\n          this.executor.rejectTransaction(this.offlineId, normalizedError)\n          throw error\n        }\n\n        return\n      },\n      metadata: this.metadata,\n    })\n\n    this.transaction.mutate(() => {\n      callback()\n    })\n\n    if (this.autoCommit) {\n      // Auto-commit for direct OfflineTransaction usage\n      this.commit().catch((error) => {\n        console.error(`Auto-commit failed:`, error)\n        throw error\n      })\n    }\n\n    return this.transaction\n  }\n\n  async commit(): Promise<Transaction> {\n    if (!this.transaction) {\n      throw new Error(`No mutations to commit. Call mutate() first.`)\n    }\n\n    try {\n      // Commit the TanStack DB transaction\n      // This will trigger the mutationFn which handles persistence and waiting\n      await this.transaction.commit()\n      return this.transaction\n    } catch (error) {\n      // Only rollback for NonRetriableError - other errors should allow retry\n      if (error instanceof NonRetriableError) {\n        this.transaction.rollback()\n      }\n      throw error\n    }\n  }\n\n  rollback(): void {\n    if (this.transaction) {\n      this.transaction.rollback()\n    }\n  }\n\n  private extractKeys(mutations: Array<PendingMutation>): Array<string> {\n    return mutations.map((mutation) => mutation.globalKey)\n  }\n\n  get id(): string {\n    return this.offlineId\n  }\n}\n"],"names":["createTransaction","NonRetriableError"],"mappings":";;;;AASO,MAAM,mBAAmB;AAAA;AAAA,EAU9B,YACE,SACA,YACA,oBACA,UACA;AATF,SAAQ,cAAkC;AAUxC,SAAK,YAAY,OAAO,WAAA;AACxB,SAAK,iBAAiB,QAAQ;AAC9B,SAAK,aAAa,QAAQ,cAAc;AACxC,SAAK,iBAAiB,QAAQ,kBAAkB,OAAO,WAAA;AACvD,SAAK,WAAW,QAAQ,YAAY,CAAA;AACpC,SAAK,qBAAqB;AAC1B,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,OAAO,UAAmC;AACxC,SAAK,cAAcA,qBAAkB;AAAA,MACnC,IAAI,KAAK;AAAA,MACT,YAAY;AAAA,MACZ,YAAY,YAAY;AAGtB,cAAM,qBAA6C;AAAA,UACjD,IAAI,KAAK;AAAA,UACT,gBAAgB,KAAK;AAAA,UACrB,WAAW,KAAK,YAAa;AAAA,UAC7B,MAAM,KAAK,YAAY,KAAK,YAAa,SAAS;AAAA,UAClD,gBAAgB,KAAK;AAAA,UACrB,+BAAe,KAAA;AAAA,UACf,YAAY;AAAA,UACZ,eAAe,KAAK,IAAA;AAAA,UACpB,UAAU,KAAK;AAAA,UACf,aAAa;AAAA,UACb,SAAS;AAAA,QAAA;AAGX,cAAM,oBAAoB,KAAK,SAAS;AAAA,UACtC,KAAK;AAAA,QAAA;AAGP,YAAI;AACF,gBAAM,KAAK,mBAAmB,kBAAkB;AAEhD,gBAAM;AAAA,QACR,SAAS,OAAO;AACd,gBAAM,kBACJ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAC1D,eAAK,SAAS,kBAAkB,KAAK,WAAW,eAAe;AAC/D,gBAAM;AAAA,QACR;AAEA;AAAA,MACF;AAAA,MACA,UAAU,KAAK;AAAA,IAAA,CAChB;AAED,SAAK,YAAY,OAAO,MAAM;AAC5B,eAAA;AAAA,IACF,CAAC;AAED,QAAI,KAAK,YAAY;AAEnB,WAAK,OAAA,EAAS,MAAM,CAAC,UAAU;AAC7B,gBAAQ,MAAM,uBAAuB,KAAK;AAC1C,cAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,SAA+B;AACnC,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAEA,QAAI;AAGF,YAAM,KAAK,YAAY,OAAA;AACvB,aAAO,KAAK;AAAA,IACd,SAAS,OAAO;AAEd,UAAI,iBAAiBC,MAAAA,mBAAmB;AACtC,aAAK,YAAY,SAAA;AAAA,MACnB;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,WAAiB;AACf,QAAI,KAAK,aAAa;AACpB,WAAK,YAAY,SAAA;AAAA,IACnB;AAAA,EACF;AAAA,EAEQ,YAAY,WAAkD;AACpE,WAAO,UAAU,IAAI,CAAC,aAAa,SAAS,SAAS;AAAA,EACvD;AAAA,EAEA,IAAI,KAAa;AACf,WAAO,KAAK;AAAA,EACd;AACF;;"}