@belocal/js-sdk 1.0.5 → 1.0.6

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/browser.cjs CHANGED
@@ -1,3 +1,3 @@
1
- 'use strict';var jsMd5=require('js-md5');var B="1.0.5";function C(i,t){let e=s=>{if(s==null)return s;if(Array.isArray(s))return s.map(e);if(typeof s=="object"){let a={};for(let u of Object.keys(s).sort())a[u]=e(s[u]);return a}return s},r=JSON.stringify(e(t));return `${i}:${r}`}var h=class{constructor(t,e){this.wrappedTransport=t;this.debug=e;this.inFlightRequests=new Map;}async post(t,e){let r=C(e,t),s=this.inFlightRequests.get(r);if(s)return this.debug&&console.log(`[DedupeTransport] Deduplicating request to ${e}`),s;let a=this.wrappedTransport.post(t,e).finally(()=>{this.inFlightRequests.delete(r);});return this.inFlightRequests.set(r,a),this.debug&&console.log(`[DedupeTransport] New request to ${e} (${this.inFlightRequests.size} in-flight)`),a}};var q="https://dynamic.belocal.dev",m=class{constructor(t){this.config=t;}async post(t,e){let r=`${q}${e}`,s=new AbortController,a=this.config.timeoutMs??1e4,u=setTimeout(()=>s.abort(),a);this.config.debug&&console.log(`[Base Browser Transport] POST request to ${r}`,t);try{let p=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json","x-sdk":"js","x-sdk-version":B,...this.config.headers},body:JSON.stringify(t),signal:s.signal});if(!p.ok){let o=`HTTP ${p.status}: ${p.statusText}`;throw this.config.debug&&console.error("[Base Browser Transport] Request failed:",o),new Error(o)}let n=await p.json();return this.config.debug&&console.log("[Base Browser Transport] Request successful:",n),n}finally{u&&clearTimeout(u);}}};function T(i){let t=new m(i);return new h(t,i.debug)}var d=class i extends Error{constructor(t="Transport destroyed"){super(t),this.name="TransportDestroyedError",Object.setPrototypeOf(this,i.prototype);}};function S(i,t,e,r){let s=[...i].sort(),a=r&&Object.keys(r).length>0?Object.fromEntries(Object.entries(r).sort(([p],[n])=>p.localeCompare(n))):null;return jsMd5.md5(JSON.stringify([s,t,e||null,a]))}async function O(i,t,e){i.debug&&console.log(`[BeLocal Multi Transport] Sending multi request with ${t.length} texts`);try{let r=new Map;t.forEach(n=>{let o=JSON.stringify({lang:n.lang,sourceLang:n.sourceLang||null,context:n.context||null});r.has(o)||r.set(o,[]),r.get(o).push(n);});let s=new Map,a=Array.from(r.entries()).map(([n,o])=>{let c=o[0],l=o.map(f=>f.text),g=S(l,c.lang,c.sourceLang,c.context);return s.set(g,o),{request_id:g,texts:l,lang:c.lang,source_lang:c.sourceLang,ctx:c.context}}),u=await i.baseTransport.post({requests:a},"/v1/translate/multi");i.debug&&console.log(`[BeLocal Multi Transport] Multi response received with ${u.results.length} groups`);let p=new Map;u.results.forEach(n=>{p.set(n.request_id,{texts:n.data.texts,status:n.data.status});}),s.forEach((n,o)=>{let c=p.get(o);if(!c){i.debug&&console.error(`[BeLocal Multi Transport] No result found for request_id: ${o}`),n.forEach(l=>{l.reject(new Error(`No result found for request ${o}`));});return}if(c.texts.length!==n.length){let l=new Error(`Mismatch: expected ${n.length} texts, got ${c.texts.length} for request_id ${o}`);i.debug&&console.error("[BeLocal Multi Transport]",l.message),n.forEach(g=>g.reject(l));return}n.forEach((l,g)=>{let f=c.texts[g],M=c.status||"success";i.debug&&console.log(`[BeLocal Multi Transport] Success for request_id ${o}[${g}]: "${f}"`),l.resolve({text:f,status:M});});});}catch(r){i.debug&&console.error("[BeLocal Multi Transport] Multi request error:",r);let s=r instanceof Error?r:new Error(String(r));t.forEach(a=>a.reject(s));}}function _(i,t){if(t.currentMulti.length===0||t.isRequestInFlight)return;let e=[...t.currentMulti];t.currentMulti=[],t.multiTimer=null,t.isRequestInFlight=true,O(i,e).finally(()=>{if(t.isRequestInFlight=false,t.currentMulti.length>0){let r=i.batchWindowMs??50;t.multiTimer=setTimeout(()=>_(i,t),r);}});}function b(i){let t=i.batchWindowMs??50,e={currentMulti:[],multiTimer:null,isRequestInFlight:false},r=(({text:s,lang:a,source_lang:u,ctx:p})=>new Promise((n,o)=>{if(i.debug){let l=jsMd5.md5(JSON.stringify([s,a,u||null,p||null]));console.log(`[BeLocal Multi Transport] Queuing request ${l}: "${s}" to ${a}`);}let c={text:s,lang:a,sourceLang:u,context:p,resolve:n,reject:o};e.currentMulti.push(c),e.multiTimer===null&&!e.isRequestInFlight&&(e.multiTimer=setTimeout(()=>_(i,e),t));}));return r.destroy=()=>{e.multiTimer&&(clearTimeout(e.multiTimer),e.multiTimer=null),e.currentMulti.forEach(s=>s.reject(new d)),e.currentMulti=[];},r}var y=class{constructor(t={}){this.storage=new Map;this.maxSize=t.maxSize??1e4,this.ttlMs=t.ttlMs??36e5;}get(t){let e=this.storage.get(t);return e===void 0?null:Date.now()>e.expiresAt?(this.storage.delete(t),null):(this.storage.delete(t),this.storage.set(t,e),e.value)}set(t,e){if(this.storage.delete(t),this.storage.size>=this.maxSize){let r=this.storage.keys().next().value;r!==void 0&&this.storage.delete(r);}this.storage.set(t,{value:e,expiresAt:Date.now()+this.ttlMs});}clear(){this.storage.clear();}};var x=class{constructor(t,e){let{apiKey:r,batchWindowMs:s=50,timeoutMs:a=1e4,debug:u=false,cacheTtlMs:p=36e5,cacheMaxSize:n=1e4}=t;if(!r||typeof r!="string")throw new Error("[BeLocal] apiKey is required and must be a non-empty string");if(typeof a!="number"||!Number.isFinite(a)||a<=0)throw new Error("[BeLocal] timeoutMs must be a positive finite number");let o=Math.max(0,s);this.debug=u,this.cache=new y({ttlMs:p,maxSize:n});let c={Authorization:`Bearer ${r}`},l=e({headers:c,timeoutMs:a,debug:this.debug});this.transport=b({baseTransport:l,debug:this.debug,batchWindowMs:o}),this.debug&&console.log("[BeLocal Engine] Multi transport created with config:",{baseUrl:"https://dynamic.belocal.dev",timeoutMs:a,batchWindowMs:o});}async translate(t,e,r){return (await this.translateMany([t],e,r))[0]}async translateMany(t,e,r){let{source_lang:s,ctx:a}=this.resolveOptions(r),u=new Array(t.length),p=[];for(let n=0;n<t.length;n++){let o=t[n],c=this.generateCacheKey(o,e,s,a),l=this.cache.get(c);if(l!==null){u[n]=l,this.debug&&console.log("[BeLocal Engine] Translation from cache:",o);continue}u[n]=null,p.push({index:n,text:o});}return p.length>0&&(await Promise.allSettled(p.map(async({index:o,text:c})=>{let l=await this.transport({text:c,lang:e,source_lang:s,ctx:a});if(l.status!=="error"){let g=this.generateCacheKey(c,e,s,a);this.cache.set(g,l.text),this.debug&&console.log("[BeLocal Engine] Translation from API, cached:",c);}else this.debug&&console.log("[BeLocal Engine] Translation from API (not cached due to error status):",c);return {index:o,translation:l.text}}))).forEach((o,c)=>{let{index:l,text:g}=p[c];if(o.status==="fulfilled")u[l]=o.value.translation;else {u[l]=g;let f=o.reason,M=f instanceof d;this.debug&&!M&&console.error("[BeLocal Engine] Translation failed, using original text:",g,f instanceof Error?f.message:String(f));}}),u}resolveOptions(t){if(!t)return {};let e={...t.ctx,...t.context&&{user_ctx:t.context},...t.managed&&{cache_type:"managed"}},r=Object.values(e).some(Boolean)?e:void 0;return {source_lang:t.source_lang,ctx:r}}destroy(){this.transport.destroy?.(),this.cache.clear();}generateCacheKey(t,e,r,s){let a=s?Object.fromEntries(Object.entries(s).sort(([p],[n])=>p.localeCompare(n))):null;return jsMd5.md5(JSON.stringify({text:t,lang:e,source_lang:r||null,ctx:a}))}};var L="product",$="chat";var E=class extends x{constructor(t){super(t,T);}};
2
- exports.BaseBrowserTransport=m;exports.BelocalEngine=E;exports.TransportDestroyedError=d;exports.USER_TYPE_CHAT=$;exports.USER_TYPE_PRODUCT=L;exports.createBaseBrowserTransport=T;exports.createMultiTransport=b;//# sourceMappingURL=browser.cjs.map
1
+ 'use strict';var jsMd5=require('js-md5');var w="1.0.6";function C(i,t){let e=s=>{if(s==null)return s;if(Array.isArray(s))return s.map(e);if(typeof s=="object"){let a={};for(let l of Object.keys(s).sort())a[l]=e(s[l]);return a}return s},r=JSON.stringify(e(t));return `${i}:${r}`}var T=class{constructor(t,e){this.wrappedTransport=t;this.debug=e;this.inFlightRequests=new Map;}async post(t,e){let r=C(e,t),s=this.inFlightRequests.get(r);if(s)return this.debug&&console.log(`[DedupeTransport] Deduplicating request to ${e}`),s;let a=this.wrappedTransport.post(t,e).finally(()=>{this.inFlightRequests.delete(r);});return this.inFlightRequests.set(r,a),this.debug&&console.log(`[DedupeTransport] New request to ${e} (${this.inFlightRequests.size} in-flight)`),a}};var O="https://dynamic.belocal.dev",m=class{constructor(t){this.config=t;}async post(t,e){let r=`${O}${e}`,s=new AbortController,a=this.config.timeoutMs??1e4,l=setTimeout(()=>s.abort(),a);this.config.debug&&console.log(`[Base Browser Transport] POST request to ${r}`,t);try{let p=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json","x-sdk":"js","x-sdk-version":w,...this.config.headers},body:JSON.stringify(t),signal:s.signal});if(!p.ok){let o=`HTTP ${p.status}: ${p.statusText}`;throw this.config.debug&&console.error("[Base Browser Transport] Request failed:",o),new Error(o)}let n=await p.json();return this.config.debug&&console.log("[Base Browser Transport] Request successful:",n),n}finally{l&&clearTimeout(l);}}};function x(i){let t=new m(i);return new T(t,i.debug)}var h=class i extends Error{constructor(t="Transport destroyed"){super(t),this.name="TransportDestroyedError",Object.setPrototypeOf(this,i.prototype);}};function v(i,t,e,r){let s=[...i].sort(),a=r&&Object.keys(r).length>0?Object.fromEntries(Object.entries(r).sort(([p],[n])=>p.localeCompare(n))):null;return jsMd5.md5(JSON.stringify([s,t,e||null,a]))}async function L(i,t,e){i.debug&&console.log(`[BeLocal Multi Transport] Sending multi request with ${t.length} texts`);try{let r=new Map;t.forEach(n=>{let o=JSON.stringify({lang:n.lang,sourceLang:n.sourceLang||null,context:n.context||null});r.has(o)||r.set(o,[]),r.get(o).push(n);});let s=new Map,a=Array.from(r.entries()).map(([n,o])=>{let u=o[0],c=new Map;o.forEach(d=>{c.has(d.text)||c.set(d.text,[]),c.get(d.text).push(d);});let g=Array.from(c.keys());i.debug&&g.length<o.length&&console.log(`[BeLocal Multi Transport] Deduplicated ${o.length} texts to ${g.length} unique`);let f=v(g,u.lang,u.sourceLang,u.context);return s.set(f,{uniqueTexts:g,textToItems:c}),{request_id:f,texts:g,lang:u.lang,source_lang:u.sourceLang,ctx:u.context}}),l=await i.baseTransport.post({requests:a},"/v1/translate/multi");i.debug&&console.log(`[BeLocal Multi Transport] Multi response received with ${l.results.length} groups`);let p=new Map;l.results.forEach(n=>{p.set(n.request_id,{texts:n.data.texts,status:n.data.status});}),s.forEach((n,o)=>{let u=p.get(o);if(!u){i.debug&&console.error(`[BeLocal Multi Transport] No result found for request_id: ${o}`),n.textToItems.forEach(c=>{c.forEach(g=>g.reject(new Error(`No result found for request ${o}`)));});return}if(u.texts.length!==n.uniqueTexts.length){let c=new Error(`Mismatch: expected ${n.uniqueTexts.length} texts, got ${u.texts.length} for request_id ${o}`);i.debug&&console.error("[BeLocal Multi Transport]",c.message),n.textToItems.forEach(g=>{g.forEach(f=>f.reject(c));});return}n.uniqueTexts.forEach((c,g)=>{let f=u.texts[g],d=u.status||"success",B=n.textToItems.get(c);i.debug&&console.log(`[BeLocal Multi Transport] Success for request_id ${o}[${g}]: "${f}" (${B.length} requester(s))`),B.forEach(R=>R.resolve({text:f,status:d}));});});}catch(r){i.debug&&console.error("[BeLocal Multi Transport] Multi request error:",r);let s=r instanceof Error?r:new Error(String(r));t.forEach(a=>a.reject(s));}}function _(i,t){if(t.currentMulti.length===0||t.isRequestInFlight)return;let e=[...t.currentMulti];t.currentMulti=[],t.multiTimer=null,t.isRequestInFlight=true,L(i,e).finally(()=>{if(t.isRequestInFlight=false,t.currentMulti.length>0){let r=i.batchWindowMs??50;t.multiTimer=setTimeout(()=>_(i,t),r);}});}function b(i){let t=i.batchWindowMs??50,e={currentMulti:[],multiTimer:null,isRequestInFlight:false},r=(({text:s,lang:a,source_lang:l,ctx:p})=>new Promise((n,o)=>{if(i.debug){let c=jsMd5.md5(JSON.stringify([s,a,l||null,p||null]));console.log(`[BeLocal Multi Transport] Queuing request ${c}: "${s}" to ${a}`);}let u={text:s,lang:a,sourceLang:l,context:p,resolve:n,reject:o};e.currentMulti.push(u),e.multiTimer===null&&!e.isRequestInFlight&&(e.multiTimer=setTimeout(()=>_(i,e),t));}));return r.destroy=()=>{e.multiTimer&&(clearTimeout(e.multiTimer),e.multiTimer=null),e.currentMulti.forEach(s=>s.reject(new h)),e.currentMulti=[];},r}var y=class{constructor(t={}){this.storage=new Map;this.maxSize=t.maxSize??1e4,this.ttlMs=t.ttlMs??36e5;}get(t){let e=this.storage.get(t);return e===void 0?null:Date.now()>e.expiresAt?(this.storage.delete(t),null):(this.storage.delete(t),this.storage.set(t,e),e.value)}set(t,e){if(this.storage.delete(t),this.storage.size>=this.maxSize){let r=this.storage.keys().next().value;r!==void 0&&this.storage.delete(r);}this.storage.set(t,{value:e,expiresAt:Date.now()+this.ttlMs});}clear(){this.storage.clear();}};var M=class{constructor(t,e){let{apiKey:r,batchWindowMs:s=50,timeoutMs:a=1e4,debug:l=false,cacheTtlMs:p=36e5,cacheMaxSize:n=1e4}=t;if(!r||typeof r!="string")throw new Error("[BeLocal] apiKey is required and must be a non-empty string");if(typeof a!="number"||!Number.isFinite(a)||a<=0)throw new Error("[BeLocal] timeoutMs must be a positive finite number");let o=Math.max(0,s);this.debug=l,this.cache=new y({ttlMs:p,maxSize:n});let u={Authorization:`Bearer ${r}`},c=e({headers:u,timeoutMs:a,debug:this.debug});this.transport=b({baseTransport:c,debug:this.debug,batchWindowMs:o}),this.debug&&console.log("[BeLocal Engine] Multi transport created with config:",{baseUrl:"https://dynamic.belocal.dev",timeoutMs:a,batchWindowMs:o});}async translate(t,e,r){return (await this.translateMany([t],e,r))[0]}async translateMany(t,e,r){let{source_lang:s,ctx:a}=this.resolveOptions(r),l=new Array(t.length),p=[];for(let n=0;n<t.length;n++){let o=t[n],u=this.generateCacheKey(o,e,s,a),c=this.cache.get(u);if(c!==null){l[n]=c,this.debug&&console.log("[BeLocal Engine] Translation from cache:",o);continue}l[n]=null,p.push({index:n,text:o});}return p.length>0&&(await Promise.allSettled(p.map(async({index:o,text:u})=>{let c=await this.transport({text:u,lang:e,source_lang:s,ctx:a});if(c.status!=="error"){let g=this.generateCacheKey(u,e,s,a);this.cache.set(g,c.text),this.debug&&console.log("[BeLocal Engine] Translation from API, cached:",u);}else this.debug&&console.log("[BeLocal Engine] Translation from API (not cached due to error status):",u);return {index:o,translation:c.text}}))).forEach((o,u)=>{let{index:c,text:g}=p[u];if(o.status==="fulfilled")l[c]=o.value.translation;else {l[c]=g;let f=o.reason,d=f instanceof h;this.debug&&!d&&console.error("[BeLocal Engine] Translation failed, using original text:",g,f instanceof Error?f.message:String(f));}}),l}resolveOptions(t){if(!t)return {};let e={...t.ctx,...t.context&&{user_ctx:t.context},...t.managed&&{cache_type:"managed"}},r=Object.values(e).some(Boolean)?e:void 0;return {source_lang:t.source_lang,ctx:r}}destroy(){this.transport.destroy?.(),this.cache.clear();}generateCacheKey(t,e,r,s){let a=s?Object.fromEntries(Object.entries(s).sort(([p],[n])=>p.localeCompare(n))):null;return jsMd5.md5(JSON.stringify({text:t,lang:e,source_lang:r||null,ctx:a}))}};var I="product",P="chat";var q=class extends M{constructor(t){super(t,x);}};
2
+ exports.BaseBrowserTransport=m;exports.BelocalEngine=q;exports.TransportDestroyedError=h;exports.USER_TYPE_CHAT=P;exports.USER_TYPE_PRODUCT=I;exports.createBaseBrowserTransport=x;exports.createMultiTransport=b;//# sourceMappingURL=browser.cjs.map
3
3
  //# sourceMappingURL=browser.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/version.ts","../src/transports/base/dedupe.ts","../src/transports/base/browser.ts","../src/core/errors.ts","../src/transports/multi.ts","../src/cache/local.ts","../src/core/engine/engine.ts","../src/core/types.ts","../src/core/engine/browser.ts"],"names":["SDK_VERSION","generateRequestKey","endpointPath","data","normalize","value","sorted","key","normalizedData","DedupeTransport","wrappedTransport","debug","requestKey","existingRequest","requestPromise","BASE_URL","BaseBrowserTransport","config","url","controller","timeoutMs","timeoutId","response","errorMsg","result","createBaseBrowserTransport","transport","TransportDestroyedError","_TransportDestroyedError","message","generateRequestId","texts","lang","sourceLang","context","sortedTexts","sortedContext","a","b","md5","sendMulti","items","state","groups","item","groupKey","requestIdToGroupItems","requests","groupItems","firstItem","requestId","multiResponse","resultMap","error","index","translatedText","status","errorToReject","processMulti","itemsToSend","windowMs","createMultiTransport","text","source_lang","ctx","resolve","reject","tempRequestId","requestItem","LocalCache","options","entry","oldestKey","BelocalEngine","baseTransportFactory","apiKey","batchWindowMs","cacheTtlMs","cacheMaxSize","safeBatchWindowMs","authHeaders","baseTransport","results","cacheMisses","i","cacheKey","cachedResult","settlement","reason","isExpectedDestroy","serverCtx","sortedCtx","USER_TYPE_PRODUCT","USER_TYPE_CHAT"],"mappings":"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","file":"browser.cjs","sourcesContent":["declare const __SDK_VERSION__: string;\nexport const SDK_VERSION = typeof __SDK_VERSION__ !== 'undefined' ? __SDK_VERSION__ : 'undefined';\nexport const SDK_NAME = 'js';\n","import type { BaseTransport } from '../../core/types';\n\nfunction generateRequestKey(endpointPath: string, data: any): string {\n const normalize = (value: any): any => {\n if (value === null || value === undefined) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(normalize);\n }\n if (typeof value === 'object') {\n const sorted: Record<string, any> = {};\n for (const key of Object.keys(value).sort()) {\n sorted[key] = normalize(value[key]);\n }\n return sorted;\n }\n return value;\n };\n\n const normalizedData = JSON.stringify(normalize(data));\n return `${endpointPath}:${normalizedData}`;\n}\n\n/** Deduplicates identical in-flight requests so they share a single HTTP call. */\nexport class DedupeTransport implements BaseTransport {\n private inFlightRequests = new Map<string, Promise<any>>();\n\n constructor(\n private wrappedTransport: BaseTransport,\n private debug?: boolean\n ) {}\n\n async post(data: any, endpointPath: string): Promise<any> {\n const requestKey = generateRequestKey(endpointPath, data);\n\n const existingRequest = this.inFlightRequests.get(requestKey);\n if (existingRequest) {\n if (this.debug) {\n console.log(`[DedupeTransport] Deduplicating request to ${endpointPath}`);\n }\n return existingRequest;\n }\n\n const requestPromise = this.wrappedTransport.post(data, endpointPath)\n .finally(() => {\n this.inFlightRequests.delete(requestKey);\n });\n\n this.inFlightRequests.set(requestKey, requestPromise);\n\n if (this.debug) {\n console.log(`[DedupeTransport] New request to ${endpointPath} (${this.inFlightRequests.size} in-flight)`);\n }\n\n return requestPromise;\n }\n}\n","import type { BaseTransport } from '../../core/types';\nimport { SDK_NAME, SDK_VERSION } from '../../version';\nimport { DedupeTransport } from './dedupe';\n\nconst BASE_URL = 'https://dynamic.belocal.dev';\n\nexport interface BaseBrowserTransportConfig {\n headers?: Record<string, string>;\n timeoutMs?: number;\n debug?: boolean;\n}\n\nexport class BaseBrowserTransport implements BaseTransport {\n constructor(private config: BaseBrowserTransportConfig) {}\n\n async post(data: any, endpointPath: string): Promise<any> {\n const url = `${BASE_URL}${endpointPath}`;\n const controller = new AbortController();\n const timeoutMs = this.config.timeoutMs ?? 10000;\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n if (this.config.debug) {\n console.log(`[Base Browser Transport] POST request to ${url}`, data);\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-sdk': SDK_NAME,\n 'x-sdk-version': SDK_VERSION,\n ...this.config.headers,\n },\n body: JSON.stringify(data),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorMsg = `HTTP ${response.status}: ${response.statusText}`;\n if (this.config.debug) {\n console.error(`[Base Browser Transport] Request failed:`, errorMsg);\n }\n throw new Error(errorMsg);\n }\n\n const result = await response.json();\n if (this.config.debug) {\n console.log(`[Base Browser Transport] Request successful:`, result);\n }\n \n return result;\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n }\n}\n\nexport function createBaseBrowserTransport(config: BaseBrowserTransportConfig): BaseTransport {\n const transport = new BaseBrowserTransport(config);\n return new DedupeTransport(transport, config.debug);\n}\n","export class TransportDestroyedError extends Error {\n constructor(message = 'Transport destroyed') {\n super(message);\n this.name = 'TransportDestroyedError';\n Object.setPrototypeOf(this, TransportDestroyedError.prototype);\n }\n}\n","import type { Transport, BaseTransport, TranslationCtx } from '../core/types';\nimport { TransportDestroyedError } from '../core/errors';\nimport { md5 } from 'js-md5';\n\nexport interface MultiTransportConfig {\n baseTransport: BaseTransport;\n debug?: boolean;\n batchWindowMs?: number;\n}\n\ninterface MultiRequest {\n request_id: string;\n texts: string[];\n lang: string;\n source_lang?: string;\n ctx?: TranslationCtx;\n}\n\ninterface MultiRequestItem {\n text: string;\n lang: string;\n sourceLang?: string;\n context?: TranslationCtx;\n resolve: (value: { text: string; status: string }) => void;\n reject: (error: Error) => void;\n}\n\ninterface MultiResponse {\n results: Array<{\n request_id: string;\n data: { texts: string[]; status: string };\n }>;\n}\n\ninterface MultiState {\n currentMulti: MultiRequestItem[];\n multiTimer: ReturnType<typeof setTimeout> | null;\n isRequestInFlight: boolean;\n}\n\nfunction generateRequestId(texts: string[], lang: string, sourceLang?: string, context?: TranslationCtx): string {\n const sortedTexts = [...texts].sort();\n\n const sortedContext = context && Object.keys(context).length > 0\n ? Object.fromEntries(Object.entries(context).sort(([a], [b]) => a.localeCompare(b)))\n : null;\n\n const data = [sortedTexts, lang, sourceLang || null, sortedContext];\n return md5(JSON.stringify(data));\n}\n\nasync function sendMulti(\n config: MultiTransportConfig,\n items: MultiRequestItem[],\n state: MultiState\n): Promise<void> {\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Sending multi request with ${items.length} texts`);\n }\n\n try {\n const groups = new Map<string, MultiRequestItem[]>();\n\n items.forEach(item => {\n const groupKey = JSON.stringify({\n lang: item.lang,\n sourceLang: item.sourceLang || null,\n context: item.context || null\n });\n\n if (!groups.has(groupKey)) {\n groups.set(groupKey, []);\n }\n groups.get(groupKey)!.push(item);\n });\n\n const requestIdToGroupItems = new Map<string, MultiRequestItem[]>();\n const requests: MultiRequest[] = Array.from(groups.entries()).map(([groupKey, groupItems]) => {\n const firstItem = groupItems[0];\n const texts = groupItems.map(item => item.text);\n\n const requestId = generateRequestId(\n texts,\n firstItem.lang,\n firstItem.sourceLang,\n firstItem.context\n );\n\n requestIdToGroupItems.set(requestId, groupItems);\n\n return {\n request_id: requestId,\n texts,\n lang: firstItem.lang,\n source_lang: firstItem.sourceLang,\n ctx: firstItem.context\n };\n });\n\n const multiResponse: MultiResponse = await config.baseTransport.post({ requests }, '/v1/translate/multi');\n\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Multi response received with ${multiResponse.results.length} groups`);\n }\n\n const resultMap = new Map<string, { texts: string[]; status: string }>();\n multiResponse.results.forEach(result => {\n resultMap.set(result.request_id, { texts: result.data.texts, status: result.data.status });\n });\n\n requestIdToGroupItems.forEach((groupItems, requestId) => {\n const result = resultMap.get(requestId);\n\n if (!result) {\n if (config.debug) {\n console.error(`[BeLocal Multi Transport] No result found for request_id: ${requestId}`);\n }\n groupItems.forEach(item => {\n item.reject(new Error(`No result found for request ${requestId}`));\n });\n return;\n }\n\n if (result.texts.length !== groupItems.length) {\n const error = new Error(`Mismatch: expected ${groupItems.length} texts, got ${result.texts.length} for request_id ${requestId}`);\n if (config.debug) {\n console.error(`[BeLocal Multi Transport]`, error.message);\n }\n groupItems.forEach(item => item.reject(error));\n return;\n }\n\n groupItems.forEach((item, index) => {\n const translatedText = result.texts[index];\n const status = result.status || 'success';\n\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Success for request_id ${requestId}[${index}]: \"${translatedText}\"`);\n }\n\n item.resolve({ text: translatedText, status });\n });\n });\n } catch (error) {\n if (config.debug) {\n console.error(`[BeLocal Multi Transport] Multi request error:`, error);\n }\n\n const errorToReject = error instanceof Error ? error : new Error(String(error));\n items.forEach(item => item.reject(errorToReject));\n }\n}\n\nfunction processMulti(config: MultiTransportConfig, state: MultiState): void {\n if (state.currentMulti.length === 0 || state.isRequestInFlight) {\n return;\n }\n\n const itemsToSend = [...state.currentMulti];\n state.currentMulti = [];\n state.multiTimer = null;\n state.isRequestInFlight = true;\n\n sendMulti(config, itemsToSend, state).finally(() => {\n state.isRequestInFlight = false;\n\n if (state.currentMulti.length > 0) {\n const windowMs = config.batchWindowMs ?? 50;\n state.multiTimer = setTimeout(() => processMulti(config, state), windowMs);\n }\n });\n}\n\nexport function createMultiTransport(config: MultiTransportConfig): Transport {\n const windowMs = config.batchWindowMs ?? 50;\n\n const state: MultiState = {\n currentMulti: [],\n multiTimer: null,\n isRequestInFlight: false,\n };\n\n const transport = (({ text, lang, source_lang, ctx }) => {\n return new Promise<{ text: string; status: string }>((resolve, reject) => {\n if (config.debug) {\n const tempRequestId = md5(JSON.stringify([text, lang, source_lang || null, ctx || null]));\n console.log(`[BeLocal Multi Transport] Queuing request ${tempRequestId}: \"${text}\" to ${lang}`);\n }\n\n const requestItem: MultiRequestItem = {\n text,\n lang,\n sourceLang: source_lang,\n context: ctx,\n resolve,\n reject,\n };\n\n state.currentMulti.push(requestItem);\n\n if (state.multiTimer === null && !state.isRequestInFlight) {\n state.multiTimer = setTimeout(() => processMulti(config, state), windowMs);\n }\n });\n }) as Transport & { destroy: () => void };\n\n transport.destroy = () => {\n if (state.multiTimer) {\n clearTimeout(state.multiTimer);\n state.multiTimer = null;\n }\n state.currentMulti.forEach(item =>\n item.reject(new TransportDestroyedError())\n );\n state.currentMulti = [];\n };\n\n return transport;\n}\n","import type { Cache, CacheOptions } from './types';\n\ninterface CacheEntry {\n value: string;\n expiresAt: number;\n}\n\nexport class LocalCache implements Cache {\n private storage = new Map<string, CacheEntry>();\n private maxSize: number;\n private ttlMs: number;\n\n constructor(options: CacheOptions = {}) {\n this.maxSize = options.maxSize ?? 10_000;\n this.ttlMs = options.ttlMs ?? 3_600_000;\n }\n\n get(key: string): string | null {\n const entry = this.storage.get(key);\n if (entry === undefined) return null;\n\n if (Date.now() > entry.expiresAt) {\n this.storage.delete(key);\n return null;\n }\n\n this.storage.delete(key);\n this.storage.set(key, entry);\n\n return entry.value;\n }\n\n set(key: string, value: string): void {\n this.storage.delete(key);\n\n if (this.storage.size >= this.maxSize) {\n const oldestKey = this.storage.keys().next().value;\n if (oldestKey !== undefined) {\n this.storage.delete(oldestKey);\n }\n }\n\n this.storage.set(key, {\n value,\n expiresAt: Date.now() + this.ttlMs,\n });\n }\n\n clear(): void {\n this.storage.clear();\n }\n}\n","import type { BelocalEngineOptions, Lang, TranslateOptions, TranslationCtx, Transport, BaseTransport } from '../types';\nimport { TransportDestroyedError } from '../errors';\nimport { createMultiTransport } from '../../transports/multi';\nimport { LocalCache } from '../../cache/local';\nimport type { Cache } from '../../cache/types';\nimport { md5 } from 'js-md5';\n\nexport class BelocalEngine {\n private transport: Transport;\n private debug: boolean;\n private cache: Cache;\n\n constructor(options: BelocalEngineOptions, baseTransportFactory: (opts: any) => BaseTransport) {\n const {\n apiKey,\n batchWindowMs = 50,\n timeoutMs = 10000,\n debug = false,\n cacheTtlMs = 3_600_000,\n cacheMaxSize = 10_000\n } = options;\n\n if (!apiKey || typeof apiKey !== 'string') {\n throw new Error('[BeLocal] apiKey is required and must be a non-empty string');\n }\n\n if (typeof timeoutMs !== 'number' || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new Error('[BeLocal] timeoutMs must be a positive finite number');\n }\n\n const safeBatchWindowMs = Math.max(0, batchWindowMs);\n\n this.debug = debug;\n this.cache = new LocalCache({ ttlMs: cacheTtlMs, maxSize: cacheMaxSize });\n\n const authHeaders = {\n 'Authorization': `Bearer ${apiKey}`\n };\n\n const baseTransport = baseTransportFactory({\n headers: authHeaders,\n timeoutMs,\n debug: this.debug\n });\n\n this.transport = createMultiTransport({\n baseTransport,\n debug: this.debug,\n batchWindowMs: safeBatchWindowMs\n });\n\n if (this.debug) {\n console.log('[BeLocal Engine] Multi transport created with config:', {\n baseUrl: 'https://dynamic.belocal.dev',\n timeoutMs,\n batchWindowMs: safeBatchWindowMs\n });\n }\n }\n\n /** Translates a single text string to the target language. */\n async translate(text: string, lang: Lang, options?: TranslateOptions): Promise<string> {\n const results = await this.translateMany([text], lang, options);\n return results[0];\n }\n\n /** Translates multiple text strings to the target language in a single batch. */\n async translateMany(texts: string[], lang: Lang, options?: TranslateOptions): Promise<string[]> {\n const { source_lang, ctx } = this.resolveOptions(options);\n const results: (string | null)[] = new Array(texts.length);\n const cacheMisses: Array<{ index: number; text: string }> = [];\n\n for (let i = 0; i < texts.length; i++) {\n const text = texts[i];\n const cacheKey = this.generateCacheKey(text, lang, source_lang, ctx);\n\n const cachedResult = this.cache.get(cacheKey);\n if (cachedResult !== null) {\n results[i] = cachedResult;\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from cache:', text);\n }\n continue;\n }\n\n results[i] = null;\n cacheMisses.push({ index: i, text });\n }\n\n if (cacheMisses.length > 0) {\n const settlements = await Promise.allSettled(\n cacheMisses.map(async ({ index, text }) => {\n const result = await this.transport({ text, lang, source_lang, ctx });\n\n if (result.status !== 'error') {\n const cacheKey = this.generateCacheKey(text, lang, source_lang, ctx);\n this.cache.set(cacheKey, result.text);\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from API, cached:', text);\n }\n } else {\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from API (not cached due to error status):', text);\n }\n }\n\n return { index, translation: result.text };\n })\n );\n\n settlements.forEach((settlement, i) => {\n const { index, text } = cacheMisses[i];\n if (settlement.status === 'fulfilled') {\n results[index] = settlement.value.translation;\n } else {\n results[index] = text;\n const reason = settlement.reason;\n const isExpectedDestroy = reason instanceof TransportDestroyedError;\n if (this.debug && !isExpectedDestroy) {\n console.error(\n '[BeLocal Engine] Translation failed, using original text:',\n text,\n reason instanceof Error ? reason.message : String(reason)\n );\n }\n }\n });\n }\n\n return results as string[];\n }\n\n private resolveOptions(options?: TranslateOptions): { source_lang?: string; ctx?: TranslationCtx } {\n if (!options) return {};\n const serverCtx: TranslationCtx = {\n ...options.ctx,\n ...(options.context && { user_ctx: options.context }),\n ...(options.managed && { cache_type: 'managed' }),\n };\n const ctx = Object.values(serverCtx).some(Boolean) ? serverCtx : undefined;\n return { source_lang: options.source_lang, ctx };\n }\n\n /** Cleans up internal resources (timers, cache). Call when the engine is no longer needed. */\n destroy(): void {\n (this.transport as any).destroy?.();\n this.cache.clear();\n }\n\n private generateCacheKey(text: string, lang: Lang, source_lang?: string, ctx?: TranslationCtx): string {\n const sortedCtx = ctx\n ? Object.fromEntries(Object.entries(ctx).sort(([a], [b]) => a.localeCompare(b)))\n : null;\n\n const data = {\n text,\n lang,\n source_lang: source_lang || null,\n ctx: sortedCtx\n };\n return md5(JSON.stringify(data));\n }\n}\n","export type Lang = string;\n\nexport type UserCtx = {\n user_type?: string;\n entity_key?: string;\n entity_id?: string;\n};\n\nexport type TranslationCtx = {\n user_type?: string;\n user_ctx?: string;\n cache_type?: string;\n entity_key?: string;\n entity_id?: string;\n};\n\nexport const USER_TYPE_PRODUCT = 'product';\nexport const USER_TYPE_CHAT = 'chat';\n\nexport type TranslateOptions = {\n source_lang?: string;\n context?: string;\n managed?: boolean;\n ctx?: UserCtx;\n};\n\nexport interface BaseTransport {\n post(data: any, endpointPath: string): Promise<any>;\n}\n\nexport type Transport = (params: { text: string; lang: Lang; source_lang?: string; ctx?: TranslationCtx }) => Promise<{ text: string; status: string }>;\n\nexport interface BelocalEngineOptions {\n apiKey: string;\n batchWindowMs?: number;\n timeoutMs?: number;\n debug?: boolean;\n cacheTtlMs?: number;\n cacheMaxSize?: number;\n}\n","import type { BelocalEngineOptions } from '../types';\nimport { createBaseBrowserTransport } from '../../transports/base/browser';\nimport { BelocalEngine as BaseEngine } from './engine';\n\nexport class BelocalEngine extends BaseEngine {\n constructor(options: BelocalEngineOptions) {\n super(options, createBaseBrowserTransport);\n }\n}\n\nexport type { BelocalEngineOptions, Lang, TranslateOptions, BaseTransport, TranslationCtx, UserCtx } from '../types';\nexport { TransportDestroyedError } from '../errors';\nexport { USER_TYPE_PRODUCT, USER_TYPE_CHAT } from '../types';\nexport { createMultiTransport } from '../../transports/multi';\nexport { BaseBrowserTransport, createBaseBrowserTransport } from '../../transports/base';\n"]}
1
+ {"version":3,"sources":["../src/version.ts","../src/transports/base/dedupe.ts","../src/transports/base/browser.ts","../src/core/errors.ts","../src/transports/multi.ts","../src/cache/local.ts","../src/core/engine/engine.ts","../src/core/types.ts","../src/core/engine/browser.ts"],"names":["SDK_VERSION","generateRequestKey","endpointPath","data","normalize","value","sorted","key","normalizedData","DedupeTransport","wrappedTransport","debug","requestKey","existingRequest","requestPromise","BASE_URL","BaseBrowserTransport","config","url","controller","timeoutMs","timeoutId","response","errorMsg","result","createBaseBrowserTransport","transport","TransportDestroyedError","_TransportDestroyedError","message","generateRequestId","texts","lang","sourceLang","context","sortedTexts","sortedContext","a","b","md5","sendMulti","items","state","groups","item","groupKey","requestIdToMeta","requests","groupItems","firstItem","textToItems","uniqueTexts","requestId","multiResponse","resultMap","meta","error","originalText","index","translatedText","status","errorToReject","processMulti","itemsToSend","windowMs","createMultiTransport","text","source_lang","ctx","resolve","reject","tempRequestId","requestItem","LocalCache","options","entry","oldestKey","BelocalEngine","baseTransportFactory","apiKey","batchWindowMs","cacheTtlMs","cacheMaxSize","safeBatchWindowMs","authHeaders","baseTransport","results","cacheMisses","i","cacheKey","cachedResult","settlement","reason","isExpectedDestroy","serverCtx","sortedCtx","USER_TYPE_PRODUCT","USER_TYPE_CHAT"],"mappings":"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","file":"browser.cjs","sourcesContent":["declare const __SDK_VERSION__: string;\nexport const SDK_VERSION = typeof __SDK_VERSION__ !== 'undefined' ? __SDK_VERSION__ : 'undefined';\nexport const SDK_NAME = 'js';\n","import type { BaseTransport } from '../../core/types';\n\nfunction generateRequestKey(endpointPath: string, data: any): string {\n const normalize = (value: any): any => {\n if (value === null || value === undefined) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(normalize);\n }\n if (typeof value === 'object') {\n const sorted: Record<string, any> = {};\n for (const key of Object.keys(value).sort()) {\n sorted[key] = normalize(value[key]);\n }\n return sorted;\n }\n return value;\n };\n\n const normalizedData = JSON.stringify(normalize(data));\n return `${endpointPath}:${normalizedData}`;\n}\n\n/** Deduplicates identical in-flight requests so they share a single HTTP call. */\nexport class DedupeTransport implements BaseTransport {\n private inFlightRequests = new Map<string, Promise<any>>();\n\n constructor(\n private wrappedTransport: BaseTransport,\n private debug?: boolean\n ) {}\n\n async post(data: any, endpointPath: string): Promise<any> {\n const requestKey = generateRequestKey(endpointPath, data);\n\n const existingRequest = this.inFlightRequests.get(requestKey);\n if (existingRequest) {\n if (this.debug) {\n console.log(`[DedupeTransport] Deduplicating request to ${endpointPath}`);\n }\n return existingRequest;\n }\n\n const requestPromise = this.wrappedTransport.post(data, endpointPath)\n .finally(() => {\n this.inFlightRequests.delete(requestKey);\n });\n\n this.inFlightRequests.set(requestKey, requestPromise);\n\n if (this.debug) {\n console.log(`[DedupeTransport] New request to ${endpointPath} (${this.inFlightRequests.size} in-flight)`);\n }\n\n return requestPromise;\n }\n}\n","import type { BaseTransport } from '../../core/types';\nimport { SDK_NAME, SDK_VERSION } from '../../version';\nimport { DedupeTransport } from './dedupe';\n\nconst BASE_URL = 'https://dynamic.belocal.dev';\n\nexport interface BaseBrowserTransportConfig {\n headers?: Record<string, string>;\n timeoutMs?: number;\n debug?: boolean;\n}\n\nexport class BaseBrowserTransport implements BaseTransport {\n constructor(private config: BaseBrowserTransportConfig) {}\n\n async post(data: any, endpointPath: string): Promise<any> {\n const url = `${BASE_URL}${endpointPath}`;\n const controller = new AbortController();\n const timeoutMs = this.config.timeoutMs ?? 10000;\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n if (this.config.debug) {\n console.log(`[Base Browser Transport] POST request to ${url}`, data);\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-sdk': SDK_NAME,\n 'x-sdk-version': SDK_VERSION,\n ...this.config.headers,\n },\n body: JSON.stringify(data),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorMsg = `HTTP ${response.status}: ${response.statusText}`;\n if (this.config.debug) {\n console.error(`[Base Browser Transport] Request failed:`, errorMsg);\n }\n throw new Error(errorMsg);\n }\n\n const result = await response.json();\n if (this.config.debug) {\n console.log(`[Base Browser Transport] Request successful:`, result);\n }\n \n return result;\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n }\n}\n\nexport function createBaseBrowserTransport(config: BaseBrowserTransportConfig): BaseTransport {\n const transport = new BaseBrowserTransport(config);\n return new DedupeTransport(transport, config.debug);\n}\n","export class TransportDestroyedError extends Error {\n constructor(message = 'Transport destroyed') {\n super(message);\n this.name = 'TransportDestroyedError';\n Object.setPrototypeOf(this, TransportDestroyedError.prototype);\n }\n}\n","import type { Transport, BaseTransport, TranslationCtx } from '../core/types';\nimport { TransportDestroyedError } from '../core/errors';\nimport { md5 } from 'js-md5';\n\nexport interface MultiTransportConfig {\n baseTransport: BaseTransport;\n debug?: boolean;\n batchWindowMs?: number;\n}\n\ninterface MultiRequest {\n request_id: string;\n texts: string[];\n lang: string;\n source_lang?: string;\n ctx?: TranslationCtx;\n}\n\ninterface MultiRequestItem {\n text: string;\n lang: string;\n sourceLang?: string;\n context?: TranslationCtx;\n resolve: (value: { text: string; status: string }) => void;\n reject: (error: Error) => void;\n}\n\ninterface MultiResponse {\n results: Array<{\n request_id: string;\n data: { texts: string[]; status: string };\n }>;\n}\n\ninterface MultiState {\n currentMulti: MultiRequestItem[];\n multiTimer: ReturnType<typeof setTimeout> | null;\n isRequestInFlight: boolean;\n}\n\nfunction generateRequestId(texts: string[], lang: string, sourceLang?: string, context?: TranslationCtx): string {\n const sortedTexts = [...texts].sort();\n\n const sortedContext = context && Object.keys(context).length > 0\n ? Object.fromEntries(Object.entries(context).sort(([a], [b]) => a.localeCompare(b)))\n : null;\n\n const data = [sortedTexts, lang, sourceLang || null, sortedContext];\n return md5(JSON.stringify(data));\n}\n\nasync function sendMulti(\n config: MultiTransportConfig,\n items: MultiRequestItem[],\n state: MultiState\n): Promise<void> {\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Sending multi request with ${items.length} texts`);\n }\n\n try {\n const groups = new Map<string, MultiRequestItem[]>();\n\n items.forEach(item => {\n const groupKey = JSON.stringify({\n lang: item.lang,\n sourceLang: item.sourceLang || null,\n context: item.context || null\n });\n\n if (!groups.has(groupKey)) {\n groups.set(groupKey, []);\n }\n groups.get(groupKey)!.push(item);\n });\n\n // Per-group: deduplicate texts, track which items map to which unique text\n interface GroupMeta {\n uniqueTexts: string[];\n /** Maps each unique text to all group items that requested it */\n textToItems: Map<string, MultiRequestItem[]>;\n }\n\n const requestIdToMeta = new Map<string, GroupMeta>();\n const requests: MultiRequest[] = Array.from(groups.entries()).map(([groupKey, groupItems]) => {\n const firstItem = groupItems[0];\n\n // Deduplicate texts within the group\n const textToItems = new Map<string, MultiRequestItem[]>();\n groupItems.forEach(item => {\n if (!textToItems.has(item.text)) {\n textToItems.set(item.text, []);\n }\n textToItems.get(item.text)!.push(item);\n });\n\n const uniqueTexts = Array.from(textToItems.keys());\n\n if (config.debug && uniqueTexts.length < groupItems.length) {\n console.log(`[BeLocal Multi Transport] Deduplicated ${groupItems.length} texts to ${uniqueTexts.length} unique`);\n }\n\n const requestId = generateRequestId(\n uniqueTexts,\n firstItem.lang,\n firstItem.sourceLang,\n firstItem.context\n );\n\n requestIdToMeta.set(requestId, { uniqueTexts, textToItems });\n\n return {\n request_id: requestId,\n texts: uniqueTexts,\n lang: firstItem.lang,\n source_lang: firstItem.sourceLang,\n ctx: firstItem.context\n };\n });\n\n const multiResponse: MultiResponse = await config.baseTransport.post({ requests }, '/v1/translate/multi');\n\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Multi response received with ${multiResponse.results.length} groups`);\n }\n\n const resultMap = new Map<string, { texts: string[]; status: string }>();\n multiResponse.results.forEach(result => {\n resultMap.set(result.request_id, { texts: result.data.texts, status: result.data.status });\n });\n\n requestIdToMeta.forEach((meta, requestId) => {\n const result = resultMap.get(requestId);\n\n if (!result) {\n if (config.debug) {\n console.error(`[BeLocal Multi Transport] No result found for request_id: ${requestId}`);\n }\n meta.textToItems.forEach(items => {\n items.forEach(item => item.reject(new Error(`No result found for request ${requestId}`)));\n });\n return;\n }\n\n if (result.texts.length !== meta.uniqueTexts.length) {\n const error = new Error(`Mismatch: expected ${meta.uniqueTexts.length} texts, got ${result.texts.length} for request_id ${requestId}`);\n if (config.debug) {\n console.error(`[BeLocal Multi Transport]`, error.message);\n }\n meta.textToItems.forEach(items => {\n items.forEach(item => item.reject(error));\n });\n return;\n }\n\n // Fan out each translated text to all items that requested that original text\n meta.uniqueTexts.forEach((originalText, index) => {\n const translatedText = result.texts[index];\n const status = result.status || 'success';\n const items = meta.textToItems.get(originalText)!;\n\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Success for request_id ${requestId}[${index}]: \"${translatedText}\" (${items.length} requester(s))`);\n }\n\n items.forEach(item => item.resolve({ text: translatedText, status }));\n });\n });\n } catch (error) {\n if (config.debug) {\n console.error(`[BeLocal Multi Transport] Multi request error:`, error);\n }\n\n const errorToReject = error instanceof Error ? error : new Error(String(error));\n items.forEach(item => item.reject(errorToReject));\n }\n}\n\nfunction processMulti(config: MultiTransportConfig, state: MultiState): void {\n if (state.currentMulti.length === 0 || state.isRequestInFlight) {\n return;\n }\n\n const itemsToSend = [...state.currentMulti];\n state.currentMulti = [];\n state.multiTimer = null;\n state.isRequestInFlight = true;\n\n sendMulti(config, itemsToSend, state).finally(() => {\n state.isRequestInFlight = false;\n\n if (state.currentMulti.length > 0) {\n const windowMs = config.batchWindowMs ?? 50;\n state.multiTimer = setTimeout(() => processMulti(config, state), windowMs);\n }\n });\n}\n\nexport function createMultiTransport(config: MultiTransportConfig): Transport {\n const windowMs = config.batchWindowMs ?? 50;\n\n const state: MultiState = {\n currentMulti: [],\n multiTimer: null,\n isRequestInFlight: false,\n };\n\n const transport = (({ text, lang, source_lang, ctx }) => {\n return new Promise<{ text: string; status: string }>((resolve, reject) => {\n if (config.debug) {\n const tempRequestId = md5(JSON.stringify([text, lang, source_lang || null, ctx || null]));\n console.log(`[BeLocal Multi Transport] Queuing request ${tempRequestId}: \"${text}\" to ${lang}`);\n }\n\n const requestItem: MultiRequestItem = {\n text,\n lang,\n sourceLang: source_lang,\n context: ctx,\n resolve,\n reject,\n };\n\n state.currentMulti.push(requestItem);\n\n if (state.multiTimer === null && !state.isRequestInFlight) {\n state.multiTimer = setTimeout(() => processMulti(config, state), windowMs);\n }\n });\n }) as Transport & { destroy: () => void };\n\n transport.destroy = () => {\n if (state.multiTimer) {\n clearTimeout(state.multiTimer);\n state.multiTimer = null;\n }\n state.currentMulti.forEach(item =>\n item.reject(new TransportDestroyedError())\n );\n state.currentMulti = [];\n };\n\n return transport;\n}\n","import type { Cache, CacheOptions } from './types';\n\ninterface CacheEntry {\n value: string;\n expiresAt: number;\n}\n\nexport class LocalCache implements Cache {\n private storage = new Map<string, CacheEntry>();\n private maxSize: number;\n private ttlMs: number;\n\n constructor(options: CacheOptions = {}) {\n this.maxSize = options.maxSize ?? 10_000;\n this.ttlMs = options.ttlMs ?? 3_600_000;\n }\n\n get(key: string): string | null {\n const entry = this.storage.get(key);\n if (entry === undefined) return null;\n\n if (Date.now() > entry.expiresAt) {\n this.storage.delete(key);\n return null;\n }\n\n this.storage.delete(key);\n this.storage.set(key, entry);\n\n return entry.value;\n }\n\n set(key: string, value: string): void {\n this.storage.delete(key);\n\n if (this.storage.size >= this.maxSize) {\n const oldestKey = this.storage.keys().next().value;\n if (oldestKey !== undefined) {\n this.storage.delete(oldestKey);\n }\n }\n\n this.storage.set(key, {\n value,\n expiresAt: Date.now() + this.ttlMs,\n });\n }\n\n clear(): void {\n this.storage.clear();\n }\n}\n","import type { BelocalEngineOptions, Lang, TranslateOptions, TranslationCtx, Transport, BaseTransport } from '../types';\nimport { TransportDestroyedError } from '../errors';\nimport { createMultiTransport } from '../../transports/multi';\nimport { LocalCache } from '../../cache/local';\nimport type { Cache } from '../../cache/types';\nimport { md5 } from 'js-md5';\n\nexport class BelocalEngine {\n private transport: Transport;\n private debug: boolean;\n private cache: Cache;\n\n constructor(options: BelocalEngineOptions, baseTransportFactory: (opts: any) => BaseTransport) {\n const {\n apiKey,\n batchWindowMs = 50,\n timeoutMs = 10000,\n debug = false,\n cacheTtlMs = 3_600_000,\n cacheMaxSize = 10_000\n } = options;\n\n if (!apiKey || typeof apiKey !== 'string') {\n throw new Error('[BeLocal] apiKey is required and must be a non-empty string');\n }\n\n if (typeof timeoutMs !== 'number' || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new Error('[BeLocal] timeoutMs must be a positive finite number');\n }\n\n const safeBatchWindowMs = Math.max(0, batchWindowMs);\n\n this.debug = debug;\n this.cache = new LocalCache({ ttlMs: cacheTtlMs, maxSize: cacheMaxSize });\n\n const authHeaders = {\n 'Authorization': `Bearer ${apiKey}`\n };\n\n const baseTransport = baseTransportFactory({\n headers: authHeaders,\n timeoutMs,\n debug: this.debug\n });\n\n this.transport = createMultiTransport({\n baseTransport,\n debug: this.debug,\n batchWindowMs: safeBatchWindowMs\n });\n\n if (this.debug) {\n console.log('[BeLocal Engine] Multi transport created with config:', {\n baseUrl: 'https://dynamic.belocal.dev',\n timeoutMs,\n batchWindowMs: safeBatchWindowMs\n });\n }\n }\n\n /** Translates a single text string to the target language. */\n async translate(text: string, lang: Lang, options?: TranslateOptions): Promise<string> {\n const results = await this.translateMany([text], lang, options);\n return results[0];\n }\n\n /** Translates multiple text strings to the target language in a single batch. */\n async translateMany(texts: string[], lang: Lang, options?: TranslateOptions): Promise<string[]> {\n const { source_lang, ctx } = this.resolveOptions(options);\n const results: (string | null)[] = new Array(texts.length);\n const cacheMisses: Array<{ index: number; text: string }> = [];\n\n for (let i = 0; i < texts.length; i++) {\n const text = texts[i];\n const cacheKey = this.generateCacheKey(text, lang, source_lang, ctx);\n\n const cachedResult = this.cache.get(cacheKey);\n if (cachedResult !== null) {\n results[i] = cachedResult;\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from cache:', text);\n }\n continue;\n }\n\n results[i] = null;\n cacheMisses.push({ index: i, text });\n }\n\n if (cacheMisses.length > 0) {\n const settlements = await Promise.allSettled(\n cacheMisses.map(async ({ index, text }) => {\n const result = await this.transport({ text, lang, source_lang, ctx });\n\n if (result.status !== 'error') {\n const cacheKey = this.generateCacheKey(text, lang, source_lang, ctx);\n this.cache.set(cacheKey, result.text);\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from API, cached:', text);\n }\n } else {\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from API (not cached due to error status):', text);\n }\n }\n\n return { index, translation: result.text };\n })\n );\n\n settlements.forEach((settlement, i) => {\n const { index, text } = cacheMisses[i];\n if (settlement.status === 'fulfilled') {\n results[index] = settlement.value.translation;\n } else {\n results[index] = text;\n const reason = settlement.reason;\n const isExpectedDestroy = reason instanceof TransportDestroyedError;\n if (this.debug && !isExpectedDestroy) {\n console.error(\n '[BeLocal Engine] Translation failed, using original text:',\n text,\n reason instanceof Error ? reason.message : String(reason)\n );\n }\n }\n });\n }\n\n return results as string[];\n }\n\n private resolveOptions(options?: TranslateOptions): { source_lang?: string; ctx?: TranslationCtx } {\n if (!options) return {};\n const serverCtx: TranslationCtx = {\n ...options.ctx,\n ...(options.context && { user_ctx: options.context }),\n ...(options.managed && { cache_type: 'managed' }),\n };\n const ctx = Object.values(serverCtx).some(Boolean) ? serverCtx : undefined;\n return { source_lang: options.source_lang, ctx };\n }\n\n /** Cleans up internal resources (timers, cache). Call when the engine is no longer needed. */\n destroy(): void {\n (this.transport as any).destroy?.();\n this.cache.clear();\n }\n\n private generateCacheKey(text: string, lang: Lang, source_lang?: string, ctx?: TranslationCtx): string {\n const sortedCtx = ctx\n ? Object.fromEntries(Object.entries(ctx).sort(([a], [b]) => a.localeCompare(b)))\n : null;\n\n const data = {\n text,\n lang,\n source_lang: source_lang || null,\n ctx: sortedCtx\n };\n return md5(JSON.stringify(data));\n }\n}\n","export type Lang = string;\n\nexport type UserCtx = {\n user_type?: string;\n entity_key?: string;\n entity_id?: string;\n};\n\nexport type TranslationCtx = {\n user_type?: string;\n user_ctx?: string;\n cache_type?: string;\n entity_key?: string;\n entity_id?: string;\n};\n\nexport const USER_TYPE_PRODUCT = 'product';\nexport const USER_TYPE_CHAT = 'chat';\n\nexport type TranslateOptions = {\n source_lang?: string;\n context?: string;\n managed?: boolean;\n ctx?: UserCtx;\n};\n\nexport interface BaseTransport {\n post(data: any, endpointPath: string): Promise<any>;\n}\n\nexport type Transport = (params: { text: string; lang: Lang; source_lang?: string; ctx?: TranslationCtx }) => Promise<{ text: string; status: string }>;\n\nexport interface BelocalEngineOptions {\n apiKey: string;\n batchWindowMs?: number;\n timeoutMs?: number;\n debug?: boolean;\n cacheTtlMs?: number;\n cacheMaxSize?: number;\n}\n","import type { BelocalEngineOptions } from '../types';\nimport { createBaseBrowserTransport } from '../../transports/base/browser';\nimport { BelocalEngine as BaseEngine } from './engine';\n\nexport class BelocalEngine extends BaseEngine {\n constructor(options: BelocalEngineOptions) {\n super(options, createBaseBrowserTransport);\n }\n}\n\nexport type { BelocalEngineOptions, Lang, TranslateOptions, BaseTransport, TranslationCtx, UserCtx } from '../types';\nexport { TransportDestroyedError } from '../errors';\nexport { USER_TYPE_PRODUCT, USER_TYPE_CHAT } from '../types';\nexport { createMultiTransport } from '../../transports/multi';\nexport { BaseBrowserTransport, createBaseBrowserTransport } from '../../transports/base';\n"]}
package/dist/browser.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import {md5}from'js-md5';var B="1.0.5";function C(i,t){let e=s=>{if(s==null)return s;if(Array.isArray(s))return s.map(e);if(typeof s=="object"){let a={};for(let u of Object.keys(s).sort())a[u]=e(s[u]);return a}return s},r=JSON.stringify(e(t));return `${i}:${r}`}var h=class{constructor(t,e){this.wrappedTransport=t;this.debug=e;this.inFlightRequests=new Map;}async post(t,e){let r=C(e,t),s=this.inFlightRequests.get(r);if(s)return this.debug&&console.log(`[DedupeTransport] Deduplicating request to ${e}`),s;let a=this.wrappedTransport.post(t,e).finally(()=>{this.inFlightRequests.delete(r);});return this.inFlightRequests.set(r,a),this.debug&&console.log(`[DedupeTransport] New request to ${e} (${this.inFlightRequests.size} in-flight)`),a}};var q="https://dynamic.belocal.dev",m=class{constructor(t){this.config=t;}async post(t,e){let r=`${q}${e}`,s=new AbortController,a=this.config.timeoutMs??1e4,u=setTimeout(()=>s.abort(),a);this.config.debug&&console.log(`[Base Browser Transport] POST request to ${r}`,t);try{let p=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json","x-sdk":"js","x-sdk-version":B,...this.config.headers},body:JSON.stringify(t),signal:s.signal});if(!p.ok){let o=`HTTP ${p.status}: ${p.statusText}`;throw this.config.debug&&console.error("[Base Browser Transport] Request failed:",o),new Error(o)}let n=await p.json();return this.config.debug&&console.log("[Base Browser Transport] Request successful:",n),n}finally{u&&clearTimeout(u);}}};function T(i){let t=new m(i);return new h(t,i.debug)}var d=class i extends Error{constructor(t="Transport destroyed"){super(t),this.name="TransportDestroyedError",Object.setPrototypeOf(this,i.prototype);}};function S(i,t,e,r){let s=[...i].sort(),a=r&&Object.keys(r).length>0?Object.fromEntries(Object.entries(r).sort(([p],[n])=>p.localeCompare(n))):null;return md5(JSON.stringify([s,t,e||null,a]))}async function O(i,t,e){i.debug&&console.log(`[BeLocal Multi Transport] Sending multi request with ${t.length} texts`);try{let r=new Map;t.forEach(n=>{let o=JSON.stringify({lang:n.lang,sourceLang:n.sourceLang||null,context:n.context||null});r.has(o)||r.set(o,[]),r.get(o).push(n);});let s=new Map,a=Array.from(r.entries()).map(([n,o])=>{let c=o[0],l=o.map(f=>f.text),g=S(l,c.lang,c.sourceLang,c.context);return s.set(g,o),{request_id:g,texts:l,lang:c.lang,source_lang:c.sourceLang,ctx:c.context}}),u=await i.baseTransport.post({requests:a},"/v1/translate/multi");i.debug&&console.log(`[BeLocal Multi Transport] Multi response received with ${u.results.length} groups`);let p=new Map;u.results.forEach(n=>{p.set(n.request_id,{texts:n.data.texts,status:n.data.status});}),s.forEach((n,o)=>{let c=p.get(o);if(!c){i.debug&&console.error(`[BeLocal Multi Transport] No result found for request_id: ${o}`),n.forEach(l=>{l.reject(new Error(`No result found for request ${o}`));});return}if(c.texts.length!==n.length){let l=new Error(`Mismatch: expected ${n.length} texts, got ${c.texts.length} for request_id ${o}`);i.debug&&console.error("[BeLocal Multi Transport]",l.message),n.forEach(g=>g.reject(l));return}n.forEach((l,g)=>{let f=c.texts[g],M=c.status||"success";i.debug&&console.log(`[BeLocal Multi Transport] Success for request_id ${o}[${g}]: "${f}"`),l.resolve({text:f,status:M});});});}catch(r){i.debug&&console.error("[BeLocal Multi Transport] Multi request error:",r);let s=r instanceof Error?r:new Error(String(r));t.forEach(a=>a.reject(s));}}function _(i,t){if(t.currentMulti.length===0||t.isRequestInFlight)return;let e=[...t.currentMulti];t.currentMulti=[],t.multiTimer=null,t.isRequestInFlight=true,O(i,e).finally(()=>{if(t.isRequestInFlight=false,t.currentMulti.length>0){let r=i.batchWindowMs??50;t.multiTimer=setTimeout(()=>_(i,t),r);}});}function b(i){let t=i.batchWindowMs??50,e={currentMulti:[],multiTimer:null,isRequestInFlight:false},r=(({text:s,lang:a,source_lang:u,ctx:p})=>new Promise((n,o)=>{if(i.debug){let l=md5(JSON.stringify([s,a,u||null,p||null]));console.log(`[BeLocal Multi Transport] Queuing request ${l}: "${s}" to ${a}`);}let c={text:s,lang:a,sourceLang:u,context:p,resolve:n,reject:o};e.currentMulti.push(c),e.multiTimer===null&&!e.isRequestInFlight&&(e.multiTimer=setTimeout(()=>_(i,e),t));}));return r.destroy=()=>{e.multiTimer&&(clearTimeout(e.multiTimer),e.multiTimer=null),e.currentMulti.forEach(s=>s.reject(new d)),e.currentMulti=[];},r}var y=class{constructor(t={}){this.storage=new Map;this.maxSize=t.maxSize??1e4,this.ttlMs=t.ttlMs??36e5;}get(t){let e=this.storage.get(t);return e===void 0?null:Date.now()>e.expiresAt?(this.storage.delete(t),null):(this.storage.delete(t),this.storage.set(t,e),e.value)}set(t,e){if(this.storage.delete(t),this.storage.size>=this.maxSize){let r=this.storage.keys().next().value;r!==void 0&&this.storage.delete(r);}this.storage.set(t,{value:e,expiresAt:Date.now()+this.ttlMs});}clear(){this.storage.clear();}};var x=class{constructor(t,e){let{apiKey:r,batchWindowMs:s=50,timeoutMs:a=1e4,debug:u=false,cacheTtlMs:p=36e5,cacheMaxSize:n=1e4}=t;if(!r||typeof r!="string")throw new Error("[BeLocal] apiKey is required and must be a non-empty string");if(typeof a!="number"||!Number.isFinite(a)||a<=0)throw new Error("[BeLocal] timeoutMs must be a positive finite number");let o=Math.max(0,s);this.debug=u,this.cache=new y({ttlMs:p,maxSize:n});let c={Authorization:`Bearer ${r}`},l=e({headers:c,timeoutMs:a,debug:this.debug});this.transport=b({baseTransport:l,debug:this.debug,batchWindowMs:o}),this.debug&&console.log("[BeLocal Engine] Multi transport created with config:",{baseUrl:"https://dynamic.belocal.dev",timeoutMs:a,batchWindowMs:o});}async translate(t,e,r){return (await this.translateMany([t],e,r))[0]}async translateMany(t,e,r){let{source_lang:s,ctx:a}=this.resolveOptions(r),u=new Array(t.length),p=[];for(let n=0;n<t.length;n++){let o=t[n],c=this.generateCacheKey(o,e,s,a),l=this.cache.get(c);if(l!==null){u[n]=l,this.debug&&console.log("[BeLocal Engine] Translation from cache:",o);continue}u[n]=null,p.push({index:n,text:o});}return p.length>0&&(await Promise.allSettled(p.map(async({index:o,text:c})=>{let l=await this.transport({text:c,lang:e,source_lang:s,ctx:a});if(l.status!=="error"){let g=this.generateCacheKey(c,e,s,a);this.cache.set(g,l.text),this.debug&&console.log("[BeLocal Engine] Translation from API, cached:",c);}else this.debug&&console.log("[BeLocal Engine] Translation from API (not cached due to error status):",c);return {index:o,translation:l.text}}))).forEach((o,c)=>{let{index:l,text:g}=p[c];if(o.status==="fulfilled")u[l]=o.value.translation;else {u[l]=g;let f=o.reason,M=f instanceof d;this.debug&&!M&&console.error("[BeLocal Engine] Translation failed, using original text:",g,f instanceof Error?f.message:String(f));}}),u}resolveOptions(t){if(!t)return {};let e={...t.ctx,...t.context&&{user_ctx:t.context},...t.managed&&{cache_type:"managed"}},r=Object.values(e).some(Boolean)?e:void 0;return {source_lang:t.source_lang,ctx:r}}destroy(){this.transport.destroy?.(),this.cache.clear();}generateCacheKey(t,e,r,s){let a=s?Object.fromEntries(Object.entries(s).sort(([p],[n])=>p.localeCompare(n))):null;return md5(JSON.stringify({text:t,lang:e,source_lang:r||null,ctx:a}))}};var L="product",$="chat";var E=class extends x{constructor(t){super(t,T);}};
2
- export{m as BaseBrowserTransport,E as BelocalEngine,d as TransportDestroyedError,$ as USER_TYPE_CHAT,L as USER_TYPE_PRODUCT,T as createBaseBrowserTransport,b as createMultiTransport};//# sourceMappingURL=browser.mjs.map
1
+ import {md5}from'js-md5';var w="1.0.6";function C(i,t){let e=s=>{if(s==null)return s;if(Array.isArray(s))return s.map(e);if(typeof s=="object"){let a={};for(let l of Object.keys(s).sort())a[l]=e(s[l]);return a}return s},r=JSON.stringify(e(t));return `${i}:${r}`}var T=class{constructor(t,e){this.wrappedTransport=t;this.debug=e;this.inFlightRequests=new Map;}async post(t,e){let r=C(e,t),s=this.inFlightRequests.get(r);if(s)return this.debug&&console.log(`[DedupeTransport] Deduplicating request to ${e}`),s;let a=this.wrappedTransport.post(t,e).finally(()=>{this.inFlightRequests.delete(r);});return this.inFlightRequests.set(r,a),this.debug&&console.log(`[DedupeTransport] New request to ${e} (${this.inFlightRequests.size} in-flight)`),a}};var O="https://dynamic.belocal.dev",m=class{constructor(t){this.config=t;}async post(t,e){let r=`${O}${e}`,s=new AbortController,a=this.config.timeoutMs??1e4,l=setTimeout(()=>s.abort(),a);this.config.debug&&console.log(`[Base Browser Transport] POST request to ${r}`,t);try{let p=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json","x-sdk":"js","x-sdk-version":w,...this.config.headers},body:JSON.stringify(t),signal:s.signal});if(!p.ok){let o=`HTTP ${p.status}: ${p.statusText}`;throw this.config.debug&&console.error("[Base Browser Transport] Request failed:",o),new Error(o)}let n=await p.json();return this.config.debug&&console.log("[Base Browser Transport] Request successful:",n),n}finally{l&&clearTimeout(l);}}};function x(i){let t=new m(i);return new T(t,i.debug)}var h=class i extends Error{constructor(t="Transport destroyed"){super(t),this.name="TransportDestroyedError",Object.setPrototypeOf(this,i.prototype);}};function v(i,t,e,r){let s=[...i].sort(),a=r&&Object.keys(r).length>0?Object.fromEntries(Object.entries(r).sort(([p],[n])=>p.localeCompare(n))):null;return md5(JSON.stringify([s,t,e||null,a]))}async function L(i,t,e){i.debug&&console.log(`[BeLocal Multi Transport] Sending multi request with ${t.length} texts`);try{let r=new Map;t.forEach(n=>{let o=JSON.stringify({lang:n.lang,sourceLang:n.sourceLang||null,context:n.context||null});r.has(o)||r.set(o,[]),r.get(o).push(n);});let s=new Map,a=Array.from(r.entries()).map(([n,o])=>{let u=o[0],c=new Map;o.forEach(d=>{c.has(d.text)||c.set(d.text,[]),c.get(d.text).push(d);});let g=Array.from(c.keys());i.debug&&g.length<o.length&&console.log(`[BeLocal Multi Transport] Deduplicated ${o.length} texts to ${g.length} unique`);let f=v(g,u.lang,u.sourceLang,u.context);return s.set(f,{uniqueTexts:g,textToItems:c}),{request_id:f,texts:g,lang:u.lang,source_lang:u.sourceLang,ctx:u.context}}),l=await i.baseTransport.post({requests:a},"/v1/translate/multi");i.debug&&console.log(`[BeLocal Multi Transport] Multi response received with ${l.results.length} groups`);let p=new Map;l.results.forEach(n=>{p.set(n.request_id,{texts:n.data.texts,status:n.data.status});}),s.forEach((n,o)=>{let u=p.get(o);if(!u){i.debug&&console.error(`[BeLocal Multi Transport] No result found for request_id: ${o}`),n.textToItems.forEach(c=>{c.forEach(g=>g.reject(new Error(`No result found for request ${o}`)));});return}if(u.texts.length!==n.uniqueTexts.length){let c=new Error(`Mismatch: expected ${n.uniqueTexts.length} texts, got ${u.texts.length} for request_id ${o}`);i.debug&&console.error("[BeLocal Multi Transport]",c.message),n.textToItems.forEach(g=>{g.forEach(f=>f.reject(c));});return}n.uniqueTexts.forEach((c,g)=>{let f=u.texts[g],d=u.status||"success",B=n.textToItems.get(c);i.debug&&console.log(`[BeLocal Multi Transport] Success for request_id ${o}[${g}]: "${f}" (${B.length} requester(s))`),B.forEach(R=>R.resolve({text:f,status:d}));});});}catch(r){i.debug&&console.error("[BeLocal Multi Transport] Multi request error:",r);let s=r instanceof Error?r:new Error(String(r));t.forEach(a=>a.reject(s));}}function _(i,t){if(t.currentMulti.length===0||t.isRequestInFlight)return;let e=[...t.currentMulti];t.currentMulti=[],t.multiTimer=null,t.isRequestInFlight=true,L(i,e).finally(()=>{if(t.isRequestInFlight=false,t.currentMulti.length>0){let r=i.batchWindowMs??50;t.multiTimer=setTimeout(()=>_(i,t),r);}});}function b(i){let t=i.batchWindowMs??50,e={currentMulti:[],multiTimer:null,isRequestInFlight:false},r=(({text:s,lang:a,source_lang:l,ctx:p})=>new Promise((n,o)=>{if(i.debug){let c=md5(JSON.stringify([s,a,l||null,p||null]));console.log(`[BeLocal Multi Transport] Queuing request ${c}: "${s}" to ${a}`);}let u={text:s,lang:a,sourceLang:l,context:p,resolve:n,reject:o};e.currentMulti.push(u),e.multiTimer===null&&!e.isRequestInFlight&&(e.multiTimer=setTimeout(()=>_(i,e),t));}));return r.destroy=()=>{e.multiTimer&&(clearTimeout(e.multiTimer),e.multiTimer=null),e.currentMulti.forEach(s=>s.reject(new h)),e.currentMulti=[];},r}var y=class{constructor(t={}){this.storage=new Map;this.maxSize=t.maxSize??1e4,this.ttlMs=t.ttlMs??36e5;}get(t){let e=this.storage.get(t);return e===void 0?null:Date.now()>e.expiresAt?(this.storage.delete(t),null):(this.storage.delete(t),this.storage.set(t,e),e.value)}set(t,e){if(this.storage.delete(t),this.storage.size>=this.maxSize){let r=this.storage.keys().next().value;r!==void 0&&this.storage.delete(r);}this.storage.set(t,{value:e,expiresAt:Date.now()+this.ttlMs});}clear(){this.storage.clear();}};var M=class{constructor(t,e){let{apiKey:r,batchWindowMs:s=50,timeoutMs:a=1e4,debug:l=false,cacheTtlMs:p=36e5,cacheMaxSize:n=1e4}=t;if(!r||typeof r!="string")throw new Error("[BeLocal] apiKey is required and must be a non-empty string");if(typeof a!="number"||!Number.isFinite(a)||a<=0)throw new Error("[BeLocal] timeoutMs must be a positive finite number");let o=Math.max(0,s);this.debug=l,this.cache=new y({ttlMs:p,maxSize:n});let u={Authorization:`Bearer ${r}`},c=e({headers:u,timeoutMs:a,debug:this.debug});this.transport=b({baseTransport:c,debug:this.debug,batchWindowMs:o}),this.debug&&console.log("[BeLocal Engine] Multi transport created with config:",{baseUrl:"https://dynamic.belocal.dev",timeoutMs:a,batchWindowMs:o});}async translate(t,e,r){return (await this.translateMany([t],e,r))[0]}async translateMany(t,e,r){let{source_lang:s,ctx:a}=this.resolveOptions(r),l=new Array(t.length),p=[];for(let n=0;n<t.length;n++){let o=t[n],u=this.generateCacheKey(o,e,s,a),c=this.cache.get(u);if(c!==null){l[n]=c,this.debug&&console.log("[BeLocal Engine] Translation from cache:",o);continue}l[n]=null,p.push({index:n,text:o});}return p.length>0&&(await Promise.allSettled(p.map(async({index:o,text:u})=>{let c=await this.transport({text:u,lang:e,source_lang:s,ctx:a});if(c.status!=="error"){let g=this.generateCacheKey(u,e,s,a);this.cache.set(g,c.text),this.debug&&console.log("[BeLocal Engine] Translation from API, cached:",u);}else this.debug&&console.log("[BeLocal Engine] Translation from API (not cached due to error status):",u);return {index:o,translation:c.text}}))).forEach((o,u)=>{let{index:c,text:g}=p[u];if(o.status==="fulfilled")l[c]=o.value.translation;else {l[c]=g;let f=o.reason,d=f instanceof h;this.debug&&!d&&console.error("[BeLocal Engine] Translation failed, using original text:",g,f instanceof Error?f.message:String(f));}}),l}resolveOptions(t){if(!t)return {};let e={...t.ctx,...t.context&&{user_ctx:t.context},...t.managed&&{cache_type:"managed"}},r=Object.values(e).some(Boolean)?e:void 0;return {source_lang:t.source_lang,ctx:r}}destroy(){this.transport.destroy?.(),this.cache.clear();}generateCacheKey(t,e,r,s){let a=s?Object.fromEntries(Object.entries(s).sort(([p],[n])=>p.localeCompare(n))):null;return md5(JSON.stringify({text:t,lang:e,source_lang:r||null,ctx:a}))}};var I="product",P="chat";var q=class extends M{constructor(t){super(t,x);}};
2
+ export{m as BaseBrowserTransport,q as BelocalEngine,h as TransportDestroyedError,P as USER_TYPE_CHAT,I as USER_TYPE_PRODUCT,x as createBaseBrowserTransport,b as createMultiTransport};//# sourceMappingURL=browser.mjs.map
3
3
  //# sourceMappingURL=browser.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/version.ts","../src/transports/base/dedupe.ts","../src/transports/base/browser.ts","../src/core/errors.ts","../src/transports/multi.ts","../src/cache/local.ts","../src/core/engine/engine.ts","../src/core/types.ts","../src/core/engine/browser.ts"],"names":["SDK_VERSION","generateRequestKey","endpointPath","data","normalize","value","sorted","key","normalizedData","DedupeTransport","wrappedTransport","debug","requestKey","existingRequest","requestPromise","BASE_URL","BaseBrowserTransport","config","url","controller","timeoutMs","timeoutId","response","errorMsg","result","createBaseBrowserTransport","transport","TransportDestroyedError","_TransportDestroyedError","message","generateRequestId","texts","lang","sourceLang","context","sortedTexts","sortedContext","a","b","md5","sendMulti","items","state","groups","item","groupKey","requestIdToGroupItems","requests","groupItems","firstItem","requestId","multiResponse","resultMap","error","index","translatedText","status","errorToReject","processMulti","itemsToSend","windowMs","createMultiTransport","text","source_lang","ctx","resolve","reject","tempRequestId","requestItem","LocalCache","options","entry","oldestKey","BelocalEngine","baseTransportFactory","apiKey","batchWindowMs","cacheTtlMs","cacheMaxSize","safeBatchWindowMs","authHeaders","baseTransport","results","cacheMisses","i","cacheKey","cachedResult","settlement","reason","isExpectedDestroy","serverCtx","sortedCtx","USER_TYPE_PRODUCT","USER_TYPE_CHAT"],"mappings":"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","file":"browser.mjs","sourcesContent":["declare const __SDK_VERSION__: string;\nexport const SDK_VERSION = typeof __SDK_VERSION__ !== 'undefined' ? __SDK_VERSION__ : 'undefined';\nexport const SDK_NAME = 'js';\n","import type { BaseTransport } from '../../core/types';\n\nfunction generateRequestKey(endpointPath: string, data: any): string {\n const normalize = (value: any): any => {\n if (value === null || value === undefined) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(normalize);\n }\n if (typeof value === 'object') {\n const sorted: Record<string, any> = {};\n for (const key of Object.keys(value).sort()) {\n sorted[key] = normalize(value[key]);\n }\n return sorted;\n }\n return value;\n };\n\n const normalizedData = JSON.stringify(normalize(data));\n return `${endpointPath}:${normalizedData}`;\n}\n\n/** Deduplicates identical in-flight requests so they share a single HTTP call. */\nexport class DedupeTransport implements BaseTransport {\n private inFlightRequests = new Map<string, Promise<any>>();\n\n constructor(\n private wrappedTransport: BaseTransport,\n private debug?: boolean\n ) {}\n\n async post(data: any, endpointPath: string): Promise<any> {\n const requestKey = generateRequestKey(endpointPath, data);\n\n const existingRequest = this.inFlightRequests.get(requestKey);\n if (existingRequest) {\n if (this.debug) {\n console.log(`[DedupeTransport] Deduplicating request to ${endpointPath}`);\n }\n return existingRequest;\n }\n\n const requestPromise = this.wrappedTransport.post(data, endpointPath)\n .finally(() => {\n this.inFlightRequests.delete(requestKey);\n });\n\n this.inFlightRequests.set(requestKey, requestPromise);\n\n if (this.debug) {\n console.log(`[DedupeTransport] New request to ${endpointPath} (${this.inFlightRequests.size} in-flight)`);\n }\n\n return requestPromise;\n }\n}\n","import type { BaseTransport } from '../../core/types';\nimport { SDK_NAME, SDK_VERSION } from '../../version';\nimport { DedupeTransport } from './dedupe';\n\nconst BASE_URL = 'https://dynamic.belocal.dev';\n\nexport interface BaseBrowserTransportConfig {\n headers?: Record<string, string>;\n timeoutMs?: number;\n debug?: boolean;\n}\n\nexport class BaseBrowserTransport implements BaseTransport {\n constructor(private config: BaseBrowserTransportConfig) {}\n\n async post(data: any, endpointPath: string): Promise<any> {\n const url = `${BASE_URL}${endpointPath}`;\n const controller = new AbortController();\n const timeoutMs = this.config.timeoutMs ?? 10000;\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n if (this.config.debug) {\n console.log(`[Base Browser Transport] POST request to ${url}`, data);\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-sdk': SDK_NAME,\n 'x-sdk-version': SDK_VERSION,\n ...this.config.headers,\n },\n body: JSON.stringify(data),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorMsg = `HTTP ${response.status}: ${response.statusText}`;\n if (this.config.debug) {\n console.error(`[Base Browser Transport] Request failed:`, errorMsg);\n }\n throw new Error(errorMsg);\n }\n\n const result = await response.json();\n if (this.config.debug) {\n console.log(`[Base Browser Transport] Request successful:`, result);\n }\n \n return result;\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n }\n}\n\nexport function createBaseBrowserTransport(config: BaseBrowserTransportConfig): BaseTransport {\n const transport = new BaseBrowserTransport(config);\n return new DedupeTransport(transport, config.debug);\n}\n","export class TransportDestroyedError extends Error {\n constructor(message = 'Transport destroyed') {\n super(message);\n this.name = 'TransportDestroyedError';\n Object.setPrototypeOf(this, TransportDestroyedError.prototype);\n }\n}\n","import type { Transport, BaseTransport, TranslationCtx } from '../core/types';\nimport { TransportDestroyedError } from '../core/errors';\nimport { md5 } from 'js-md5';\n\nexport interface MultiTransportConfig {\n baseTransport: BaseTransport;\n debug?: boolean;\n batchWindowMs?: number;\n}\n\ninterface MultiRequest {\n request_id: string;\n texts: string[];\n lang: string;\n source_lang?: string;\n ctx?: TranslationCtx;\n}\n\ninterface MultiRequestItem {\n text: string;\n lang: string;\n sourceLang?: string;\n context?: TranslationCtx;\n resolve: (value: { text: string; status: string }) => void;\n reject: (error: Error) => void;\n}\n\ninterface MultiResponse {\n results: Array<{\n request_id: string;\n data: { texts: string[]; status: string };\n }>;\n}\n\ninterface MultiState {\n currentMulti: MultiRequestItem[];\n multiTimer: ReturnType<typeof setTimeout> | null;\n isRequestInFlight: boolean;\n}\n\nfunction generateRequestId(texts: string[], lang: string, sourceLang?: string, context?: TranslationCtx): string {\n const sortedTexts = [...texts].sort();\n\n const sortedContext = context && Object.keys(context).length > 0\n ? Object.fromEntries(Object.entries(context).sort(([a], [b]) => a.localeCompare(b)))\n : null;\n\n const data = [sortedTexts, lang, sourceLang || null, sortedContext];\n return md5(JSON.stringify(data));\n}\n\nasync function sendMulti(\n config: MultiTransportConfig,\n items: MultiRequestItem[],\n state: MultiState\n): Promise<void> {\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Sending multi request with ${items.length} texts`);\n }\n\n try {\n const groups = new Map<string, MultiRequestItem[]>();\n\n items.forEach(item => {\n const groupKey = JSON.stringify({\n lang: item.lang,\n sourceLang: item.sourceLang || null,\n context: item.context || null\n });\n\n if (!groups.has(groupKey)) {\n groups.set(groupKey, []);\n }\n groups.get(groupKey)!.push(item);\n });\n\n const requestIdToGroupItems = new Map<string, MultiRequestItem[]>();\n const requests: MultiRequest[] = Array.from(groups.entries()).map(([groupKey, groupItems]) => {\n const firstItem = groupItems[0];\n const texts = groupItems.map(item => item.text);\n\n const requestId = generateRequestId(\n texts,\n firstItem.lang,\n firstItem.sourceLang,\n firstItem.context\n );\n\n requestIdToGroupItems.set(requestId, groupItems);\n\n return {\n request_id: requestId,\n texts,\n lang: firstItem.lang,\n source_lang: firstItem.sourceLang,\n ctx: firstItem.context\n };\n });\n\n const multiResponse: MultiResponse = await config.baseTransport.post({ requests }, '/v1/translate/multi');\n\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Multi response received with ${multiResponse.results.length} groups`);\n }\n\n const resultMap = new Map<string, { texts: string[]; status: string }>();\n multiResponse.results.forEach(result => {\n resultMap.set(result.request_id, { texts: result.data.texts, status: result.data.status });\n });\n\n requestIdToGroupItems.forEach((groupItems, requestId) => {\n const result = resultMap.get(requestId);\n\n if (!result) {\n if (config.debug) {\n console.error(`[BeLocal Multi Transport] No result found for request_id: ${requestId}`);\n }\n groupItems.forEach(item => {\n item.reject(new Error(`No result found for request ${requestId}`));\n });\n return;\n }\n\n if (result.texts.length !== groupItems.length) {\n const error = new Error(`Mismatch: expected ${groupItems.length} texts, got ${result.texts.length} for request_id ${requestId}`);\n if (config.debug) {\n console.error(`[BeLocal Multi Transport]`, error.message);\n }\n groupItems.forEach(item => item.reject(error));\n return;\n }\n\n groupItems.forEach((item, index) => {\n const translatedText = result.texts[index];\n const status = result.status || 'success';\n\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Success for request_id ${requestId}[${index}]: \"${translatedText}\"`);\n }\n\n item.resolve({ text: translatedText, status });\n });\n });\n } catch (error) {\n if (config.debug) {\n console.error(`[BeLocal Multi Transport] Multi request error:`, error);\n }\n\n const errorToReject = error instanceof Error ? error : new Error(String(error));\n items.forEach(item => item.reject(errorToReject));\n }\n}\n\nfunction processMulti(config: MultiTransportConfig, state: MultiState): void {\n if (state.currentMulti.length === 0 || state.isRequestInFlight) {\n return;\n }\n\n const itemsToSend = [...state.currentMulti];\n state.currentMulti = [];\n state.multiTimer = null;\n state.isRequestInFlight = true;\n\n sendMulti(config, itemsToSend, state).finally(() => {\n state.isRequestInFlight = false;\n\n if (state.currentMulti.length > 0) {\n const windowMs = config.batchWindowMs ?? 50;\n state.multiTimer = setTimeout(() => processMulti(config, state), windowMs);\n }\n });\n}\n\nexport function createMultiTransport(config: MultiTransportConfig): Transport {\n const windowMs = config.batchWindowMs ?? 50;\n\n const state: MultiState = {\n currentMulti: [],\n multiTimer: null,\n isRequestInFlight: false,\n };\n\n const transport = (({ text, lang, source_lang, ctx }) => {\n return new Promise<{ text: string; status: string }>((resolve, reject) => {\n if (config.debug) {\n const tempRequestId = md5(JSON.stringify([text, lang, source_lang || null, ctx || null]));\n console.log(`[BeLocal Multi Transport] Queuing request ${tempRequestId}: \"${text}\" to ${lang}`);\n }\n\n const requestItem: MultiRequestItem = {\n text,\n lang,\n sourceLang: source_lang,\n context: ctx,\n resolve,\n reject,\n };\n\n state.currentMulti.push(requestItem);\n\n if (state.multiTimer === null && !state.isRequestInFlight) {\n state.multiTimer = setTimeout(() => processMulti(config, state), windowMs);\n }\n });\n }) as Transport & { destroy: () => void };\n\n transport.destroy = () => {\n if (state.multiTimer) {\n clearTimeout(state.multiTimer);\n state.multiTimer = null;\n }\n state.currentMulti.forEach(item =>\n item.reject(new TransportDestroyedError())\n );\n state.currentMulti = [];\n };\n\n return transport;\n}\n","import type { Cache, CacheOptions } from './types';\n\ninterface CacheEntry {\n value: string;\n expiresAt: number;\n}\n\nexport class LocalCache implements Cache {\n private storage = new Map<string, CacheEntry>();\n private maxSize: number;\n private ttlMs: number;\n\n constructor(options: CacheOptions = {}) {\n this.maxSize = options.maxSize ?? 10_000;\n this.ttlMs = options.ttlMs ?? 3_600_000;\n }\n\n get(key: string): string | null {\n const entry = this.storage.get(key);\n if (entry === undefined) return null;\n\n if (Date.now() > entry.expiresAt) {\n this.storage.delete(key);\n return null;\n }\n\n this.storage.delete(key);\n this.storage.set(key, entry);\n\n return entry.value;\n }\n\n set(key: string, value: string): void {\n this.storage.delete(key);\n\n if (this.storage.size >= this.maxSize) {\n const oldestKey = this.storage.keys().next().value;\n if (oldestKey !== undefined) {\n this.storage.delete(oldestKey);\n }\n }\n\n this.storage.set(key, {\n value,\n expiresAt: Date.now() + this.ttlMs,\n });\n }\n\n clear(): void {\n this.storage.clear();\n }\n}\n","import type { BelocalEngineOptions, Lang, TranslateOptions, TranslationCtx, Transport, BaseTransport } from '../types';\nimport { TransportDestroyedError } from '../errors';\nimport { createMultiTransport } from '../../transports/multi';\nimport { LocalCache } from '../../cache/local';\nimport type { Cache } from '../../cache/types';\nimport { md5 } from 'js-md5';\n\nexport class BelocalEngine {\n private transport: Transport;\n private debug: boolean;\n private cache: Cache;\n\n constructor(options: BelocalEngineOptions, baseTransportFactory: (opts: any) => BaseTransport) {\n const {\n apiKey,\n batchWindowMs = 50,\n timeoutMs = 10000,\n debug = false,\n cacheTtlMs = 3_600_000,\n cacheMaxSize = 10_000\n } = options;\n\n if (!apiKey || typeof apiKey !== 'string') {\n throw new Error('[BeLocal] apiKey is required and must be a non-empty string');\n }\n\n if (typeof timeoutMs !== 'number' || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new Error('[BeLocal] timeoutMs must be a positive finite number');\n }\n\n const safeBatchWindowMs = Math.max(0, batchWindowMs);\n\n this.debug = debug;\n this.cache = new LocalCache({ ttlMs: cacheTtlMs, maxSize: cacheMaxSize });\n\n const authHeaders = {\n 'Authorization': `Bearer ${apiKey}`\n };\n\n const baseTransport = baseTransportFactory({\n headers: authHeaders,\n timeoutMs,\n debug: this.debug\n });\n\n this.transport = createMultiTransport({\n baseTransport,\n debug: this.debug,\n batchWindowMs: safeBatchWindowMs\n });\n\n if (this.debug) {\n console.log('[BeLocal Engine] Multi transport created with config:', {\n baseUrl: 'https://dynamic.belocal.dev',\n timeoutMs,\n batchWindowMs: safeBatchWindowMs\n });\n }\n }\n\n /** Translates a single text string to the target language. */\n async translate(text: string, lang: Lang, options?: TranslateOptions): Promise<string> {\n const results = await this.translateMany([text], lang, options);\n return results[0];\n }\n\n /** Translates multiple text strings to the target language in a single batch. */\n async translateMany(texts: string[], lang: Lang, options?: TranslateOptions): Promise<string[]> {\n const { source_lang, ctx } = this.resolveOptions(options);\n const results: (string | null)[] = new Array(texts.length);\n const cacheMisses: Array<{ index: number; text: string }> = [];\n\n for (let i = 0; i < texts.length; i++) {\n const text = texts[i];\n const cacheKey = this.generateCacheKey(text, lang, source_lang, ctx);\n\n const cachedResult = this.cache.get(cacheKey);\n if (cachedResult !== null) {\n results[i] = cachedResult;\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from cache:', text);\n }\n continue;\n }\n\n results[i] = null;\n cacheMisses.push({ index: i, text });\n }\n\n if (cacheMisses.length > 0) {\n const settlements = await Promise.allSettled(\n cacheMisses.map(async ({ index, text }) => {\n const result = await this.transport({ text, lang, source_lang, ctx });\n\n if (result.status !== 'error') {\n const cacheKey = this.generateCacheKey(text, lang, source_lang, ctx);\n this.cache.set(cacheKey, result.text);\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from API, cached:', text);\n }\n } else {\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from API (not cached due to error status):', text);\n }\n }\n\n return { index, translation: result.text };\n })\n );\n\n settlements.forEach((settlement, i) => {\n const { index, text } = cacheMisses[i];\n if (settlement.status === 'fulfilled') {\n results[index] = settlement.value.translation;\n } else {\n results[index] = text;\n const reason = settlement.reason;\n const isExpectedDestroy = reason instanceof TransportDestroyedError;\n if (this.debug && !isExpectedDestroy) {\n console.error(\n '[BeLocal Engine] Translation failed, using original text:',\n text,\n reason instanceof Error ? reason.message : String(reason)\n );\n }\n }\n });\n }\n\n return results as string[];\n }\n\n private resolveOptions(options?: TranslateOptions): { source_lang?: string; ctx?: TranslationCtx } {\n if (!options) return {};\n const serverCtx: TranslationCtx = {\n ...options.ctx,\n ...(options.context && { user_ctx: options.context }),\n ...(options.managed && { cache_type: 'managed' }),\n };\n const ctx = Object.values(serverCtx).some(Boolean) ? serverCtx : undefined;\n return { source_lang: options.source_lang, ctx };\n }\n\n /** Cleans up internal resources (timers, cache). Call when the engine is no longer needed. */\n destroy(): void {\n (this.transport as any).destroy?.();\n this.cache.clear();\n }\n\n private generateCacheKey(text: string, lang: Lang, source_lang?: string, ctx?: TranslationCtx): string {\n const sortedCtx = ctx\n ? Object.fromEntries(Object.entries(ctx).sort(([a], [b]) => a.localeCompare(b)))\n : null;\n\n const data = {\n text,\n lang,\n source_lang: source_lang || null,\n ctx: sortedCtx\n };\n return md5(JSON.stringify(data));\n }\n}\n","export type Lang = string;\n\nexport type UserCtx = {\n user_type?: string;\n entity_key?: string;\n entity_id?: string;\n};\n\nexport type TranslationCtx = {\n user_type?: string;\n user_ctx?: string;\n cache_type?: string;\n entity_key?: string;\n entity_id?: string;\n};\n\nexport const USER_TYPE_PRODUCT = 'product';\nexport const USER_TYPE_CHAT = 'chat';\n\nexport type TranslateOptions = {\n source_lang?: string;\n context?: string;\n managed?: boolean;\n ctx?: UserCtx;\n};\n\nexport interface BaseTransport {\n post(data: any, endpointPath: string): Promise<any>;\n}\n\nexport type Transport = (params: { text: string; lang: Lang; source_lang?: string; ctx?: TranslationCtx }) => Promise<{ text: string; status: string }>;\n\nexport interface BelocalEngineOptions {\n apiKey: string;\n batchWindowMs?: number;\n timeoutMs?: number;\n debug?: boolean;\n cacheTtlMs?: number;\n cacheMaxSize?: number;\n}\n","import type { BelocalEngineOptions } from '../types';\nimport { createBaseBrowserTransport } from '../../transports/base/browser';\nimport { BelocalEngine as BaseEngine } from './engine';\n\nexport class BelocalEngine extends BaseEngine {\n constructor(options: BelocalEngineOptions) {\n super(options, createBaseBrowserTransport);\n }\n}\n\nexport type { BelocalEngineOptions, Lang, TranslateOptions, BaseTransport, TranslationCtx, UserCtx } from '../types';\nexport { TransportDestroyedError } from '../errors';\nexport { USER_TYPE_PRODUCT, USER_TYPE_CHAT } from '../types';\nexport { createMultiTransport } from '../../transports/multi';\nexport { BaseBrowserTransport, createBaseBrowserTransport } from '../../transports/base';\n"]}
1
+ {"version":3,"sources":["../src/version.ts","../src/transports/base/dedupe.ts","../src/transports/base/browser.ts","../src/core/errors.ts","../src/transports/multi.ts","../src/cache/local.ts","../src/core/engine/engine.ts","../src/core/types.ts","../src/core/engine/browser.ts"],"names":["SDK_VERSION","generateRequestKey","endpointPath","data","normalize","value","sorted","key","normalizedData","DedupeTransport","wrappedTransport","debug","requestKey","existingRequest","requestPromise","BASE_URL","BaseBrowserTransport","config","url","controller","timeoutMs","timeoutId","response","errorMsg","result","createBaseBrowserTransport","transport","TransportDestroyedError","_TransportDestroyedError","message","generateRequestId","texts","lang","sourceLang","context","sortedTexts","sortedContext","a","b","md5","sendMulti","items","state","groups","item","groupKey","requestIdToMeta","requests","groupItems","firstItem","textToItems","uniqueTexts","requestId","multiResponse","resultMap","meta","error","originalText","index","translatedText","status","errorToReject","processMulti","itemsToSend","windowMs","createMultiTransport","text","source_lang","ctx","resolve","reject","tempRequestId","requestItem","LocalCache","options","entry","oldestKey","BelocalEngine","baseTransportFactory","apiKey","batchWindowMs","cacheTtlMs","cacheMaxSize","safeBatchWindowMs","authHeaders","baseTransport","results","cacheMisses","i","cacheKey","cachedResult","settlement","reason","isExpectedDestroy","serverCtx","sortedCtx","USER_TYPE_PRODUCT","USER_TYPE_CHAT"],"mappings":"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","file":"browser.mjs","sourcesContent":["declare const __SDK_VERSION__: string;\nexport const SDK_VERSION = typeof __SDK_VERSION__ !== 'undefined' ? __SDK_VERSION__ : 'undefined';\nexport const SDK_NAME = 'js';\n","import type { BaseTransport } from '../../core/types';\n\nfunction generateRequestKey(endpointPath: string, data: any): string {\n const normalize = (value: any): any => {\n if (value === null || value === undefined) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(normalize);\n }\n if (typeof value === 'object') {\n const sorted: Record<string, any> = {};\n for (const key of Object.keys(value).sort()) {\n sorted[key] = normalize(value[key]);\n }\n return sorted;\n }\n return value;\n };\n\n const normalizedData = JSON.stringify(normalize(data));\n return `${endpointPath}:${normalizedData}`;\n}\n\n/** Deduplicates identical in-flight requests so they share a single HTTP call. */\nexport class DedupeTransport implements BaseTransport {\n private inFlightRequests = new Map<string, Promise<any>>();\n\n constructor(\n private wrappedTransport: BaseTransport,\n private debug?: boolean\n ) {}\n\n async post(data: any, endpointPath: string): Promise<any> {\n const requestKey = generateRequestKey(endpointPath, data);\n\n const existingRequest = this.inFlightRequests.get(requestKey);\n if (existingRequest) {\n if (this.debug) {\n console.log(`[DedupeTransport] Deduplicating request to ${endpointPath}`);\n }\n return existingRequest;\n }\n\n const requestPromise = this.wrappedTransport.post(data, endpointPath)\n .finally(() => {\n this.inFlightRequests.delete(requestKey);\n });\n\n this.inFlightRequests.set(requestKey, requestPromise);\n\n if (this.debug) {\n console.log(`[DedupeTransport] New request to ${endpointPath} (${this.inFlightRequests.size} in-flight)`);\n }\n\n return requestPromise;\n }\n}\n","import type { BaseTransport } from '../../core/types';\nimport { SDK_NAME, SDK_VERSION } from '../../version';\nimport { DedupeTransport } from './dedupe';\n\nconst BASE_URL = 'https://dynamic.belocal.dev';\n\nexport interface BaseBrowserTransportConfig {\n headers?: Record<string, string>;\n timeoutMs?: number;\n debug?: boolean;\n}\n\nexport class BaseBrowserTransport implements BaseTransport {\n constructor(private config: BaseBrowserTransportConfig) {}\n\n async post(data: any, endpointPath: string): Promise<any> {\n const url = `${BASE_URL}${endpointPath}`;\n const controller = new AbortController();\n const timeoutMs = this.config.timeoutMs ?? 10000;\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n if (this.config.debug) {\n console.log(`[Base Browser Transport] POST request to ${url}`, data);\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-sdk': SDK_NAME,\n 'x-sdk-version': SDK_VERSION,\n ...this.config.headers,\n },\n body: JSON.stringify(data),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errorMsg = `HTTP ${response.status}: ${response.statusText}`;\n if (this.config.debug) {\n console.error(`[Base Browser Transport] Request failed:`, errorMsg);\n }\n throw new Error(errorMsg);\n }\n\n const result = await response.json();\n if (this.config.debug) {\n console.log(`[Base Browser Transport] Request successful:`, result);\n }\n \n return result;\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n }\n}\n\nexport function createBaseBrowserTransport(config: BaseBrowserTransportConfig): BaseTransport {\n const transport = new BaseBrowserTransport(config);\n return new DedupeTransport(transport, config.debug);\n}\n","export class TransportDestroyedError extends Error {\n constructor(message = 'Transport destroyed') {\n super(message);\n this.name = 'TransportDestroyedError';\n Object.setPrototypeOf(this, TransportDestroyedError.prototype);\n }\n}\n","import type { Transport, BaseTransport, TranslationCtx } from '../core/types';\nimport { TransportDestroyedError } from '../core/errors';\nimport { md5 } from 'js-md5';\n\nexport interface MultiTransportConfig {\n baseTransport: BaseTransport;\n debug?: boolean;\n batchWindowMs?: number;\n}\n\ninterface MultiRequest {\n request_id: string;\n texts: string[];\n lang: string;\n source_lang?: string;\n ctx?: TranslationCtx;\n}\n\ninterface MultiRequestItem {\n text: string;\n lang: string;\n sourceLang?: string;\n context?: TranslationCtx;\n resolve: (value: { text: string; status: string }) => void;\n reject: (error: Error) => void;\n}\n\ninterface MultiResponse {\n results: Array<{\n request_id: string;\n data: { texts: string[]; status: string };\n }>;\n}\n\ninterface MultiState {\n currentMulti: MultiRequestItem[];\n multiTimer: ReturnType<typeof setTimeout> | null;\n isRequestInFlight: boolean;\n}\n\nfunction generateRequestId(texts: string[], lang: string, sourceLang?: string, context?: TranslationCtx): string {\n const sortedTexts = [...texts].sort();\n\n const sortedContext = context && Object.keys(context).length > 0\n ? Object.fromEntries(Object.entries(context).sort(([a], [b]) => a.localeCompare(b)))\n : null;\n\n const data = [sortedTexts, lang, sourceLang || null, sortedContext];\n return md5(JSON.stringify(data));\n}\n\nasync function sendMulti(\n config: MultiTransportConfig,\n items: MultiRequestItem[],\n state: MultiState\n): Promise<void> {\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Sending multi request with ${items.length} texts`);\n }\n\n try {\n const groups = new Map<string, MultiRequestItem[]>();\n\n items.forEach(item => {\n const groupKey = JSON.stringify({\n lang: item.lang,\n sourceLang: item.sourceLang || null,\n context: item.context || null\n });\n\n if (!groups.has(groupKey)) {\n groups.set(groupKey, []);\n }\n groups.get(groupKey)!.push(item);\n });\n\n // Per-group: deduplicate texts, track which items map to which unique text\n interface GroupMeta {\n uniqueTexts: string[];\n /** Maps each unique text to all group items that requested it */\n textToItems: Map<string, MultiRequestItem[]>;\n }\n\n const requestIdToMeta = new Map<string, GroupMeta>();\n const requests: MultiRequest[] = Array.from(groups.entries()).map(([groupKey, groupItems]) => {\n const firstItem = groupItems[0];\n\n // Deduplicate texts within the group\n const textToItems = new Map<string, MultiRequestItem[]>();\n groupItems.forEach(item => {\n if (!textToItems.has(item.text)) {\n textToItems.set(item.text, []);\n }\n textToItems.get(item.text)!.push(item);\n });\n\n const uniqueTexts = Array.from(textToItems.keys());\n\n if (config.debug && uniqueTexts.length < groupItems.length) {\n console.log(`[BeLocal Multi Transport] Deduplicated ${groupItems.length} texts to ${uniqueTexts.length} unique`);\n }\n\n const requestId = generateRequestId(\n uniqueTexts,\n firstItem.lang,\n firstItem.sourceLang,\n firstItem.context\n );\n\n requestIdToMeta.set(requestId, { uniqueTexts, textToItems });\n\n return {\n request_id: requestId,\n texts: uniqueTexts,\n lang: firstItem.lang,\n source_lang: firstItem.sourceLang,\n ctx: firstItem.context\n };\n });\n\n const multiResponse: MultiResponse = await config.baseTransport.post({ requests }, '/v1/translate/multi');\n\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Multi response received with ${multiResponse.results.length} groups`);\n }\n\n const resultMap = new Map<string, { texts: string[]; status: string }>();\n multiResponse.results.forEach(result => {\n resultMap.set(result.request_id, { texts: result.data.texts, status: result.data.status });\n });\n\n requestIdToMeta.forEach((meta, requestId) => {\n const result = resultMap.get(requestId);\n\n if (!result) {\n if (config.debug) {\n console.error(`[BeLocal Multi Transport] No result found for request_id: ${requestId}`);\n }\n meta.textToItems.forEach(items => {\n items.forEach(item => item.reject(new Error(`No result found for request ${requestId}`)));\n });\n return;\n }\n\n if (result.texts.length !== meta.uniqueTexts.length) {\n const error = new Error(`Mismatch: expected ${meta.uniqueTexts.length} texts, got ${result.texts.length} for request_id ${requestId}`);\n if (config.debug) {\n console.error(`[BeLocal Multi Transport]`, error.message);\n }\n meta.textToItems.forEach(items => {\n items.forEach(item => item.reject(error));\n });\n return;\n }\n\n // Fan out each translated text to all items that requested that original text\n meta.uniqueTexts.forEach((originalText, index) => {\n const translatedText = result.texts[index];\n const status = result.status || 'success';\n const items = meta.textToItems.get(originalText)!;\n\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Success for request_id ${requestId}[${index}]: \"${translatedText}\" (${items.length} requester(s))`);\n }\n\n items.forEach(item => item.resolve({ text: translatedText, status }));\n });\n });\n } catch (error) {\n if (config.debug) {\n console.error(`[BeLocal Multi Transport] Multi request error:`, error);\n }\n\n const errorToReject = error instanceof Error ? error : new Error(String(error));\n items.forEach(item => item.reject(errorToReject));\n }\n}\n\nfunction processMulti(config: MultiTransportConfig, state: MultiState): void {\n if (state.currentMulti.length === 0 || state.isRequestInFlight) {\n return;\n }\n\n const itemsToSend = [...state.currentMulti];\n state.currentMulti = [];\n state.multiTimer = null;\n state.isRequestInFlight = true;\n\n sendMulti(config, itemsToSend, state).finally(() => {\n state.isRequestInFlight = false;\n\n if (state.currentMulti.length > 0) {\n const windowMs = config.batchWindowMs ?? 50;\n state.multiTimer = setTimeout(() => processMulti(config, state), windowMs);\n }\n });\n}\n\nexport function createMultiTransport(config: MultiTransportConfig): Transport {\n const windowMs = config.batchWindowMs ?? 50;\n\n const state: MultiState = {\n currentMulti: [],\n multiTimer: null,\n isRequestInFlight: false,\n };\n\n const transport = (({ text, lang, source_lang, ctx }) => {\n return new Promise<{ text: string; status: string }>((resolve, reject) => {\n if (config.debug) {\n const tempRequestId = md5(JSON.stringify([text, lang, source_lang || null, ctx || null]));\n console.log(`[BeLocal Multi Transport] Queuing request ${tempRequestId}: \"${text}\" to ${lang}`);\n }\n\n const requestItem: MultiRequestItem = {\n text,\n lang,\n sourceLang: source_lang,\n context: ctx,\n resolve,\n reject,\n };\n\n state.currentMulti.push(requestItem);\n\n if (state.multiTimer === null && !state.isRequestInFlight) {\n state.multiTimer = setTimeout(() => processMulti(config, state), windowMs);\n }\n });\n }) as Transport & { destroy: () => void };\n\n transport.destroy = () => {\n if (state.multiTimer) {\n clearTimeout(state.multiTimer);\n state.multiTimer = null;\n }\n state.currentMulti.forEach(item =>\n item.reject(new TransportDestroyedError())\n );\n state.currentMulti = [];\n };\n\n return transport;\n}\n","import type { Cache, CacheOptions } from './types';\n\ninterface CacheEntry {\n value: string;\n expiresAt: number;\n}\n\nexport class LocalCache implements Cache {\n private storage = new Map<string, CacheEntry>();\n private maxSize: number;\n private ttlMs: number;\n\n constructor(options: CacheOptions = {}) {\n this.maxSize = options.maxSize ?? 10_000;\n this.ttlMs = options.ttlMs ?? 3_600_000;\n }\n\n get(key: string): string | null {\n const entry = this.storage.get(key);\n if (entry === undefined) return null;\n\n if (Date.now() > entry.expiresAt) {\n this.storage.delete(key);\n return null;\n }\n\n this.storage.delete(key);\n this.storage.set(key, entry);\n\n return entry.value;\n }\n\n set(key: string, value: string): void {\n this.storage.delete(key);\n\n if (this.storage.size >= this.maxSize) {\n const oldestKey = this.storage.keys().next().value;\n if (oldestKey !== undefined) {\n this.storage.delete(oldestKey);\n }\n }\n\n this.storage.set(key, {\n value,\n expiresAt: Date.now() + this.ttlMs,\n });\n }\n\n clear(): void {\n this.storage.clear();\n }\n}\n","import type { BelocalEngineOptions, Lang, TranslateOptions, TranslationCtx, Transport, BaseTransport } from '../types';\nimport { TransportDestroyedError } from '../errors';\nimport { createMultiTransport } from '../../transports/multi';\nimport { LocalCache } from '../../cache/local';\nimport type { Cache } from '../../cache/types';\nimport { md5 } from 'js-md5';\n\nexport class BelocalEngine {\n private transport: Transport;\n private debug: boolean;\n private cache: Cache;\n\n constructor(options: BelocalEngineOptions, baseTransportFactory: (opts: any) => BaseTransport) {\n const {\n apiKey,\n batchWindowMs = 50,\n timeoutMs = 10000,\n debug = false,\n cacheTtlMs = 3_600_000,\n cacheMaxSize = 10_000\n } = options;\n\n if (!apiKey || typeof apiKey !== 'string') {\n throw new Error('[BeLocal] apiKey is required and must be a non-empty string');\n }\n\n if (typeof timeoutMs !== 'number' || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new Error('[BeLocal] timeoutMs must be a positive finite number');\n }\n\n const safeBatchWindowMs = Math.max(0, batchWindowMs);\n\n this.debug = debug;\n this.cache = new LocalCache({ ttlMs: cacheTtlMs, maxSize: cacheMaxSize });\n\n const authHeaders = {\n 'Authorization': `Bearer ${apiKey}`\n };\n\n const baseTransport = baseTransportFactory({\n headers: authHeaders,\n timeoutMs,\n debug: this.debug\n });\n\n this.transport = createMultiTransport({\n baseTransport,\n debug: this.debug,\n batchWindowMs: safeBatchWindowMs\n });\n\n if (this.debug) {\n console.log('[BeLocal Engine] Multi transport created with config:', {\n baseUrl: 'https://dynamic.belocal.dev',\n timeoutMs,\n batchWindowMs: safeBatchWindowMs\n });\n }\n }\n\n /** Translates a single text string to the target language. */\n async translate(text: string, lang: Lang, options?: TranslateOptions): Promise<string> {\n const results = await this.translateMany([text], lang, options);\n return results[0];\n }\n\n /** Translates multiple text strings to the target language in a single batch. */\n async translateMany(texts: string[], lang: Lang, options?: TranslateOptions): Promise<string[]> {\n const { source_lang, ctx } = this.resolveOptions(options);\n const results: (string | null)[] = new Array(texts.length);\n const cacheMisses: Array<{ index: number; text: string }> = [];\n\n for (let i = 0; i < texts.length; i++) {\n const text = texts[i];\n const cacheKey = this.generateCacheKey(text, lang, source_lang, ctx);\n\n const cachedResult = this.cache.get(cacheKey);\n if (cachedResult !== null) {\n results[i] = cachedResult;\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from cache:', text);\n }\n continue;\n }\n\n results[i] = null;\n cacheMisses.push({ index: i, text });\n }\n\n if (cacheMisses.length > 0) {\n const settlements = await Promise.allSettled(\n cacheMisses.map(async ({ index, text }) => {\n const result = await this.transport({ text, lang, source_lang, ctx });\n\n if (result.status !== 'error') {\n const cacheKey = this.generateCacheKey(text, lang, source_lang, ctx);\n this.cache.set(cacheKey, result.text);\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from API, cached:', text);\n }\n } else {\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from API (not cached due to error status):', text);\n }\n }\n\n return { index, translation: result.text };\n })\n );\n\n settlements.forEach((settlement, i) => {\n const { index, text } = cacheMisses[i];\n if (settlement.status === 'fulfilled') {\n results[index] = settlement.value.translation;\n } else {\n results[index] = text;\n const reason = settlement.reason;\n const isExpectedDestroy = reason instanceof TransportDestroyedError;\n if (this.debug && !isExpectedDestroy) {\n console.error(\n '[BeLocal Engine] Translation failed, using original text:',\n text,\n reason instanceof Error ? reason.message : String(reason)\n );\n }\n }\n });\n }\n\n return results as string[];\n }\n\n private resolveOptions(options?: TranslateOptions): { source_lang?: string; ctx?: TranslationCtx } {\n if (!options) return {};\n const serverCtx: TranslationCtx = {\n ...options.ctx,\n ...(options.context && { user_ctx: options.context }),\n ...(options.managed && { cache_type: 'managed' }),\n };\n const ctx = Object.values(serverCtx).some(Boolean) ? serverCtx : undefined;\n return { source_lang: options.source_lang, ctx };\n }\n\n /** Cleans up internal resources (timers, cache). Call when the engine is no longer needed. */\n destroy(): void {\n (this.transport as any).destroy?.();\n this.cache.clear();\n }\n\n private generateCacheKey(text: string, lang: Lang, source_lang?: string, ctx?: TranslationCtx): string {\n const sortedCtx = ctx\n ? Object.fromEntries(Object.entries(ctx).sort(([a], [b]) => a.localeCompare(b)))\n : null;\n\n const data = {\n text,\n lang,\n source_lang: source_lang || null,\n ctx: sortedCtx\n };\n return md5(JSON.stringify(data));\n }\n}\n","export type Lang = string;\n\nexport type UserCtx = {\n user_type?: string;\n entity_key?: string;\n entity_id?: string;\n};\n\nexport type TranslationCtx = {\n user_type?: string;\n user_ctx?: string;\n cache_type?: string;\n entity_key?: string;\n entity_id?: string;\n};\n\nexport const USER_TYPE_PRODUCT = 'product';\nexport const USER_TYPE_CHAT = 'chat';\n\nexport type TranslateOptions = {\n source_lang?: string;\n context?: string;\n managed?: boolean;\n ctx?: UserCtx;\n};\n\nexport interface BaseTransport {\n post(data: any, endpointPath: string): Promise<any>;\n}\n\nexport type Transport = (params: { text: string; lang: Lang; source_lang?: string; ctx?: TranslationCtx }) => Promise<{ text: string; status: string }>;\n\nexport interface BelocalEngineOptions {\n apiKey: string;\n batchWindowMs?: number;\n timeoutMs?: number;\n debug?: boolean;\n cacheTtlMs?: number;\n cacheMaxSize?: number;\n}\n","import type { BelocalEngineOptions } from '../types';\nimport { createBaseBrowserTransport } from '../../transports/base/browser';\nimport { BelocalEngine as BaseEngine } from './engine';\n\nexport class BelocalEngine extends BaseEngine {\n constructor(options: BelocalEngineOptions) {\n super(options, createBaseBrowserTransport);\n }\n}\n\nexport type { BelocalEngineOptions, Lang, TranslateOptions, BaseTransport, TranslationCtx, UserCtx } from '../types';\nexport { TransportDestroyedError } from '../errors';\nexport { USER_TYPE_PRODUCT, USER_TYPE_CHAT } from '../types';\nexport { createMultiTransport } from '../../transports/multi';\nexport { BaseBrowserTransport, createBaseBrowserTransport } from '../../transports/base';\n"]}
package/dist/node.cjs CHANGED
@@ -27,7 +27,7 @@ var http2__namespace = /*#__PURE__*/_interopNamespace(http2);
27
27
  // src/transports/base/node.ts
28
28
 
29
29
  // src/version.ts
30
- var SDK_VERSION = "1.0.5" ;
30
+ var SDK_VERSION = "1.0.6" ;
31
31
  var SDK_NAME = "js";
32
32
 
33
33
  // src/transports/base/dedupe.ts
@@ -259,20 +259,30 @@ async function sendMulti(config, items, state) {
259
259
  }
260
260
  groups.get(groupKey).push(item);
261
261
  });
262
- const requestIdToGroupItems = /* @__PURE__ */ new Map();
262
+ const requestIdToMeta = /* @__PURE__ */ new Map();
263
263
  const requests = Array.from(groups.entries()).map(([groupKey, groupItems]) => {
264
264
  const firstItem = groupItems[0];
265
- const texts = groupItems.map((item) => item.text);
265
+ const textToItems = /* @__PURE__ */ new Map();
266
+ groupItems.forEach((item) => {
267
+ if (!textToItems.has(item.text)) {
268
+ textToItems.set(item.text, []);
269
+ }
270
+ textToItems.get(item.text).push(item);
271
+ });
272
+ const uniqueTexts = Array.from(textToItems.keys());
273
+ if (config.debug && uniqueTexts.length < groupItems.length) {
274
+ console.log(`[BeLocal Multi Transport] Deduplicated ${groupItems.length} texts to ${uniqueTexts.length} unique`);
275
+ }
266
276
  const requestId = generateRequestId(
267
- texts,
277
+ uniqueTexts,
268
278
  firstItem.lang,
269
279
  firstItem.sourceLang,
270
280
  firstItem.context
271
281
  );
272
- requestIdToGroupItems.set(requestId, groupItems);
282
+ requestIdToMeta.set(requestId, { uniqueTexts, textToItems });
273
283
  return {
274
284
  request_id: requestId,
275
- texts,
285
+ texts: uniqueTexts,
276
286
  lang: firstItem.lang,
277
287
  source_lang: firstItem.sourceLang,
278
288
  ctx: firstItem.context
@@ -286,32 +296,35 @@ async function sendMulti(config, items, state) {
286
296
  multiResponse.results.forEach((result) => {
287
297
  resultMap.set(result.request_id, { texts: result.data.texts, status: result.data.status });
288
298
  });
289
- requestIdToGroupItems.forEach((groupItems, requestId) => {
299
+ requestIdToMeta.forEach((meta, requestId) => {
290
300
  const result = resultMap.get(requestId);
291
301
  if (!result) {
292
302
  if (config.debug) {
293
303
  console.error(`[BeLocal Multi Transport] No result found for request_id: ${requestId}`);
294
304
  }
295
- groupItems.forEach((item) => {
296
- item.reject(new Error(`No result found for request ${requestId}`));
305
+ meta.textToItems.forEach((items2) => {
306
+ items2.forEach((item) => item.reject(new Error(`No result found for request ${requestId}`)));
297
307
  });
298
308
  return;
299
309
  }
300
- if (result.texts.length !== groupItems.length) {
301
- const error = new Error(`Mismatch: expected ${groupItems.length} texts, got ${result.texts.length} for request_id ${requestId}`);
310
+ if (result.texts.length !== meta.uniqueTexts.length) {
311
+ const error = new Error(`Mismatch: expected ${meta.uniqueTexts.length} texts, got ${result.texts.length} for request_id ${requestId}`);
302
312
  if (config.debug) {
303
313
  console.error(`[BeLocal Multi Transport]`, error.message);
304
314
  }
305
- groupItems.forEach((item) => item.reject(error));
315
+ meta.textToItems.forEach((items2) => {
316
+ items2.forEach((item) => item.reject(error));
317
+ });
306
318
  return;
307
319
  }
308
- groupItems.forEach((item, index) => {
320
+ meta.uniqueTexts.forEach((originalText, index) => {
309
321
  const translatedText = result.texts[index];
310
322
  const status = result.status || "success";
323
+ const items2 = meta.textToItems.get(originalText);
311
324
  if (config.debug) {
312
- console.log(`[BeLocal Multi Transport] Success for request_id ${requestId}[${index}]: "${translatedText}"`);
325
+ console.log(`[BeLocal Multi Transport] Success for request_id ${requestId}[${index}]: "${translatedText}" (${items2.length} requester(s))`);
313
326
  }
314
- item.resolve({ text: translatedText, status });
327
+ items2.forEach((item) => item.resolve({ text: translatedText, status }));
315
328
  });
316
329
  });
317
330
  } catch (error) {
package/dist/node.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/version.ts","../src/transports/base/dedupe.ts","../src/transports/base/node.ts","../src/core/errors.ts","../src/transports/multi.ts","../src/cache/local.ts","../src/core/engine/engine.ts","../src/core/types.ts","../src/core/engine/node.ts"],"names":["session","URL","http2","headers","md5","BelocalEngine"],"mappings":"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","file":"node.cjs","sourcesContent":["declare const __SDK_VERSION__: string;\nexport const SDK_VERSION = typeof __SDK_VERSION__ !== 'undefined' ? __SDK_VERSION__ : 'undefined';\nexport const SDK_NAME = 'js';\n","import type { BaseTransport } from '../../core/types';\n\nfunction generateRequestKey(endpointPath: string, data: any): string {\n const normalize = (value: any): any => {\n if (value === null || value === undefined) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(normalize);\n }\n if (typeof value === 'object') {\n const sorted: Record<string, any> = {};\n for (const key of Object.keys(value).sort()) {\n sorted[key] = normalize(value[key]);\n }\n return sorted;\n }\n return value;\n };\n\n const normalizedData = JSON.stringify(normalize(data));\n return `${endpointPath}:${normalizedData}`;\n}\n\n/** Deduplicates identical in-flight requests so they share a single HTTP call. */\nexport class DedupeTransport implements BaseTransport {\n private inFlightRequests = new Map<string, Promise<any>>();\n\n constructor(\n private wrappedTransport: BaseTransport,\n private debug?: boolean\n ) {}\n\n async post(data: any, endpointPath: string): Promise<any> {\n const requestKey = generateRequestKey(endpointPath, data);\n\n const existingRequest = this.inFlightRequests.get(requestKey);\n if (existingRequest) {\n if (this.debug) {\n console.log(`[DedupeTransport] Deduplicating request to ${endpointPath}`);\n }\n return existingRequest;\n }\n\n const requestPromise = this.wrappedTransport.post(data, endpointPath)\n .finally(() => {\n this.inFlightRequests.delete(requestKey);\n });\n\n this.inFlightRequests.set(requestKey, requestPromise);\n\n if (this.debug) {\n console.log(`[DedupeTransport] New request to ${endpointPath} (${this.inFlightRequests.size} in-flight)`);\n }\n\n return requestPromise;\n }\n}\n","import * as http2 from 'node:http2';\nimport { URL } from 'node:url';\nimport type { BaseTransport } from '../../core/types';\nimport { SDK_NAME, SDK_VERSION } from '../../version';\nimport { DedupeTransport } from './dedupe';\n\nconst BASE_URL = 'https://dynamic.belocal.dev';\n\nexport interface BaseNodeTransportConfig {\n headers?: Record<string, string>;\n timeoutMs?: number;\n retries?: number;\n debug?: boolean;\n}\n\nconst sessionCache = new Map<string, http2.ClientHttp2Session>();\n\nlet cleanupTimer: NodeJS.Timeout | null = null;\n\nfunction cleanupDeadSessions(): void {\n for (const [url, session] of sessionCache.entries()) {\n if (session.destroyed || session.closed) {\n sessionCache.delete(url);\n }\n }\n}\n\nfunction startCleanupTimer(): void {\n if (cleanupTimer === null) {\n cleanupTimer = setInterval(cleanupDeadSessions, 60000);\n if (cleanupTimer.unref) {\n cleanupTimer.unref();\n }\n }\n}\n\nfunction getOrCreateSession(debug?: boolean): http2.ClientHttp2Session {\n cleanupDeadSessions();\n startCleanupTimer();\n\n if (sessionCache.has(BASE_URL)) {\n const session = sessionCache.get(BASE_URL)!;\n if (!session.destroyed && !session.closed) {\n return session;\n }\n sessionCache.delete(BASE_URL);\n }\n\n const parsedUrl = new URL(BASE_URL);\n const session = http2.connect(parsedUrl.origin);\n\n session.socket?.unref();\n\n session.on('error', () => {\n sessionCache.delete(BASE_URL);\n });\n\n session.on('close', () => {\n sessionCache.delete(BASE_URL);\n });\n\n session.on('goaway', () => {\n sessionCache.delete(BASE_URL);\n });\n\n if (debug) {\n session.on('connect', () => console.log('[Base Node Transport H2] new session connected'));\n session.on('goaway', (code, lastStreamID, opaque) =>\n console.log('[Base Node Transport H2] goaway', code, lastStreamID)\n );\n }\n\n sessionCache.set(BASE_URL, session);\n return session;\n}\n\nfunction makeHttp2Request(\n session: http2.ClientHttp2Session,\n path: string,\n headers: Record<string, string>,\n body: string,\n timeoutMs?: number\n): Promise<{ statusCode: number; headers: Record<string, string>; body: string }> {\n return new Promise((resolve, reject) => {\n const req = session.request({\n ':method': 'POST',\n ':path': path,\n 'content-type': 'application/json',\n 'content-length': Buffer.byteLength(body),\n ...headers,\n });\n\n let timeout: NodeJS.Timeout | null = null;\n if (timeoutMs) {\n timeout = setTimeout(() => {\n req.destroy();\n reject(new Error(`Request timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n }\n\n let responseData = '';\n let statusCode = 0;\n let responseHeaders: Record<string, string> = {};\n\n req.on('response', (headers) => {\n statusCode = headers[':status'] as number;\n responseHeaders = headers as Record<string, string>;\n });\n\n req.on('data', (chunk) => {\n responseData += chunk;\n });\n\n req.on('end', () => {\n if (timeout) clearTimeout(timeout);\n resolve({\n statusCode,\n headers: responseHeaders,\n body: responseData,\n });\n });\n\n req.on('error', (error) => {\n if (timeout) clearTimeout(timeout);\n reject(error);\n });\n\n req.write(body);\n req.end();\n });\n}\n\nexport class BaseNodeTransport implements BaseTransport {\n constructor(private config: BaseNodeTransportConfig) {}\n\n async post(data: any, endpointPath: string): Promise<any> {\n const maxRetries = this.config.retries || 0;\n let attempt = 0;\n const url = `${BASE_URL}${endpointPath}`;\n\n if (this.config.debug) {\n console.log(`[Base Node Transport] POST request to ${url}`, data);\n }\n\n while (attempt <= maxRetries) {\n try {\n const session = getOrCreateSession(this.config.debug);\n const body = JSON.stringify(data);\n\n const headers = {\n 'x-sdk': SDK_NAME,\n 'x-sdk-version': SDK_VERSION,\n ...this.config.headers,\n };\n\n const timeoutMs = this.config.timeoutMs ?? 10000;\n const response = await makeHttp2Request(\n session,\n endpointPath,\n headers,\n body,\n timeoutMs\n );\n\n if (response.statusCode < 200 || response.statusCode >= 300) {\n const errorMsg = `HTTP ${response.statusCode}: Request failed`;\n if (this.config.debug) {\n console.error(`[Base Node Transport] Request failed:`, errorMsg);\n }\n throw new Error(errorMsg);\n }\n\n const result = JSON.parse(response.body);\n if (this.config.debug) {\n console.log(`[Base Node Transport] Request successful:`, result);\n }\n\n return result;\n } catch (error) {\n attempt++;\n if (this.config.debug) {\n console.error(`[Base Node Transport] Attempt ${attempt} failed:`, error instanceof Error ? error.message : String(error));\n }\n if (attempt > maxRetries) {\n throw error;\n }\n\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 1000));\n }\n }\n }\n}\n\nexport function createBaseNodeTransport(config: BaseNodeTransportConfig): BaseTransport {\n const transport = new BaseNodeTransport(config);\n return new DedupeTransport(transport, config.debug);\n}\n","export class TransportDestroyedError extends Error {\n constructor(message = 'Transport destroyed') {\n super(message);\n this.name = 'TransportDestroyedError';\n Object.setPrototypeOf(this, TransportDestroyedError.prototype);\n }\n}\n","import type { Transport, BaseTransport, TranslationCtx } from '../core/types';\nimport { TransportDestroyedError } from '../core/errors';\nimport { md5 } from 'js-md5';\n\nexport interface MultiTransportConfig {\n baseTransport: BaseTransport;\n debug?: boolean;\n batchWindowMs?: number;\n}\n\ninterface MultiRequest {\n request_id: string;\n texts: string[];\n lang: string;\n source_lang?: string;\n ctx?: TranslationCtx;\n}\n\ninterface MultiRequestItem {\n text: string;\n lang: string;\n sourceLang?: string;\n context?: TranslationCtx;\n resolve: (value: { text: string; status: string }) => void;\n reject: (error: Error) => void;\n}\n\ninterface MultiResponse {\n results: Array<{\n request_id: string;\n data: { texts: string[]; status: string };\n }>;\n}\n\ninterface MultiState {\n currentMulti: MultiRequestItem[];\n multiTimer: ReturnType<typeof setTimeout> | null;\n isRequestInFlight: boolean;\n}\n\nfunction generateRequestId(texts: string[], lang: string, sourceLang?: string, context?: TranslationCtx): string {\n const sortedTexts = [...texts].sort();\n\n const sortedContext = context && Object.keys(context).length > 0\n ? Object.fromEntries(Object.entries(context).sort(([a], [b]) => a.localeCompare(b)))\n : null;\n\n const data = [sortedTexts, lang, sourceLang || null, sortedContext];\n return md5(JSON.stringify(data));\n}\n\nasync function sendMulti(\n config: MultiTransportConfig,\n items: MultiRequestItem[],\n state: MultiState\n): Promise<void> {\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Sending multi request with ${items.length} texts`);\n }\n\n try {\n const groups = new Map<string, MultiRequestItem[]>();\n\n items.forEach(item => {\n const groupKey = JSON.stringify({\n lang: item.lang,\n sourceLang: item.sourceLang || null,\n context: item.context || null\n });\n\n if (!groups.has(groupKey)) {\n groups.set(groupKey, []);\n }\n groups.get(groupKey)!.push(item);\n });\n\n const requestIdToGroupItems = new Map<string, MultiRequestItem[]>();\n const requests: MultiRequest[] = Array.from(groups.entries()).map(([groupKey, groupItems]) => {\n const firstItem = groupItems[0];\n const texts = groupItems.map(item => item.text);\n\n const requestId = generateRequestId(\n texts,\n firstItem.lang,\n firstItem.sourceLang,\n firstItem.context\n );\n\n requestIdToGroupItems.set(requestId, groupItems);\n\n return {\n request_id: requestId,\n texts,\n lang: firstItem.lang,\n source_lang: firstItem.sourceLang,\n ctx: firstItem.context\n };\n });\n\n const multiResponse: MultiResponse = await config.baseTransport.post({ requests }, '/v1/translate/multi');\n\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Multi response received with ${multiResponse.results.length} groups`);\n }\n\n const resultMap = new Map<string, { texts: string[]; status: string }>();\n multiResponse.results.forEach(result => {\n resultMap.set(result.request_id, { texts: result.data.texts, status: result.data.status });\n });\n\n requestIdToGroupItems.forEach((groupItems, requestId) => {\n const result = resultMap.get(requestId);\n\n if (!result) {\n if (config.debug) {\n console.error(`[BeLocal Multi Transport] No result found for request_id: ${requestId}`);\n }\n groupItems.forEach(item => {\n item.reject(new Error(`No result found for request ${requestId}`));\n });\n return;\n }\n\n if (result.texts.length !== groupItems.length) {\n const error = new Error(`Mismatch: expected ${groupItems.length} texts, got ${result.texts.length} for request_id ${requestId}`);\n if (config.debug) {\n console.error(`[BeLocal Multi Transport]`, error.message);\n }\n groupItems.forEach(item => item.reject(error));\n return;\n }\n\n groupItems.forEach((item, index) => {\n const translatedText = result.texts[index];\n const status = result.status || 'success';\n\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Success for request_id ${requestId}[${index}]: \"${translatedText}\"`);\n }\n\n item.resolve({ text: translatedText, status });\n });\n });\n } catch (error) {\n if (config.debug) {\n console.error(`[BeLocal Multi Transport] Multi request error:`, error);\n }\n\n const errorToReject = error instanceof Error ? error : new Error(String(error));\n items.forEach(item => item.reject(errorToReject));\n }\n}\n\nfunction processMulti(config: MultiTransportConfig, state: MultiState): void {\n if (state.currentMulti.length === 0 || state.isRequestInFlight) {\n return;\n }\n\n const itemsToSend = [...state.currentMulti];\n state.currentMulti = [];\n state.multiTimer = null;\n state.isRequestInFlight = true;\n\n sendMulti(config, itemsToSend, state).finally(() => {\n state.isRequestInFlight = false;\n\n if (state.currentMulti.length > 0) {\n const windowMs = config.batchWindowMs ?? 50;\n state.multiTimer = setTimeout(() => processMulti(config, state), windowMs);\n }\n });\n}\n\nexport function createMultiTransport(config: MultiTransportConfig): Transport {\n const windowMs = config.batchWindowMs ?? 50;\n\n const state: MultiState = {\n currentMulti: [],\n multiTimer: null,\n isRequestInFlight: false,\n };\n\n const transport = (({ text, lang, source_lang, ctx }) => {\n return new Promise<{ text: string; status: string }>((resolve, reject) => {\n if (config.debug) {\n const tempRequestId = md5(JSON.stringify([text, lang, source_lang || null, ctx || null]));\n console.log(`[BeLocal Multi Transport] Queuing request ${tempRequestId}: \"${text}\" to ${lang}`);\n }\n\n const requestItem: MultiRequestItem = {\n text,\n lang,\n sourceLang: source_lang,\n context: ctx,\n resolve,\n reject,\n };\n\n state.currentMulti.push(requestItem);\n\n if (state.multiTimer === null && !state.isRequestInFlight) {\n state.multiTimer = setTimeout(() => processMulti(config, state), windowMs);\n }\n });\n }) as Transport & { destroy: () => void };\n\n transport.destroy = () => {\n if (state.multiTimer) {\n clearTimeout(state.multiTimer);\n state.multiTimer = null;\n }\n state.currentMulti.forEach(item =>\n item.reject(new TransportDestroyedError())\n );\n state.currentMulti = [];\n };\n\n return transport;\n}\n","import type { Cache, CacheOptions } from './types';\n\ninterface CacheEntry {\n value: string;\n expiresAt: number;\n}\n\nexport class LocalCache implements Cache {\n private storage = new Map<string, CacheEntry>();\n private maxSize: number;\n private ttlMs: number;\n\n constructor(options: CacheOptions = {}) {\n this.maxSize = options.maxSize ?? 10_000;\n this.ttlMs = options.ttlMs ?? 3_600_000;\n }\n\n get(key: string): string | null {\n const entry = this.storage.get(key);\n if (entry === undefined) return null;\n\n if (Date.now() > entry.expiresAt) {\n this.storage.delete(key);\n return null;\n }\n\n this.storage.delete(key);\n this.storage.set(key, entry);\n\n return entry.value;\n }\n\n set(key: string, value: string): void {\n this.storage.delete(key);\n\n if (this.storage.size >= this.maxSize) {\n const oldestKey = this.storage.keys().next().value;\n if (oldestKey !== undefined) {\n this.storage.delete(oldestKey);\n }\n }\n\n this.storage.set(key, {\n value,\n expiresAt: Date.now() + this.ttlMs,\n });\n }\n\n clear(): void {\n this.storage.clear();\n }\n}\n","import type { BelocalEngineOptions, Lang, TranslateOptions, TranslationCtx, Transport, BaseTransport } from '../types';\nimport { TransportDestroyedError } from '../errors';\nimport { createMultiTransport } from '../../transports/multi';\nimport { LocalCache } from '../../cache/local';\nimport type { Cache } from '../../cache/types';\nimport { md5 } from 'js-md5';\n\nexport class BelocalEngine {\n private transport: Transport;\n private debug: boolean;\n private cache: Cache;\n\n constructor(options: BelocalEngineOptions, baseTransportFactory: (opts: any) => BaseTransport) {\n const {\n apiKey,\n batchWindowMs = 50,\n timeoutMs = 10000,\n debug = false,\n cacheTtlMs = 3_600_000,\n cacheMaxSize = 10_000\n } = options;\n\n if (!apiKey || typeof apiKey !== 'string') {\n throw new Error('[BeLocal] apiKey is required and must be a non-empty string');\n }\n\n if (typeof timeoutMs !== 'number' || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new Error('[BeLocal] timeoutMs must be a positive finite number');\n }\n\n const safeBatchWindowMs = Math.max(0, batchWindowMs);\n\n this.debug = debug;\n this.cache = new LocalCache({ ttlMs: cacheTtlMs, maxSize: cacheMaxSize });\n\n const authHeaders = {\n 'Authorization': `Bearer ${apiKey}`\n };\n\n const baseTransport = baseTransportFactory({\n headers: authHeaders,\n timeoutMs,\n debug: this.debug\n });\n\n this.transport = createMultiTransport({\n baseTransport,\n debug: this.debug,\n batchWindowMs: safeBatchWindowMs\n });\n\n if (this.debug) {\n console.log('[BeLocal Engine] Multi transport created with config:', {\n baseUrl: 'https://dynamic.belocal.dev',\n timeoutMs,\n batchWindowMs: safeBatchWindowMs\n });\n }\n }\n\n /** Translates a single text string to the target language. */\n async translate(text: string, lang: Lang, options?: TranslateOptions): Promise<string> {\n const results = await this.translateMany([text], lang, options);\n return results[0];\n }\n\n /** Translates multiple text strings to the target language in a single batch. */\n async translateMany(texts: string[], lang: Lang, options?: TranslateOptions): Promise<string[]> {\n const { source_lang, ctx } = this.resolveOptions(options);\n const results: (string | null)[] = new Array(texts.length);\n const cacheMisses: Array<{ index: number; text: string }> = [];\n\n for (let i = 0; i < texts.length; i++) {\n const text = texts[i];\n const cacheKey = this.generateCacheKey(text, lang, source_lang, ctx);\n\n const cachedResult = this.cache.get(cacheKey);\n if (cachedResult !== null) {\n results[i] = cachedResult;\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from cache:', text);\n }\n continue;\n }\n\n results[i] = null;\n cacheMisses.push({ index: i, text });\n }\n\n if (cacheMisses.length > 0) {\n const settlements = await Promise.allSettled(\n cacheMisses.map(async ({ index, text }) => {\n const result = await this.transport({ text, lang, source_lang, ctx });\n\n if (result.status !== 'error') {\n const cacheKey = this.generateCacheKey(text, lang, source_lang, ctx);\n this.cache.set(cacheKey, result.text);\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from API, cached:', text);\n }\n } else {\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from API (not cached due to error status):', text);\n }\n }\n\n return { index, translation: result.text };\n })\n );\n\n settlements.forEach((settlement, i) => {\n const { index, text } = cacheMisses[i];\n if (settlement.status === 'fulfilled') {\n results[index] = settlement.value.translation;\n } else {\n results[index] = text;\n const reason = settlement.reason;\n const isExpectedDestroy = reason instanceof TransportDestroyedError;\n if (this.debug && !isExpectedDestroy) {\n console.error(\n '[BeLocal Engine] Translation failed, using original text:',\n text,\n reason instanceof Error ? reason.message : String(reason)\n );\n }\n }\n });\n }\n\n return results as string[];\n }\n\n private resolveOptions(options?: TranslateOptions): { source_lang?: string; ctx?: TranslationCtx } {\n if (!options) return {};\n const serverCtx: TranslationCtx = {\n ...options.ctx,\n ...(options.context && { user_ctx: options.context }),\n ...(options.managed && { cache_type: 'managed' }),\n };\n const ctx = Object.values(serverCtx).some(Boolean) ? serverCtx : undefined;\n return { source_lang: options.source_lang, ctx };\n }\n\n /** Cleans up internal resources (timers, cache). Call when the engine is no longer needed. */\n destroy(): void {\n (this.transport as any).destroy?.();\n this.cache.clear();\n }\n\n private generateCacheKey(text: string, lang: Lang, source_lang?: string, ctx?: TranslationCtx): string {\n const sortedCtx = ctx\n ? Object.fromEntries(Object.entries(ctx).sort(([a], [b]) => a.localeCompare(b)))\n : null;\n\n const data = {\n text,\n lang,\n source_lang: source_lang || null,\n ctx: sortedCtx\n };\n return md5(JSON.stringify(data));\n }\n}\n","export type Lang = string;\n\nexport type UserCtx = {\n user_type?: string;\n entity_key?: string;\n entity_id?: string;\n};\n\nexport type TranslationCtx = {\n user_type?: string;\n user_ctx?: string;\n cache_type?: string;\n entity_key?: string;\n entity_id?: string;\n};\n\nexport const USER_TYPE_PRODUCT = 'product';\nexport const USER_TYPE_CHAT = 'chat';\n\nexport type TranslateOptions = {\n source_lang?: string;\n context?: string;\n managed?: boolean;\n ctx?: UserCtx;\n};\n\nexport interface BaseTransport {\n post(data: any, endpointPath: string): Promise<any>;\n}\n\nexport type Transport = (params: { text: string; lang: Lang; source_lang?: string; ctx?: TranslationCtx }) => Promise<{ text: string; status: string }>;\n\nexport interface BelocalEngineOptions {\n apiKey: string;\n batchWindowMs?: number;\n timeoutMs?: number;\n debug?: boolean;\n cacheTtlMs?: number;\n cacheMaxSize?: number;\n}\n","import type { BelocalEngineOptions } from '../types';\nimport { createBaseNodeTransport } from '../../transports/base/node';\nimport { BelocalEngine as BaseEngine } from './engine';\n\n/** BeLocal translation engine for Node.js environments. */\nexport class BelocalEngine extends BaseEngine {\n constructor(options: BelocalEngineOptions) {\n super(options, createBaseNodeTransport);\n }\n}\n\nexport type { BelocalEngineOptions, Lang, TranslateOptions, BaseTransport, TranslationCtx, UserCtx } from '../types';\nexport { TransportDestroyedError } from '../errors';\nexport { USER_TYPE_PRODUCT, USER_TYPE_CHAT } from '../types';\nexport { BaseNodeTransport, createBaseNodeTransport } from '../../transports/base';\nexport { createMultiTransport } from '../../transports/multi';\n"]}
1
+ {"version":3,"sources":["../src/version.ts","../src/transports/base/dedupe.ts","../src/transports/base/node.ts","../src/core/errors.ts","../src/transports/multi.ts","../src/cache/local.ts","../src/core/engine/engine.ts","../src/core/types.ts","../src/core/engine/node.ts"],"names":["session","URL","http2","headers","md5","items","BelocalEngine"],"mappings":"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","file":"node.cjs","sourcesContent":["declare const __SDK_VERSION__: string;\nexport const SDK_VERSION = typeof __SDK_VERSION__ !== 'undefined' ? __SDK_VERSION__ : 'undefined';\nexport const SDK_NAME = 'js';\n","import type { BaseTransport } from '../../core/types';\n\nfunction generateRequestKey(endpointPath: string, data: any): string {\n const normalize = (value: any): any => {\n if (value === null || value === undefined) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(normalize);\n }\n if (typeof value === 'object') {\n const sorted: Record<string, any> = {};\n for (const key of Object.keys(value).sort()) {\n sorted[key] = normalize(value[key]);\n }\n return sorted;\n }\n return value;\n };\n\n const normalizedData = JSON.stringify(normalize(data));\n return `${endpointPath}:${normalizedData}`;\n}\n\n/** Deduplicates identical in-flight requests so they share a single HTTP call. */\nexport class DedupeTransport implements BaseTransport {\n private inFlightRequests = new Map<string, Promise<any>>();\n\n constructor(\n private wrappedTransport: BaseTransport,\n private debug?: boolean\n ) {}\n\n async post(data: any, endpointPath: string): Promise<any> {\n const requestKey = generateRequestKey(endpointPath, data);\n\n const existingRequest = this.inFlightRequests.get(requestKey);\n if (existingRequest) {\n if (this.debug) {\n console.log(`[DedupeTransport] Deduplicating request to ${endpointPath}`);\n }\n return existingRequest;\n }\n\n const requestPromise = this.wrappedTransport.post(data, endpointPath)\n .finally(() => {\n this.inFlightRequests.delete(requestKey);\n });\n\n this.inFlightRequests.set(requestKey, requestPromise);\n\n if (this.debug) {\n console.log(`[DedupeTransport] New request to ${endpointPath} (${this.inFlightRequests.size} in-flight)`);\n }\n\n return requestPromise;\n }\n}\n","import * as http2 from 'node:http2';\nimport { URL } from 'node:url';\nimport type { BaseTransport } from '../../core/types';\nimport { SDK_NAME, SDK_VERSION } from '../../version';\nimport { DedupeTransport } from './dedupe';\n\nconst BASE_URL = 'https://dynamic.belocal.dev';\n\nexport interface BaseNodeTransportConfig {\n headers?: Record<string, string>;\n timeoutMs?: number;\n retries?: number;\n debug?: boolean;\n}\n\nconst sessionCache = new Map<string, http2.ClientHttp2Session>();\n\nlet cleanupTimer: NodeJS.Timeout | null = null;\n\nfunction cleanupDeadSessions(): void {\n for (const [url, session] of sessionCache.entries()) {\n if (session.destroyed || session.closed) {\n sessionCache.delete(url);\n }\n }\n}\n\nfunction startCleanupTimer(): void {\n if (cleanupTimer === null) {\n cleanupTimer = setInterval(cleanupDeadSessions, 60000);\n if (cleanupTimer.unref) {\n cleanupTimer.unref();\n }\n }\n}\n\nfunction getOrCreateSession(debug?: boolean): http2.ClientHttp2Session {\n cleanupDeadSessions();\n startCleanupTimer();\n\n if (sessionCache.has(BASE_URL)) {\n const session = sessionCache.get(BASE_URL)!;\n if (!session.destroyed && !session.closed) {\n return session;\n }\n sessionCache.delete(BASE_URL);\n }\n\n const parsedUrl = new URL(BASE_URL);\n const session = http2.connect(parsedUrl.origin);\n\n session.socket?.unref();\n\n session.on('error', () => {\n sessionCache.delete(BASE_URL);\n });\n\n session.on('close', () => {\n sessionCache.delete(BASE_URL);\n });\n\n session.on('goaway', () => {\n sessionCache.delete(BASE_URL);\n });\n\n if (debug) {\n session.on('connect', () => console.log('[Base Node Transport H2] new session connected'));\n session.on('goaway', (code, lastStreamID, opaque) =>\n console.log('[Base Node Transport H2] goaway', code, lastStreamID)\n );\n }\n\n sessionCache.set(BASE_URL, session);\n return session;\n}\n\nfunction makeHttp2Request(\n session: http2.ClientHttp2Session,\n path: string,\n headers: Record<string, string>,\n body: string,\n timeoutMs?: number\n): Promise<{ statusCode: number; headers: Record<string, string>; body: string }> {\n return new Promise((resolve, reject) => {\n const req = session.request({\n ':method': 'POST',\n ':path': path,\n 'content-type': 'application/json',\n 'content-length': Buffer.byteLength(body),\n ...headers,\n });\n\n let timeout: NodeJS.Timeout | null = null;\n if (timeoutMs) {\n timeout = setTimeout(() => {\n req.destroy();\n reject(new Error(`Request timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n }\n\n let responseData = '';\n let statusCode = 0;\n let responseHeaders: Record<string, string> = {};\n\n req.on('response', (headers) => {\n statusCode = headers[':status'] as number;\n responseHeaders = headers as Record<string, string>;\n });\n\n req.on('data', (chunk) => {\n responseData += chunk;\n });\n\n req.on('end', () => {\n if (timeout) clearTimeout(timeout);\n resolve({\n statusCode,\n headers: responseHeaders,\n body: responseData,\n });\n });\n\n req.on('error', (error) => {\n if (timeout) clearTimeout(timeout);\n reject(error);\n });\n\n req.write(body);\n req.end();\n });\n}\n\nexport class BaseNodeTransport implements BaseTransport {\n constructor(private config: BaseNodeTransportConfig) {}\n\n async post(data: any, endpointPath: string): Promise<any> {\n const maxRetries = this.config.retries || 0;\n let attempt = 0;\n const url = `${BASE_URL}${endpointPath}`;\n\n if (this.config.debug) {\n console.log(`[Base Node Transport] POST request to ${url}`, data);\n }\n\n while (attempt <= maxRetries) {\n try {\n const session = getOrCreateSession(this.config.debug);\n const body = JSON.stringify(data);\n\n const headers = {\n 'x-sdk': SDK_NAME,\n 'x-sdk-version': SDK_VERSION,\n ...this.config.headers,\n };\n\n const timeoutMs = this.config.timeoutMs ?? 10000;\n const response = await makeHttp2Request(\n session,\n endpointPath,\n headers,\n body,\n timeoutMs\n );\n\n if (response.statusCode < 200 || response.statusCode >= 300) {\n const errorMsg = `HTTP ${response.statusCode}: Request failed`;\n if (this.config.debug) {\n console.error(`[Base Node Transport] Request failed:`, errorMsg);\n }\n throw new Error(errorMsg);\n }\n\n const result = JSON.parse(response.body);\n if (this.config.debug) {\n console.log(`[Base Node Transport] Request successful:`, result);\n }\n\n return result;\n } catch (error) {\n attempt++;\n if (this.config.debug) {\n console.error(`[Base Node Transport] Attempt ${attempt} failed:`, error instanceof Error ? error.message : String(error));\n }\n if (attempt > maxRetries) {\n throw error;\n }\n\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 1000));\n }\n }\n }\n}\n\nexport function createBaseNodeTransport(config: BaseNodeTransportConfig): BaseTransport {\n const transport = new BaseNodeTransport(config);\n return new DedupeTransport(transport, config.debug);\n}\n","export class TransportDestroyedError extends Error {\n constructor(message = 'Transport destroyed') {\n super(message);\n this.name = 'TransportDestroyedError';\n Object.setPrototypeOf(this, TransportDestroyedError.prototype);\n }\n}\n","import type { Transport, BaseTransport, TranslationCtx } from '../core/types';\nimport { TransportDestroyedError } from '../core/errors';\nimport { md5 } from 'js-md5';\n\nexport interface MultiTransportConfig {\n baseTransport: BaseTransport;\n debug?: boolean;\n batchWindowMs?: number;\n}\n\ninterface MultiRequest {\n request_id: string;\n texts: string[];\n lang: string;\n source_lang?: string;\n ctx?: TranslationCtx;\n}\n\ninterface MultiRequestItem {\n text: string;\n lang: string;\n sourceLang?: string;\n context?: TranslationCtx;\n resolve: (value: { text: string; status: string }) => void;\n reject: (error: Error) => void;\n}\n\ninterface MultiResponse {\n results: Array<{\n request_id: string;\n data: { texts: string[]; status: string };\n }>;\n}\n\ninterface MultiState {\n currentMulti: MultiRequestItem[];\n multiTimer: ReturnType<typeof setTimeout> | null;\n isRequestInFlight: boolean;\n}\n\nfunction generateRequestId(texts: string[], lang: string, sourceLang?: string, context?: TranslationCtx): string {\n const sortedTexts = [...texts].sort();\n\n const sortedContext = context && Object.keys(context).length > 0\n ? Object.fromEntries(Object.entries(context).sort(([a], [b]) => a.localeCompare(b)))\n : null;\n\n const data = [sortedTexts, lang, sourceLang || null, sortedContext];\n return md5(JSON.stringify(data));\n}\n\nasync function sendMulti(\n config: MultiTransportConfig,\n items: MultiRequestItem[],\n state: MultiState\n): Promise<void> {\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Sending multi request with ${items.length} texts`);\n }\n\n try {\n const groups = new Map<string, MultiRequestItem[]>();\n\n items.forEach(item => {\n const groupKey = JSON.stringify({\n lang: item.lang,\n sourceLang: item.sourceLang || null,\n context: item.context || null\n });\n\n if (!groups.has(groupKey)) {\n groups.set(groupKey, []);\n }\n groups.get(groupKey)!.push(item);\n });\n\n // Per-group: deduplicate texts, track which items map to which unique text\n interface GroupMeta {\n uniqueTexts: string[];\n /** Maps each unique text to all group items that requested it */\n textToItems: Map<string, MultiRequestItem[]>;\n }\n\n const requestIdToMeta = new Map<string, GroupMeta>();\n const requests: MultiRequest[] = Array.from(groups.entries()).map(([groupKey, groupItems]) => {\n const firstItem = groupItems[0];\n\n // Deduplicate texts within the group\n const textToItems = new Map<string, MultiRequestItem[]>();\n groupItems.forEach(item => {\n if (!textToItems.has(item.text)) {\n textToItems.set(item.text, []);\n }\n textToItems.get(item.text)!.push(item);\n });\n\n const uniqueTexts = Array.from(textToItems.keys());\n\n if (config.debug && uniqueTexts.length < groupItems.length) {\n console.log(`[BeLocal Multi Transport] Deduplicated ${groupItems.length} texts to ${uniqueTexts.length} unique`);\n }\n\n const requestId = generateRequestId(\n uniqueTexts,\n firstItem.lang,\n firstItem.sourceLang,\n firstItem.context\n );\n\n requestIdToMeta.set(requestId, { uniqueTexts, textToItems });\n\n return {\n request_id: requestId,\n texts: uniqueTexts,\n lang: firstItem.lang,\n source_lang: firstItem.sourceLang,\n ctx: firstItem.context\n };\n });\n\n const multiResponse: MultiResponse = await config.baseTransport.post({ requests }, '/v1/translate/multi');\n\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Multi response received with ${multiResponse.results.length} groups`);\n }\n\n const resultMap = new Map<string, { texts: string[]; status: string }>();\n multiResponse.results.forEach(result => {\n resultMap.set(result.request_id, { texts: result.data.texts, status: result.data.status });\n });\n\n requestIdToMeta.forEach((meta, requestId) => {\n const result = resultMap.get(requestId);\n\n if (!result) {\n if (config.debug) {\n console.error(`[BeLocal Multi Transport] No result found for request_id: ${requestId}`);\n }\n meta.textToItems.forEach(items => {\n items.forEach(item => item.reject(new Error(`No result found for request ${requestId}`)));\n });\n return;\n }\n\n if (result.texts.length !== meta.uniqueTexts.length) {\n const error = new Error(`Mismatch: expected ${meta.uniqueTexts.length} texts, got ${result.texts.length} for request_id ${requestId}`);\n if (config.debug) {\n console.error(`[BeLocal Multi Transport]`, error.message);\n }\n meta.textToItems.forEach(items => {\n items.forEach(item => item.reject(error));\n });\n return;\n }\n\n // Fan out each translated text to all items that requested that original text\n meta.uniqueTexts.forEach((originalText, index) => {\n const translatedText = result.texts[index];\n const status = result.status || 'success';\n const items = meta.textToItems.get(originalText)!;\n\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Success for request_id ${requestId}[${index}]: \"${translatedText}\" (${items.length} requester(s))`);\n }\n\n items.forEach(item => item.resolve({ text: translatedText, status }));\n });\n });\n } catch (error) {\n if (config.debug) {\n console.error(`[BeLocal Multi Transport] Multi request error:`, error);\n }\n\n const errorToReject = error instanceof Error ? error : new Error(String(error));\n items.forEach(item => item.reject(errorToReject));\n }\n}\n\nfunction processMulti(config: MultiTransportConfig, state: MultiState): void {\n if (state.currentMulti.length === 0 || state.isRequestInFlight) {\n return;\n }\n\n const itemsToSend = [...state.currentMulti];\n state.currentMulti = [];\n state.multiTimer = null;\n state.isRequestInFlight = true;\n\n sendMulti(config, itemsToSend, state).finally(() => {\n state.isRequestInFlight = false;\n\n if (state.currentMulti.length > 0) {\n const windowMs = config.batchWindowMs ?? 50;\n state.multiTimer = setTimeout(() => processMulti(config, state), windowMs);\n }\n });\n}\n\nexport function createMultiTransport(config: MultiTransportConfig): Transport {\n const windowMs = config.batchWindowMs ?? 50;\n\n const state: MultiState = {\n currentMulti: [],\n multiTimer: null,\n isRequestInFlight: false,\n };\n\n const transport = (({ text, lang, source_lang, ctx }) => {\n return new Promise<{ text: string; status: string }>((resolve, reject) => {\n if (config.debug) {\n const tempRequestId = md5(JSON.stringify([text, lang, source_lang || null, ctx || null]));\n console.log(`[BeLocal Multi Transport] Queuing request ${tempRequestId}: \"${text}\" to ${lang}`);\n }\n\n const requestItem: MultiRequestItem = {\n text,\n lang,\n sourceLang: source_lang,\n context: ctx,\n resolve,\n reject,\n };\n\n state.currentMulti.push(requestItem);\n\n if (state.multiTimer === null && !state.isRequestInFlight) {\n state.multiTimer = setTimeout(() => processMulti(config, state), windowMs);\n }\n });\n }) as Transport & { destroy: () => void };\n\n transport.destroy = () => {\n if (state.multiTimer) {\n clearTimeout(state.multiTimer);\n state.multiTimer = null;\n }\n state.currentMulti.forEach(item =>\n item.reject(new TransportDestroyedError())\n );\n state.currentMulti = [];\n };\n\n return transport;\n}\n","import type { Cache, CacheOptions } from './types';\n\ninterface CacheEntry {\n value: string;\n expiresAt: number;\n}\n\nexport class LocalCache implements Cache {\n private storage = new Map<string, CacheEntry>();\n private maxSize: number;\n private ttlMs: number;\n\n constructor(options: CacheOptions = {}) {\n this.maxSize = options.maxSize ?? 10_000;\n this.ttlMs = options.ttlMs ?? 3_600_000;\n }\n\n get(key: string): string | null {\n const entry = this.storage.get(key);\n if (entry === undefined) return null;\n\n if (Date.now() > entry.expiresAt) {\n this.storage.delete(key);\n return null;\n }\n\n this.storage.delete(key);\n this.storage.set(key, entry);\n\n return entry.value;\n }\n\n set(key: string, value: string): void {\n this.storage.delete(key);\n\n if (this.storage.size >= this.maxSize) {\n const oldestKey = this.storage.keys().next().value;\n if (oldestKey !== undefined) {\n this.storage.delete(oldestKey);\n }\n }\n\n this.storage.set(key, {\n value,\n expiresAt: Date.now() + this.ttlMs,\n });\n }\n\n clear(): void {\n this.storage.clear();\n }\n}\n","import type { BelocalEngineOptions, Lang, TranslateOptions, TranslationCtx, Transport, BaseTransport } from '../types';\nimport { TransportDestroyedError } from '../errors';\nimport { createMultiTransport } from '../../transports/multi';\nimport { LocalCache } from '../../cache/local';\nimport type { Cache } from '../../cache/types';\nimport { md5 } from 'js-md5';\n\nexport class BelocalEngine {\n private transport: Transport;\n private debug: boolean;\n private cache: Cache;\n\n constructor(options: BelocalEngineOptions, baseTransportFactory: (opts: any) => BaseTransport) {\n const {\n apiKey,\n batchWindowMs = 50,\n timeoutMs = 10000,\n debug = false,\n cacheTtlMs = 3_600_000,\n cacheMaxSize = 10_000\n } = options;\n\n if (!apiKey || typeof apiKey !== 'string') {\n throw new Error('[BeLocal] apiKey is required and must be a non-empty string');\n }\n\n if (typeof timeoutMs !== 'number' || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new Error('[BeLocal] timeoutMs must be a positive finite number');\n }\n\n const safeBatchWindowMs = Math.max(0, batchWindowMs);\n\n this.debug = debug;\n this.cache = new LocalCache({ ttlMs: cacheTtlMs, maxSize: cacheMaxSize });\n\n const authHeaders = {\n 'Authorization': `Bearer ${apiKey}`\n };\n\n const baseTransport = baseTransportFactory({\n headers: authHeaders,\n timeoutMs,\n debug: this.debug\n });\n\n this.transport = createMultiTransport({\n baseTransport,\n debug: this.debug,\n batchWindowMs: safeBatchWindowMs\n });\n\n if (this.debug) {\n console.log('[BeLocal Engine] Multi transport created with config:', {\n baseUrl: 'https://dynamic.belocal.dev',\n timeoutMs,\n batchWindowMs: safeBatchWindowMs\n });\n }\n }\n\n /** Translates a single text string to the target language. */\n async translate(text: string, lang: Lang, options?: TranslateOptions): Promise<string> {\n const results = await this.translateMany([text], lang, options);\n return results[0];\n }\n\n /** Translates multiple text strings to the target language in a single batch. */\n async translateMany(texts: string[], lang: Lang, options?: TranslateOptions): Promise<string[]> {\n const { source_lang, ctx } = this.resolveOptions(options);\n const results: (string | null)[] = new Array(texts.length);\n const cacheMisses: Array<{ index: number; text: string }> = [];\n\n for (let i = 0; i < texts.length; i++) {\n const text = texts[i];\n const cacheKey = this.generateCacheKey(text, lang, source_lang, ctx);\n\n const cachedResult = this.cache.get(cacheKey);\n if (cachedResult !== null) {\n results[i] = cachedResult;\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from cache:', text);\n }\n continue;\n }\n\n results[i] = null;\n cacheMisses.push({ index: i, text });\n }\n\n if (cacheMisses.length > 0) {\n const settlements = await Promise.allSettled(\n cacheMisses.map(async ({ index, text }) => {\n const result = await this.transport({ text, lang, source_lang, ctx });\n\n if (result.status !== 'error') {\n const cacheKey = this.generateCacheKey(text, lang, source_lang, ctx);\n this.cache.set(cacheKey, result.text);\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from API, cached:', text);\n }\n } else {\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from API (not cached due to error status):', text);\n }\n }\n\n return { index, translation: result.text };\n })\n );\n\n settlements.forEach((settlement, i) => {\n const { index, text } = cacheMisses[i];\n if (settlement.status === 'fulfilled') {\n results[index] = settlement.value.translation;\n } else {\n results[index] = text;\n const reason = settlement.reason;\n const isExpectedDestroy = reason instanceof TransportDestroyedError;\n if (this.debug && !isExpectedDestroy) {\n console.error(\n '[BeLocal Engine] Translation failed, using original text:',\n text,\n reason instanceof Error ? reason.message : String(reason)\n );\n }\n }\n });\n }\n\n return results as string[];\n }\n\n private resolveOptions(options?: TranslateOptions): { source_lang?: string; ctx?: TranslationCtx } {\n if (!options) return {};\n const serverCtx: TranslationCtx = {\n ...options.ctx,\n ...(options.context && { user_ctx: options.context }),\n ...(options.managed && { cache_type: 'managed' }),\n };\n const ctx = Object.values(serverCtx).some(Boolean) ? serverCtx : undefined;\n return { source_lang: options.source_lang, ctx };\n }\n\n /** Cleans up internal resources (timers, cache). Call when the engine is no longer needed. */\n destroy(): void {\n (this.transport as any).destroy?.();\n this.cache.clear();\n }\n\n private generateCacheKey(text: string, lang: Lang, source_lang?: string, ctx?: TranslationCtx): string {\n const sortedCtx = ctx\n ? Object.fromEntries(Object.entries(ctx).sort(([a], [b]) => a.localeCompare(b)))\n : null;\n\n const data = {\n text,\n lang,\n source_lang: source_lang || null,\n ctx: sortedCtx\n };\n return md5(JSON.stringify(data));\n }\n}\n","export type Lang = string;\n\nexport type UserCtx = {\n user_type?: string;\n entity_key?: string;\n entity_id?: string;\n};\n\nexport type TranslationCtx = {\n user_type?: string;\n user_ctx?: string;\n cache_type?: string;\n entity_key?: string;\n entity_id?: string;\n};\n\nexport const USER_TYPE_PRODUCT = 'product';\nexport const USER_TYPE_CHAT = 'chat';\n\nexport type TranslateOptions = {\n source_lang?: string;\n context?: string;\n managed?: boolean;\n ctx?: UserCtx;\n};\n\nexport interface BaseTransport {\n post(data: any, endpointPath: string): Promise<any>;\n}\n\nexport type Transport = (params: { text: string; lang: Lang; source_lang?: string; ctx?: TranslationCtx }) => Promise<{ text: string; status: string }>;\n\nexport interface BelocalEngineOptions {\n apiKey: string;\n batchWindowMs?: number;\n timeoutMs?: number;\n debug?: boolean;\n cacheTtlMs?: number;\n cacheMaxSize?: number;\n}\n","import type { BelocalEngineOptions } from '../types';\nimport { createBaseNodeTransport } from '../../transports/base/node';\nimport { BelocalEngine as BaseEngine } from './engine';\n\n/** BeLocal translation engine for Node.js environments. */\nexport class BelocalEngine extends BaseEngine {\n constructor(options: BelocalEngineOptions) {\n super(options, createBaseNodeTransport);\n }\n}\n\nexport type { BelocalEngineOptions, Lang, TranslateOptions, BaseTransport, TranslationCtx, UserCtx } from '../types';\nexport { TransportDestroyedError } from '../errors';\nexport { USER_TYPE_PRODUCT, USER_TYPE_CHAT } from '../types';\nexport { BaseNodeTransport, createBaseNodeTransport } from '../../transports/base';\nexport { createMultiTransport } from '../../transports/multi';\n"]}
package/dist/node.mjs CHANGED
@@ -5,7 +5,7 @@ import { md5 } from 'js-md5';
5
5
  // src/transports/base/node.ts
6
6
 
7
7
  // src/version.ts
8
- var SDK_VERSION = "1.0.5" ;
8
+ var SDK_VERSION = "1.0.6" ;
9
9
  var SDK_NAME = "js";
10
10
 
11
11
  // src/transports/base/dedupe.ts
@@ -237,20 +237,30 @@ async function sendMulti(config, items, state) {
237
237
  }
238
238
  groups.get(groupKey).push(item);
239
239
  });
240
- const requestIdToGroupItems = /* @__PURE__ */ new Map();
240
+ const requestIdToMeta = /* @__PURE__ */ new Map();
241
241
  const requests = Array.from(groups.entries()).map(([groupKey, groupItems]) => {
242
242
  const firstItem = groupItems[0];
243
- const texts = groupItems.map((item) => item.text);
243
+ const textToItems = /* @__PURE__ */ new Map();
244
+ groupItems.forEach((item) => {
245
+ if (!textToItems.has(item.text)) {
246
+ textToItems.set(item.text, []);
247
+ }
248
+ textToItems.get(item.text).push(item);
249
+ });
250
+ const uniqueTexts = Array.from(textToItems.keys());
251
+ if (config.debug && uniqueTexts.length < groupItems.length) {
252
+ console.log(`[BeLocal Multi Transport] Deduplicated ${groupItems.length} texts to ${uniqueTexts.length} unique`);
253
+ }
244
254
  const requestId = generateRequestId(
245
- texts,
255
+ uniqueTexts,
246
256
  firstItem.lang,
247
257
  firstItem.sourceLang,
248
258
  firstItem.context
249
259
  );
250
- requestIdToGroupItems.set(requestId, groupItems);
260
+ requestIdToMeta.set(requestId, { uniqueTexts, textToItems });
251
261
  return {
252
262
  request_id: requestId,
253
- texts,
263
+ texts: uniqueTexts,
254
264
  lang: firstItem.lang,
255
265
  source_lang: firstItem.sourceLang,
256
266
  ctx: firstItem.context
@@ -264,32 +274,35 @@ async function sendMulti(config, items, state) {
264
274
  multiResponse.results.forEach((result) => {
265
275
  resultMap.set(result.request_id, { texts: result.data.texts, status: result.data.status });
266
276
  });
267
- requestIdToGroupItems.forEach((groupItems, requestId) => {
277
+ requestIdToMeta.forEach((meta, requestId) => {
268
278
  const result = resultMap.get(requestId);
269
279
  if (!result) {
270
280
  if (config.debug) {
271
281
  console.error(`[BeLocal Multi Transport] No result found for request_id: ${requestId}`);
272
282
  }
273
- groupItems.forEach((item) => {
274
- item.reject(new Error(`No result found for request ${requestId}`));
283
+ meta.textToItems.forEach((items2) => {
284
+ items2.forEach((item) => item.reject(new Error(`No result found for request ${requestId}`)));
275
285
  });
276
286
  return;
277
287
  }
278
- if (result.texts.length !== groupItems.length) {
279
- const error = new Error(`Mismatch: expected ${groupItems.length} texts, got ${result.texts.length} for request_id ${requestId}`);
288
+ if (result.texts.length !== meta.uniqueTexts.length) {
289
+ const error = new Error(`Mismatch: expected ${meta.uniqueTexts.length} texts, got ${result.texts.length} for request_id ${requestId}`);
280
290
  if (config.debug) {
281
291
  console.error(`[BeLocal Multi Transport]`, error.message);
282
292
  }
283
- groupItems.forEach((item) => item.reject(error));
293
+ meta.textToItems.forEach((items2) => {
294
+ items2.forEach((item) => item.reject(error));
295
+ });
284
296
  return;
285
297
  }
286
- groupItems.forEach((item, index) => {
298
+ meta.uniqueTexts.forEach((originalText, index) => {
287
299
  const translatedText = result.texts[index];
288
300
  const status = result.status || "success";
301
+ const items2 = meta.textToItems.get(originalText);
289
302
  if (config.debug) {
290
- console.log(`[BeLocal Multi Transport] Success for request_id ${requestId}[${index}]: "${translatedText}"`);
303
+ console.log(`[BeLocal Multi Transport] Success for request_id ${requestId}[${index}]: "${translatedText}" (${items2.length} requester(s))`);
291
304
  }
292
- item.resolve({ text: translatedText, status });
305
+ items2.forEach((item) => item.resolve({ text: translatedText, status }));
293
306
  });
294
307
  });
295
308
  } catch (error) {
package/dist/node.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/version.ts","../src/transports/base/dedupe.ts","../src/transports/base/node.ts","../src/core/errors.ts","../src/transports/multi.ts","../src/cache/local.ts","../src/core/engine/engine.ts","../src/core/types.ts","../src/core/engine/node.ts"],"names":["session","headers","md5","BelocalEngine"],"mappings":"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","file":"node.mjs","sourcesContent":["declare const __SDK_VERSION__: string;\nexport const SDK_VERSION = typeof __SDK_VERSION__ !== 'undefined' ? __SDK_VERSION__ : 'undefined';\nexport const SDK_NAME = 'js';\n","import type { BaseTransport } from '../../core/types';\n\nfunction generateRequestKey(endpointPath: string, data: any): string {\n const normalize = (value: any): any => {\n if (value === null || value === undefined) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(normalize);\n }\n if (typeof value === 'object') {\n const sorted: Record<string, any> = {};\n for (const key of Object.keys(value).sort()) {\n sorted[key] = normalize(value[key]);\n }\n return sorted;\n }\n return value;\n };\n\n const normalizedData = JSON.stringify(normalize(data));\n return `${endpointPath}:${normalizedData}`;\n}\n\n/** Deduplicates identical in-flight requests so they share a single HTTP call. */\nexport class DedupeTransport implements BaseTransport {\n private inFlightRequests = new Map<string, Promise<any>>();\n\n constructor(\n private wrappedTransport: BaseTransport,\n private debug?: boolean\n ) {}\n\n async post(data: any, endpointPath: string): Promise<any> {\n const requestKey = generateRequestKey(endpointPath, data);\n\n const existingRequest = this.inFlightRequests.get(requestKey);\n if (existingRequest) {\n if (this.debug) {\n console.log(`[DedupeTransport] Deduplicating request to ${endpointPath}`);\n }\n return existingRequest;\n }\n\n const requestPromise = this.wrappedTransport.post(data, endpointPath)\n .finally(() => {\n this.inFlightRequests.delete(requestKey);\n });\n\n this.inFlightRequests.set(requestKey, requestPromise);\n\n if (this.debug) {\n console.log(`[DedupeTransport] New request to ${endpointPath} (${this.inFlightRequests.size} in-flight)`);\n }\n\n return requestPromise;\n }\n}\n","import * as http2 from 'node:http2';\nimport { URL } from 'node:url';\nimport type { BaseTransport } from '../../core/types';\nimport { SDK_NAME, SDK_VERSION } from '../../version';\nimport { DedupeTransport } from './dedupe';\n\nconst BASE_URL = 'https://dynamic.belocal.dev';\n\nexport interface BaseNodeTransportConfig {\n headers?: Record<string, string>;\n timeoutMs?: number;\n retries?: number;\n debug?: boolean;\n}\n\nconst sessionCache = new Map<string, http2.ClientHttp2Session>();\n\nlet cleanupTimer: NodeJS.Timeout | null = null;\n\nfunction cleanupDeadSessions(): void {\n for (const [url, session] of sessionCache.entries()) {\n if (session.destroyed || session.closed) {\n sessionCache.delete(url);\n }\n }\n}\n\nfunction startCleanupTimer(): void {\n if (cleanupTimer === null) {\n cleanupTimer = setInterval(cleanupDeadSessions, 60000);\n if (cleanupTimer.unref) {\n cleanupTimer.unref();\n }\n }\n}\n\nfunction getOrCreateSession(debug?: boolean): http2.ClientHttp2Session {\n cleanupDeadSessions();\n startCleanupTimer();\n\n if (sessionCache.has(BASE_URL)) {\n const session = sessionCache.get(BASE_URL)!;\n if (!session.destroyed && !session.closed) {\n return session;\n }\n sessionCache.delete(BASE_URL);\n }\n\n const parsedUrl = new URL(BASE_URL);\n const session = http2.connect(parsedUrl.origin);\n\n session.socket?.unref();\n\n session.on('error', () => {\n sessionCache.delete(BASE_URL);\n });\n\n session.on('close', () => {\n sessionCache.delete(BASE_URL);\n });\n\n session.on('goaway', () => {\n sessionCache.delete(BASE_URL);\n });\n\n if (debug) {\n session.on('connect', () => console.log('[Base Node Transport H2] new session connected'));\n session.on('goaway', (code, lastStreamID, opaque) =>\n console.log('[Base Node Transport H2] goaway', code, lastStreamID)\n );\n }\n\n sessionCache.set(BASE_URL, session);\n return session;\n}\n\nfunction makeHttp2Request(\n session: http2.ClientHttp2Session,\n path: string,\n headers: Record<string, string>,\n body: string,\n timeoutMs?: number\n): Promise<{ statusCode: number; headers: Record<string, string>; body: string }> {\n return new Promise((resolve, reject) => {\n const req = session.request({\n ':method': 'POST',\n ':path': path,\n 'content-type': 'application/json',\n 'content-length': Buffer.byteLength(body),\n ...headers,\n });\n\n let timeout: NodeJS.Timeout | null = null;\n if (timeoutMs) {\n timeout = setTimeout(() => {\n req.destroy();\n reject(new Error(`Request timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n }\n\n let responseData = '';\n let statusCode = 0;\n let responseHeaders: Record<string, string> = {};\n\n req.on('response', (headers) => {\n statusCode = headers[':status'] as number;\n responseHeaders = headers as Record<string, string>;\n });\n\n req.on('data', (chunk) => {\n responseData += chunk;\n });\n\n req.on('end', () => {\n if (timeout) clearTimeout(timeout);\n resolve({\n statusCode,\n headers: responseHeaders,\n body: responseData,\n });\n });\n\n req.on('error', (error) => {\n if (timeout) clearTimeout(timeout);\n reject(error);\n });\n\n req.write(body);\n req.end();\n });\n}\n\nexport class BaseNodeTransport implements BaseTransport {\n constructor(private config: BaseNodeTransportConfig) {}\n\n async post(data: any, endpointPath: string): Promise<any> {\n const maxRetries = this.config.retries || 0;\n let attempt = 0;\n const url = `${BASE_URL}${endpointPath}`;\n\n if (this.config.debug) {\n console.log(`[Base Node Transport] POST request to ${url}`, data);\n }\n\n while (attempt <= maxRetries) {\n try {\n const session = getOrCreateSession(this.config.debug);\n const body = JSON.stringify(data);\n\n const headers = {\n 'x-sdk': SDK_NAME,\n 'x-sdk-version': SDK_VERSION,\n ...this.config.headers,\n };\n\n const timeoutMs = this.config.timeoutMs ?? 10000;\n const response = await makeHttp2Request(\n session,\n endpointPath,\n headers,\n body,\n timeoutMs\n );\n\n if (response.statusCode < 200 || response.statusCode >= 300) {\n const errorMsg = `HTTP ${response.statusCode}: Request failed`;\n if (this.config.debug) {\n console.error(`[Base Node Transport] Request failed:`, errorMsg);\n }\n throw new Error(errorMsg);\n }\n\n const result = JSON.parse(response.body);\n if (this.config.debug) {\n console.log(`[Base Node Transport] Request successful:`, result);\n }\n\n return result;\n } catch (error) {\n attempt++;\n if (this.config.debug) {\n console.error(`[Base Node Transport] Attempt ${attempt} failed:`, error instanceof Error ? error.message : String(error));\n }\n if (attempt > maxRetries) {\n throw error;\n }\n\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 1000));\n }\n }\n }\n}\n\nexport function createBaseNodeTransport(config: BaseNodeTransportConfig): BaseTransport {\n const transport = new BaseNodeTransport(config);\n return new DedupeTransport(transport, config.debug);\n}\n","export class TransportDestroyedError extends Error {\n constructor(message = 'Transport destroyed') {\n super(message);\n this.name = 'TransportDestroyedError';\n Object.setPrototypeOf(this, TransportDestroyedError.prototype);\n }\n}\n","import type { Transport, BaseTransport, TranslationCtx } from '../core/types';\nimport { TransportDestroyedError } from '../core/errors';\nimport { md5 } from 'js-md5';\n\nexport interface MultiTransportConfig {\n baseTransport: BaseTransport;\n debug?: boolean;\n batchWindowMs?: number;\n}\n\ninterface MultiRequest {\n request_id: string;\n texts: string[];\n lang: string;\n source_lang?: string;\n ctx?: TranslationCtx;\n}\n\ninterface MultiRequestItem {\n text: string;\n lang: string;\n sourceLang?: string;\n context?: TranslationCtx;\n resolve: (value: { text: string; status: string }) => void;\n reject: (error: Error) => void;\n}\n\ninterface MultiResponse {\n results: Array<{\n request_id: string;\n data: { texts: string[]; status: string };\n }>;\n}\n\ninterface MultiState {\n currentMulti: MultiRequestItem[];\n multiTimer: ReturnType<typeof setTimeout> | null;\n isRequestInFlight: boolean;\n}\n\nfunction generateRequestId(texts: string[], lang: string, sourceLang?: string, context?: TranslationCtx): string {\n const sortedTexts = [...texts].sort();\n\n const sortedContext = context && Object.keys(context).length > 0\n ? Object.fromEntries(Object.entries(context).sort(([a], [b]) => a.localeCompare(b)))\n : null;\n\n const data = [sortedTexts, lang, sourceLang || null, sortedContext];\n return md5(JSON.stringify(data));\n}\n\nasync function sendMulti(\n config: MultiTransportConfig,\n items: MultiRequestItem[],\n state: MultiState\n): Promise<void> {\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Sending multi request with ${items.length} texts`);\n }\n\n try {\n const groups = new Map<string, MultiRequestItem[]>();\n\n items.forEach(item => {\n const groupKey = JSON.stringify({\n lang: item.lang,\n sourceLang: item.sourceLang || null,\n context: item.context || null\n });\n\n if (!groups.has(groupKey)) {\n groups.set(groupKey, []);\n }\n groups.get(groupKey)!.push(item);\n });\n\n const requestIdToGroupItems = new Map<string, MultiRequestItem[]>();\n const requests: MultiRequest[] = Array.from(groups.entries()).map(([groupKey, groupItems]) => {\n const firstItem = groupItems[0];\n const texts = groupItems.map(item => item.text);\n\n const requestId = generateRequestId(\n texts,\n firstItem.lang,\n firstItem.sourceLang,\n firstItem.context\n );\n\n requestIdToGroupItems.set(requestId, groupItems);\n\n return {\n request_id: requestId,\n texts,\n lang: firstItem.lang,\n source_lang: firstItem.sourceLang,\n ctx: firstItem.context\n };\n });\n\n const multiResponse: MultiResponse = await config.baseTransport.post({ requests }, '/v1/translate/multi');\n\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Multi response received with ${multiResponse.results.length} groups`);\n }\n\n const resultMap = new Map<string, { texts: string[]; status: string }>();\n multiResponse.results.forEach(result => {\n resultMap.set(result.request_id, { texts: result.data.texts, status: result.data.status });\n });\n\n requestIdToGroupItems.forEach((groupItems, requestId) => {\n const result = resultMap.get(requestId);\n\n if (!result) {\n if (config.debug) {\n console.error(`[BeLocal Multi Transport] No result found for request_id: ${requestId}`);\n }\n groupItems.forEach(item => {\n item.reject(new Error(`No result found for request ${requestId}`));\n });\n return;\n }\n\n if (result.texts.length !== groupItems.length) {\n const error = new Error(`Mismatch: expected ${groupItems.length} texts, got ${result.texts.length} for request_id ${requestId}`);\n if (config.debug) {\n console.error(`[BeLocal Multi Transport]`, error.message);\n }\n groupItems.forEach(item => item.reject(error));\n return;\n }\n\n groupItems.forEach((item, index) => {\n const translatedText = result.texts[index];\n const status = result.status || 'success';\n\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Success for request_id ${requestId}[${index}]: \"${translatedText}\"`);\n }\n\n item.resolve({ text: translatedText, status });\n });\n });\n } catch (error) {\n if (config.debug) {\n console.error(`[BeLocal Multi Transport] Multi request error:`, error);\n }\n\n const errorToReject = error instanceof Error ? error : new Error(String(error));\n items.forEach(item => item.reject(errorToReject));\n }\n}\n\nfunction processMulti(config: MultiTransportConfig, state: MultiState): void {\n if (state.currentMulti.length === 0 || state.isRequestInFlight) {\n return;\n }\n\n const itemsToSend = [...state.currentMulti];\n state.currentMulti = [];\n state.multiTimer = null;\n state.isRequestInFlight = true;\n\n sendMulti(config, itemsToSend, state).finally(() => {\n state.isRequestInFlight = false;\n\n if (state.currentMulti.length > 0) {\n const windowMs = config.batchWindowMs ?? 50;\n state.multiTimer = setTimeout(() => processMulti(config, state), windowMs);\n }\n });\n}\n\nexport function createMultiTransport(config: MultiTransportConfig): Transport {\n const windowMs = config.batchWindowMs ?? 50;\n\n const state: MultiState = {\n currentMulti: [],\n multiTimer: null,\n isRequestInFlight: false,\n };\n\n const transport = (({ text, lang, source_lang, ctx }) => {\n return new Promise<{ text: string; status: string }>((resolve, reject) => {\n if (config.debug) {\n const tempRequestId = md5(JSON.stringify([text, lang, source_lang || null, ctx || null]));\n console.log(`[BeLocal Multi Transport] Queuing request ${tempRequestId}: \"${text}\" to ${lang}`);\n }\n\n const requestItem: MultiRequestItem = {\n text,\n lang,\n sourceLang: source_lang,\n context: ctx,\n resolve,\n reject,\n };\n\n state.currentMulti.push(requestItem);\n\n if (state.multiTimer === null && !state.isRequestInFlight) {\n state.multiTimer = setTimeout(() => processMulti(config, state), windowMs);\n }\n });\n }) as Transport & { destroy: () => void };\n\n transport.destroy = () => {\n if (state.multiTimer) {\n clearTimeout(state.multiTimer);\n state.multiTimer = null;\n }\n state.currentMulti.forEach(item =>\n item.reject(new TransportDestroyedError())\n );\n state.currentMulti = [];\n };\n\n return transport;\n}\n","import type { Cache, CacheOptions } from './types';\n\ninterface CacheEntry {\n value: string;\n expiresAt: number;\n}\n\nexport class LocalCache implements Cache {\n private storage = new Map<string, CacheEntry>();\n private maxSize: number;\n private ttlMs: number;\n\n constructor(options: CacheOptions = {}) {\n this.maxSize = options.maxSize ?? 10_000;\n this.ttlMs = options.ttlMs ?? 3_600_000;\n }\n\n get(key: string): string | null {\n const entry = this.storage.get(key);\n if (entry === undefined) return null;\n\n if (Date.now() > entry.expiresAt) {\n this.storage.delete(key);\n return null;\n }\n\n this.storage.delete(key);\n this.storage.set(key, entry);\n\n return entry.value;\n }\n\n set(key: string, value: string): void {\n this.storage.delete(key);\n\n if (this.storage.size >= this.maxSize) {\n const oldestKey = this.storage.keys().next().value;\n if (oldestKey !== undefined) {\n this.storage.delete(oldestKey);\n }\n }\n\n this.storage.set(key, {\n value,\n expiresAt: Date.now() + this.ttlMs,\n });\n }\n\n clear(): void {\n this.storage.clear();\n }\n}\n","import type { BelocalEngineOptions, Lang, TranslateOptions, TranslationCtx, Transport, BaseTransport } from '../types';\nimport { TransportDestroyedError } from '../errors';\nimport { createMultiTransport } from '../../transports/multi';\nimport { LocalCache } from '../../cache/local';\nimport type { Cache } from '../../cache/types';\nimport { md5 } from 'js-md5';\n\nexport class BelocalEngine {\n private transport: Transport;\n private debug: boolean;\n private cache: Cache;\n\n constructor(options: BelocalEngineOptions, baseTransportFactory: (opts: any) => BaseTransport) {\n const {\n apiKey,\n batchWindowMs = 50,\n timeoutMs = 10000,\n debug = false,\n cacheTtlMs = 3_600_000,\n cacheMaxSize = 10_000\n } = options;\n\n if (!apiKey || typeof apiKey !== 'string') {\n throw new Error('[BeLocal] apiKey is required and must be a non-empty string');\n }\n\n if (typeof timeoutMs !== 'number' || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new Error('[BeLocal] timeoutMs must be a positive finite number');\n }\n\n const safeBatchWindowMs = Math.max(0, batchWindowMs);\n\n this.debug = debug;\n this.cache = new LocalCache({ ttlMs: cacheTtlMs, maxSize: cacheMaxSize });\n\n const authHeaders = {\n 'Authorization': `Bearer ${apiKey}`\n };\n\n const baseTransport = baseTransportFactory({\n headers: authHeaders,\n timeoutMs,\n debug: this.debug\n });\n\n this.transport = createMultiTransport({\n baseTransport,\n debug: this.debug,\n batchWindowMs: safeBatchWindowMs\n });\n\n if (this.debug) {\n console.log('[BeLocal Engine] Multi transport created with config:', {\n baseUrl: 'https://dynamic.belocal.dev',\n timeoutMs,\n batchWindowMs: safeBatchWindowMs\n });\n }\n }\n\n /** Translates a single text string to the target language. */\n async translate(text: string, lang: Lang, options?: TranslateOptions): Promise<string> {\n const results = await this.translateMany([text], lang, options);\n return results[0];\n }\n\n /** Translates multiple text strings to the target language in a single batch. */\n async translateMany(texts: string[], lang: Lang, options?: TranslateOptions): Promise<string[]> {\n const { source_lang, ctx } = this.resolveOptions(options);\n const results: (string | null)[] = new Array(texts.length);\n const cacheMisses: Array<{ index: number; text: string }> = [];\n\n for (let i = 0; i < texts.length; i++) {\n const text = texts[i];\n const cacheKey = this.generateCacheKey(text, lang, source_lang, ctx);\n\n const cachedResult = this.cache.get(cacheKey);\n if (cachedResult !== null) {\n results[i] = cachedResult;\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from cache:', text);\n }\n continue;\n }\n\n results[i] = null;\n cacheMisses.push({ index: i, text });\n }\n\n if (cacheMisses.length > 0) {\n const settlements = await Promise.allSettled(\n cacheMisses.map(async ({ index, text }) => {\n const result = await this.transport({ text, lang, source_lang, ctx });\n\n if (result.status !== 'error') {\n const cacheKey = this.generateCacheKey(text, lang, source_lang, ctx);\n this.cache.set(cacheKey, result.text);\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from API, cached:', text);\n }\n } else {\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from API (not cached due to error status):', text);\n }\n }\n\n return { index, translation: result.text };\n })\n );\n\n settlements.forEach((settlement, i) => {\n const { index, text } = cacheMisses[i];\n if (settlement.status === 'fulfilled') {\n results[index] = settlement.value.translation;\n } else {\n results[index] = text;\n const reason = settlement.reason;\n const isExpectedDestroy = reason instanceof TransportDestroyedError;\n if (this.debug && !isExpectedDestroy) {\n console.error(\n '[BeLocal Engine] Translation failed, using original text:',\n text,\n reason instanceof Error ? reason.message : String(reason)\n );\n }\n }\n });\n }\n\n return results as string[];\n }\n\n private resolveOptions(options?: TranslateOptions): { source_lang?: string; ctx?: TranslationCtx } {\n if (!options) return {};\n const serverCtx: TranslationCtx = {\n ...options.ctx,\n ...(options.context && { user_ctx: options.context }),\n ...(options.managed && { cache_type: 'managed' }),\n };\n const ctx = Object.values(serverCtx).some(Boolean) ? serverCtx : undefined;\n return { source_lang: options.source_lang, ctx };\n }\n\n /** Cleans up internal resources (timers, cache). Call when the engine is no longer needed. */\n destroy(): void {\n (this.transport as any).destroy?.();\n this.cache.clear();\n }\n\n private generateCacheKey(text: string, lang: Lang, source_lang?: string, ctx?: TranslationCtx): string {\n const sortedCtx = ctx\n ? Object.fromEntries(Object.entries(ctx).sort(([a], [b]) => a.localeCompare(b)))\n : null;\n\n const data = {\n text,\n lang,\n source_lang: source_lang || null,\n ctx: sortedCtx\n };\n return md5(JSON.stringify(data));\n }\n}\n","export type Lang = string;\n\nexport type UserCtx = {\n user_type?: string;\n entity_key?: string;\n entity_id?: string;\n};\n\nexport type TranslationCtx = {\n user_type?: string;\n user_ctx?: string;\n cache_type?: string;\n entity_key?: string;\n entity_id?: string;\n};\n\nexport const USER_TYPE_PRODUCT = 'product';\nexport const USER_TYPE_CHAT = 'chat';\n\nexport type TranslateOptions = {\n source_lang?: string;\n context?: string;\n managed?: boolean;\n ctx?: UserCtx;\n};\n\nexport interface BaseTransport {\n post(data: any, endpointPath: string): Promise<any>;\n}\n\nexport type Transport = (params: { text: string; lang: Lang; source_lang?: string; ctx?: TranslationCtx }) => Promise<{ text: string; status: string }>;\n\nexport interface BelocalEngineOptions {\n apiKey: string;\n batchWindowMs?: number;\n timeoutMs?: number;\n debug?: boolean;\n cacheTtlMs?: number;\n cacheMaxSize?: number;\n}\n","import type { BelocalEngineOptions } from '../types';\nimport { createBaseNodeTransport } from '../../transports/base/node';\nimport { BelocalEngine as BaseEngine } from './engine';\n\n/** BeLocal translation engine for Node.js environments. */\nexport class BelocalEngine extends BaseEngine {\n constructor(options: BelocalEngineOptions) {\n super(options, createBaseNodeTransport);\n }\n}\n\nexport type { BelocalEngineOptions, Lang, TranslateOptions, BaseTransport, TranslationCtx, UserCtx } from '../types';\nexport { TransportDestroyedError } from '../errors';\nexport { USER_TYPE_PRODUCT, USER_TYPE_CHAT } from '../types';\nexport { BaseNodeTransport, createBaseNodeTransport } from '../../transports/base';\nexport { createMultiTransport } from '../../transports/multi';\n"]}
1
+ {"version":3,"sources":["../src/version.ts","../src/transports/base/dedupe.ts","../src/transports/base/node.ts","../src/core/errors.ts","../src/transports/multi.ts","../src/cache/local.ts","../src/core/engine/engine.ts","../src/core/types.ts","../src/core/engine/node.ts"],"names":["session","headers","items","md5","BelocalEngine"],"mappings":"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","file":"node.mjs","sourcesContent":["declare const __SDK_VERSION__: string;\nexport const SDK_VERSION = typeof __SDK_VERSION__ !== 'undefined' ? __SDK_VERSION__ : 'undefined';\nexport const SDK_NAME = 'js';\n","import type { BaseTransport } from '../../core/types';\n\nfunction generateRequestKey(endpointPath: string, data: any): string {\n const normalize = (value: any): any => {\n if (value === null || value === undefined) {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map(normalize);\n }\n if (typeof value === 'object') {\n const sorted: Record<string, any> = {};\n for (const key of Object.keys(value).sort()) {\n sorted[key] = normalize(value[key]);\n }\n return sorted;\n }\n return value;\n };\n\n const normalizedData = JSON.stringify(normalize(data));\n return `${endpointPath}:${normalizedData}`;\n}\n\n/** Deduplicates identical in-flight requests so they share a single HTTP call. */\nexport class DedupeTransport implements BaseTransport {\n private inFlightRequests = new Map<string, Promise<any>>();\n\n constructor(\n private wrappedTransport: BaseTransport,\n private debug?: boolean\n ) {}\n\n async post(data: any, endpointPath: string): Promise<any> {\n const requestKey = generateRequestKey(endpointPath, data);\n\n const existingRequest = this.inFlightRequests.get(requestKey);\n if (existingRequest) {\n if (this.debug) {\n console.log(`[DedupeTransport] Deduplicating request to ${endpointPath}`);\n }\n return existingRequest;\n }\n\n const requestPromise = this.wrappedTransport.post(data, endpointPath)\n .finally(() => {\n this.inFlightRequests.delete(requestKey);\n });\n\n this.inFlightRequests.set(requestKey, requestPromise);\n\n if (this.debug) {\n console.log(`[DedupeTransport] New request to ${endpointPath} (${this.inFlightRequests.size} in-flight)`);\n }\n\n return requestPromise;\n }\n}\n","import * as http2 from 'node:http2';\nimport { URL } from 'node:url';\nimport type { BaseTransport } from '../../core/types';\nimport { SDK_NAME, SDK_VERSION } from '../../version';\nimport { DedupeTransport } from './dedupe';\n\nconst BASE_URL = 'https://dynamic.belocal.dev';\n\nexport interface BaseNodeTransportConfig {\n headers?: Record<string, string>;\n timeoutMs?: number;\n retries?: number;\n debug?: boolean;\n}\n\nconst sessionCache = new Map<string, http2.ClientHttp2Session>();\n\nlet cleanupTimer: NodeJS.Timeout | null = null;\n\nfunction cleanupDeadSessions(): void {\n for (const [url, session] of sessionCache.entries()) {\n if (session.destroyed || session.closed) {\n sessionCache.delete(url);\n }\n }\n}\n\nfunction startCleanupTimer(): void {\n if (cleanupTimer === null) {\n cleanupTimer = setInterval(cleanupDeadSessions, 60000);\n if (cleanupTimer.unref) {\n cleanupTimer.unref();\n }\n }\n}\n\nfunction getOrCreateSession(debug?: boolean): http2.ClientHttp2Session {\n cleanupDeadSessions();\n startCleanupTimer();\n\n if (sessionCache.has(BASE_URL)) {\n const session = sessionCache.get(BASE_URL)!;\n if (!session.destroyed && !session.closed) {\n return session;\n }\n sessionCache.delete(BASE_URL);\n }\n\n const parsedUrl = new URL(BASE_URL);\n const session = http2.connect(parsedUrl.origin);\n\n session.socket?.unref();\n\n session.on('error', () => {\n sessionCache.delete(BASE_URL);\n });\n\n session.on('close', () => {\n sessionCache.delete(BASE_URL);\n });\n\n session.on('goaway', () => {\n sessionCache.delete(BASE_URL);\n });\n\n if (debug) {\n session.on('connect', () => console.log('[Base Node Transport H2] new session connected'));\n session.on('goaway', (code, lastStreamID, opaque) =>\n console.log('[Base Node Transport H2] goaway', code, lastStreamID)\n );\n }\n\n sessionCache.set(BASE_URL, session);\n return session;\n}\n\nfunction makeHttp2Request(\n session: http2.ClientHttp2Session,\n path: string,\n headers: Record<string, string>,\n body: string,\n timeoutMs?: number\n): Promise<{ statusCode: number; headers: Record<string, string>; body: string }> {\n return new Promise((resolve, reject) => {\n const req = session.request({\n ':method': 'POST',\n ':path': path,\n 'content-type': 'application/json',\n 'content-length': Buffer.byteLength(body),\n ...headers,\n });\n\n let timeout: NodeJS.Timeout | null = null;\n if (timeoutMs) {\n timeout = setTimeout(() => {\n req.destroy();\n reject(new Error(`Request timeout after ${timeoutMs}ms`));\n }, timeoutMs);\n }\n\n let responseData = '';\n let statusCode = 0;\n let responseHeaders: Record<string, string> = {};\n\n req.on('response', (headers) => {\n statusCode = headers[':status'] as number;\n responseHeaders = headers as Record<string, string>;\n });\n\n req.on('data', (chunk) => {\n responseData += chunk;\n });\n\n req.on('end', () => {\n if (timeout) clearTimeout(timeout);\n resolve({\n statusCode,\n headers: responseHeaders,\n body: responseData,\n });\n });\n\n req.on('error', (error) => {\n if (timeout) clearTimeout(timeout);\n reject(error);\n });\n\n req.write(body);\n req.end();\n });\n}\n\nexport class BaseNodeTransport implements BaseTransport {\n constructor(private config: BaseNodeTransportConfig) {}\n\n async post(data: any, endpointPath: string): Promise<any> {\n const maxRetries = this.config.retries || 0;\n let attempt = 0;\n const url = `${BASE_URL}${endpointPath}`;\n\n if (this.config.debug) {\n console.log(`[Base Node Transport] POST request to ${url}`, data);\n }\n\n while (attempt <= maxRetries) {\n try {\n const session = getOrCreateSession(this.config.debug);\n const body = JSON.stringify(data);\n\n const headers = {\n 'x-sdk': SDK_NAME,\n 'x-sdk-version': SDK_VERSION,\n ...this.config.headers,\n };\n\n const timeoutMs = this.config.timeoutMs ?? 10000;\n const response = await makeHttp2Request(\n session,\n endpointPath,\n headers,\n body,\n timeoutMs\n );\n\n if (response.statusCode < 200 || response.statusCode >= 300) {\n const errorMsg = `HTTP ${response.statusCode}: Request failed`;\n if (this.config.debug) {\n console.error(`[Base Node Transport] Request failed:`, errorMsg);\n }\n throw new Error(errorMsg);\n }\n\n const result = JSON.parse(response.body);\n if (this.config.debug) {\n console.log(`[Base Node Transport] Request successful:`, result);\n }\n\n return result;\n } catch (error) {\n attempt++;\n if (this.config.debug) {\n console.error(`[Base Node Transport] Attempt ${attempt} failed:`, error instanceof Error ? error.message : String(error));\n }\n if (attempt > maxRetries) {\n throw error;\n }\n\n await new Promise(resolve => setTimeout(resolve, Math.pow(2, attempt) * 1000));\n }\n }\n }\n}\n\nexport function createBaseNodeTransport(config: BaseNodeTransportConfig): BaseTransport {\n const transport = new BaseNodeTransport(config);\n return new DedupeTransport(transport, config.debug);\n}\n","export class TransportDestroyedError extends Error {\n constructor(message = 'Transport destroyed') {\n super(message);\n this.name = 'TransportDestroyedError';\n Object.setPrototypeOf(this, TransportDestroyedError.prototype);\n }\n}\n","import type { Transport, BaseTransport, TranslationCtx } from '../core/types';\nimport { TransportDestroyedError } from '../core/errors';\nimport { md5 } from 'js-md5';\n\nexport interface MultiTransportConfig {\n baseTransport: BaseTransport;\n debug?: boolean;\n batchWindowMs?: number;\n}\n\ninterface MultiRequest {\n request_id: string;\n texts: string[];\n lang: string;\n source_lang?: string;\n ctx?: TranslationCtx;\n}\n\ninterface MultiRequestItem {\n text: string;\n lang: string;\n sourceLang?: string;\n context?: TranslationCtx;\n resolve: (value: { text: string; status: string }) => void;\n reject: (error: Error) => void;\n}\n\ninterface MultiResponse {\n results: Array<{\n request_id: string;\n data: { texts: string[]; status: string };\n }>;\n}\n\ninterface MultiState {\n currentMulti: MultiRequestItem[];\n multiTimer: ReturnType<typeof setTimeout> | null;\n isRequestInFlight: boolean;\n}\n\nfunction generateRequestId(texts: string[], lang: string, sourceLang?: string, context?: TranslationCtx): string {\n const sortedTexts = [...texts].sort();\n\n const sortedContext = context && Object.keys(context).length > 0\n ? Object.fromEntries(Object.entries(context).sort(([a], [b]) => a.localeCompare(b)))\n : null;\n\n const data = [sortedTexts, lang, sourceLang || null, sortedContext];\n return md5(JSON.stringify(data));\n}\n\nasync function sendMulti(\n config: MultiTransportConfig,\n items: MultiRequestItem[],\n state: MultiState\n): Promise<void> {\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Sending multi request with ${items.length} texts`);\n }\n\n try {\n const groups = new Map<string, MultiRequestItem[]>();\n\n items.forEach(item => {\n const groupKey = JSON.stringify({\n lang: item.lang,\n sourceLang: item.sourceLang || null,\n context: item.context || null\n });\n\n if (!groups.has(groupKey)) {\n groups.set(groupKey, []);\n }\n groups.get(groupKey)!.push(item);\n });\n\n // Per-group: deduplicate texts, track which items map to which unique text\n interface GroupMeta {\n uniqueTexts: string[];\n /** Maps each unique text to all group items that requested it */\n textToItems: Map<string, MultiRequestItem[]>;\n }\n\n const requestIdToMeta = new Map<string, GroupMeta>();\n const requests: MultiRequest[] = Array.from(groups.entries()).map(([groupKey, groupItems]) => {\n const firstItem = groupItems[0];\n\n // Deduplicate texts within the group\n const textToItems = new Map<string, MultiRequestItem[]>();\n groupItems.forEach(item => {\n if (!textToItems.has(item.text)) {\n textToItems.set(item.text, []);\n }\n textToItems.get(item.text)!.push(item);\n });\n\n const uniqueTexts = Array.from(textToItems.keys());\n\n if (config.debug && uniqueTexts.length < groupItems.length) {\n console.log(`[BeLocal Multi Transport] Deduplicated ${groupItems.length} texts to ${uniqueTexts.length} unique`);\n }\n\n const requestId = generateRequestId(\n uniqueTexts,\n firstItem.lang,\n firstItem.sourceLang,\n firstItem.context\n );\n\n requestIdToMeta.set(requestId, { uniqueTexts, textToItems });\n\n return {\n request_id: requestId,\n texts: uniqueTexts,\n lang: firstItem.lang,\n source_lang: firstItem.sourceLang,\n ctx: firstItem.context\n };\n });\n\n const multiResponse: MultiResponse = await config.baseTransport.post({ requests }, '/v1/translate/multi');\n\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Multi response received with ${multiResponse.results.length} groups`);\n }\n\n const resultMap = new Map<string, { texts: string[]; status: string }>();\n multiResponse.results.forEach(result => {\n resultMap.set(result.request_id, { texts: result.data.texts, status: result.data.status });\n });\n\n requestIdToMeta.forEach((meta, requestId) => {\n const result = resultMap.get(requestId);\n\n if (!result) {\n if (config.debug) {\n console.error(`[BeLocal Multi Transport] No result found for request_id: ${requestId}`);\n }\n meta.textToItems.forEach(items => {\n items.forEach(item => item.reject(new Error(`No result found for request ${requestId}`)));\n });\n return;\n }\n\n if (result.texts.length !== meta.uniqueTexts.length) {\n const error = new Error(`Mismatch: expected ${meta.uniqueTexts.length} texts, got ${result.texts.length} for request_id ${requestId}`);\n if (config.debug) {\n console.error(`[BeLocal Multi Transport]`, error.message);\n }\n meta.textToItems.forEach(items => {\n items.forEach(item => item.reject(error));\n });\n return;\n }\n\n // Fan out each translated text to all items that requested that original text\n meta.uniqueTexts.forEach((originalText, index) => {\n const translatedText = result.texts[index];\n const status = result.status || 'success';\n const items = meta.textToItems.get(originalText)!;\n\n if (config.debug) {\n console.log(`[BeLocal Multi Transport] Success for request_id ${requestId}[${index}]: \"${translatedText}\" (${items.length} requester(s))`);\n }\n\n items.forEach(item => item.resolve({ text: translatedText, status }));\n });\n });\n } catch (error) {\n if (config.debug) {\n console.error(`[BeLocal Multi Transport] Multi request error:`, error);\n }\n\n const errorToReject = error instanceof Error ? error : new Error(String(error));\n items.forEach(item => item.reject(errorToReject));\n }\n}\n\nfunction processMulti(config: MultiTransportConfig, state: MultiState): void {\n if (state.currentMulti.length === 0 || state.isRequestInFlight) {\n return;\n }\n\n const itemsToSend = [...state.currentMulti];\n state.currentMulti = [];\n state.multiTimer = null;\n state.isRequestInFlight = true;\n\n sendMulti(config, itemsToSend, state).finally(() => {\n state.isRequestInFlight = false;\n\n if (state.currentMulti.length > 0) {\n const windowMs = config.batchWindowMs ?? 50;\n state.multiTimer = setTimeout(() => processMulti(config, state), windowMs);\n }\n });\n}\n\nexport function createMultiTransport(config: MultiTransportConfig): Transport {\n const windowMs = config.batchWindowMs ?? 50;\n\n const state: MultiState = {\n currentMulti: [],\n multiTimer: null,\n isRequestInFlight: false,\n };\n\n const transport = (({ text, lang, source_lang, ctx }) => {\n return new Promise<{ text: string; status: string }>((resolve, reject) => {\n if (config.debug) {\n const tempRequestId = md5(JSON.stringify([text, lang, source_lang || null, ctx || null]));\n console.log(`[BeLocal Multi Transport] Queuing request ${tempRequestId}: \"${text}\" to ${lang}`);\n }\n\n const requestItem: MultiRequestItem = {\n text,\n lang,\n sourceLang: source_lang,\n context: ctx,\n resolve,\n reject,\n };\n\n state.currentMulti.push(requestItem);\n\n if (state.multiTimer === null && !state.isRequestInFlight) {\n state.multiTimer = setTimeout(() => processMulti(config, state), windowMs);\n }\n });\n }) as Transport & { destroy: () => void };\n\n transport.destroy = () => {\n if (state.multiTimer) {\n clearTimeout(state.multiTimer);\n state.multiTimer = null;\n }\n state.currentMulti.forEach(item =>\n item.reject(new TransportDestroyedError())\n );\n state.currentMulti = [];\n };\n\n return transport;\n}\n","import type { Cache, CacheOptions } from './types';\n\ninterface CacheEntry {\n value: string;\n expiresAt: number;\n}\n\nexport class LocalCache implements Cache {\n private storage = new Map<string, CacheEntry>();\n private maxSize: number;\n private ttlMs: number;\n\n constructor(options: CacheOptions = {}) {\n this.maxSize = options.maxSize ?? 10_000;\n this.ttlMs = options.ttlMs ?? 3_600_000;\n }\n\n get(key: string): string | null {\n const entry = this.storage.get(key);\n if (entry === undefined) return null;\n\n if (Date.now() > entry.expiresAt) {\n this.storage.delete(key);\n return null;\n }\n\n this.storage.delete(key);\n this.storage.set(key, entry);\n\n return entry.value;\n }\n\n set(key: string, value: string): void {\n this.storage.delete(key);\n\n if (this.storage.size >= this.maxSize) {\n const oldestKey = this.storage.keys().next().value;\n if (oldestKey !== undefined) {\n this.storage.delete(oldestKey);\n }\n }\n\n this.storage.set(key, {\n value,\n expiresAt: Date.now() + this.ttlMs,\n });\n }\n\n clear(): void {\n this.storage.clear();\n }\n}\n","import type { BelocalEngineOptions, Lang, TranslateOptions, TranslationCtx, Transport, BaseTransport } from '../types';\nimport { TransportDestroyedError } from '../errors';\nimport { createMultiTransport } from '../../transports/multi';\nimport { LocalCache } from '../../cache/local';\nimport type { Cache } from '../../cache/types';\nimport { md5 } from 'js-md5';\n\nexport class BelocalEngine {\n private transport: Transport;\n private debug: boolean;\n private cache: Cache;\n\n constructor(options: BelocalEngineOptions, baseTransportFactory: (opts: any) => BaseTransport) {\n const {\n apiKey,\n batchWindowMs = 50,\n timeoutMs = 10000,\n debug = false,\n cacheTtlMs = 3_600_000,\n cacheMaxSize = 10_000\n } = options;\n\n if (!apiKey || typeof apiKey !== 'string') {\n throw new Error('[BeLocal] apiKey is required and must be a non-empty string');\n }\n\n if (typeof timeoutMs !== 'number' || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new Error('[BeLocal] timeoutMs must be a positive finite number');\n }\n\n const safeBatchWindowMs = Math.max(0, batchWindowMs);\n\n this.debug = debug;\n this.cache = new LocalCache({ ttlMs: cacheTtlMs, maxSize: cacheMaxSize });\n\n const authHeaders = {\n 'Authorization': `Bearer ${apiKey}`\n };\n\n const baseTransport = baseTransportFactory({\n headers: authHeaders,\n timeoutMs,\n debug: this.debug\n });\n\n this.transport = createMultiTransport({\n baseTransport,\n debug: this.debug,\n batchWindowMs: safeBatchWindowMs\n });\n\n if (this.debug) {\n console.log('[BeLocal Engine] Multi transport created with config:', {\n baseUrl: 'https://dynamic.belocal.dev',\n timeoutMs,\n batchWindowMs: safeBatchWindowMs\n });\n }\n }\n\n /** Translates a single text string to the target language. */\n async translate(text: string, lang: Lang, options?: TranslateOptions): Promise<string> {\n const results = await this.translateMany([text], lang, options);\n return results[0];\n }\n\n /** Translates multiple text strings to the target language in a single batch. */\n async translateMany(texts: string[], lang: Lang, options?: TranslateOptions): Promise<string[]> {\n const { source_lang, ctx } = this.resolveOptions(options);\n const results: (string | null)[] = new Array(texts.length);\n const cacheMisses: Array<{ index: number; text: string }> = [];\n\n for (let i = 0; i < texts.length; i++) {\n const text = texts[i];\n const cacheKey = this.generateCacheKey(text, lang, source_lang, ctx);\n\n const cachedResult = this.cache.get(cacheKey);\n if (cachedResult !== null) {\n results[i] = cachedResult;\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from cache:', text);\n }\n continue;\n }\n\n results[i] = null;\n cacheMisses.push({ index: i, text });\n }\n\n if (cacheMisses.length > 0) {\n const settlements = await Promise.allSettled(\n cacheMisses.map(async ({ index, text }) => {\n const result = await this.transport({ text, lang, source_lang, ctx });\n\n if (result.status !== 'error') {\n const cacheKey = this.generateCacheKey(text, lang, source_lang, ctx);\n this.cache.set(cacheKey, result.text);\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from API, cached:', text);\n }\n } else {\n if (this.debug) {\n console.log('[BeLocal Engine] Translation from API (not cached due to error status):', text);\n }\n }\n\n return { index, translation: result.text };\n })\n );\n\n settlements.forEach((settlement, i) => {\n const { index, text } = cacheMisses[i];\n if (settlement.status === 'fulfilled') {\n results[index] = settlement.value.translation;\n } else {\n results[index] = text;\n const reason = settlement.reason;\n const isExpectedDestroy = reason instanceof TransportDestroyedError;\n if (this.debug && !isExpectedDestroy) {\n console.error(\n '[BeLocal Engine] Translation failed, using original text:',\n text,\n reason instanceof Error ? reason.message : String(reason)\n );\n }\n }\n });\n }\n\n return results as string[];\n }\n\n private resolveOptions(options?: TranslateOptions): { source_lang?: string; ctx?: TranslationCtx } {\n if (!options) return {};\n const serverCtx: TranslationCtx = {\n ...options.ctx,\n ...(options.context && { user_ctx: options.context }),\n ...(options.managed && { cache_type: 'managed' }),\n };\n const ctx = Object.values(serverCtx).some(Boolean) ? serverCtx : undefined;\n return { source_lang: options.source_lang, ctx };\n }\n\n /** Cleans up internal resources (timers, cache). Call when the engine is no longer needed. */\n destroy(): void {\n (this.transport as any).destroy?.();\n this.cache.clear();\n }\n\n private generateCacheKey(text: string, lang: Lang, source_lang?: string, ctx?: TranslationCtx): string {\n const sortedCtx = ctx\n ? Object.fromEntries(Object.entries(ctx).sort(([a], [b]) => a.localeCompare(b)))\n : null;\n\n const data = {\n text,\n lang,\n source_lang: source_lang || null,\n ctx: sortedCtx\n };\n return md5(JSON.stringify(data));\n }\n}\n","export type Lang = string;\n\nexport type UserCtx = {\n user_type?: string;\n entity_key?: string;\n entity_id?: string;\n};\n\nexport type TranslationCtx = {\n user_type?: string;\n user_ctx?: string;\n cache_type?: string;\n entity_key?: string;\n entity_id?: string;\n};\n\nexport const USER_TYPE_PRODUCT = 'product';\nexport const USER_TYPE_CHAT = 'chat';\n\nexport type TranslateOptions = {\n source_lang?: string;\n context?: string;\n managed?: boolean;\n ctx?: UserCtx;\n};\n\nexport interface BaseTransport {\n post(data: any, endpointPath: string): Promise<any>;\n}\n\nexport type Transport = (params: { text: string; lang: Lang; source_lang?: string; ctx?: TranslationCtx }) => Promise<{ text: string; status: string }>;\n\nexport interface BelocalEngineOptions {\n apiKey: string;\n batchWindowMs?: number;\n timeoutMs?: number;\n debug?: boolean;\n cacheTtlMs?: number;\n cacheMaxSize?: number;\n}\n","import type { BelocalEngineOptions } from '../types';\nimport { createBaseNodeTransport } from '../../transports/base/node';\nimport { BelocalEngine as BaseEngine } from './engine';\n\n/** BeLocal translation engine for Node.js environments. */\nexport class BelocalEngine extends BaseEngine {\n constructor(options: BelocalEngineOptions) {\n super(options, createBaseNodeTransport);\n }\n}\n\nexport type { BelocalEngineOptions, Lang, TranslateOptions, BaseTransport, TranslationCtx, UserCtx } from '../types';\nexport { TransportDestroyedError } from '../errors';\nexport { USER_TYPE_PRODUCT, USER_TYPE_CHAT } from '../types';\nexport { BaseNodeTransport, createBaseNodeTransport } from '../../transports/base';\nexport { createMultiTransport } from '../../transports/multi';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@belocal/js-sdk",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "BeLocal runtime JS SDK for on-demand translation (browser + node)",
5
5
  "scripts": {
6
6
  "test": "vitest run",