@djvlc/runtime-client-sdk 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +43 -15
- package/dist/index.d.ts +43 -15
- package/dist/index.js +1 -1
- package/package.json +2 -2
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
|
+
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.
|
|
3
|
+
"version": "1.1.0",
|
|
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.
|
|
31
|
+
"@djvlc/runtime-core": "1.2.0"
|
|
32
32
|
},
|
|
33
33
|
"peerDependenciesMeta": {
|
|
34
34
|
"@djvlc/contracts-validators": {
|