@lokvis/runtime 0.1.0 → 0.2.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.
Files changed (80) hide show
  1. package/LICENSE +21 -0
  2. package/dist/asset-store.d.ts +5 -2
  3. package/dist/asset-store.d.ts.map +1 -1
  4. package/dist/asset-store.js +93 -3
  5. package/dist/asset-store.js.map +1 -1
  6. package/dist/batch-processor.d.ts +200 -0
  7. package/dist/batch-processor.d.ts.map +1 -0
  8. package/dist/batch-processor.js +505 -0
  9. package/dist/batch-processor.js.map +1 -0
  10. package/dist/capability-registry.d.ts +4 -0
  11. package/dist/capability-registry.d.ts.map +1 -1
  12. package/dist/capability-registry.js +19 -2
  13. package/dist/capability-registry.js.map +1 -1
  14. package/dist/degradation.d.ts +109 -0
  15. package/dist/degradation.d.ts.map +1 -0
  16. package/dist/degradation.js +184 -0
  17. package/dist/degradation.js.map +1 -0
  18. package/dist/event-bus.d.ts.map +1 -1
  19. package/dist/event-bus.js +7 -2
  20. package/dist/event-bus.js.map +1 -1
  21. package/dist/executor.d.ts.map +1 -1
  22. package/dist/executor.js +37 -1
  23. package/dist/executor.js.map +1 -1
  24. package/dist/history-store.d.ts +76 -0
  25. package/dist/history-store.d.ts.map +1 -0
  26. package/dist/history-store.js +109 -0
  27. package/dist/history-store.js.map +1 -0
  28. package/dist/history.d.ts +1 -1
  29. package/dist/history.d.ts.map +1 -1
  30. package/dist/history.js +1 -1
  31. package/dist/history.js.map +1 -1
  32. package/dist/idb-asset-store.js +1 -1
  33. package/dist/idb-asset-store.js.map +1 -1
  34. package/dist/index.d.ts +5 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +5 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/memory-guard.d.ts +109 -0
  39. package/dist/memory-guard.d.ts.map +1 -0
  40. package/dist/memory-guard.js +161 -0
  41. package/dist/memory-guard.js.map +1 -0
  42. package/dist/opfs-asset-store.d.ts +35 -4
  43. package/dist/opfs-asset-store.d.ts.map +1 -1
  44. package/dist/opfs-asset-store.js +94 -10
  45. package/dist/opfs-asset-store.js.map +1 -1
  46. package/dist/runtime.d.ts +139 -4
  47. package/dist/runtime.d.ts.map +1 -1
  48. package/dist/runtime.js +443 -25
  49. package/dist/runtime.js.map +1 -1
  50. package/dist/types.d.ts +101 -2
  51. package/dist/types.d.ts.map +1 -1
  52. package/dist/worker-host.d.ts +13 -0
  53. package/dist/worker-host.d.ts.map +1 -1
  54. package/dist/worker-host.js +47 -15
  55. package/dist/worker-host.js.map +1 -1
  56. package/dist/worker-protocol.d.ts +10 -1
  57. package/dist/worker-protocol.d.ts.map +1 -1
  58. package/dist/worker-protocol.js.map +1 -1
  59. package/dist/workflow-builder.d.ts +124 -0
  60. package/dist/workflow-builder.d.ts.map +1 -0
  61. package/dist/workflow-builder.js +240 -0
  62. package/dist/workflow-builder.js.map +1 -0
  63. package/package.json +3 -2
  64. package/src/asset-store.ts +103 -3
  65. package/src/batch-processor.ts +699 -0
  66. package/src/capability-registry.ts +19 -2
  67. package/src/degradation.ts +241 -0
  68. package/src/event-bus.ts +6 -2
  69. package/src/executor.ts +46 -1
  70. package/src/history-store.ts +159 -0
  71. package/src/history.ts +2 -2
  72. package/src/idb-asset-store.ts +1 -1
  73. package/src/index.ts +5 -0
  74. package/src/memory-guard.ts +202 -0
  75. package/src/opfs-asset-store.ts +118 -10
  76. package/src/runtime.ts +482 -21
  77. package/src/types.ts +98 -1
  78. package/src/worker-host.ts +56 -16
  79. package/src/worker-protocol.ts +11 -1
  80. package/src/workflow-builder.ts +303 -0
package/dist/history.d.ts CHANGED
@@ -19,7 +19,7 @@ export interface HistoryStackConfig {
19
19
  /** 淘汰条目时的回调,用于清理 OPFS 资产 */
20
20
  onEvict?: (entry: HistoryEntry) => void;
21
21
  /** 历史变更时的回调,用于转发为 eventBus 事件 */
22
- onChanged?: (workflowId: string, entries: HistoryEntry[]) => void;
22
+ onChanged?: (workflowId: string, entries: HistoryEntry[], currentIndex: number) => void;
23
23
  }
24
24
  /** HistoryStack 状态(供序列化/恢复使用) */
25
25
  export interface HistoryStackSnapshot {
@@ -1 +1 @@
1
- {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,sBAAsB;AACtB,MAAM,WAAW,kBAAkB;IACjC,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC,iCAAiC;IACjC,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;CACnE;AAED,iCAAiC;AACjC,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IAQrB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAP7B,OAAO,CAAC,OAAO,CAAsB;IACrC,wCAAwC;IACxC,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAC6B;gBAGjC,UAAU,EAAE,MAAM,EACnC,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;IAS1C,8BAA8B;IAC9B,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,kCAAkC;IAClC,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,gBAAgB;IAChB,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,gBAAgB;IAChB,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,mBAAmB;IACnB,IAAI,IAAI,YAAY,EAAE;IAItB,4BAA4B;IAC5B,OAAO,IAAI,YAAY,EAAE;IAIzB,0BAA0B;IAC1B,UAAU,IAAI,YAAY,EAAE;IAI5B;;;;;OAKG;IACH,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAuBjC;;;;;;OAMG;IACH,IAAI,IAAI,YAAY,GAAG,IAAI,GAAG,SAAS;IAOvC;;;OAGG;IACH,IAAI,IAAI,YAAY,GAAG,SAAS;IAOhC,iCAAiC;IACjC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,GAAG,SAAS;IAOtD,kCAAkC;IAClC,KAAK,IAAI,IAAI;IAMb;;;;OAIG;IACH,KAAK,IAAI,IAAI;IASb,6BAA6B;IAC7B,QAAQ,IAAI,oBAAoB;IAOhC,YAAY;IACZ,OAAO,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAQ7C,kCAAkC;IAClC,OAAO,CAAC,WAAW;IAYnB,2CAA2C;IAC3C,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,aAAa;CAGtB;AAED,yBAAyB;AACzB,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACnC,YAAY,CAEd"}
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,sBAAsB;AACtB,MAAM,WAAW,kBAAkB;IACjC,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC,iCAAiC;IACjC,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CACzF;AAED,iCAAiC;AACjC,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IAQrB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAP7B,OAAO,CAAC,OAAO,CAAsB;IACrC,wCAAwC;IACxC,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAC6B;gBAGjC,UAAU,EAAE,MAAM,EACnC,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;IAS1C,8BAA8B;IAC9B,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,kCAAkC;IAClC,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,gBAAgB;IAChB,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,gBAAgB;IAChB,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,mBAAmB;IACnB,IAAI,IAAI,YAAY,EAAE;IAItB,4BAA4B;IAC5B,OAAO,IAAI,YAAY,EAAE;IAIzB,0BAA0B;IAC1B,UAAU,IAAI,YAAY,EAAE;IAI5B;;;;;OAKG;IACH,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAuBjC;;;;;;OAMG;IACH,IAAI,IAAI,YAAY,GAAG,IAAI,GAAG,SAAS;IAOvC;;;OAGG;IACH,IAAI,IAAI,YAAY,GAAG,SAAS;IAOhC,iCAAiC;IACjC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,GAAG,SAAS;IAOtD,kCAAkC;IAClC,KAAK,IAAI,IAAI;IAMb;;;;OAIG;IACH,KAAK,IAAI,IAAI;IASb,6BAA6B;IAC7B,QAAQ,IAAI,oBAAoB;IAOhC,YAAY;IACZ,OAAO,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAQ7C,kCAAkC;IAClC,OAAO,CAAC,WAAW;IAYnB,2CAA2C;IAC3C,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,aAAa;CAGtB;AAED,yBAAyB;AACzB,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACnC,YAAY,CAEd"}
package/dist/history.js CHANGED
@@ -161,7 +161,7 @@ export class HistoryStack {
161
161
  this.notifyEvict(evicted);
162
162
  }
163
163
  notifyChanged() {
164
- this.config.onChanged?.(this.workflowId, this.list());
164
+ this.config.onChanged?.(this.workflowId, this.list(), this.cursor);
165
165
  }
166
166
  }
167
167
  /** 工厂:创建 HistoryStack */
@@ -1 +1 @@
1
- {"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AA+BA,MAAM,OAAO,YAAY;IAQJ;IAPX,OAAO,GAAmB,EAAE,CAAC;IACrC,wCAAwC;IAChC,MAAM,GAAG,CAAC,CAAC,CAAC;IACH,MAAM,CAC6B;IAEpD,YACmB,UAAkB,EACnC,SAAsC,EAAE;QADvB,eAAU,GAAV,UAAU,CAAQ;QAGnC,IAAI,CAAC,MAAM,GAAG;YACZ,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;YACnC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,kCAAkC;IAClC,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,gBAAgB;IAChB,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,gBAAgB;IAChB,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,mBAAmB;IACnB,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,4BAA4B;IAC5B,OAAO;QACL,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,0BAA0B;IAC1B,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,KAAmB;QACxB,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CACb,+CAA+C,IAAI,CAAC,UAAU,WAAW,KAAK,CAAC,UAAU,GAAG,CAC7F,CAAC;QACJ,CAAC;QAED,gDAAgD;QAChD,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACtD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAEtC,aAAa;QACb,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED;;;;;;OAMG;IACH,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QACpC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QACpC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC;IACpC,CAAC;IAED,iCAAiC;IACjC,MAAM,CAAC,KAAa;QAClB,IAAI,KAAK,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QACjE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IAED,kCAAkC;IAClC,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,6BAA6B;IAC7B,QAAQ;QACN,OAAO;YACL,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YAC1B,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;IAED,YAAY;IACZ,OAAO,CAAC,QAA8B;QACpC,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,kDAAkD;IAElD,kCAAkC;IAC1B,WAAW,CAAC,OAAuB;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC7C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;YAAC,MAAM,CAAC;gBACP,8BAA8B;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,2CAA2C;IACnC,aAAa;QACnB,+CAA+C;QAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACpD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACrB,sBAAsB;gBACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAG,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;CACF;AAED,yBAAyB;AACzB,MAAM,UAAU,kBAAkB,CAChC,UAAkB,EAClB,MAAoC;IAEpC,OAAO,IAAI,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"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"}
@@ -41,7 +41,7 @@ export async function createIdbAssetStore(options = {}) {
41
41
  const db = options.dbInstance ?? new AssetDatabase(options.dbName);
42
42
  return {
43
43
  async import(source) {
44
- const { id, blob, metadata, type } = prepareImport(source);
44
+ const { id, blob, metadata, type } = await prepareImport(source);
45
45
  const asset = buildAsset(id, blob, metadata, type, IDB_PATH_PREFIX);
46
46
  await db.assets.put({ id, asset, blob });
47
47
  return asset;
@@ -1 +1 @@
1
- {"version":3,"file":"idb-asset-store.js","sourceRoot":"","sources":["../src/idb-asset-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"idb-asset-store.js","sourceRoot":"","sources":["../src/idb-asset-store.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -14,6 +14,11 @@ export * from './executor.js';
14
14
  export * from './worker-protocol.js';
15
15
  export * from './worker-host.js';
16
16
  export * from './history.js';
17
+ export * from './history-store.js';
18
+ export * from './memory-guard.js';
19
+ export * from './degradation.js';
20
+ export * from './batch-processor.js';
21
+ export * from './workflow-builder.js';
17
22
  export * from './runtime.js';
18
23
  export { RUNTIME_VERSION } from './runtime.js';
19
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -14,6 +14,11 @@ export * from './executor.js';
14
14
  export * from './worker-protocol.js';
15
15
  export * from './worker-host.js';
16
16
  export * from './history.js';
17
+ export * from './history-store.js';
18
+ export * from './memory-guard.js';
19
+ export * from './degradation.js';
20
+ export * from './batch-processor.js';
21
+ export * from './workflow-builder.js';
17
22
  export * from './runtime.js';
18
23
  export { RUNTIME_VERSION } from './runtime.js';
19
24
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * 内存阈值监测与 OPFS 溢出(W3.3)
3
+ *
4
+ * 目标(对应 whitepaper T1「浏览器内存/性能 ★★★★★」):
5
+ * 浏览器单 tab 内存有限(桌面典型 2-4GB,移动端更少),大图批量处理
6
+ * 极易触发 OOM 崩溃(整个 tab 被杀,丢失所有中间结果)。MemoryGuard 通过
7
+ * 显式追踪中间结果占用 + 周期性压力评估,在逼近预算时把中间 Blob 溢出
8
+ * 到 OPFS,把"OPFS 当虚拟内存用"——内存里只留当前活跃的一两个 Blob。
9
+ *
10
+ * 设计取舍:
11
+ * - tracked:显式登记的中间分配(decode 结果、canvas 输出等大对象)。
12
+ * 相比 `performance.memory`(Chrome-only、deprecated、MB 粒度、跨浏览器
13
+ * 不可用),tracked 是可控、可测、确定性的信号,适合做预算判定主依据。
14
+ * - budget:512MB(经验值——留出 JS runtime / DOM / 其他 tab 的余量,
15
+ * 实际由 RuntimeConfig.memoryBudget 传入,默认 512MB)。
16
+ * - pressure:low(<60%) / elevated(60-80%) / high(80-95%) / critical(≥95%)。
17
+ * - shouldSpill:pressure >= high 时建议把当前中间结果落 OPFS。
18
+ * - spill/restore/evict:经由 AssetStore(OPFS-backed when available;
19
+ * runtime 已用 wrapAssetStoreWithQuota 包裹,溢出受 storageQuota 约束,
20
+ * 避免无限溢出把磁盘填满)。
21
+ *
22
+ * 集成方式(由 W3.4 degradation 编排):
23
+ * const guard = new MemoryGuard({ budget, assetStore });
24
+ * const alloc = guard.track(blob.size); // 登记
25
+ * if (guard.shouldSpill()) { const a = await guard.spill(blob); blob = null; } // 溢出
26
+ * ...
27
+ * alloc.release(); // 回退
28
+ */
29
+ import type { Asset, AssetType } from '@lokvis/schema';
30
+ import type { AssetStore } from './asset-store.js';
31
+ /** 默认内存预算:512MB(见上) */
32
+ export declare const DEFAULT_MEMORY_BUDGET: number;
33
+ /** 内存压力等级(降级阶梯 W3.4 据此选择策略) */
34
+ export type MemoryPressure = 'low' | 'elevated' | 'high' | 'critical';
35
+ export interface MemoryGuardOptions {
36
+ /** 总内存预算(字节),超出 high 阈值则建议溢出 */
37
+ budget?: number;
38
+ /** elevated 阈值占 budget 比例(默认 0.6) */
39
+ elevatedRatio?: number;
40
+ /** high 阈值(默认 0.8):达到则 shouldSpill=true */
41
+ highRatio?: number;
42
+ /** critical 阈值(默认 0.95):达到则降级阶梯走 L4 拒绝 */
43
+ criticalRatio?: number;
44
+ /** 溢出目标(通常为 OPFS-backed AssetStore);不提供则 shouldSpill 永远 false */
45
+ assetStore?: AssetStore;
46
+ }
47
+ /** track() 返回的分配句柄:丢弃引用时调用 release() 回退计数(幂等) */
48
+ export interface MemoryAllocation {
49
+ /** 该笔登记的字节数 */
50
+ readonly bytes: number;
51
+ /** 回退登记;重复调用幂等(仅首次生效) */
52
+ release(): void;
53
+ }
54
+ /**
55
+ * 估算解码后位图占用的内存(RGBA,4 字节/像素)。
56
+ *
57
+ * 一个 4000×3000 的 JPEG,blob 可能只有 2MB,但 decode 成 ImageBitmap 后
58
+ * 占 4000*3000*4 ≈ 46MB。追踪中间结果时应以此为准而非 blob.size,
59
+ * 否则严重低估内存压力。
60
+ */
61
+ export declare function estimateDecodedBytes(width: number, height: number): number;
62
+ /** 估算 Blob 在内存中占用的字节数(对未解码的 Blob,以其 size 为准) */
63
+ export declare function estimateBlobBytes(blob: Blob): number;
64
+ /** 内存守卫:追踪中间结果占用 + 触发 OPFS 溢出 */
65
+ export declare class MemoryGuard {
66
+ private tracked;
67
+ private readonly budget;
68
+ private readonly elevatedRatio;
69
+ private readonly highRatio;
70
+ private readonly criticalRatio;
71
+ private readonly assetStore?;
72
+ constructor(opts?: MemoryGuardOptions);
73
+ /** 当前已登记的字节数 */
74
+ get currentUsage(): number;
75
+ /** 总预算(字节) */
76
+ get budgetBytes(): number;
77
+ /** 当前是否已配置可溢出的 AssetStore */
78
+ get canSpill(): boolean;
79
+ /**
80
+ * 登记一笔内存占用。返回 release 句柄,丢弃引用时调用以回退计数。
81
+ * 用于追踪 decode 结果 / canvas 输出等大对象的生命周期。
82
+ */
83
+ track(bytes: number): MemoryAllocation;
84
+ /** 当前压力等级(基于 tracked / budget) */
85
+ getPressure(): MemoryPressure;
86
+ /** 已用比例(0-1+) */
87
+ getUsageRatio(): number;
88
+ /**
89
+ * 是否应溢出(pressure >= high)。无 assetStore 时永远 false(无法溢出,
90
+ * 交由降级阶梯 L3/L4 处理)。
91
+ */
92
+ shouldSpill(): boolean;
93
+ /**
94
+ * 把一个中间 Blob 溢出到 OPFS(assetStore.create),返回 Asset 句柄。
95
+ * 调用方应在 spill 后丢弃内存中的 Blob 引用,以真正释放内存。
96
+ *
97
+ * @param blob 要溢出的中间结果
98
+ * @param mimeType Blob 的 MIME(用于元数据);默认取 blob.type
99
+ * @param assetType 资产类型(默认 'image');video/pdf 管线可传对应类型
100
+ */
101
+ spill(blob: Blob, mimeType?: string, assetType?: AssetType): Promise<Asset>;
102
+ /** 从 OPFS 读回之前 spill 的中间结果 */
103
+ restore(asset: Asset): Promise<Blob>;
104
+ /** 丢弃已 spill 的中间结果(处理完成后回收 OPFS 空间) */
105
+ evict(asset: Asset): Promise<void>;
106
+ /** 重置所有登记(用于工作流结束 / 取消后的清理,tracked 归零) */
107
+ reset(): void;
108
+ }
109
+ //# sourceMappingURL=memory-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-guard.d.ts","sourceRoot":"","sources":["../src/memory-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAiB,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,uBAAuB;AACvB,eAAO,MAAM,qBAAqB,QAAoB,CAAC;AAEvD,+BAA+B;AAC/B,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;AAEtE,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,iDAAiD;AACjD,MAAM,WAAW,gBAAgB;IAC/B,eAAe;IACf,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yBAAyB;IACzB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,gDAAgD;AAChD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAEpD;AAED,iCAAiC;AACjC,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAa;gBAE7B,IAAI,GAAE,kBAAuB;IAgBzC,gBAAgB;IAChB,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,cAAc;IACd,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,6BAA6B;IAC7B,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB;IAgBtC,kCAAkC;IAClC,WAAW,IAAI,cAAc;IAQ7B,iBAAiB;IACjB,aAAa,IAAI,MAAM;IAIvB;;;OAGG;IACH,WAAW,IAAI,OAAO;IAMtB;;;;;;;OAOG;IACG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,SAAmB,GAAG,OAAO,CAAC,KAAK,CAAC;IAgB1F,8BAA8B;IACxB,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAO1C,uCAAuC;IACjC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC,0CAA0C;IAC1C,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * 内存阈值监测与 OPFS 溢出(W3.3)
3
+ *
4
+ * 目标(对应 whitepaper T1「浏览器内存/性能 ★★★★★」):
5
+ * 浏览器单 tab 内存有限(桌面典型 2-4GB,移动端更少),大图批量处理
6
+ * 极易触发 OOM 崩溃(整个 tab 被杀,丢失所有中间结果)。MemoryGuard 通过
7
+ * 显式追踪中间结果占用 + 周期性压力评估,在逼近预算时把中间 Blob 溢出
8
+ * 到 OPFS,把"OPFS 当虚拟内存用"——内存里只留当前活跃的一两个 Blob。
9
+ *
10
+ * 设计取舍:
11
+ * - tracked:显式登记的中间分配(decode 结果、canvas 输出等大对象)。
12
+ * 相比 `performance.memory`(Chrome-only、deprecated、MB 粒度、跨浏览器
13
+ * 不可用),tracked 是可控、可测、确定性的信号,适合做预算判定主依据。
14
+ * - budget:512MB(经验值——留出 JS runtime / DOM / 其他 tab 的余量,
15
+ * 实际由 RuntimeConfig.memoryBudget 传入,默认 512MB)。
16
+ * - pressure:low(<60%) / elevated(60-80%) / high(80-95%) / critical(≥95%)。
17
+ * - shouldSpill:pressure >= high 时建议把当前中间结果落 OPFS。
18
+ * - spill/restore/evict:经由 AssetStore(OPFS-backed when available;
19
+ * runtime 已用 wrapAssetStoreWithQuota 包裹,溢出受 storageQuota 约束,
20
+ * 避免无限溢出把磁盘填满)。
21
+ *
22
+ * 集成方式(由 W3.4 degradation 编排):
23
+ * const guard = new MemoryGuard({ budget, assetStore });
24
+ * const alloc = guard.track(blob.size); // 登记
25
+ * if (guard.shouldSpill()) { const a = await guard.spill(blob); blob = null; } // 溢出
26
+ * ...
27
+ * alloc.release(); // 回退
28
+ */
29
+ /** 默认内存预算:512MB(见上) */
30
+ export const DEFAULT_MEMORY_BUDGET = 512 * 1024 * 1024;
31
+ /**
32
+ * 估算解码后位图占用的内存(RGBA,4 字节/像素)。
33
+ *
34
+ * 一个 4000×3000 的 JPEG,blob 可能只有 2MB,但 decode 成 ImageBitmap 后
35
+ * 占 4000*3000*4 ≈ 46MB。追踪中间结果时应以此为准而非 blob.size,
36
+ * 否则严重低估内存压力。
37
+ */
38
+ export function estimateDecodedBytes(width, height) {
39
+ return Math.max(0, Math.round(width * height * 4));
40
+ }
41
+ /** 估算 Blob 在内存中占用的字节数(对未解码的 Blob,以其 size 为准) */
42
+ export function estimateBlobBytes(blob) {
43
+ return blob.size;
44
+ }
45
+ /** 内存守卫:追踪中间结果占用 + 触发 OPFS 溢出 */
46
+ export class MemoryGuard {
47
+ tracked = 0;
48
+ budget;
49
+ elevatedRatio;
50
+ highRatio;
51
+ criticalRatio;
52
+ assetStore;
53
+ constructor(opts = {}) {
54
+ this.budget = opts.budget ?? DEFAULT_MEMORY_BUDGET;
55
+ this.elevatedRatio = opts.elevatedRatio ?? 0.6;
56
+ this.highRatio = opts.highRatio ?? 0.8;
57
+ this.criticalRatio = opts.criticalRatio ?? 0.95;
58
+ this.assetStore = opts.assetStore;
59
+ // 阈值单调性校验,避免配置错误导致 pressure 永远卡在某一档
60
+ if (!(this.elevatedRatio <= this.highRatio && this.highRatio <= this.criticalRatio)) {
61
+ throw new Error(`MemoryGuard thresholds must be non-decreasing: ` +
62
+ `elevated(${this.elevatedRatio}) <= high(${this.highRatio}) <= critical(${this.criticalRatio})`);
63
+ }
64
+ }
65
+ /** 当前已登记的字节数 */
66
+ get currentUsage() {
67
+ return this.tracked;
68
+ }
69
+ /** 总预算(字节) */
70
+ get budgetBytes() {
71
+ return this.budget;
72
+ }
73
+ /** 当前是否已配置可溢出的 AssetStore */
74
+ get canSpill() {
75
+ return this.assetStore !== undefined;
76
+ }
77
+ /**
78
+ * 登记一笔内存占用。返回 release 句柄,丢弃引用时调用以回退计数。
79
+ * 用于追踪 decode 结果 / canvas 输出等大对象的生命周期。
80
+ */
81
+ track(bytes) {
82
+ if (bytes < 0) {
83
+ throw new Error(`MemoryGuard.track: bytes must be non-negative, got ${bytes}`);
84
+ }
85
+ this.tracked += bytes;
86
+ let released = false;
87
+ return {
88
+ bytes,
89
+ release: () => {
90
+ if (released)
91
+ return; // 幂等:重复 release 仅首次生效
92
+ released = true;
93
+ this.tracked = Math.max(0, this.tracked - bytes);
94
+ },
95
+ };
96
+ }
97
+ /** 当前压力等级(基于 tracked / budget) */
98
+ getPressure() {
99
+ const ratio = this.tracked / this.budget;
100
+ if (ratio >= this.criticalRatio)
101
+ return 'critical';
102
+ if (ratio >= this.highRatio)
103
+ return 'high';
104
+ if (ratio >= this.elevatedRatio)
105
+ return 'elevated';
106
+ return 'low';
107
+ }
108
+ /** 已用比例(0-1+) */
109
+ getUsageRatio() {
110
+ return this.tracked / this.budget;
111
+ }
112
+ /**
113
+ * 是否应溢出(pressure >= high)。无 assetStore 时永远 false(无法溢出,
114
+ * 交由降级阶梯 L3/L4 处理)。
115
+ */
116
+ shouldSpill() {
117
+ if (!this.assetStore)
118
+ return false;
119
+ const p = this.getPressure();
120
+ return p === 'high' || p === 'critical';
121
+ }
122
+ /**
123
+ * 把一个中间 Blob 溢出到 OPFS(assetStore.create),返回 Asset 句柄。
124
+ * 调用方应在 spill 后丢弃内存中的 Blob 引用,以真正释放内存。
125
+ *
126
+ * @param blob 要溢出的中间结果
127
+ * @param mimeType Blob 的 MIME(用于元数据);默认取 blob.type
128
+ * @param assetType 资产类型(默认 'image');video/pdf 管线可传对应类型
129
+ */
130
+ async spill(blob, mimeType, assetType = 'image') {
131
+ if (!this.assetStore) {
132
+ throw new Error('MemoryGuard.spill requires an assetStore (OPFS-backed). ' +
133
+ 'Construct MemoryGuard with { assetStore } to enable spilling.');
134
+ }
135
+ const mime = mimeType || blob.type || 'application/octet-stream';
136
+ const metadata = {
137
+ mimeType: mime,
138
+ size: blob.size,
139
+ format: mime.split('/')[1] ?? 'bin',
140
+ };
141
+ return this.assetStore.create(blob, metadata, assetType);
142
+ }
143
+ /** 从 OPFS 读回之前 spill 的中间结果 */
144
+ async restore(asset) {
145
+ if (!this.assetStore) {
146
+ throw new Error('MemoryGuard.restore requires an assetStore');
147
+ }
148
+ return this.assetStore.getBlob(asset.blob);
149
+ }
150
+ /** 丢弃已 spill 的中间结果(处理完成后回收 OPFS 空间) */
151
+ async evict(asset) {
152
+ if (!this.assetStore)
153
+ return;
154
+ await this.assetStore.remove(asset.id);
155
+ }
156
+ /** 重置所有登记(用于工作流结束 / 取消后的清理,tracked 归零) */
157
+ reset() {
158
+ this.tracked = 0;
159
+ }
160
+ }
161
+ //# sourceMappingURL=memory-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-guard.js","sourceRoot":"","sources":["../src/memory-guard.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,15 @@
1
1
  /**
2
2
  * OPFS Asset Store
3
3
  *
4
- * 大文件(blob)存 OPFS(Origin Private File System),元数据存内存 Map
5
- * OPFS 是浏览器私有文件系统,blob 持久化(刷新后文件仍在),但元数据仅在内存 ——
6
- * 刷新后 list() 会返回空、get(id) 返回 undefined(除非元数据由上层持久化)。
7
- * 完整元数据持久化建议叠加 IdbAssetStore 或在 W3 补强。
4
+ * 大文件(blob)存 OPFS(Origin Private File System),元数据存内存 Map +
5
+ * IndexedDB(Dexie)持久化。OPFS 是浏览器私有文件系统,blob 持久化(刷新后
6
+ * 文件仍在);W6.6 起元数据也通过 Dexie 持久化,刷新后 list()/get() 能恢复。
7
+ *
8
+ * 持久化策略(W6.6):
9
+ * - 启动时:db.metadata.toArray() 预加载内存 Map(后续 get/list 零 IO)
10
+ * - import/create:写 OPFS 文件 + db.metadata.put + 内存 Map.set
11
+ * - remove:删 OPFS 文件 + db.metadata.delete + 内存 Map.delete
12
+ * - IndexedDB 不可用时降级为仅内存模式(刷新后丢失,与 W2 行为一致)
8
13
  *
9
14
  * 注:任务规格提及 FileSystemSyncAccessHandle(Worker 内同步句柄),
10
15
  * 但 AssetStore 接口本身为 async,主线程仅可使用 FileSystemFileHandle 异步 API,
@@ -12,6 +17,8 @@
12
17
  *
13
18
  * 降级链(W2.8 工厂):OPFS → IndexedDB → Memory
14
19
  */
20
+ import Dexie, { type Table } from 'dexie';
21
+ import type { Asset, AssetId } from '@lokvis/schema';
15
22
  import type { AssetStore } from './asset-store.js';
16
23
  /** OPFS 不可用或初始化失败时抛出 */
17
24
  export declare class OpfsUnavailableError extends Error {
@@ -19,6 +26,23 @@ export declare class OpfsUnavailableError extends Error {
19
26
  }
20
27
  /** OPFS 文件存储路径前缀(出现在 BlobHandle.path 中) */
21
28
  export declare const OPFS_PATH_PREFIX = "opfs";
29
+ /**
30
+ * OPFS 元数据持久化数据库(W6.6)。
31
+ *
32
+ * 仅存 { id, asset }(不含 blob,blob 在 OPFS 文件里),用于刷新后恢复内存 Map。
33
+ * 数据库名独立于 IdbAssetStore 的 'lokvis-assets',避免与全持久化 store 冲突。
34
+ */
35
+ export declare class OpfsMetadataDatabase extends Dexie {
36
+ metadata: Table<OpfsMetadataRecord, AssetId>;
37
+ constructor(name?: string);
38
+ }
39
+ /** OPFS 元数据记录 */
40
+ export interface OpfsMetadataRecord {
41
+ /** 主键 = Asset.id */
42
+ id: AssetId;
43
+ /** 资产元数据(blob 在 OPFS 文件,不在此存) */
44
+ asset: Asset;
45
+ }
22
46
  /** OPFS AssetStore 配置 */
23
47
  export interface OpfsAssetStoreOptions {
24
48
  /** OPFS 根目录下的命名空间目录名(默认 'lokvis') */
@@ -30,6 +54,13 @@ export interface OpfsAssetStoreOptions {
30
54
  * 默认使用 navigator.storage.getDirectory()。
31
55
  */
32
56
  rootHandle?: FileSystemDirectoryHandle;
57
+ /**
58
+ * 测试注入:自定义元数据库实例(W6.6 持久化)。
59
+ * 默认在 IndexedDB 可用时自动创建 OpfsMetadataDatabase。
60
+ */
61
+ metadataDb?: OpfsMetadataDatabase;
62
+ /** 元数据库名(默认 'lokvis-opfs-metadata';仅 metadataDb 未注入时生效) */
63
+ metadataDbName?: string;
33
64
  }
34
65
  /** 检测当前环境是否支持 OPFS */
35
66
  export declare function isOpfsSupported(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"opfs-asset-store.d.ts","sourceRoot":"","sources":["../src/opfs-asset-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAQnD,wBAAwB;AACxB,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,SAAS,CAAC;AAKvC,yBAAyB;AACzB,MAAM,WAAW,qBAAqB;IACpC,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,UAAU,CAAC,EAAE,yBAAyB,CAAC;CACxC;AAED,sBAAsB;AACtB,wBAAgB,eAAe,IAAI,OAAO,CAMzC;AA0CD,2BAA2B;AAC3B,wBAAsB,oBAAoB,CACxC,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,UAAU,CAAC,CA+DrB"}
1
+ {"version":3,"file":"opfs-asset-store.d.ts","sourceRoot":"","sources":["../src/opfs-asset-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,EAAE,KAAK,KAAK,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AASnD,wBAAwB;AACxB,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,SAAS,CAAC;AAKvC;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,EAAG,KAAK,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;gBAElC,IAAI,SAAyB;CAM1C;AAED,iBAAiB;AACjB,MAAM,WAAW,kBAAkB;IACjC,oBAAoB;IACpB,EAAE,EAAE,OAAO,CAAC;IACZ,iCAAiC;IACjC,KAAK,EAAE,KAAK,CAAC;CACd;AAED,yBAAyB;AACzB,MAAM,WAAW,qBAAqB;IACpC,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,UAAU,CAAC,EAAE,yBAAyB,CAAC;IACvC;;;OAGG;IACH,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,sBAAsB;AACtB,wBAAgB,eAAe,IAAI,OAAO,CAMzC;AAwFD,2BAA2B;AAC3B,wBAAsB,oBAAoB,CACxC,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,UAAU,CAAC,CAsFrB"}
@@ -1,10 +1,15 @@
1
1
  /**
2
2
  * OPFS Asset Store
3
3
  *
4
- * 大文件(blob)存 OPFS(Origin Private File System),元数据存内存 Map
5
- * OPFS 是浏览器私有文件系统,blob 持久化(刷新后文件仍在),但元数据仅在内存 ——
6
- * 刷新后 list() 会返回空、get(id) 返回 undefined(除非元数据由上层持久化)。
7
- * 完整元数据持久化建议叠加 IdbAssetStore 或在 W3 补强。
4
+ * 大文件(blob)存 OPFS(Origin Private File System),元数据存内存 Map +
5
+ * IndexedDB(Dexie)持久化。OPFS 是浏览器私有文件系统,blob 持久化(刷新后
6
+ * 文件仍在);W6.6 起元数据也通过 Dexie 持久化,刷新后 list()/get() 能恢复。
7
+ *
8
+ * 持久化策略(W6.6):
9
+ * - 启动时:db.metadata.toArray() 预加载内存 Map(后续 get/list 零 IO)
10
+ * - import/create:写 OPFS 文件 + db.metadata.put + 内存 Map.set
11
+ * - remove:删 OPFS 文件 + db.metadata.delete + 内存 Map.delete
12
+ * - IndexedDB 不可用时降级为仅内存模式(刷新后丢失,与 W2 行为一致)
8
13
  *
9
14
  * 注:任务规格提及 FileSystemSyncAccessHandle(Worker 内同步句柄),
10
15
  * 但 AssetStore 接口本身为 async,主线程仅可使用 FileSystemFileHandle 异步 API,
@@ -12,7 +17,9 @@
12
17
  *
13
18
  * 降级链(W2.8 工厂):OPFS → IndexedDB → Memory
14
19
  */
20
+ import Dexie, {} from 'dexie';
15
21
  import { buildAsset, generateId, parseBlobPath, prepareImport, } from './asset-store.js';
22
+ import { isIdbSupported } from './idb-asset-store.js';
16
23
  /** OPFS 不可用或初始化失败时抛出 */
17
24
  export class OpfsUnavailableError extends Error {
18
25
  constructor(message) {
@@ -24,6 +31,21 @@ export class OpfsUnavailableError extends Error {
24
31
  export const OPFS_PATH_PREFIX = 'opfs';
25
32
  /** OPFS 文件名后缀 */
26
33
  const OPFS_FILE_SUFFIX = '.bin';
34
+ /**
35
+ * OPFS 元数据持久化数据库(W6.6)。
36
+ *
37
+ * 仅存 { id, asset }(不含 blob,blob 在 OPFS 文件里),用于刷新后恢复内存 Map。
38
+ * 数据库名独立于 IdbAssetStore 的 'lokvis-assets',避免与全持久化 store 冲突。
39
+ */
40
+ export class OpfsMetadataDatabase extends Dexie {
41
+ metadata;
42
+ constructor(name = 'lokvis-opfs-metadata') {
43
+ super(name);
44
+ this.version(1).stores({
45
+ metadata: 'id',
46
+ });
47
+ }
48
+ }
27
49
  /** 检测当前环境是否支持 OPFS */
28
50
  export function isOpfsSupported() {
29
51
  return (typeof navigator !== 'undefined' &&
@@ -59,22 +81,77 @@ async function writeOpfsFile(dir, fileName, blob) {
59
81
  }
60
82
  return fileHandle;
61
83
  }
84
+ /**
85
+ * 初始化元数据库(W6.6)。
86
+ *
87
+ * 优先用 options.metadataDb(测试注入);否则在 IndexedDB 可用时创建新实例。
88
+ * IndexedDB 不可用时返回 undefined,调用方降级为仅内存模式。
89
+ */
90
+ function resolveMetadataDb(options) {
91
+ if (options.metadataDb)
92
+ return options.metadataDb;
93
+ if (!isIdbSupported())
94
+ return undefined;
95
+ try {
96
+ return new OpfsMetadataDatabase(options.metadataDbName);
97
+ }
98
+ catch (err) {
99
+ console.warn('[lokvis] OPFS metadata db init failed, falling back to memory-only:', err);
100
+ return undefined;
101
+ }
102
+ }
103
+ /** 安全写入元数据库(失败仅 warn,不阻断主流程) */
104
+ async function persistMetadata(db, id, asset) {
105
+ if (!db)
106
+ return;
107
+ try {
108
+ await db.metadata.put({ id, asset });
109
+ }
110
+ catch (err) {
111
+ console.warn(`[lokvis] OPFS metadata persist failed for ${id}:`, err);
112
+ }
113
+ }
114
+ /** 安全删除元数据(失败仅 warn) */
115
+ async function deleteMetadata(db, id) {
116
+ if (!db)
117
+ return;
118
+ try {
119
+ await db.metadata.delete(id);
120
+ }
121
+ catch (err) {
122
+ console.warn(`[lokvis] OPFS metadata delete failed for ${id}:`, err);
123
+ }
124
+ }
62
125
  /** 创建 OPFS 版 AssetStore */
63
126
  export async function createOpfsAssetStore(options = {}) {
64
127
  const assetsDir = await resolveAssetsDir(options);
65
- /** 元数据缓存(内存中;持久化由 IdbAssetStore 负责) */
128
+ /** 元数据缓存(内存中;W6.6 起启动时从 Dexie 预加载) */
66
129
  const assets = new Map();
67
- /** id → 文件句柄(用于 getBlob/remove) */
130
+ /** id → 文件句柄(用于 getBlob/remove;刷新后丢失,按需重建) */
68
131
  const fileHandles = new Map();
132
+ /** 元数据库(W6.6 持久化;undefined 时仅内存模式) */
133
+ const db = resolveMetadataDb(options);
134
+ // 启动时预加载已持久化的元数据(刷新后恢复 list/get)
135
+ if (db) {
136
+ try {
137
+ const records = await db.metadata.toArray();
138
+ for (const r of records)
139
+ assets.set(r.id, r.asset);
140
+ }
141
+ catch (err) {
142
+ console.warn('[lokvis] OPFS metadata preload failed:', err);
143
+ }
144
+ }
69
145
  /** 从 id 派生 OPFS 文件名 */
70
146
  const fileName = (id) => `${id}${OPFS_FILE_SUFFIX}`;
71
147
  return {
72
148
  async import(source) {
73
- const { id, blob, metadata, type } = prepareImport(source);
149
+ const { id, blob, metadata, type } = await prepareImport(source);
74
150
  const handle = await writeOpfsFile(assetsDir, fileName(id), blob);
75
151
  fileHandles.set(id, handle);
76
152
  const asset = buildAsset(id, blob, metadata, type, OPFS_PATH_PREFIX);
77
153
  assets.set(id, asset);
154
+ await persistMetadata(db, id, asset);
78
155
  return asset;
79
156
  },
80
157
  async get(id) {
@@ -84,7 +161,7 @@ export async function createOpfsAssetStore(options = {}) {
84
161
  const id = parseBlobPath(handle.path, OPFS_PATH_PREFIX);
85
162
  let fileHandle = fileHandles.get(id);
86
163
  if (!fileHandle) {
87
- // 可能是进程重启后元数据丢失但句柄仍可恢复
164
+ // 可能是进程重启后内存句柄丢失,从 OPFS 重新获取
88
165
  try {
89
166
  fileHandle = await assetsDir.getFileHandle(fileName(id));
90
167
  fileHandles.set(id, fileHandle);
@@ -102,9 +179,15 @@ export async function createOpfsAssetStore(options = {}) {
102
179
  try {
103
180
  await assetsDir.removeEntry(fileName(id));
104
181
  }
105
- catch {
106
- // 文件不存在视为已删除,静默忽略
182
+ catch (err) {
183
+ // NotFoundError 是幂等删除的预期场景(文件已不存在),静默忽略;
184
+ // 其他错误(权限/IO 等)记录 warn,便于排查孤儿 OPFS 文件长期累积
185
+ // 无论文件删除是否成功,都继续清理 IDB metadata(见下方)
186
+ if (!(err instanceof DOMException && err.name === 'NotFoundError')) {
187
+ console.warn(`[lokvis] OPFS removeEntry unexpected failure for asset ${id}:`, err);
188
+ }
107
189
  }
190
+ await deleteMetadata(db, id);
108
191
  },
109
192
  async list() {
110
193
  return Array.from(assets.values());
@@ -115,6 +198,7 @@ export async function createOpfsAssetStore(options = {}) {
115
198
  fileHandles.set(id, handle);
116
199
  const asset = buildAsset(id, blob, metadata, type, OPFS_PATH_PREFIX);
117
200
  assets.set(id, asset);
201
+ await persistMetadata(db, id, asset);
118
202
  return asset;
119
203
  },
120
204
  };