@djvlc/runtime-client-sdk 1.1.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 +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 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()}};
|
|
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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@djvlc/runtime-client-sdk",
|
|
3
|
-
"version": "1.1.
|
|
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.2.
|
|
31
|
+
"@djvlc/runtime-core": "1.2.1"
|
|
32
32
|
},
|
|
33
33
|
"peerDependenciesMeta": {
|
|
34
34
|
"@djvlc/contracts-validators": {
|