@djvlc/runtime-client-sdk 1.0.0 → 1.1.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.
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- var e=require("@djvlc/openapi-user-client");function t(e){return function(t){const r={"Content-Type":"application/json","X-App-Id":e.appId,"X-Runtime-Version":e.runtimeVersion,"X-Client-Version":e.clientVersion};if(t&&(r["X-Trace-Id"]=t),e.getToken){const t=e.getToken();t&&(r.Authorization=`Bearer ${t}`)}if(e.getApiKey){const t=e.getApiKey();t&&(r["X-API-Key"]=t)}if(e.extraHeaders){const t=e.extraHeaders();Object.assign(r,t)}return r}}function r(){return e=32,Array.from({length:e},()=>Math.floor(16*Math.random()).toString(16)).join("");var e}function a(){return e=16,Array.from({length:e},()=>Math.floor(16*Math.random()).toString(16)).join("");var e}var n=class{constructor(e){this.defaultTraceId=e||r()}getTraceId(){return this.defaultTraceId}setTraceId(e){this.defaultTraceId=e}resetTraceId(){return this.defaultTraceId=r(),this.defaultTraceId}withTrace(e,t){const r=this.defaultTraceId;this.defaultTraceId=e;try{return t()}finally{this.defaultTraceId=r}}async withTraceAsync(e,t){const r=this.defaultTraceId;this.defaultTraceId=e;try{return await t()}finally{this.defaultTraceId=r}}},s={enabled:!0,maxRetries:2,initialDelayMs:200,backoffMultiplier:2,maxDelayMs:2e3,retryableStatusCodes:[408,429,500,502,503,504]};function o(e,t){const r=t.initialDelayMs*Math.pow(t.backoffMultiplier,e),a=.1*r*(2*Math.random()-1);return Math.min(r+a,t.maxDelayMs)}function i(e,t,r){if(!r.enabled||t>=r.maxRetries)return!1;if(e instanceof TypeError)return!0;if(e instanceof Error&&"status"in e){const t=e.status;return r.retryableStatusCodes.includes(t)}return!(!e||"object"!=typeof e||!("httpStatus"in e)||"number"!=typeof e.httpStatus)&&r.retryableStatusCodes.includes(e.httpStatus)}function c(e){return new Promise(t=>setTimeout(t,e))}async function u(e,t={}){const r={...s,...t};let a;for(let t=0;t<=r.maxRetries;t++)try{return await e()}catch(e){if(a=e,!i(e,t,r))throw e;if(t<r.maxRetries){const e=o(t,r);await c(e)}}throw a}function d(e,t){const r=new AbortController;let a;return e&&e>0&&(a=setTimeout(()=>{r.abort(new Error(`Request timeout after ${e}ms`))},e)),t&&(t.aborted?r.abort(t.reason):t.addEventListener("abort",()=>{r.abort(t.reason)})),{controller:r,cleanup:()=>{a&&clearTimeout(a)}}}function l(e,t,r){return{name:"RuntimeClientError",kind:e,message:t,code:r?.code,httpStatus:r?.httpStatus,traceId:r?.traceId,details:r?.details,cause:r?.cause}}function p(e){return null!==e&&"object"==typeof e&&"name"in e&&"RuntimeClientError"===e.name}function f(e,t){if(p(e))return{...e,traceId:e.traceId||t};if(e instanceof TypeError&&e.message.includes("fetch"))return l("Network","Network request failed",{traceId:t,cause:e});if(e instanceof DOMException&&"AbortError"===e.name)return l("Abort","Request aborted",{traceId:t,cause:e});if(e instanceof Error){if(e.message.includes("timeout")||e.message.includes("Timeout"))return l("Timeout",e.message,{traceId:t,cause:e});if(e.message.includes("abort")||"AbortError"===e.name)return l("Abort",e.message,{traceId:t,cause:e})}if(e&&"object"==typeof e&&"status"in e&&"number"==typeof e.status){const r=e.status;return l("Http",e instanceof Error?e.message:`HTTP error ${r}`,{httpStatus:r,traceId:t,cause:e})}return e instanceof Error?l("Unknown",e.message,{traceId:t,cause:e}):l("Unknown",String(e),{traceId:t,cause:e})}function h(e,t,r){return l("Validation",e,{code:"VALIDATION_ERROR",traceId:t,details:r})}var m=class{constructor(e){this.client=e.client,this.headersBuilder=e.headersBuilder,this.traceContext=e.traceContext,this.retryConfig=e.retryConfig||{},this.defaultTimeoutMs=e.defaultTimeoutMs||3e4}async resolvePage(e){const t=e.trace?.traceId||this.traceContext.getTraceId(),r=e.timeoutMs||this.defaultTimeoutMs,{controller:a,cleanup:n}=d(r,e.signal);try{const r=await u(async()=>await this.client.pages.resolvePage({pageId:e.pageId,env:"prod",uid:e.uid,deviceId:e.client?.deviceId,channel:void 0},{signal:a.signal}),this.retryConfig);if(!r.data||"object"!=typeof r.data)throw h("Invalid page resolve response",t,{response:r});const n=r.data,s=await fetch(n.snapshotUrl,{signal:a.signal,headers:this.headersBuilder(t)});if(!s.ok)throw f({status:s.status},t);const o=await s.json(),i=this.convertSnapshotToPageSchema(o.page);return{pageVersionId:n.resolvedVersionId,page:i,prefetchedData:o.prefetchedData,meta:{cache:"MISS",resolvedAt:Date.now(),etag:n.etag,cacheTtlSeconds:n.cacheTtlSeconds}}}catch(e){throw f(e,t)}finally{n()}}convertSnapshotToPageSchema(e){return e}};var y=new Set(["claim","signin","form_submit","lottery","checkin","reserve","subscribe"]);function g(e){return y.has(e)}function I(e){let t=2166136261;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function x(e){const t=[e.actionType,e.context.pageId,e.context.pageVersionId,e.context.componentId||"",e.context.uid||"",JSON.stringify(e.payload,Object.keys(e.payload||{}).sort())].join("|"),r=I(t),a=I(t.split("").reverse().join(""));return r+a+I(t+r)+I(a+t)}var T=class{constructor(e){this.client=e.client,this.traceContext=e.traceContext,this.defaultTimeoutMs=e.defaultTimeoutMs||3e4}async executeAction(e){const t=e.trace?.traceId||this.traceContext.getTraceId(),r=e.timeoutMs||this.defaultTimeoutMs;let a=e.idempotencyKey;!a&&g(e.actionType)&&(a=x({actionType:e.actionType,payload:e.payload,context:{pageId:e.context.pageId,pageVersionId:e.context.pageVersionId,componentId:e.context.componentId,uid:e.context.uid}}));const{controller:n,cleanup:s}=d(r,e.signal);try{const t=await this.client.actions.executeAction({executeActionRequest:{actionType:e.actionType,params:e.payload,context:{pageVersionId:e.context.pageVersionId,deviceId:e.context.deviceId,channel:void 0,extra:{uid:e.context.uid,componentId:e.context.componentId}},idempotencyKey:a}},{signal:n.signal});return t.success?{ok:!0,data:t.data?.result}:{ok:!1,error:{code:t.data?.errorCode||"BIZ_ERROR",message:t.data?.errorMessage||"Action failed",details:t.data}}}catch(e){const r=f(e,t);return{ok:!1,error:{code:r.code||r.kind,message:r.message,details:r.details}}}finally{s()}}};var v=class{constructor(e){this.client=e.client,this.traceContext=e.traceContext,this.retryConfig=e.retryConfig||{},this.defaultTimeoutMs=e.defaultTimeoutMs||3e4}async query(e){const t=e.trace?.traceId||this.traceContext.getTraceId(),r=e.timeoutMs||this.defaultTimeoutMs,{controller:a,cleanup:n}=d(r,e.signal);try{const t=await u(async()=>await this.client.queries.queryData({queryDataRequest:{queryVersionId:e.queryVersionId,params:e.params||{},context:{pageVersionId:e.context.pageVersionId}}},{signal:a.signal}),this.retryConfig);return t.success?{ok:!0,data:t.data}:{ok:!1,error:{code:"QUERY_ERROR",message:t.errorMessage||t.message||"Query failed",details:t.data}}}catch(e){const r=f(e,t);return{ok:!1,error:{code:r.code||r.kind,message:r.message,details:r.details}}}finally{n()}}};var w=class{constructor(e){this.eventBuffer=[],this.flushTimer=null,this.client=e.client,this.batchSize=e.batchSize||10,this.flushInterval=e.flushInterval||5e3}async track(e){for(const t of e.events)this.eventBuffer.push({event:t,context:e.context});this.eventBuffer.length>=this.batchSize?await this.flush():this.scheduleFlush()}async flush(e){if(0===this.eventBuffer.length)return;const t=[...this.eventBuffer];this.eventBuffer=[],this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null);for(const{event:e,context:r}of t)try{await this.client.track.track({trackRequest:{eventName:e.eventName,eventType:e.eventType,properties:e.properties,timestamp:e.timestamp?new Date(e.timestamp):void 0,context:{pageVersionId:r.pageVersionId,sessionId:r.sessionId}}})}catch(e){}}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush().catch(()=>{})},this.flushInterval))}async destroy(){await this.flush()}};var b=class{constructor(e){this.defaultTenantId=e.defaultTenantId||"default",this.tenantConfigs=e.tenantConfigs||new Map}async resolveTenant(e){let t=this.defaultTenantId;if(e.path){const r=e.path.match(/^\/t\/([^/]+)/);r&&(t=r[1])}if(e.host){const r=e.host.match(/^([^.]+)\./);r&&"www"!==r[1]&&(t=r[1])}return{tenantId:t,config:this.tenantConfigs.get(t)||{}}}};exports.ActionAdapter=T,exports.DEFAULT_RETRY_CONFIG=s,exports.DataAdapter=v,exports.PageRuntimeAdapter=m,exports.TenantAdapter=b,exports.TraceContext=n,exports.TrackAdapter=w,exports.applyPrefetch=function(e,t){t.prefetchedData&&e.setPrefetchedData(t.prefetchedData)},exports.calculateRetryDelay=o,exports.createActionAdapter=function(e){return new T(e)},exports.createBizError=function(e,t,r,a){return l("Biz",t,{code:e,traceId:r,details:a})},exports.createDataAdapter=function(e){return new v(e)},exports.createHeadersBuilder=t,exports.createHttpError=function(e,t,r,a){return l("Http",t,{httpStatus:e,traceId:r,details:a})},exports.createInitialRuntimeState=function(e){return{pageVersionId:e.pageVersionId,prefetchedData:e.prefetchedData||{}}},exports.createPageRuntimeAdapter=function(e){return new m(e)},exports.createRuntimeClientError=l,exports.createRuntimeClientSdk=function(a){const s=t({appId:a.appId,runtimeVersion:a.runtimeVersion,clientVersion:a.clientVersion,getToken:a.getToken,getApiKey:a.getApiKey,extraHeaders:a.extraHeaders}),o=new n,i=e.createUserClient({baseUrl:a.baseUrl,timeout:a.timeoutMs||3e4,debug:a.debug,headers:s(o.getTraceId()),enableRetry:!1}),c=a.retry?{enabled:!0,maxRetries:a.maxRetries??2,initialDelayMs:a.retryDelayMs??200}:{enabled:!1},u=new m({client:i,headersBuilder:s,traceContext:o,retryConfig:c,defaultTimeoutMs:a.timeoutMs}),d=new T({client:i,headersBuilder:s,traceContext:o,defaultTimeoutMs:a.timeoutMs}),l=new v({client:i,headersBuilder:s,traceContext:o,retryConfig:c,defaultTimeoutMs:a.timeoutMs}),p=new w({client:i,headersBuilder:s,traceContext:o}),f={tenant:new b({headersBuilder:s,traceContext:o,defaultTenantId:a.defaultTenantId}),page:u,data:l,action:d,track:p},h=function(e){return{resolvePage:async t=>(await e.pages.resolvePage({pageId:t.pageId,env:t.env,uid:t.uid,deviceId:t.deviceId,channel:t.channel})).data,async executeAction(t){const r=await e.actions.executeAction({executeActionRequest:{actionType:t.actionType,params:t.params,context:{pageVersionId:t.context.pageVersionId,deviceId:t.context.deviceId,channel:t.context.channel,extra:{uid:t.context.uid,appId:t.context.appId}},idempotencyKey:t.idempotencyKey}}),a=r.data;return{success:r.success,data:a?.result,errorCode:a?.errorCode,errorMessage:a?.errorMessage}},async executeQuery(t){const r=await e.queries.queryData({queryDataRequest:{queryVersionId:t.queryVersionId,params:t.params??{},context:{pageVersionId:t.context.pageVersionId}}});return{success:r.success,data:r.data??void 0,message:r.message,errorMessage:r.errorMessage}},track(t){e.track.track({trackRequest:{eventName:t.eventName,eventType:t.type??"custom",properties:t.params,timestamp:null!=t.timestamp?new Date(t.timestamp):void 0,context:{pageVersionId:t.context.pageVersionId,sessionId:t.context.userId}}}).catch(()=>{})}}}(i);return{getPorts:()=>f,getUserApiAdapter:()=>h,getTraceContext:()=>o,createTraceId:()=>r(),flushTrack:()=>p.flush(),destroy:async()=>{await p.destroy()}}},exports.createSpanId=a,exports.createTenantAdapter=function(e){return new b(e)},exports.createTimeoutController=d,exports.createTraceId=r,exports.createTraceparent=function(e,t){return`00-${e||r()}-${t||a()}-01`},exports.createTrackAdapter=function(e){return new w(e)},exports.createValidationError=h,exports.createWrappedUserClient=function(t){const r={baseUrl:t.baseUrl,timeout:t.timeoutMs||3e4,debug:t.debug,headers:t.headersBuilder(),enableRetry:!1};return e.createUserClient(r)},exports.delay=c,exports.generateIdempotencyKey=async function(e){const t=[e.actionType,e.context.pageId,e.context.pageVersionId,e.context.componentId||"",e.context.uid||"",JSON.stringify(e.payload,Object.keys(e.payload||{}).sort())].join("|");return(await async function(e){if("undefined"!=typeof crypto&&crypto.subtle){const t=(new TextEncoder).encode(e),r=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(r)).map(e=>e.toString(16).padStart(2,"0")).join("")}return I(e)+I(e.split("").reverse().join(""))}(t)).substring(0,32)},exports.generateIdempotencyKeySync=x,exports.getPrefetchedQueryData=function(e,t){return e.prefetchedData?.[t]},exports.hasPrefetchedData=function(e){return void 0!==e.prefetchedData&&Object.keys(e.prefetchedData).length>0},exports.isAbortError=function(e){return e instanceof Error?"AbortError"===e.name||e.message.includes("aborted"):e instanceof DOMException&&"AbortError"===e.name},exports.isRuntimeClientError=p,exports.isTimeoutError=function(e){return e instanceof Error&&(e.message.includes("timeout")||e.message.includes("Timeout")||"TimeoutError"===e.name||"AbortError"===e.name)},exports.needsIdempotencyKey=g,exports.normalizeError=f,exports.shouldRetry=i,exports.withRetry=u,exports.withTimeout=async function(e,t,r){const{controller:a,cleanup:n}=d(t,r);try{return await Promise.race([e,new Promise((e,t)=>{a.signal.addEventListener("abort",()=>{t(a.signal.reason||new Error("Request aborted"))})})])}finally{n()}};
1
+ "use strict";var e=require("@djvlc/openapi-user-client");function t(e){return function(t){const r={"Content-Type":"application/json","X-App-Id":e.appId,"X-Runtime-Version":e.runtimeVersion,"X-Client-Version":e.clientVersion};if(t&&(r["X-Trace-Id"]=t),e.getToken){const t=e.getToken();t&&(r.Authorization=`Bearer ${t}`)}if(e.getApiKey){const t=e.getApiKey();t&&(r["X-API-Key"]=t)}if(e.extraHeaders){const t=e.extraHeaders();Object.assign(r,t)}return r}}function r(){return e=32,Array.from({length:e},()=>Math.floor(16*Math.random()).toString(16)).join("");var e}function a(){return e=16,Array.from({length:e},()=>Math.floor(16*Math.random()).toString(16)).join("");var e}var n=class{constructor(e){this.defaultTraceId=e||r()}getTraceId(){return this.defaultTraceId}setTraceId(e){this.defaultTraceId=e}resetTraceId(){return this.defaultTraceId=r(),this.defaultTraceId}withTrace(e,t){const r=this.defaultTraceId;this.defaultTraceId=e;try{return t()}finally{this.defaultTraceId=r}}async withTraceAsync(e,t){const r=this.defaultTraceId;this.defaultTraceId=e;try{return await t()}finally{this.defaultTraceId=r}}},s={enabled:!0,maxRetries:2,initialDelayMs:200,backoffMultiplier:2,maxDelayMs:2e3,retryableStatusCodes:[408,429,500,502,503,504]};function o(e,t){const r=t.initialDelayMs*Math.pow(t.backoffMultiplier,e),a=.1*r*(2*Math.random()-1);return Math.min(r+a,t.maxDelayMs)}function i(e,t,r){if(!r.enabled||t>=r.maxRetries)return!1;if(e instanceof TypeError)return!0;if(e instanceof Error&&"status"in e){const t=e.status;return r.retryableStatusCodes.includes(t)}return!(!e||"object"!=typeof e||!("httpStatus"in e)||"number"!=typeof e.httpStatus)&&r.retryableStatusCodes.includes(e.httpStatus)}function c(e){return new Promise(t=>setTimeout(t,e))}async function d(e,t={}){const r={...s,...t};let a;for(let t=0;t<=r.maxRetries;t++)try{return await e()}catch(e){if(a=e,!i(e,t,r))throw e;if(t<r.maxRetries){const e=o(t,r);await c(e)}}throw a}function u(e,t){const r=new AbortController;let a;return e&&e>0&&(a=setTimeout(()=>{r.abort(new Error(`Request timeout after ${e}ms`))},e)),t&&(t.aborted?r.abort(t.reason):t.addEventListener("abort",()=>{r.abort(t.reason)})),{controller:r,cleanup:()=>{a&&clearTimeout(a)}}}function l(e,t,r){return{name:"RuntimeClientError",kind:e,message:t,code:r?.code,httpStatus:r?.httpStatus,traceId:r?.traceId,details:r?.details,cause:r?.cause}}function p(e){return null!==e&&"object"==typeof e&&"name"in e&&"RuntimeClientError"===e.name}function f(e,t){if(p(e))return{...e,traceId:e.traceId||t};if(e instanceof TypeError&&e.message.includes("fetch"))return l("Network","Network request failed",{traceId:t,cause:e});if(e instanceof DOMException&&"AbortError"===e.name)return l("Abort","Request aborted",{traceId:t,cause:e});if(e instanceof Error){if(e.message.includes("timeout")||e.message.includes("Timeout"))return l("Timeout",e.message,{traceId:t,cause:e});if(e.message.includes("abort")||"AbortError"===e.name)return l("Abort",e.message,{traceId:t,cause:e})}if(e&&"object"==typeof e&&"status"in e&&"number"==typeof e.status){const r=e.status;return l("Http",e instanceof Error?e.message:`HTTP error ${r}`,{httpStatus:r,traceId:t,cause:e})}return e instanceof Error?l("Unknown",e.message,{traceId:t,cause:e}):l("Unknown",String(e),{traceId:t,cause:e})}function h(e,t,r){return l("Validation",e,{code:"VALIDATION_ERROR",traceId:t,details:r})}var g=class{constructor(e){this.client=e.client,this.headersBuilder=e.headersBuilder,this.traceContext=e.traceContext,this.retryConfig=e.retryConfig||{},this.defaultTimeoutMs=e.defaultTimeoutMs||3e4}async resolvePage(e){const t=e.trace?.traceId||this.traceContext.getTraceId(),r=e.timeoutMs||this.defaultTimeoutMs,{controller:a,cleanup:n}=u(r,e.signal);try{const r=await d(async()=>await this.client.pages.resolvePage({pageId:e.pageId,env:"prod",uid:e.uid,deviceId:e.client?.deviceId,channel:void 0,xUserId:e.uid||"anonymous",xDeviceId:e.client?.deviceId||"unknown",xChannel:"web"},{signal:a.signal}),this.retryConfig);if(!r.data||"object"!=typeof r.data)throw h("Invalid page resolve response",t,{response:r});const n=r.data,s=await fetch(n.snapshotUrl,{signal:a.signal,headers:this.headersBuilder(t)});if(!s.ok)throw f({status:s.status},t);const o=await s.json(),i=this.convertSnapshotToPageSchema(o.page);return{pageVersionId:n.resolvedVersionId,page:i,prefetchedData:o.prefetchedData,meta:{cache:"MISS",resolvedAt:Date.now(),etag:n.etag,cacheTtlSeconds:n.cacheTtlSeconds}}}catch(e){throw f(e,t)}finally{n()}}convertSnapshotToPageSchema(e){return e}};var y=new Set(["claim","signin","form_submit","lottery","checkin","reserve","subscribe"]);function m(e){return y.has(e)}function I(e){let t=2166136261;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function x(e){const t=[e.actionType,e.context.pageId,e.context.pageVersionId,e.context.componentId||"",e.context.uid||"",JSON.stringify(e.payload,Object.keys(e.payload||{}).sort())].join("|"),r=I(t),a=I(t.split("").reverse().join(""));return r+a+I(t+r)+I(a+t)}var T=class{constructor(e){this.client=e.client,this.traceContext=e.traceContext,this.defaultTimeoutMs=e.defaultTimeoutMs||3e4}async executeAction(e){const t=e.trace?.traceId||this.traceContext.getTraceId(),r=e.timeoutMs||this.defaultTimeoutMs;let a=e.idempotencyKey;!a&&m(e.actionType)&&(a=x({actionType:e.actionType,payload:e.payload,context:{pageId:e.context.pageId,pageVersionId:e.context.pageVersionId,componentId:e.context.componentId,uid:e.context.uid}}));const{controller:n,cleanup:s}=u(r,e.signal);try{const t=(await this.client.actions.executeAction({executeActionRequest:{actionType:e.actionType,params:e.payload,context:{pageVersionId:e.context.pageVersionId,deviceId:e.context.deviceId,channel:void 0,extra:{uid:e.context.uid,componentId:e.context.componentId}},idempotencyKey:a}},{signal:n.signal})).data;return t?.success?{ok:!0,data:t.data}:{ok:!1,error:{code:t?.errorCode||"BIZ_ERROR",message:t?.errorMessage||"Action failed",details:t}}}catch(e){const r=f(e,t);return{ok:!1,error:{code:r.code||r.kind,message:r.message,details:r.details}}}finally{s()}}};var b=class{constructor(e){this.client=e.client,this.traceContext=e.traceContext,this.retryConfig=e.retryConfig||{},this.defaultTimeoutMs=e.defaultTimeoutMs||3e4}async query(e){const t=e.trace?.traceId||this.traceContext.getTraceId(),r=e.timeoutMs||this.defaultTimeoutMs,{controller:a,cleanup:n}=u(r,e.signal);try{const t=await d(async()=>await this.client.queries.queryData({queryDataRequest:{queryVersionId:e.queryVersionId,params:e.params||{},context:{pageVersionId:e.context.pageVersionId}}},{signal:a.signal}),this.retryConfig),r=t.data;return r?.success?{ok:!0,data:r.data}:{ok:!1,error:{code:r?.errorCode||"QUERY_ERROR",message:r?.errorMessage||t.message||"Query failed",details:r}}}catch(e){const r=f(e,t);return{ok:!1,error:{code:r.code||r.kind,message:r.message,details:r.details}}}finally{n()}}};var v=class{constructor(e){this.eventBuffer=[],this.flushTimer=null,this.client=e.client,this.batchSize=e.batchSize||10,this.flushInterval=e.flushInterval||5e3}async track(e){for(const t of e.events)this.eventBuffer.push({event:t,context:e.context});this.eventBuffer.length>=this.batchSize?await this.flush():this.scheduleFlush()}async flush(e){if(0===this.eventBuffer.length)return;const t=[...this.eventBuffer];this.eventBuffer=[],this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null);for(const{event:e,context:r}of t)try{await this.client.track.track({trackSingleRequest:{event:{eventName:e.eventName,eventType:e.eventType||"custom",properties:e.properties,timestamp:e.timestamp},context:{pageVersionId:r.pageVersionId,sessionId:r.sessionId}}})}catch(e){}}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush().catch(()=>{})},this.flushInterval))}async destroy(){await this.flush()}};var w=class{constructor(e){this.defaultTenantId=e.defaultTenantId||"default",this.tenantConfigs=e.tenantConfigs||new Map}async resolveTenant(e){let t=this.defaultTenantId;if(e.path){const r=e.path.match(/^\/t\/([^/]+)/);r&&(t=r[1])}if(e.host){const r=e.host.match(/^([^.]+)\./);r&&"www"!==r[1]&&(t=r[1])}return{tenantId:t,config:this.tenantConfigs.get(t)||{}}}};function C(e){if(e)throw new Error("[RuntimeClientSdk] SDK has been destroyed. Create a new instance with createRuntimeClientSdk().")}exports.ActionAdapter=T,exports.DEFAULT_RETRY_CONFIG=s,exports.DataAdapter=b,exports.PageRuntimeAdapter=g,exports.TenantAdapter=w,exports.TraceContext=n,exports.TrackAdapter=v,exports.applyPrefetch=function(e,t){t.prefetchedData&&e.setPrefetchedData(t.prefetchedData)},exports.calculateRetryDelay=o,exports.createActionAdapter=function(e){return new T(e)},exports.createBizError=function(e,t,r,a){return l("Biz",t,{code:e,traceId:r,details:a})},exports.createDataAdapter=function(e){return new b(e)},exports.createHeadersBuilder=t,exports.createHttpError=function(e,t,r,a){return l("Http",t,{httpStatus:e,traceId:r,details:a})},exports.createInitialRuntimeState=function(e){return{pageVersionId:e.pageVersionId,prefetchedData:e.prefetchedData||{}}},exports.createPageRuntimeAdapter=function(e){return new g(e)},exports.createRuntimeClientError=l,exports.createRuntimeClientSdk=function(a){const s=a.debug??!1,o={debug:(...e)=>{},info:(...e)=>{},warn:(...e)=>{},error:(...e)=>{}};let i=!1;o.info("Creating SDK",{baseUrl:a.baseUrl,appId:a.appId,runtimeVersion:a.runtimeVersion,retry:a.retry??!1});const c=t({appId:a.appId,runtimeVersion:a.runtimeVersion,clientVersion:a.clientVersion,getToken:a.getToken,getApiKey:a.getApiKey,extraHeaders:a.extraHeaders}),d=new n;o.debug("TraceContext initialized",{traceId:d.getTraceId()});const u=e.createUserClient({baseUrl:a.baseUrl,timeout:a.timeoutMs??3e4,debug:s,headers:c(d.getTraceId()),enableRetry:!1});o.debug("UserClient created");const l=a.retry?{enabled:!0,maxRetries:a.maxRetries??2,initialDelayMs:a.retryDelayMs??200}:{enabled:!1},p={client:u,headersBuilder:c,traceContext:d,defaultTimeoutMs:a.timeoutMs},f=new g({...p,retryConfig:l}),h=new T(p),y=new b({...p,retryConfig:l}),m=new v({client:u,headersBuilder:c,traceContext:d}),I=new w({headersBuilder:c,traceContext:d,defaultTenantId:a.defaultTenantId});o.debug("Port adapters created");const x={tenant:I,page:f,data:y,action:h,track:m},A=function(e,t){return{async resolvePage(r){t.debug("Legacy resolvePage",{pageId:r.pageId});return(await e.pages.resolvePage({pageId:r.pageId,env:r.env,uid:r.uid,deviceId:r.deviceId,channel:r.channel,xUserId:r.uid||"anonymous",xDeviceId:r.deviceId||"unknown",xChannel:r.channel||"web"})).data},async executeAction(r){t.debug("Legacy executeAction",{actionType:r.actionType});const a=await e.actions.executeAction({executeActionRequest:{actionType:r.actionType,params:r.params,context:{pageVersionId:r.context.pageVersionId,deviceId:r.context.deviceId,channel:r.context.channel,extra:{uid:r.context.uid,appId:r.context.appId}},idempotencyKey:r.idempotencyKey}}),n=a.data;return{success:a.success,data:n,errorCode:n?.errorCode,errorMessage:n?.errorMessage}},async executeQuery(r){t.debug("Legacy executeQuery",{queryVersionId:r.queryVersionId});const a=await e.queries.queryData({queryDataRequest:{queryVersionId:r.queryVersionId,params:r.params??{},context:{pageVersionId:r.context.pageVersionId}}});return{success:a.success,data:a.data??void 0,message:a.message,errorMessage:a.success?void 0:a.message}},track(r){t.debug("Legacy track",{eventName:r.eventName}),e.track.track({trackSingleRequest:{event:{eventName:r.eventName,eventType:r.type??"custom",properties:r.params,timestamp:r.timestamp??void 0},context:{pageVersionId:r.context.pageVersionId,sessionId:r.context.userId}}}).catch(e=>{t.warn("Track failed (silent)",e)})}}}(u,o);return o.info("SDK created successfully"),{getPorts:()=>(C(i),x),getUserApiAdapter:()=>(C(i),A),getTraceContext:()=>(C(i),d),createTraceId:()=>r(),async flushTrack(){C(i),o.debug("Flushing track buffer"),await m.flush()},async destroy(){if(i)o.warn("destroy() called on already-destroyed SDK, ignoring");else{i=!0,o.info("Destroying SDK...");try{await m.destroy()}catch(e){o.error("Error during SDK destroy",e)}o.info("SDK destroyed")}},get destroyed(){return i}}},exports.createSpanId=a,exports.createTenantAdapter=function(e){return new w(e)},exports.createTimeoutController=u,exports.createTraceId=r,exports.createTraceparent=function(e,t){return`00-${e||r()}-${t||a()}-01`},exports.createTrackAdapter=function(e){return new v(e)},exports.createValidationError=h,exports.createWrappedUserClient=function(t){const r={baseUrl:t.baseUrl,timeout:t.timeoutMs||3e4,debug:t.debug,headers:t.headersBuilder(),enableRetry:!1};return e.createUserClient(r)},exports.delay=c,exports.generateIdempotencyKey=async function(e){const t=[e.actionType,e.context.pageId,e.context.pageVersionId,e.context.componentId||"",e.context.uid||"",JSON.stringify(e.payload,Object.keys(e.payload||{}).sort())].join("|");return(await async function(e){if("undefined"!=typeof crypto&&crypto.subtle){const t=(new TextEncoder).encode(e),r=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(r)).map(e=>e.toString(16).padStart(2,"0")).join("")}return I(e)+I(e.split("").reverse().join(""))}(t)).substring(0,32)},exports.generateIdempotencyKeySync=x,exports.getPrefetchedQueryData=function(e,t){return e.prefetchedData?.[t]},exports.hasPrefetchedData=function(e){return void 0!==e.prefetchedData&&Object.keys(e.prefetchedData).length>0},exports.isAbortError=function(e){return e instanceof Error?"AbortError"===e.name||e.message.includes("aborted"):e instanceof DOMException&&"AbortError"===e.name},exports.isRuntimeClientError=p,exports.isTimeoutError=function(e){return e instanceof Error&&(e.message.includes("timeout")||e.message.includes("Timeout")||"TimeoutError"===e.name||"AbortError"===e.name)},exports.needsIdempotencyKey=m,exports.normalizeError=f,exports.shouldRetry=i,exports.withRetry=d,exports.withTimeout=async function(e,t,r){const{controller:a,cleanup:n}=u(t,r);try{return await Promise.race([e,new Promise((e,t)=>{a.signal.addEventListener("abort",()=>{t(a.signal.reason||new Error("Request aborted"))})})])}finally{n()}};
package/dist/index.d.cts CHANGED
@@ -52,35 +52,42 @@ declare class TraceContext {
52
52
  *
53
53
  * 数据面 API 唯一入口:封装 openapi-user-client,实现 Ports,
54
54
  * 提供 header/trace/错误归一/幂等/重试/prefetch
55
+ *
56
+ * 优化点(相比旧版):
57
+ * 1. SDK 生命周期管理 — destroyed 守卫,防止销毁后继续调用
58
+ * 2. 结构化 debug 日志 — 所有关键路径添加日志,方便排查
59
+ * 3. 代码分阶段构建 — config → client → adapters → ports → facade
60
+ * 4. 向后兼容层独立 — buildLegacyUserApiAdapter 提取为命名函数
61
+ * 5. 防御性编程 — assertNotDestroyed 保护所有公开方法
55
62
  */
56
63
 
57
64
  /**
58
65
  * SDK 配置选项
59
66
  */
60
67
  interface RuntimeClientSdkOptions {
61
- /** API 基础 URL */
68
+ /** API 基础 URL(必填) */
62
69
  baseUrl: string;
63
- /** App ID */
70
+ /** App ID(必填) */
64
71
  appId: string;
65
- /** Runtime 版本 */
72
+ /** Runtime 版本(必填) */
66
73
  runtimeVersion: string;
67
- /** Client 版本 */
74
+ /** Client 版本(必填) */
68
75
  clientVersion: string;
69
- /** 获取 Token 的函数(lazy getter */
76
+ /** 获取 Token 的函数(lazy getter,每次请求时调用) */
70
77
  getToken?: () => string | undefined;
71
- /** 获取 API Key 的函数(lazy getter */
78
+ /** 获取 API Key 的函数(lazy getter,每次请求时调用) */
72
79
  getApiKey?: () => string | undefined;
73
- /** 额外请求头扩展 */
80
+ /** 额外请求头扩展(每次请求时调用) */
74
81
  extraHeaders?: () => Record<string, string>;
75
- /** 超时时间(毫秒) */
82
+ /** 超时时间(毫秒),默认 30000 */
76
83
  timeoutMs?: number;
77
- /** 是否启用重试 */
84
+ /** 是否启用重试,默认 false */
78
85
  retry?: boolean;
79
- /** 最大重试次数 */
86
+ /** 最大重试次数,默认 2 */
80
87
  maxRetries?: number;
81
- /** 重试延迟(毫秒) */
88
+ /** 重试延迟(毫秒),默认 200 */
82
89
  retryDelayMs?: number;
83
- /** 是否启用调试 */
90
+ /** 是否启用调试日志 */
84
91
  debug?: boolean;
85
92
  /** 默认租户 ID */
86
93
  defaultTenantId?: string;
@@ -89,9 +96,9 @@ interface RuntimeClientSdkOptions {
89
96
  * Runtime Client SDK
90
97
  */
91
98
  interface RuntimeClientSdk {
92
- /** 获取 Runtime Ports */
99
+ /** 获取 Runtime Ports(推荐,新 API) */
93
100
  getPorts(): RuntimePorts;
94
- /** 获取 UserApiAdapter(向后兼容) */
101
+ /** 获取 UserApiAdapter(向后兼容旧 runtime-core 接口) */
95
102
  getUserApiAdapter(): UserApiAdapter;
96
103
  /** 获取 Trace Context */
97
104
  getTraceContext(): TraceContext;
@@ -99,11 +106,32 @@ interface RuntimeClientSdk {
99
106
  createTraceId(): string;
100
107
  /** 刷新埋点缓冲区 */
101
108
  flushTrack(): Promise<void>;
102
- /** 销毁 SDK */
109
+ /** 销毁 SDK,释放所有资源 */
103
110
  destroy(): Promise<void>;
111
+ /** SDK 是否已销毁 */
112
+ readonly destroyed: boolean;
104
113
  }
105
114
  /**
106
115
  * 创建 Runtime Client SDK
116
+ *
117
+ * @example
118
+ * ```ts
119
+ * const sdk = createRuntimeClientSdk({
120
+ * baseUrl: 'https://api.example.com',
121
+ * appId: 'my-app',
122
+ * runtimeVersion: '1.0.0',
123
+ * clientVersion: '1.0.0',
124
+ * getToken: () => localStorage.getItem('token') || undefined,
125
+ * retry: true,
126
+ * });
127
+ *
128
+ * // 推荐:使用 Ports(新 API)
129
+ * const ports = sdk.getPorts();
130
+ * const result = await ports.page.resolvePage({ pageId: 'page_123' });
131
+ *
132
+ * // 兼容:使用 UserApiAdapter(旧 API)
133
+ * const adapter = sdk.getUserApiAdapter();
134
+ * ```
107
135
  */
108
136
  declare function createRuntimeClientSdk(options: RuntimeClientSdkOptions): RuntimeClientSdk;
109
137
 
package/dist/index.d.ts CHANGED
@@ -52,35 +52,42 @@ declare class TraceContext {
52
52
  *
53
53
  * 数据面 API 唯一入口:封装 openapi-user-client,实现 Ports,
54
54
  * 提供 header/trace/错误归一/幂等/重试/prefetch
55
+ *
56
+ * 优化点(相比旧版):
57
+ * 1. SDK 生命周期管理 — destroyed 守卫,防止销毁后继续调用
58
+ * 2. 结构化 debug 日志 — 所有关键路径添加日志,方便排查
59
+ * 3. 代码分阶段构建 — config → client → adapters → ports → facade
60
+ * 4. 向后兼容层独立 — buildLegacyUserApiAdapter 提取为命名函数
61
+ * 5. 防御性编程 — assertNotDestroyed 保护所有公开方法
55
62
  */
56
63
 
57
64
  /**
58
65
  * SDK 配置选项
59
66
  */
60
67
  interface RuntimeClientSdkOptions {
61
- /** API 基础 URL */
68
+ /** API 基础 URL(必填) */
62
69
  baseUrl: string;
63
- /** App ID */
70
+ /** App ID(必填) */
64
71
  appId: string;
65
- /** Runtime 版本 */
72
+ /** Runtime 版本(必填) */
66
73
  runtimeVersion: string;
67
- /** Client 版本 */
74
+ /** Client 版本(必填) */
68
75
  clientVersion: string;
69
- /** 获取 Token 的函数(lazy getter */
76
+ /** 获取 Token 的函数(lazy getter,每次请求时调用) */
70
77
  getToken?: () => string | undefined;
71
- /** 获取 API Key 的函数(lazy getter */
78
+ /** 获取 API Key 的函数(lazy getter,每次请求时调用) */
72
79
  getApiKey?: () => string | undefined;
73
- /** 额外请求头扩展 */
80
+ /** 额外请求头扩展(每次请求时调用) */
74
81
  extraHeaders?: () => Record<string, string>;
75
- /** 超时时间(毫秒) */
82
+ /** 超时时间(毫秒),默认 30000 */
76
83
  timeoutMs?: number;
77
- /** 是否启用重试 */
84
+ /** 是否启用重试,默认 false */
78
85
  retry?: boolean;
79
- /** 最大重试次数 */
86
+ /** 最大重试次数,默认 2 */
80
87
  maxRetries?: number;
81
- /** 重试延迟(毫秒) */
88
+ /** 重试延迟(毫秒),默认 200 */
82
89
  retryDelayMs?: number;
83
- /** 是否启用调试 */
90
+ /** 是否启用调试日志 */
84
91
  debug?: boolean;
85
92
  /** 默认租户 ID */
86
93
  defaultTenantId?: string;
@@ -89,9 +96,9 @@ interface RuntimeClientSdkOptions {
89
96
  * Runtime Client SDK
90
97
  */
91
98
  interface RuntimeClientSdk {
92
- /** 获取 Runtime Ports */
99
+ /** 获取 Runtime Ports(推荐,新 API) */
93
100
  getPorts(): RuntimePorts;
94
- /** 获取 UserApiAdapter(向后兼容) */
101
+ /** 获取 UserApiAdapter(向后兼容旧 runtime-core 接口) */
95
102
  getUserApiAdapter(): UserApiAdapter;
96
103
  /** 获取 Trace Context */
97
104
  getTraceContext(): TraceContext;
@@ -99,11 +106,32 @@ interface RuntimeClientSdk {
99
106
  createTraceId(): string;
100
107
  /** 刷新埋点缓冲区 */
101
108
  flushTrack(): Promise<void>;
102
- /** 销毁 SDK */
109
+ /** 销毁 SDK,释放所有资源 */
103
110
  destroy(): Promise<void>;
111
+ /** SDK 是否已销毁 */
112
+ readonly destroyed: boolean;
104
113
  }
105
114
  /**
106
115
  * 创建 Runtime Client SDK
116
+ *
117
+ * @example
118
+ * ```ts
119
+ * const sdk = createRuntimeClientSdk({
120
+ * baseUrl: 'https://api.example.com',
121
+ * appId: 'my-app',
122
+ * runtimeVersion: '1.0.0',
123
+ * clientVersion: '1.0.0',
124
+ * getToken: () => localStorage.getItem('token') || undefined,
125
+ * retry: true,
126
+ * });
127
+ *
128
+ * // 推荐:使用 Ports(新 API)
129
+ * const ports = sdk.getPorts();
130
+ * const result = await ports.page.resolvePage({ pageId: 'page_123' });
131
+ *
132
+ * // 兼容:使用 UserApiAdapter(旧 API)
133
+ * const adapter = sdk.getUserApiAdapter();
134
+ * ```
107
135
  */
108
136
  declare function createRuntimeClientSdk(options: RuntimeClientSdkOptions): RuntimeClientSdk;
109
137
 
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{createUserClient as e}from"@djvlc/openapi-user-client";function t(e){return function(t){const r={"Content-Type":"application/json","X-App-Id":e.appId,"X-Runtime-Version":e.runtimeVersion,"X-Client-Version":e.clientVersion};if(t&&(r["X-Trace-Id"]=t),e.getToken){const t=e.getToken();t&&(r.Authorization=`Bearer ${t}`)}if(e.getApiKey){const t=e.getApiKey();t&&(r["X-API-Key"]=t)}if(e.extraHeaders){const t=e.extraHeaders();Object.assign(r,t)}return r}}function r(){return e=32,Array.from({length:e},()=>Math.floor(16*Math.random()).toString(16)).join("");var e}function n(){return e=16,Array.from({length:e},()=>Math.floor(16*Math.random()).toString(16)).join("");var e}function a(e,t){return`00-${e||r()}-${t||n()}-01`}var s=class{constructor(e){this.defaultTraceId=e||r()}getTraceId(){return this.defaultTraceId}setTraceId(e){this.defaultTraceId=e}resetTraceId(){return this.defaultTraceId=r(),this.defaultTraceId}withTrace(e,t){const r=this.defaultTraceId;this.defaultTraceId=e;try{return t()}finally{this.defaultTraceId=r}}async withTraceAsync(e,t){const r=this.defaultTraceId;this.defaultTraceId=e;try{return await t()}finally{this.defaultTraceId=r}}},o={enabled:!0,maxRetries:2,initialDelayMs:200,backoffMultiplier:2,maxDelayMs:2e3,retryableStatusCodes:[408,429,500,502,503,504]};function i(e,t){const r=t.initialDelayMs*Math.pow(t.backoffMultiplier,e),n=.1*r*(2*Math.random()-1);return Math.min(r+n,t.maxDelayMs)}function c(e,t,r){if(!r.enabled||t>=r.maxRetries)return!1;if(e instanceof TypeError)return!0;if(e instanceof Error&&"status"in e){const t=e.status;return r.retryableStatusCodes.includes(t)}return!(!e||"object"!=typeof e||!("httpStatus"in e)||"number"!=typeof e.httpStatus)&&r.retryableStatusCodes.includes(e.httpStatus)}function u(e){return new Promise(t=>setTimeout(t,e))}async function d(e,t={}){const r={...o,...t};let n;for(let t=0;t<=r.maxRetries;t++)try{return await e()}catch(e){if(n=e,!c(e,t,r))throw e;if(t<r.maxRetries){const e=i(t,r);await u(e)}}throw n}function l(e,t){const r=new AbortController;let n;return e&&e>0&&(n=setTimeout(()=>{r.abort(new Error(`Request timeout after ${e}ms`))},e)),t&&(t.aborted?r.abort(t.reason):t.addEventListener("abort",()=>{r.abort(t.reason)})),{controller:r,cleanup:()=>{n&&clearTimeout(n)}}}async function f(e,t,r){const{controller:n,cleanup:a}=l(t,r);try{return await Promise.race([e,new Promise((e,t)=>{n.signal.addEventListener("abort",()=>{t(n.signal.reason||new Error("Request aborted"))})})])}finally{a()}}function h(e){return e instanceof Error&&(e.message.includes("timeout")||e.message.includes("Timeout")||"TimeoutError"===e.name||"AbortError"===e.name)}function p(e){return e instanceof Error?"AbortError"===e.name||e.message.includes("aborted"):e instanceof DOMException&&"AbortError"===e.name}function m(e,t,r){return{name:"RuntimeClientError",kind:e,message:t,code:r?.code,httpStatus:r?.httpStatus,traceId:r?.traceId,details:r?.details,cause:r?.cause}}function g(e){return null!==e&&"object"==typeof e&&"name"in e&&"RuntimeClientError"===e.name}function y(e,t){if(g(e))return{...e,traceId:e.traceId||t};if(e instanceof TypeError&&e.message.includes("fetch"))return m("Network","Network request failed",{traceId:t,cause:e});if(e instanceof DOMException&&"AbortError"===e.name)return m("Abort","Request aborted",{traceId:t,cause:e});if(e instanceof Error){if(e.message.includes("timeout")||e.message.includes("Timeout"))return m("Timeout",e.message,{traceId:t,cause:e});if(e.message.includes("abort")||"AbortError"===e.name)return m("Abort",e.message,{traceId:t,cause:e})}if(e&&"object"==typeof e&&"status"in e&&"number"==typeof e.status){const r=e.status;return m("Http",e instanceof Error?e.message:`HTTP error ${r}`,{httpStatus:r,traceId:t,cause:e})}return e instanceof Error?m("Unknown",e.message,{traceId:t,cause:e}):m("Unknown",String(e),{traceId:t,cause:e})}function I(e,t,r,n){return m("Http",t,{httpStatus:e,traceId:r,details:n})}function T(e,t,r,n){return m("Biz",t,{code:e,traceId:r,details:n})}function x(e,t,r){return m("Validation",e,{code:"VALIDATION_ERROR",traceId:t,details:r})}var v=class{constructor(e){this.client=e.client,this.headersBuilder=e.headersBuilder,this.traceContext=e.traceContext,this.retryConfig=e.retryConfig||{},this.defaultTimeoutMs=e.defaultTimeoutMs||3e4}async resolvePage(e){const t=e.trace?.traceId||this.traceContext.getTraceId(),r=e.timeoutMs||this.defaultTimeoutMs,{controller:n,cleanup:a}=l(r,e.signal);try{const r=await d(async()=>await this.client.pages.resolvePage({pageId:e.pageId,env:"prod",uid:e.uid,deviceId:e.client?.deviceId,channel:void 0},{signal:n.signal}),this.retryConfig);if(!r.data||"object"!=typeof r.data)throw x("Invalid page resolve response",t,{response:r});const a=r.data,s=await fetch(a.snapshotUrl,{signal:n.signal,headers:this.headersBuilder(t)});if(!s.ok)throw y({status:s.status},t);const o=await s.json(),i=this.convertSnapshotToPageSchema(o.page);return{pageVersionId:a.resolvedVersionId,page:i,prefetchedData:o.prefetchedData,meta:{cache:"MISS",resolvedAt:Date.now(),etag:a.etag,cacheTtlSeconds:a.cacheTtlSeconds}}}catch(e){throw y(e,t)}finally{a()}}convertSnapshotToPageSchema(e){return e}};function w(e){return new v(e)}var b=new Set(["claim","signin","form_submit","lottery","checkin","reserve","subscribe"]);function M(e){return b.has(e)}function C(e){let t=2166136261;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}async function k(e){const t=[e.actionType,e.context.pageId,e.context.pageVersionId,e.context.componentId||"",e.context.uid||"",JSON.stringify(e.payload,Object.keys(e.payload||{}).sort())].join("|");return(await async function(e){if("undefined"!=typeof crypto&&crypto.subtle){const t=(new TextEncoder).encode(e),r=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(r)).map(e=>e.toString(16).padStart(2,"0")).join("")}return C(e)+C(e.split("").reverse().join(""))}(t)).substring(0,32)}function A(e){const t=[e.actionType,e.context.pageId,e.context.pageVersionId,e.context.componentId||"",e.context.uid||"",JSON.stringify(e.payload,Object.keys(e.payload||{}).sort())].join("|"),r=C(t),n=C(t.split("").reverse().join(""));return r+n+C(t+r)+C(n+t)}var V=class{constructor(e){this.client=e.client,this.traceContext=e.traceContext,this.defaultTimeoutMs=e.defaultTimeoutMs||3e4}async executeAction(e){const t=e.trace?.traceId||this.traceContext.getTraceId(),r=e.timeoutMs||this.defaultTimeoutMs;let n=e.idempotencyKey;!n&&M(e.actionType)&&(n=A({actionType:e.actionType,payload:e.payload,context:{pageId:e.context.pageId,pageVersionId:e.context.pageVersionId,componentId:e.context.componentId,uid:e.context.uid}}));const{controller:a,cleanup:s}=l(r,e.signal);try{const t=await this.client.actions.executeAction({executeActionRequest:{actionType:e.actionType,params:e.payload,context:{pageVersionId:e.context.pageVersionId,deviceId:e.context.deviceId,channel:void 0,extra:{uid:e.context.uid,componentId:e.context.componentId}},idempotencyKey:n}},{signal:a.signal});return t.success?{ok:!0,data:t.data?.result}:{ok:!1,error:{code:t.data?.errorCode||"BIZ_ERROR",message:t.data?.errorMessage||"Action failed",details:t.data}}}catch(e){const r=y(e,t);return{ok:!1,error:{code:r.code||r.kind,message:r.message,details:r.details}}}finally{s()}}};function S(e){return new V(e)}var R=class{constructor(e){this.client=e.client,this.traceContext=e.traceContext,this.retryConfig=e.retryConfig||{},this.defaultTimeoutMs=e.defaultTimeoutMs||3e4}async query(e){const t=e.trace?.traceId||this.traceContext.getTraceId(),r=e.timeoutMs||this.defaultTimeoutMs,{controller:n,cleanup:a}=l(r,e.signal);try{const t=await d(async()=>await this.client.queries.queryData({queryDataRequest:{queryVersionId:e.queryVersionId,params:e.params||{},context:{pageVersionId:e.context.pageVersionId}}},{signal:n.signal}),this.retryConfig);return t.success?{ok:!0,data:t.data}:{ok:!1,error:{code:"QUERY_ERROR",message:t.errorMessage||t.message||"Query failed",details:t.data}}}catch(e){const r=y(e,t);return{ok:!1,error:{code:r.code||r.kind,message:r.message,details:r.details}}}finally{a()}}};function E(e){return new R(e)}var D=class{constructor(e){this.eventBuffer=[],this.flushTimer=null,this.client=e.client,this.batchSize=e.batchSize||10,this.flushInterval=e.flushInterval||5e3}async track(e){for(const t of e.events)this.eventBuffer.push({event:t,context:e.context});this.eventBuffer.length>=this.batchSize?await this.flush():this.scheduleFlush()}async flush(e){if(0===this.eventBuffer.length)return;const t=[...this.eventBuffer];this.eventBuffer=[],this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null);for(const{event:e,context:r}of t)try{await this.client.track.track({trackRequest:{eventName:e.eventName,eventType:e.eventType,properties:e.properties,timestamp:e.timestamp?new Date(e.timestamp):void 0,context:{pageVersionId:r.pageVersionId,sessionId:r.sessionId}}})}catch(e){}}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush().catch(()=>{})},this.flushInterval))}async destroy(){await this.flush()}};function q(e){return new D(e)}var j=class{constructor(e){this.defaultTenantId=e.defaultTenantId||"default",this.tenantConfigs=e.tenantConfigs||new Map}async resolveTenant(e){let t=this.defaultTenantId;if(e.path){const r=e.path.match(/^\/t\/([^/]+)/);r&&(t=r[1])}if(e.host){const r=e.host.match(/^([^.]+)\./);r&&"www"!==r[1]&&(t=r[1])}return{tenantId:t,config:this.tenantConfigs.get(t)||{}}}};function B(e){return new j(e)}function P(n){const a=t({appId:n.appId,runtimeVersion:n.runtimeVersion,clientVersion:n.clientVersion,getToken:n.getToken,getApiKey:n.getApiKey,extraHeaders:n.extraHeaders}),o=new s,i=e({baseUrl:n.baseUrl,timeout:n.timeoutMs||3e4,debug:n.debug,headers:a(o.getTraceId()),enableRetry:!1}),c=n.retry?{enabled:!0,maxRetries:n.maxRetries??2,initialDelayMs:n.retryDelayMs??200}:{enabled:!1},u=new v({client:i,headersBuilder:a,traceContext:o,retryConfig:c,defaultTimeoutMs:n.timeoutMs}),d=new V({client:i,headersBuilder:a,traceContext:o,defaultTimeoutMs:n.timeoutMs}),l=new R({client:i,headersBuilder:a,traceContext:o,retryConfig:c,defaultTimeoutMs:n.timeoutMs}),f=new D({client:i,headersBuilder:a,traceContext:o}),h={tenant:new j({headersBuilder:a,traceContext:o,defaultTenantId:n.defaultTenantId}),page:u,data:l,action:d,track:f},p=function(e){return{resolvePage:async t=>(await e.pages.resolvePage({pageId:t.pageId,env:t.env,uid:t.uid,deviceId:t.deviceId,channel:t.channel})).data,async executeAction(t){const r=await e.actions.executeAction({executeActionRequest:{actionType:t.actionType,params:t.params,context:{pageVersionId:t.context.pageVersionId,deviceId:t.context.deviceId,channel:t.context.channel,extra:{uid:t.context.uid,appId:t.context.appId}},idempotencyKey:t.idempotencyKey}}),n=r.data;return{success:r.success,data:n?.result,errorCode:n?.errorCode,errorMessage:n?.errorMessage}},async executeQuery(t){const r=await e.queries.queryData({queryDataRequest:{queryVersionId:t.queryVersionId,params:t.params??{},context:{pageVersionId:t.context.pageVersionId}}});return{success:r.success,data:r.data??void 0,message:r.message,errorMessage:r.errorMessage}},track(t){e.track.track({trackRequest:{eventName:t.eventName,eventType:t.type??"custom",properties:t.params,timestamp:null!=t.timestamp?new Date(t.timestamp):void 0,context:{pageVersionId:t.context.pageVersionId,sessionId:t.context.userId}}}).catch(()=>{})}}}(i);return{getPorts:()=>h,getUserApiAdapter:()=>p,getTraceContext:()=>o,createTraceId:()=>r(),flushTrack:()=>f.flush(),destroy:async()=>{await f.destroy()}}}function O(e,t){t.prefetchedData&&e.setPrefetchedData(t.prefetchedData)}function U(e){return{pageVersionId:e.pageVersionId,prefetchedData:e.prefetchedData||{}}}function K(e,t){return e.prefetchedData?.[t]}function N(e){return void 0!==e.prefetchedData&&Object.keys(e.prefetchedData).length>0}function H(t){const r={baseUrl:t.baseUrl,timeout:t.timeoutMs||3e4,debug:t.debug,headers:t.headersBuilder(),enableRetry:!1};return e(r)}export{V as ActionAdapter,o as DEFAULT_RETRY_CONFIG,R as DataAdapter,v as PageRuntimeAdapter,j as TenantAdapter,s as TraceContext,D as TrackAdapter,O as applyPrefetch,i as calculateRetryDelay,S as createActionAdapter,T as createBizError,E as createDataAdapter,t as createHeadersBuilder,I as createHttpError,U as createInitialRuntimeState,w as createPageRuntimeAdapter,m as createRuntimeClientError,P as createRuntimeClientSdk,n as createSpanId,B as createTenantAdapter,l as createTimeoutController,r as createTraceId,a as createTraceparent,q as createTrackAdapter,x as createValidationError,H as createWrappedUserClient,u as delay,k as generateIdempotencyKey,A as generateIdempotencyKeySync,K as getPrefetchedQueryData,N as hasPrefetchedData,p as isAbortError,g as isRuntimeClientError,h as isTimeoutError,M as needsIdempotencyKey,y as normalizeError,c as shouldRetry,d as withRetry,f as withTimeout};
1
+ import{createUserClient as e}from"@djvlc/openapi-user-client";function t(e){return function(t){const n={"Content-Type":"application/json","X-App-Id":e.appId,"X-Runtime-Version":e.runtimeVersion,"X-Client-Version":e.clientVersion};if(t&&(n["X-Trace-Id"]=t),e.getToken){const t=e.getToken();t&&(n.Authorization=`Bearer ${t}`)}if(e.getApiKey){const t=e.getApiKey();t&&(n["X-API-Key"]=t)}if(e.extraHeaders){const t=e.extraHeaders();Object.assign(n,t)}return n}}function n(){return e=32,Array.from({length:e},()=>Math.floor(16*Math.random()).toString(16)).join("");var e}function r(){return e=16,Array.from({length:e},()=>Math.floor(16*Math.random()).toString(16)).join("");var e}function a(e,t){return`00-${e||n()}-${t||r()}-01`}var s=class{constructor(e){this.defaultTraceId=e||n()}getTraceId(){return this.defaultTraceId}setTraceId(e){this.defaultTraceId=e}resetTraceId(){return this.defaultTraceId=n(),this.defaultTraceId}withTrace(e,t){const n=this.defaultTraceId;this.defaultTraceId=e;try{return t()}finally{this.defaultTraceId=n}}async withTraceAsync(e,t){const n=this.defaultTraceId;this.defaultTraceId=e;try{return await t()}finally{this.defaultTraceId=n}}},o={enabled:!0,maxRetries:2,initialDelayMs:200,backoffMultiplier:2,maxDelayMs:2e3,retryableStatusCodes:[408,429,500,502,503,504]};function i(e,t){const n=t.initialDelayMs*Math.pow(t.backoffMultiplier,e),r=.1*n*(2*Math.random()-1);return Math.min(n+r,t.maxDelayMs)}function c(e,t,n){if(!n.enabled||t>=n.maxRetries)return!1;if(e instanceof TypeError)return!0;if(e instanceof Error&&"status"in e){const t=e.status;return n.retryableStatusCodes.includes(t)}return!(!e||"object"!=typeof e||!("httpStatus"in e)||"number"!=typeof e.httpStatus)&&n.retryableStatusCodes.includes(e.httpStatus)}function u(e){return new Promise(t=>setTimeout(t,e))}async function d(e,t={}){const n={...o,...t};let r;for(let t=0;t<=n.maxRetries;t++)try{return await e()}catch(e){if(r=e,!c(e,t,n))throw e;if(t<n.maxRetries){const e=i(t,n);await u(e)}}throw r}function l(e,t){const n=new AbortController;let r;return e&&e>0&&(r=setTimeout(()=>{n.abort(new Error(`Request timeout after ${e}ms`))},e)),t&&(t.aborted?n.abort(t.reason):t.addEventListener("abort",()=>{n.abort(t.reason)})),{controller:n,cleanup:()=>{r&&clearTimeout(r)}}}async function f(e,t,n){const{controller:r,cleanup:a}=l(t,n);try{return await Promise.race([e,new Promise((e,t)=>{r.signal.addEventListener("abort",()=>{t(r.signal.reason||new Error("Request aborted"))})})])}finally{a()}}function h(e){return e instanceof Error&&(e.message.includes("timeout")||e.message.includes("Timeout")||"TimeoutError"===e.name||"AbortError"===e.name)}function p(e){return e instanceof Error?"AbortError"===e.name||e.message.includes("aborted"):e instanceof DOMException&&"AbortError"===e.name}function g(e,t,n){return{name:"RuntimeClientError",kind:e,message:t,code:n?.code,httpStatus:n?.httpStatus,traceId:n?.traceId,details:n?.details,cause:n?.cause}}function y(e){return null!==e&&"object"==typeof e&&"name"in e&&"RuntimeClientError"===e.name}function m(e,t){if(y(e))return{...e,traceId:e.traceId||t};if(e instanceof TypeError&&e.message.includes("fetch"))return g("Network","Network request failed",{traceId:t,cause:e});if(e instanceof DOMException&&"AbortError"===e.name)return g("Abort","Request aborted",{traceId:t,cause:e});if(e instanceof Error){if(e.message.includes("timeout")||e.message.includes("Timeout"))return g("Timeout",e.message,{traceId:t,cause:e});if(e.message.includes("abort")||"AbortError"===e.name)return g("Abort",e.message,{traceId:t,cause:e})}if(e&&"object"==typeof e&&"status"in e&&"number"==typeof e.status){const n=e.status;return g("Http",e instanceof Error?e.message:`HTTP error ${n}`,{httpStatus:n,traceId:t,cause:e})}return e instanceof Error?g("Unknown",e.message,{traceId:t,cause:e}):g("Unknown",String(e),{traceId:t,cause:e})}function I(e,t,n,r){return g("Http",t,{httpStatus:e,traceId:n,details:r})}function T(e,t,n,r){return g("Biz",t,{code:e,traceId:n,details:r})}function x(e,t,n){return g("Validation",e,{code:"VALIDATION_ERROR",traceId:t,details:n})}var b=class{constructor(e){this.client=e.client,this.headersBuilder=e.headersBuilder,this.traceContext=e.traceContext,this.retryConfig=e.retryConfig||{},this.defaultTimeoutMs=e.defaultTimeoutMs||3e4}async resolvePage(e){const t=e.trace?.traceId||this.traceContext.getTraceId(),n=e.timeoutMs||this.defaultTimeoutMs,{controller:r,cleanup:a}=l(n,e.signal);try{const n=await d(async()=>await this.client.pages.resolvePage({pageId:e.pageId,env:"prod",uid:e.uid,deviceId:e.client?.deviceId,channel:void 0,xUserId:e.uid||"anonymous",xDeviceId:e.client?.deviceId||"unknown",xChannel:"web"},{signal:r.signal}),this.retryConfig);if(!n.data||"object"!=typeof n.data)throw x("Invalid page resolve response",t,{response:n});const a=n.data,s=await fetch(a.snapshotUrl,{signal:r.signal,headers:this.headersBuilder(t)});if(!s.ok)throw m({status:s.status},t);const o=await s.json(),i=this.convertSnapshotToPageSchema(o.page);return{pageVersionId:a.resolvedVersionId,page:i,prefetchedData:o.prefetchedData,meta:{cache:"MISS",resolvedAt:Date.now(),etag:a.etag,cacheTtlSeconds:a.cacheTtlSeconds}}}catch(e){throw m(e,t)}finally{a()}}convertSnapshotToPageSchema(e){return e}};function v(e){return new b(e)}var w=new Set(["claim","signin","form_submit","lottery","checkin","reserve","subscribe"]);function C(e){return w.has(e)}function S(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}async function k(e){const t=[e.actionType,e.context.pageId,e.context.pageVersionId,e.context.componentId||"",e.context.uid||"",JSON.stringify(e.payload,Object.keys(e.payload||{}).sort())].join("|");return(await async function(e){if("undefined"!=typeof crypto&&crypto.subtle){const t=(new TextEncoder).encode(e),n=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,"0")).join("")}return S(e)+S(e.split("").reverse().join(""))}(t)).substring(0,32)}function M(e){const t=[e.actionType,e.context.pageId,e.context.pageVersionId,e.context.componentId||"",e.context.uid||"",JSON.stringify(e.payload,Object.keys(e.payload||{}).sort())].join("|"),n=S(t),r=S(t.split("").reverse().join(""));return n+r+S(t+n)+S(r+t)}var V=class{constructor(e){this.client=e.client,this.traceContext=e.traceContext,this.defaultTimeoutMs=e.defaultTimeoutMs||3e4}async executeAction(e){const t=e.trace?.traceId||this.traceContext.getTraceId(),n=e.timeoutMs||this.defaultTimeoutMs;let r=e.idempotencyKey;!r&&C(e.actionType)&&(r=M({actionType:e.actionType,payload:e.payload,context:{pageId:e.context.pageId,pageVersionId:e.context.pageVersionId,componentId:e.context.componentId,uid:e.context.uid}}));const{controller:a,cleanup:s}=l(n,e.signal);try{const t=(await this.client.actions.executeAction({executeActionRequest:{actionType:e.actionType,params:e.payload,context:{pageVersionId:e.context.pageVersionId,deviceId:e.context.deviceId,channel:void 0,extra:{uid:e.context.uid,componentId:e.context.componentId}},idempotencyKey:r}},{signal:a.signal})).data;return t?.success?{ok:!0,data:t.data}:{ok:!1,error:{code:t?.errorCode||"BIZ_ERROR",message:t?.errorMessage||"Action failed",details:t}}}catch(e){const n=m(e,t);return{ok:!1,error:{code:n.code||n.kind,message:n.message,details:n.details}}}finally{s()}}};function A(e){return new V(e)}var D=class{constructor(e){this.client=e.client,this.traceContext=e.traceContext,this.retryConfig=e.retryConfig||{},this.defaultTimeoutMs=e.defaultTimeoutMs||3e4}async query(e){const t=e.trace?.traceId||this.traceContext.getTraceId(),n=e.timeoutMs||this.defaultTimeoutMs,{controller:r,cleanup:a}=l(n,e.signal);try{const t=await d(async()=>await this.client.queries.queryData({queryDataRequest:{queryVersionId:e.queryVersionId,params:e.params||{},context:{pageVersionId:e.context.pageVersionId}}},{signal:r.signal}),this.retryConfig),n=t.data;return n?.success?{ok:!0,data:n.data}:{ok:!1,error:{code:n?.errorCode||"QUERY_ERROR",message:n?.errorMessage||t.message||"Query failed",details:n}}}catch(e){const n=m(e,t);return{ok:!1,error:{code:n.code||n.kind,message:n.message,details:n.details}}}finally{a()}}};function R(e){return new D(e)}var E=class{constructor(e){this.eventBuffer=[],this.flushTimer=null,this.client=e.client,this.batchSize=e.batchSize||10,this.flushInterval=e.flushInterval||5e3}async track(e){for(const t of e.events)this.eventBuffer.push({event:t,context:e.context});this.eventBuffer.length>=this.batchSize?await this.flush():this.scheduleFlush()}async flush(e){if(0===this.eventBuffer.length)return;const t=[...this.eventBuffer];this.eventBuffer=[],this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=null);for(const{event:e,context:n}of t)try{await this.client.track.track({trackSingleRequest:{event:{eventName:e.eventName,eventType:e.eventType||"custom",properties:e.properties,timestamp:e.timestamp},context:{pageVersionId:n.pageVersionId,sessionId:n.sessionId}}})}catch(e){}}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>{this.flushTimer=null,this.flush().catch(()=>{})},this.flushInterval))}async destroy(){await this.flush()}};function q(e){return new E(e)}var j=class{constructor(e){this.defaultTenantId=e.defaultTenantId||"default",this.tenantConfigs=e.tenantConfigs||new Map}async resolveTenant(e){let t=this.defaultTenantId;if(e.path){const n=e.path.match(/^\/t\/([^/]+)/);n&&(t=n[1])}if(e.host){const n=e.host.match(/^([^.]+)\./);n&&"www"!==n[1]&&(t=n[1])}return{tenantId:t,config:this.tenantConfigs.get(t)||{}}}};function B(e){return new j(e)}function K(r){const a=r.debug??!1,o={debug:(...e)=>{},info:(...e)=>{},warn:(...e)=>{},error:(...e)=>{}};let i=!1;o.info("Creating SDK",{baseUrl:r.baseUrl,appId:r.appId,runtimeVersion:r.runtimeVersion,retry:r.retry??!1});const c=t({appId:r.appId,runtimeVersion:r.runtimeVersion,clientVersion:r.clientVersion,getToken:r.getToken,getApiKey:r.getApiKey,extraHeaders:r.extraHeaders}),u=new s;o.debug("TraceContext initialized",{traceId:u.getTraceId()});const d=e({baseUrl:r.baseUrl,timeout:r.timeoutMs??3e4,debug:a,headers:c(u.getTraceId()),enableRetry:!1});o.debug("UserClient created");const l=r.retry?{enabled:!0,maxRetries:r.maxRetries??2,initialDelayMs:r.retryDelayMs??200}:{enabled:!1},f={client:d,headersBuilder:c,traceContext:u,defaultTimeoutMs:r.timeoutMs},h=new b({...f,retryConfig:l}),p=new V(f),g=new D({...f,retryConfig:l}),y=new E({client:d,headersBuilder:c,traceContext:u}),m=new j({headersBuilder:c,traceContext:u,defaultTenantId:r.defaultTenantId});o.debug("Port adapters created");const I={tenant:m,page:h,data:g,action:p,track:y},T=function(e,t){return{async resolvePage(n){t.debug("Legacy resolvePage",{pageId:n.pageId});return(await e.pages.resolvePage({pageId:n.pageId,env:n.env,uid:n.uid,deviceId:n.deviceId,channel:n.channel,xUserId:n.uid||"anonymous",xDeviceId:n.deviceId||"unknown",xChannel:n.channel||"web"})).data},async executeAction(n){t.debug("Legacy executeAction",{actionType:n.actionType});const r=await e.actions.executeAction({executeActionRequest:{actionType:n.actionType,params:n.params,context:{pageVersionId:n.context.pageVersionId,deviceId:n.context.deviceId,channel:n.context.channel,extra:{uid:n.context.uid,appId:n.context.appId}},idempotencyKey:n.idempotencyKey}}),a=r.data;return{success:r.success,data:a,errorCode:a?.errorCode,errorMessage:a?.errorMessage}},async executeQuery(n){t.debug("Legacy executeQuery",{queryVersionId:n.queryVersionId});const r=await e.queries.queryData({queryDataRequest:{queryVersionId:n.queryVersionId,params:n.params??{},context:{pageVersionId:n.context.pageVersionId}}});return{success:r.success,data:r.data??void 0,message:r.message,errorMessage:r.success?void 0:r.message}},track(n){t.debug("Legacy track",{eventName:n.eventName}),e.track.track({trackSingleRequest:{event:{eventName:n.eventName,eventType:n.type??"custom",properties:n.params,timestamp:n.timestamp??void 0},context:{pageVersionId:n.context.pageVersionId,sessionId:n.context.userId}}}).catch(e=>{t.warn("Track failed (silent)",e)})}}}(d,o);return o.info("SDK created successfully"),{getPorts:()=>(P(i),I),getUserApiAdapter:()=>(P(i),T),getTraceContext:()=>(P(i),u),createTraceId:()=>n(),async flushTrack(){P(i),o.debug("Flushing track buffer"),await y.flush()},async destroy(){if(i)o.warn("destroy() called on already-destroyed SDK, ignoring");else{i=!0,o.info("Destroying SDK...");try{await y.destroy()}catch(e){o.error("Error during SDK destroy",e)}o.info("SDK destroyed")}},get destroyed(){return i}}}function P(e){if(e)throw new Error("[RuntimeClientSdk] SDK has been destroyed. Create a new instance with createRuntimeClientSdk().")}function U(e,t){t.prefetchedData&&e.setPrefetchedData(t.prefetchedData)}function O(e){return{pageVersionId:e.pageVersionId,prefetchedData:e.prefetchedData||{}}}function N(e,t){return e.prefetchedData?.[t]}function H(e){return void 0!==e.prefetchedData&&Object.keys(e.prefetchedData).length>0}function L(t){const n={baseUrl:t.baseUrl,timeout:t.timeoutMs||3e4,debug:t.debug,headers:t.headersBuilder(),enableRetry:!1};return e(n)}export{V as ActionAdapter,o as DEFAULT_RETRY_CONFIG,D as DataAdapter,b as PageRuntimeAdapter,j as TenantAdapter,s as TraceContext,E as TrackAdapter,U as applyPrefetch,i as calculateRetryDelay,A as createActionAdapter,T as createBizError,R as createDataAdapter,t as createHeadersBuilder,I as createHttpError,O as createInitialRuntimeState,v as createPageRuntimeAdapter,g as createRuntimeClientError,K as createRuntimeClientSdk,r as createSpanId,B as createTenantAdapter,l as createTimeoutController,n as createTraceId,a as createTraceparent,q as createTrackAdapter,x as createValidationError,L as createWrappedUserClient,u as delay,k as generateIdempotencyKey,M as generateIdempotencyKeySync,N as getPrefetchedQueryData,H as hasPrefetchedData,p as isAbortError,y as isRuntimeClientError,h as isTimeoutError,C as needsIdempotencyKey,m as normalizeError,c as shouldRetry,d as withRetry,f as withTimeout};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@djvlc/runtime-client-sdk",
3
- "version": "1.0.0",
3
+ "version": "1.1.1",
4
4
  "description": "DJV 低代码平台运行时 Client SDK - 数据面 API 唯一入口",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -28,7 +28,7 @@
28
28
  "clean": "rimraf dist"
29
29
  },
30
30
  "dependencies": {
31
- "@djvlc/runtime-core": "1.1.2"
31
+ "@djvlc/runtime-core": "1.2.1"
32
32
  },
33
33
  "peerDependenciesMeta": {
34
34
  "@djvlc/contracts-validators": {