{"version":3,"file":"KeyScheduler.cjs","sources":["../../../src/executor/KeyScheduler.ts"],"sourcesContent":["import { withSyncSpan } from '../telemetry/tracer'\nimport type { OfflineTransaction } from '../types'\n\nexport class KeyScheduler {\n  private pendingTransactions: Array<OfflineTransaction> = []\n  private isRunning = false\n\n  schedule(transaction: OfflineTransaction): void {\n    withSyncSpan(\n      `scheduler.schedule`,\n      {\n        'transaction.id': transaction.id,\n        queueLength: this.pendingTransactions.length,\n      },\n      () => {\n        this.pendingTransactions.push(transaction)\n        // Sort by creation time to maintain FIFO order\n        this.pendingTransactions.sort(\n          (a, b) => a.createdAt.getTime() - b.createdAt.getTime(),\n        )\n      },\n    )\n  }\n\n  getNext(): OfflineTransaction | undefined {\n    return withSyncSpan(\n      `scheduler.getNext`,\n      { pendingCount: this.pendingTransactions.length },\n      (span) => {\n        if (this.isRunning || this.pendingTransactions.length === 0) {\n          span.setAttribute(`result`, `empty`)\n          return undefined\n        }\n\n        const firstTransaction = this.pendingTransactions[0]!\n\n        if (!this.isReadyToRun(firstTransaction)) {\n          span.setAttribute(`result`, `waiting_for_first`)\n          span.setAttribute(`transaction.id`, firstTransaction.id)\n          return undefined\n        }\n\n        span.setAttribute(`result`, `found`)\n        span.setAttribute(`transaction.id`, firstTransaction.id)\n        return firstTransaction\n      },\n    )\n  }\n\n  private isReadyToRun(transaction: OfflineTransaction): boolean {\n    return Date.now() >= transaction.nextAttemptAt\n  }\n\n  markStarted(_transaction: OfflineTransaction): void {\n    this.isRunning = true\n  }\n\n  markCompleted(transaction: OfflineTransaction): void {\n    this.removeTransaction(transaction)\n    this.isRunning = false\n  }\n\n  markFailed(_transaction: OfflineTransaction): void {\n    this.isRunning = false\n  }\n\n  private removeTransaction(transaction: OfflineTransaction): void {\n    const index = this.pendingTransactions.findIndex(\n      (tx) => tx.id === transaction.id,\n    )\n    if (index >= 0) {\n      this.pendingTransactions.splice(index, 1)\n    }\n  }\n\n  updateTransaction(transaction: OfflineTransaction): void {\n    const index = this.pendingTransactions.findIndex(\n      (tx) => tx.id === transaction.id,\n    )\n    if (index >= 0) {\n      this.pendingTransactions[index] = transaction\n      // Re-sort to maintain FIFO order after update\n      this.pendingTransactions.sort(\n        (a, b) => a.createdAt.getTime() - b.createdAt.getTime(),\n      )\n    }\n  }\n\n  getPendingCount(): number {\n    return this.pendingTransactions.length\n  }\n\n  getRunningCount(): number {\n    return this.isRunning ? 1 : 0\n  }\n\n  clear(): void {\n    this.pendingTransactions = []\n    this.isRunning = false\n  }\n\n  getAllPendingTransactions(): Array<OfflineTransaction> {\n    return [...this.pendingTransactions]\n  }\n\n  updateTransactions(updatedTransactions: Array<OfflineTransaction>): void {\n    for (const updatedTx of updatedTransactions) {\n      const index = this.pendingTransactions.findIndex(\n        (tx) => tx.id === updatedTx.id,\n      )\n      if (index >= 0) {\n        this.pendingTransactions[index] = updatedTx\n      }\n    }\n    // Re-sort to maintain FIFO order after updates\n    this.pendingTransactions.sort(\n      (a, b) => a.createdAt.getTime() - b.createdAt.getTime(),\n    )\n  }\n}\n"],"names":["withSyncSpan"],"mappings":";;;AAGO,MAAM,aAAa;AAAA,EAAnB,cAAA;AACL,SAAQ,sBAAiD,CAAA;AACzD,SAAQ,YAAY;AAAA,EAAA;AAAA,EAEpB,SAAS,aAAuC;AAC9CA,WAAAA;AAAAA,MACE;AAAA,MACA;AAAA,QACE,kBAAkB,YAAY;AAAA,QAC9B,aAAa,KAAK,oBAAoB;AAAA,MAAA;AAAA,MAExC,MAAM;AACJ,aAAK,oBAAoB,KAAK,WAAW;AAEzC,aAAK,oBAAoB;AAAA,UACvB,CAAC,GAAG,MAAM,EAAE,UAAU,YAAY,EAAE,UAAU,QAAA;AAAA,QAAQ;AAAA,MAE1D;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,UAA0C;AACxC,WAAOA,OAAAA;AAAAA,MACL;AAAA,MACA,EAAE,cAAc,KAAK,oBAAoB,OAAA;AAAA,MACzC,CAAC,SAAS;AACR,YAAI,KAAK,aAAa,KAAK,oBAAoB,WAAW,GAAG;AAC3D,eAAK,aAAa,UAAU,OAAO;AACnC,iBAAO;AAAA,QACT;AAEA,cAAM,mBAAmB,KAAK,oBAAoB,CAAC;AAEnD,YAAI,CAAC,KAAK,aAAa,gBAAgB,GAAG;AACxC,eAAK,aAAa,UAAU,mBAAmB;AAC/C,eAAK,aAAa,kBAAkB,iBAAiB,EAAE;AACvD,iBAAO;AAAA,QACT;AAEA,aAAK,aAAa,UAAU,OAAO;AACnC,aAAK,aAAa,kBAAkB,iBAAiB,EAAE;AACvD,eAAO;AAAA,MACT;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,aAAa,aAA0C;AAC7D,WAAO,KAAK,SAAS,YAAY;AAAA,EACnC;AAAA,EAEA,YAAY,cAAwC;AAClD,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,cAAc,aAAuC;AACnD,SAAK,kBAAkB,WAAW;AAClC,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,WAAW,cAAwC;AACjD,SAAK,YAAY;AAAA,EACnB;AAAA,EAEQ,kBAAkB,aAAuC;AAC/D,UAAM,QAAQ,KAAK,oBAAoB;AAAA,MACrC,CAAC,OAAO,GAAG,OAAO,YAAY;AAAA,IAAA;AAEhC,QAAI,SAAS,GAAG;AACd,WAAK,oBAAoB,OAAO,OAAO,CAAC;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,kBAAkB,aAAuC;AACvD,UAAM,QAAQ,KAAK,oBAAoB;AAAA,MACrC,CAAC,OAAO,GAAG,OAAO,YAAY;AAAA,IAAA;AAEhC,QAAI,SAAS,GAAG;AACd,WAAK,oBAAoB,KAAK,IAAI;AAElC,WAAK,oBAAoB;AAAA,QACvB,CAAC,GAAG,MAAM,EAAE,UAAU,YAAY,EAAE,UAAU,QAAA;AAAA,MAAQ;AAAA,IAE1D;AAAA,EACF;AAAA,EAEA,kBAA0B;AACxB,WAAO,KAAK,oBAAoB;AAAA,EAClC;AAAA,EAEA,kBAA0B;AACxB,WAAO,KAAK,YAAY,IAAI;AAAA,EAC9B;AAAA,EAEA,QAAc;AACZ,SAAK,sBAAsB,CAAA;AAC3B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,4BAAuD;AACrD,WAAO,CAAC,GAAG,KAAK,mBAAmB;AAAA,EACrC;AAAA,EAEA,mBAAmB,qBAAsD;AACvE,eAAW,aAAa,qBAAqB;AAC3C,YAAM,QAAQ,KAAK,oBAAoB;AAAA,QACrC,CAAC,OAAO,GAAG,OAAO,UAAU;AAAA,MAAA;AAE9B,UAAI,SAAS,GAAG;AACd,aAAK,oBAAoB,KAAK,IAAI;AAAA,MACpC;AAAA,IACF;AAEA,SAAK,oBAAoB;AAAA,MACvB,CAAC,GAAG,MAAM,EAAE,UAAU,YAAY,EAAE,UAAU,QAAA;AAAA,IAAQ;AAAA,EAE1D;AACF;;"}