@viceme-ai/sdk 0.3.0 → 0.6.1

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 (84) hide show
  1. package/README.md +158 -44
  2. package/dist/browser-events.d.ts +52 -0
  3. package/dist/browser-events.d.ts.map +1 -0
  4. package/dist/capability-mount.d.ts +15 -0
  5. package/dist/capability-mount.d.ts.map +1 -0
  6. package/dist/chunks/build-endpoints-NrDmg6jf.js +12 -0
  7. package/dist/chunks/build-endpoints-NrDmg6jf.js.map +1 -0
  8. package/dist/chunks/{client-DKsaEtwq.js → client-w9vih8Ng.js} +386 -349
  9. package/dist/chunks/client-w9vih8Ng.js.map +1 -0
  10. package/dist/chunks/{version-C3KVoLNb.js → errors-C7DfLKcF.js} +14 -25
  11. package/dist/chunks/errors-C7DfLKcF.js.map +1 -0
  12. package/dist/chunks/validation-patAYhXC.js +43 -0
  13. package/dist/chunks/validation-patAYhXC.js.map +1 -0
  14. package/dist/chunks/version-uPTHb89K.js +6 -0
  15. package/dist/chunks/version-uPTHb89K.js.map +1 -0
  16. package/dist/core/build-endpoints.d.ts +2 -0
  17. package/dist/core/build-endpoints.d.ts.map +1 -1
  18. package/dist/core/capabilities.d.ts +4 -2
  19. package/dist/core/capabilities.d.ts.map +1 -1
  20. package/dist/core/client.d.ts +4 -2
  21. package/dist/core/client.d.ts.map +1 -1
  22. package/dist/core/config.d.ts +1 -1
  23. package/dist/core/config.d.ts.map +1 -1
  24. package/dist/core/errors.d.ts +1 -1
  25. package/dist/core/errors.d.ts.map +1 -1
  26. package/dist/core/lifecycle.d.ts +2 -4
  27. package/dist/core/lifecycle.d.ts.map +1 -1
  28. package/dist/core/presentation.d.ts +7 -2
  29. package/dist/core/presentation.d.ts.map +1 -1
  30. package/dist/danmaku/index.d.ts +1 -0
  31. package/dist/danmaku/index.d.ts.map +1 -1
  32. package/dist/danmaku/mount.d.ts +1 -1
  33. package/dist/danmaku/mount.d.ts.map +1 -1
  34. package/dist/danmaku.js +128 -121
  35. package/dist/danmaku.js.map +1 -1
  36. package/dist/generated/public-contract.d.ts +124 -373
  37. package/dist/generated/public-contract.d.ts.map +1 -1
  38. package/dist/index.d.ts +3 -2
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +23 -21
  41. package/dist/index.js.map +1 -1
  42. package/dist/loader/attributes.d.ts +3 -2
  43. package/dist/loader/attributes.d.ts.map +1 -1
  44. package/dist/loader/auto-loader.d.ts +1 -1
  45. package/dist/loader/auto-loader.d.ts.map +1 -1
  46. package/dist/loader/events.d.ts +1 -44
  47. package/dist/loader/events.d.ts.map +1 -1
  48. package/dist/loader/registry.d.ts +2 -1
  49. package/dist/loader/registry.d.ts.map +1 -1
  50. package/dist/manifest.json +60 -35
  51. package/dist/session/session.d.ts +7 -6
  52. package/dist/session/session.d.ts.map +1 -1
  53. package/dist/testing/test-adapter.d.ts +1 -1
  54. package/dist/testing/test-adapter.d.ts.map +1 -1
  55. package/dist/testing.js +18 -17
  56. package/dist/testing.js.map +1 -1
  57. package/dist/tip/headless.d.ts +4 -0
  58. package/dist/tip/headless.d.ts.map +1 -0
  59. package/dist/tip/index.d.ts +67 -0
  60. package/dist/tip/index.d.ts.map +1 -0
  61. package/dist/tip/mount.d.ts +5 -0
  62. package/dist/tip/mount.d.ts.map +1 -0
  63. package/dist/tip/testing.d.ts +9 -0
  64. package/dist/tip/testing.d.ts.map +1 -0
  65. package/dist/tip/testing.js +43 -0
  66. package/dist/tip/testing.js.map +1 -0
  67. package/dist/tip/validation.d.ts +7 -0
  68. package/dist/tip/validation.d.ts.map +1 -0
  69. package/dist/tip.js +472 -0
  70. package/dist/tip.js.map +1 -0
  71. package/dist/transport/transport.d.ts +3 -1
  72. package/dist/transport/transport.d.ts.map +1 -1
  73. package/dist/version.d.ts +1 -1
  74. package/dist/viceme.min.js +5 -22
  75. package/dist/viceme.min.js.map +1 -1
  76. package/package.json +12 -7
  77. package/dist/bootstrap.min.js +0 -2
  78. package/dist/bootstrap.min.js.map +0 -1
  79. package/dist/chunks/client-DKsaEtwq.js.map +0 -1
  80. package/dist/chunks/version-C3KVoLNb.js.map +0 -1
  81. package/dist/loader/bootstrap.d.ts +0 -1
  82. package/dist/loader/bootstrap.d.ts.map +0 -1
  83. package/dist/loader/mount-handle.d.ts +0 -25
  84. package/dist/loader/mount-handle.d.ts.map +0 -1
@@ -1,4 +1,4 @@
1
- (function(){"use strict";const ae=new Set(["RATE_LIMITED","NETWORK_TIMEOUT","CHECKOUT_UNAVAILABLE","INTERNAL_ERROR"]);class v extends Error{code;retryable;requestId;capability;constructor(e){super(e.message),this.name="ViceMeError",this.code=e.code,this.retryable=e.retryable??ae.has(e.code),this.requestId=e.requestId,this.capability=e.capability}toJSON(){const e={code:this.code,retryable:this.retryable};return this.requestId!==void 0&&(e.requestId=this.requestId),this.capability!==void 0&&(e.capability=this.capability),e}}function ne(t){return t instanceof v}function y(t){return new v({code:"CONFIG_INVALID",message:t,retryable:!1})}function _(){return new v({code:"CLIENT_DESTROYED",message:"ViceMe client has been destroyed.",retryable:!1})}const B={cn:"https://api.viceme.cn",global:"https://api.viceme.ai"},Ze={cn:"https://viceme.cn",global:"https://viceme.ai"},oe=new Set(["cn","global"]),se={cn:B.cn,global:B.global};function ce(t){return se[t]}function H(t){return typeof t=="string"&&/^wrk_[A-Za-z0-9_-]{4,124}$/.test(t)}function W(t){return typeof t=="string"&&oe.has(t)}function le(t){if(typeof t!="object"||t===null)throw y("createViceMe expects a configuration object.");const e=t,r=new Set(["workKey","region","signal"]);for(const i of Object.keys(e))if(!r.has(i))throw y(`Unknown configuration field "${i}".`);if(!H(e.workKey))throw y('Configuration field "workKey" must be a public work key ("wrk_…").');if(!W(e.region))throw y('Configuration field "region" must be "cn" or "global".');if(e.signal!==void 0&&!(e.signal instanceof AbortSignal))throw y('Configuration field "signal" must be an AbortSignal.');return{workKey:e.workKey,region:e.region,signal:e.signal}}const de=new Set(["data-viceme-work","data-viceme-region","data-viceme-features","data-viceme-target","data-viceme-theme","data-viceme-loader"]),ue=new Set(["light","dark","auto"]);function fe(t){for(const c of t.getAttributeNames())if(c.startsWith("data-viceme-")&&!de.has(c))throw y(`Unknown loader attribute "${c}".`);const e=t.getAttribute("data-viceme-work");if(!H(e))throw y('Loader attribute "data-viceme-work" must be a public work key ("wrk_…").');const r=t.getAttribute("data-viceme-region");if(!W(r))throw y('Loader attribute "data-viceme-region" must be "cn" or "global".');if(t.getAttribute("data-viceme-features")!=="danmaku")throw y('Loader attribute "data-viceme-features" must be exactly "danmaku".');const n=["danmaku"],l=t.getAttribute("data-viceme-target");if(l==="")throw y('Loader attribute "data-viceme-target" must be a CSS selector.');if(l===null)throw y('Loader attribute "data-viceme-target" is required when features are declared.');try{t.matches(l)}catch{throw y('Loader attribute "data-viceme-target" is not a valid CSS selector.')}const a=t.getAttribute("data-viceme-theme");if(a!==null&&!ue.has(a))throw y('Loader attribute "data-viceme-theme" must be "light", "dark", or "auto".');return{workKey:e,region:r,features:n,target:l,theme:a??"auto"}}function P(t,e,r){return`v${t}+${e}+${r}`}class me{#e=new Map;#t=new Map;#r=new Map;#i=0;getClient(e){return this.#e.get(e)}registerClient(e){this.#e.set(e.clientKey,e)}unregisterClient(e){this.#e.delete(e)}getInstance(e){return this.#t.get(e)}findInstance(e,r,i){return this.#r.get(`${e}::${r}`)?.get(i)}registerInstance(e,r,i,n){const l=`${e}::${r}`;let a=this.#r.get(l);a===void 0&&(a=new WeakMap,this.#r.set(l,a));const c=a.get(i);if(c)return c;this.#i+=1;const d={instanceKey:`${e}::${r}::el${this.#i}`,clientKey:e,capability:r,host:i,raw:n,destroyed:!1};return this.#t.set(d.instanceKey,d),a.set(i,d),d}removeInstance(e){const r=this.#t.get(e);if(r)return this.#t.delete(e),this.#r.get(`${r.clientKey}::${r.capability}`)?.delete(r.host),r}instancesForClient(e){return[...this.#t.values()].filter(r=>r.clientKey===e)}}const he=new Map([["viceme:ready",new Set(["clientKey","workKey","capabilities","version"])],["viceme:capability-ready",new Set(["clientKey","instanceKey","capability","version"])],["viceme:error",new Set(["clientKey","instanceKey","capability","code","retryable","requestId"])],["viceme:destroyed",new Set(["clientKey","instanceKey","capability"])]]);function ye(t,e){const r=he.get(t),i={};for(const[n,l]of Object.entries(e))r.has(n)&&l!==void 0&&(i[n]=l);return i}function K(t,e,r){const i=new CustomEvent(e,{detail:ye(e,r),bubbles:!0,composed:!0,cancelable:!1});t.dispatchEvent(i)}const pe={CREATED:["INITIALIZING","DESTROYED"],INITIALIZING:["READY","FAILED","DESTROYED"],READY:["DEGRADED","DESTROYED"],DEGRADED:["DESTROYED"],FAILED:["INITIALIZING","DESTROYED"],DESTROYED:[]};class ge{#e="CREATED";#t=new Set;get state(){return this.#e}get destroyed(){return this.#e==="DESTROYED"}transition(e){if(e!==this.#e){if(!pe[this.#e].includes(e))throw new v({code:"INTERNAL_ERROR",message:`Illegal lifecycle transition ${this.#e} -> ${e}.`,retryable:!1});this.#e=e;for(const r of this.#t)r(e)}}assertAlive(){if(this.destroyed)throw _()}subscribe(e){return this.#t.add(e),()=>{this.#t.delete(e)}}clearListeners(){this.#t.clear()}}function be(t,e){if(typeof t!="object"||t===null)throw U();const r=t,i=r.work;if(typeof i!="object"||i===null||typeof i.key!="string"||!Array.isArray(i.capabilities)||!i.capabilities.every(l=>typeof l=="string"))throw U();if(i.key!==e)throw new v({code:"WORK_NOT_FOUND",message:"Work-session response did not match the requested work key.",retryable:!1});const n={work:{key:i.key,capabilities:i.capabilities}};return typeof r.token=="string"&&(n.token=r.token),typeof r.expiresAt=="number"&&(n.expiresAt=r.expiresAt),n}function U(){return new v({code:"INTERNAL_ERROR",message:"Malformed work-session response.",retryable:!0})}class we{#e;#t;#r;#i;constructor(e){this.#e=e,this.#t=e.now??(()=>Date.now())}get snapshot(){return this.#r}#a(){const e=this.#r?.expiresAt;return e!==void 0&&e<=this.#t()}establish(){if(this.#r){if(!this.#a())return Promise.resolve(this.#r);this.#r=void 0}return this.#i??=this.#e.transport.request({method:"POST",path:"/v1/public/v1/work-sessions",body:{workKey:this.#e.workKey},signal:this.#e.signal,timeoutMs:this.#e.timeoutMs}).then(e=>{const r=be(e.body,this.#e.workKey);return this.#r=r,r}).finally(()=>{this.#i=void 0}),this.#i}async request(e){const r=await this.establish();if(!r.token)throw U();try{return await this.#e.transport.request({...e,authorization:r.token,signal:this.#e.signal})}catch(i){if(!(i instanceof v)||i.code!=="SESSION_EXPIRED")throw i;this.#r===r&&this.invalidate();const n=await this.establish();if(!n.token)throw U();return this.#e.transport.request({...e,authorization:n.token,signal:this.#e.signal})}}authenticate(e){if(!this.#r)throw U();this.#r={...this.#r,token:e.token,expiresAt:e.expiresAt,user:e.user}}async signOut(){this.invalidate(),await this.establish()}invalidate(){this.#r=void 0}destroy(){this.invalidate(),this.#i=void 0}}const Y="0.3.0",x=1,F="viceme-access-layer",j=50;function ve(t){switch(t){case"SIGN_IN":return{description:"",label:"授权"};case"CHECKOUT":return{description:"",label:"重新打开"}}}function Ee(t){if(!ne(t))return"操作未完成,请重试。";switch(t.code){case"CONFIG_INVALID":return"微信授权配置无效,请稍后重试。";case"AUTH_CANCELLED":return"微信授权已取消,请重试。";case"SESSION_EXPIRED":return"授权会话已过期,请重试。";case"NETWORK_TIMEOUT":return"网络连接超时,请重试。";default:return t.requestId?`操作未完成,请重试。请求 ID:${t.requestId}`:"操作未完成,请重试。"}}function Ie(){if(customElements.get(F))return;class t extends HTMLElement{interaction;connectedCallback(){const r=ve(this.interaction.action),i=this.attachShadow({mode:"open"});i.innerHTML=`
1
+ (function(){"use strict";const ne=new Set(["RATE_LIMITED","NETWORK_TIMEOUT","CHECKOUT_UNAVAILABLE","INTERNAL_ERROR"]);class g extends Error{code;retryable;requestId;capability;constructor(e){super(e.message),this.name="ViceMeError",this.code=e.code,this.retryable=e.retryable??ne.has(e.code),this.requestId=e.requestId,this.capability=e.capability}toJSON(){const e={code:this.code,retryable:this.retryable};return this.requestId!==void 0&&(e.requestId=this.requestId),this.capability!==void 0&&(e.capability=this.capability),e}}function ae(t){return t instanceof g}function y(t){return new g({code:"CONFIG_INVALID",message:t,retryable:!1})}function D(){return new g({code:"CLIENT_DESTROYED",message:"ViceMe client has been destroyed.",retryable:!1})}const G={cn:"https://api.viceme.cn",global:"https://api.viceme.ai"},oe={cn:"https://viceme.cn",global:"https://viceme.ai"},se=new Set(["cn","global"]),ce={cn:G.cn,global:G.global};function le(t){return ce[t]}function H(t){return typeof t=="string"&&/^wrk_(?:test|live)_[A-Za-z0-9_-]{4,119}$/.test(t)}function z(t){return typeof t=="string"&&se.has(t)}function de(t){if(typeof t!="object"||t===null)throw y("createViceMe expects a configuration object.");const e=t,r=new Set(["workKey","region","signal"]);for(const i of Object.keys(e))if(!r.has(i))throw y(`Unknown configuration field "${i}".`);if(!H(e.workKey))throw y('Configuration field "workKey" must start with "wrk_test_" or "wrk_live_".');if(!z(e.region))throw y('Configuration field "region" must be "cn" or "global".');if(e.signal!==void 0&&!(e.signal instanceof AbortSignal))throw y('Configuration field "signal" must be an AbortSignal.');return{workKey:e.workKey,region:e.region,signal:e.signal}}const ue=new Set(["data-viceme-work","data-viceme-region","data-viceme-features","data-viceme-target","data-viceme-theme","data-viceme-loader"]),fe=new Set(["light","dark","auto"]),Y=["danmaku","tip"];function me(t){for(const b of t.getAttributeNames())if(b.startsWith("data-viceme-")&&!ue.has(b))throw y(`Unknown loader attribute "${b}".`);const e=t.getAttribute("data-viceme-work");if(!H(e))throw y('Loader attribute "data-viceme-work" must be a public Work key.');const r=t.getAttribute("data-viceme-region");if(!z(r))throw y('Loader attribute "data-viceme-region" must be "cn" or "global".');const i=t.getAttribute("data-viceme-features"),a=i?.split(",")??[],f=new Set(a);if(!i||/\s/.test(i)||a.length!==f.size||a.some(b=>!Y.includes(b)))throw y('Loader attribute "data-viceme-features" must contain each of "danmaku" and "tip" at most once.');const n=Y.filter(b=>f.has(b)),o=t.getAttribute("data-viceme-target");if(o==="")throw y('Loader attribute "data-viceme-target" must be a CSS selector.');if(o===null)throw y('Loader attribute "data-viceme-target" is required when features are declared.');try{t.matches(o)}catch{throw y('Loader attribute "data-viceme-target" is not a valid CSS selector.')}const d=t.getAttribute("data-viceme-theme");if(d!==null&&!fe.has(d))throw y('Loader attribute "data-viceme-theme" must be "light", "dark", or "auto".');return{workKey:e,region:r,features:n,target:o,theme:d??"auto"}}function F(t,e,r){return`v${t}+${e}+${r}`}class he{#e=new Map;#t=new Map;#r=new Map;#i=0;getClient(e){return this.#e.get(e)}registerClient(e){this.#e.set(e.clientKey,e)}unregisterClient(e){this.#e.delete(e)}getInstance(e){return this.#t.get(e)}findInstance(e,r,i){return this.#r.get(`${e}::${r}`)?.get(i)}registerInstance(e,r,i,a){const f=`${e}::${r}`;let n=this.#r.get(f);n===void 0&&(n=new WeakMap,this.#r.set(f,n));const o=n.get(i);if(o)return o;this.#i+=1;const d={instanceKey:`${e}::${r}::el${this.#i}`,clientKey:e,capability:r,host:i,raw:a,destroyed:!1};return this.#t.set(d.instanceKey,d),n.set(i,d),d}removeInstance(e){const r=this.#t.get(e);if(r)return this.#t.delete(e),this.#r.get(`${r.clientKey}::${r.capability}`)?.delete(r.host),r}instancesForClient(e){return[...this.#t.values()].filter(r=>r.clientKey===e)}}const ye=new Map([["viceme:ready",new Set(["clientKey","workKey","capabilities","version"])],["viceme:capability-ready",new Set(["clientKey","instanceKey","capability","version"])],["viceme:error",new Set(["clientKey","instanceKey","capability","code","retryable","requestId"])],["viceme:destroyed",new Set(["clientKey","instanceKey","capability"])],["viceme:widget-close",new Set(["workId"])],["viceme:tip-paid",new Set(["status","work","amountCents","currency"])]]);function pe(t,e){if(t==="viceme:tip-paid"){const a=e;return{status:a.status,work:{id:a.work.id,title:a.work.title},amountCents:a.amountCents,currency:a.currency}}const r=ye.get(t),i={};for(const[a,f]of Object.entries(e))r.has(a)&&f!==void 0&&(i[a]=f);return i}function K(t,e,r){const i=new CustomEvent(e,{detail:pe(e,r),bubbles:!0,composed:!0,cancelable:!1});t.dispatchEvent(i)}const we={CREATED:["READY","DESTROYED"],READY:["DEGRADED","DESTROYED"],DEGRADED:["DESTROYED"],DESTROYED:[]};class ge{#e="CREATED";#t=new Set;get state(){return this.#e}get destroyed(){return this.#e==="DESTROYED"}transition(e){if(e!==this.#e){if(!we[this.#e].includes(e))throw new g({code:"INTERNAL_ERROR",message:`Illegal lifecycle transition ${this.#e} -> ${e}.`,retryable:!1});this.#e=e;for(const r of this.#t)r(e)}}assertAlive(){if(this.destroyed)throw D()}subscribe(e){return this.#t.add(e),()=>{this.#t.delete(e)}}clearListeners(){this.#t.clear()}}function be(t,e){if(typeof t!="object"||t===null)throw x();const r=t;if(typeof r.workKey!="string"||!Array.isArray(r.capabilities)||!r.capabilities.every(a=>typeof a=="string"))throw x();if(r.workKey!==e)throw new g({code:"WORK_NOT_FOUND",message:"Work-session response did not match the requested work key.",retryable:!1});const i={work:{key:r.workKey,capabilities:r.capabilities}};if(typeof r.token=="string"&&(i.token=r.token),typeof r.expiresAt=="string"){const a=new Date(r.expiresAt).getTime();Number.isNaN(a)||(i.expiresAt=a)}return i}function x(){return new g({code:"INTERNAL_ERROR",message:"Malformed work-session response.",retryable:!0})}class ve{#e;#t;#r;#i;constructor(e){this.#e=e,this.#t=e.now??(()=>Date.now())}get snapshot(){return this.#r}#n(){const e=this.#r?.expiresAt;return e!==void 0&&e<=this.#t()}establish(){if(this.#r){if(!this.#n())return Promise.resolve(this.#r);this.#r=void 0}return this.#i??=this.#e.transport.request({method:"POST",path:"/v1/public/work-sdk/sessions",body:{workKey:this.#e.workKey},signal:this.#e.signal,timeoutMs:this.#e.timeoutMs}).then(e=>{const r=be(e.body,this.#e.workKey);return this.#r=r,r}).finally(()=>{this.#i=void 0}),this.#i}async request(e){const r=await this.establish();if(!r.token)throw x();try{return await this.#e.transport.request({...e,authorization:r.token,userAuthorization:r.userToken,signal:this.#e.signal})}catch(i){if(!(i instanceof g)||i.code!=="SESSION_EXPIRED")throw i;this.#r===r&&this.invalidate();const a=await this.establish();if(!a.token)throw x();return this.#e.transport.request({...e,authorization:a.token,userAuthorization:a.userToken,signal:this.#e.signal})}}authenticate(e){if(!this.#r)throw x();this.#r={...this.#r,userToken:e.userToken,user:e.user}}async signOut(){this.invalidate(),await this.establish()}invalidate(){this.#r=void 0}destroy(){this.invalidate(),this.#i=void 0}}const Q="0.6.1",M=1,$="viceme-access-layer",j=50;function Ee(t){switch(t){case"SIGN_IN":return{description:"",label:"授权"};case"FOLLOW":return{description:"",label:"关注"};case"CHECKOUT":return{description:"",label:"打开支付"}}}function Ie(t){if(!ae(t))return"操作未完成,请重试。";switch(t.code){case"CONFIG_INVALID":return"微信授权配置无效,请稍后重试。";case"AUTH_CANCELLED":return"微信授权已取消,请重试。";case"SESSION_EXPIRED":return"授权会话已过期,请重试。";case"NETWORK_TIMEOUT":return"网络连接超时,请重试。";default:return t.requestId?`操作未完成,请重试。请求 ID:${t.requestId}`:"操作未完成,请重试。"}}function ke(){if(customElements.get($))return;class t extends HTMLElement{interaction;connectedCallback(){const r=Ee(this.interaction.action),i=this.attachShadow({mode:"open"});i.innerHTML=`
2
2
  <style>
3
3
  :host {
4
4
  position: fixed;
@@ -104,25 +104,6 @@
104
104
  font-size: 0.875rem;
105
105
  }
106
106
  [data-viceme='profile-header'] { min-width: 0; }
107
- [data-viceme='profile-covers'] {
108
- display: none;
109
- grid-template-columns: repeat(2, minmax(0, 1fr));
110
- gap: 0.75rem;
111
- margin-top: 1.25rem;
112
- border-radius: 0.875rem;
113
- padding: 0.75rem;
114
- background: #f4f4f5;
115
- }
116
- [data-viceme='profile-covers'][data-visible='true'] { display: grid; }
117
- [data-viceme='profile-cover'] {
118
- display: block;
119
- width: 100%;
120
- aspect-ratio: 16 / 9;
121
- border: 1px solid #e4e4e7;
122
- border-radius: 0.625rem;
123
- object-fit: cover;
124
- background: #ffffff;
125
- }
126
107
  [data-viceme='panel'][data-action='SIGN_IN'] [data-viceme='description'] { display: none; }
127
108
  [data-viceme='panel'][data-action='SIGN_IN'] [data-viceme='profile'][data-visible='true'] {
128
109
  display: block;
@@ -198,6 +179,9 @@
198
179
  }
199
180
  [data-viceme='panel'][data-frame='true'] { width: min(30rem, 100%); }
200
181
  [data-viceme='panel'][data-action='SIGN_IN'] { width: min(30rem, 100%); }
182
+ [data-viceme='panel'][data-action='CHECKOUT'][data-frame='true'] {
183
+ width: min(42rem, 100%);
184
+ }
201
185
  }
202
186
  @media (prefers-reduced-motion: no-preference) {
203
187
  [data-viceme='panel'] { animation: viceme-enter 160ms ease-out; }
@@ -220,7 +204,6 @@
220
204
  </div>
221
205
  </div>
222
206
  <p data-viceme="profile-description"></p>
223
- <div data-viceme="profile-covers" aria-label="作品封面"></div>
224
207
  </section>
225
208
  <p data-viceme="error" role="alert" aria-live="polite"></p>
226
209
  <div data-viceme="actions">
@@ -229,5 +212,5 @@
229
212
  </div>
230
213
  <iframe data-viceme="frame" title="" referrerpolicy="no-referrer" allow="payment"></iframe>
231
214
  </section>
232
- `;const n=i.querySelector("[data-viceme='panel']");n.dataset.action=this.interaction.action,n.dataset.frame=String(this.interaction.action==="CHECKOUT");const l=i.querySelector("[data-viceme='description']");l.textContent=r.description;const a=i.querySelector("[data-viceme='action']"),c=a.parentElement,d=i.querySelector("[data-viceme='close']"),I=i.querySelector("[data-viceme='backdrop']"),k=i.querySelector("[data-viceme='error']"),o=i.querySelector("[data-viceme='frame']"),N=i.querySelector("[data-viceme='profile']"),s=i.querySelector("[data-viceme='avatar']"),u=i.querySelector("[data-viceme='avatar-fallback']"),f=i.querySelector("[data-viceme='profile-name']"),p=i.querySelector("[data-viceme='profile-description']"),h=i.querySelector("[data-viceme='profile-stats']"),A=i.querySelector("[data-viceme='profile-covers']");a.textContent=r.label,a.hidden=this.interaction.action==="CHECKOUT",c.dataset.single="true";const S=r.label;o.title=this.interaction.action==="SIGN_IN"?"微信授权":"支付";const b=this.interaction.followTarget;if(b){n.setAttribute("aria-label",this.interaction.action==="SIGN_IN"?`授权 ${b.displayName}`:`关注 ${b.displayName}`),N.dataset.visible="true",f.textContent=b.displayName;const m=[...b.description??""];if(p.textContent=m.length>j?`${m.slice(0,j).join("")}…`:m.join(""),m.length>j&&(p.title=b.description),h.textContent=`${b.workCount} 个作品`,b.coverUrls.length===0)A.remove();else{for(const[M,L]of b.coverUrls.entries()){const D=document.createElement("img");D.dataset.viceme="profile-cover",D.src=L,D.alt=`${b.displayName}的作品封面 ${M+1}`,A.append(D)}A.dataset.visible="true"}u.textContent=b.displayName.trim().slice(0,1)||"V",b.avatarUrl&&(s.src=b.avatarUrl,s.alt=`${b.displayName}的头像`,s.hidden=!1,u.hidden=!0)}let R=null;const q=m=>{this.dispatchEvent(new CustomEvent("viceme:access-layer-close",{detail:m}))},C=()=>{R?.cancel(),q("dismissed")};I.addEventListener("click",C),d.addEventListener("click",C),this.addEventListener("keydown",m=>{if(m.key==="Escape"&&C(),m.key==="Tab"){if(m.preventDefault(),R){o.focus();return}const L=[d,...a.hidden?[]:[a]].filter(ie=>!ie.disabled&&!ie.hidden);if(L.length===0)return;const D=L.indexOf(i.activeElement),Qe=m.shiftKey?-1:1;L[(D+Qe+L.length)%L.length]?.focus()}});const O=async()=>{a.disabled=!0,a.setAttribute("aria-busy","true"),a.textContent="正在打开…",k.textContent="";try{const m=await this.interaction.perform();if(m.type==="frame"){if(R=m,this.interaction.action==="SIGN_IN"){const M=n.getBoundingClientRect().height;M>0&&(n.style.height=`${M}px`)}n.dataset.frame="true",o.src=m.url,o.focus(),await m.completion}q("acted")}catch(m){R?.cancel(),R=null,n.dataset.frame="false",o.removeAttribute("src"),k.textContent=Ee(m),a.hidden=!1,a.disabled=!1,a.removeAttribute("aria-busy"),a.textContent=S,a.focus()}};a.addEventListener("click",O),this.interaction.action==="CHECKOUT"?queueMicrotask(()=>{O()}):queueMicrotask(()=>a.focus())}}customElements.define(F,t)}const $=async t=>{if(typeof document>"u"||typeof customElements>"u")return"dismissed";Ie();const e=document.createElement(F);e.interaction=t;const r=document.documentElement.style.overflow,i=document.activeElement instanceof HTMLElement?document.activeElement:null;document.documentElement.style.overflow="hidden",document.body.append(e);try{return await new Promise(n=>{e.addEventListener("viceme:access-layer-close",l=>n(l.detail),{once:!0})})}finally{e.remove(),document.documentElement.style.overflow=r,i?.focus()}};function E(t){if(typeof t!="object"||t===null)throw w();return t}function w(){return new v({code:"INTERNAL_ERROR",message:"Malformed public API response.",retryable:!0})}function Ae(t){const e=E(t);if(typeof e.subject!="string"||!(typeof e.nickname=="string"||e.nickname===null)||!(typeof e.avatarUrl=="string"||e.avatarUrl===null))throw w();return{subject:e.subject,nickname:e.nickname,avatarUrl:e.avatarUrl}}function z(t){const e=E(t);if(typeof e.following!="boolean"||!(typeof e.followedAt=="string"||e.followedAt===null))throw w();const r=E(e.target);if(!(r.kind==="CREATOR"||r.kind==="USER")||typeof r.displayName!="string"||!(typeof r.avatarUrl=="string"||r.avatarUrl===null)||!(typeof r.description=="string"||r.description===null)||!Number.isInteger(r.workCount)||r.workCount<0||!Array.isArray(r.coverUrls)||r.coverUrls.length>2||!r.coverUrls.every(i=>typeof i=="string"))throw w();return{following:e.following,followedAt:e.followedAt,target:{kind:r.kind,displayName:r.displayName,avatarUrl:r.avatarUrl,description:r.description,workCount:r.workCount,coverUrls:r.coverUrls}}}function ke(t){const e=E(t),r=new Set(["OWNER","FOLLOWING","PURCHASED","ENTITLED","AUTH_REQUIRED","FOLLOW_REQUIRED","PURCHASE_REQUIRED","FEATURE_NOT_FOUND","FEATURE_DISABLED","POLICY_UNSUPPORTED"]),i=new Set([null,"SIGN_IN","FOLLOW","CHECKOUT"]);if(typeof e.allowed!="boolean"||typeof e.reason!="string"||!r.has(e.reason)||!i.has(e.nextAction))throw w();return{allowed:e.allowed,reason:e.reason,nextAction:e.nextAction}}function Se(t){const e=E(t),r=E(e.policy);if(typeof e.featureKey!="string"||!/^[a-z][a-z0-9_-]{1,63}$/.test(e.featureKey)||typeof e.title!="string"||e.title.trim().length===0||e.title.length>120||!(r.type==="PUBLIC"||r.type==="FOLLOW_OWNER"||r.type==="WORK_ENTITLEMENT"))throw w();const i=e.price===null?null:E(e.price);if(i!==null&&(!Number.isInteger(i.amountCents)||i.amountCents<=0||i.currency!=="CNY")||r.type==="WORK_ENTITLEMENT"!=(i!==null))throw w();return{featureKey:e.featureKey,title:e.title,policy:{type:r.type},price:i===null?null:{amountCents:i.amountCents,currency:"CNY"}}}function Q(t){if(typeof t!="string")throw w();try{const e=new URL(t).origin;if(e!==t)throw w();return e}catch(e){throw e instanceof v?e:w()}}function Z(){const t=crypto.getRandomValues(new Uint8Array(32));return Te(t)}function Te(t){let e="";for(const r of t)e+=String.fromCharCode(r);return btoa(e).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function Ne(){return typeof document<"u"&&document.documentElement.lang.toLowerCase()==="en-us"?"en-US":"zh-CN"}function Re(t){const e=async(s,u)=>{const f=E((await t.session.request({method:"POST",path:"/v1/public/v1/auth/exchange",body:{code:s,codeVerifier:u}})).body);if(typeof f.token!="string"||typeof f.expiresAt!="number")throw w();const p=Ae(f.user);return t.session.authenticate({token:f.token,expiresAt:f.expiresAt,user:p}),{authenticated:!0,user:p}},r=()=>new v({code:"AUTH_CANCELLED",message:"The interactive action was cancelled.",retryable:!1}),i=(s,u,f,p,h)=>{if(typeof window>"u")throw new v({code:"CONFIG_INVALID",message:"Interactive access requires a browser window.",retryable:!1});let A=!0,S,b;const R=()=>{A&&(A=!1,window.removeEventListener("message",C))},q=new Promise((O,m)=>{S=O,b=m}),C=O=>{if(!A||O.origin!==u||typeof O.data!="object"||O.data===null)return;const m=O.data;if(!(m.workKey!==t.workKey||m.channel!==f)){if(m.type===`viceme:${p}:cancelled`){R(),b(r());return}m.type===`viceme:${p}:complete`&&(R(),h(m).then(S,b))}};return window.addEventListener("message",C),{type:"frame",url:s,completion:q,cancel(){R(),S()}}},n=async s=>{await t.ready();const u=Z(),f=await t.session.request({method:"POST",path:"/v1/public/v1/auth/wechat/authorize",body:{channel:u,clientType:"pc",locale:Ne()}}),p=E(f.body);if(typeof p.authorizationUrl!="string")throw w();return i(p.authorizationUrl,Q(p.completionOrigin),u,"auth",async h=>{if(typeof h.code!="string"||typeof h.codeVerifier!="string")throw w();await e(h.code,h.codeVerifier),await s?.()})},l=async()=>(await t.ready(),z((await t.session.request({method:"GET",path:"/v1/public/v1/follow"})).body)),a=async s=>(await t.ready(),z((await t.session.request({method:s,path:"/v1/public/v1/follow"})).body)),c={async getState(){await t.ready();const s=t.session.snapshot?.user??null;return{authenticated:s!==null,user:s}},async signIn(){const s=t.presenter??$,u=(await l()).target;if(await s({featureKey:"auth",reason:"AUTH_REQUIRED",action:"SIGN_IN",followTarget:u,perform:()=>n(async()=>{await a("PUT")})})==="dismissed")throw r();return this.getState()},async signOut(){await t.ready(),await t.session.signOut()}},d={getState:l,follow:()=>a("PUT"),unfollow:()=>a("DELETE")},I=async s=>{await t.ready();const u=E((await t.session.request({method:"POST",path:"/v1/public/v1/access/check",body:{featureKeys:s}})).body),f=E(u.decisions);return Object.fromEntries(Object.entries(f).map(([p,h])=>[p,ke(h)]))},k=async(s,u={})=>{await t.ready();const f=Z(),p={featureKey:s,locale:u.locale??"zh-CN",channel:f},h=E((await t.session.request({method:"POST",path:"/v1/public/v1/checkout/sessions",body:p})).body);if(typeof h.checkoutUrl!="string"||typeof h.alreadyOwned!="boolean")throw w();const A=Q(h.completionOrigin),S={checkoutUrl:h.checkoutUrl,alreadyOwned:h.alreadyOwned};return{result:S,action:S.alreadyOwned?{type:"completed"}:i(S.checkoutUrl,A,f,"checkout",async()=>{})}};return{auth:c,follow:d,access:{async getFeatures(){await t.ready();const s=E((await t.session.request({method:"GET",path:"/v1/public/v1/access/features"})).body);if(!Array.isArray(s.features)||s.features.length>100)throw w();return s.features.map(Se)},async check(s){const f=(await I([s]))[s];if(!f)throw w();return f},checkMany:I,async require(s){let u=await this.check(s);const f=t.presenter??$;for(let p=0;!u.allowed&&u.nextAction&&p<3;p+=1){const h=u.nextAction;if(h==="FOLLOW"){await d.follow(),u=await this.check(s);continue}const A=h==="SIGN_IN"?(await d.getState()).target:void 0;if(await f({featureKey:s,reason:u.reason,action:h,...A?{followTarget:A}:{},perform:async()=>h==="SIGN_IN"?n(async()=>{await d.follow()}):(await k(s)).action})==="dismissed")return u;u=await this.check(s)}return u},async refresh(){await t.ready()}},checkout:{async open(s){const u=t.presenter??$;let f;if(await u({featureKey:s.featureKey,reason:"PURCHASE_REQUIRED",action:"CHECKOUT",perform:async()=>{const h=await k(s.featureKey,s);return f=h.result,h.action}})==="dismissed"||!f)throw r();return f}}}}function X(t){t instanceof J&&t.markDegraded()}class Oe extends DOMException{constructor(){super("ViceMe client destroyed.","AbortError")}}class J{#e=new ge;#t;#r;#i=new AbortController;#a;auth;access;checkout;#n;constructor(e){this.#r=e.config,this.#t=new we({workKey:e.config.workKey,transport:e.transport,signal:this.#i.signal,...e.now!==void 0?{now:e.now}:{}});const r=Re({session:this.#t,workKey:e.config.workKey,presenter:e.presenter,ready:()=>this.ready()});this.auth=r.auth,this.access=r.access,this.checkout=r.checkout;const i=e.config.signal;if(i){const n=()=>{this.#i.abort(i.reason instanceof Error?i.reason:new DOMException("Caller signal aborted.","AbortError"))};i.aborted?n():(i.addEventListener("abort",n,{once:!0}),this.#n=()=>{i.removeEventListener("abort",n)})}}get version(){return Y}get workKey(){return this.#r.workKey}get region(){return this.#r.region}get state(){return this.#e.state}get apiMajor(){return x}ready(){return this.#e.destroyed?Promise.reject(_()):(this.#a??=this.#o(),this.#a)}async#o(){if(this.#e.destroyed)throw _();this.#e.transition("INITIALIZING");try{if(await this.#t.establish(),this.#e.destroyed)throw _();this.#e.transition("READY")}catch(e){throw this.#e.destroyed?_():(this.#e.transition("FAILED"),this.#a=void 0,this.#t.invalidate(),e)}}hasCapability(e){if(this.#e.destroyed)return!1;const r=this.#t.snapshot?.work.capabilities;return r!==void 0&&r.includes(e)}get capabilities(){return this.#t.snapshot?.work.capabilities??[]}markDegraded(){this.#e.state==="READY"&&this.#e.transition("DEGRADED")}get sessionSnapshot(){return this.#t.snapshot}destroy(){this.#e.destroyed||(this.#e.transition("DESTROYED"),this.#i.abort(new Oe),this.#t.destroy(),this.#e.clearListeners(),this.#a=void 0,this.#n?.(),this.#n=void 0)}}const Le=1e4,Ce=new Map([[400,"CONFIG_INVALID"],[401,"SESSION_EXPIRED"],[403,"CAPABILITY_DISABLED"],[404,"WORK_NOT_FOUND"],[409,"CONFIG_INVALID"],[422,"CONFIG_INVALID"],[429,"RATE_LIMITED"]]),De=new Set(["CONFIG_INVALID","WORK_NOT_FOUND","CAPABILITY_DISABLED","SESSION_EXPIRED","AUTH_REQUIRED","AUTH_CANCELLED","RETURN_URL_NOT_ALLOWED","RATE_LIMITED","NETWORK_TIMEOUT","CHECKOUT_UNAVAILABLE","INTERNAL_ERROR"]);function _e(t){if(typeof t!="object"||t===null)return{};const e=t,r=typeof e.error=="object"&&e.error!==null?e.error:e,i={};return typeof r.code=="string"&&De.has(r.code)&&(i.code=r.code),typeof r.message=="string"&&(i.message=r.message.slice(0,200)),typeof r.retryable=="boolean"&&(i.retryable=r.retryable),typeof r.requestId=="string"&&(i.requestId=r.requestId),i}function Ue(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`req-${Math.random().toString(36).slice(2)}`}class xe{#e;#t;#r;#i;constructor(e){this.#e=e.apiBaseUrl.replace(/\/+$/,""),this.#t=e.fetchImpl??globalThis.fetch.bind(globalThis),this.#r=e.defaultTimeoutMs??Le,this.#i=e.generateRequestId??Ue}async request(e){if(e.signal?.aborted)throw this.#a(e.signal);const r=e.timeoutMs??this.#r,i=new AbortController;let n=!1;const l=setTimeout(()=>{n=!0,i.abort(new ee)},r),a=()=>i.abort(new ee(!1));e.signal?.addEventListener("abort",a,{once:!0});const c=this.#i();try{const d=await this.#t(`${this.#e}${e.path}`,{method:e.method,credentials:"omit",mode:"cors",headers:{"content-type":"application/json","x-client-request-id":c,...e.authorization!==void 0?{authorization:`Bearer ${e.authorization}`}:{}},body:e.body!==void 0?JSON.stringify(e.body):void 0,signal:i.signal});let I;try{I=await d.json()}catch(o){if(e.signal?.aborted||n)throw o;I=void 0}const k=d.headers.get("x-request-id")??void 0;if(!d.ok){const o=_e(I),N=o.code??Ce.get(d.status)??"INTERNAL_ERROR";throw new v({code:N,message:o.message??"Public API request failed.",retryable:o.retryable,requestId:o.requestId??k})}return{status:d.status,body:I,requestId:k}}catch(d){throw e.signal?.aborted?this.#a(e.signal):n?new v({code:"NETWORK_TIMEOUT",message:"Public API request timed out.",retryable:!0,requestId:c}):d instanceof v?d:d instanceof DOMException&&d.name==="AbortError"?new DOMException("ViceMe request aborted by caller.","AbortError"):new v({code:"INTERNAL_ERROR",message:"Public API request failed.",retryable:!0,requestId:c})}finally{clearTimeout(l),e.signal?.removeEventListener("abort",a)}}#a(e){return e.reason instanceof Error?e.reason:new DOMException("ViceMe request aborted by caller.","AbortError")}}function Me(t){return new xe(t)}class ee extends DOMException{constructor(e=!0){super(e?"ViceMe request timed out.":"ViceMe request aborted.","AbortError")}}function Ke(t){const e=le(t),r=ce(e.region),i=Me({apiBaseUrl:r});return new J({config:e,transport:i})}const qe=8e3,Pe="danmaku.js",te=Symbol.for("viceme.loader.state.v1");function g(){const e=globalThis[te];if(e)return e;const r={registry:new me,queue:{current:Promise.resolve()}};return Object.defineProperty(globalThis,te,{value:r,writable:!0,configurable:!0,enumerable:!1}),r}function G(t){if(!t.destroyed){t.destroyed=!0,g().registry.removeInstance(t.instanceKey);try{t.raw.destroy()}finally{K(t.host,"viceme:destroyed",{clientKey:t.clientKey,instanceKey:t.instanceKey,capability:t.capability})}}}function Fe(t){return{instanceKey:t.instanceKey,capability:t.capability,destroy:()=>G(t)}}function V(t,e,r){Object.defineProperty(t,e,{value:r,writable:!0,configurable:!0,enumerable:!1})}function je(t){let r=globalThis.ViceMe;r||(r={},V(globalThis,"ViceMe",r));let i=r.versions;i||(i={},V(r,"versions",i));const n=i[`v${x}`];if(n)return n;const l={version:t,whenReady(a){const c=g().registry.getClient(a);return c?c.ready.then(()=>c.client):Promise.reject(y(`Unknown clientKey "${a}".`))},getInstance(a){const c=g().registry.getInstance(a);return c?Fe(c):void 0},destroyInstance(a){const c=g().registry.getInstance(a);c&&G(c)},destroyClient(a){for(const d of g().registry.instancesForClient(a))G(d);const c=g().registry.getClient(a);g().registry.unregisterClient(a),c?.client.destroy()}};return V(i,`v${x}`,l),l}function $e(){return document.readyState!=="loading"?Promise.resolve():new Promise(t=>{document.addEventListener("DOMContentLoaded",()=>t(),{once:!0})})}async function Ge(t){let e;try{e=await Ve(t)}catch{e={ok:!1,status:0}}return{manifest:await Be(e),baseUrl:t}}function Ve(t){const e=typeof AbortSignal<"u"&&typeof AbortSignal.timeout=="function"?AbortSignal.timeout(qe):void 0;return fetch(t,{credentials:"omit",signal:e})}async function Be(t){if(!t.ok)throw y(`Release manifest is not available (HTTP ${t.status}).`);const e=await t.json();if(typeof e!="object"||e===null||typeof e.version!="string"||typeof e.apiMajor!="number"||typeof e.features!="object"||e.features===null)throw y("Release manifest is malformed.");const r=e;if(r.version!==Y)throw y("Release manifest version does not match this loader.");if(r.apiMajor!==x)throw y("Release manifest major version does not match this loader.");const i=Object.keys(r.features);if(i.length!==1||i[0]!=="danmaku"||r.features.danmaku!==Pe)throw y("Release manifest features must be exactly danmaku.js.");return r}const He=new Set(["CONFIG_INVALID","CAPABILITY_DISABLED","CLIENT_DESTROYED","INTERNAL_ERROR"]);function We(t){if(typeof t=="object"&&t!==null){const e=t;if(typeof e.code=="string"&&He.has(e.code)&&typeof e.retryable=="boolean"){const r={code:e.code,retryable:e.retryable};return typeof e.requestId=="string"&&(r.requestId=e.requestId),typeof e.capability=="string"&&(r.capability=e.capability),r}}return{code:"INTERNAL_ERROR",retryable:!0}}function T(t,e,r={}){K(t,"viceme:error",{...We(e),...r})}async function Ye(t){let e;try{e=fe(t)}catch(o){T(document,o);return}if(!t.src){T(document,y("Loader script requires a src URL."));return}const r=new URL("manifest.json",t.src);let i,n;try{({manifest:i,baseUrl:n}=await Ge(r))}catch(o){T(document,o,{clientKey:P(x,e.region,e.workKey)});return}await $e();let l;try{const o=document.querySelectorAll(e.target);if(o.length===0)throw y(`Loader target "${e.target}" matched no element; no node was created.`);if(o.length>1)throw y(`Loader target "${e.target}" matched ${o.length} elements; exactly one is required.`);l=o[0]}catch(o){T(document,o,{clientKey:P(i.apiMajor,e.region,e.workKey)});return}const a=P(i.apiMajor,e.region,e.workKey);je(i.version);let c=g().registry.getClient(a),d;if(c)d=c.client;else{try{d=Ke({workKey:e.workKey,region:e.region})}catch(N){T(l,N,{clientKey:a});return}const o=d.ready();o.catch(()=>{}),c={clientKey:a,client:d,ready:o},g().registry.registerClient(c)}try{await c.ready}catch(o){g().registry.unregisterClient(a),d.destroy(),T(l,o,{clientKey:a});return}if(g().registry.getClient(a)!==c)return;let I=!1;const k=[];for(const o of e.features){if(g().registry.findInstance(a,o,l))continue;const N=i.features[o];if(typeof N!="string"){X(d),T(l,new v({code:"CAPABILITY_DISABLED",message:`Capability "${o}" is not part of this release.`,retryable:!1,capability:o}),{clientKey:a,capability:o});continue}try{const u=await import(new URL(N,n).href);if(typeof u.mountDanmaku!="function")throw y(`Capability chunk "${o}" does not export mountDanmaku().`);if(g().registry.getClient(a)!==c)return;const f=await u.mountDanmaku(d,{target:l,theme:e.theme});if(g().registry.getClient(a)!==c){f.destroy();return}const p=g().registry.registerInstance(a,o,l,f);I=!0,k.push(o),K(l,"viceme:capability-ready",{clientKey:a,instanceKey:p.instanceKey,capability:o,version:i.version})}catch(s){if(g().registry.getClient(a)!==c)return;X(d),T(l,s,{clientKey:a,capability:o})}}I&&g().registry.getClient(a)===c&&K(l,"viceme:ready",{clientKey:a,workKey:e.workKey,capabilities:k,version:i.version})}function ze(t){const{queue:e}=g(),r=e.current.then(()=>Ye(t));return e.current=r.catch(()=>{}),r}function re(){if(typeof document>"u")return;let t=document.currentScript instanceof HTMLScriptElement?document.currentScript:null;if(!t){const e=document.querySelectorAll("script[data-viceme-loader]");e.length===1&&(t=e[0]??null)}t&&ze(t).catch(e=>{T(document,e)})}re();const Xe=re})();
215
+ `;const a=i.querySelector("[data-viceme='panel']");a.dataset.action=this.interaction.action,a.dataset.frame="false";const f=i.querySelector("[data-viceme='description']");f.textContent=r.description;const n=i.querySelector("[data-viceme='action']"),o=n.parentElement,d=i.querySelector("[data-viceme='close']"),b=i.querySelector("[data-viceme='backdrop']"),N=i.querySelector("[data-viceme='error']"),s=i.querySelector("[data-viceme='frame']"),C=i.querySelector("[data-viceme='profile']"),c=i.querySelector("[data-viceme='avatar']"),u=i.querySelector("[data-viceme='avatar-fallback']"),p=i.querySelector("[data-viceme='profile-name']"),l=i.querySelector("[data-viceme='profile-description']"),w=i.querySelector("[data-viceme='profile-stats']");n.textContent=r.label,n.hidden=!1,o.dataset.single="true";const A=r.label;s.title=this.interaction.action==="SIGN_IN"?"登录授权":"支付";const h=this.interaction.followTarget;if(h){a.setAttribute("aria-label",this.interaction.action==="SIGN_IN"?`授权 ${h.displayName}`:`关注 ${h.displayName}`),C.dataset.visible="true",p.textContent=h.displayName;const m=[...h.description??""];l.textContent=m.length>j?`${m.slice(0,j).join("")}…`:m.join(""),m.length>j&&(l.title=h.description),w.textContent=`${h.workCount} 个作品`,u.textContent=h.displayName.trim().slice(0,1)||"V",h.avatarUrl&&(c.src=h.avatarUrl,c.alt=`${h.displayName}的头像`,c.hidden=!1,u.hidden=!0)}let E=null;const _=m=>{this.dispatchEvent(new CustomEvent("viceme:access-layer-close",{detail:m}))},T=()=>{E?.cancel(),_("dismissed")};b.addEventListener("click",T),d.addEventListener("click",T),this.addEventListener("keydown",m=>{if(m.key==="Escape"&&T(),m.key==="Tab"){if(m.preventDefault(),E?.type==="frame"){s.focus();return}const I=[d,...n.hidden?[]:[n]].filter(q=>!q.disabled&&!q.hidden);if(I.length===0)return;const P=I.indexOf(i.activeElement),R=m.shiftKey?-1:1;I[(P+R+I.length)%I.length]?.focus()}});const U=async()=>{n.disabled=!0,n.setAttribute("aria-busy","true"),n.textContent="正在打开…",N.textContent="";try{const m=await this.interaction.perform();m.type==="frame"?(E=m,a.dataset.frame="true",s.src=m.url,s.focus(),await m.completion):m.type==="external"&&(E=m,await m.completion),_("acted")}catch(m){E?.cancel(),E=null,a.dataset.frame="false",s.removeAttribute("src"),N.textContent=Ie(m),n.hidden=!1,n.disabled=!1,n.removeAttribute("aria-busy"),n.textContent=A,n.focus()}};n.addEventListener("click",U),queueMicrotask(()=>n.focus())}}customElements.define($,t)}const B=async t=>{if(typeof document>"u"||typeof customElements>"u")return"dismissed";ke();const e=document.createElement($);e.interaction=t;const r=document.documentElement.style.overflow,i=document.activeElement instanceof HTMLElement?document.activeElement:null;document.documentElement.style.overflow="hidden",document.body.append(e);try{return await new Promise(a=>{e.addEventListener("viceme:access-layer-close",f=>a(f.detail),{once:!0})})}finally{e.remove(),document.documentElement.style.overflow=r,i?.focus()}};function O(t){if(typeof t!="object"||t===null)throw k();return t}function k(){return new g({code:"INTERNAL_ERROR",message:"Malformed public API response.",retryable:!0})}function Ae(t){const e=O(t);if(typeof e.id!="string"||!(typeof e.displayName=="string"||e.displayName===null)||!(typeof e.avatarUrl=="string"||e.avatarUrl===null))throw k();return{subject:e.id,nickname:e.displayName,avatarUrl:e.avatarUrl}}function X(t){const e=O(t);if(typeof e.following!="boolean"||!(typeof e.followedAt=="string"||e.followedAt===null))throw k();const r=O(e.creator);if(typeof r.displayName!="string"||!(typeof r.avatarUrl=="string"||r.avatarUrl===null)||!(typeof r.description=="string"||r.description===null)||!Number.isInteger(r.publishedWorkCount)||r.publishedWorkCount<0)throw k();return{following:e.following,followedAt:e.followedAt,target:{kind:"CREATOR",displayName:r.displayName,avatarUrl:r.avatarUrl,description:r.description,workCount:r.publishedWorkCount}}}function Te(t){const e=O(t),r=new Set(["PUBLIC","OWNER","FOLLOWING","ENTITLED","AUTH_REQUIRED","FOLLOW_REQUIRED","PURCHASE_REQUIRED","FEATURE_NOT_FOUND","FEATURE_DISABLED"]),i=new Set([null,"SIGN_IN","FOLLOW","CHECKOUT"]);if(typeof e.allowed!="boolean"||typeof e.reason!="string"||!r.has(e.reason)||!i.has(e.nextAction))throw k();return{allowed:e.allowed,reason:e.reason,nextAction:e.nextAction}}function Se(t){const e=O(t);if(typeof e.featureKey!="string"||!/^[a-z][a-z0-9_-]{1,63}$/.test(e.featureKey)||typeof e.title!="string"||e.title.trim().length===0||e.title.length>120||!(e.policyType==="PUBLIC"||e.policyType==="FOLLOW_OWNER"||e.policyType==="WORK_ENTITLEMENT"))throw k();const r=e.price===null?null:O(e.price);if(r!==null&&(!Number.isInteger(r.amountCents)||r.amountCents<=0||r.currency!=="CNY")||e.policyType==="WORK_ENTITLEMENT"!=(r!==null))throw k();return{featureKey:e.featureKey,title:e.title,policy:{type:e.policyType},price:r===null?null:{amountCents:r.amountCents,currency:"CNY"}}}function Ne(){const t=crypto.getRandomValues(new Uint8Array(32));return Re(t)}function Re(t){let e="";for(const r of t)e+=String.fromCharCode(r);return btoa(e).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function Oe(){return typeof document<"u"&&document.documentElement.lang.toLowerCase()==="en-us"?"en-US":"zh-CN"}function Le(t){const e=()=>new g({code:"AUTH_CANCELLED",message:"The interactive action was cancelled.",retryable:!1}),r=(c,u,p,l,w,A)=>{if(typeof window>"u")throw new g({code:"CONFIG_INVALID",message:"Interactive access requires a browser window.",retryable:!1});let h=!0,E,_;const T=()=>{h&&(h=!1,window.removeEventListener("message",m))},U=new Promise((S,I)=>{E=S,_=I}),m=S=>{if(!h||S.origin!==u||typeof S.data!="object"||S.data===null)return;const I=S.data;if(!(I.workKey!==t.workKey||I.channel!==p)){if(I.type===`viceme:${l}:ready`){S.source&&"postMessage"in S.source&&S.source.postMessage({type:`viceme:${l}:init`,workKey:t.workKey,channel:p,...w},u);return}if(I.type===`viceme:${l}:cancelled`){T(),_(e());return}I.type===`viceme:${l}:complete`&&(T(),A(I).then(E,_))}};return window.addEventListener("message",m),{type:"frame",url:c,completion:U,cancel(){T(),E()}}},i=async()=>{if(await t.ready(),typeof window>"u")throw new g({code:"CONFIG_INVALID",message:"Interactive access requires a browser window.",retryable:!1});const c=Ne(),u=new URL("/sdk/login",t.widgetOrigin);u.search=new URLSearchParams({workKey:t.workKey,channel:c,parentOrigin:window.location.origin,locale:Oe()}).toString();const p=t.session.snapshot?.token;if(!p)throw k();return r(u.toString(),t.widgetOrigin,c,"auth",{workSessionToken:p},async l=>{if(typeof l.userToken!="string")throw k();t.session.authenticate({userToken:l.userToken,user:Ae(l.user)})})},a=async()=>(await t.ready(),X((await t.session.request({method:"GET",path:"/v1/public/work-sdk/follow"})).body)),f=async()=>(await t.ready(),X((await t.session.request({method:"PUT",path:"/v1/public/work-sdk/follow"})).body)),n={async getState(){await t.ready();const c=t.session.snapshot?.user??null;return{authenticated:c!==null,user:c}},async signIn(){if(await(t.presenter??B)({featureKey:"auth",reason:"AUTH_REQUIRED",action:"SIGN_IN",perform:i})==="dismissed")throw e();return this.getState()},async signOut(){await t.ready(),await t.session.signOut()}},o={getState:a,follow:f,unfollow:async()=>{throw new g({code:"CAPABILITY_DISABLED",message:"Unfollow is not exposed by website access.",retryable:!1})}},d=async c=>{await t.ready();const u=O((await t.session.request({method:"POST",path:"/v1/public/work-sdk/access/check",body:{featureKeys:c}})).body),p=O(u.decisions);return Object.fromEntries(Object.entries(p).map(([l,w])=>[l,Te(w)]))},b=async(c,u={})=>{await t.ready();const p={featureKey:c,locale:u.locale??"zh-CN"},l=O((await t.session.request({method:"POST",path:"/v1/public/work-sdk/checkout",body:p})).body);if(typeof l.checkoutUrl!="string"||typeof l.alreadyOwned!="boolean"||!(l.expiresAt===null||typeof l.expiresAt=="string"&&!Number.isNaN(Date.parse(l.expiresAt)))||l.alreadyOwned!==(l.expiresAt===null))throw k();let w;try{w=new URL(l.checkoutUrl)}catch{throw k()}if(!l.alreadyOwned&&(w.protocol!=="https:"||w.origin!==t.widgetOrigin))throw k();return{checkoutUrl:l.checkoutUrl,alreadyOwned:l.alreadyOwned,expiresAt:l.expiresAt}},N=(c,u)=>{if(c.alreadyOwned)return{type:"completed"};const p=Date.parse(c.expiresAt);if(typeof window>"u")throw new g({code:"CONFIG_INVALID",message:"Hosted checkout requires a browser window.",retryable:!1});let l=!0,w,A,h,E;const _=new Promise((R,q)=>{h=R,E=q}),T=()=>{w&&clearTimeout(w),A&&clearTimeout(A),document.removeEventListener("visibilitychange",I)},U=()=>{l&&(l=!1,T(),E(new g({code:"SESSION_EXPIRED",message:"Hosted checkout session expired.",retryable:!0})))},m=()=>{if(!l||document.visibilityState==="hidden")return;const R=p-t.now();if(R<=0){U();return}w=setTimeout(()=>{S()},Math.min(1500,R))},S=async()=>{if(l)try{const R=(await d([u]))[u];if(!R)throw k();if(R.allowed){l=!1,T(),h();return}m()}catch(R){l=!1,T(),E(R)}};function I(){if(l){if(document.visibilityState==="hidden"){w&&clearTimeout(w),w=void 0;return}m()}}document.addEventListener("visibilitychange",I);const P=p-t.now();return P<=0?U():(A=setTimeout(U,P),m()),{type:"frame",url:c.checkoutUrl,completion:_,cancel(){l&&(l=!1,T(),h())}}};return{auth:n,follow:o,access:{async getFeatures(){await t.ready();const c=O((await t.session.request({method:"GET",path:"/v1/public/work-sdk/access/features"})).body);if(!Array.isArray(c.features)||c.features.length>100)throw k();return c.features.map(Se)},async check(c){const p=(await d([c]))[c];if(!p)throw k();return p},checkMany:d,async require(c){let u=await this.check(c);const p=t.presenter??B;for(let l=0;!u.allowed&&u.nextAction&&l<3;l+=1){const w=u.nextAction,A=w==="FOLLOW"?(await o.getState()).target:void 0,h=w==="CHECKOUT"?await b(c):void 0;if(h?.alreadyOwned){u=await this.check(c);continue}if(await p({featureKey:c,reason:u.reason,action:w,...A?{followTarget:A}:{},perform:async()=>w==="SIGN_IN"?i():w==="FOLLOW"?(await o.follow(),{type:"completed"}):N(h,c)})==="dismissed")return u;u=await this.check(c)}return u},async refresh(){await t.ready()}},checkout:{async open(c){const u=await b(c.featureKey,c);if(u.alreadyOwned)return u;if(await(t.presenter??B)({featureKey:c.featureKey,reason:"PURCHASE_REQUIRED",action:"CHECKOUT",perform:async()=>N(u,c.featureKey)})==="dismissed")throw e();return u}}}}function J(t){t instanceof Z&&t.markDegraded()}class Ce extends DOMException{constructor(){super("ViceMe client destroyed.","AbortError")}}class Z{#e=new ge;#t;#r;#i=new AbortController;#n;auth;access;checkout;#a;constructor(e){this.#r=e.config,this.#t=new ve({workKey:e.config.workKey,transport:e.transport,signal:this.#i.signal,...e.now!==void 0?{now:e.now}:{}});const r=Le({session:this.#t,workKey:e.config.workKey,widgetOrigin:oe[e.config.region],now:e.now??(()=>Date.now()),presenter:e.presenter,ready:()=>this.#o()});this.auth=r.auth,this.access=r.access,this.checkout=r.checkout;const i=e.config.signal;if(i){const a=()=>{this.#i.abort(i.reason instanceof Error?i.reason:new DOMException("Caller signal aborted.","AbortError"))};i.aborted?a():(i.addEventListener("abort",a,{once:!0}),this.#a=()=>{i.removeEventListener("abort",a)})}}get version(){return Q}get workKey(){return this.#r.workKey}get region(){return this.#r.region}get state(){return this.#e.state}get apiMajor(){return M}ready(){return this.#e.destroyed?Promise.reject(D()):(this.#n||(this.#e.transition("READY"),this.#n=Promise.resolve()),this.#n)}async#o(){if(this.#e.destroyed)throw D();await this.ready();try{if(await this.#t.establish(),this.#e.destroyed)throw D()}catch(e){throw this.#e.destroyed?D():(this.#t.invalidate(),e)}}hasCapability(e){if(this.#e.destroyed)return!1;const r=this.#t.snapshot?.work.capabilities;return e==="danmaku"||e==="tip"||r?.includes(e)===!0}get capabilities(){return this.#t.snapshot?.work.capabilities??[]}markDegraded(){this.#e.state==="READY"&&this.#e.transition("DEGRADED")}get sessionSnapshot(){return this.#t.snapshot}destroy(){this.#e.destroyed||(this.#e.transition("DESTROYED"),this.#i.abort(new Ce),this.#t.destroy(),this.#e.clearListeners(),this.#n=void 0,this.#a?.(),this.#a=void 0)}}const _e=1e4,De=new Map([[400,"CONFIG_INVALID"],[401,"SESSION_EXPIRED"],[403,"CAPABILITY_DISABLED"],[404,"WORK_NOT_FOUND"],[409,"CONFIG_INVALID"],[422,"CONFIG_INVALID"],[429,"RATE_LIMITED"]]),Ue=new Set(["CONFIG_INVALID","WORK_NOT_FOUND","CAPABILITY_DISABLED","SESSION_EXPIRED","AUTH_REQUIRED","AUTH_CANCELLED","RETURN_URL_NOT_ALLOWED","RATE_LIMITED","NETWORK_TIMEOUT","CHECKOUT_UNAVAILABLE","INTERNAL_ERROR"]);function xe(t){if(typeof t!="object"||t===null)return{};const e=t,r=typeof e.error=="object"&&e.error!==null?e.error:e,i={};return typeof r.code=="string"&&Ue.has(r.code)&&(i.code=r.code),typeof r.message=="string"&&(i.message=r.message.slice(0,200)),typeof r.retryable=="boolean"&&(i.retryable=r.retryable),typeof r.requestId=="string"&&(i.requestId=r.requestId),i}function Me(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`req-${Math.random().toString(36).slice(2)}`}class Ke{#e;#t;#r;#i;constructor(e){this.#e=e.apiBaseUrl.replace(/\/+$/,""),this.#t=e.fetchImpl??globalThis.fetch.bind(globalThis),this.#r=e.defaultTimeoutMs??_e,this.#i=e.generateRequestId??Me}async request(e){if(e.signal?.aborted)throw this.#n(e.signal);const r=e.timeoutMs??this.#r,i=new AbortController;let a=!1;const f=setTimeout(()=>{a=!0,i.abort(new ee)},r),n=()=>i.abort(new ee(!1));e.signal?.addEventListener("abort",n,{once:!0});const o=this.#i();try{const d=await this.#t(`${this.#e}${e.path}`,{method:e.method,credentials:"omit",mode:"cors",headers:{"content-type":"application/json","x-client-request-id":o,...e.authorization!==void 0?{authorization:`Bearer ${e.authorization}`}:{},...e.userAuthorization!==void 0?{"x-viceme-user-token":e.userAuthorization}:{}},body:e.body!==void 0?JSON.stringify(e.body):void 0,signal:i.signal});let b;try{b=await d.json()}catch(s){if(e.signal?.aborted||a)throw s;b=void 0}const N=d.headers.get("x-request-id")??void 0;if(!d.ok){const s=xe(b),C=s.code??De.get(d.status)??"INTERNAL_ERROR";throw new g({code:C,message:s.message??"Public API request failed.",retryable:s.retryable,requestId:s.requestId??N})}return{status:d.status,body:b,requestId:N}}catch(d){throw e.signal?.aborted?this.#n(e.signal):a?new g({code:"NETWORK_TIMEOUT",message:"Public API request timed out.",retryable:!0,requestId:o}):d instanceof g?d:d instanceof DOMException&&d.name==="AbortError"?new DOMException("ViceMe request aborted by caller.","AbortError"):new g({code:"INTERNAL_ERROR",message:"Public API request failed.",retryable:!0,requestId:o})}finally{clearTimeout(f),e.signal?.removeEventListener("abort",n)}}#n(e){return e.reason instanceof Error?e.reason:new DOMException("ViceMe request aborted by caller.","AbortError")}}function Pe(t){return new Ke(t)}class ee extends DOMException{constructor(e=!0){super(e?"ViceMe request timed out.":"ViceMe request aborted.","AbortError")}}function qe(t){const e=de(t),r=le(e.region),i=Pe({apiBaseUrl:r});return new Z({config:e,transport:i})}const Fe=8e3,$e=8e3,te={danmaku:"danmaku.js",tip:"tip.js"},je={danmaku:"mountDanmaku",tip:"mountTip"},re=Symbol.for("viceme.loader.state.v1");function v(){const e=globalThis[re];if(e)return e;const r={registry:new he,queue:{current:Promise.resolve()}};return Object.defineProperty(globalThis,re,{value:r,writable:!0,configurable:!0,enumerable:!1}),r}function V(t){if(!t.destroyed){t.destroyed=!0,v().registry.removeInstance(t.instanceKey);try{t.raw.destroy()}finally{K(t.host,"viceme:destroyed",{clientKey:t.clientKey,instanceKey:t.instanceKey,capability:t.capability})}}}function Be(t){return{instanceKey:t.instanceKey,capability:t.capability,destroy:()=>V(t)}}function W(t,e,r){Object.defineProperty(t,e,{value:r,writable:!0,configurable:!0,enumerable:!1})}function Ve(t){let r=globalThis.ViceMe;r||(r={},W(globalThis,"ViceMe",r));let i=r.versions;i||(i={},W(r,"versions",i));const a=i[`v${M}`];if(a)return a;const f={version:t,whenReady(n){const o=v().registry.getClient(n);return o?o.ready.then(()=>o.client):Promise.reject(y(`Unknown clientKey "${n}".`))},getInstance(n){const o=v().registry.getInstance(n);return o?Be(o):void 0},destroyInstance(n){const o=v().registry.getInstance(n);o&&V(o)},destroyClient(n){for(const d of v().registry.instancesForClient(n))V(d);const o=v().registry.getClient(n);for(const d of o?.pendingMounts??[])d.abort();v().registry.unregisterClient(n),o?.client.destroy()}};return W(i,`v${M}`,f),f}function We(){return document.readyState!=="loading"?Promise.resolve():new Promise(t=>{document.addEventListener("DOMContentLoaded",()=>t(),{once:!0})})}async function Ge(t){let e;try{e=await He(t)}catch{e={ok:!1,status:0}}return{manifest:await ze(e),baseUrl:t}}function He(t){const e=typeof AbortSignal<"u"&&typeof AbortSignal.timeout=="function"?AbortSignal.timeout(Fe):void 0;return fetch(t,{credentials:"omit",signal:e})}async function ze(t){if(!t.ok)throw y(`Release manifest is not available (HTTP ${t.status}).`);const e=await t.json();if(typeof e!="object"||e===null||typeof e.version!="string"||typeof e.apiMajor!="number"||typeof e.features!="object"||e.features===null)throw y("Release manifest is malformed.");const r=e;if(r.version!==Q)throw y("Release manifest version does not match this loader.");if(r.apiMajor!==M)throw y("Release manifest major version does not match this loader.");const i=Object.keys(r.features).sort();if(i.length!==2||i[0]!=="danmaku"||i[1]!=="tip"||r.features.danmaku!==te.danmaku||r.features.tip!==te.tip)throw y("Release manifest features must be exactly danmaku.js and tip.js.");return r}const Ye=new Set(["CONFIG_INVALID","CAPABILITY_DISABLED","CLIENT_DESTROYED","INTERNAL_ERROR"]);function Qe(t){if(typeof t=="object"&&t!==null){const e=t;if(typeof e.code=="string"&&Ye.has(e.code)&&typeof e.retryable=="boolean"){const r={code:e.code,retryable:e.retryable};return typeof e.requestId=="string"&&(r.requestId=e.requestId),typeof e.capability=="string"&&(r.capability=e.capability),r}}return{code:"INTERNAL_ERROR",retryable:!0}}function L(t,e,r={}){K(t,"viceme:error",{...Qe(e),...r})}function Xe(t,e,r){let i,a;const f=new Promise((n,o)=>{if(a=()=>o(D()),e.signal.aborted){a();return}e.signal.addEventListener("abort",a,{once:!0}),i=globalThis.setTimeout(()=>{o(new g({code:"INTERNAL_ERROR",message:`Capability "${r}" did not load and mount in time.`,retryable:!0,capability:r})),e.abort()},$e)});return Promise.race([t,f]).finally(()=>{i!==void 0&&globalThis.clearTimeout(i),a&&e.signal.removeEventListener("abort",a)})}async function Je(t){let e;try{e=me(t)}catch(s){L(document,s);return}if(!t.src){L(document,y("Loader script requires a src URL."));return}const r=new URL("manifest.json",t.src);let i,a;try{({manifest:i,baseUrl:a}=await Ge(r))}catch(s){L(document,s,{clientKey:F(M,e.region,e.workKey)});return}await We();let f;try{const s=document.querySelectorAll(e.target);if(s.length===0)throw y(`Loader target "${e.target}" matched no element; no node was created.`);if(s.length>1)throw y(`Loader target "${e.target}" matched ${s.length} elements; exactly one is required.`);f=s[0]}catch(s){L(document,s,{clientKey:F(i.apiMajor,e.region,e.workKey)});return}const n=F(i.apiMajor,e.region,e.workKey);Ve(i.version);let o=v().registry.getClient(n),d;if(o)d=o.client;else{try{d=qe({workKey:e.workKey,region:e.region})}catch(C){L(f,C,{clientKey:n});return}const s=d.ready();s.catch(()=>{}),o={clientKey:n,client:d,ready:s,pendingMounts:new Set},v().registry.registerClient(o)}try{await o.ready}catch(s){v().registry.unregisterClient(n),d.destroy(),L(f,s,{clientKey:n});return}if(v().registry.getClient(n)!==o)return;const b=async s=>{if(v().registry.findInstance(n,s,f))return;const C=i.features[s];if(typeof C!="string"){J(d),L(f,new g({code:"CAPABILITY_DISABLED",message:`Capability "${s}" is not part of this release.`,retryable:!1,capability:s}),{clientKey:n,capability:s});return}const c=new AbortController;o.pendingMounts.add(c);try{const u=(async()=>{const A=await import(new URL(C,a).href),h=je[s],E=A[h];if(typeof E!="function")throw y(`Capability chunk "${s}" does not export ${h}().`);if(v().registry.getClient(n)!==o)throw D();return await E(d,{target:f,theme:e.theme,signal:c.signal})})(),p=await Xe(u,c,s);if(v().registry.getClient(n)!==o){p.destroy();return}const l=v().registry.registerInstance(n,s,f,p);return K(f,"viceme:capability-ready",{clientKey:n,instanceKey:l.instanceKey,capability:s,version:i.version}),s}catch(u){if(v().registry.getClient(n)!==o)return;J(d),L(f,u,{clientKey:n,capability:s});return}finally{o.pendingMounts.delete(c)}},N=(await Promise.all(e.features.map(b))).filter(s=>s!==void 0);N.length>0&&v().registry.getClient(n)===o&&K(f,"viceme:ready",{clientKey:n,workKey:e.workKey,capabilities:N,version:i.version})}function Ze(t){const{queue:e}=v(),r=e.current.then(()=>Je(t));return e.current=r.catch(()=>{}),r}function ie(){if(typeof document>"u")return;let t=document.currentScript instanceof HTMLScriptElement?document.currentScript:null;if(!t){const e=document.querySelectorAll("script[data-viceme-loader]");e.length===1&&(t=e[0]??null)}t&&Ze(t).catch(e=>{L(document,e)})}ie();const et=ie})();
233
216
  //# sourceMappingURL=viceme.min.js.map