@cmtlyt/lingshu-toolkit 0.6.0 → 0.7.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 (90) hide show
  1. package/dist/665.js +1 -1
  2. package/dist/shared/index.d.ts +1 -0
  3. package/dist/shared/index.js +1 -1
  4. package/dist/shared/lock-data/__test__/_helpers/memory-adapters.d.ts +95 -0
  5. package/dist/shared/lock-data/__test__/_helpers/memory-adapters.js +1 -0
  6. package/dist/shared/lock-data/__test__/index.test-d.d.ts +1 -0
  7. package/dist/shared/lock-data/__test__/integration/entry.test-d.d.ts +1 -0
  8. package/dist/shared/lock-data/__test__/playground.d.ts +1 -0
  9. package/dist/shared/lock-data/__test__/playground.js +1 -0
  10. package/dist/shared/lock-data/adapters/authority.d.ts +40 -0
  11. package/dist/shared/lock-data/adapters/authority.js +1 -0
  12. package/dist/shared/lock-data/adapters/channel.d.ts +39 -0
  13. package/dist/shared/lock-data/adapters/channel.js +1 -0
  14. package/dist/shared/lock-data/adapters/index.d.ts +58 -0
  15. package/dist/shared/lock-data/adapters/index.js +1 -0
  16. package/dist/shared/lock-data/adapters/logger.d.ts +56 -0
  17. package/dist/shared/lock-data/adapters/logger.js +1 -0
  18. package/dist/shared/lock-data/adapters/session-store.d.ts +37 -0
  19. package/dist/shared/lock-data/adapters/session-store.js +1 -0
  20. package/dist/shared/lock-data/authority/epoch.d.ts +135 -0
  21. package/dist/shared/lock-data/authority/epoch.js +1 -0
  22. package/dist/shared/lock-data/authority/extract.d.ts +107 -0
  23. package/dist/shared/lock-data/authority/extract.js +1 -0
  24. package/dist/shared/lock-data/authority/index.d.ts +182 -0
  25. package/dist/shared/lock-data/authority/index.js +1 -0
  26. package/dist/shared/lock-data/authority/serialize.d.ts +35 -0
  27. package/dist/shared/lock-data/authority/serialize.js +1 -0
  28. package/dist/shared/lock-data/constants.d.ts +46 -0
  29. package/dist/shared/lock-data/constants.js +1 -0
  30. package/dist/shared/lock-data/core/actions-helpers.d.ts +163 -0
  31. package/dist/shared/lock-data/core/actions-helpers.js +1 -0
  32. package/dist/shared/lock-data/core/actions.d.ts +72 -0
  33. package/dist/shared/lock-data/core/actions.js +1 -0
  34. package/dist/shared/lock-data/core/draft.d.ts +64 -0
  35. package/dist/shared/lock-data/core/draft.js +1 -0
  36. package/dist/shared/lock-data/core/entry.d.ts +133 -0
  37. package/dist/shared/lock-data/core/entry.js +1 -0
  38. package/dist/shared/lock-data/core/fanout.d.ts +42 -0
  39. package/dist/shared/lock-data/core/fanout.js +1 -0
  40. package/dist/shared/lock-data/core/readonly-view.d.ts +49 -0
  41. package/dist/shared/lock-data/core/readonly-view.js +1 -0
  42. package/dist/shared/lock-data/core/registry.d.ts +282 -0
  43. package/dist/shared/lock-data/core/registry.js +1 -0
  44. package/dist/shared/lock-data/core/signal.d.ts +33 -0
  45. package/dist/shared/lock-data/core/signal.js +1 -0
  46. package/dist/shared/lock-data/drivers/broadcast-protocol.d.ts +71 -0
  47. package/dist/shared/lock-data/drivers/broadcast-protocol.js +1 -0
  48. package/dist/shared/lock-data/drivers/broadcast-state.d.ts +125 -0
  49. package/dist/shared/lock-data/drivers/broadcast-state.js +1 -0
  50. package/dist/shared/lock-data/drivers/broadcast.d.ts +36 -0
  51. package/dist/shared/lock-data/drivers/broadcast.js +1 -0
  52. package/dist/shared/lock-data/drivers/custom.d.ts +27 -0
  53. package/dist/shared/lock-data/drivers/custom.js +1 -0
  54. package/dist/shared/lock-data/drivers/index.d.ts +59 -0
  55. package/dist/shared/lock-data/drivers/index.js +1 -0
  56. package/dist/shared/lock-data/drivers/local.d.ts +86 -0
  57. package/dist/shared/lock-data/drivers/local.js +1 -0
  58. package/dist/shared/lock-data/drivers/storage-protocol.d.ts +67 -0
  59. package/dist/shared/lock-data/drivers/storage-protocol.js +1 -0
  60. package/dist/shared/lock-data/drivers/storage-state.d.ts +103 -0
  61. package/dist/shared/lock-data/drivers/storage-state.js +1 -0
  62. package/dist/shared/lock-data/drivers/storage.d.ts +71 -0
  63. package/dist/shared/lock-data/drivers/storage.js +1 -0
  64. package/dist/shared/lock-data/drivers/types.d.ts +73 -0
  65. package/dist/shared/lock-data/drivers/types.js +0 -0
  66. package/dist/shared/lock-data/drivers/web-locks.d.ts +123 -0
  67. package/dist/shared/lock-data/drivers/web-locks.js +1 -0
  68. package/dist/shared/lock-data/errors/index.d.ts +12 -0
  69. package/dist/shared/lock-data/errors/index.js +1 -0
  70. package/dist/shared/lock-data/errors/invalid-options-error.d.ts +11 -0
  71. package/dist/shared/lock-data/errors/invalid-options-error.js +1 -0
  72. package/dist/shared/lock-data/errors/lock-aborted-error.d.ts +10 -0
  73. package/dist/shared/lock-data/errors/lock-aborted-error.js +1 -0
  74. package/dist/shared/lock-data/errors/lock-disposed-error.d.ts +14 -0
  75. package/dist/shared/lock-data/errors/lock-disposed-error.js +1 -0
  76. package/dist/shared/lock-data/errors/lock-revoked-error.d.ts +10 -0
  77. package/dist/shared/lock-data/errors/lock-revoked-error.js +1 -0
  78. package/dist/shared/lock-data/errors/lock-timeout-error.d.ts +9 -0
  79. package/dist/shared/lock-data/errors/lock-timeout-error.js +1 -0
  80. package/dist/shared/lock-data/errors/readonly-mutation-error.d.ts +11 -0
  81. package/dist/shared/lock-data/errors/readonly-mutation-error.js +1 -0
  82. package/dist/shared/lock-data/index.d.ts +57 -0
  83. package/dist/shared/lock-data/index.js +1 -0
  84. package/dist/shared/lock-data/types.d.ts +347 -0
  85. package/dist/shared/lock-data/types.js +0 -0
  86. package/dist/shared/lock-data/utils/json-safe.d.ts +69 -0
  87. package/dist/shared/lock-data/utils/json-safe.js +1 -0
  88. package/dist/shared/throw-error/index.d.ts +10 -3
  89. package/dist/shared/throw-error/index.js +1 -1
  90. package/package.json +2 -2
package/dist/665.js CHANGED
@@ -1 +1 @@
1
- function r(n,t,e=Error){return new e(`[@cmtlyt/lingshu-toolkit#${n}]: ${t}`)}function n(t,e,o=Error){throw r(t,e,o)}function t(r,t){n(r,t,TypeError)}function e(r){return"symbol"==typeof r}function o(r){return void 0===r}function i(r){return null===r}function u(r){return i(r)||o(r)}function s(r){return Number.isNaN(r)}function l(r){return e(r)&&o(Symbol.keyFor(r))}function a(r){return"object"==typeof r&&!i(r)}function f(r){return a(r)&&!c(r)}function c(r){return Array.isArray(r)}function y(r){return c(r)&&0===r.length}function d(r){return"string"==typeof r}function m(r){return d(r)&&0===r.length}function b(r){return"number"==typeof r}function g(r){return b(r)&&!s(r)}function h(r){return d(r)||b(r)||e(r)}function p(r){return"boolean"==typeof r}function N(r){return!0===r||d(r)&&"true"===r.toLowerCase()}function E(r){return!1===r||d(r)&&"false"===r.toLowerCase()}function w(r){return!!r}function $(r){return!(s(r)||r)}function v(r){return"function"==typeof r}function S(r){return(a(r)||v(r))&&v(r.then)}let T=new Proxy(console,{get(r,n,t){if((globalThis.$$lingshu$$||{}).disableLogger)return()=>void 0;let e=Reflect.get(r,n,t).bind(console);return(r,...n)=>{e(`[@cmtlyt/lingshu-toolkit#${r}]:`,...n)}}}),K=()=>void 0,j=r=>r;function A(r){return Object.prototype.toString.call(r).slice(8,-1).toLowerCase()}function P(r,n){return t=>(e,o)=>{if(n?n(e):A(e)===r)return!0;if(u(t))return!1;let i=t;"function"==typeof t&&(i=t(e)),o.transform(i)}}let L={notNullable:P("notNullable",r=>!u(r)),string:P("string"),validString:P("validString",r=>"string"==typeof r&&r.length>0),number:P("number"),validNumber:P("validNumber",r=>"number"==typeof r&&!Number.isNaN(r)),boolean:P("boolean"),object:P("object"),array:P("array"),function:P("function"),symbol:P("symbol"),enum:(r,n)=>{Array.isArray(r)||t("$t.enum","list must be an array");let e=new Set(r);return P("enum",r=>e.has(r))(n)}};function k(r){let n={},t=Reflect.ownKeys(r);for(let e=0,o=t[e],i=r[o];e<t.length;i=r[o=t[++e]]){if("function"==typeof i){n[o]=i;continue}let r=L[i];if(!r){T.warn("defineTransform",`${i} is not a valid type`);continue}n[o]=r()}return n}function F(r,n,e){let o,i;n||t("dataHandler","handler is required");let{strict:u=!1,errorHandler:s,defaultValue:l,unwrap:a=!1}=e||{},f="function"==typeof n,c=f?n:(r,t,...e)=>n[t](r,...e),d={...l,...r},m=f?Reflect.ownKeys(r):Reflect.ownKeys(n),[b,g,h]=(o={errors:[],transforms:[],handledErrorKeys:new Set},i={addError(r,n=`${String(r)} is not valid`){o.handledErrorKeys.has(r)||(o.handledErrorKeys.add(r),o.errors.push(n))},addTransform(r,n){o.transforms.push([r,n])}},[o,i,r=>({assert:(n,t=`${String(r)} is not valid`)=>(n||i.addError(r,t),n),transform:n=>(o.handledErrorKeys.has(r)||i.addTransform(r,n),n)})]);for(let r=0,n=m[r];r<m.length;n=m[++r])!1===c(d[n],n,h(n),d)&&g.addError(n);p=b.errors,!y(p)&&(s?s(p):u&&t("dataHandler",p.join("\n")));var p,N=b.transforms;if(!y(N))for(let r=0,[n,t]=N[r];r<N.length;[n,t]=N[++r]||[])d[n]=t;return!function(r,n,t={}){n.handledErrorKeys.forEach(n=>{r[n]=t[n]})}(d,b,l),a?d:{result:d,errors:b.errors}}export{L as $t,r as createError,F as dataHandler,k as $dt,A as getType,j as identity,c as isArray,p as isBoolean,y as isEmptyArray,m as isEmptyString,E as isFalse,$ as isFalsy,v as isFunction,i as isNull,u as isNullOrUndef,b as isNumber,a as isObject,g as isPlainNumber,f as isPlainObject,l as isPlainSymbol,S as isPromiseLike,h as isPropertyKey,d as isString,e as isSymbol,N as isTrue,w as isTruthy,o as isUndef,T as logger,K as noop,n as throwError,t as throwType,s as isNaN};
1
+ function r(n,t,e=Error,o){let i="function"==typeof e,u=i?e:Error,s=i?o:e,a=`[@cmtlyt/lingshu-toolkit#${n}]: ${t}`;return s&&"cause"in s?new u(a,{cause:s.cause}):new u(a)}function n(t,e,o=Error,i){throw r(t,e,o,i)}function t(r,t,e){n(r,t,TypeError,e)}function e(r){return"symbol"==typeof r}function o(r){return void 0===r}function i(r){return null===r}function u(r){return i(r)||o(r)}function s(r){return Number.isNaN(r)}function a(r){return e(r)&&o(Symbol.keyFor(r))}function l(r){return"object"==typeof r&&!i(r)}function f(r){return l(r)&&!c(r)}function c(r){return Array.isArray(r)}function y(r){return c(r)&&0===r.length}function d(r){return"string"==typeof r}function m(r){return d(r)&&0===r.length}function b(r){return"number"==typeof r}function g(r){return b(r)&&!s(r)}function h(r){return d(r)||b(r)||e(r)}function p(r){return"boolean"==typeof r}function N(r){return!0===r||d(r)&&"true"===r.toLowerCase()}function E(r){return!1===r||d(r)&&"false"===r.toLowerCase()}function w(r){return!!r}function $(r){return!(s(r)||r)}function v(r){return"function"==typeof r}function S(r){return(l(r)||v(r))&&v(r.then)}let T=new Proxy(console,{get(r,n,t){if((globalThis.$$lingshu$$||{}).disableLogger)return()=>void 0;let e=Reflect.get(r,n,t).bind(console);return(r,...n)=>{e(`[@cmtlyt/lingshu-toolkit#${r}]:`,...n)}}}),K=()=>void 0,j=r=>r;function A(r){return Object.prototype.toString.call(r).slice(8,-1).toLowerCase()}function P(r,n){return t=>(e,o)=>{if(n?n(e):A(e)===r)return!0;if(u(t))return!1;let i=t;"function"==typeof t&&(i=t(e)),o.transform(i)}}let L={notNullable:P("notNullable",r=>!u(r)),string:P("string"),validString:P("validString",r=>"string"==typeof r&&r.length>0),number:P("number"),validNumber:P("validNumber",r=>"number"==typeof r&&!Number.isNaN(r)),boolean:P("boolean"),object:P("object"),array:P("array"),function:P("function"),symbol:P("symbol"),enum:(r,n)=>{Array.isArray(r)||t("$t.enum","list must be an array");let e=new Set(r);return P("enum",r=>e.has(r))(n)}};function k(r){let n={},t=Reflect.ownKeys(r);for(let e=0,o=t[e],i=r[o];e<t.length;i=r[o=t[++e]]){if("function"==typeof i){n[o]=i;continue}let r=L[i];if(!r){T.warn("defineTransform",`${i} is not a valid type`);continue}n[o]=r()}return n}function F(r,n,e){let o,i;n||t("dataHandler","handler is required");let{strict:u=!1,errorHandler:s,defaultValue:a,unwrap:l=!1}=e||{},f="function"==typeof n,c=f?n:(r,t,...e)=>n[t](r,...e),d={...a,...r},m=f?Reflect.ownKeys(r):Reflect.ownKeys(n),[b,g,h]=(o={errors:[],transforms:[],handledErrorKeys:new Set},i={addError(r,n=`${String(r)} is not valid`){o.handledErrorKeys.has(r)||(o.handledErrorKeys.add(r),o.errors.push(n))},addTransform(r,n){o.transforms.push([r,n])}},[o,i,r=>({assert:(n,t=`${String(r)} is not valid`)=>(n||i.addError(r,t),n),transform:n=>(o.handledErrorKeys.has(r)||i.addTransform(r,n),n)})]);for(let r=0,n=m[r];r<m.length;n=m[++r])!1===c(d[n],n,h(n),d)&&g.addError(n);p=b.errors,!y(p)&&(s?s(p):u&&t("dataHandler",p.join("\n")));var p,N=b.transforms;if(!y(N))for(let r=0,[n,t]=N[r];r<N.length;[n,t]=N[++r]||[])d[n]=t;return!function(r,n,t={}){n.handledErrorKeys.forEach(n=>{r[n]=t[n]})}(d,b,a),l?d:{result:d,errors:b.errors}}export{L as $t,r as createError,F as dataHandler,k as $dt,A as getType,j as identity,c as isArray,p as isBoolean,y as isEmptyArray,m as isEmptyString,E as isFalse,$ as isFalsy,v as isFunction,i as isNull,u as isNullOrUndef,b as isNumber,l as isObject,g as isPlainNumber,f as isPlainObject,a as isPlainSymbol,S as isPromiseLike,h as isPropertyKey,d as isString,e as isSymbol,N as isTrue,w as isTruthy,o as isUndef,T as logger,K as noop,n as throwError,t as throwType,s as isNaN};
@@ -5,6 +5,7 @@ export * from './condition-merge';
5
5
  export * from './create-storage-handler';
6
6
  export * from './data-handler';
7
7
  export * from './data-mixed-manager';
8
+ export * from './lock-data';
8
9
  export * from './priority-queue';
9
10
  export * from './throw-error';
10
11
  export * from './try-call';
@@ -1 +1 @@
1
- import{isEmptyArray as e,createError as t,isTrue as r,throwType as i,noop as n,isPromiseLike as a,isPlainNumber as l,$dt as s,dataHandler as o,$t as u,isNullOrUndef as h,logger as p,throwError as c,isFunction as d,getType as f,identity as m,isString as y}from"../665.js";function g(){let e;return"function"==typeof Promise.withResolvers?Promise.withResolvers():((e={promise:null,resolve:null,reject:null}).promise=new Promise((t,r)=>{e.resolve=t,e.reject=r}),e)}function x(e,t){e.forEach((r,i)=>{r.delete(t),0===r.size&&e.delete(i)})}let S=s({allSettled:u.boolean(!1)});async function b(e,r){let i,n,l,s=o(r||{},S,{unwrap:!0}),{allSettled:u}=s,p={},c=(i=new Map,n=new Set(Reflect.ownKeys(e)),l=new Map,{taskNameSet:n,createContextFor:e=>new Proxy({},{get(r,a){let o;if(!n.has(a))return Promise.reject(t("allx",`Unknown task "${String(a)}"`));let u=function(e,t,r){if(Reflect.getOwnPropertyDescriptor(e,t)){let i=e[t];return r?"rejected"===i.status?Promise.reject(i.reason):Promise.resolve(i.value):Promise.resolve(i)}}(p,a,s.allSettled);return h(u)?function(e,t,r){let i=new Set,n=[t],a=0;for(;a<n.length;){let t=n[a++];if(t===e)return!0;if(i.has(t))continue;i.add(t);let l=r.get(t);if(l){let e=l.values();for(let t=e.next();!t.done;t=e.next())n.push(t.value)}}return!1}(e,a,l)?Promise.reject(t("allx",`Circular dependency detected: "${String(e)}" -> "${String(a)}"`)):(l.set(e,(l.get(e)||new Set).add(a)),o=i.get(a)||g(),i.set(a,o),o.promise.then(t=>(l.get(e)?.delete(a),t),t=>{throw l.get(e)?.delete(a),t})):u}}),resolveDepFor:(e,t)=>{let r=i.get(e);r&&(r.resolve(t),i.delete(e)),x(l,e)},rejectDepFor:(e,t)=>{let r=i.get(e);r&&(r.reject(t),i.delete(e)),x(l,e)}}),f=r?r.allSettled?(e,t="fulfilled")=>"fulfilled"===t?{status:t,value:e}:{status:t,reason:e}:(e,t="fulfilled")=>e:(e,t="fulfilled")=>e,m=[];return(c.taskNameSet.forEach(async t=>{let r=e[t],i={$:c.createContextFor(t)},n=g();if(n.promise.then(e=>(p[t]=f(e,"fulfilled"),c.resolveDepFor(t,e),e),e=>{u&&(p[t]=f(e,"rejected")),c.rejectDepFor(t,e)}),m.push(n.promise),a(r))return void await r.then(n.resolve,n.reject);if(!d(r))return void n.resolve(r);try{let e=await r.call(i);n.resolve(e)}catch(e){n.reject(e)}}),u)?Promise.allSettled(m).then(()=>p):Promise.all(m).then(()=>p)}function w(e,t,r){let i=f(e),n={progress:0,valueFormatter:r},a=(e,t)=>{let{valueFormatter:r,progress:i}=n;return"number"!==f(e)?e:r(e+(t-e)*i)},l=(e,t)=>Array.from(e,(e,r)=>Array.isArray(e)?l(e,t[r]):"object"===f(e)?s(e,t[r]):a(e,t[r])),s=(e,t)=>{let r={},i=Reflect.ownKeys(e);for(let n=0;n<i.length;n++){let o=i[n],u=e[o],h=t[o];Array.isArray(e[o])?r[o]=l(u,h):"object"===f(u)?r[o]=s(u,h):r[o]=a(u,h)}return r},o=a;return"array"===i?o=l:"object"===i&&(o=s),r=>(n.progress=r,o(e,t))}function D(e,t,r){let n=f(e);if(n!==f(t)&&i("animation/stepAnimation","from and to must be the same type"),"array"===n){e.length!==t.length&&i("animation/stepAnimation","from and to must be the same length");let n=[Array.from({length:e.length}),Array.from({length:t.length})];for(let i=0;i<e.length;i++){let[a,l]=D(e[i],t[i],r);n[0][i]=a,n[1][i]=l}return n}if("object"===n){let n=Reflect.ownKeys(t),a=new Set(Reflect.ownKeys(e)),l=[{},{}];for(let s=0;s<n.length;s++){let o=n[s];a.has(o)||i("animation/stepAnimation",`from does not have this key: ${String(o)}`);let[u,h]=D(e[o],t[o],r);l[0][o]=u,l[1][o]=h}return l}return"number"!==n?[r(e),r(t)]:[e,t]}async function v(e,t,r){return new Promise((t,r)=>{let i=e();if(a(i))return i.then(t,r);t()}).catch(r??t.reject)}let A=s({autoStart:u.boolean(!0),easing:u.function(()=>m),onStart:u.function(()=>n),onStop:u.function(()=>n),onClear:u.function(()=>n),onUpdate:u.function(()=>n),onComplete:u.function(()=>n),formatterValue:u.function(()=>m),formatter:u.function(()=>m),parser:u.function(()=>m)});function*M(e,t,r,i={}){(!Number.isInteger(r)||r<=0)&&c("stepAnimation","step must be a positive integer",RangeError);let{parser:n=m,formatterValue:a=m,formatter:l}=o(i,A,{unwrap:!0}),[s,u]=D(e,t,n),h=w(s,u,a);for(let e=0;e<=r;e++){let t=l(h(e/r));yield t}}function R(e,t,r,i={}){let n;(r<=0||!Number.isInteger(r))&&c("animation","duration must be a positive integer",RangeError);let a=o(i,A,{unwrap:!0}),[l,s]=D(e,t,a.parser),{autoStart:u,easing:h,onComplete:p,onUpdate:d,formatterValue:f,formatter:m}=a,y=w(l,s,f),x=(...e)=>m(y(...e)),S=0,b=!1,M=function(e,t){let{onStart:r,onStop:i,onClear:n}=t,a=g(),l={stopSignal:!0,resolvers:a,stop:()=>{l.stopSignal=!0,i()},start:()=>{l.stopSignal=!1,r(),e()},clear:()=>{l.stopSignal=!0,n(),a.resolve(!0)}};return l}(()=>{let e=performance.now();if(S+=e,C(j)){S-=performance.now();return}b||(d(x(0)),b=!0)},a),{resolvers:P}=M,C=(n="function"==typeof globalThis.requestAnimationFrame?globalThis.requestAnimationFrame:e=>setTimeout(e,16),e=>!!M.stopSignal||(n(()=>v(e,P,e=>{M.stop(),P.reject(e)})),!1)),j=()=>{let e=performance.now()-S;d(x(h(Math.min(e/r,1)))),e<r?C(j)&&(S=-e):(p(),P.resolve(!1))};return!1!==u&&M.start(),{promise:P.promise,stop:M.stop,start:M.start,clear:M.clear}}let P=Symbol("EMPTY");function C(e,t,r){d(e)||i("tryCallFunc","callback is not a function");let n=(e,r,i)=>{if(d(t))try{r.errorResult=Reflect.apply(t,e,[i])}catch(e){r.error=e}else r.error=i;return r.errorResult},l=(e,t,i)=>{try{if(t.error!==P)throw t.error}finally{d(r)&&Reflect.apply(r,e,t.error===P?[i]:[t.error])}};return function(...t){let r={oriResult:P,errorResult:P,error:P},i=(async()=>{try{return r.oriResult=Reflect.apply(e,this,t),r.oriResult}catch(e){return n(this,r,e)}})().catch(e=>n(this,r,e));if(a(r.oriResult))return i.then(e=>(l(this,r,e),e));let s=r.oriResult===P?r.errorResult:r.oriResult;return l(this,r,s),s}}function j(e,t,r){return d(e)||i("tryCall","callback is not a function"),C(e,t,r).call(this)}let F=/^[a-z][a-z\d+\-.]*:/imu;function $(e){return!!e&&F.test(e)}function U(e,t){let r=t?t(e):e;switch(f(r)){case"object":case"array":case"number":case"boolean":case"function":return JSON.stringify(r);default:return r}}function E(e,t,r){return{$:e,$$:r,$$r:t,$updateBaseUrl(e){if($(e))t.baseUrl=e;else{let{origin:r}=globalThis.location||{};r||c("apiController.$updateBaseUrl","location.origin is undefined");let i=(e||"/").startsWith("/")?e||"":`/${e}`;t.baseUrl=`${r}${i}`}}}}function L(e,t=!1){let r=Reflect.ownKeys(e),i=[];for(let t=0;t<r.length;t++){let n=r[t];n.endsWith("Custom")&&i.push(n),y(e[n].url)||i.push(...L(e[n],!0))}return!t&&i.length>0&&p.warn("apiController.createApiWithMap","api 命名不应该使用 Custom 结尾, 因为这是一个内部实现的方法",i),i}async function O(e,t){let{baseUrl:r,url:n,method:a,parser:l,data:s,tdto:o,tvo:u,onResponse:p,...c}=e,f=function(e,t){if($(e))return new URL(e);$(t)||i("apiController.request","baseUrl 配置不合法, 必须是绝对路径");let r=new URL(t),n="/"===r.pathname?"":r.pathname.replace(/\/$/u,""),a=e.startsWith("/")?e:`/${e}`;return new URL(`${n}${a}`,r)}(n,r),m=a?.toUpperCase(),y=j(()=>{if(h(m)||"GET"===m||"HEAD"===m){let e=Object.keys(s||{});for(let t=0;t<e.length;++t)f.searchParams.append(e[t],s[e[t]]);return new Request(f,{...c,method:m})}let e=U(s,o);return new Request(f,{...c,method:m,body:e})}),g=await t(y),x=await j(()=>{if(p)return p(g,e);if(!l)return g.json();if("stream"===l)return g.body;let t=g[l];if(d(t))return Reflect.apply(t,g,[]);i("apiController.responseParser","Invalid parser")});return u?u(x):x}async function _(e){let{onRequest:t,...r}=e;return O(e,async i=>new Response(U(await (t&&t(i,e))),{...r}))}async function k(e){return O(e,fetch)}function T(e){let t=function(e,t){if(!e.includes("/:"))return e;t||i("apiController.parseParams","url 中存在 params 参数, params 配置不能为空, 请使用 custom 方法调用并传递 params 配置");let r=e.split("/"),n=[];for(let e=1;e<r.length;++e){if(":"!==r[e][0])continue;let i=r[e].slice(1),a=t[i];if(!(l(a)||a)){n.push(i);continue}let s=encodeURIComponent(String(a));r[e]=s}return n.length>0&&i("apiController.parseParams",`params 配置中缺少 [${n.join(", ")}] 参数`),r.join("/")}(e.url,e.params),{requestMode:r,requestModeMap:n}=e,a=(n||{})[r||""];return a?a({...e,url:t}):"mock"===r?_({...e,url:t}):k({...e,url:t})}let I=Symbol("fromDefine");function N(e,t){let i=e[I];delete e[I];let n=Object.create(null),a=t||{};r(i)||L(e);let l=E(e,a,t);return new Proxy(e,{get(e,t,r){if(Reflect.getOwnPropertyDescriptor(n,t))return n[t];let{instanceMember:s,api:o,isCustom:u=!1}=function(e,t,r,i){if(Reflect.getOwnPropertyDescriptor(i,t))return{instanceMember:i[t]};let n=y(t)&&Reflect.has(e,t),a=y(t)&&t.endsWith("Custom")&&!n,l=a?t.slice(0,-6):t;if(!Reflect.getOwnPropertyDescriptor(e,l))return;let s=Reflect.get(e,l,r);if(!a||y(s.url))return{api:s,isCustom:a}}(e,t,r,l)||{};if(s)return s;if(!o)return;let h=null;return h=y(o.url)?K({...o,[I]:i},a,u):N({...o,[I]:i},a),n[t]=h,h}})}function K(e,t,n){let a=e[I];delete e[I];let l=t||{};y(e.url)||i("apiController.createApi","入参应为 APIConfig 对象"),e.url.includes("/:")&&(r(a)||p.warn("apiController.createApi","url 中存在 params 参数, 使用 defineApi 或 defineApiMap 定义 API 或 API map 来获取更好的类型提示"),r(n)||i("apiController.createApi","url 中存在 params 参数, 不支持普通请求, 转为自定义请求"));let s=null;s=r(n)?(t,r)=>T({...l,...e,...r,url:e.url,data:t,oriUrl:e.url}):t=>T({...l,...e,data:t,oriUrl:e.url});let o=E(e,l,t);return $(e.url)||o.$updateBaseUrl(l.baseUrl),new Proxy(s,{get:(e,t,r)=>Reflect.getOwnPropertyDescriptor(o,t)?o[t]:Reflect.get(e,t,r)})}function q(e){return{...e,[I]:!0}}function z(e){return L(e),{...e,[I]:!0}}function B(e){return Array.isArray(e)?[]:{}}function H(e){return Array.isArray(e)||"object"==typeof e}function W(...e){let t=(1===e.length&&Array.isArray(e[0])?e[0]:e).map(e=>{let t=null;if(Array.isArray(e)){let[r,i,n]=e;t={condition:r,value:i,fullback:n}}else Object.getOwnPropertyDescriptor(e,"condition")?t=e:i("conditionMerge","input must be an ConditionItem");let r=H(t.value),n=void 0===t.fullback||H(t.fullback);return r&&n||i("conditionMerge","value and fullback must be an array or object"),t}),r=B((t[0]||{}).value),n=Array.isArray(r)?(e,t)=>Reflect.apply(Array.prototype.splice.bind(e,e.length,0),null,t):Object.assign;for(let e=0,i=t[e];e<t.length;i=t[++e])n(r,i.condition?i.value:i.fullback||B(i.value));return r}let Q={fixed:{fixedFlag:Symbol("fixed")},insert:{insertFlag:Symbol("insert")}},J=s({name:u.string("default"),fixedSlots:u.array([]),dataList:u.array([]),listener:u.object({})});class G extends EventTarget{addEventListener(...e){super.addEventListener.apply(this,e)}removeEventListener(...e){super.removeEventListener.apply(this,e)}options;fixedSlots=new Map;dataList=[];mixedData=[];lastMixedSlotIdx=-1;prevDataLength=0;isBatching=!1;constructor(e){super();let t=o(e||{},J,{unwrap:!0}),{fixedSlots:r,dataList:i,listener:n}=t;this.options=t,this.addFixedSlots(r,{lazy:!0}),this.appendList(i);try{this.initListener(n)}catch(e){c("dataMixedManager",e.message,e.constructor)}}initListener(e){let t=Object.keys(e);for(let r=0,i=t[r],n=e[i];r<t.length;n=e[i=t[++r]])this.addEventListener(i,n)}getTypeText(e){switch(e){case Q.fixed:return"fixed";case Q.insert:return"insert"}}buildSlotConfig(e,t){let r=this.getTypeText(e.type||t);return{...e,type:r,inputPosition:e.position,insertMode:e.insertMode??"cover"}}addFixedSlot(e,t){let r=this.reorderFixedSlots(this.buildSlotConfig(e,Q.fixed));return this.fixedSlots.set(r.position,r),this.buildMixedData(t),r.position}reorderFixedSlots(e){let{position:t,insertMode:r}=e;if(h(r)||"cover"===r||!this.fixedSlots.has(t))return{...e,inputPosition:t};let i="after"===r?t+1:t;for(let e=i+1,t=this.fixedSlots.get(e-1),r=this.fixedSlots.get(e);t;++e,t=r,r=this.fixedSlots.get(e))t.position=e,this.fixedSlots.set(e,t);return{...e,position:i,inputPosition:t}}addFixedSlots(t,r){if(e(t))return[];let i=this.batchUpdate(()=>t.map(e=>this.addFixedSlot(e)));return this.buildMixedData(r),i}deleteFixedSlot(e,t){this.fixedSlots.delete(e),this.buildMixedData(t)}deleteFixedSlots(t,r){e(t)||(this.batchUpdate(()=>t.forEach(e=>void this.deleteFixedSlot(e))),this.buildMixedData(r))}batchUpdate(e){try{return this.isBatching=!0,e()}finally{this.isBatching=!1}}clearFixedSlots(e){this.fixedSlots.clear(),this.buildMixedData(e)}appendList(t,r){e(t)||(this.dataList.push(...t),this.buildMixedData({...r,lazy:!0===(r||{}).lazy}))}clearList(){this.dataList.length=0,this.mixedData.length=0,this.dispatch("change",{mode:"clear",mixedData:this.getMixedData({mode:"rebuild"})}),this.dispatch("clear")}getMixedData(e){return this.buildMixedData({...e,lazy:!1}),this.mixedData.slice()}dispatch(e,t){let r={name:this.options.name,...t};this.dispatchEvent(new CustomEvent(e,{detail:r})),void 0!==globalThis.window&&globalThis.window.dispatchEvent(new CustomEvent(`[DMM]:${e}`,{detail:r}))}buildMixedData(e){if(this.isBatching)return;let{lazy:t,mode:r}=e||{};if("rebuild"===r&&(this.prevDataLength=0,this.lastMixedSlotIdx=-1),!1!==t||this.dataList.length<=this.prevDataLength)return;let i=this.prevDataLength,n=this.dataList.length,a=n-i;this.prevDataLength=n;let l=i>0,s=this.sliceSlots(l?this.mixedData.length:this.lastMixedSlotIdx,this.mixedData.length+a);this.lastMixedSlotIdx=s.at(-1)??this.lastMixedSlotIdx;let o=l?this.mixedData.length:0;this.mixedData.length=(l?a+o:n)+s.length;for(let e=0,t=s[e];i<n;++o)if(o===t){let r=this.fixedSlots.get(t);this.mixedData[o]={isFixed:!0,type:r.type,data:r.data},t=s[++e]}else this.mixedData[o]={isFixed:!1,type:"plain",data:this.dataList[i]},++i;this.dispatch("change",{mode:l?"patch":"rebuild",mixedData:this.mixedData.slice()})}sliceSlots(e,t=1/0){let r=-2,i=0;return Array.from(this.fixedSlots.keys()).sort((e,t)=>e-t).filter(n=>(n>=e&&n<t+i||n-1===r)&&(++i,r=n,!0))}insertSlot(e){let t=this.addFixedSlot({...e,type:Q.insert});return t>this.mixedData.length||this.buildMixedData({lazy:!1,mode:"rebuild"}),t}insertSlots(t){if(e(t))return[];let r=this.batchUpdate(()=>t.map(e=>this.insertSlot(e)));return this.buildMixedData({lazy:!1,mode:"rebuild"}),r}}function V(e){return new G(e)}let Y=new Set(["number","string","date"]);function X(e,t){return Y.has(f(e))&&Y.has(f(t))?e<t?-1:+(e>t):(p.warn("PriorityQueue",`Unsupported type: ${f(e)} ${f(t)}`),0)}function Z(e,t,r,i,n){if(e>=r)return t;let a=n(i[e].item,i[t].item);return a<0||0===a&&i[e].insertOrder<i[t].insertOrder?e:t}let ee=s({compare:u.function(()=>X),allowDuplicate:u.boolean(!1)});class et{heap=[];itemSet=new Set;compare;allowDuplicate;insertCounter=0;constructor(e={}){let{compare:t,allowDuplicate:r}=o(e||{},ee,{unwrap:!0});this.compare=t,this.allowDuplicate=r}swapItems(e,t){[this.heap[e],this.heap[t]]=[this.heap[t],this.heap[e]]}heapifyUp(e){let t=e;for(;t>0;){let e=Math.floor((t-1)/2),r=this.heap[t],i=this.heap[e];if(0>this.compare(r.item,i.item))this.swapItems(t,e),t=e;else break}}heapifyDown(e){let t=e,r=this.heap.length;for(;t<r;){let e=2*t+1,i=2*t+2,n=t;if(n=Z(e,n,r,this.heap,this.compare),(n=Z(i,n,r,this.heap,this.compare))===t)break;this.swapItems(t,n),t=n}}isDuplicate(e){return!this.allowDuplicate&&this.itemSet.has(e)}enqueue(e){if(this.isDuplicate(e)){let t=j(()=>"object"==typeof e&&null!==e?JSON.stringify(e):String(e),()=>Object.prototype.toString.call(e));return p.warn("PriorityQueue.enqueue",`Duplicate item detected: ${t}`),!1}let t={item:e,insertOrder:this.insertCounter++};return this.allowDuplicate||this.itemSet.add(e),this.heap.push(t),this.heapifyUp(this.heap.length-1),!0}enqueueMany(e){return e.map(e=>this.enqueue(e))}dequeue(){let e;if(0!==this.heap.length)return 1===this.heap.length?e=this.heap.pop().item:(e=this.heap[0].item,this.heap[0]=this.heap.pop(),this.heapifyDown(0)),this.itemSet.delete(e),e}peek(){if(0!==this.heap.length)return this.heap[0].item}size(){return this.heap.length}isEmpty(){return 0===this.heap.length}clear(){this.heap.length=0,this.itemSet.clear(),this.insertCounter=0}toArray(){let e=[...this.heap];return e.sort((e,t)=>{let r=this.compare(e.item,t.item);return 0!==r?r:e.insertOrder-t.insertOrder}),e.map(e=>e.item)}}function er(e){return new et(e)}Symbol("__PACK__");export{$dt,$dt as defineTransform,$t,createError,dataHandler,getType,identity,isArray,isBoolean,isEmptyArray,isEmptyString,isFalse,isFalsy,isFunction,isNaN,isNull,isNullOrUndef,isNumber,isObject,isPlainNumber,isPlainObject,isPlainSymbol,isPromiseLike,isPropertyKey,isString,isSymbol,isTrue,isTruthy,isUndef,noop,throwError,throwType}from"../665.js";export{createStorageHandler}from"../893.js";export{b as allx,R as animation,W as conditionMerge,K as createApi,N as createApiWithMap,V as dataMixedManager,q as defineApi,z as defineApiMap,er as priorityQueue,T as request,M as stepAnimation,j as tryCall,C as tryCallFunc,g as withResolvers};
1
+ import{isEmptyArray as e,createError as t,isTrue as r,isObject as n,isPlainNumber as o,isPromiseLike as i,isNumber as a,isString as l,dataHandler as s,noop as u,$dt as d,$t as c,isNullOrUndef as h,logger as f,throwError as p,isFunction as g,isArray as m,isBoolean as y,getType as b,identity as k,throwType as v}from"../665.js";function w(){let e;return"function"==typeof Promise.withResolvers?Promise.withResolvers():((e={promise:null,resolve:null,reject:null}).promise=new Promise((t,r)=>{e.resolve=t,e.reject=r}),e)}function $(e,t){e.forEach((r,n)=>{r.delete(t),0===r.size&&e.delete(n)})}let S=d({allSettled:c.boolean(!1)});async function T(e,r){let n,o,a,l=s(r||{},S,{unwrap:!0}),{allSettled:u}=l,d={},c=(n=new Map,o=new Set(Reflect.ownKeys(e)),a=new Map,{taskNameSet:o,createContextFor:e=>new Proxy({},{get(r,i){let s;if(!o.has(i))return Promise.reject(t("allx",`Unknown task "${String(i)}"`));let u=function(e,t,r){if(Reflect.getOwnPropertyDescriptor(e,t)){let n=e[t];return r?"rejected"===n.status?Promise.reject(n.reason):Promise.resolve(n.value):Promise.resolve(n)}}(d,i,l.allSettled);return h(u)?function(e,t,r){let n=new Set,o=[t],i=0;for(;i<o.length;){let t=o[i++];if(t===e)return!0;if(n.has(t))continue;n.add(t);let a=r.get(t);if(a){let e=a.values();for(let t=e.next();!t.done;t=e.next())o.push(t.value)}}return!1}(e,i,a)?Promise.reject(t("allx",`Circular dependency detected: "${String(e)}" -> "${String(i)}"`)):(a.set(e,(a.get(e)||new Set).add(i)),s=n.get(i)||w(),n.set(i,s),s.promise.then(t=>(a.get(e)?.delete(i),t),t=>{throw a.get(e)?.delete(i),t})):u}}),resolveDepFor:(e,t)=>{let r=n.get(e);r&&(r.resolve(t),n.delete(e)),$(a,e)},rejectDepFor:(e,t)=>{let r=n.get(e);r&&(r.reject(t),n.delete(e)),$(a,e)}}),f=r?r.allSettled?(e,t="fulfilled")=>"fulfilled"===t?{status:t,value:e}:{status:t,reason:e}:(e,t="fulfilled")=>e:(e,t="fulfilled")=>e,p=[];return(c.taskNameSet.forEach(async t=>{let r=e[t],n={$:c.createContextFor(t)},o=w();if(o.promise.then(e=>(d[t]=f(e,"fulfilled"),c.resolveDepFor(t,e),e),e=>{u&&(d[t]=f(e,"rejected")),c.rejectDepFor(t,e)}),p.push(o.promise),i(r))return void await r.then(o.resolve,o.reject);if(!g(r))return void o.resolve(r);try{let e=await r.call(n);o.resolve(e)}catch(e){o.reject(e)}}),u)?Promise.allSettled(p).then(()=>d):Promise.all(p).then(()=>d)}function q(e,t,r){let n=b(e),o={progress:0,valueFormatter:r},i=(e,t)=>{let{valueFormatter:r,progress:n}=o;return"number"!==b(e)?e:r(e+(t-e)*n)},a=(e,t)=>Array.from(e,(e,r)=>Array.isArray(e)?a(e,t[r]):"object"===b(e)?l(e,t[r]):i(e,t[r])),l=(e,t)=>{let r={},n=Reflect.ownKeys(e);for(let o=0;o<n.length;o++){let s=n[o],u=e[s],d=t[s];Array.isArray(e[s])?r[s]=a(u,d):"object"===b(u)?r[s]=l(u,d):r[s]=i(u,d)}return r},s=i;return"array"===n?s=a:"object"===n&&(s=l),r=>(o.progress=r,s(e,t))}function E(e,t,r){let n=b(e);if(n!==b(t)&&v("animation/stepAnimation","from and to must be the same type"),"array"===n){e.length!==t.length&&v("animation/stepAnimation","from and to must be the same length");let n=[Array.from({length:e.length}),Array.from({length:t.length})];for(let o=0;o<e.length;o++){let[i,a]=E(e[o],t[o],r);n[0][o]=i,n[1][o]=a}return n}if("object"===n){let n=Reflect.ownKeys(t),o=new Set(Reflect.ownKeys(e)),i=[{},{}];for(let a=0;a<n.length;a++){let l=n[a];o.has(l)||v("animation/stepAnimation",`from does not have this key: ${String(l)}`);let[s,u]=E(e[l],t[l],r);i[0][l]=s,i[1][l]=u}return i}return"number"!==n?[r(e),r(t)]:[e,t]}async function A(e,t,r){return new Promise((t,r)=>{let n=e();if(i(n))return n.then(t,r);t()}).catch(r??t.reject)}let D=d({autoStart:c.boolean(!0),easing:c.function(()=>k),onStart:c.function(()=>u),onStop:c.function(()=>u),onClear:c.function(()=>u),onUpdate:c.function(()=>u),onComplete:c.function(()=>u),formatterValue:c.function(()=>k),formatter:c.function(()=>k),parser:c.function(()=>k)});function*x(e,t,r,n={}){(!Number.isInteger(r)||r<=0)&&p("stepAnimation","step must be a positive integer",RangeError);let{parser:o=k,formatterValue:i=k,formatter:a}=s(n,D,{unwrap:!0}),[l,u]=E(e,t,o),d=q(l,u,i);for(let e=0;e<=r;e++){let t=a(d(e/r));yield t}}function P(e,t,r,n={}){let o;(r<=0||!Number.isInteger(r))&&p("animation","duration must be a positive integer",RangeError);let i=s(n,D,{unwrap:!0}),[a,l]=E(e,t,i.parser),{autoStart:u,easing:d,onComplete:c,onUpdate:h,formatterValue:f,formatter:g}=i,m=q(a,l,f),y=(...e)=>g(m(...e)),b=0,k=!1,v=function(e,t){let{onStart:r,onStop:n,onClear:o}=t,i=w(),a={stopSignal:!0,resolvers:i,stop:()=>{a.stopSignal=!0,n()},start:()=>{a.stopSignal=!1,r(),e()},clear:()=>{a.stopSignal=!0,o(),i.resolve(!0)}};return a}(()=>{let e=performance.now();if(b+=e,S(T)){b-=performance.now();return}k||(h(y(0)),k=!0)},i),{resolvers:$}=v,S=(o="function"==typeof globalThis.requestAnimationFrame?globalThis.requestAnimationFrame:e=>setTimeout(e,16),e=>!!v.stopSignal||(o(()=>A(e,$,e=>{v.stop(),$.reject(e)})),!1)),T=()=>{let e=performance.now()-b;h(y(d(Math.min(e/r,1)))),e<r?S(T)&&(b=-e):(c(),$.resolve(!1))};return!1!==u&&v.start(),{promise:$.promise,stop:v.stop,start:v.start,clear:v.clear}}let R=Symbol("EMPTY");function C(e,t,r){g(e)||v("tryCallFunc","callback is not a function");let n=(e,r,n)=>{if(g(t))try{r.errorResult=Reflect.apply(t,e,[n])}catch(e){r.error=e}else r.error=n;return r.errorResult},o=(e,t,n)=>{try{if(t.error!==R)throw t.error}finally{g(r)&&Reflect.apply(r,e,t.error===R?[n]:[t.error])}};return function(...t){let r={oriResult:R,errorResult:R,error:R},a=(async()=>{try{return r.oriResult=Reflect.apply(e,this,t),r.oriResult}catch(e){return n(this,r,e)}})().catch(e=>n(this,r,e));if(i(r.oriResult))return a.then(e=>(o(this,r,e),e));let l=r.oriResult===R?r.errorResult:r.oriResult;return o(this,r,l),l}}function I(e,t,r){return g(e)||v("tryCall","callback is not a function"),C(e,t,r).call(this)}let j=/^[a-z][a-z\d+\-.]*:/imu;function L(e){return!!e&&j.test(e)}function M(e,t){let r=t?t(e):e;switch(b(r)){case"object":case"array":case"number":case"boolean":case"function":return JSON.stringify(r);default:return r}}function O(e,t,r){return{$:e,$$:r,$$r:t,$updateBaseUrl(e){if(L(e))t.baseUrl=e;else{let{origin:r}=globalThis.location||{};r||p("apiController.$updateBaseUrl","location.origin is undefined");let n=(e||"/").startsWith("/")?e||"":`/${e}`;t.baseUrl=`${r}${n}`}}}}function _(e,t=!1){let r=Reflect.ownKeys(e),n=[];for(let t=0;t<r.length;t++){let o=r[t];o.endsWith("Custom")&&n.push(o),l(e[o].url)||n.push(..._(e[o],!0))}return!t&&n.length>0&&f.warn("apiController.createApiWithMap","api 命名不应该使用 Custom 结尾, 因为这是一个内部实现的方法",n),n}async function F(e,t){let{baseUrl:r,url:n,method:o,parser:i,data:a,tdto:l,tvo:s,onResponse:u,...d}=e,c=function(e,t){if(L(e))return new URL(e);L(t)||v("apiController.request","baseUrl 配置不合法, 必须是绝对路径");let r=new URL(t),n="/"===r.pathname?"":r.pathname.replace(/\/$/u,""),o=e.startsWith("/")?e:`/${e}`;return new URL(`${n}${o}`,r)}(n,r),f=o?.toUpperCase(),p=I(()=>{if(h(f)||"GET"===f||"HEAD"===f){let e=Object.keys(a||{});for(let t=0;t<e.length;++t)c.searchParams.append(e[t],a[e[t]]);return new Request(c,{...d,method:f})}let e=M(a,l);return new Request(c,{...d,method:f,body:e})}),m=await t(p),y=await I(()=>{if(u)return u(m,e);if(!i)return m.json();if("stream"===i)return m.body;let t=m[i];if(g(t))return Reflect.apply(t,m,[]);v("apiController.responseParser","Invalid parser")});return s?s(y):y}async function N(e){let{onRequest:t,...r}=e;return F(e,async n=>new Response(M(await (t&&t(n,e))),{...r}))}async function U(e){return F(e,fetch)}function B(e){let t=function(e,t){if(!e.includes("/:"))return e;t||v("apiController.parseParams","url 中存在 params 参数, params 配置不能为空, 请使用 custom 方法调用并传递 params 配置");let r=e.split("/"),n=[];for(let e=1;e<r.length;++e){if(":"!==r[e][0])continue;let i=r[e].slice(1),a=t[i];if(!(o(a)||a)){n.push(i);continue}let l=encodeURIComponent(String(a));r[e]=l}return n.length>0&&v("apiController.parseParams",`params 配置中缺少 [${n.join(", ")}] 参数`),r.join("/")}(e.url,e.params),{requestMode:r,requestModeMap:n}=e,i=(n||{})[r||""];return i?i({...e,url:t}):"mock"===r?N({...e,url:t}):U({...e,url:t})}let z=Symbol("fromDefine");function H(e,t){let n=e[z];delete e[z];let o=Object.create(null),i=t||{};r(n)||_(e);let a=O(e,i,t);return new Proxy(e,{get(e,t,r){if(Reflect.getOwnPropertyDescriptor(o,t))return o[t];let{instanceMember:s,api:u,isCustom:d=!1}=function(e,t,r,n){if(Reflect.getOwnPropertyDescriptor(n,t))return{instanceMember:n[t]};let o=l(t)&&Reflect.has(e,t),i=l(t)&&t.endsWith("Custom")&&!o,a=i?t.slice(0,-6):t;if(!Reflect.getOwnPropertyDescriptor(e,a))return;let s=Reflect.get(e,a,r);if(!i||l(s.url))return{api:s,isCustom:i}}(e,t,r,a)||{};if(s)return s;if(!u)return;let c=null;return c=l(u.url)?V({...u,[z]:n},i,d):H({...u,[z]:n},i),o[t]=c,c}})}function V(e,t,n){let o=e[z];delete e[z];let i=t||{};l(e.url)||v("apiController.createApi","入参应为 APIConfig 对象"),e.url.includes("/:")&&(r(o)||f.warn("apiController.createApi","url 中存在 params 参数, 使用 defineApi 或 defineApiMap 定义 API 或 API map 来获取更好的类型提示"),r(n)||v("apiController.createApi","url 中存在 params 参数, 不支持普通请求, 转为自定义请求"));let a=null;a=r(n)?(t,r)=>B({...i,...e,...r,url:e.url,data:t,oriUrl:e.url}):t=>B({...i,...e,data:t,oriUrl:e.url});let s=O(e,i,t);return L(e.url)||s.$updateBaseUrl(i.baseUrl),new Proxy(a,{get:(e,t,r)=>Reflect.getOwnPropertyDescriptor(s,t)?s[t]:Reflect.get(e,t,r)})}function J(e){return{...e,[z]:!0}}function K(e){return _(e),{...e,[z]:!0}}function W(e){return Array.isArray(e)?[]:{}}function G(e){return Array.isArray(e)||"object"==typeof e}function Q(...e){let t=(1===e.length&&Array.isArray(e[0])?e[0]:e).map(e=>{let t=null;if(Array.isArray(e)){let[r,n,o]=e;t={condition:r,value:n,fullback:o}}else Object.getOwnPropertyDescriptor(e,"condition")?t=e:v("conditionMerge","input must be an ConditionItem");let r=G(t.value),n=void 0===t.fullback||G(t.fullback);return r&&n||v("conditionMerge","value and fullback must be an array or object"),t}),r=W((t[0]||{}).value),n=Array.isArray(r)?(e,t)=>Reflect.apply(Array.prototype.splice.bind(e,e.length,0),null,t):Object.assign;for(let e=0,o=t[e];e<t.length;o=t[++e])n(r,o.condition?o.value:o.fullback||W(o.value));return r}let Y={fixed:{fixedFlag:Symbol("fixed")},insert:{insertFlag:Symbol("insert")}},X=d({name:c.string("default"),fixedSlots:c.array([]),dataList:c.array([]),listener:c.object({})});class Z extends EventTarget{addEventListener(...e){super.addEventListener.apply(this,e)}removeEventListener(...e){super.removeEventListener.apply(this,e)}options;fixedSlots=new Map;dataList=[];mixedData=[];lastMixedSlotIdx=-1;prevDataLength=0;isBatching=!1;constructor(e){super();let t=s(e||{},X,{unwrap:!0}),{fixedSlots:r,dataList:n,listener:o}=t;this.options=t,this.addFixedSlots(r,{lazy:!0}),this.appendList(n);try{this.initListener(o)}catch(e){p("dataMixedManager",e.message,e.constructor)}}initListener(e){let t=Object.keys(e);for(let r=0,n=t[r],o=e[n];r<t.length;o=e[n=t[++r]])this.addEventListener(n,o)}getTypeText(e){switch(e){case Y.fixed:return"fixed";case Y.insert:return"insert"}}buildSlotConfig(e,t){let r=this.getTypeText(e.type||t);return{...e,type:r,inputPosition:e.position,insertMode:e.insertMode??"cover"}}addFixedSlot(e,t){let r=this.reorderFixedSlots(this.buildSlotConfig(e,Y.fixed));return this.fixedSlots.set(r.position,r),this.buildMixedData(t),r.position}reorderFixedSlots(e){let{position:t,insertMode:r}=e;if(h(r)||"cover"===r||!this.fixedSlots.has(t))return{...e,inputPosition:t};let n="after"===r?t+1:t;for(let e=n+1,t=this.fixedSlots.get(e-1),r=this.fixedSlots.get(e);t;++e,t=r,r=this.fixedSlots.get(e))t.position=e,this.fixedSlots.set(e,t);return{...e,position:n,inputPosition:t}}addFixedSlots(t,r){if(e(t))return[];let n=this.batchUpdate(()=>t.map(e=>this.addFixedSlot(e)));return this.buildMixedData(r),n}deleteFixedSlot(e,t){this.fixedSlots.delete(e),this.buildMixedData(t)}deleteFixedSlots(t,r){e(t)||(this.batchUpdate(()=>t.forEach(e=>void this.deleteFixedSlot(e))),this.buildMixedData(r))}batchUpdate(e){try{return this.isBatching=!0,e()}finally{this.isBatching=!1}}clearFixedSlots(e){this.fixedSlots.clear(),this.buildMixedData(e)}appendList(t,r){e(t)||(this.dataList.push(...t),this.buildMixedData({...r,lazy:!0===(r||{}).lazy}))}clearList(){this.dataList.length=0,this.mixedData.length=0,this.dispatch("change",{mode:"clear",mixedData:this.getMixedData({mode:"rebuild"})}),this.dispatch("clear")}getMixedData(e){return this.buildMixedData({...e,lazy:!1}),this.mixedData.slice()}dispatch(e,t){let r={name:this.options.name,...t};this.dispatchEvent(new CustomEvent(e,{detail:r})),void 0!==globalThis.window&&globalThis.window.dispatchEvent(new CustomEvent(`[DMM]:${e}`,{detail:r}))}buildMixedData(e){if(this.isBatching)return;let{lazy:t,mode:r}=e||{};if("rebuild"===r&&(this.prevDataLength=0,this.lastMixedSlotIdx=-1),!1!==t||this.dataList.length<=this.prevDataLength)return;let n=this.prevDataLength,o=this.dataList.length,i=o-n;this.prevDataLength=o;let a=n>0,l=this.sliceSlots(a?this.mixedData.length:this.lastMixedSlotIdx,this.mixedData.length+i);this.lastMixedSlotIdx=l.at(-1)??this.lastMixedSlotIdx;let s=a?this.mixedData.length:0;this.mixedData.length=(a?i+s:o)+l.length;for(let e=0,t=l[e];n<o;++s)if(s===t){let r=this.fixedSlots.get(t);this.mixedData[s]={isFixed:!0,type:r.type,data:r.data},t=l[++e]}else this.mixedData[s]={isFixed:!1,type:"plain",data:this.dataList[n]},++n;this.dispatch("change",{mode:a?"patch":"rebuild",mixedData:this.mixedData.slice()})}sliceSlots(e,t=1/0){let r=-2,n=0;return Array.from(this.fixedSlots.keys()).sort((e,t)=>e-t).filter(o=>(o>=e&&o<t+n||o-1===r)&&(++n,r=o,!0))}insertSlot(e){let t=this.addFixedSlot({...e,type:Y.insert});return t>this.mixedData.length||this.buildMixedData({lazy:!1,mode:"rebuild"}),t}insertSlots(t){if(e(t))return[];let r=this.batchUpdate(()=>t.map(e=>this.insertSlot(e)));return this.buildMixedData({lazy:!1,mode:"rebuild"}),r}}function ee(e){return new Z(e)}let et="@cmtlyt/lingshu-toolkit:lockData",er=Symbol("@cmtlyt/lingshu-toolkit:lockData#NEVER_TIMEOUT"),en="persistent",eo="lockData";class ei extends TypeError{constructor(e){super(e),this.name="InvalidOptionsError"}}class ea extends Error{constructor(e){super(e),this.name="LockAbortedError"}}class el extends Error{constructor(e,t){super(e,t),this.name="LockDisposedError"}}class es extends Error{constructor(e){super(e),this.name="LockRevokedError"}}class eu extends Error{constructor(e){super(e),this.name="LockTimeoutError"}}class ed extends TypeError{constructor(e){super(e),this.name="ReadonlyMutationError"}}function ec(e){if(0===e.length)return"<root>";let t="";for(let r=0;r<e.length;r++){let n=e[r];if("number"==typeof n||"string"==typeof n&&/^\d+$/u.test(n)){t+=`[${String(n)}]`;continue}t+=0===r?String(n):`.${String(n)}`}return t}function eh(e){if(void 0===e)return"undefined";if("number"==typeof e){if(Number.isNaN(e))return"NaN";if(!Number.isFinite(e))return e>0?"Infinity":"-Infinity"}let t=typeof e;if("object"!==t)return t;if(null===e)return"null";let r=Object.prototype.toString.call(e).slice(8,-1);if("Object"!==r)return r;let n=e.constructor;return n&&n!==Object&&"string"==typeof n.name&&n.name.length>0?`class instance (${n.name})`:"non-plain object"}function ef(e,t,r,n){let o;if(null===e)return;void 0===e&&p(eo,`${n} only supports JSON-safe values, got "undefined" at "${ec(t)}" (use "null" instead)`,TypeError);let i=typeof e;if("string"===i||"boolean"===i)return;if("number"===i){Number.isFinite(e)||p(eo,`${n} only supports JSON-safe values, got "${eh(e)}" at "${ec(t)}"`,TypeError);return}if("object"!==i&&p(eo,`${n} only supports JSON-safe values, got "${eh(e)}" at "${ec(t)}"`,TypeError),r.has(e)&&p(eo,`${n} detected cyclic reference at "${ec(t)}"`,TypeError),Array.isArray(e)){r.add(e);for(let o=0;o<e.length;o++)ef(e[o],[...t,o],r,n);r.delete(e);return}(o=Object.getPrototypeOf(e))!==Object.prototype&&null!==o&&p(eo,`${n} only supports JSON-safe values (plain object / array / string / number / boolean / null), got "${eh(e)}" at "${ec(t)}"`,TypeError),r.add(e),Object.getOwnPropertySymbols(e).length>0&&p(eo,`${n} only supports JSON-safe values, got symbol-keyed property at "${ec(t)}"`,TypeError);let a=Object.keys(e);for(let o=0;o<a.length;o++){let i=a[o];ef(e[i],[...t,i],r,n)}r.delete(e)}function ep(e){return JSON.parse(JSON.stringify(e))}function eg(e,t){Array.isArray(e)&&p(eo,`${t} must not return an array; lockData rejects top-level arrays (wrap in object {} instead)`,ei),ef(e,[],new WeakSet,t)}function em(){try{let e=globalThis.crypto;if(e&&"function"==typeof e.randomUUID)return e.randomUUID()}catch{}return`${Math.random().toString(36).slice(2)}-${Date.now().toString(36)}`}async function ey(e){if("persistent"===e.persistence)return{epoch:en,effectivePersistence:"persistent",authorityCleared:!1};if(!e.sessionStore)return e.logger.warn('[lockData] sessionStore adapter unavailable, persistence="session" falls back to "persistent"'),{epoch:en,effectivePersistence:"persistent",authorityCleared:!1};let t=e.sessionStore.read();if(l(t)&&t.length>0)return{epoch:t,effectivePersistence:"session",authorityCleared:!1};if(!e.channel)return e.logger.warn("[lockData] channel adapter unavailable, skip session-probe and treat as first tab"),eb(e);let r=await function(e){let{channel:t}=e;if(!t)return Promise.resolve(null);let r=em(),o=e.sessionProbeTimeout||100,i=w(),a=!1,s=t.subscribe(e=>{!a&&n(e)&&"session-reply"===e.type&&l(e.probeId)&&l(e.epoch)&&e.probeId===r&&(a=!0,i.resolve(e.epoch))}),u=setTimeout(()=>{a||(a=!0,i.resolve(null))},o);return t.postMessage({type:"session-probe",probeId:r}),i.promise.finally(()=>{clearTimeout(u),s()})}(e);return l(r)?(e.sessionStore.write(r),{epoch:r,effectivePersistence:"session",authorityCleared:!1}):eb(e)}function eb(e){let t=em();e.sessionStore&&e.sessionStore.write(t);let r=!1;if(e.authority)try{e.authority.remove(),r=!0}catch(t){e.logger.warn("[lockData] authority.remove failed during freshEpoch",t)}return{epoch:t,effectivePersistence:"session",authorityCleared:r}}function ek(e){let t;try{t=JSON.parse(e)}catch{return null}if(!n(t))return null;let r=t;return a(r.rev)&&l(r.epoch)&&Reflect.has(r,"snapshot")?{rev:r.rev,ts:a(r.ts)?r.ts:0,epoch:r.epoch,snapshot:r.snapshot}:null}function ev(e,t,r,o){if(e.disposed)return;let{host:i,logger:a,emitSync:s}=t,u=function(e,t){let r;if(!t)return null;let n=(r=/^\{"rev":(?<rev>-?\d+)/u.exec(t))?Number(r[1]):null;if(null===n){var o;let r;return o=e,!(r=ek(t))||r.rev<=o.lastAppliedRev||l(o.epoch)&&r.epoch!==o.epoch?null:{rev:r.rev,snapshot:r.snapshot}}if(n<=e.lastAppliedRev)return null;if(l(e.epoch)){let r,n=(r=/,"epoch":"(?<epoch>[^"\\]*)"/u.exec(t))?r[1]:null;if(l(n)&&n!==e.epoch)return null}let i=ek(t);return i?{rev:n,snapshot:i.snapshot}:null}({lastAppliedRev:i.lastAppliedRev,epoch:i.epoch},o);if(!u)return;if(!n(u.snapshot))return void a.warn(`[lockData] authority snapshot is not an object (source=${r}), skip apply`);let d=u.snapshot;try{i.applyRemote(d)}catch(e){a.error(`[lockData] host.applyRemote failed (source=${r}, rev=${u.rev})`,e);return}i.rev=u.rev,i.lastAppliedRev=u.rev;try{s({source:r,rev:u.rev,snapshot:ep(d)})}catch(e){a.error(`[lockData] emitSync listener threw (source=${r})`,e)}}async function ew(e,t){let{host:r,authority:o,channel:i,sessionStore:a,persistence:s,sessionProbeTimeout:u,logger:d}=t;if(e.initialized)return d.warn("[lockData] StorageAuthority.init called twice, ignore the second call"),{epoch:r.epoch||"persistent",effectivePersistence:s,authorityCleared:!1};e.initialized=!0,function(e,t){var r,o;if("session"!==t.persistence||!t.channel)return;let i=(r=t.channel,o=()=>t.host.epoch,r.subscribe(e=>{if(!(n(e)&&"session-probe"===e.type&&l(e.probeId)))return;let t=o();l(t)&&0!==t.length&&r.postMessage({type:"session-reply",probeId:e.probeId,epoch:t})}));e.unsubscribers.push(i)}(e,t);let c=await ey({persistence:s,sessionStore:a,channel:i,authority:o?{remove:()=>o.remove()}:null,sessionProbeTimeout:u,logger:d});return e.disposed||(r.epoch=c.epoch,!function(e,t){let{authority:r}=t;if(!r)return;let n=r.subscribe(r=>{ev(e,t,"storage-event",r)});e.unsubscribers.push(n)}(e,t),!function(e,t){let{authority:r}=t;if(!r||void 0===globalThis.window||"u"<typeof document)return;let n=n=>{n.persisted&&ev(e,t,"pageshow",r.read())},o=()=>{"visible"===document.visibilityState&&ev(e,t,"visibilitychange",r.read())};window.addEventListener("pageshow",n),document.addEventListener("visibilitychange",o),e.unsubscribers.push(()=>{window.removeEventListener("pageshow",n),document.removeEventListener("visibilitychange",o)})}(e,t),o&&!c.authorityCleared&&ev(e,t,"pull-on-acquire",o.read())),c}function e$(e){return a(e)&&Number.isFinite(e)}function eS(e){return`${e}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,10)}`}function eT(e){null!==e.heartbeatTimer&&(clearInterval(e.heartbeatTimer),e.heartbeatTimer=null)}function eq(e){null!==e.deadTimer&&(clearTimeout(e.deadTimer),e.deadTimer=null)}function eE(e,t){if("holding"!==e.status.kind)return;let r=e.status;if(r.released)return;r.released=!0,eT(r),e.status={kind:"idle"};let{name:n,logger:o}=e.deps;o.debug(`[${n}] broadcast driver: revoked token=${r.token} reason=${t}`);let i=r.revokeCallback;if(g(i))try{i(t)}catch(e){o.error(`[${n}] broadcast driver: revoke callback threw`,e)}eP(e)}function eA(e,t){let r={kind:"holding",token:t,grantedAt:Date.now(),released:!1,revokeCallback:null,heartbeatTimer:null};return e.status=r,r.heartbeatTimer=setInterval(()=>{r.released||e.destroyed?eT(r):e.channel.postMessage({kind:"heartbeat",senderId:e.senderId,token:r.token,ts:Date.now()})},1e3),e.channel.postMessage({kind:"heartbeat",senderId:e.senderId,token:t,ts:r.grantedAt}),function(e,t){let{name:r,logger:n}=e.deps;return{release:()=>{if("holding"!==e.status.kind||e.status.token!==t||e.status.released)return;let o=e.status;o.released=!0,eT(o),e.status={kind:"idle"},n.debug(`[${r}] broadcast driver: release token=${t}`),e.channel.postMessage({kind:"release",senderId:e.senderId,token:t}),eP(e)},onRevokedByDriver:r=>{"holding"!==e.status.kind||e.status.token!==t||e.status.released||(e.status.revokeCallback=r)}}}(e,t)}function eD(e,t,r){"remote-held"===e.status.kind&&eq(e.status);let n={kind:"remote-held",token:t,peerTs:r,lastHeartbeat:Date.now(),deadTimer:null};e.status=n,eq(n),n.deadTimer=setTimeout(()=>{!function(e,t){let{name:r,logger:n}=e.deps;"remote-held"===e.status.kind&&e.status.token===t&&(eq(e.status),n.warn(`[${r}] broadcast driver: remote holder token=${t} dead by heartbeat timeout`),e.status={kind:"idle"},eP(e))}(e,n.token)},3e3)}function ex(e,t){let r=e.pendingAnnounce;if(null===r||r.abandoned)return;r.abandoned=!0,null!==r.timer&&(clearTimeout(r.timer),r.timer=null),e.pendingAnnounce=null;let{name:n,logger:o}=e.deps;o.debug(`[${n}] broadcast driver: abandon pendingAnnounce reason=${t} token=${r.waiter.token}`),e.waiters.push(r.waiter)}function eP(e){if(e.destroyed||"idle"!==e.status.kind||0===e.waiters.length||null!==e.pendingAnnounce||null!==e.pendingForce)return;let t=e.waiters.shift();t&&eR(e,t)}function eR(e,t){let{name:r,logger:n}=e.deps;if(e.destroyed)return void n.error(`[${r}] broadcast driver: startAnnounceCampaign called after destroyed`);if("idle"!==e.status.kind||null!==e.pendingAnnounce||null!==e.pendingForce){n.error(`[${r}] broadcast driver: startAnnounceCampaign precondition violated (status=${e.status.kind}, pendingAnnounce=${null!==e.pendingAnnounce}, pendingForce=${null!==e.pendingForce})`),e.waiters.push(t);return}let o=eS("req"),i=Date.now(),a={requestId:o,ts:i,waiter:t,abandoned:!1,timer:null};e.pendingAnnounce=a,e.channel.postMessage({kind:"announce",senderId:e.senderId,requestId:o,token:t.token,ts:i,force:!1}),n.debug(`[${r}] broadcast driver: announce token=${t.token} reqId=${o}`),a.timer=setTimeout(()=>{if(a.timer=null,a.abandoned||e.destroyed)return;e.pendingAnnounce=null;let o=eA(e,t.token);n.debug(`[${r}] broadcast driver: grant token=${t.token}`),t.resolve(o)},50)}function eC(e){let{id:t,getChannel:r}=e;g(r)||p(eo,"broadcast driver requires getChannel factory",TypeError),l(t)&&0!==t.length||p(eo,"broadcast driver requires a non-empty id",TypeError);let o=r({id:t,channel:"custom"});null===o&&p(eo,"broadcast driver getChannel returned null",TypeError);let i={deps:e,channel:o,senderId:eS("sender"),status:{kind:"idle"},waiters:[],pendingAnnounce:null,pendingForce:null,destroyed:!1,unsubscribe:null};function s(e){return new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: broadcast driver destroyed (token=${e})`)}return i.unsubscribe=o.subscribe(e=>(function(e,t){if(function(e){if(!n(e)||!l(e.senderId))return!1;switch(e.kind){case"announce":return l(e.requestId)&&l(e.token)&&e$(e.ts)&&y(e.force);case"reject":return l(e.requestId)&&l(e.holderToken)&&e$(e.holderTs);case"release":return l(e.token);case"force":case"heartbeat":return l(e.token)&&e$(e.ts);default:return!1}}(t))switch(t.kind){case"announce":!function(e,t){if(t.senderId===e.senderId)return;if("holding"===e.status.kind&&!e.status.released){let r=e.status;e.channel.postMessage({kind:"reject",senderId:e.senderId,requestId:t.requestId,holderToken:r.token,holderTs:r.grantedAt});return}let r=e.pendingAnnounce;if(null!==r&&!r.abandoned){var n,o,i,a;if(n=r.ts,o=r.requestId,i=t.ts,a=t.requestId,n!==i?n<i:o<a)return;ex(e,"arbitration-loss")}}(e,t);return;case"reject":!function(e,t){if(t.senderId===e.senderId)return;if("holding"===e.status.kind&&!e.status.released&&e.status.token!==t.holderToken){let{name:r,logger:n}=e.deps;n.warn(`[${r}] broadcast driver: double-hold detected (own=${e.status.token}, remote=${t.holderToken}); revoking self`),eE(e,"force"),eD(e,t.holderToken,t.holderTs);return}let r=e.pendingAnnounce;null===r||r.abandoned||r.requestId!==t.requestId||ex(e,"rejected"),("idle"===e.status.kind||"remote-held"===e.status.kind)&&eD(e,t.holderToken,t.holderTs)}(e,t);return;case"heartbeat":!function(e,t){if(t.senderId!==e.senderId&&("holding"!==e.status.kind||e.status.token!==t.token)){if("holding"===e.status.kind&&!e.status.released){let{name:r,logger:n}=e.deps;n.warn(`[${r}] broadcast driver: double-hold detected via heartbeat (own=${e.status.token}, remote=${t.token}); revoking self`),eE(e,"force"),eD(e,t.token,t.ts);return}null===e.pendingAnnounce||e.pendingAnnounce.abandoned||ex(e,"heartbeat-detected"),eD(e,t.token,t.ts)}}(e,t);return;case"release":t.senderId!==e.senderId&&"remote-held"===e.status.kind&&e.status.token===t.token&&(eq(e.status),e.status={kind:"idle"},eP(e));return;case"force":!function(e,t){if(t.senderId===e.senderId)return;let r=e.pendingForce;if(null!==r&&!r.abandoned){var n,o,i,a;if(n=r.ts,o=r.token,i=t.ts,a=t.token,n!==i?n<i:o<a)return;!function(e,t){let r=e.pendingForce;if(null===r||r.abandoned)return;r.abandoned=!0,null!==r.timer&&(clearTimeout(r.timer),r.timer=null),e.pendingForce=null;let{name:n,logger:o}=e.deps;o.debug(`[${n}] broadcast driver: abandon pendingForce reason=${t} token=${r.token}`),e.waiters.push(r.waiter)}(e,"arbitration-loss")}"holding"!==e.status.kind||e.status.released||e.status.token===t.token||eE(e,"force"),eD(e,t.token,t.ts)}(e,t);return;default:return}})(i,e)),{acquire:e=>e.signal.aborted?Promise.reject(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire aborted (token=${e.token})`)):i.destroyed?Promise.reject(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: broadcast driver has been destroyed (token=${e.token})`)):new Promise((t,r)=>{let n=function(e,t,r,n){let o=!1,i=null;function l(){null!==i&&(clearTimeout(i),i=null),e.signal.removeEventListener("abort",u)}let s={token:e.token,resolve:e=>{o||(o=!0,l(),r(e))},reject:e=>{o||(o=!0,l(),n(e))},abort:e=>{if(!o){if(!function(e,t){for(let r=0;r<e.length;r++)if(e[r]===t)return void e.splice(r,1)}(t.waiters,s),null!==t.pendingAnnounce&&t.pendingAnnounce.waiter===s){let e=t.pendingAnnounce;e.abandoned=!0,null!==e.timer&&(clearTimeout(e.timer),e.timer=null),t.pendingAnnounce=null}if(null!==t.pendingForce&&t.pendingForce.waiter===s){let e=t.pendingForce;e.abandoned=!0,null!==e.timer&&(clearTimeout(e.timer),e.timer=null),t.pendingForce=null}s.reject(e),eP(t)}}};function u(){s.abort(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire aborted (token=${e.token})`))}if(e.signal.aborted)return queueMicrotask(()=>u()),s;if(e.signal.addEventListener("abort",u,{once:!0}),a(e.acquireTimeout)&&e.acquireTimeout>0){let t=e.acquireTimeout;i=setTimeout(()=>{s.abort(new eu(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire timed out after ${t}ms (token=${e.token})`))},t)}return s}(e,i,t,r);if(e.force)return void function(e,t){let{name:r,logger:n}=e.deps;if(e.destroyed)return n.error(`[${r}] broadcast driver: startForceCampaign called after destroyed`);"holding"!==e.status.kind||e.status.released||eE(e,"force");let o=Date.now(),i={token:t.token,ts:o,waiter:t,abandoned:!1,timer:null};e.pendingForce=i,e.channel.postMessage({kind:"force",senderId:e.senderId,token:t.token,ts:o}),n.debug(`[${r}] broadcast driver: force-announce token=${t.token} ts=${o}`),i.timer=setTimeout(()=>{if(i.timer=null,i.abandoned||e.destroyed)return;e.pendingForce=null;let o=eA(e,t.token);n.debug(`[${r}] broadcast driver: grant (force) token=${t.token}`),t.resolve(o)},50)}(i,n);if("idle"===i.status.kind&&null===i.pendingAnnounce&&null===i.pendingForce)return void eR(i,n);i.waiters.push(n);let{name:o,logger:l}=i.deps;l.debug(`[${o}] broadcast driver: enqueue token=${e.token}, queue=${i.waiters.length}, status=${i.status.kind}`)}),destroy:()=>{i.destroyed||(i.destroyed=!0,function(e,t){let{deps:r,waiters:n}=e,{name:o,logger:i}=r;i.debug(`[${o}] broadcast driver: destroy (waiters=${n.length}, status=${e.status.kind}, pendingAnnounce=${null!==e.pendingAnnounce}, pendingForce=${null!==e.pendingForce})`);let a=[];if(null!==e.pendingAnnounce){let{pendingAnnounce:t}=e;t.abandoned=!0,null!==t.timer&&clearTimeout(t.timer),e.pendingAnnounce=null,a.push(t.waiter)}if(null!==e.pendingForce){let{pendingForce:t}=e;t.abandoned=!0,null!==t.timer&&clearTimeout(t.timer),e.pendingForce=null,a.push(t.waiter)}for(let e=0;e<n.length;e++)a.push(n[e]);if(n.length=0,"holding"===e.status.kind){let t=e.status;eT(t),t.released=!0;try{e.channel.postMessage({kind:"release",senderId:e.senderId,token:t.token})}catch(e){i.error(`[${o}] broadcast driver: release broadcast failed during destroy`,e)}}else"remote-held"===e.status.kind&&eq(e.status);e.status={kind:"idle"};for(let e=0;e<a.length;e++)a[e].abort(t(a[e].token));if(null!==e.unsubscribe){try{e.unsubscribe()}catch(e){i.error(`[${o}] broadcast driver: unsubscribe threw`,e)}e.unsubscribe=null}try{e.channel.close()}catch(e){i.error(`[${o}] broadcast driver: channel.close threw`,e)}}(i,s))}}}function eI(e,t,r){let{name:n,logger:o}=e,i=null,a=null;return{handle:{release:()=>{let{holder:i}=e;i&&i.token===t&&!i.released&&(i.released=!0,e.holder=null,o.debug(`[${n}] local driver: release by token=${t}`),r())},onRevokedByDriver:e=>{if(i=e,null!==a)try{i(a)}catch(e){o.error(`[${n}] local driver: revoke callback threw`,e)}}},notifyRevoke:e=>{if(a=e,g(i))try{i(e)}catch(e){o.error(`[${n}] local driver: revoke callback threw`,e)}}}}function ej(e){let{name:t,logger:r,waiters:n}=e;if(e.holder||0===n.length)return;let o=n.shift();if(!o)return;let{handle:i,notifyRevoke:a}=eI(e,o.token,()=>ej(e));e.holder={token:o.token,notifyRevoke:a,released:!1},r.debug(`[${t}] local driver: grant token=${o.token}`),o.resolve(i)}async function eL(e,t){let{name:r,logger:n}=e;if(e.destroyed&&p(eo,"local driver has been destroyed",ea),t.signal.aborted&&p(eo,`acquire aborted before start (token=${t.token})`,ea),t.force)return function(e,t){let{name:r,logger:n}=e;if(e.holder){let o=e.holder;o.released=!0,e.holder=null,n.debug(`[${r}] local driver: force-seize from token=${o.token} by token=${t}`),o.notifyRevoke("force")}let{handle:o,notifyRevoke:i}=eI(e,t,()=>ej(e));return e.holder={token:t,notifyRevoke:i,released:!1},n.debug(`[${r}] local driver: grant (force) token=${t}`),o}(e,t.token);if(!e.holder){let{handle:o,notifyRevoke:i}=eI(e,t.token,()=>ej(e));return e.holder={token:t.token,notifyRevoke:i,released:!1},n.debug(`[${r}] local driver: grant (fast-path) token=${t.token}`),o}return function(e,t){let{name:r,logger:n,waiters:o}=e;return new Promise((e,i)=>{let l=!1,s=null;function u(){null!==s&&(clearTimeout(s),s=null),t.signal.removeEventListener("abort",c)}let d={token:t.token,resolve:t=>{l||(l=!0,u(),e(t))},reject:e=>{l||(l=!0,u(),i(e))},abort:e=>{l||(!function(e,t){for(let r=0;r<e.length;r++)if(e[r]===t)return void e.splice(r,1)}(o,d),d.reject(e))}};function c(){d.abort(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire aborted (token=${t.token})`))}if(a(t.acquireTimeout)&&t.acquireTimeout>0){let e=t.acquireTimeout;s=setTimeout(()=>{d.abort(new eu(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire timed out after ${e}ms (token=${t.token})`))},e)}t.signal.addEventListener("abort",c,{once:!0}),o.push(d),n.debug(`[${r}] local driver: enqueue token=${t.token}, queue size=${o.length}`)})}(e,t)}let eM={holder:null,queue:[],rev:0};function eO(e){return a(e)&&Number.isFinite(e)}function e_(){return Math.floor(20*Math.random())}function eF(e){return Date.now()-e.heartbeat>2500}function eN(e){let t,{storage:r,key:o,deps:i}=e;try{t=r.getItem(o)}catch(e){return i.logger.warn(`[${i.name}] storage driver: getItem failed at key=${o}`,e),eM}if(null===t||""===t)return eM;try{let e=JSON.parse(t);if(function(e){var t,r;if(!n(e)||!eO(e.rev)||!m(e.queue))return!1;for(let r=0;r<e.queue.length;r++)if(!(n(t=e.queue[r])&&l(t.token)&&eO(t.ts)))return!1;return null===e.holder||!!(n(r=e.holder)&&l(r.token)&&eO(r.heartbeat)&&l(r.nonce))}(e))return e;return i.logger.warn(`[${i.name}] storage driver: malformed value at key=${o}; treating as empty`),eM}catch(e){return i.logger.warn(`[${i.name}] storage driver: JSON.parse failed at key=${o}`,e),eM}}function eU(e,t){let{storage:r,key:n,deps:o}=e;try{return r.setItem(n,JSON.stringify(t)),"success"}catch(e){return o.logger.warn(`[${o.name}] storage driver: setItem failed`,e),"abort"}}function eB(e,t,r){return new Promise(n=>{let o=0,i=()=>{let a=function(e,t,r){if(e.destroyed)return"abort";let n=eN(e),{holder:o,queue:i}=n;if(null!==o&&!eF(o)&&!r||!r&&i.length>0&&i[0].token!==t)return"cannot-acquire";let a=`n_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,10)}`,l=Date.now(),s=i.filter(e=>e.token!==t);if("abort"===eU(e,{holder:{token:t,heartbeat:l,nonce:a},queue:s,rev:n.rev+1}))return"abort";let u=eN(e);return null===u.holder||u.holder.token!==t||u.holder.nonce!==a?"retry":{token:t,nonce:a}}(e,t,r);"abort"===a||"cannot-acquire"===a?n(null):"retry"!==a?n(a):++o>=3?n(null):setTimeout(i,e_())};i()})}function ez(e){null!==e.heartbeatTimer&&(clearInterval(e.heartbeatTimer),e.heartbeatTimer=null)}function eH(e,t){if("holding"!==e.status.kind)return;let r=e.status;if(r.released)return;r.released=!0,ez(r),e.status={kind:"idle"};let{name:n,logger:o}=e.deps;o.debug(`[${n}] storage driver: revoked token=${r.token} reason=${t}`);let i=r.revokeCallback;if(g(i))try{i(t)}catch(e){o.error(`[${n}] storage driver: revoke callback threw`,e)}eJ(e)}function eV(e,t){for(let r=0;r<e.length;r++)if(e[r]===t)return void e.splice(r,1)}function eJ(e){if(e.destroyed||e.pumping||"idle"!==e.status.kind||0===e.waiters.length)return;let[t]=e.waiters;e.pumping=!0,eB(e,t.token,!1).then(r=>{if(e.pumping=!1,null===r)return;if(e.destroyed){eK(e,t.token,r.nonce),eV(e.waiters,t);return}if("idle"!==e.status.kind)return void eK(e,t.token,r.nonce);let[n]=e.waiters;if(n!==t)return void eK(e,t.token,r.nonce);if(t.isSettled()){e.waiters.shift(),eK(e,t.token,r.nonce);return}e.waiters.shift();let o=eW(e,t.token,r.nonce);e.deps.logger.debug(`[${e.deps.name}] storage driver: grant token=${t.token}`),t.resolve(o)})}function eK(e,t,r){let n=eN(e);null===n.holder||n.holder.token!==t||n.holder.nonce!==r||eU(e,{holder:null,queue:n.queue,rev:n.rev+1})}function eW(e,t,r){let n={kind:"holding",token:t,nonce:r,released:!1,revokeCallback:null,heartbeatTimer:null};return e.status=n,n.heartbeatTimer=setInterval(()=>{if(n.released||e.destroyed)return void ez(n);let t=eN(e);null===t.holder||t.holder.token!==n.token||t.holder.nonce!==n.nonce?eH(e,"force"):eU(e,{holder:{token:n.token,heartbeat:Date.now(),nonce:n.nonce},queue:t.queue,rev:t.rev+1})},500),function(e,t,r){let{name:n,logger:o}=e.deps;return{release:()=>{if("holding"!==e.status.kind||e.status.token!==t||e.status.nonce!==r||e.status.released)return;let i=e.status;i.released=!0,ez(i),e.status={kind:"idle"},o.debug(`[${n}] storage driver: release token=${t}`),eK(e,t,r),eJ(e)},onRevokedByDriver:n=>{"holding"!==e.status.kind||e.status.token!==t||e.status.nonce!==r||e.status.released||(e.status.revokeCallback=n)}}}(e,t,r)}function eG(e){if(e.destroyed)return;let t=eN(e);if("holding"===e.status.kind&&!e.status.released){(null===t.holder||t.holder.token!==e.status.token||t.holder.nonce!==e.status.nonce)&&eH(e,"force");return}"idle"===e.status.kind&&e.waiters.length>0&&(null===t.holder||eF(t.holder))&&eJ(e)}function eQ(e,t){var r,n;let{name:o,logger:i}=e.deps;e.waiters.push(t),i.debug(`[${o}] storage driver: enqueue token=${t.token}, queue=${e.waiters.length}`),(r=t.token,n=()=>(function(e,t){if(e.destroyed)return"abort";let r=eN(e);for(let e=0;e<r.queue.length;e++)if(r.queue[e].token===t)return"success";if("abort"===eU(e,{holder:r.holder,queue:[...r.queue,{token:t,ts:Date.now()}],rev:r.rev+1}))return"abort";let n=eN(e);for(let e=0;e<n.queue.length;e++)if(n.queue[e].token===t)return"success";return"retry"})(e,r),new Promise(e=>{let t=0,r=()=>{let o=n();"success"===o?e(!0):"abort"===o||++t>=3?e(!1):setTimeout(r,e_())};r()})).then(r=>{r||i.warn(`[${o}] storage driver: enqueueInStorage failed after retries (token=${t.token}); relying on timeout/polling`),eJ(e)})}function eY(e){let{id:t}=e;l(t)&&0!==t.length||p(eo,"storage driver requires a non-empty id",TypeError),!function(){try{let e=globalThis.localStorage;if(!e)return!1;let t=`${et}:__storage_driver_probe__`;return e.setItem(t,"1"),e.removeItem(t),!0}catch{return!1}}()&&p(eo,"storage driver requires a usable localStorage",TypeError);let r={deps:e,storage:globalThis.localStorage,key:`${et}:${t}:driver-lock`,status:{kind:"idle"},waiters:[],destroyed:!1,pumping:!1,unsubscribeStorageEvent:null,pollTimer:null};function n(e){return new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: storage driver destroyed (token=${e})`)}return r.unsubscribeStorageEvent=function(e){let t=globalThis;if(!g(t.addEventListener))return e.deps.logger.warn(`[${e.deps.name}] storage driver: globalThis.addEventListener unavailable; cross-tab notification disabled`),null;let r=t=>{if(t.storageArea===e.storage&&(t.key===e.key||null===t.key))try{eG(e)}catch(t){e.deps.logger.error(`[${e.deps.name}] storage driver: handleExternalChange threw`,t)}};return t.addEventListener("storage",r),()=>{t.removeEventListener?.("storage",r)}}(r),r.pollTimer=setInterval(()=>{try{eG(r)}catch(e){r.deps.logger.error(`[${r.deps.name}] storage driver: polling threw`,e)}},250),{acquire:e=>r.destroyed?Promise.reject(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: storage driver has been destroyed (token=${e.token})`)):new Promise((t,n)=>{let o=function(e,t,r,n){let o=!1,i=null;function l(){null!==i&&(clearTimeout(i),i=null),e.signal.removeEventListener("abort",u)}let s={token:e.token,resolve:e=>{o||(o=!0,l(),r(e))},reject:e=>{o||(o=!0,l(),n(e))},abort:e=>{o||(eV(t.waiters,s),s.reject(e),eJ(t))},isSettled:()=>o};function u(){s.abort(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire aborted (token=${e.token})`))}if(e.signal.aborted)return queueMicrotask(()=>u()),s;if(e.signal.addEventListener("abort",u,{once:!0}),a(e.acquireTimeout)&&e.acquireTimeout>0){let t=e.acquireTimeout;i=setTimeout(()=>{s.abort(new eu(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire timed out after ${t}ms (token=${e.token})`))},t)}return s}(e,r,t,n);e.force?function(e,t){let{name:r,logger:n}=e.deps;eB(e,t.token,!0).then(o=>{if(null===o)return void t.abort(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: force acquire failed after retries (token=${t.token})`));if(e.destroyed){eK(e,t.token,o.nonce),t.abort(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: storage driver destroyed during force acquire (token=${t.token})`));return}if(t.isSettled())return void eK(e,t.token,o.nonce);"holding"!==e.status.kind||e.status.released||eH(e,"force");let i=eW(e,t.token,o.nonce);n.debug(`[${r}] storage driver: grant (force) token=${t.token}`),t.resolve(i)})}(r,o):function(e){if("idle"!==e.status.kind||e.waiters.length>0)return!1;let t=eN(e);return!(t.queue.length>0)&&(null===t.holder||eF(t.holder))}(r)?eB(r,o.token,!1).then(e=>{null!==e?function(e,t,r){let{name:n,logger:o}=e.deps;if(e.destroyed){eK(e,t.token,r),t.abort(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: storage driver destroyed during fast acquire (token=${t.token})`));return}if(t.isSettled())return eK(e,t.token,r);if("idle"!==e.status.kind){eK(e,t.token,r),eQ(e,t);return}let i=eW(e,t.token,r);o.debug(`[${n}] storage driver: grant (fast-path) token=${t.token}`),t.resolve(i)}(r,o,e.nonce):o.isSettled()||eQ(r,o)}):eQ(r,o)}),destroy:()=>{r.destroyed||(r.destroyed=!0,function(e,t){let{deps:r,waiters:n}=e,{name:o,logger:i}=r;if(i.debug(`[${o}] storage driver: destroy (waiters=${n.length}, status=${e.status.kind})`),null!==e.pollTimer&&(clearInterval(e.pollTimer),e.pollTimer=null),null!==e.unsubscribeStorageEvent){try{e.unsubscribeStorageEvent()}catch(e){i.error(`[${o}] storage driver: unsubscribe storage event threw`,e)}e.unsubscribeStorageEvent=null}if("holding"===e.status.kind){let t=e.status;ez(t),t.released=!0,eK(e,t.token,t.nonce)}e.status={kind:"idle"};let a=n.slice();if(n.length=0,a.length>0)try{let t=eN(e),r=new Set;for(let e=0;e<a.length;e++)r.add(a[e].token);let n=t.queue.filter(e=>!r.has(e.token));n.length!==t.queue.length&&eU(e,{holder:t.holder,queue:n,rev:t.rev+1})}catch(e){i.error(`[${o}] storage driver: batch dequeue failed during destroy`,e)}for(let e=0;e<a.length;e++)a[e].abort(t(a[e].token))}(r,n))}}}function eX(e){let{name:t,logger:r}=e,o=function(){if("u"<typeof navigator)return null;let{locks:e}=navigator;return e||null}();o||p(eo,"web-locks driver requires navigator.locks; use auto mode or fallback driver",TypeError);let i=new Set,l=!1;return{acquire:async function e(e){l&&p(eo,"web-locks driver has been destroyed",ea);let{signal:s,cleanup:u,getTimeoutFired:d}=function(e,t,r){let n=new AbortController,o=!1,i=null;if(e.aborted)return n.abort(e.reason),{signal:n.signal,cleanup:()=>void 0,getTimeoutFired:()=>o};function l(){n.abort(e.reason)}return e.addEventListener("abort",l,{once:!0}),a(t)&&t>0&&(i=setTimeout(()=>{o=!0,n.abort(new eu(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire timed out after ${t}ms (token=${r})`))},t)),{signal:n.signal,cleanup:function(){null!==i&&(clearTimeout(i),i=null),e.removeEventListener("abort",l)},getTimeoutFired:()=>o}}(e.signal,e.acquireTimeout,e.token),c=w(),h=null,f=w(),m=!0===e.force?{mode:"exclusive",steal:!0}:{mode:"exclusive",signal:s};!function(e,t,r,n){let{holdings:o}=n;e.then(()=>{let e=t();e&&!e.released&&(e.released=!0,o.delete(e))}).catch(e=>{let o=t();o?function(e,t){if(e.released)return;let{holdings:r,logger:n,driverName:o}=t;if(e.released=!0,r.delete(e),e.resolveHold(),n.debug(`[${o}] web-locks driver: revoked by steal token=${e.token}`),g(e.revokeCallback))try{e.revokeCallback("force")}catch(e){n.error(`[${o}] web-locks driver: revoke callback threw`,e)}}(o,n):r(e)})}(o.request(t,m,()=>(h={token:e.token,holdPromise:c.promise,resolveHold:c.resolve,revokeCallback:null,released:!1},i.add(h),r.debug(`[${t}] web-locks driver: grant token=${e.token} steal=${!0===e.force}`),f.resolve(h),c.promise)),()=>h,f.reject,{holdings:i,logger:r,driverName:t});try{var y;let n=await f.promise;return u(),l&&(n.released=!0,i.delete(n),n.resolveHold(),p(eo,`web-locks driver destroyed during acquire (token=${e.token})`,ea)),y=n,{release:()=>{y.released||(y.released=!0,i.delete(y),y.resolveHold(),r.debug(`[${t}] web-locks driver: release token=${y.token}`))},onRevokedByDriver:e=>{y.revokeCallback=e}}}catch(o){throw u(),d()&&p(eo,`acquire timed out after ${String(e.acquireTimeout)}ms (token=${e.token})`,eu,{cause:o}),(function(e){if(!n(e))return!1;let{name:t}=e;return"AbortError"===t}(o)||e.signal.aborted)&&p(eo,`acquire aborted (token=${e.token})`,ea,{cause:o}),r.error(`[${t}] web-locks driver: request failed (token=${e.token})`,o),o}},destroy:function(){l||(l=!0,r.debug(`[${t}] web-locks driver: destroy (active holdings=${i.size})`),function(e){let t=Array.from(e);for(let r=0;r<t.length;r++){let n=t[r];n.released||(n.released=!0,e.delete(n),n.resolveHold())}}(i))}}}function eZ(){let e=globalThis.navigator;if(!n(e))return!1;let{locks:t}=e;return!!n(t)&&g(t.request)}function e0(){let e=globalThis.BroadcastChannel;if(!g(e))return!1;try{return new e(`${et}:__pick_driver_probe__`).close(),!0}catch{return!1}}function e1(){try{let e=globalThis.localStorage;if(!e)return!1;let t=`${et}:__pick_driver_probe__`;return e.setItem(t,"1"),e.removeItem(t),!0}catch{return!1}}function e3(e,t,r){let{adapters:n,id:o}=e;return{name:l(o)&&o.length>0?`${et}:${o}`:`${et}:__local__`,id:o,logger:n.logger,getChannel:t?n.getChannel:void 0,userGetLock:r?n.getLock:void 0}}function e6(){}function e2(e,t){return e.tokenSeq++,`${et}:${t}:token:${e.tokenSeq}`}function e5(e){return e===er?null:e}function e8(e){p(eo,"actions disposed",el,{cause:e})}function e9(e,t){let r=()=>{},n=e.writeChain.then(t,t);return e.writeChain=n.then(r,r),n}function e4(e){null!==e.holdTimer&&(clearTimeout(e.holdTimer),e.holdTimer=null)}function e7(){}function te(e,t,r,n){let o=`${n}::${String(r)}`;if(e.has(o))return;let i=Object.hasOwn(t,r),a=i?Reflect.get(t,r):void 0;e.set(o,{target:t,key:r,existed:i,prevValue:a})}function tt(e){e.isValid||p(eo,"draft is no longer valid (lock revoked / aborted)",es)}function tr(e,t,r,o,i){for(let a of e){let e,l=r(a);if(l){try{e=l(o)}catch(e){i.error(`[lockData] listener threw (${t})`,e);continue}n(e)&&"then"in e&&g(e.then)&&Promise.resolve(e).catch(e=>{i.error(`[lockData] listener threw (${t})`,e)})}}}function tn(e,t,r){tr(e,"onRevoked",e=>e.onRevoked,t,r)}function to(e,t,r){tr(e,"onCommit",e=>e.onCommit,t,r)}function ti(e,t,r,n){t.phase=r,tr(e.entry.listenersSet,"onLockStateChange",e=>e.onLockStateChange,{phase:r,token:n},e.entry.adapters.logger)}function ta(e,t,r){if(""===t.aliveToken)return;let n=t.aliveToken;t.aliveToken="",t.acquiredByGetLock=!1,e4(t),tl(e,t),ti(e,t,"revoked",n),tn(e.entry.listenersSet,{reason:r,token:n},e.entry.adapters.logger)}function tl(e,t){let r=t.currentHandle;r&&(t.currentHandle=null,function(e,t){let r;try{r=e.release()}catch(e){t.warn("[lockData] driver.release threw (sync)",e);return}n(r)&&"then"in r&&g(r.then)&&Promise.resolve(r).catch(e=>{t.warn("[lockData] driver.release threw (async)",e)})}(r,e.entry.adapters.logger))}async function ts(e,t){t.disposed&&e8();let{entry:r}=e;null!==r.dataReadyPromise&&(await r.dataReadyPromise,t.disposed&&e8())}async function tu(e,r,o,i,a){var l,s,u,d,c,h,f;let m,y,b,k,v,{entry:w,options:$}=e,S=i&&void 0!==i.acquireTimeout?i.acquireTimeout:void 0!==$.timeout?$.timeout:5e3,T=e5(S),q=i&&void 0!==i.holdTimeout?i.holdTimeout:void 0!==$.timeout?$.timeout:5e3,E=(l=[$.signal,i?.signal,o],k=null===(b=null===T?null:new AbortController)?null:setTimeout(()=>b.abort(new DOMException("acquire timeout","TimeoutError")),T),{signal:(v=function(e){let t=e.filter(e=>e instanceof AbortSignal);if("function"==typeof AbortSignal.any)return{signal:AbortSignal.any(t),dispose:e6};let r=new AbortController,n=t.find(e=>e.aborted);if(void 0!==n)return r.abort(n.reason),{signal:r.signal,dispose:e6};let o=[],i=()=>{for(let e=0;e<o.length;e++)o[e]();o.length=0};for(let e=0;e<t.length;e++){let n=t[e],a=()=>{r.abort(n.reason),i()};n.addEventListener("abort",a,{once:!0}),o.push(()=>n.removeEventListener("abort",a))}return{signal:r.signal,dispose:i}}([...l,b?b.signal:null])).signal,dispose:()=>{null!==k&&clearTimeout(k),v.dispose()},timeoutController:b}),A=e2(r,w.id);r.currentToken=A,r.aliveToken=A,ti(e,r,"acquiring",A);try{y=await w.driver.acquire({name:void 0===w.lockId?`${et}:__local__`:`${et}:${w.lockId}`,token:A,force:a,acquireTimeout:S,holdTimeout:q,signal:E.signal})}catch(o){throw r.disposed&&e8(o),r.aliveToken="",ti(e,r,"idle",A),(s=E.timeoutController)&&s.signal.aborted?t(eo,"acquire timeout",eu,{cause:o}):!function(e){if(!n(e))return!1;let{name:t}=e;return"AbortError"===t||"TimeoutError"===t}(o)?o:t(eo,"acquire aborted",ea,{cause:o})}finally{E.dispose()}(r.disposed||r.aliveToken!==A)&&(!function(e,t){let r;try{r=e.release()}catch(e){t.warn("[lockData] handle.release threw (dispose-race)",e);return}n(r)&&"then"in r&&g(r.then)&&Promise.resolve(r).catch(e=>{t.warn("[lockData] handle.release threw (dispose-race async)",e)})}(y,e.entry.adapters.logger),r.disposed&&e8(),p(eo,"lock revoked before activation",es)),r.currentHandle=y,u=e,d=r,g((c=y).onRevokedByDriver)&&c.onRevokedByDriver(e=>{ta(u,d,e)}),h=e,f=r,null!==(m=e5(q))&&(f.holdTimer=setTimeout(()=>{f.holdTimer=null,ta(h,f,"timeout")},m)),ti(e,r,"holding",A),w.authority&&w.authority.pullOnAcquire()}async function td(e,t,r,o){var i;let a,{entry:l}=e,s=(ef(i=l.dataRef.current,[],new WeakSet,"draft"),{draft:function e(t,r,n,o){return new Proxy(t,{get(t,i,a){let l=Reflect.get(t,i,a);if("object"!=typeof l||null===l)return l;let s=`${o}::${String(i)}`;return e(l,r,[...n,i],s)},set:(e,t,i)=>(tt(r.validity),ef(i,[...n,t],new WeakSet,"draft"),te(r.snapshot,e,t,o),r.mutations.push({path:[...n,t],op:"set",value:i}),Reflect.set(e,t,i)),deleteProperty:(e,t)=>(tt(r.validity),te(r.snapshot,e,t,o),r.mutations.push({path:[...n,t],op:"delete"}),Reflect.deleteProperty(e,t))})}(i,a={validity:{isValid:!0},mutations:[],snapshot:new Map},[],"root"),get mutations(){return a.mutations},commit:()=>(tt(a.validity),a.validity.isValid=!1,Object.freeze(a.mutations.map(e=>Object.freeze({...e,path:Object.freeze([...e.path])})))),rollback:()=>{!function(e){let t=Array.from(e.values()).reverse();for(let e=0;e<t.length;e++){let r=t[e];if(r.existed){Reflect.set(r.target,r.key,r.prevValue);continue}Reflect.deleteProperty(r.target,r.key)}}(a.snapshot),a.validity.isValid=!1,a.mutations.length=0,a.snapshot.clear()},dispose:()=>{a.validity.isValid=!1}}),u=t.currentToken;ti(e,t,"committing",u);let d=!1;try{let i=o(s.draft);n(i)&&"then"in i&&g(i.then)&&await i,t.aliveToken!==u&&p(eo,"lock revoked during recipe",es);let a=s.commit();d=!0,function(e,t,r,n,o){let{entry:i}=e,a=ep(i.dataRef.current);i.authority?i.authority.onCommitSuccess({source:r,token:n,mutations:o,snapshot:a}):(i.rev++,i.lastAppliedRev=i.rev,to(i.listenersSet,{source:r,token:n,rev:i.rev,mutations:o,snapshot:a},i.adapters.logger)),ti(e,t,"holding",n)}(e,t,r,u,a)}finally{d||s.rollback(),s.dispose()}}function tc(e,t){if(t.disposed&&e8(),"holding"!==t.phase&&"committing"!==t.phase)return;let r=t.currentToken;t.aliveToken="",e4(t),tl(e,t),t.acquiredByGetLock=!1,ti(e,t,"released",r),ti(e,t,"idle",r)}let th=new WeakMap;function tf(e){return"object"==typeof e&&null!==e}function tp(){p(eo,"cannot mutate readonly view",ed)}let tg={get(e,t,r){let n=Reflect.get(e,t,r);return tf(n)?tm(n):n},set:tp,deleteProperty:tp,defineProperty:tp,setPrototypeOf:tp};function tm(e){let t=th.get(e);if(void 0!==t)return t;let r=new Proxy(e,tg);return th.set(e,r),r}let ty={get(e,t){let r=Reflect.get(e.current,t);return tf(r)?tm(r):r},set:tp,deleteProperty:tp,defineProperty:tp,setPrototypeOf:tp,has:(e,t)=>Reflect.has(e.current,t),ownKeys:e=>Reflect.ownKeys(e.current),getOwnPropertyDescriptor:(e,t)=>{let r=Reflect.getOwnPropertyDescriptor(e.current,t);if(void 0!==r)return{...r,writable:!1,configurable:!0}},getPrototypeOf:e=>Reflect.getPrototypeOf(e.current)};function tb(){}function tk(e,r){return t(eo,`lockData id=${e} initialization failed during getValue()`,el,{cause:r})}let tv=null;function tw(e){let r=function(e){var r,o,s,u,d,c;let m,y,b,k,v,$,S,T,q,E,A,D,x,P,R=function(e){let{id:t}=e;return l(t)&&t.length>0?t:void 0}(e),C=(e,r,o,s)=>{var u,d,c;let m,y,b,k,v,$,S,T=(u=(m=o.adapters||{}).logger,y={warn(e,...t){f.warn(eo,e,...t)},error(e,...t){f.error(eo,e,...t)},debug(e,...t){f.debug(eo,e,...t)}},k={warn:"function"==typeof(b=u||{}).warn?b.warn.bind(b):y.warn,error:"function"==typeof b.error?b.error.bind(b):y.error,debug:"function"==typeof b.debug?b.debug.bind(b):y.debug},v=m.getAuthority,$=m.getChannel,S=m.getSessionStore,{logger:k,getAuthority:e=>{if(v){let t=v(e);if(null!==t)return t}return function(e,t){var r;if(!function(){try{let e=globalThis.localStorage;if(!e)return!1;let t=`${et}:__probe__`;return e.setItem(t,"1"),e.removeItem(t),!0}catch{return!1}}())return t.logger.warn('localStorage is not available; default authority adapter is disabled. syncMode="storage-authority" will fall back to local-only semantics.'),null;let n=(r=e.id,`${et}:${r}:latest`),o=globalThis.localStorage;return{read(){try{return o.getItem(n)}catch(e){return t.logger.warn("Failed to read authority snapshot from localStorage",e),null}},write(e){try{o.setItem(n,e)}catch(e){t.logger.warn("Failed to write authority snapshot to localStorage (likely QuotaExceededError); remote Tabs will not see this commit until next successful write.",e)}},remove(){try{o.removeItem(n)}catch(e){t.logger.warn("Failed to remove authority snapshot from localStorage",e)}},subscribe(e){let r=r=>{if(r.storageArea===o&&r.key===n)try{e(r.newValue)}catch(e){t.logger.error("Authority subscribe callback threw",e)}},i=globalThis;return"function"!=typeof i.addEventListener?(t.logger.warn("globalThis.addEventListener is not available; authority subscribe is noop."),()=>void 0):(i.addEventListener("storage",r),()=>{i.removeEventListener?.("storage",r)})}}}(e,{logger:k})},getChannel:e=>{if($){let t=$(e);if(null!==t)return t}return function(e,t){var r,n;if(!function(){let e=globalThis.BroadcastChannel;if("function"!=typeof e)return!1;try{return new e(`${et}:__probe__`).close(),!0}catch{return!1}}())return t.logger.warn("BroadcastChannel is not available; default channel adapter is disabled. Cross-tab sync features may fall back to degraded mode."),null;let o=new globalThis.BroadcastChannel((r=e.id,n=e.channel,`${et}:${r}:${n}`)),i=!1;return{postMessage(e){if(i||null===o)return void t.logger.warn("postMessage on closed ChannelAdapter is ignored.");try{o.postMessage(e)}catch(e){t.logger.warn("BroadcastChannel.postMessage failed",e)}},subscribe(e){if(i||null===o)return t.logger.warn("subscribe on closed ChannelAdapter is ignored; returning noop unsubscriber."),()=>void 0;let r=r=>{try{e(r.data)}catch(e){t.logger.error("Channel subscribe callback threw",e)}};return o.addEventListener("message",r),()=>{try{o?.removeEventListener("message",r)}catch{}}},close(){if(!i){i=!0;try{o?.close()}catch(e){t.logger.warn("BroadcastChannel.close failed",e)}finally{o=null}}}}}(e,{logger:k})},getSessionStore:e=>{if(S){let t=S(e);if(null!==t)return t}return function(e,t){var r;if(!function(){try{let e=globalThis.sessionStorage;if(!e)return!1;let t=`${et}:__probe__`;return e.setItem(t,"1"),e.removeItem(t),!0}catch{return!1}}())return t.logger.warn('sessionStorage is not available; default session store adapter is disabled. persistence="session" will fall back to "persistent".'),null;let n=(r=e.id,`${et}:${r}:epoch`),o=globalThis.sessionStorage;return{read(){try{return o.getItem(n)}catch(e){return t.logger.warn("Failed to read session store from sessionStorage",e),null}},write(e){try{o.setItem(n,e)}catch(e){t.logger.warn("Failed to write session store to sessionStorage; epoch may be reset on next startup.",e)}}}}(e,{logger:k})},getLock:m.getLock}),q=function(e,r){var n,o,i;let a,l,{getValue:s}=r;if(!g(s))throw t(eo,`lockData id=${e} requires options.getValue (function)`,TypeError);try{l=s()}catch(t){throw tk(e,t)}return null===(n=l)||"object"!=typeof n||"function"!=typeof n.then?(eg(l,"lockData getValue() result"),{firstValue:ep(l),dataReadyPromise:null}):(o=e,i=l,a=w(),Promise.resolve(i).then(e=>{try{eg(e,"lockData getValue() result")}catch(e){a.reject(tk(o,e));return}a.resolve(e)},e=>{a.reject(tk(o,e))}),a.promise.catch(tb),{firstValue:{},dataReadyPromise:a.promise})}(e,o),E=function(e){let{adapters:t,options:r,id:n}=e;if(g(t.getLock))return function(e){let{name:t,logger:r,userGetLock:n}=e;g(n)||p(eo,"custom driver requires adapters.getLock to be a function",TypeError);let o=!1;return{acquire:async function l(l){o&&p(eo,"custom driver has been destroyed",ea);let{signal:s,cleanup:u,getTimeoutFired:d}=function(e,t,r){let n=new AbortController,o=!1,i=null;if(e.aborted)return n.abort(e.reason),{signal:n.signal,cleanup:()=>void 0,getTimeoutFired:()=>o};function l(){n.abort(e.reason)}return e.addEventListener("abort",l,{once:!0}),a(t)&&t>0&&(i=setTimeout(()=>{o=!0,n.abort(new eu(`[@cmtlyt/lingshu-toolkit#${eo}]: acquire timed out after ${t}ms (token=${r})`))},t)),{signal:n.signal,cleanup:function(){null!==i&&(clearTimeout(i),i=null),e.removeEventListener("abort",l)},getTimeoutFired:()=>o}}(l.signal,l.acquireTimeout,l.token),c={name:t,token:l.token,force:l.force,acquireTimeout:l.acquireTimeout,holdTimeout:l.holdTimeout,signal:s};try{let o=n(c),a=await Promise.resolve(o);var f=l.token;if(!(a&&g(a.release))){let e=h(a)?String(a):typeof a.release;p(eo,`adapters.getLock must return an object with a "release" function, got ${e} (token=${f})`,TypeError)}return u(),r.debug(`[${t}] custom driver: grant token=${l.token}`),function(e,t,r){let{name:n,logger:o}=t,a=e.release,l=e.onRevokedByDriver,s={release:()=>{let t;try{t=a.call(e)}catch(e){o.error(`[${n}] custom driver: user release threw (token=${r})`,e);return}if(i(t))return Promise.resolve(t).catch(e=>{o.error(`[${n}] custom driver: user release rejected (token=${r})`,e)})}};return g(l)&&(s.onRevokedByDriver=l.bind(e)),s}(a,e,l.token)}catch(e){throw u(),d()&&p(eo,`acquire timed out after ${String(l.acquireTimeout)}ms (token=${l.token})`,eu,{cause:e}),l.signal.aborted&&p(eo,`acquire aborted (token=${l.token})`,ea,{cause:e}),r.error(`[${t}] custom driver: user getLock rejected (token=${l.token})`,e),e}},destroy:function(){o||(o=!0,r.debug(`[${t}] custom driver: destroy`))}}}(e3(e,!1,!0));if(!l(n)||0===n.length)return function(e){let{name:t,logger:r}=e,n={name:t,logger:r,waiters:[],holder:null,destroyed:!1};return{acquire:e=>eL(n,e),destroy:()=>{n.destroyed||(n.destroyed=!0,function(e){let{name:t,logger:r,waiters:n}=e;if(r.debug(`[${t}] local driver: destroy (waiters=${n.length}, holding=${e.holder?"yes":"no"})`),e.holder){let t=e.holder;t.released=!0,e.holder=null,t.notifyRevoke("force")}let o=n.slice();n.length=0;for(let e=0;e<o.length;e++)o[e].abort(new ea(`[@cmtlyt/lingshu-toolkit#${eo}]: local driver destroyed (token=${o[e].token})`))}(n))}}}(e3(e,!1,!1));let o=r.mode||"auto";switch(o){case"web-locks":return eZ()||p(eo,"mode='web-locks' requested but navigator.locks is unavailable in current environment",TypeError),eX(e3(e,!1,!1));case"broadcast":return e0()||p(eo,"mode='broadcast' requested but BroadcastChannel is unavailable in current environment",TypeError),eC(e3(e,!0,!1));case"storage":return e1()||p(eo,"mode='storage' requested but localStorage is unavailable in current environment",TypeError),eY(e3(e,!1,!1));case"auto":return eZ()?eX(e3(e,!1,!1)):e0()?eC(e3(e,!0,!1)):e1()?eY(e3(e,!1,!1)):void p(eo,"mode='auto' requires one of navigator.locks / BroadcastChannel / localStorage to be available; got none",TypeError);default:p(eo,`unknown mode: ${String(o)}`,TypeError)}}({adapters:T,options:o,id:r}),A=new Set;n(o.listeners)&&A.add(o.listeners);let D={current:q.firstValue},x=e=>{D.current=ep(e)},P={id:e,lockId:r,dataRef:D,driver:E,adapters:T,authority:null,listenersSet:A,initOptions:Object.freeze({timeout:o.timeout,mode:o.mode,syncMode:o.syncMode,persistence:o.persistence,sessionProbeTimeout:o.sessionProbeTimeout}),dataReadyPromise:null,registerTeardown:s.registerTeardown,refCount:1,rev:0,lastAppliedRev:0,epoch:null,applyRemote:x},R=(d=x,null===(c=q.dataReadyPromise)?null:c.then(e=>{d(e)})),C="storage-authority"==("storage-authority"===o.syncMode?"storage-authority":"none")&&void 0!==r?function(e,t,r,n){var o;let i,a="persistent"===t.persistence?"persistent":"session",s=r.getAuthority({id:n}),u=r.getChannel({id:n,channel:"session"}),d=r.getSessionStore({id:n});if(null===s&&null===u&&null===d)return r.logger.warn(`[lockData] syncMode='storage-authority' requested on id=${n} but no authority/channel/sessionStore adapter is available; fallback to in-process sharing only`),null;let c={disposed:!1},h=(o={host:e,authority:s,channel:u,sessionStore:d,persistence:a,sessionProbeTimeout:t.sessionProbeTimeout??100,logger:r.logger,emitSync:t=>{!c.disposed&&tr(e.listenersSet,"onSync",e=>e.onSync,t,e.adapters.logger)},emitCommit:t=>{c.disposed||to(e.listenersSet,t,e.adapters.logger)}},i={unsubscribers:[],disposed:!1,initialized:!1},{init:()=>ew(i,o),pullOnAcquire:()=>(function(e,t){let{authority:r}=t;!e.disposed&&r&&ev(e,t,"pull-on-acquire",r.read())})(i,o),onCommitSuccess:e=>(function(e,t,r){if(e.disposed)return;let{host:n,authority:o,logger:i,emitCommit:a}=t;if(n.rev++,n.lastAppliedRev=n.rev,o&&l(n.epoch)){var s,u,d,c;let e=(s=n.rev,u=Date.now(),d=n.epoch,c=r.snapshot,`{"rev":${s},"ts":${u},"epoch":${JSON.stringify(d)},"snapshot":${JSON.stringify(c)}}`);o.write(e)}try{a({source:r.source,token:r.token,rev:n.rev,mutations:r.mutations,snapshot:r.snapshot})}catch(e){i.error(`[lockData] emitCommit listener threw (source=${r.source})`,e)}})(i,o,e),dispose:()=>(function(e,t){if(e.disposed)return;e.disposed=!0;let{channel:r,logger:n}=t;for(let t=0;t<e.unsubscribers.length;t++)try{e.unsubscribers[t]()}catch(e){n.warn("[lockData] StorageAuthority dispose: unsubscriber threw",e)}if(e.unsubscribers.length=0,r)try{r.close()}catch(e){n.warn("[lockData] StorageAuthority dispose: channel.close threw",e)}})(i,o)});return e.authority=h,e.registerTeardown(()=>h.dispose()),e.registerTeardown(()=>{c.disposed=!0}),h.init().then(()=>{},e=>{r.logger.warn(`[lockData] StorageAuthority.init failed on id=${n}`,e)})}(P,o,T,r):null;return P.dataReadyPromise=null!==R&&null!==C?Promise.all([R,C]).then(()=>void 0):R??C,P},{entry:I,releaseFromRegistry:j}=void 0===R?(m=[],y={value:!0},{entry:b=C("__local__",void 0,e,{registerTeardown:e=>{y.value&&m.push(e)}}),releaseFromRegistry:()=>{if(y.value){y.value=!1;for(let e=m.length-1;e>=0;e--)try{m[e]()}catch(e){b.adapters.logger.warn("[lockData] standalone teardown threw",e)}m.length=0;try{b.driver.destroy()}catch(e){b.adapters.logger.warn("[lockData] standalone driver.destroy threw",e)}}}}):(o=R,s=e,u=C,{entry:(v=(null===tv&&(k=new Map,tv={getOrCreateEntry:(e,r,o)=>{if(0===e.length)throw t(eo,"InstanceRegistry requires a non-empty id",TypeError);let i=k.get(e);if(i){let{entry:t}=i;t.refCount++;let{listeners:o}=r;return n(o)&&t.listenersSet.add(o),!function(e,t,r,n){let o=["timeout","mode","syncMode","persistence","sessionProbeTimeout"];for(let i=0;i<o.length;i++){let a=o[i];t[a]!==r[a]&&n.warn(`[lockData] option conflict on id=${e} (field=${String(a)}, first=${String(r[a])}, incoming=${String(t[a])}), using first registered value`)}}(e,Object.freeze({timeout:r.timeout,mode:r.mode,syncMode:r.syncMode,persistence:r.persistence,sessionProbeTimeout:r.sessionProbeTimeout}),t.initOptions,t.adapters.logger),t}let a=[],l={value:!0},s=o(e,e,r,{registerTeardown:e=>{!g(e)||l.value&&a.push(e)}});return k.set(e,{entry:s,teardowns:a,alive:l}),s},releaseEntry:(e,t)=>{let r=k.get(e);if(!r||r.entry.refCount<=0)return;let{entry:n,teardowns:o,alive:i}=r;void 0!==t&&n.listenersSet.delete(t),n.refCount--,n.refCount>0||(i.value=!1,k.delete(e),function(e,t){let{driver:r,adapters:n,id:o}=e,{logger:i}=n;for(let e=t.length-1;e>=0;e--)try{t[e]()}catch(e){i.warn(`[lockData] teardown callback threw on id=${o}`,e)}try{r.destroy()}catch(e){i.warn(`[lockData] driver.destroy threw on id=${o}`,e)}}(n,o))},peek:{has:e=>k.has(e),size:()=>k.size}}),tv)).getOrCreateEntry(o,s,u),releaseFromRegistry:()=>{v.releaseEntry(o,s.listeners)}}),L=(r={entry:I,options:e,releaseFromRegistry:j},S={phase:"idle",currentHandle:null,currentToken:"",aliveToken:"",tokenSeq:0,holdTimer:null,acquiredByGetLock:!1,disposed:!1,writeChain:Promise.resolve()},T=new AbortController,q=e7,E=()=>{if(S.disposed)return;if(S.disposed=!0,q(),q=e7,T.signal.aborted||T.abort(t(eo,"actions disposed",ea)),""!==S.aliveToken){let e=S.aliveToken;S.aliveToken="",e4(S),tl(r,S),tn(r.entry.listenersSet,{reason:"dispose",token:e},r.entry.adapters.logger)}let e=e2(S,r.entry.id);ti(r,S,"disposed",e),r.releaseFromRegistry()},q=function(e,t){if(!(e instanceof AbortSignal))return e7;if(e.aborted)return queueMicrotask(t),e7;let r=()=>{t()};return e.addEventListener("abort",r,{once:!0}),()=>{e.removeEventListener("abort",r)}}(r.options.signal,E),A=()=>{S.disposed&&e8()},D=async(e,t)=>{if(await ts(r,S),"holding"===S.phase&&""!==S.aliveToken)return{alreadyHeld:!0};let n=e?.force===!0;return await tu(r,S,T.signal,e,n),"getLock"===t&&(S.acquiredByGetLock=!0),{alreadyHeld:!1}},x=e=>{e||S.acquiredByGetLock||"holding"===S.phase&&tc(r,S)},Object.defineProperty(P={get isHolding(){return"holding"===S.phase||"committing"===S.phase},update:async(e,t)=>(A(),g(e)||p(eo,"update requires a recipe function",TypeError),e9(S,async()=>{A();let{alreadyHeld:n}=await D(t,"update");try{await td(r,S,"update",e)}finally{x(n)}})),replace:async(e,t)=>(A(),n(e)||p(eo,"replace requires a non-null object",TypeError),eg(e,"lockData actions.replace(next)"),e9(S,async()=>{A();let{alreadyHeld:n}=await D(t,"replace");try{await td(r,S,"replace",t=>{!function(e,t){let r=Array.isArray(e),n=Array.isArray(t);if(r!==n&&p(eo,`replace shape mismatch: target is ${r?"array":"object"}, next is ${n?"array":"object"}`,TypeError),r){e.length=0;for(let r=0;r<t.length;r++)e.push(t[r]);return}let o=Object.keys(e);for(let r=0;r<o.length;r++){let n=o[r];Object.hasOwn(t,n)||Reflect.deleteProperty(e,n)}let i=Object.keys(t);for(let r=0;r<i.length;r++){let n=i[r];Reflect.set(e,n,t[n])}}(t,e)})}finally{x(n)}})),snapshot:()=>(A(),ep(r.entry.dataRef.current)),getLock:async e=>(A(),e9(S,async()=>{A(),await D(e,"getLock")})),release(){tc(r,S)},async dispose(){E()}},"__testHooks",{value:{doDispose:E,disposedController:T},enumerable:!1,configurable:!1,writable:!1}),P),M=function(e){let t=th.get(e);if(void 0!==t)return t;let r=new Proxy(e,ty);return th.set(e,r),r}(I.dataRef);return d=I,$=[M,c=L],null===d.dataReadyPromise?$:d.dataReadyPromise.then(()=>$,e=>{throw c.dispose(),e})}(e);return r instanceof Promise,r}let t$=new Set(["number","string","date"]);function tS(e,t){return t$.has(b(e))&&t$.has(b(t))?e<t?-1:+(e>t):(f.warn("PriorityQueue",`Unsupported type: ${b(e)} ${b(t)}`),0)}function tT(e,t,r,n,o){if(e>=r)return t;let i=o(n[e].item,n[t].item);return i<0||0===i&&n[e].insertOrder<n[t].insertOrder?e:t}let tq=d({compare:c.function(()=>tS),allowDuplicate:c.boolean(!1)});class tE{heap=[];itemSet=new Set;compare;allowDuplicate;insertCounter=0;constructor(e={}){let{compare:t,allowDuplicate:r}=s(e||{},tq,{unwrap:!0});this.compare=t,this.allowDuplicate=r}swapItems(e,t){[this.heap[e],this.heap[t]]=[this.heap[t],this.heap[e]]}heapifyUp(e){let t=e;for(;t>0;){let e=Math.floor((t-1)/2),r=this.heap[t],n=this.heap[e];if(0>this.compare(r.item,n.item))this.swapItems(t,e),t=e;else break}}heapifyDown(e){let t=e,r=this.heap.length;for(;t<r;){let e=2*t+1,n=2*t+2,o=t;if(o=tT(e,o,r,this.heap,this.compare),(o=tT(n,o,r,this.heap,this.compare))===t)break;this.swapItems(t,o),t=o}}isDuplicate(e){return!this.allowDuplicate&&this.itemSet.has(e)}enqueue(e){if(this.isDuplicate(e)){let t=I(()=>"object"==typeof e&&null!==e?JSON.stringify(e):String(e),()=>Object.prototype.toString.call(e));return f.warn("PriorityQueue.enqueue",`Duplicate item detected: ${t}`),!1}let t={item:e,insertOrder:this.insertCounter++};return this.allowDuplicate||this.itemSet.add(e),this.heap.push(t),this.heapifyUp(this.heap.length-1),!0}enqueueMany(e){return e.map(e=>this.enqueue(e))}dequeue(){let e;if(0!==this.heap.length)return 1===this.heap.length?e=this.heap.pop().item:(e=this.heap[0].item,this.heap[0]=this.heap.pop(),this.heapifyDown(0)),this.itemSet.delete(e),e}peek(){if(0!==this.heap.length)return this.heap[0].item}size(){return this.heap.length}isEmpty(){return 0===this.heap.length}clear(){this.heap.length=0,this.itemSet.clear(),this.insertCounter=0}toArray(){let e=[...this.heap];return e.sort((e,t)=>{let r=this.compare(e.item,t.item);return 0!==r?r:e.insertOrder-t.insertOrder}),e.map(e=>e.item)}}function tA(e){return new tE(e)}Symbol("__PACK__");export{$dt,$dt as defineTransform,$t,createError,dataHandler,getType,identity,isArray,isBoolean,isEmptyArray,isEmptyString,isFalse,isFalsy,isFunction,isNaN,isNull,isNullOrUndef,isNumber,isObject,isPlainNumber,isPlainObject,isPlainSymbol,isPromiseLike,isPropertyKey,isString,isSymbol,isTrue,isTruthy,isUndef,noop,throwError,throwType}from"../665.js";export{createStorageHandler}from"../893.js";export{ei as InvalidOptionsError,ea as LockAbortedError,el as LockDisposedError,es as LockRevokedError,eu as LockTimeoutError,er as NEVER_TIMEOUT,ed as ReadonlyMutationError,T as allx,P as animation,Q as conditionMerge,V as createApi,H as createApiWithMap,ee as dataMixedManager,J as defineApi,K as defineApiMap,tw as lockData,tA as priorityQueue,B as request,x as stepAnimation,I as tryCall,C as tryCallFunc,w as withResolvers};
@@ -0,0 +1,95 @@
1
+ /**
2
+ * 测试专用:全内存的 Authority / Channel / SessionStore 适配器工厂
3
+ *
4
+ * 设计目的:
5
+ * - 在 Node 环境下模拟"多 Tab 共享浏览器存储 + BroadcastChannel"的完整链路
6
+ * - 7.2 集成测试(`__test__/integration/memory-adapters.node.test.ts`)复用此工厂验证 lockData 全链路
7
+ * - 7.3 合规性测试套件(`__test__/adapters/memory-integration.node.test.ts`)复用此工厂作为"参考实现"
8
+ *
9
+ * 共享语义对齐(与默认 localStorage / BroadcastChannel / sessionStorage 实现完全一致):
10
+ * - `storage`:跨 Tab 共享的 key-value 存储(模拟 localStorage)
11
+ * - `bus`:跨 Tab 共享的消息总线(模拟 BroadcastChannel,按 channel name 分桶)
12
+ * - `sessionScope`:每个 Tab 独立的 session 存储(模拟 sessionStorage,不跨 Tab)
13
+ *
14
+ * 关键契约对齐(对齐 `src/shared/lock-data/adapters/*.ts` 的真实实现):
15
+ * - `AuthorityAdapter.subscribe`:仅响应"跨 Tab"的 write 通知;本 Tab 自己 write 不触发自己的 subscribe 回调
16
+ * (对齐原生 storage 事件:发起 write 的那个 document 不会收到自己的 storage 事件)
17
+ * - `ChannelAdapter.postMessage`:发送方不会收到自己 postMessage 的消息
18
+ * (对齐原生 BroadcastChannel 规范)
19
+ * - 订阅回调异常走 `logger.error` 隔离,不会传播到发送方,也不会污染其他订阅者
20
+ *
21
+ * 参考:RFC.md「适配器合规测试套件」章节
22
+ */
23
+ import type { AuthorityAdapter, AuthorityAdapterContext, ChannelAdapter, ChannelAdapterContext, LoggerAdapter, SessionStoreAdapter, SessionStoreAdapterContext } from '../../types';
24
+ /**
25
+ * storage 订阅者记录:每个订阅者同时携带其所属 Tab 标识 + 订阅者自己的 logger,
26
+ * 用于:
27
+ * 1. 模拟「本 Tab write 不触发本 Tab subscribe 回调」的原生 storage 事件语义
28
+ * 2. 订阅者回调异常时用**订阅者自己**注入的 logger.error 记录(异常属于订阅者代码的责任)
29
+ */
30
+ interface StorageSubscriber {
31
+ readonly tabId: symbol;
32
+ readonly logger: LoggerAdapter | undefined;
33
+ readonly onExternalUpdate: (newValue: string | null) => void;
34
+ }
35
+ /**
36
+ * 跨 Tab 共享的"浏览器环境":authority storage + channel bus
37
+ *
38
+ * 注意:每个 Tab 的 sessionScope 独立(sessionStorage 语义),故由 `createMemoryAdapters`
39
+ * 内部维护,不在 env 里共享
40
+ */
41
+ interface SharedMemoryEnv {
42
+ /** 跨 Tab 共享的 key-value 存储(模拟 localStorage) */
43
+ readonly storage: Map<string, string>;
44
+ /** 跨 Tab 共享的消息总线;key 为 channel name,value 为该 channel 上所有订阅者 */
45
+ readonly bus: Map<string, Set<ChannelSubscriber>>;
46
+ /** storage 订阅者按 key 分桶(AuthorityAdapter.subscribe 语义:仅订阅指定 key) */
47
+ readonly storageSubscribers: Map<string, Set<StorageSubscriber>>;
48
+ }
49
+ /**
50
+ * channel 订阅者记录:同样携带 Tab 标识用于模拟「postMessage 发送方不收自己消息」,
51
+ * 并携带订阅者自己的 logger 以便异常日志归属正确
52
+ */
53
+ interface ChannelSubscriber {
54
+ readonly tabId: symbol;
55
+ readonly logger: LoggerAdapter | undefined;
56
+ readonly onMessage: (message: unknown) => void;
57
+ }
58
+ /**
59
+ * 创建一个"多 Tab 共享浏览器环境"的空白容器;随后调用 `createMemoryAdapters(env)`
60
+ * 创建每个 Tab 独立的 adapter 工厂集合即可
61
+ */
62
+ declare function createSharedMemoryEnv(): SharedMemoryEnv;
63
+ /**
64
+ * 单 Tab 的三件套 adapter 工厂集合
65
+ *
66
+ * 与 `LockDataAdapters<T>` 的 `getAuthority` / `getChannel` / `getSessionStore` 字段一一对应,
67
+ * 可直接作为 `lockData({ adapters: { ...memoryAdapters, logger } })` 注入
68
+ */
69
+ interface MemoryAdapters {
70
+ readonly getAuthority: (ctx: AuthorityAdapterContext) => AuthorityAdapter;
71
+ readonly getChannel: (ctx: ChannelAdapterContext) => ChannelAdapter;
72
+ readonly getSessionStore: (ctx: SessionStoreAdapterContext) => SessionStoreAdapter;
73
+ }
74
+ /**
75
+ * 可选的 logger 注入:用于验证「回调异常走 logger.error 隔离」的合规测试
76
+ *
77
+ * 未提供时内部 silently swallow 异常(保持接口契约不向上抛)
78
+ */
79
+ interface CreateMemoryAdaptersOptions {
80
+ readonly logger?: LoggerAdapter;
81
+ }
82
+ /**
83
+ * 创建"某一个 Tab"的内存 adapter 工厂集合
84
+ *
85
+ * 同一 env 下多次调用 `createMemoryAdapters(env)` 即模拟多 Tab:
86
+ * - 各 Tab 的 authority / channel 自然通过 env 共享
87
+ * - 各 Tab 的 sessionScope 由工厂闭包内部维护,互不可见
88
+ *
89
+ * 每次调用会生成一个新的 `tabId` symbol 作为订阅者归属标识,用于:
90
+ * - authority.subscribe:过滤"本 Tab write 触发的自通知"
91
+ * - channel.postMessage:过滤"发送方自己订阅的回调"
92
+ */
93
+ declare function createMemoryAdapters(env: SharedMemoryEnv, options?: CreateMemoryAdaptersOptions): MemoryAdapters;
94
+ export type { CreateMemoryAdaptersOptions, MemoryAdapters, SharedMemoryEnv };
95
+ export { createMemoryAdapters, createSharedMemoryEnv };
@@ -0,0 +1 @@
1
+ function e(){return{storage:new Map,bus:new Map,storageSubscribers:new Map}}function r(e,a={}){let s=Symbol("lock-data.memory-adapters.tab"),o=new Map,{logger:n}=a;return{getAuthority:r=>{var a,o,l,u,i;let b;return a=e,o=s,l=r,u=n,b=(i=l.id,`authority:${i}`),{read:()=>a.storage.get(b)??null,write(e){a.storage.set(b,e),t(a,b,e,o)},remove(){a.storage.delete(b),t(a,b,null,o)},subscribe(e){let r={tabId:o,logger:u,onExternalUpdate:e},t=a.storageSubscribers.get(b)??new Set;return t.add(r),a.storageSubscribers.set(b,t),()=>{t.delete(r)}}}},getChannel:r=>{var t,a,o,l,u,i;let b,d,g;return t=e,a=s,o=r,l=n,b=(u=o.id,i=o.channel,`${u}:${i}`),d=new Set,g=!1,{postMessage(e){if(g)return;let r=t.bus.get(b);if(r){for(let t of Array.from(r))if(t.tabId!==a)try{t.onMessage(e)}catch(e){t.logger?.error("[memory-adapters] channel subscriber threw",e)}}},subscribe(e){if(g)return()=>{};let r={tabId:a,logger:l,onMessage:e},s=t.bus.get(b)??new Set;return s.add(r),t.bus.set(b,s),d.add(r),()=>{s.delete(r),d.delete(r)}},close(){if(g)return;g=!0;let e=t.bus.get(b);if(e)for(let r of d)e.delete(r);d.clear()}}},getSessionStore:e=>{var r,t;let a;return r=o,a=(t=e.id,`session:${t}`),{read:()=>r.get(a)??null,write(e){r.set(a,e)}}}}}function t(e,r,t,a){let s=e.storageSubscribers.get(r);if(s){for(let e of Array.from(s))if(e.tabId!==a)try{e.onExternalUpdate(t)}catch(r){e.logger?.error("[memory-adapters] authority subscriber threw",r)}}}export{r as createMemoryAdapters,e as createSharedMemoryEnv};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ import{LockDisposedError as e,NEVER_TIMEOUT as t,ReadonlyMutationError as n,lockData as o}from"../index.js";function a(e,t="info"){let n=document.getElementById("log"),o=new Date().toLocaleTimeString("zh-CN",{hour12:!1}),r=document.createElement("div");r.className="log-entry",r.innerHTML=`<span class="log-time">[${o}]</span> <span class="log-${t}">${e}</span>`,n.prepend(r)}function r(e){document.getElementById("last-error").textContent=e}let[s,c]=o({getValue:()=>({count:0,label:"init"}),listeners:{onCommit:e=>{a(`onCommit <span class="tag tag-rev">rev ${e.rev}</span> source=${e.source} snapshot=${JSON.stringify(e.snapshot)}`,"event"),i()},onLockStateChange:e=>{a(`onLockStateChange <span class="tag tag-phase">${e.phase}</span>`,"event"),u()},onRevoked:e=>{a(`onRevoked reason=${e.reason}`,"event")}}});function i(){document.getElementById("view-count").textContent=String(s.count),document.getElementById("view-label").textContent=s.label}function u(){document.getElementById("is-holding").textContent=String(c.isHolding)}async function d(){await c.update(e=>{e.count+=1}),i(),a(`count +1 → ${s.count}`,"success")}async function l(){await c.update(e=>{e.count-=1}),i(),a(`count -1 → ${s.count}`,"success")}async function g(){await c.replace({count:100,label:"replaced"}),i(),a(`replace → count=${s.count}, label=${s.label}`,"success")}i(),a("基础实例已创建(同步初始化)","success");let b=null,m=null;async function p(){let[e,t]=o({id:"playground-shared",getValue:()=>({counter:0})});return{view:e,actions:t}}let f=null,y=null,h=0;function $(){f&&(document.getElementById("cross-tab-value").textContent=String(f.value),document.getElementById("cross-tab-rev").textContent=String(h)),document.getElementById("cross-tab-holding").textContent=y?String(y.isHolding):"-"}let v=null,T=null,E=null;Object.assign(globalThis,{doIncrement:d,doDecrement:l,doReplace:g,doSnapshot:function(){let e=c.snapshot();a(`snapshot → ${JSON.stringify(e)}`,"info")},doWriteView:function(){try{s.count=999,a("未抛错(不应该到这里)","error")}catch(o){let e=o instanceof n,t=o instanceof Error?o.message:String(o);a(`捕获 ReadonlyMutationError: ${t} (instanceof=${e})`,e?"success":"error"),r(`ReadonlyMutationError: ${t}`)}},doDeleteView:function(){try{delete s.count,a("未抛错(不应该到这里)","error")}catch(o){let e=o instanceof n,t=o instanceof Error?o.message:String(o);a(`捕获 ReadonlyMutationError (delete): ${t}`,e?"success":"error"),r(`ReadonlyMutationError: ${t}`)}},doUseAfterDispose:async function t(){let[,t]=o({getValue:()=>({x:1})});await t.dispose();try{await t.update(e=>{e.x=2}),a("未抛错(不应该到这里)","error")}catch(o){let t=o instanceof e,n=o instanceof Error?o.message:String(o);a(`捕获 LockDisposedError: ${n} (instanceof=${t})`,t?"success":"error"),r(`LockDisposedError: ${n}`)}},doGetLock:async function e(){await c.getLock({holdTimeout:t}),u(),a(`getLock (holdTimeout=NEVER_TIMEOUT) → isHolding=${c.isHolding}`,"success")},doUpdateWhileHolding:async function e(){await c.update(e=>{e.count+=10}),i(),a(`持锁 update → count=${s.count}`,"success")},doRelease:function(){c.release(),u(),a(`release → isHolding=${c.isHolding}`,"success")},doCreateShared:async function e(){let e=await p();m=e.view,b=e.actions,document.getElementById("shared-counter").textContent=String(m.counter),a(`shared 实例已创建 id=playground-shared counter=${m.counter}`,"success")},doSharedUpdate:async function e(){b&&m?(await b.update(e=>{e.counter+=5}),document.getElementById("shared-counter").textContent=String(m.counter),a(`shared update → counter=${m.counter}`,"success")):a("请先创建 shared 实例","warn")},doSharedRead:function(){m?(document.getElementById("shared-counter").textContent=String(m.counter),a(`shared read → counter=${m.counter}`,"info")):a("请先创建 shared 实例","warn")},doSharedDispose:async function e(){b?(await b.dispose(),a("shared 实例已 dispose","success"),b=null,m=null,document.getElementById("shared-counter").textContent="-"):a("请先创建 shared 实例","warn")},doInitCrossTab:async function e(){try{let[e,t]=await o({id:"playground-cross-tab",syncMode:"storage-authority",getValue:()=>({value:0}),listeners:{onSync:e=>{h=e.rev,a(`[跨Tab] onSync rev=${e.rev} source=${e.source} snapshot=${JSON.stringify(e.snapshot)}`,"event"),$()},onCommit:e=>{h=e.rev,a(`[跨Tab] onCommit rev=${e.rev}`,"event"),$()}}});f=e,y=t,$(),a("跨 Tab 实例已初始化(打开多个 Tab 试试!)","success")}catch(t){let e=t instanceof Error?t.message:String(t);a(`跨 Tab 初始化失败: ${e}`,"error")}},doCrossTabUpdate:async function e(){y&&f?(await y.update(e=>{e.value+=1}),$(),a(`跨 Tab update → value=${f.value}`,"success")):a("请先初始化跨 Tab 实例","warn")},doCrossTabRead:function(){f?($(),a(`跨 Tab read → value=${f.value}`,"info")):a("请先初始化跨 Tab 实例","warn")},doCrossTabGetLock:async function e(){if(!y)return void a("[跨Tab] 请先初始化跨 Tab 实例","warn");try{await y.getLock({holdTimeout:t}),$(),a(`[跨Tab] getLock → isHolding=${y.isHolding}(其他 Tab 的 update 会排队等待)`,"success")}catch(t){let e=t instanceof Error?t.message:String(t);a(`[跨Tab] getLock 失败: ${e}`,"error")}},doCrossTabUpdateWhileHolding:async function e(){if(!y)return void a("[跨Tab] 请先初始化跨 Tab 实例","warn");try{await y.update(e=>{e.value+=10}),$(),a(`[跨Tab] 持锁 update → value=${f?.value}`,"success")}catch(t){let e=t instanceof Error?t.message:String(t);a(`[跨Tab] 持锁 update 失败: ${e}`,"error")}},doCrossTabRelease:function(){y?(y.release(),$(),a(`[跨Tab] release → isHolding=${y.isHolding}`,"success")):a("[跨Tab] 请先初始化跨 Tab 实例","warn")},doCrossTabDispose:async function e(){y?(await y.dispose(),a("跨 Tab 实例已 dispose","success"),f=null,y=null,document.getElementById("cross-tab-value").textContent="-",document.getElementById("cross-tab-rev").textContent="-",document.getElementById("cross-tab-holding").textContent="-"):a("请先初始化跨 Tab 实例","warn")},doCreateAbortable:function(){let[e,t]=o({getValue:()=>({count:0}),signal:(v=new AbortController).signal});T=e,E=t,document.getElementById("abortable-count").textContent=String(T.count),a("可取消实例已创建","success")},doAbortableUpdate:async function e(){if(!(E&&T))return void a("请先创建可取消实例","warn");try{await E.update(e=>{e.count+=1}),document.getElementById("abortable-count").textContent=String(T.count),a(`abortable update → count=${T.count}`,"success")}catch(t){let e=t instanceof Error?t.message:String(t);a(`abortable update 失败: ${e}`,"error")}},doAbort:function(){v?(v.abort(),a("已调用 abort(),实例等价 dispose","success")):a("请先创建可取消实例","warn")},doAbortableUpdateAfterAbort:async function t(){if(!E)return void a("请先创建可取消实例","warn");try{await E.update(e=>{e.count+=1}),a("未抛错(不应该到这里)","error")}catch(o){let t=o instanceof e,n=o instanceof Error?o.message:String(o);a(`abort 后 update 捕获 LockDisposedError: ${n} (instanceof=${t})`,t?"success":"error"),r(`LockDisposedError: ${n}`)}},clearLog:function(){document.getElementById("log").innerHTML=""}});
@@ -0,0 +1,40 @@
1
+ /**
2
+ * 默认 AuthorityAdapter 实现:基于 localStorage
3
+ *
4
+ * 职责:作为跨 Tab 权威副本的存储与订阅通道
5
+ * - read:同步读取当前 raw value
6
+ * - write:写入 raw value,捕获 QuotaExceededError 降级为 warn(允许继续运行,
7
+ * 下次 commit 再次尝试;lock-data 的后续 authority 层会依 rev 去重)
8
+ * - remove:删除当前 key
9
+ * - subscribe:订阅跨 Tab 的 `storage` 事件,仅响应同 key 且 storageArea === localStorage 的变更
10
+ *
11
+ * 能力探测:localStorage 不可用(SSR / 浏览器隐私模式 / 禁用三方 cookie)时工厂返回 null,
12
+ * 由聚合层(pickDefaultAdapters)决定是否降级或抛 InvalidOptionsError
13
+ *
14
+ * 对应 RFC.md「接口定义」「默认实现」
15
+ */
16
+ import type { AuthorityAdapter, AuthorityAdapterContext, LoggerAdapter } from '../types';
17
+ interface AuthorityFactoryDeps {
18
+ /** 由聚合层传入;用于降级 / 异常路径的统一日志 */
19
+ readonly logger: LoggerAdapter;
20
+ }
21
+ /**
22
+ * 能力探测:localStorage 是否可实际读写
23
+ *
24
+ * 仅判断 `typeof localStorage === 'object'` 不够,Safari 隐私模式下 localStorage 存在
25
+ * 但写入会抛 QuotaExceededError;此处用写-删探测法确保真的可用
26
+ */
27
+ declare function hasUsableLocalStorage(): boolean;
28
+ /**
29
+ * 构建 localStorage 权威副本的完整 key
30
+ *
31
+ * 规范:`${LOCK_PREFIX}:${id}:latest`
32
+ */
33
+ declare function buildAuthorityKey(id: string): string;
34
+ /**
35
+ * 创建默认 AuthorityAdapter
36
+ *
37
+ * @returns AuthorityAdapter 实例;localStorage 不可用时返回 null
38
+ */
39
+ declare function createDefaultAuthorityAdapter(ctx: AuthorityAdapterContext, deps: AuthorityFactoryDeps): AuthorityAdapter | null;
40
+ export { buildAuthorityKey, createDefaultAuthorityAdapter, hasUsableLocalStorage };
@@ -0,0 +1 @@
1
+ import{LOCK_PREFIX as e}from"../constants.js";function t(){try{let t=globalThis.localStorage;if(!t)return!1;let r=`${e}:__probe__`;return t.setItem(r,"1"),t.removeItem(r),!0}catch{return!1}}function r(t){return`${e}:${t}:latest`}function o(e,o){if(!t())return o.logger.warn('localStorage is not available; default authority adapter is disabled. syncMode="storage-authority" will fall back to local-only semantics.'),null;let a=r(e.id),l=globalThis.localStorage;return{read(){try{return l.getItem(a)}catch(e){return o.logger.warn("Failed to read authority snapshot from localStorage",e),null}},write(e){try{l.setItem(a,e)}catch(e){o.logger.warn("Failed to write authority snapshot to localStorage (likely QuotaExceededError); remote Tabs will not see this commit until next successful write.",e)}},remove(){try{l.removeItem(a)}catch(e){o.logger.warn("Failed to remove authority snapshot from localStorage",e)}},subscribe(e){let t=t=>{if(t.storageArea===l&&t.key===a)try{e(t.newValue)}catch(e){o.logger.error("Authority subscribe callback threw",e)}},r=globalThis;return"function"!=typeof r.addEventListener?(o.logger.warn("globalThis.addEventListener is not available; authority subscribe is noop."),()=>void 0):(r.addEventListener("storage",t),()=>{r.removeEventListener?.("storage",t)})}}}export{r as buildAuthorityKey,o as createDefaultAuthorityAdapter,t as hasUsableLocalStorage};
@@ -0,0 +1,39 @@
1
+ /**
2
+ * 默认 ChannelAdapter 实现:基于原生 BroadcastChannel
3
+ *
4
+ * 职责:跨同源 Tab / Worker 的消息广播通道
5
+ * - postMessage:发送消息;已关闭时降级为 warn,不抛错
6
+ * - subscribe:订阅 message 事件;回调异常走 logger.error 隔离
7
+ * - close:幂等关闭,后续操作全部降级 noop
8
+ *
9
+ * 能力探测:`BroadcastChannel` 不可用(SSR / 老浏览器)时工厂返回 null,
10
+ * 由聚合层决定降级路径
11
+ *
12
+ * 对应 RFC.md「接口定义」「默认实现」
13
+ */
14
+ import type { ChannelAdapter, ChannelAdapterContext, LoggerAdapter } from '../types';
15
+ interface ChannelFactoryDeps {
16
+ readonly logger: LoggerAdapter;
17
+ }
18
+ /**
19
+ * 能力探测:BroadcastChannel 是否可实例化
20
+ *
21
+ * 仅判断构造器存在还不够,某些环境(如部分 Electron 版本 / 早期 Safari)
22
+ * 构造器存在但实例化会抛错;此处用 try-catch 做真实构造探测
23
+ */
24
+ declare function hasUsableBroadcastChannel(): boolean;
25
+ /**
26
+ * 构建 BroadcastChannel 名称
27
+ *
28
+ * 规范:`${LOCK_PREFIX}:${id}:${channel}`
29
+ * - channel === 'session':session-probe / session-reply 协议通道
30
+ * - channel === 'custom':Phase 3 广播驱动等其他业务通道
31
+ */
32
+ declare function buildChannelName(id: string, channel: ChannelAdapterContext['channel']): string;
33
+ /**
34
+ * 创建默认 ChannelAdapter
35
+ *
36
+ * @returns ChannelAdapter 实例;BroadcastChannel 不可用时返回 null
37
+ */
38
+ declare function createDefaultChannelAdapter(ctx: ChannelAdapterContext, deps: ChannelFactoryDeps): ChannelAdapter | null;
39
+ export { buildChannelName, createDefaultChannelAdapter, hasUsableBroadcastChannel };
@@ -0,0 +1 @@
1
+ import{LOCK_PREFIX as e}from"../constants.js";function r(){let r=globalThis.BroadcastChannel;if("function"!=typeof r)return!1;try{return new r(`${e}:__probe__`).close(),!0}catch{return!1}}function a(r,a){return`${e}:${r}:${a}`}function n(e,n){if(!r())return n.logger.warn("BroadcastChannel is not available; default channel adapter is disabled. Cross-tab sync features may fall back to degraded mode."),null;let t=new globalThis.BroadcastChannel(a(e.id,e.channel)),l=!1;return{postMessage(e){if(l||null===t)return void n.logger.warn("postMessage on closed ChannelAdapter is ignored.");try{t.postMessage(e)}catch(e){n.logger.warn("BroadcastChannel.postMessage failed",e)}},subscribe(e){if(l||null===t)return n.logger.warn("subscribe on closed ChannelAdapter is ignored; returning noop unsubscriber."),()=>void 0;let r=r=>{try{e(r.data)}catch(e){n.logger.error("Channel subscribe callback threw",e)}};return t.addEventListener("message",r),()=>{try{t?.removeEventListener("message",r)}catch{}}},close(){if(!l){l=!0;try{t?.close()}catch(e){n.logger.warn("BroadcastChannel.close failed",e)}finally{t=null}}}}}export{a as buildChannelName,n as createDefaultChannelAdapter,r as hasUsableBroadcastChannel};
@@ -0,0 +1,58 @@
1
+ /**
2
+ * adapters 聚合入口:pickDefaultAdapters
3
+ *
4
+ * 职责:把 `options.adapters` 的用户自定义项与默认实现合并,产出"已解析"形态
5
+ * 供 Phase 3+ 消费。合并策略:用户提供 > 默认实现 > null。
6
+ *
7
+ * 输入形态(用户向):工厂函数(getXxx(ctx) => Adapter | null)+ 实例(logger)
8
+ * 输出形态(内部向):工厂保留工厂形态(延迟到使用时调用),但工厂内部自动做"用户工厂返回
9
+ * null 时降级到默认工厂"的合并;实例直接用解析好的值
10
+ *
11
+ * 设计要点:
12
+ * 1. logger 无 id 作用域 —— 直接解析为实例,内部 adapter 构造时可复用同一个 logger,
13
+ * 保证所有降级日志走用户注入的 logger
14
+ * 2. getAuthority / getChannel / getSessionStore 保留工厂形态,因为 id / channel 语义
15
+ * 要在调用点才确定
16
+ * 3. getLock 直接透传(由 Phase 3 drivers 层解释)
17
+ *
18
+ * wrapper 方案契约(与旧 clone 适配器的根本差异):
19
+ * - 历史版本曾通过 `adapters.clone`(structuredClone / 用户自定义)做深拷贝;
20
+ * wrapper 方案下统一改为 `JSON.parse(JSON.stringify(...))`(详见 utils/json-safe.ts),
21
+ * 配合 JSON-only 数据契约(顶层数组禁止 + 非 JSON-safe 类型 fail-fast)确保隔离正确性
22
+ * - 不再支持自定义 clone:用户若需保留 Set / Map / Date 等,应在业务层自行序列化为 JSON 形态
23
+ *
24
+ * 对应 RFC.md「设计原则」:用户提供 > 默认实现 > null
25
+ */
26
+ import type { AuthorityAdapter, AuthorityAdapterContext, ChannelAdapter, ChannelAdapterContext, LockDataAdapters, SessionStoreAdapter, SessionStoreAdapterContext } from '../types';
27
+ import { type ResolvedLoggerAdapter } from './logger';
28
+ /**
29
+ * 解析后的适配器集合
30
+ *
31
+ * 所有字段均为"可直接调用"形态:
32
+ * - logger:实例
33
+ * - getAuthority / getChannel / getSessionStore:工厂(返回 null 时表示能力不可用)
34
+ * - getLock:原样透传;Phase 3 的 pickDriver 决定是否使用
35
+ */
36
+ interface ResolvedAdapters<T> {
37
+ readonly logger: ResolvedLoggerAdapter;
38
+ readonly getAuthority: (ctx: AuthorityAdapterContext) => AuthorityAdapter | null;
39
+ readonly getChannel: (ctx: ChannelAdapterContext) => ChannelAdapter | null;
40
+ readonly getSessionStore: (ctx: SessionStoreAdapterContext) => SessionStoreAdapter | null;
41
+ readonly getLock: LockDataAdapters<T>['getLock'];
42
+ }
43
+ /**
44
+ * 合并用户自定义 adapters 与默认实现
45
+ *
46
+ * 合并语义:
47
+ * - logger:`userAdapters.logger` 优先;未提供时用默认 logger
48
+ * - getAuthority:用户工厂存在 → 先调用;返回非 null 直接用;返回 null 时 fallback 到默认工厂
49
+ * 用户未提供 → 直接用默认工厂
50
+ * 默认工厂也返回 null 时表示能力不可用
51
+ * - getChannel / getSessionStore:同 getAuthority
52
+ * - getLock:透传(聚合层不关心其行为)
53
+ *
54
+ * @param userAdapters 用户传入的 `options.adapters`;未传视为空
55
+ */
56
+ declare function pickDefaultAdapters<T>(userAdapters?: LockDataAdapters<T>): ResolvedAdapters<T>;
57
+ export type { ResolvedAdapters };
58
+ export { pickDefaultAdapters };
@@ -0,0 +1 @@
1
+ import{createDefaultAuthorityAdapter as t}from"./authority.js";import{createDefaultChannelAdapter as e}from"./channel.js";import{resolveLoggerAdapter as r}from"./logger.js";import{createDefaultSessionStoreAdapter as o}from"./session-store.js";function n(n){let i=n||{},l=r(i.logger),u=i.getAuthority,s=i.getChannel,f=i.getSessionStore;return{logger:l,getAuthority:e=>{if(u){let t=u(e);if(null!==t)return t}return t(e,{logger:l})},getChannel:t=>{if(s){let e=s(t);if(null!==e)return e}return e(t,{logger:l})},getSessionStore:t=>{if(f){let e=f(t);if(null!==e)return e}return o(t,{logger:l})},getLock:i.getLock}}export{n as pickDefaultAdapters};
@@ -0,0 +1,56 @@
1
+ /**
2
+ * 默认 LoggerAdapter 实现 + 用户 logger 兜底合并
3
+ *
4
+ * 委托到 `@/shared/logger` 的全局 logger(console Proxy),
5
+ * 负责把 `LoggerAdapter` 契约的 `(message, ...extras)` 形态
6
+ * 适配为 `shared/logger` 的 `(fnName, ...args)` 形态。
7
+ *
8
+ * - fnName 固定为 `ERROR_FN_NAME`(`lockData`),保证错误消息前缀一致
9
+ * - `globalThis.$lingshu$.disableLogger` 可全局关闭日志输出,无需在此额外处理
10
+ *
11
+ * 对应 RFC.md「默认实现」:默认 LoggerAdapter 委托到 shared/logger
12
+ *
13
+ * **logger 混合兜底契约(Phase 2 决策)**:
14
+ * `LoggerAdapter` 的 `warn` / `error` 为必选、`debug` 为可选。为避免下游链路
15
+ * 在调用 `logger.debug` 时需要反复 guard、且保证"用户覆盖 + 默认补全"的
16
+ * 无缝混合,`resolveLoggerAdapter` 对用户 logger 做缺失方法补全:
17
+ * - 用户 logger 存在且已实现的方法 → 原样使用(保持用户日志目的地)
18
+ * - 用户 logger 未实现的方法 → 走默认 logger(仍带 `[lockData]` 前缀)
19
+ * 输出永远是"三方法齐全"的 logger,`debug` 在下游可直接调用无需 optional chain
20
+ */
21
+ import type { LoggerAdapter } from '../types';
22
+ /**
23
+ * 必选方法齐全的 logger 内部形态
24
+ *
25
+ * 与 `LoggerAdapter` 的差异:`debug` 由可选变为必选,`resolveLoggerAdapter`
26
+ * 的产物一律满足此形态,供下游(clone / authority / channel / ...)直接调用
27
+ */
28
+ interface ResolvedLoggerAdapter extends LoggerAdapter {
29
+ debug: NonNullable<LoggerAdapter['debug']>;
30
+ }
31
+ /**
32
+ * 创建默认的 LoggerAdapter(三方法齐全)
33
+ *
34
+ * 设计要点:
35
+ * 1. 始终返回一个可用实例,不需要能力探测(console 在所有运行环境存在)
36
+ * 2. `warn` / `error` / `debug` 均委托到全局 logger,统一加 `[@cmtlyt/lingshu-toolkit#lockData]` 前缀
37
+ */
38
+ declare function createDefaultLogger(): ResolvedLoggerAdapter;
39
+ /**
40
+ * 把"用户 logger(可能部分缺失)"与"默认 logger"混合为"三方法齐全"的 logger
41
+ *
42
+ * 合并规则(字段级):
43
+ * - `warn` / `error` / `debug` 每个方法独立判定:
44
+ * - 用户 logger 的该方法是 `function` → 用用户版本(保持日志目的地)
45
+ * - 否则 → 用默认 logger 的该方法(走 shared/logger 通道,带统一前缀)
46
+ *
47
+ * 为什么不直接 `{ ...defaultLogger, ...userLogger }`:
48
+ * - 用户可能显式传 `debug: undefined`(例:从对象里 pick 字段),这会把默认
49
+ * 的 `debug` 覆盖为 `undefined`;严格按方法类型判定才能避免此类陷阱
50
+ *
51
+ * @param userLogger 用户传入的 logger(未传或为 undefined 等价于"全部走默认")
52
+ * @returns 三方法齐全的 logger;下游可直接调用 `logger.debug(...)` 无需 guard
53
+ */
54
+ declare function resolveLoggerAdapter(userLogger?: LoggerAdapter): ResolvedLoggerAdapter;
55
+ export type { ResolvedLoggerAdapter };
56
+ export { createDefaultLogger, resolveLoggerAdapter };
@@ -0,0 +1 @@
1
+ import{logger as r}from"../../logger/index.js";import{ERROR_FN_NAME as e}from"../constants.js";function n(){return{warn(n,...o){r.warn(e,n,...o)},error(n,...o){r.error(e,n,...o)},debug(n,...o){r.debug(e,n,...o)}}}function o(r){let e=n(),o=r||{};return{warn:"function"==typeof o.warn?o.warn.bind(o):e.warn,error:"function"==typeof o.error?o.error.bind(o):e.error,debug:"function"==typeof o.debug?o.debug.bind(o):e.debug}}export{n as createDefaultLogger,o as resolveLoggerAdapter};