@orama/plugin-secure-proxy 3.0.4 → 3.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/README.md +1 -1
- package/dist/index.global.js +1 -1
- package/dist/index.global.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
@@ -63,7 +63,7 @@ Available **chat** models:
|
|
63
63
|
|
64
64
|
Mode models coming soon!
|
65
65
|
|
66
|
-
For the full configuration guide of this plugin, please follow the [official plugin documentation](https://docs.
|
66
|
+
For the full configuration guide of this plugin, please follow the [official plugin documentation](https://docs.orama.com/open-source/plugins/plugin-secure-proxy).
|
67
67
|
|
68
68
|
# License
|
69
69
|
|
package/dist/index.global.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
"use strict";var pluginSecureProxy=(()=>{var B=Object.defineProperty;var he=Object.getOwnPropertyDescriptor;var le=Object.getOwnPropertyNames;var ce=Object.prototype.hasOwnProperty;var de=(e,r,a)=>r in e?B(e,r,{enumerable:!0,configurable:!0,writable:!0,value:a}):e[r]=a;var ue=(e,r)=>{for(var a in r)B(e,a,{get:r[a],enumerable:!0})},pe=(e,r,a,h)=>{if(r&&typeof r=="object"||typeof r=="function")for(let d of le(r))!ce.call(e,d)&&d!==a&&B(e,d,{get:()=>r[d],enumerable:!(h=he(r,d))||h.enumerable});return e};var fe=e=>pe(B({},"__esModule",{value:!0}),e);var U=(e,r,a)=>(de(e,typeof r!="symbol"?r+"":r,a),a);var Ne={};ue(Ne,{pluginSecureProxy:()=>Re});var ye=Object.create,ne=Object.defineProperty,ge=Object.getOwnPropertyDescriptor,me=Object.getOwnPropertyNames,we=Object.getPrototypeOf,be=Object.prototype.hasOwnProperty,$=(e,r)=>()=>(r||e((r={exports:{}}).exports,r),r.exports),ve=(e,r,a,h)=>{if(r&&typeof r=="object"||typeof r=="function")for(let d of me(r))!be.call(e,d)&&d!==a&&ne(e,d,{get:()=>r[d],enumerable:!(h=ge(r,d))||h.enumerable});return e},_=(e,r,a)=>(a=e!=null?ye(we(e)):{},ve(r||!e||!e.__esModule?ne(a,"default",{value:e,enumerable:!0}):a,e)),xe=$(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.output=e.exists=e.hash=e.bytes=e.bool=e.number=void 0;function r(p){if(!Number.isSafeInteger(p)||p<0)throw new Error(`Wrong positive integer: ${p}`)}e.number=r;function a(p){if(typeof p!="boolean")throw new Error(`Expected boolean, not ${p}`)}e.bool=a;function h(p,...I){if(!(p instanceof Uint8Array))throw new Error("Expected Uint8Array");if(I.length>0&&!I.includes(p.length))throw new Error(`Expected Uint8Array of length ${I}, not of length=${p.length}`)}e.bytes=h;function d(p){if(typeof p!="function"||typeof p.create!="function")throw new Error("Hash should be wrapped by utils.wrapConstructor");r(p.outputLen),r(p.blockLen)}e.hash=d;function y(p,I=!0){if(p.destroyed)throw new Error("Hash instance has been destroyed");if(I&&p.finished)throw new Error("Hash#digest() has already been called")}e.exists=y;function g(p,I){h(p);let C=I.outputLen;if(p.length<C)throw new Error(`digestInto() expects output buffer of length at least ${C}`)}e.output=g;var k={number:r,bool:a,bytes:h,hash:d,exists:y,output:g};e.default=k}),Ie=$(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.add=e.toBig=e.split=e.fromBig=void 0;var r=BigInt(2**32-1),a=BigInt(32);function h(n,s=!1){return s?{h:Number(n&r),l:Number(n>>a&r)}:{h:Number(n>>a&r)|0,l:Number(n&r)|0}}e.fromBig=h;function d(n,s=!1){let o=new Uint32Array(n.length),v=new Uint32Array(n.length);for(let x=0;x<n.length;x++){let{h:O,l:M}=h(n[x],s);[o[x],v[x]]=[O,M]}return[o,v]}e.split=d;var y=(n,s)=>BigInt(n>>>0)<<a|BigInt(s>>>0);e.toBig=y;var g=(n,s,o)=>n>>>o,k=(n,s,o)=>n<<32-o|s>>>o,p=(n,s,o)=>n>>>o|s<<32-o,I=(n,s,o)=>n<<32-o|s>>>o,C=(n,s,o)=>n<<64-o|s>>>o-32,A=(n,s,o)=>n>>>o-32|s<<64-o,P=(n,s)=>s,T=(n,s)=>n,L=(n,s,o)=>n<<o|s>>>32-o,E=(n,s,o)=>s<<o|n>>>32-o,f=(n,s,o)=>s<<o-32|n>>>64-o,b=(n,s,o)=>n<<o-32|s>>>64-o;function m(n,s,o,v){let x=(s>>>0)+(v>>>0);return{h:n+o+(x/2**32|0)|0,l:x|0}}e.add=m;var w=(n,s,o)=>(n>>>0)+(s>>>0)+(o>>>0),S=(n,s,o,v)=>s+o+v+(n/2**32|0)|0,u=(n,s,o,v)=>(n>>>0)+(s>>>0)+(o>>>0)+(v>>>0),t=(n,s,o,v,x)=>s+o+v+x+(n/2**32|0)|0,i=(n,s,o,v,x)=>(n>>>0)+(s>>>0)+(o>>>0)+(v>>>0)+(x>>>0),l=(n,s,o,v,x,O)=>s+o+v+x+O+(n/2**32|0)|0,c={fromBig:h,split:d,toBig:e.toBig,shrSH:g,shrSL:k,rotrSH:p,rotrSL:I,rotrBH:C,rotrBL:A,rotr32H:P,rotr32L:T,rotlSH:L,rotlSL:E,rotlBH:f,rotlBL:b,add:m,add3L:w,add3H:S,add4L:u,add4H:t,add5H:l,add5L:i};e.default=c}),ke=$(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.crypto=void 0,e.crypto=typeof globalThis=="object"&&"crypto"in globalThis?globalThis.crypto:void 0}),Se=$(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.randomBytes=e.wrapXOFConstructorWithOpts=e.wrapConstructorWithOpts=e.wrapConstructor=e.checkOpts=e.Hash=e.concatBytes=e.toBytes=e.utf8ToBytes=e.asyncLoop=e.nextTick=e.hexToBytes=e.bytesToHex=e.isLE=e.rotr=e.createView=e.u32=e.u8=void 0;var r=ke(),a=t=>t instanceof Uint8Array,h=t=>new Uint8Array(t.buffer,t.byteOffset,t.byteLength);e.u8=h;var d=t=>new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4));e.u32=d;var y=t=>new DataView(t.buffer,t.byteOffset,t.byteLength);e.createView=y;var g=(t,i)=>t<<32-i|t>>>i;if(e.rotr=g,e.isLE=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68,!e.isLE)throw new Error("Non little-endian hardware is not supported");var k=Array.from({length:256},(t,i)=>i.toString(16).padStart(2,"0"));function p(t){if(!a(t))throw new Error("Uint8Array expected");let i="";for(let l=0;l<t.length;l++)i+=k[t[l]];return i}e.bytesToHex=p;function I(t){if(typeof t!="string")throw new Error("hex string expected, got "+typeof t);let i=t.length;if(i%2)throw new Error("padded hex string expected, got unpadded hex of length "+i);let l=new Uint8Array(i/2);for(let c=0;c<l.length;c++){let n=c*2,s=t.slice(n,n+2),o=Number.parseInt(s,16);if(Number.isNaN(o)||o<0)throw new Error("Invalid byte sequence");l[c]=o}return l}e.hexToBytes=I;var C=async()=>{};e.nextTick=C;async function A(t,i,l){let c=Date.now();for(let n=0;n<t;n++){l(n);let s=Date.now()-c;s>=0&&s<i||(await(0,e.nextTick)(),c+=s)}}e.asyncLoop=A;function P(t){if(typeof t!="string")throw new Error(`utf8ToBytes expected string, got ${typeof t}`);return new Uint8Array(new TextEncoder().encode(t))}e.utf8ToBytes=P;function T(t){if(typeof t=="string"&&(t=P(t)),!a(t))throw new Error(`expected Uint8Array, got ${typeof t}`);return t}e.toBytes=T;function L(...t){let i=new Uint8Array(t.reduce((c,n)=>c+n.length,0)),l=0;return t.forEach(c=>{if(!a(c))throw new Error("Uint8Array expected");i.set(c,l),l+=c.length}),i}e.concatBytes=L;var E=class{clone(){return this._cloneInto()}};e.Hash=E;var f=t=>Object.prototype.toString.call(t)==="[object Object]"&&t.constructor===Object;function b(t,i){if(i!==void 0&&(typeof i!="object"||!f(i)))throw new Error("Options should be object or undefined");return Object.assign(t,i)}e.checkOpts=b;function m(t){let i=c=>t().update(T(c)).digest(),l=t();return i.outputLen=l.outputLen,i.blockLen=l.blockLen,i.create=()=>t(),i}e.wrapConstructor=m;function w(t){let i=(c,n)=>t(n).update(T(c)).digest(),l=t({});return i.outputLen=l.outputLen,i.blockLen=l.blockLen,i.create=c=>t(c),i}e.wrapConstructorWithOpts=w;function S(t){let i=(c,n)=>t(n).update(T(c)).digest(),l=t({});return i.outputLen=l.outputLen,i.blockLen=l.blockLen,i.create=c=>t(c),i}e.wrapXOFConstructorWithOpts=S;function u(t=32){if(r.crypto&&typeof r.crypto.getRandomValues=="function")return r.crypto.getRandomValues(new Uint8Array(t));throw new Error("crypto.getRandomValues must be defined")}e.randomBytes=u}),Ce=$(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.shake256=e.shake128=e.keccak_512=e.keccak_384=e.keccak_256=e.keccak_224=e.sha3_512=e.sha3_384=e.sha3_256=e.sha3_224=e.Keccak=e.keccakP=void 0;var r=xe(),a=Ie(),h=Se(),[d,y,g]=[[],[],[]],k=BigInt(0),p=BigInt(1),I=BigInt(2),C=BigInt(7),A=BigInt(256),P=BigInt(113);for(let u=0,t=p,i=1,l=0;u<24;u++){[i,l]=[l,(2*i+3*l)%5],d.push(2*(5*l+i)),y.push((u+1)*(u+2)/2%64);let c=k;for(let n=0;n<7;n++)t=(t<<p^(t>>C)*P)%A,t&I&&(c^=p<<(p<<BigInt(n))-p);g.push(c)}var[T,L]=a.default.split(g,!0),E=(u,t,i)=>i>32?a.default.rotlBH(u,t,i):a.default.rotlSH(u,t,i),f=(u,t,i)=>i>32?a.default.rotlBL(u,t,i):a.default.rotlSL(u,t,i);function b(u,t=24){let i=new Uint32Array(10);for(let l=24-t;l<24;l++){for(let s=0;s<10;s++)i[s]=u[s]^u[s+10]^u[s+20]^u[s+30]^u[s+40];for(let s=0;s<10;s+=2){let o=(s+8)%10,v=(s+2)%10,x=i[v],O=i[v+1],M=E(x,O,1)^i[o],oe=f(x,O,1)^i[o+1];for(let j=0;j<50;j+=10)u[s+j]^=M,u[s+j+1]^=oe}let c=u[2],n=u[3];for(let s=0;s<24;s++){let o=y[s],v=E(c,n,o),x=f(c,n,o),O=d[s];c=u[O],n=u[O+1],u[O]=v,u[O+1]=x}for(let s=0;s<50;s+=10){for(let o=0;o<10;o++)i[o]=u[s+o];for(let o=0;o<10;o++)u[s+o]^=~i[(o+2)%10]&i[(o+4)%10]}u[0]^=T[l],u[1]^=L[l]}i.fill(0)}e.keccakP=b;var m=class ie extends h.Hash{constructor(t,i,l,c=!1,n=24){if(super(),this.blockLen=t,this.suffix=i,this.outputLen=l,this.enableXOF=c,this.rounds=n,this.pos=0,this.posOut=0,this.finished=!1,this.destroyed=!1,r.default.number(l),0>=this.blockLen||this.blockLen>=200)throw new Error("Sha3 supports only keccak-f1600 function");this.state=new Uint8Array(200),this.state32=(0,h.u32)(this.state)}keccak(){b(this.state32,this.rounds),this.posOut=0,this.pos=0}update(t){r.default.exists(this);let{blockLen:i,state:l}=this;t=(0,h.toBytes)(t);let c=t.length;for(let n=0;n<c;){let s=Math.min(i-this.pos,c-n);for(let o=0;o<s;o++)l[this.pos++]^=t[n++];this.pos===i&&this.keccak()}return this}finish(){if(this.finished)return;this.finished=!0;let{state:t,suffix:i,pos:l,blockLen:c}=this;t[l]^=i,i&128&&l===c-1&&this.keccak(),t[c-1]^=128,this.keccak()}writeInto(t){r.default.exists(this,!1),r.default.bytes(t),this.finish();let i=this.state,{blockLen:l}=this;for(let c=0,n=t.length;c<n;){this.posOut>=l&&this.keccak();let s=Math.min(l-this.posOut,n-c);t.set(i.subarray(this.posOut,this.posOut+s),c),this.posOut+=s,c+=s}return t}xofInto(t){if(!this.enableXOF)throw new Error("XOF is not possible for this instance");return this.writeInto(t)}xof(t){return r.default.number(t),this.xofInto(new Uint8Array(t))}digestInto(t){if(r.default.output(t,this),this.finished)throw new Error("digest() was already called");return this.writeInto(t),this.destroy(),t}digest(){return this.digestInto(new Uint8Array(this.outputLen))}destroy(){this.destroyed=!0,this.state.fill(0)}_cloneInto(t){let{blockLen:i,suffix:l,outputLen:c,rounds:n,enableXOF:s}=this;return t||(t=new ie(i,l,c,s,n)),t.state32.set(this.state32),t.pos=this.pos,t.posOut=this.posOut,t.finished=this.finished,t.rounds=n,t.suffix=l,t.outputLen=c,t.enableXOF=s,t.destroyed=this.destroyed,t}};e.Keccak=m;var w=(u,t,i)=>(0,h.wrapConstructor)(()=>new m(t,u,i));e.sha3_224=w(6,144,224/8),e.sha3_256=w(6,136,256/8),e.sha3_384=w(6,104,384/8),e.sha3_512=w(6,72,512/8),e.keccak_224=w(1,144,224/8),e.keccak_256=w(1,136,256/8),e.keccak_384=w(1,104,384/8),e.keccak_512=w(1,72,512/8);var S=(u,t,i)=>(0,h.wrapXOFConstructorWithOpts)((l={})=>new m(t,u,l.dkLen===void 0?i:l.dkLen,!0));e.shake128=S(31,168,128/8),e.shake256=S(31,136,256/8)}),Te=$((e,r)=>{"use strict";var{sha3_512:a}=Ce(),h=24,d=32,y=(f=4,b=Math.random)=>{let m="";for(;m.length<f;)m=m+Math.floor(b()*36).toString(36);return m};function g(f){let b=8n,m=0n;for(let w of f.values()){let S=BigInt(w);m=(m<<b)+S}return m}var k=(f="")=>g(a(f)).toString(36).slice(1),p=Array.from({length:26},(f,b)=>String.fromCharCode(b+97)),I=f=>p[Math.floor(f()*p.length)],C=({globalObj:f=typeof global<"u"?global:typeof window<"u"?window:{},random:b=Math.random}={})=>{let m=Object.keys(f).toString(),w=m.length?m+y(d,b):y(d,b);return k(w).substring(0,d)},A=f=>()=>f++,P=476782367,T=({random:f=Math.random,counter:b=A(Math.floor(f()*P)),length:m=h,fingerprint:w=C({random:f})}={})=>function(){let S=I(f),u=Date.now().toString(36),t=b().toString(36),i=y(m,f),l=`${u+i+t+w}`;return`${S+k(l).substring(1,m)}`},L=T(),E=(f,{minLength:b=2,maxLength:m=d}={})=>{let w=f.length,S=/^[0-9a-z]+$/;try{if(typeof f=="string"&&w>=b&&w<=m&&S.test(f))return!0}finally{}return!1};r.exports.getConstants=()=>({defaultLength:h,bigLength:d}),r.exports.init=T,r.exports.createId=L,r.exports.bufToBigInt=g,r.exports.createCounter=A,r.exports.createFingerprint=C,r.exports.isCuid=E}),R=$((e,r)=>{"use strict";var{createId:a,init:h,getConstants:d,isCuid:y}=Te();r.exports.createId=a,r.exports.init=h,r.exports.getConstants=d,r.exports.isCuid=y}),Ke=Date.now().toString().slice(5),He=BigInt(1e3),We=BigInt(1e6),Fe=BigInt(1e9);var ze=_(R(),1),Je=_(R(),1);var D="https://secure-proxy.orama.run",Oe="/init",Ae="/chat",Pe="/summary",Ee="/query";var Ve=_(R(),1);var N="text-embedding-ada-002",q="text-embedding-3-small",K="text-embedding-3-large",H="gte-small",W="gte-medium",F="gte-large",z="gpt-4o",J="gpt-4o-mini",V="gpt-4-turbo",Q="gpt-4-turbo-2024-04-09",X="gpt-4-0125-preview",G="gpt-4-1106-preview",Y="gpt-4-turbo-preview",Z="gpt-4",ee="gpt-3.5-turbo",te="gpt-3.5-turbo-0125",Le={[`openai/${N}`]:`openai/${N}`,[`openai/${q}`]:`openai/${q}`,[`openai/${K}`]:`openai/${K}`,[`orama/${F}`]:`orama/${F}`,[`orama/${W}`]:`orama/${W}`,[`orama/${H}`]:`orama/${H}`},re={[`openai/${ee}`]:ee,[`openai/${Z}`]:Z,[`openai/${G}`]:G,[`openai/${X}`]:X,[`openai/${Y}`]:Y,[`openai/${te}`]:te,[`openai/${Q}`]:Q,[`openai/${z}`]:z,[`openai/${J}`]:J,[`openai/${V}`]:V},ae=class{constructor(e){U(this,"CSRFToken","");U(this,"ready");U(this,"api_key");U(this,"publicKey");U(this,"summaryAbortController",null);this.api_key=e.api_key,this.ready=this.init().then(()=>!0).catch(r=>(console.log(r),!1))}async generateEmbeddings(e,r){if(!await this.ready)return console.log("OramaProxy had an error during the initialization"),[];let a=`${D}${Ee}?apiKey=${encodeURIComponent(this.api_key)}`,h=await(await fetch(a,{method:"POST",headers:this.getHeaders(),body:new URLSearchParams({query:e,csrf:this.CSRFToken,model:Le[r]}).toString()})).json();return h.length===1&&(h=h[0]),h}async*summaryStream(e){if(!await this.ready){console.log("OramaProxy had an error during the initialization");return}this.summaryAbortController&&this.summaryAbortController.abort(),this.summaryAbortController=new AbortController;let r=`${D}${Pe}?apiKey=${encodeURIComponent(this.api_key)}`;try{let a=await fetch(r,{method:"POST",headers:this.getHeaders(),body:new URLSearchParams({prompt:e.prompt,cache:e.fresh?"false":"true",docIDs:JSON.stringify(e.docIDs),indexID:e.indexID,deploymentID:e.deploymentID??"",csrf:this.CSRFToken,model:re[e.model]}).toString(),signal:this.summaryAbortController?.signal});if(!a.ok||a.body==null)throw a.statusText;let h=a.body.getReader(),d=new TextDecoder;for(;;){let{value:y,done:g}=await h.read();if(g)break;yield d.decode(y,{stream:!0})}}catch(a){if(a.name!=="AbortError")throw a}}async summary(e){if(!await this.ready)return console.log("OramaProxy had an error during the initialization"),"";let r="";for await(let a of this.summaryStream(e))r+=a;return r}async chat(e){if(!await this.ready)return console.log("OramaProxy had an error during the initialization"),"";let r="";for await(let a of this.chatStream(e))r+=a;return r}async*chatStream(e){if(!await this.ready)return console.log("OramaProxy had an error during the initialization"),"";let r=`${D}${Ae}?apiKey=${encodeURIComponent(this.api_key)}`,a=e.messages;this.publicKey&&(a=await Promise.all(a.map(async g=>!g.content||typeof g.content!="string"?g:{...g,content:await Be(this.publicKey,g.content)})));let h=await fetch(r,{method:"POST",headers:this.getHeaders(),body:new URLSearchParams({messages:JSON.stringify(a),csrf:this.CSRFToken,model:re[e.model]}).toString()});if(!h.ok||h.body==null)throw h.statusText;let d=h.body.getReader(),y=new TextDecoder;for(;;){let{value:g,done:k}=await d.read();if(k)break;yield y.decode(g,{stream:!0})}}async init(){let e=`${D}${Oe}?apiKey=${encodeURIComponent(this.api_key)}`,r=await(await fetch(e,{headers:{referer:this.getReferrer()}})).json();this.CSRFToken=r.csrfToken,r.encryption?.enabled===!0&&(this.publicKey=await $e(je(r.encryption.publicKey)))}isServer(){return typeof window>"u"}getHeaders(){return{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",referer:this.getReferrer()}}getReferrer(){return this.isServer()?"http://localhost":window.location.href}};async function $e(e){return await crypto.subtle.importKey("spki",e,{name:"RSA-OAEP",hash:{name:"SHA-256"}},!0,["encrypt"])}async function Ue(e,r){let a=await crypto.subtle.encrypt({name:"RSA-OAEP"},e,r);return new Uint8Array(a)}function je(e){return Uint8Array.from(e)}var se=50;async function Be(e,r){let a=new TextEncoder().encode(r),h=[];for(let d=0;d<a.length;d+=se){let y=a.subarray(d,d+se),g=await Ue(e,y);h.push(Array.from(g))}return h}var De="https://api.askorama.ai",Qe=`${De}/api/v1`;function Me(e,r){return r.split(".").reduce((a,h)=>a&&a[h]!==void 0?a[h]:void 0,e)}function _e(e,r){return r.map(a=>Me(e,a)).filter(a=>a!==void 0).join(". ")}function Re(e){if(!e.apiKey)throw new Error('Missing "apiKey" parameter for plugin-secure-proxy');if(!e.embeddings.defaultProperty)throw new Error('Missing "embeddings.defaultProperty" parameter for plugin-secure-proxy');if(!e.embeddings.model)throw new Error('Missing "embeddings.model" parameter for plugin-secure-proxy');let r=new ae({api_key:e.apiKey});return{name:"orama-secure-proxy",extra:{proxy:r,pluginParams:e},async beforeInsert(a,h,d){if(!e.embeddings?.onInsert?.generate)return;if(!e.embeddings?.onInsert?.properties)throw new Error('Missing "embeddingsConfig.properties" parameter for plugin-secure-proxy');let y=e.embeddings.onInsert.properties,g=_e(d,y);e.embeddings.onInsert.verbose&&console.log(`Generating embeddings for properties ${y.join(", ")}: ${g}`);let k=await r.generateEmbeddings(g,e.embeddings.model);d[e.embeddings.defaultProperty]=k},async beforeSearch(a,h){if(h.mode!=="vector"&&h.mode!=="hybrid"||h?.vector?.value)return;if(!h.term)throw new Error('Neither "term" nor "vector" parameters were provided');let d=h.term,y=await r.generateEmbeddings(d,e.embeddings.model);h.vector||(h.vector={property:h?.vector?.property??e.embeddings.defaultProperty,value:y}),h.vector.value=y}}}return fe(Ne);})();
|
1
|
+
"use strict";var pluginSecureProxy=(()=>{var D=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var ue=Object.getOwnPropertyNames;var pe=Object.prototype.hasOwnProperty;var fe=(e,r,i)=>r in e?D(e,r,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[r]=i;var ye=(e,r)=>{for(var i in r)D(e,i,{get:r[i],enumerable:!0})},me=(e,r,i,h)=>{if(r&&typeof r=="object"||typeof r=="function")for(let d of ue(r))!pe.call(e,d)&&d!==i&&D(e,d,{get:()=>r[d],enumerable:!(h=ce(r,d))||h.enumerable});return e};var ge=e=>me(D({},"__esModule",{value:!0}),e);var j=(e,r,i)=>(fe(e,typeof r!="symbol"?r+"":r,i),i);var Ne={};ye(Ne,{pluginSecureProxy:()=>qe});var be=Object.create,ae=Object.defineProperty,we=Object.getOwnPropertyDescriptor,ve=Object.getOwnPropertyNames,xe=Object.getPrototypeOf,Se=Object.prototype.hasOwnProperty,B=(e,r)=>()=>(r||e((r={exports:{}}).exports,r),r.exports),Ie=(e,r,i,h)=>{if(r&&typeof r=="object"||typeof r=="function")for(let d of ve(r))!Se.call(e,d)&&d!==i&&ae(e,d,{get:()=>r[d],enumerable:!(h=we(r,d))||h.enumerable});return e},R=(e,r,i)=>(i=e!=null?be(xe(e)):{},Ie(r||!e||!e.__esModule?ae(i,"default",{value:e,enumerable:!0}):i,e)),oe=B(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isBytes=h,e.number=r,e.bool=i,e.bytes=d,e.hash=g,e.exists=b,e.output=T;function r(p){if(!Number.isSafeInteger(p)||p<0)throw new Error(`positive integer expected, not ${p}`)}function i(p){if(typeof p!="boolean")throw new Error(`boolean expected, not ${p}`)}function h(p){return p instanceof Uint8Array||p!=null&&typeof p=="object"&&p.constructor.name==="Uint8Array"}function d(p,...k){if(!h(p))throw new Error("Uint8Array expected");if(k.length>0&&!k.includes(p.length))throw new Error(`Uint8Array expected of length ${k}, not of length=${p.length}`)}function g(p){if(typeof p!="function"||typeof p.create!="function")throw new Error("Hash should be wrapped by utils.wrapConstructor");r(p.outputLen),r(p.blockLen)}function b(p,k=!0){if(p.destroyed)throw new Error("Hash instance has been destroyed");if(k&&p.finished)throw new Error("Hash#digest() has already been called")}function T(p,k){d(p);let P=k.outputLen;if(p.length<P)throw new Error(`digestInto() expects output buffer of length at least ${P}`)}var A={number:r,bool:i,bytes:d,hash:g,exists:b,output:T};e.default=A}),ke=B(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.add5L=e.add5H=e.add4H=e.add4L=e.add3H=e.add3L=e.rotlBL=e.rotlBH=e.rotlSL=e.rotlSH=e.rotr32L=e.rotr32H=e.rotrBL=e.rotrBH=e.rotrSL=e.rotrSH=e.shrSL=e.shrSH=e.toBig=void 0,e.fromBig=h,e.split=d,e.add=w;var r=BigInt(2**32-1),i=BigInt(32);function h(n,s=!1){return s?{h:Number(n&r),l:Number(n>>i&r)}:{h:Number(n>>i&r)|0,l:Number(n&r)|0}}function d(n,s=!1){let t=new Uint32Array(n.length),a=new Uint32Array(n.length);for(let c=0;c<n.length;c++){let{h:f,l:S}=h(n[c],s);[t[c],a[c]]=[f,S]}return[t,a]}var g=(n,s)=>BigInt(n>>>0)<<i|BigInt(s>>>0);e.toBig=g;var b=(n,s,t)=>n>>>t;e.shrSH=b;var T=(n,s,t)=>n<<32-t|s>>>t;e.shrSL=T;var A=(n,s,t)=>n>>>t|s<<32-t;e.rotrSH=A;var p=(n,s,t)=>n<<32-t|s>>>t;e.rotrSL=p;var k=(n,s,t)=>n<<64-t|s>>>t-32;e.rotrBH=k;var P=(n,s,t)=>n>>>t-32|s<<64-t;e.rotrBL=P;var $=(n,s)=>s;e.rotr32H=$;var C=(n,s)=>n;e.rotr32L=C;var E=(n,s,t)=>n<<t|s>>>32-t;e.rotlSH=E;var _=(n,s,t)=>s<<t|n>>>32-t;e.rotlSL=_;var m=(n,s,t)=>s<<t-32|n>>>64-t;e.rotlBH=m;var I=(n,s,t)=>n<<t-32|s>>>64-t;e.rotlBL=I;function w(n,s,t,a){let c=(s>>>0)+(a>>>0);return{h:n+t+(c/2**32|0)|0,l:c|0}}var x=(n,s,t)=>(n>>>0)+(s>>>0)+(t>>>0);e.add3L=x;var O=(n,s,t,a)=>s+t+a+(n/2**32|0)|0;e.add3H=O;var u=(n,s,t,a)=>(n>>>0)+(s>>>0)+(t>>>0)+(a>>>0);e.add4L=u;var o=(n,s,t,a,c)=>s+t+a+c+(n/2**32|0)|0;e.add4H=o;var l=(n,s,t,a,c)=>(n>>>0)+(s>>>0)+(t>>>0)+(a>>>0)+(c>>>0);e.add5L=l;var y=(n,s,t,a,c,f)=>s+t+a+c+f+(n/2**32|0)|0;e.add5H=y;var v={fromBig:h,split:d,toBig:g,shrSH:b,shrSL:T,rotrSH:A,rotrSL:p,rotrBH:k,rotrBL:P,rotr32H:$,rotr32L:C,rotlSH:E,rotlSL:_,rotlBH:m,rotlBL:I,add:w,add3L:x,add3H:O,add4L:u,add4H:o,add5H:y,add5L:l};e.default=v}),Ce=B(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.crypto=void 0,e.crypto=typeof globalThis=="object"&&"crypto"in globalThis?globalThis.crypto:void 0}),Te=B(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Hash=e.nextTick=e.byteSwapIfBE=e.byteSwap=e.isLE=e.rotl=e.rotr=e.createView=e.u32=e.u8=void 0,e.isBytes=h,e.byteSwap32=k,e.bytesToHex=$,e.hexToBytes=_,e.asyncLoop=I,e.utf8ToBytes=w,e.toBytes=x,e.concatBytes=O,e.checkOpts=l,e.wrapConstructor=y,e.wrapConstructorWithOpts=v,e.wrapXOFConstructorWithOpts=n,e.randomBytes=s;var r=Ce(),i=oe();function h(t){return t instanceof Uint8Array||t!=null&&typeof t=="object"&&t.constructor.name==="Uint8Array"}var d=t=>new Uint8Array(t.buffer,t.byteOffset,t.byteLength);e.u8=d;var g=t=>new Uint32Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/4));e.u32=g;var b=t=>new DataView(t.buffer,t.byteOffset,t.byteLength);e.createView=b;var T=(t,a)=>t<<32-a|t>>>a;e.rotr=T;var A=(t,a)=>t<<a|t>>>32-a>>>0;e.rotl=A,e.isLE=new Uint8Array(new Uint32Array([287454020]).buffer)[0]===68;var p=t=>t<<24&4278190080|t<<8&16711680|t>>>8&65280|t>>>24&255;e.byteSwap=p,e.byteSwapIfBE=e.isLE?t=>t:t=>(0,e.byteSwap)(t);function k(t){for(let a=0;a<t.length;a++)t[a]=(0,e.byteSwap)(t[a])}var P=Array.from({length:256},(t,a)=>a.toString(16).padStart(2,"0"));function $(t){(0,i.bytes)(t);let a="";for(let c=0;c<t.length;c++)a+=P[t[c]];return a}var C={_0:48,_9:57,_A:65,_F:70,_a:97,_f:102};function E(t){if(t>=C._0&&t<=C._9)return t-C._0;if(t>=C._A&&t<=C._F)return t-(C._A-10);if(t>=C._a&&t<=C._f)return t-(C._a-10)}function _(t){if(typeof t!="string")throw new Error("hex string expected, got "+typeof t);let a=t.length,c=a/2;if(a%2)throw new Error("padded hex string expected, got unpadded hex of length "+a);let f=new Uint8Array(c);for(let S=0,L=0;S<c;S++,L+=2){let U=E(t.charCodeAt(L)),q=E(t.charCodeAt(L+1));if(U===void 0||q===void 0){let le=t[L]+t[L+1];throw new Error('hex string expected, got non-hex character "'+le+'" at index '+L)}f[S]=U*16+q}return f}var m=async()=>{};e.nextTick=m;async function I(t,a,c){let f=Date.now();for(let S=0;S<t;S++){c(S);let L=Date.now()-f;L>=0&&L<a||(await(0,e.nextTick)(),f+=L)}}function w(t){if(typeof t!="string")throw new Error(`utf8ToBytes expected string, got ${typeof t}`);return new Uint8Array(new TextEncoder().encode(t))}function x(t){return typeof t=="string"&&(t=w(t)),(0,i.bytes)(t),t}function O(...t){let a=0;for(let f=0;f<t.length;f++){let S=t[f];(0,i.bytes)(S),a+=S.length}let c=new Uint8Array(a);for(let f=0,S=0;f<t.length;f++){let L=t[f];c.set(L,S),S+=L.length}return c}var u=class{clone(){return this._cloneInto()}};e.Hash=u;var o={}.toString;function l(t,a){if(a!==void 0&&o.call(a)!=="[object Object]")throw new Error("Options should be object or undefined");return Object.assign(t,a)}function y(t){let a=f=>t().update(x(f)).digest(),c=t();return a.outputLen=c.outputLen,a.blockLen=c.blockLen,a.create=()=>t(),a}function v(t){let a=(f,S)=>t(S).update(x(f)).digest(),c=t({});return a.outputLen=c.outputLen,a.blockLen=c.blockLen,a.create=f=>t(f),a}function n(t){let a=(f,S)=>t(S).update(x(f)).digest(),c=t({});return a.outputLen=c.outputLen,a.blockLen=c.blockLen,a.create=f=>t(f),a}function s(t=32){if(r.crypto&&typeof r.crypto.getRandomValues=="function")return r.crypto.getRandomValues(new Uint8Array(t));if(r.crypto&&typeof r.crypto.randomBytes=="function")return r.crypto.randomBytes(t);throw new Error("crypto.getRandomValues must be defined")}}),Ae=B(e=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.shake256=e.shake128=e.keccak_512=e.keccak_384=e.keccak_256=e.keccak_224=e.sha3_512=e.sha3_384=e.sha3_256=e.sha3_224=e.Keccak=void 0,e.keccakP=I;var r=oe(),i=ke(),h=Te(),d=[],g=[],b=[],T=BigInt(0),A=BigInt(1),p=BigInt(2),k=BigInt(7),P=BigInt(256),$=BigInt(113);for(let u=0,o=A,l=1,y=0;u<24;u++){[l,y]=[y,(2*l+3*y)%5],d.push(2*(5*y+l)),g.push((u+1)*(u+2)/2%64);let v=T;for(let n=0;n<7;n++)o=(o<<A^(o>>k)*$)%P,o&p&&(v^=A<<(A<<BigInt(n))-A);b.push(v)}var[C,E]=(0,i.split)(b,!0),_=(u,o,l)=>l>32?(0,i.rotlBH)(u,o,l):(0,i.rotlSH)(u,o,l),m=(u,o,l)=>l>32?(0,i.rotlBL)(u,o,l):(0,i.rotlSL)(u,o,l);function I(u,o=24){let l=new Uint32Array(10);for(let y=24-o;y<24;y++){for(let s=0;s<10;s++)l[s]=u[s]^u[s+10]^u[s+20]^u[s+30]^u[s+40];for(let s=0;s<10;s+=2){let t=(s+8)%10,a=(s+2)%10,c=l[a],f=l[a+1],S=_(c,f,1)^l[t],L=m(c,f,1)^l[t+1];for(let U=0;U<50;U+=10)u[s+U]^=S,u[s+U+1]^=L}let v=u[2],n=u[3];for(let s=0;s<24;s++){let t=g[s],a=_(v,n,t),c=m(v,n,t),f=d[s];v=u[f],n=u[f+1],u[f]=a,u[f+1]=c}for(let s=0;s<50;s+=10){for(let t=0;t<10;t++)l[t]=u[s+t];for(let t=0;t<10;t++)u[s+t]^=~l[(t+2)%10]&l[(t+4)%10]}u[0]^=C[y],u[1]^=E[y]}l.fill(0)}var w=class he extends h.Hash{constructor(o,l,y,v=!1,n=24){if(super(),this.blockLen=o,this.suffix=l,this.outputLen=y,this.enableXOF=v,this.rounds=n,this.pos=0,this.posOut=0,this.finished=!1,this.destroyed=!1,(0,r.number)(y),0>=this.blockLen||this.blockLen>=200)throw new Error("Sha3 supports only keccak-f1600 function");this.state=new Uint8Array(200),this.state32=(0,h.u32)(this.state)}keccak(){h.isLE||(0,h.byteSwap32)(this.state32),I(this.state32,this.rounds),h.isLE||(0,h.byteSwap32)(this.state32),this.posOut=0,this.pos=0}update(o){(0,r.exists)(this);let{blockLen:l,state:y}=this;o=(0,h.toBytes)(o);let v=o.length;for(let n=0;n<v;){let s=Math.min(l-this.pos,v-n);for(let t=0;t<s;t++)y[this.pos++]^=o[n++];this.pos===l&&this.keccak()}return this}finish(){if(this.finished)return;this.finished=!0;let{state:o,suffix:l,pos:y,blockLen:v}=this;o[y]^=l,l&128&&y===v-1&&this.keccak(),o[v-1]^=128,this.keccak()}writeInto(o){(0,r.exists)(this,!1),(0,r.bytes)(o),this.finish();let l=this.state,{blockLen:y}=this;for(let v=0,n=o.length;v<n;){this.posOut>=y&&this.keccak();let s=Math.min(y-this.posOut,n-v);o.set(l.subarray(this.posOut,this.posOut+s),v),this.posOut+=s,v+=s}return o}xofInto(o){if(!this.enableXOF)throw new Error("XOF is not possible for this instance");return this.writeInto(o)}xof(o){return(0,r.number)(o),this.xofInto(new Uint8Array(o))}digestInto(o){if((0,r.output)(o,this),this.finished)throw new Error("digest() was already called");return this.writeInto(o),this.destroy(),o}digest(){return this.digestInto(new Uint8Array(this.outputLen))}destroy(){this.destroyed=!0,this.state.fill(0)}_cloneInto(o){let{blockLen:l,suffix:y,outputLen:v,rounds:n,enableXOF:s}=this;return o||(o=new he(l,y,v,s,n)),o.state32.set(this.state32),o.pos=this.pos,o.posOut=this.posOut,o.finished=this.finished,o.rounds=n,o.suffix=y,o.outputLen=v,o.enableXOF=s,o.destroyed=this.destroyed,o}};e.Keccak=w;var x=(u,o,l)=>(0,h.wrapConstructor)(()=>new w(o,u,l));e.sha3_224=x(6,144,224/8),e.sha3_256=x(6,136,256/8),e.sha3_384=x(6,104,384/8),e.sha3_512=x(6,72,512/8),e.keccak_224=x(1,144,224/8),e.keccak_256=x(1,136,256/8),e.keccak_384=x(1,104,384/8),e.keccak_512=x(1,72,512/8);var O=(u,o,l)=>(0,h.wrapXOFConstructorWithOpts)((y={})=>new w(o,u,y.dkLen===void 0?l:y.dkLen,!0));e.shake128=O(31,168,128/8),e.shake256=O(31,136,256/8)}),Le=B((e,r)=>{"use strict";var{sha3_512:i}=Ae(),h=24,d=32,g=(m=4,I=Math.random)=>{let w="";for(;w.length<m;)w=w+Math.floor(I()*36).toString(36);return w};function b(m){let I=BigInt(8),w=BigInt(0);for(let x of m.values()){let O=BigInt(x);w=(w<<I)+O}return w}var T=(m="")=>b(i(m)).toString(36).slice(1),A=Array.from({length:26},(m,I)=>String.fromCharCode(I+97)),p=m=>A[Math.floor(m()*A.length)],k=({globalObj:m=typeof global<"u"?global:typeof window<"u"?window:{},random:I=Math.random}={})=>{let w=Object.keys(m).toString(),x=w.length?w+g(d,I):g(d,I);return T(x).substring(0,d)},P=m=>()=>m++,$=476782367,C=({random:m=Math.random,counter:I=P(Math.floor(m()*$)),length:w=h,fingerprint:x=k({random:m})}={})=>function(){let O=p(m),u=Date.now().toString(36),o=I().toString(36),l=g(w,m),y=`${u+l+o+x}`;return`${O+T(y).substring(1,w)}`},E=C(),_=(m,{minLength:I=2,maxLength:w=d}={})=>{let x=m.length,O=/^[a-z][0-9a-z]+$/;try{if(typeof m=="string"&&x>=I&&x<=w&&O.test(m))return!0}finally{}return!1};r.exports.getConstants=()=>({defaultLength:h,bigLength:d}),r.exports.init=C,r.exports.createId=E,r.exports.bufToBigInt=b,r.exports.createCounter=P,r.exports.createFingerprint=k,r.exports.isCuid=_}),H=B((e,r)=>{"use strict";var{createId:i,init:h,getConstants:d,isCuid:g}=Le();r.exports.createId=i,r.exports.init=h,r.exports.getConstants=d,r.exports.isCuid=g}),Fe=Date.now().toString().slice(5),ze=BigInt(1e3),We=BigInt(1e6),Je=BigInt(1e9);var Ve=R(H(),1),Qe=R(H(),1);var M="https://secure-proxy.orama.run",Oe="/init",Pe="/chat",Ee="/summary",_e="/query";var Xe=R(H(),1);var N="text-embedding-ada-002",K="text-embedding-3-small",F="text-embedding-3-large",z="gte-small",W="gte-medium",J="gte-large",V="gpt-4o",Q="gpt-4o-mini",X="gpt-4-turbo",G="gpt-4-turbo-2024-04-09",Y="gpt-4-0125-preview",Z="gpt-4-1106-preview",ee="gpt-4-turbo-preview",te="gpt-4",re="gpt-3.5-turbo",se="gpt-3.5-turbo-0125",$e={[`openai/${N}`]:`openai/${N}`,[`openai/${K}`]:`openai/${K}`,[`openai/${F}`]:`openai/${F}`,[`orama/${J}`]:`orama/${J}`,[`orama/${W}`]:`orama/${W}`,[`orama/${z}`]:`orama/${z}`},ie={[`openai/${re}`]:re,[`openai/${te}`]:te,[`openai/${Z}`]:Z,[`openai/${Y}`]:Y,[`openai/${ee}`]:ee,[`openai/${se}`]:se,[`openai/${G}`]:G,[`openai/${V}`]:V,[`openai/${Q}`]:Q,[`openai/${X}`]:X},de=class{constructor(e){j(this,"CSRFToken","");j(this,"ready");j(this,"api_key");j(this,"publicKey");j(this,"summaryAbortController",null);this.api_key=e.api_key,this.ready=this.init().then(()=>!0).catch(r=>(console.log(r),!1))}async generateEmbeddings(e,r){if(!await this.ready)return console.log("OramaProxy had an error during the initialization"),[];let i=`${M}${_e}?apiKey=${encodeURIComponent(this.api_key)}`,h=await(await fetch(i,{method:"POST",headers:this.getHeaders(),body:new URLSearchParams({query:e,csrf:this.CSRFToken,model:$e[r]}).toString()})).json();return h.length===1&&(h=h[0]),h}async*summaryStream(e){if(!await this.ready){console.log("OramaProxy had an error during the initialization");return}this.summaryAbortController&&this.summaryAbortController.abort(),this.summaryAbortController=new AbortController;let r=`${M}${Ee}?apiKey=${encodeURIComponent(this.api_key)}`;try{let i=await fetch(r,{method:"POST",headers:this.getHeaders(),body:new URLSearchParams({prompt:e.prompt,cache:e.fresh?"false":"true",docIDs:JSON.stringify(e.docIDs),indexID:e.indexID,deploymentID:e.deploymentID??"",csrf:this.CSRFToken,model:ie[e.model]}).toString(),signal:this.summaryAbortController?.signal});if(!i.ok||i.body==null)throw i.statusText;let h=i.body.getReader(),d=new TextDecoder;for(;;){let{value:g,done:b}=await h.read();if(b)break;yield d.decode(g,{stream:!0})}}catch(i){if(i.name!=="AbortError")throw i}}async summary(e){if(!await this.ready)return console.log("OramaProxy had an error during the initialization"),"";let r="";for await(let i of this.summaryStream(e))r+=i;return r}async chat(e){if(!await this.ready)return console.log("OramaProxy had an error during the initialization"),"";let r="";for await(let i of this.chatStream(e))r+=i;return r}async*chatStream(e){if(!await this.ready)return console.log("OramaProxy had an error during the initialization"),"";let r=`${M}${Pe}?apiKey=${encodeURIComponent(this.api_key)}`,i=e.messages;this.publicKey&&(i=await Promise.all(i.map(async b=>!b.content||typeof b.content!="string"?b:{...b,content:await De(this.publicKey,b.content)})));let h=await fetch(r,{method:"POST",headers:this.getHeaders(),body:new URLSearchParams({messages:JSON.stringify(i),csrf:this.CSRFToken,model:ie[e.model]}).toString()});if(!h.ok||h.body==null)throw h.statusText;let d=h.body.getReader(),g=new TextDecoder;for(;;){let{value:b,done:T}=await d.read();if(T)break;yield g.decode(b,{stream:!0})}}async init(){let e=`${M}${Oe}?apiKey=${encodeURIComponent(this.api_key)}`,r=await(await fetch(e,{headers:{referer:this.getReferrer()}})).json();this.CSRFToken=r.csrfToken,r.encryption?.enabled===!0&&(this.publicKey=await Ue(je(r.encryption.publicKey)))}isServer(){return typeof window>"u"}getHeaders(){return{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",referer:this.getReferrer()}}getReferrer(){return this.isServer()?"http://localhost":window.location.href}};async function Ue(e){return await crypto.subtle.importKey("spki",e,{name:"RSA-OAEP",hash:{name:"SHA-256"}},!0,["encrypt"])}async function Be(e,r){let i=await crypto.subtle.encrypt({name:"RSA-OAEP"},e,r);return new Uint8Array(i)}function je(e){return Uint8Array.from(e)}var ne=50;async function De(e,r){let i=new TextEncoder().encode(r),h=[];for(let d=0;d<i.length;d+=ne){let g=i.subarray(d,d+ne),b=await Be(e,g);h.push(Array.from(b))}return h}var Me="https://api.askorama.ai",Ge=`${Me}/api/v1`;function Re(e,r){return r.split(".").reduce((i,h)=>i&&i[h]!==void 0?i[h]:void 0,e)}function He(e,r){return r.map(i=>Re(e,i)).filter(i=>i!==void 0).join(". ")}function qe(e){if(!e.apiKey)throw new Error('Missing "apiKey" parameter for plugin-secure-proxy');if(!e.embeddings.defaultProperty)throw new Error('Missing "embeddings.defaultProperty" parameter for plugin-secure-proxy');if(!e.embeddings.model)throw new Error('Missing "embeddings.model" parameter for plugin-secure-proxy');let r=new de({api_key:e.apiKey});return{name:"orama-secure-proxy",extra:{proxy:r,pluginParams:e},async beforeInsert(i,h,d){if(!e.embeddings?.onInsert?.generate)return;if(!e.embeddings?.onInsert?.properties)throw new Error('Missing "embeddingsConfig.properties" parameter for plugin-secure-proxy');let g=e.embeddings.onInsert.properties,b=He(d,g);e.embeddings.onInsert.verbose&&console.log(`Generating embeddings for properties ${g.join(", ")}: ${b}`);let T=await r.generateEmbeddings(b,e.embeddings.model);d[e.embeddings.defaultProperty]=T},async beforeSearch(i,h){if(h.mode!=="vector"&&h.mode!=="hybrid"||h?.vector?.value)return;if(!h.term)throw new Error('Neither "term" nor "vector" parameters were provided');let d=h.term,g=await r.generateEmbeddings(d,e.embeddings.model);h.vector||(h.vector={property:h?.vector?.property??e.embeddings.defaultProperty,value:g}),h.vector.value=g}}}return ge(Ne);})();
|
2
2
|
/*! Bundled license information:
|
3
3
|
|
4
4
|
@oramacloud/client/dist/index.js:
|
package/dist/index.global.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/node_modules/.pnpm/@noble+hashes@1.3.1/node_modules/@noble/hashes/src/_assert.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/node_modules/.pnpm/@noble+hashes@1.3.1/node_modules/@noble/hashes/src/_u64.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/node_modules/.pnpm/@noble+hashes@1.3.1/node_modules/@noble/hashes/src/crypto.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/node_modules/.pnpm/@noble+hashes@1.3.1/node_modules/@noble/hashes/src/utils.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/node_modules/.pnpm/@noble+hashes@1.3.1/node_modules/@noble/hashes/src/sha3.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/node_modules/.pnpm/@paralleldrive+cuid2@2.2.1/node_modules/@paralleldrive/cuid2/src/index.js","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/node_modules/.pnpm/@paralleldrive+cuid2@2.2.1/node_modules/@paralleldrive/cuid2/index.js","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/node_modules/.pnpm/@orama+orama@2.0.16/node_modules/@orama/orama/src/utils.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/node_modules/.pnpm/@orama+orama@2.0.16/node_modules/@orama/orama/src/components/defaults.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/src/client.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/src/answerSession.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/src/constants.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/src/utils.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/src/cache.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/package.json","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/src/sendBeacon.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/src/collector.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/src/heartbeat.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/src/profile.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/src/proxy.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/src/manager/constants.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/src/manager/index-manager.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.16_encoding@0.1.13_typescript@5.6.3_zod@3.23.8/node_modules/@oramacloud/client/src/manager/index.ts"],"sourcesContent":["import type { AnyOrama, SearchParams, TypedDocument, OramaPluginSync, PartialSchemaDeep } from '@orama/orama'\nimport { OramaProxy, EmbeddingModel, ChatModel } from '@oramacloud/client'\n\nexport type SecureProxyExtra = {\n proxy: OramaProxy\n pluginParams: SecureProxyPluginOptions\n}\n\nexport type LLMModel = ChatModel\n\nexport type SecureProxyPluginOptions = {\n apiKey: string\n embeddings: {\n defaultProperty: string\n model: EmbeddingModel,\n onInsert?: {\n generate: boolean\n properties: string[]\n verbose?: boolean\n }\n }\n chat?: {\n model: LLMModel\n }\n}\n\nfunction getPropertyValue (obj: object, path: string) {\n return path.split('.').reduce((current, key) => \n current && current[key] !== undefined ? current[key] : undefined, obj\n )\n}\n\n\nfunction getPropertiesValues(schema: object, properties: string[]) {\n return properties\n .map(prop => getPropertyValue(schema, prop))\n .filter(value => value !== undefined)\n .join('. ')\n}\n\nexport function pluginSecureProxy(pluginParams: SecureProxyPluginOptions): OramaPluginSync<SecureProxyExtra> {\n if (!pluginParams.apiKey) throw new Error('Missing \"apiKey\" parameter for plugin-secure-proxy')\n if (!pluginParams.embeddings.defaultProperty) throw new Error('Missing \"embeddings.defaultProperty\" parameter for plugin-secure-proxy')\n if (!pluginParams.embeddings.model) throw new Error('Missing \"embeddings.model\" parameter for plugin-secure-proxy')\n\n const proxy = new OramaProxy({\n api_key: pluginParams.apiKey\n })\n\n return {\n name: 'orama-secure-proxy',\n extra: {\n proxy,\n pluginParams\n },\n\n async beforeInsert<T extends TypedDocument<any>>(_db: AnyOrama, _id: string, params: PartialSchemaDeep<T>) {\n if (!pluginParams.embeddings?.onInsert?.generate) {\n return\n }\n\n if (!pluginParams.embeddings?.onInsert?.properties) {\n throw new Error('Missing \"embeddingsConfig.properties\" parameter for plugin-secure-proxy')\n }\n\n const properties = pluginParams.embeddings.onInsert.properties\n const values = getPropertiesValues(params, properties)\n\n if (pluginParams.embeddings.onInsert.verbose) {\n console.log(`Generating embeddings for properties ${properties.join(', ')}: ${values}`)\n }\n\n const embeddings = await proxy.generateEmbeddings(values, pluginParams.embeddings.model)\n\n params[pluginParams.embeddings.defaultProperty] = embeddings\n },\n \n async beforeSearch<T extends AnyOrama>(_db: AnyOrama, params: SearchParams<T, TypedDocument<any>>) {\n if (params.mode !== 'vector' && params.mode !== 'hybrid') {\n return\n }\n\n if (params?.vector?.value) {\n return\n }\n\n if (!params.term) {\n throw new Error('Neither \"term\" nor \"vector\" parameters were provided')\n }\n\n const term = params.term\n const embeddings = await proxy.generateEmbeddings(term, pluginParams.embeddings.model)\n\n if (!params.vector) {\n params.vector = {\n // eslint-disable-next-line\n // @ts-ignore\n property: params?.vector?.property ?? pluginParams.embeddings.defaultProperty,\n value: embeddings\n }\n }\n\n params.vector.value = embeddings\n }\n }\n}\n","export function number(n: number) {\n if (!Number.isSafeInteger(n) || n < 0) throw new Error(`Wrong positive integer: ${n}`);\n}\n\nexport function bool(b: boolean) {\n if (typeof b !== 'boolean') throw new Error(`Expected boolean, not ${b}`);\n}\n\nexport function bytes(b: Uint8Array | undefined, ...lengths: number[]) {\n if (!(b instanceof Uint8Array)) throw new Error('Expected Uint8Array');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error(`Expected Uint8Array of length ${lengths}, not of length=${b.length}`);\n}\n\ntype Hash = {\n (data: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create: any;\n};\nexport function hash(hash: Hash) {\n if (typeof hash !== 'function' || typeof hash.create !== 'function')\n throw new Error('Hash should be wrapped by utils.wrapConstructor');\n number(hash.outputLen);\n number(hash.blockLen);\n}\n\nexport function exists(instance: any, checkFinished = true) {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\nexport function output(out: any, instance: any) {\n bytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error(`digestInto() expects output buffer of length at least ${min}`);\n }\n}\n\nconst assert = {\n number,\n bool,\n bytes,\n hash,\n exists,\n output,\n};\n\nexport default assert;\n","const U32_MASK64 = BigInt(2 ** 32 - 1);\nconst _32n = BigInt(32);\n\n// We are not using BigUint64Array, because they are extremely slow as per 2022\nexport function fromBig(n: bigint, le = false) {\n if (le) return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n\nexport function split(lst: bigint[], le = false) {\n let Ah = new Uint32Array(lst.length);\n let Al = new Uint32Array(lst.length);\n for (let i = 0; i < lst.length; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\n\nexport const toBig = (h: number, l: number) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h: number, l: number, s: number) => h >>> s;\nconst shrSL = (h: number, l: number, s: number) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h: number, l: number, s: number) => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h: number, l: number, s: number) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h: number, l: number, s: number) => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h: number, l: number, s: number) => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (h: number, l: number) => l;\nconst rotr32L = (h: number, l: number) => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h: number, l: number, s: number) => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h: number, l: number, s: number) => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h: number, l: number, s: number) => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h: number, l: number, s: number) => (h << (s - 32)) | (l >>> (64 - s));\n\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\n// Removing \"export\" has 5% perf penalty -_-\nexport function add(Ah: number, Al: number, Bh: number, Bl: number) {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al: number, Bl: number, Cl: number) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low: number, Ah: number, Bh: number, Ch: number) =>\n (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al: number, Bl: number, Cl: number, Dl: number) =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number) =>\n (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al: number, Bl: number, Cl: number, Dl: number, El: number) =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) =>\n (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n\n// prettier-ignore\nconst u64 = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n","// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// See utils.ts for details.\ndeclare const globalThis: Record<string, any> | undefined;\nexport const crypto =\n typeof globalThis === 'object' && 'crypto' in globalThis ? globalThis.crypto : undefined;\n","/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated, we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\nconst u8a = (a: any): a is Uint8Array => a instanceof Uint8Array;\n// Cast array to different type\nexport const u8 = (arr: TypedArray) => new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\nexport const u32 = (arr: TypedArray) =>\n new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n\n// Cast array to view\nexport const createView = (arr: TypedArray) =>\n new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n\n// The rotate right (circular right shift) operation for uint32\nexport const rotr = (word: number, shift: number) => (word << (32 - shift)) | (word >>> shift);\n\n// big-endian hardware is rare. Just in case someone still decides to run hashes:\n// early-throw an error because we don't support BE yet.\nexport const isLE = new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44;\nif (!isLE) throw new Error('Non little-endian hardware is not supported');\n\nconst hexes = Array.from({ length: 256 }, (v, i) => i.toString(16).padStart(2, '0'));\n/**\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n if (!u8a(bytes)) throw new Error('Uint8Array expected');\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n/**\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n const len = hex.length;\n if (len % 2) throw new Error('padded hex string expected, got unpadded hex of length ' + len);\n const array = new Uint8Array(len / 2);\n for (let i = 0; i < array.length; i++) {\n const j = i * 2;\n const hexByte = hex.slice(j, j + 2);\n const byte = Number.parseInt(hexByte, 16);\n if (Number.isNaN(byte) || byte < 0) throw new Error('Invalid byte sequence');\n array[i] = byte;\n }\n return array;\n}\n\n// There is no setImmediate in browser and setTimeout is slow.\n// call of async fn will return Promise, which will be fullfiled only on\n// next scheduler queue processing step and this is exactly what we need.\nexport const nextTick = async () => {};\n\n// Returns control to thread each 'tick' ms to avoid blocking\nexport async function asyncLoop(iters: number, tick: number, cb: (i: number) => void) {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick) continue;\n await nextTick();\n ts += diff;\n }\n}\n\n// Global symbols in both browsers and Node.js since v11\n// See https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\n\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error(`utf8ToBytes expected string, got ${typeof str}`);\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\nexport type Input = Uint8Array | string;\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data: Input): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n if (!u8a(data)) throw new Error(`expected Uint8Array, got ${typeof data}`);\n return data;\n}\n\n/**\n * Copies several Uint8Arrays into one.\n */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n const r = new Uint8Array(arrays.reduce((sum, a) => sum + a.length, 0));\n let pad = 0; // walk through each item, ensure they have proper type\n arrays.forEach((a) => {\n if (!u8a(a)) throw new Error('Uint8Array expected');\n r.set(a, pad);\n pad += a.length;\n });\n return r;\n}\n\n// For runtime check if class implements interface\nexport abstract class Hash<T extends Hash<T>> {\n abstract blockLen: number; // Bytes per block\n abstract outputLen: number; // Bytes in output\n abstract update(buf: Input): this;\n // Writes digest into buf\n abstract digestInto(buf: Uint8Array): void;\n abstract digest(): Uint8Array;\n /**\n * Resets internal state. Makes Hash instance unusable.\n * Reset is impossible for keyed hashes if key is consumed into state. If digest is not consumed\n * by user, they will need to manually call `destroy()` when zeroing is necessary.\n */\n abstract destroy(): void;\n /**\n * Clones hash instance. Unsafe: doesn't check whether `to` is valid. Can be used as `clone()`\n * when no options are passed.\n * Reasons to use `_cloneInto` instead of clone: 1) performance 2) reuse instance => all internal\n * buffers are overwritten => causes buffer overwrite which is used for digest in some cases.\n * There are no guarantees for clean-up because it's impossible in JS.\n */\n abstract _cloneInto(to?: T): T;\n // Safe version that clones internal state\n clone(): T {\n return this._cloneInto();\n }\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\n// Check if object doens't have custom constructor (like Uint8Array/Array)\nconst isPlainObject = (obj: any) =>\n Object.prototype.toString.call(obj) === '[object Object]' && obj.constructor === Object;\n\ntype EmptyObj = {};\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && (typeof opts !== 'object' || !isPlainObject(opts)))\n throw new Error('Options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\nexport type CHash = ReturnType<typeof wrapConstructor>;\n\nexport function wrapConstructor<T extends Hash<T>>(hashCons: () => Hash<T>) {\n const hashC = (msg: Input): Uint8Array => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\n\nexport function wrapConstructorWithOpts<H extends Hash<H>, T extends Object>(\n hashCons: (opts?: T) => Hash<H>\n) {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts: T) => hashCons(opts);\n return hashC;\n}\n\nexport function wrapXOFConstructorWithOpts<H extends HashXOF<H>, T extends Object>(\n hashCons: (opts?: T) => HashXOF<H>\n) {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts: T) => hashCons(opts);\n return hashC;\n}\n\n/**\n * Secure PRNG. Uses `crypto.getRandomValues`, which defers to OS.\n */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n","import assert from './_assert.js';\nimport u64 from './_u64.js';\nimport {\n Hash,\n u32,\n Input,\n toBytes,\n wrapConstructor,\n wrapXOFConstructorWithOpts,\n HashXOF,\n} from './utils.js';\n\n// Various per round constants calculations\nconst [SHA3_PI, SHA3_ROTL, _SHA3_IOTA]: [number[], number[], bigint[]] = [[], [], []];\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst _7n = BigInt(7);\nconst _256n = BigInt(256);\nconst _0x71n = BigInt(0x71);\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n // Pi\n [x, y] = [y, (2 * x + 3 * y) % 5];\n SHA3_PI.push(2 * (5 * y + x));\n // Rotational\n SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n // Iota\n let t = _0n;\n for (let j = 0; j < 7; j++) {\n R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n if (R & _2n) t ^= _1n << ((_1n << BigInt(j)) - _1n);\n }\n _SHA3_IOTA.push(t);\n}\nconst [SHA3_IOTA_H, SHA3_IOTA_L] = u64.split(_SHA3_IOTA, true);\n\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h: number, l: number, s: number) =>\n s > 32 ? u64.rotlBH(h, l, s) : u64.rotlSH(h, l, s);\nconst rotlL = (h: number, l: number, s: number) =>\n s > 32 ? u64.rotlBL(h, l, s) : u64.rotlSL(h, l, s);\n\n// Same as keccakf1600, but allows to skip some rounds\nexport function keccakP(s: Uint32Array, rounds: number = 24) {\n const B = new Uint32Array(5 * 2);\n // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n for (let round = 24 - rounds; round < 24; round++) {\n // Theta θ\n for (let x = 0; x < 10; x++) B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n for (let x = 0; x < 10; x += 2) {\n const idx1 = (x + 8) % 10;\n const idx0 = (x + 2) % 10;\n const B0 = B[idx0];\n const B1 = B[idx0 + 1];\n const Th = rotlH(B0, B1, 1) ^ B[idx1];\n const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n for (let y = 0; y < 50; y += 10) {\n s[x + y] ^= Th;\n s[x + y + 1] ^= Tl;\n }\n }\n // Rho (ρ) and Pi (π)\n let curH = s[2];\n let curL = s[3];\n for (let t = 0; t < 24; t++) {\n const shift = SHA3_ROTL[t];\n const Th = rotlH(curH, curL, shift);\n const Tl = rotlL(curH, curL, shift);\n const PI = SHA3_PI[t];\n curH = s[PI];\n curL = s[PI + 1];\n s[PI] = Th;\n s[PI + 1] = Tl;\n }\n // Chi (χ)\n for (let y = 0; y < 50; y += 10) {\n for (let x = 0; x < 10; x++) B[x] = s[y + x];\n for (let x = 0; x < 10; x++) s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n }\n // Iota (ι)\n s[0] ^= SHA3_IOTA_H[round];\n s[1] ^= SHA3_IOTA_L[round];\n }\n B.fill(0);\n}\n\nexport class Keccak extends Hash<Keccak> implements HashXOF<Keccak> {\n protected state: Uint8Array;\n protected pos = 0;\n protected posOut = 0;\n protected finished = false;\n protected state32: Uint32Array;\n protected destroyed = false;\n // NOTE: we accept arguments in bytes instead of bits here.\n constructor(\n public blockLen: number,\n public suffix: number,\n public outputLen: number,\n protected enableXOF = false,\n protected rounds: number = 24\n ) {\n super();\n // Can be passed from user as dkLen\n assert.number(outputLen);\n // 1600 = 5x5 matrix of 64bit. 1600 bits === 200 bytes\n if (0 >= this.blockLen || this.blockLen >= 200)\n throw new Error('Sha3 supports only keccak-f1600 function');\n this.state = new Uint8Array(200);\n this.state32 = u32(this.state);\n }\n protected keccak() {\n keccakP(this.state32, this.rounds);\n this.posOut = 0;\n this.pos = 0;\n }\n update(data: Input) {\n assert.exists(this);\n const { blockLen, state } = this;\n data = toBytes(data);\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n for (let i = 0; i < take; i++) state[this.pos++] ^= data[pos++];\n if (this.pos === blockLen) this.keccak();\n }\n return this;\n }\n protected finish() {\n if (this.finished) return;\n this.finished = true;\n const { state, suffix, pos, blockLen } = this;\n // Do the padding\n state[pos] ^= suffix;\n if ((suffix & 0x80) !== 0 && pos === blockLen - 1) this.keccak();\n state[blockLen - 1] ^= 0x80;\n this.keccak();\n }\n protected writeInto(out: Uint8Array): Uint8Array {\n assert.exists(this, false);\n assert.bytes(out);\n this.finish();\n const bufferOut = this.state;\n const { blockLen } = this;\n for (let pos = 0, len = out.length; pos < len; ) {\n if (this.posOut >= blockLen) this.keccak();\n const take = Math.min(blockLen - this.posOut, len - pos);\n out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n this.posOut += take;\n pos += take;\n }\n return out;\n }\n xofInto(out: Uint8Array): Uint8Array {\n // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n if (!this.enableXOF) throw new Error('XOF is not possible for this instance');\n return this.writeInto(out);\n }\n xof(bytes: number): Uint8Array {\n assert.number(bytes);\n return this.xofInto(new Uint8Array(bytes));\n }\n digestInto(out: Uint8Array) {\n assert.output(out, this);\n if (this.finished) throw new Error('digest() was already called');\n this.writeInto(out);\n this.destroy();\n return out;\n }\n digest() {\n return this.digestInto(new Uint8Array(this.outputLen));\n }\n destroy() {\n this.destroyed = true;\n this.state.fill(0);\n }\n _cloneInto(to?: Keccak): Keccak {\n const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n to ||= new Keccak(blockLen, suffix, outputLen, enableXOF, rounds);\n to.state32.set(this.state32);\n to.pos = this.pos;\n to.posOut = this.posOut;\n to.finished = this.finished;\n to.rounds = rounds;\n // Suffix can change in cSHAKE\n to.suffix = suffix;\n to.outputLen = outputLen;\n to.enableXOF = enableXOF;\n to.destroyed = this.destroyed;\n return to;\n }\n}\n\nconst gen = (suffix: number, blockLen: number, outputLen: number) =>\n wrapConstructor(() => new Keccak(blockLen, suffix, outputLen));\n\nexport const sha3_224 = gen(0x06, 144, 224 / 8);\n/**\n * SHA3-256 hash function\n * @param message - that would be hashed\n */\nexport const sha3_256 = gen(0x06, 136, 256 / 8);\nexport const sha3_384 = gen(0x06, 104, 384 / 8);\nexport const sha3_512 = gen(0x06, 72, 512 / 8);\nexport const keccak_224 = gen(0x01, 144, 224 / 8);\n/**\n * keccak-256 hash function. Different from SHA3-256.\n * @param message - that would be hashed\n */\nexport const keccak_256 = gen(0x01, 136, 256 / 8);\nexport const keccak_384 = gen(0x01, 104, 384 / 8);\nexport const keccak_512 = gen(0x01, 72, 512 / 8);\n\nexport type ShakeOpts = { dkLen?: number };\n\nconst genShake = (suffix: number, blockLen: number, outputLen: number) =>\n wrapXOFConstructorWithOpts<HashXOF<Keccak>, ShakeOpts>(\n (opts: ShakeOpts = {}) =>\n new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true)\n );\n\nexport const shake128 = genShake(0x1f, 168, 128 / 8);\nexport const shake256 = genShake(0x1f, 136, 256 / 8);\n","/* global global, window, module */\nconst { sha3_512: sha3 } = require(\"@noble/hashes/sha3\");\n\nconst defaultLength = 24;\nconst bigLength = 32;\n\nconst createEntropy = (length = 4, random = Math.random) => {\n let entropy = \"\";\n\n while (entropy.length < length) {\n entropy = entropy + Math.floor(random() * 36).toString(36);\n }\n return entropy;\n};\n\n/*\n * Adapted from https://github.com/juanelas/bigint-conversion\n * MIT License Copyright (c) 2018 Juan Hernández Serrano\n */\nfunction bufToBigInt(buf) {\n let bits = 8n;\n\n let value = 0n;\n for (const i of buf.values()) {\n const bi = BigInt(i);\n value = (value << bits) + bi;\n }\n return value;\n}\n\nconst hash = (input = \"\") => {\n // Drop the first character because it will bias the histogram\n // to the left.\n return bufToBigInt(sha3(input)).toString(36).slice(1);\n};\n\nconst alphabet = Array.from({ length: 26 }, (x, i) =>\n String.fromCharCode(i + 97)\n);\n\nconst randomLetter = (random) =>\n alphabet[Math.floor(random() * alphabet.length)];\n\n/*\nThis is a fingerprint of the host environment. It is used to help\nprevent collisions when generating ids in a distributed system.\nIf no global object is available, you can pass in your own, or fall back\non a random string.\n*/\nconst createFingerprint = ({\n globalObj = typeof global !== \"undefined\"\n ? global\n : typeof window !== \"undefined\"\n ? window\n : {},\n random = Math.random,\n} = {}) => {\n const globals = Object.keys(globalObj).toString();\n const sourceString = globals.length\n ? globals + createEntropy(bigLength, random)\n : createEntropy(bigLength, random);\n\n return hash(sourceString).substring(0, bigLength);\n};\n\nconst createCounter = (count) => () => {\n return count++;\n};\n\n// ~22k hosts before 50% chance of initial counter collision\n// with a remaining counter range of 9.0e+15 in JavaScript.\nconst initialCountMax = 476782367;\n\nconst init = ({\n // Fallback if the user does not pass in a CSPRNG. This should be OK\n // because we don't rely solely on the random number generator for entropy.\n // We also use the host fingerprint, current time, and a session counter.\n random = Math.random,\n counter = createCounter(Math.floor(random() * initialCountMax)),\n length = defaultLength,\n fingerprint = createFingerprint({ random }),\n} = {}) => {\n return function cuid2() {\n const firstLetter = randomLetter(random);\n\n // If we're lucky, the `.toString(36)` calls may reduce hashing rounds\n // by shortening the input to the hash function a little.\n const time = Date.now().toString(36);\n const count = counter().toString(36);\n\n // The salt should be long enough to be globally unique across the full\n // length of the hash. For simplicity, we use the same length as the\n // intended id output.\n const salt = createEntropy(length, random);\n const hashInput = `${time + salt + count + fingerprint}`;\n\n return `${firstLetter + hash(hashInput).substring(1, length)}`;\n };\n};\n\nconst createId = init();\n\nconst isCuid = (id, { minLength = 2, maxLength = bigLength } = {}) => {\n const length = id.length;\n const regex = /^[0-9a-z]+$/;\n\n try {\n if (\n typeof id === \"string\" &&\n length >= minLength &&\n length <= maxLength &&\n regex.test(id)\n )\n return true;\n } finally {\n }\n\n return false;\n};\n\nmodule.exports.getConstants = () => ({ defaultLength, bigLength });\nmodule.exports.init = init;\nmodule.exports.createId = createId;\nmodule.exports.bufToBigInt = bufToBigInt;\nmodule.exports.createCounter = createCounter;\nmodule.exports.createFingerprint = createFingerprint;\nmodule.exports.isCuid = isCuid;\n","const { createId, init, getConstants, isCuid } = require(\"./src/index\");\n\nmodule.exports.createId = createId;\nmodule.exports.init = init;\nmodule.exports.getConstants = getConstants;\nmodule.exports.isCuid = isCuid;\n","import type { AnyDocument, GeosearchDistanceUnit, Results, SearchableValue, TokenScore } from './types.js'\nimport { createError } from './errors.js'\n\nconst baseId = Date.now().toString().slice(5)\nlet lastId = 0\n\nconst k = 1024\nconst nano = BigInt(1e3)\nconst milli = BigInt(1e6)\nconst second = BigInt(1e9)\n\nexport const isServer = typeof window === 'undefined'\n\n/**\n * This value can be increased up to 100_000\n * But i don't know if this value change from nodejs to nodejs\n * So I will keep a safer value here.\n */\nexport const MAX_ARGUMENT_FOR_STACK = 65535\n\n/**\n * This method is needed to used because of issues like: https://github.com/oramasearch/orama/issues/301\n * that issue is caused because the array that is pushed is huge (>100k)\n *\n * @example\n * ```ts\n * safeArrayPush(myArray, [1, 2])\n * ```\n */\nexport function safeArrayPush<T>(arr: T[], newArr: T[]): void {\n if (newArr.length < MAX_ARGUMENT_FOR_STACK) {\n Array.prototype.push.apply(arr, newArr)\n } else {\n const newArrLength = newArr.length\n for (let i = 0; i < newArrLength; i += MAX_ARGUMENT_FOR_STACK) {\n Array.prototype.push.apply(arr, newArr.slice(i, i + MAX_ARGUMENT_FOR_STACK))\n }\n }\n}\n\nexport function sprintf(template: string, ...args: Array<string | number>): string {\n return template.replace(\n /%(?:(?<position>\\d+)\\$)?(?<width>-?\\d*\\.?\\d*)(?<type>[dfs])/g,\n function (...replaceArgs: Array<string | number | Record<string, string>>): string {\n const groups = replaceArgs[replaceArgs.length - 1] as Record<string, string>\n const { width: rawWidth, type, position } = groups\n\n const replacement = position ? args[Number.parseInt(position) - 1]! : args.shift()!\n const width = rawWidth === '' ? 0 : Number.parseInt(rawWidth)\n\n switch (type) {\n case 'd':\n return replacement.toString().padStart(width, '0')\n case 'f': {\n let value = replacement\n const [padding, precision] = rawWidth.split('.').map((w) => Number.parseFloat(w))\n\n if (typeof precision === 'number' && precision >= 0) {\n value = (value as number).toFixed(precision)\n }\n\n return typeof padding === 'number' && padding >= 0 ? value.toString().padStart(width, '0') : value.toString()\n }\n case 's':\n return width < 0\n ? (replacement as string).toString().padEnd(-width, ' ')\n : (replacement as string).toString().padStart(width, ' ')\n\n default:\n return replacement as string\n }\n }\n )\n}\n\nexport async function formatBytes(bytes: number, decimals = 2): Promise<string> {\n if (bytes === 0) {\n return '0 Bytes'\n }\n const dm = decimals < 0 ? 0 : decimals\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`\n}\n\nexport function isInsideWebWorker(): boolean {\n // @ts-expect-error - WebWorker global scope\n return typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope\n}\n\nexport function isInsideNode(): boolean {\n return typeof process !== 'undefined' && process.release && process.release.name === 'node'\n}\n\nexport function getNanosecondTimeViaPerformance() {\n return BigInt(Math.floor(performance.now() * 1e6))\n}\n\nexport async function formatNanoseconds(value: number | bigint): Promise<string> {\n if (typeof value === 'number') {\n value = BigInt(value)\n }\n\n if (value < nano) {\n return `${value}ns`\n } else if (value < milli) {\n return `${value / nano}μs`\n } else if (value < second) {\n return `${value / milli}ms`\n }\n\n return `${value / second}s`\n}\n\n// TODO: none of these operations is async. Should we change the signature of this function?\nexport async function getNanosecondsTime(): Promise<bigint> {\n if (isInsideWebWorker()) {\n return getNanosecondTimeViaPerformance()\n }\n\n if (isInsideNode()) {\n return process.hrtime.bigint()\n }\n\n if (typeof process !== 'undefined' && typeof process?.hrtime?.bigint === 'function') {\n return process.hrtime.bigint()\n }\n\n if (typeof performance !== 'undefined') {\n return getNanosecondTimeViaPerformance()\n }\n\n // @todo: fallback to V8 native method to get microtime\n return BigInt(0)\n}\n\nexport async function uniqueId(): Promise<string> {\n return `${baseId}-${lastId++}`\n}\n\nexport function getOwnProperty<T = unknown>(object: Record<string, T>, property: string): T | undefined {\n // Checks if `hasOwn` method is defined avoiding errors with older Node.js versions\n if (Object.hasOwn === undefined) {\n return Object.prototype.hasOwnProperty.call(object, property) ? object[property] : undefined\n }\n\n return Object.hasOwn(object, property) ? object[property] : undefined\n}\n\nexport function getTokenFrequency(token: string, tokens: string[]): number {\n let count = 0\n\n for (const t of tokens) {\n if (t === token) {\n count++\n }\n }\n\n return count\n}\n\nexport function insertSortedValue(\n arr: TokenScore[],\n el: TokenScore,\n compareFn = sortTokenScorePredicate\n): TokenScore[] {\n let low = 0\n let high = arr.length\n let mid\n\n while (low < high) {\n mid = (low + high) >>> 1\n if (compareFn(el, arr[mid]) < 0) {\n high = mid\n } else {\n low = mid + 1\n }\n }\n\n arr.splice(low, 0, el)\n\n return arr\n}\n\nexport function sortTokenScorePredicate(a: TokenScore, b: TokenScore): number {\n if (b[1] === a[1]) {\n return a[0] - b[0]\n }\n\n return b[1] - a[1]\n}\n\n// Intersection function taken from https://github.com/lovasoa/fast_array_intersect.\n// MIT Licensed at the time of writing.\nexport function intersect<T>(arrays: Array<readonly T[]>): T[] {\n if (arrays.length === 0) {\n return []\n } else if (arrays.length === 1) {\n return arrays[0] as T[]\n }\n\n for (let i = 1; i < arrays.length; i++) {\n if (arrays[i].length < arrays[0].length) {\n const tmp = arrays[0]\n arrays[0] = arrays[i]\n arrays[i] = tmp\n }\n }\n\n const set = new Map()\n for (const elem of arrays[0]) {\n set.set(elem, 1)\n }\n for (let i = 1; i < arrays.length; i++) {\n let found = 0\n for (const elem of arrays[i]) {\n const count = set.get(elem)\n if (count === i) {\n set.set(elem, count + 1)\n found++\n }\n }\n if (found === 0) return []\n }\n\n return arrays[0].filter((e) => {\n const count = set.get(e)\n if (count !== undefined) set.set(e, 0)\n return count === arrays.length\n })\n}\n\nexport async function getDocumentProperties(\n doc: AnyDocument,\n paths: string[]\n): Promise<Record<string, SearchableValue>> {\n const properties: Record<string, SearchableValue> = {}\n\n const pathsLength = paths.length\n for (let i = 0; i < pathsLength; i++) {\n const path = paths[i]\n const pathTokens = path.split('.')\n\n let current: SearchableValue | AnyDocument | undefined = doc\n const pathTokensLength = pathTokens.length\n for (let j = 0; j < pathTokensLength; j++) {\n current = current[pathTokens[j]!]\n\n // We found an object but we were supposed to be done\n if (typeof current === 'object') {\n if (\n current !== null &&\n 'lat' in current &&\n 'lon' in current &&\n typeof current.lat === 'number' &&\n typeof current.lon === 'number'\n ) {\n current = properties[path] = current as SearchableValue\n break\n } else if (!Array.isArray(current) && current !== null && j === pathTokensLength - 1) {\n current = undefined\n break\n }\n } else if ((current === null || typeof current !== 'object') && j < pathTokensLength - 1) {\n // We can't recurse anymore but we were supposed to\n current = undefined\n break\n }\n }\n\n if (typeof current !== 'undefined') {\n properties[path] = current as SearchableValue\n }\n }\n\n return properties\n}\n\nexport async function getNested<T = SearchableValue>(obj: object, path: string): Promise<T | undefined> {\n const props = await getDocumentProperties(obj as AnyDocument, [path])\n\n return props[path] as T | undefined\n}\n\nexport function flattenObject(obj: object, prefix = ''): AnyDocument {\n const result: AnyDocument = {}\n\n for (const key in obj) {\n const prop = `${prefix}${key}`\n const objKey = (obj as AnyDocument)[key]\n\n if (typeof objKey === 'object' && objKey !== null) {\n Object.assign(result, flattenObject(objKey, `${prop}.`))\n } else {\n result[prop] = objKey\n }\n }\n return result\n}\n\nconst mapDistanceToMeters = {\n cm: 0.01,\n m: 1,\n km: 1000,\n ft: 0.3048,\n yd: 0.9144,\n mi: 1609.344\n}\n\nexport function convertDistanceToMeters(distance: number, unit: GeosearchDistanceUnit): number {\n const ratio = mapDistanceToMeters[unit]\n\n if (ratio === undefined) {\n throw new Error(createError('INVALID_DISTANCE_SUFFIX', distance).message)\n }\n\n return distance * ratio\n}\n\nexport function removeVectorsFromHits(searchResult: Results<AnyDocument>, vectorProperties: string[]): void {\n searchResult.hits = searchResult.hits.map((result) => ({\n ...result,\n document: {\n ...result.document,\n // Remove embeddings from the result\n ...vectorProperties.reduce((acc, prop) => {\n const path = prop.split('.')\n const lastKey = path.pop()!\n let obj = acc\n for (const key of path) {\n obj[key] = obj[key] ?? {}\n obj = obj[key] as any\n }\n obj[lastKey] = null\n return acc\n }, result.document)\n }\n }))\n}\n","import { createError } from '../errors.js'\nimport { Point } from '../trees/bkd.js'\nimport {\n AnyDocument,\n AnyOrama,\n ArraySearchableType,\n ElapsedTime,\n ScalarSearchableType,\n SearchableType,\n TypedDocument,\n Vector\n} from '../types.js'\nimport { formatNanoseconds, uniqueId } from '../utils.js'\n\nexport { getDocumentProperties } from '../utils.js'\n\nexport async function formatElapsedTime(n: bigint): Promise<ElapsedTime> {\n return {\n raw: Number(n),\n formatted: await formatNanoseconds(n)\n }\n}\n\nexport async function getDocumentIndexId(doc: AnyDocument): Promise<string> {\n if (doc.id) {\n if (typeof doc.id !== 'string') {\n throw createError('DOCUMENT_ID_MUST_BE_STRING', typeof doc.id)\n }\n\n return doc.id\n }\n\n return await uniqueId()\n}\n\nexport async function validateSchema<T extends AnyOrama, ResultDocument extends TypedDocument<T>>(\n doc: ResultDocument,\n schema: T['schema']\n): Promise<string | undefined> {\n for (const [prop, type] of Object.entries(schema)) {\n const value = doc[prop]\n\n if (typeof value === 'undefined') {\n continue\n }\n\n if (\n type === 'geopoint' &&\n typeof value === 'object' &&\n typeof value.lon === 'number' &&\n typeof value.lat === 'number'\n ) {\n continue\n }\n\n if (type === 'enum' && (typeof value === 'string' || typeof value === 'number')) {\n continue\n }\n if (type === 'enum[]' && Array.isArray(value)) {\n const valueLength = value.length\n for (let i = 0; i < valueLength; i++) {\n if (typeof value[i] !== 'string' && typeof value[i] !== 'number') {\n return prop + '.' + i\n }\n }\n continue\n }\n\n if (isVectorType(type)) {\n const vectorSize = getVectorSize(type)\n if (!Array.isArray(value) || value.length !== vectorSize) {\n throw createError('INVALID_INPUT_VECTOR', prop, vectorSize, value.length)\n }\n continue\n }\n\n if (isArrayType(type)) {\n if (!Array.isArray(value)) {\n return prop\n }\n const expectedType = getInnerType(type)\n\n const valueLength = value.length\n for (let i = 0; i < valueLength; i++) {\n if (typeof value[i] !== expectedType) {\n return prop + '.' + i\n }\n }\n\n continue\n }\n\n if (typeof type === 'object') {\n if (!value || typeof value !== 'object') {\n return prop\n }\n\n // using as ResultDocument is not exactly right but trying to be type-safe here is not useful\n const subProp = await validateSchema(value as ResultDocument, type)\n if (subProp) {\n return prop + '.' + subProp\n }\n continue\n }\n\n if (typeof value !== type) {\n return prop\n }\n }\n\n return undefined\n}\n\nconst IS_ARRAY_TYPE: Record<SearchableType, boolean> = {\n string: false,\n number: false,\n boolean: false,\n enum: false,\n geopoint: false,\n 'string[]': true,\n 'number[]': true,\n 'boolean[]': true,\n 'enum[]': true\n}\n\nconst INNER_TYPE: Record<ArraySearchableType, ScalarSearchableType> = {\n 'string[]': 'string',\n 'number[]': 'number',\n 'boolean[]': 'boolean',\n 'enum[]': 'enum'\n}\n\nexport function isGeoPointType(type: unknown): type is Point {\n return type === 'geopoint'\n}\n\nexport function isVectorType(type: unknown): type is Vector {\n return typeof type === 'string' && /^vector\\[\\d+\\]$/.test(type)\n}\n\nexport function isArrayType(type: unknown): type is ArraySearchableType {\n return typeof type === 'string' && IS_ARRAY_TYPE[type]\n}\n\nexport function getInnerType(type: ArraySearchableType): ScalarSearchableType {\n return INNER_TYPE[type]\n}\n\nexport function getVectorSize(type: string): number {\n const size = Number(type.slice(7, -1))\n\n switch (true) {\n case isNaN(size):\n throw createError('INVALID_VECTOR_VALUE', type)\n case size <= 0:\n throw createError('INVALID_VECTOR_SIZE', type)\n default:\n return size\n }\n}\n","import type { Endpoint, IOramaClient, Method, OramaInitResponse, HeartBeatConfig, OramaError, Override } from './types.js'\nimport type { SearchParams, Results, AnyDocument, AnyOrama, Nullable, InternalTypedDocument } from '@orama/orama'\nimport type { Message, InferenceType, Interaction } from './answerSession.js'\nimport { formatElapsedTime } from '@orama/orama/components'\nimport { createId } from '@paralleldrive/cuid2'\n\nimport { AnswerSession } from './answerSession.js'\nimport { Cache } from './cache.js'\nimport * as CONST from './constants.js'\nimport { Collector } from './collector.js'\nimport { HeartBeat } from './heartbeat.js'\nimport { version } from '../package.json'\nimport { Profile } from './profile.js'\n\nexport interface SearchConfig {\n abortController?: AbortController\n fresh?: boolean\n debounce?: number\n}\n\nexport type SearchMode = 'fulltext' | 'vector' | 'hybrid'\n\ntype AdditionalSearchParams = {\n mode?: SearchMode\n returning?: string[]\n}\n\nexport type AnswerParams = {\n type: 'documentation'\n query: string\n messages: Array<{ role: 'user' | 'system'; content: string }>\n context: Results<any>['hits']\n}\n\nexport type SortByClauseUnion = SortByClause | SortByClause[]\n\ntype Order = 'ASC' | 'DESC' | 'asc' | 'desc'\n\ntype SortByClause = {\n property: string\n order?: Order\n}\n\nexport type ClientSearchParams = Override<SearchParams<AnyOrama>, { sortBy?: SortByClauseUnion }> & AdditionalSearchParams\n\nexport type AnswerSessionParams = {\n inferenceType?: InferenceType\n initialMessages?: Message[]\n userContext?: unknown\n events?: {\n onMessageChange?: (messages: Message[]) => void\n onMessageLoading?: (receivingMessage: boolean) => void\n onAnswerAborted?: (aborted: true) => void\n onSourceChange?: <T = AnyDocument>(sources: Results<T>) => void\n onQueryTranslated?: (query: SearchParams<AnyOrama>) => void\n onRelatedQueries?: (relatedQueries: string[]) => void\n onNewInteractionStarted?: (interactionId: string) => void\n onStateChange?: (state: Interaction[]) => void\n }\n}\n\nexport { AnswerSession, Message }\n\nexport class OramaClient {\n private readonly id = createId()\n private readonly api_key: string\n private readonly endpoint: string\n private readonly answersApiBaseURL: string | undefined\n private readonly collector?: Collector\n private readonly cache?: Cache<Results<AnyDocument>>\n private readonly profile: Profile\n private systemPrompts?: string[]\n private searchDebounceTimer?: any // NodeJS.Timer\n private searchRequestCounter = 0\n private blockSearchTillAuth = false\n\n private heartbeat?: HeartBeat\n private initPromise?: Promise<OramaInitResponse | null>\n\n constructor(params: IOramaClient) {\n this.api_key = params.api_key\n this.endpoint = params.endpoint\n this.answersApiBaseURL = params.answersApiBaseURL\n\n // Enable profile tracking\n this.profile = new Profile({ endpoint: this.endpoint, apiKey: this.api_key })\n\n // Telemetry is enabled by default\n if (params.telemetry !== false) {\n const telementryConfig = {\n id: this.id,\n api_key: this.api_key,\n flushInterval: params.telemetry?.flushInterval ?? CONST.DEFAULT_TELEMETRY_FLUSH_INTERVAL,\n flushSize: params.telemetry?.flushSize ?? CONST.DEFAULT_TELEMETRY_FLUSH_SIZE\n }\n this.collector = Collector.create(telementryConfig, this.profile)\n }\n\n // Cache is enabled by default\n if (params.cache !== false) {\n const cacheParams = {}\n this.cache = new Cache<Results<AnyDocument>>(cacheParams)\n }\n\n this.init()\n }\n\n private customerUserToken: string | undefined = undefined\n private searchToken: string | undefined = undefined\n public setAuthToken(customerAuthToken: string | null) {\n if (customerAuthToken === null) {\n // unlogged user\n this.customerUserToken = undefined\n this.searchToken = undefined\n } else {\n this.customerUserToken = customerAuthToken\n // forgot the previous search token\n this.searchToken = undefined\n }\n // Re-do the init\n this.init()\n }\n\n private onAuthTokenExpired?: (token: string) => void\n public setOnAuthTokenExpired(onAuthTokenExpired: (token: string) => void) {\n this.onAuthTokenExpired = onAuthTokenExpired\n }\n\n public async search(query: ClientSearchParams, config?: SearchConfig): Promise<Nullable<Results<AnyDocument>>>\n public async search<SchemaType extends object, DocumentType extends InternalTypedDocument<SchemaType> = InternalTypedDocument<SchemaType>>(\n query: ClientSearchParams,\n config?: SearchConfig\n ): Promise<Nullable<Results<DocumentType>>> {\n await this.initPromise\n\n // Avoid perform search if the user is not authenticated yet\n if (this.blockSearchTillAuth) {\n console.warn('Search request blocked until user is authenticated')\n return null\n }\n\n const currentRequestNumber = ++this.searchRequestCounter\n const cacheKey = `search-${JSON.stringify(query)}`\n\n let searchResults: Nullable<Results<AnyDocument>> = null\n let roundTripTime: number\n let cached = false\n const shouldUseCache = config?.fresh !== true && this.cache?.has(cacheKey)\n\n const performSearch = async () => {\n try {\n const timeStart = Date.now()\n searchResults = await this.fetch<Results<AnyDocument>>('search', 'POST', { q: query, sst: this.searchToken }, config?.abortController)\n const timeEnd = Date.now()\n searchResults.elapsed = await formatElapsedTime(BigInt(timeEnd * CONST.MICROSECONDS_BASE - timeStart * CONST.MICROSECONDS_BASE))\n roundTripTime = timeEnd - timeStart\n this.cache?.set(cacheKey, searchResults)\n } catch (error: any) {\n if (error.name !== 'AbortError') {\n console.error('Search request failed', error)\n throw error\n }\n }\n\n if (this.collector) {\n this.collector.add({\n rawSearchString: query.term,\n resultsCount: searchResults?.hits?.length ?? 0,\n roundTripTime,\n query,\n cached,\n searchedAt: new Date(),\n userId: this.profile.getUserId()\n })\n }\n\n return searchResults\n }\n\n if (shouldUseCache && this.cache) {\n roundTripTime = 0\n searchResults = this.cache.get(cacheKey) as Results<AnyDocument>\n cached = true\n\n if (this.collector) {\n this.collector.add({\n rawSearchString: query.term,\n resultsCount: searchResults?.hits?.length ?? 0,\n roundTripTime,\n query,\n cached,\n searchedAt: new Date(),\n userId: this.profile.getUserId()\n })\n }\n } else {\n if (config?.debounce) {\n return new Promise((resolve, reject) => {\n clearTimeout(this.searchDebounceTimer)\n this.searchDebounceTimer = setTimeout(\n async () => {\n try {\n await performSearch()\n resolve(searchResults)\n } catch (error) {\n if ((error as any).name !== 'AbortError') {\n console.error('Search request failed', error)\n reject(error)\n }\n }\n },\n config?.debounce || 300\n )\n if ('unref' in this.searchDebounceTimer) {\n this.searchDebounceTimer.unref()\n }\n })\n }\n\n return performSearch()\n }\n\n if (currentRequestNumber === this.searchRequestCounter) {\n return searchResults\n }\n\n return null\n }\n\n public async vectorSearch(query: ClientSearchParams, config?: SearchConfig): Promise<Pick<Results<AnyDocument>, 'hits' | 'elapsed'>> {\n await this.initPromise\n\n const cacheKey = `vectorSearch-${JSON.stringify(query)}`\n\n let roundTripTime: number\n let searchResults: Results<AnyDocument>\n let cached = false\n\n const shouldUseCache = config?.fresh !== true && this.cache?.has(cacheKey)\n if (shouldUseCache === true && this.cache != null) {\n roundTripTime = 0\n searchResults = this.cache.get(cacheKey) as Results<AnyDocument>\n cached = true\n } else {\n const timeStart = Date.now()\n searchResults = await this.fetch<Results<AnyDocument>>('vector-search2', 'POST', { q: query }, config?.abortController)\n const timeEnd = Date.now()\n\n searchResults.elapsed = await formatElapsedTime(BigInt(timeEnd * CONST.MICROSECONDS_BASE - timeStart * CONST.MICROSECONDS_BASE))\n roundTripTime = timeEnd - timeStart\n\n this.cache?.set(cacheKey, searchResults)\n }\n\n if (this.collector != null) {\n this.collector.add({\n rawSearchString: query.term,\n resultsCount: searchResults.hits?.length ?? 0,\n roundTripTime,\n query,\n cached,\n searchedAt: new Date(),\n userId: this.profile.getUserId()\n })\n }\n\n return searchResults\n }\n\n public createAnswerSession(params?: AnswerSessionParams) {\n return new AnswerSession({\n inferenceType: params?.inferenceType || 'documentation',\n initialMessages: params?.initialMessages || [],\n oramaClient: this,\n events: params?.events,\n userContext: params?.userContext\n })\n }\n\n public startHeartBeat(config: HeartBeatConfig): void {\n this.heartbeat?.stop()\n this.heartbeat = new HeartBeat({\n ...config,\n endpoint: this.endpoint + `/health?api-key=${this.api_key}`\n })\n this.heartbeat.start()\n }\n\n public stopHeartBeat(): void {\n this.heartbeat?.stop()\n }\n\n public async getPop(): Promise<string> {\n const g = await this.initPromise\n return g?.pop ?? ''\n }\n\n private expirationTimer: ReturnType<typeof setTimeout> | undefined\n private init(): void {\n this.initPromise = this.fetch<OramaInitResponse>('init', 'GET', undefined, undefined, { token: this.customerUserToken })\n .then((b) => {\n this.collector?.setParams({\n endpoint: b.collectUrl,\n deploymentID: b.deploymentID,\n index: b.index\n })\n\n this.profile?.setParams({\n identifyUrl: b.collectUrl,\n index: b.index\n })\n\n if (b.searchSession) {\n if ('required' in b.searchSession && b.searchSession.required === true) {\n this.blockSearchTillAuth = true\n } else if ('token' in b.searchSession) {\n const searchToken = b.searchSession.token\n this.searchToken = searchToken\n const maxAge = b.searchSession.maxAge\n this.blockSearchTillAuth = false\n\n if (this.expirationTimer) {\n clearTimeout(this.expirationTimer)\n }\n this.expirationTimer = setTimeout(() => {\n if (this.searchToken === searchToken) {\n this.searchToken = undefined\n this.blockSearchTillAuth = true\n this.onAuthTokenExpired?.(searchToken)\n }\n }, maxAge * 1000)\n if ('unref' in this.expirationTimer) {\n this.expirationTimer.unref()\n }\n }\n }\n\n return b\n })\n .catch((err) => {\n console.log(err)\n return null\n })\n }\n\n private async fetch<T = unknown>(\n path: Endpoint,\n method: Method,\n body?: object,\n abortController?: AbortController,\n queryParams?: Record<string, string | undefined>\n ): Promise<T> {\n if (abortController?.signal.aborted === true) {\n throw new Error('Request aborted')\n }\n\n const requestOptions: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n // Unfortunatelly we can't send this headers otherwise we should pay CORS preflight request\n // 'x-orama-instance-id': this.id,\n // 'x-orama-version': version\n },\n signal: abortController?.signal\n }\n\n if (method === 'POST' && body !== undefined) {\n const b = body as any\n b.version = version\n b.id = this.id\n b.visitorId = this.profile.getUserId()\n\n requestOptions.body = Object.entries(b)\n .filter(([_, value]) => !!value)\n .map(([key, value]) => `${key}=${encodeURIComponent(JSON.stringify(value))}`)\n .join('&')\n }\n\n const url = new URL(`${this.endpoint}/${path}`)\n url.searchParams.append('api-key', this.api_key)\n if (queryParams) {\n for (const [key, value] of Object.entries(queryParams)) {\n if (value) {\n url.searchParams.append(key, value)\n }\n }\n }\n const res: Response = await fetch(url, requestOptions)\n\n if (!res.ok) {\n const error = new Error() as OramaError\n error.httpResponse = res\n throw error\n }\n\n return await res.json()\n }\n\n /**\n * Methods associated with profile tracking\n */\n public getIdentity(): string | undefined {\n return this.profile.getIdentity()\n }\n\n public getUserId(): string {\n return this.profile.getUserId()\n }\n\n public getAlias(): string | undefined {\n return this.profile.getAlias()\n }\n\n public async identify(identity: string): Promise<void> {\n if (this.initPromise === undefined) {\n throw new Error('OramaClient not initialized')\n }\n\n await this.profile.identify(this.initPromise, identity)\n }\n\n public async alias(alias: string): Promise<void> {\n if (this.initPromise === undefined) {\n throw new Error('OramaClient not initialized')\n }\n\n await this.profile.alias(this.initPromise, alias)\n }\n\n public reset(): void {\n this.profile.reset()\n }\n\n /**\n * Methods associated with custom system prompts\n */\n public setSystemPromptConfiguration(config: { systemPrompts: string[] }): void {\n if (Array.isArray(config.systemPrompts)) {\n if (!config.systemPrompts.every((prompt) => typeof prompt === 'string')) {\n throw new Error('Invalid system prompt configuration')\n }\n\n this.systemPrompts = config.systemPrompts\n }\n }\n\n public getSystemPromptConfiguration(): string[] | undefined {\n return this.systemPrompts\n }\n}\n","import type { Results, AnyDocument, SearchParams, AnyOrama, Nullable } from '@orama/orama'\nimport { createId } from '@paralleldrive/cuid2'\nimport { ORAMA_ANSWER_ENDPOINT } from './constants.js'\nimport { OramaClient } from './client.js'\nimport { parseSSE, serializeUserContext } from './utils.js'\n\nexport type Context = Results<AnyDocument>['hits']\n\nexport type Message = {\n role: 'user' | 'assistant'\n content: string\n}\n\nexport type InferenceType = 'documentation'\n\nexport type AnswerParams<UserContext = unknown> = {\n initialMessages: Message[]\n inferenceType: InferenceType\n oramaClient: OramaClient\n userContext?: UserContext\n events?: {\n onMessageChange?: (messages: Message[]) => void\n onMessageLoading?: (receivingMessage: boolean) => void\n onAnswerAborted?: (aborted: true) => void\n onSourceChange?: <T = AnyDocument>(sources: Results<T>) => void\n onQueryTranslated?: (query: SearchParams<AnyOrama>) => void\n onRelatedQueries?: (relatedQueries: string[]) => void\n onNewInteractionStarted?: (interactionId: string) => void\n onStateChange?: (state: Interaction[]) => void\n }\n}\n\nexport type Interaction<T = AnyDocument> = {\n interactionId: string\n query: string\n response: string\n relatedQueries: Nullable<string[]>\n sources: Nullable<Results<T>>\n translatedQuery: Nullable<SearchParams<AnyOrama>>\n aborted: boolean\n loading: boolean\n error: boolean\n errorMessage: string | null\n}\n\nexport type AskParams = SearchParams<AnyOrama> & {\n userData?: unknown\n related?: {\n howMany?: 1 | 2 | 3 | 4 | 5\n format?: 'question' | 'query'\n }\n}\n\nexport class AnswerSession {\n private messages: Message[]\n private inferenceType: InferenceType\n private oramaClient: OramaClient\n private endpoint: string\n private abortController?: AbortController\n private events: AnswerParams['events']\n private userContext?: AnswerParams['userContext']\n private conversationID: string\n private lastInteractionParams?: AskParams\n public state: Interaction[] = []\n\n constructor(params: AnswerParams) {\n // @ts-expect-error - sorry again TypeScript :-)\n const oaramaAnswerHostAddress = params.oramaClient.answersApiBaseURL || ORAMA_ANSWER_ENDPOINT\n\n this.messages = params.initialMessages || []\n this.inferenceType = params.inferenceType\n this.oramaClient = params.oramaClient\n // @ts-expect-error - sorry TypeScript\n this.endpoint = `${oaramaAnswerHostAddress}/v1/answer?api-key=${this.oramaClient.api_key}`\n this.events = params.events\n this.conversationID = createId()\n this.userContext = params.userContext\n }\n\n public async askStream(params: AskParams): Promise<AsyncGenerator<string>> {\n this.messages.push({ role: 'user', content: params.term ?? '' })\n return this.fetchAnswer(params)\n }\n\n public async ask(params: AskParams): Promise<string> {\n const generator = await this.askStream(params)\n let result = ''\n for await (const message of generator) {\n result = message\n }\n\n if (this.events?.onMessageChange) {\n this.events.onMessageChange(this.messages)\n }\n\n return result\n }\n\n public getMessages(): Message[] {\n return this.messages\n }\n\n public clearSession(): void {\n this.messages = []\n this.state = []\n\n if (this.events?.onMessageChange) {\n this.events.onMessageChange(this.messages)\n }\n\n if (this.events?.onStateChange) {\n this.events.onStateChange(this.state)\n }\n }\n\n public abortAnswer() {\n if (!this.abortController) {\n throw new Error('AbortController is not ready')\n }\n\n this.abortController.abort()\n this.abortController = undefined\n this.state[this.state.length - 1].aborted = true\n }\n\n public async regenerateLast({ stream = true } = {}): Promise<string | AsyncGenerator<string>> {\n if (this.state.length === 0 || this.messages.length === 0) {\n throw new Error('No messages to regenerate')\n }\n\n const isLastMessageAssistant = this.messages.at(-1)?.role === 'assistant'\n\n if (!isLastMessageAssistant) {\n throw new Error('Last message is not an assistant message')\n }\n\n this.messages.pop()\n this.state.pop()\n\n if (stream) {\n return this.askStream(this.lastInteractionParams as AskParams)\n }\n\n return this.ask(this.lastInteractionParams as AskParams)\n }\n\n private addNewEmptyAssistantMessage(): void {\n this.messages.push({ role: 'assistant', content: '' })\n }\n\n private async *fetchAnswer(params: AskParams): AsyncGenerator<string> {\n this.abortController = new AbortController()\n this.lastInteractionParams = params\n const interactionId = createId()\n\n let reader: ReadableStreamDefaultReader | null = null\n\n const currentStateIndex = this.state.length\n\n this.state.push({\n interactionId,\n query: params.term ?? '',\n response: '',\n relatedQueries: null,\n sources: null,\n translatedQuery: null,\n aborted: false,\n loading: true,\n error: false,\n errorMessage: null\n })\n\n try {\n if (this.events?.onNewInteractionStarted) {\n this.events.onNewInteractionStarted(interactionId)\n }\n\n if (this.events?.onStateChange) {\n this.events.onStateChange(this.state)\n }\n\n const requestBody = new URLSearchParams()\n requestBody.append('type', this.inferenceType)\n requestBody.append('messages', JSON.stringify(this.messages))\n requestBody.append('query', params.term ?? '')\n requestBody.append('conversationId', this.conversationID)\n requestBody.append('userId', this.oramaClient.getUserId())\n // @ts-expect-error - yeah it's private but we need it here\n requestBody.append('endpoint', this.oramaClient.endpoint)\n requestBody.append('searchParams', JSON.stringify(params))\n requestBody.append('identity', this.oramaClient.getIdentity() ?? '')\n requestBody.append('interactionId', interactionId)\n requestBody.append('alias', this.oramaClient.getAlias() ?? '')\n\n const systemPromptConfiguration = this.oramaClient.getSystemPromptConfiguration()\n if (systemPromptConfiguration) {\n requestBody.append('systemPrompts', JSON.stringify(systemPromptConfiguration))\n }\n\n if (this.userContext) {\n requestBody.append('userContext', serializeUserContext(this.userContext))\n }\n\n if (params.userData) {\n requestBody.append('userData', serializeUserContext(params.userData))\n }\n\n if (params.related) {\n if (params.related?.howMany && params.related?.howMany > 5) {\n throw new Error('Can generate at most 5 related queries')\n }\n\n requestBody.append('related', JSON.stringify({ enabled: true, howMany: params.related.howMany ?? 3, format: params.related.format ?? 'question' }))\n }\n\n const response = await fetch(this.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: requestBody.toString(),\n signal: this.abortController.signal\n })\n\n if (!response.ok || !response.body) {\n throw new Error(response.statusText)\n }\n\n reader = response.body.getReader()\n const decoder = new TextDecoder()\n const messageQueue: string[] = []\n let buffer = ''\n\n if (this.events?.onMessageLoading) {\n this.events.onMessageLoading(true)\n }\n\n this.addNewEmptyAssistantMessage()\n\n const lastMessage = this.messages.at(-1) as Message\n\n while (true) {\n const { value, done } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n\n let endOfMessageIndex\n\n // biome-ignore lint/suspicious/noAssignInExpressions: this saves a variable allocation on each iteration\n while ((endOfMessageIndex = buffer.indexOf('\\n\\n')) !== -1) {\n const rawMessage = buffer.slice(0, endOfMessageIndex)\n buffer = buffer.slice(endOfMessageIndex + 2)\n\n try {\n const event = parseSSE(rawMessage)\n const parsedMessage = JSON.parse(event.data)\n\n // MANAGE INCOMING SOURCES\n if (parsedMessage.type === 'sources') {\n this.state[currentStateIndex].sources = parsedMessage.message\n\n if (this.events?.onSourceChange) {\n this.events.onSourceChange(parsedMessage.message)\n }\n\n if (this.events?.onStateChange) {\n this.events.onStateChange(this.state)\n }\n\n // MANAGE INCOMING TRANSLATED QUERY\n } else if (parsedMessage.type === 'query-translated') {\n this.state[currentStateIndex].translatedQuery = parsedMessage.message\n\n if (this.events?.onQueryTranslated) {\n this.events.onQueryTranslated(parsedMessage.message)\n }\n\n if (this.events?.onStateChange) {\n this.events.onStateChange(this.state)\n }\n\n // MANAGE INCOMING RELATED QUERIES\n } else if (parsedMessage.type === 'related-queries') {\n this.state[currentStateIndex].relatedQueries = parsedMessage.message\n\n if (this.events?.onRelatedQueries) {\n this.events.onRelatedQueries(parsedMessage.message)\n }\n\n if (this.events?.onStateChange) {\n this.events.onStateChange(this.state)\n }\n\n // MANAGE INCOMING MESSAGE CHUNK\n } else if (parsedMessage.type === 'text') {\n messageQueue.push(parsedMessage.message)\n\n // Process the message queue immediately, regardless of endOfBlock\n while (messageQueue.length > 0) {\n lastMessage.content += messageQueue.shift()\n this.state[currentStateIndex].response = lastMessage.content\n\n if (this.events?.onStateChange) {\n this.events.onStateChange(this.state)\n }\n\n if (this.events?.onMessageChange) {\n this.events.onMessageChange(this.messages)\n }\n\n yield lastMessage.content\n }\n\n // ALL OTHER CASES\n } else {\n // https://shorturl.at/PlUKm\n }\n } catch (e) {\n console.error('Error parsing SSE event:', e)\n console.error('Raw message:', rawMessage)\n }\n }\n }\n } catch (err: any) {\n if (err.name === 'AbortError') {\n this.state[currentStateIndex].aborted = true\n\n if (this.events?.onAnswerAborted) {\n this.events.onAnswerAborted(true)\n }\n } else {\n this.state[currentStateIndex].error = true\n this.state[currentStateIndex].errorMessage = err.message ?? 'Unknown error'\n throw err\n }\n } finally {\n reader?.releaseLock()\n this.state[currentStateIndex].loading = false\n\n if (this.events?.onStateChange) {\n this.events.onStateChange(this.state)\n }\n\n if (this.events?.onMessageLoading) {\n this.events.onMessageLoading(false)\n }\n }\n }\n}\n","export const MICROSECONDS_BASE = 1_000_000\n\nexport const DEFAULT_TELEMETRY_FLUSH_INTERVAL = 5000\n\nexport const DEFAULT_TELEMETRY_FLUSH_SIZE = 25\n\nexport const ORAMA_ANSWER_ENDPOINT = 'https://answer.api.orama.com'\n\nexport const ORAMA_PROXY_ENDPOINT = 'https://secure-proxy.orama.run'\nexport const ORAMA_PROXY_INIT_ENDPOINT = '/init'\nexport const ORAMA_PROXY_CHAT_ENDPOINT = '/chat'\nexport const ORAMA_PROXY_SUMMARY_ENDPOINT = '/summary'\nexport const ORAMA_PROXY_EMBEDDINGS_ENDPOINT = '/query'\n\nexport const LOCAL_STORAGE_USER_ID_KEY = 'orama_user_id'\nexport const LOCAL_STORAGE_SERVER_SIDE_SESSION_KEY = 'server-side-session'\n","export const hasLocalStorage = typeof localStorage !== 'undefined'\n\ntype SSESourcePayload = {\n type: 'sources'\n message: object\n}\n\ntype SSETextStreamPayload = {\n type: 'text'\n message: string\n endOfBlock: boolean\n}\n\ntype SSEParsedPayload = SSESourcePayload | SSETextStreamPayload\n\ntype SSEPayload = {\n data: string\n event: string\n}\n\nexport function throttle(func: (...args: any[]) => any, limit: number) {\n let inThrottle: boolean\n return function () {\n const args = arguments\n const context = this\n if (!inThrottle) {\n func.apply(context, args)\n inThrottle = true\n setTimeout(() => (inThrottle = false), limit)\n }\n }\n}\n\nexport function debounce(func: (...args: any[]) => any, delay: number) {\n let debounceTimer: NodeJS.Timer\n return function () {\n const context = this\n const args = arguments\n clearTimeout(debounceTimer)\n debounceTimer = setTimeout(() => func.apply(context, args), delay)\n }\n}\n\nexport function parseSSE(input: string): SSEPayload {\n const [event, ...data] = input.split('\\n')\n const eventData = data.join('\\n').replace('data: ', '')\n\n return {\n event: event.replace('event: ', ''),\n data: eventData\n }\n}\n\nexport function serializeUserContext(userContext: unknown): string {\n if (typeof userContext === 'object') {\n return JSON.stringify(userContext)\n }\n\n return `${userContext}`\n}\n","import type { CacheConfig, Optional } from './types.js'\n\ntype CacheMap<T = unknown> = Map<string, T>\n\nexport class Cache<V = unknown> {\n private readonly cache: CacheMap<V>\n private readonly config: CacheConstructorParams\n\n constructor(config: CacheConstructorParams) {\n this.cache = new Map()\n this.config = config\n }\n\n public set(key: string, value: V): void {\n this.cache.set(key, value)\n }\n\n public get(key: string): Optional<V> {\n return this.cache.get(key)\n }\n\n public has(key: string): boolean {\n return this.cache.has(key)\n }\n\n public delete(key: string): boolean {\n return this.cache.delete(key)\n }\n\n public clear(): void {\n this.cache.clear()\n }\n\n public size(): number {\n return this.cache.size\n }\n}\n\nexport interface CacheConstructorParams extends CacheConfig {}\n","{\n \"name\": \"@oramacloud/client\",\n \"version\": \"1.3.16\",\n \"description\": \"Orama SDK for Node.js, Deno, and Browsers\",\n \"type\": \"module\",\n \"sideEffects\": false,\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"runkitExampleFilename\": \"./example/runkit.js\",\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"browser\": \"./dist/index.global.js\"\n },\n \"./react\": {\n \"require\": \"./dist/react/index.cjs\",\n \"import\": \"./dist/react/index.js\",\n \"types\": \"./dist/react/index.d.ts\"\n },\n \"./vue\": {\n \"require\": \"./dist/vue/index.cjs\",\n \"import\": \"./dist/vue/index.js\",\n \"types\": \"./dist/vue/index.d.ts\"\n }\n },\n \"scripts\": {\n \"format\": \"bunx @biomejs/biome format src --write\",\n \"build\": \"npm run build:lib && npm run build:react && npm run build:vue\",\n \"dev\": \"run-p watch:lib watch:react watch:vue\",\n \"watch:lib\": \"tsup --config tsup.lib.js --watch\",\n \"watch:react\": \"tsup --config tsup.react.js --watch\",\n \"watch:vue\": \"tsup --config tsup.vue.js --watch\",\n \"build:lib\": \"tsup --config tsup.lib.js\",\n \"build:react\": \"tsup --config tsup.react.js\",\n \"build:vue\": \"tsup --config tsup.vue.js\",\n \"test\": \"node --no-warnings --loader tsx --test **/*.test.ts\",\n \"serve:example\": \"esbuild src/index.ts --bundle --outfile=example/out.js --format=esm --watch --servedir=example\",\n \"prepare\": \"husky install\"\n },\n \"keywords\": [\n \"orama\",\n \"search engine\",\n \"sdk\"\n ],\n \"files\": [\n \"dist\",\n \"example/runkit.js\"\n ],\n \"author\": {\n \"name\": \"Michele Riva\",\n \"email\": \"michele.riva@oramasearch.com\",\n \"url\": \"https://github.com/MicheleRiva\"\n },\n \"license\": \"ISC\",\n \"dependencies\": {\n \"@orama/orama\": \"^2.0.16\",\n \"@paralleldrive/cuid2\": \"^2.2.1\",\n \"lodash\": \"^4.17.21\",\n \"openai\": \"^4.24.1\",\n \"react\": \"^18.2.0\",\n \"vue\": \"^3.4.25\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^1.4.1\",\n \"@fastify/formbody\": \"^7.4.0\",\n \"@types/lodash\": \"^4.14.202\",\n \"@types/node\": \"^20.3.1\",\n \"@types/react\": \"^18.2.14\",\n \"dotenv\": \"^16.3.1\",\n \"esbuild\": \"0.18.5\",\n \"fastify\": \"^4.19.2\",\n \"husky\": \"^8.0.3\",\n \"npm-run-all\": \"^4.1.5\",\n \"ts-standard\": \"^12.0.2\",\n \"tsup\": \"^7.1.0\",\n \"tsx\": \"^3.12.7\",\n \"typescript\": \"^5.1.3\"\n },\n \"ts-standard\": {\n \"ignore\": [\n \"dist\",\n \"node_modules\"\n ]\n }\n}\n","export default function sendBeacon(endpoint: string, body?: string): Promise<Response> | undefined {\n if (typeof navigator !== 'undefined') {\n if (typeof navigator.sendBeacon !== 'undefined') {\n navigator.sendBeacon(endpoint, body)\n }\n return\n }\n\n fetch(endpoint, {\n method: 'POST',\n body,\n headers: {\n 'Content-Type': 'application/json'\n }\n }).then(\n () => {},\n (e) => console.log(e)\n )\n}\n","import type { SearchEvent, ICollector, TelemetryConfig } from './types.js'\nimport pkg from '../package.json'\nimport sendBeacon from './sendBeacon.js'\nimport { Profile } from './profile.js'\n\ntype Data = any[]\n\nexport class Collector {\n private data: Data\n private params?: ICollector\n private readonly config: CollectorConstructor\n private readonly profile: Profile\n\n private constructor(config: CollectorConstructor, profile: Profile) {\n this.data = []\n this.config = config\n this.profile = profile\n }\n\n public setParams(params: ICollector): void {\n this.params = params\n }\n\n public static create(config: CollectorConstructor, profile: Profile): Collector {\n const collector = new Collector(config, profile)\n collector.start()\n return collector\n }\n\n public add(data: SearchEvent): void {\n this.data.push({\n rawSearchString: data.rawSearchString,\n query: data.query,\n resultsCount: data.resultsCount,\n roundTripTime: data.roundTripTime,\n searchedAt: data.searchedAt,\n userId: this.profile.getUserId(),\n identity: this.profile.getIdentity(),\n alias: this.profile.getAlias(),\n // The referer is different for every event:\n // the user can search in different pages of the website\n // and the referer will be different for each page\n referer: typeof location !== 'undefined' ? location.toString() : undefined\n })\n\n if (this.params != null && this.data.length >= this.config.flushSize) {\n this.flush()\n }\n }\n\n public flush(): void {\n if (this.params == null || this.data.length === 0) {\n return\n }\n\n // Swap out the data array *sync*\n // so that we can continue to collect events\n const data = this.data\n this.data = []\n\n const body = {\n source: 'fe',\n deploymentID: this.params.deploymentID,\n index: this.params.index,\n oramaId: this.config.id,\n oramaVersion: pkg.version,\n // The user agent is the same for every event\n // Because we use \"application/x-www-form-urlencoded\",\n // the browser doens't send the user agent automatically\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n events: data\n }\n\n sendBeacon(this.params.endpoint + `?api-key=${this.config.api_key}`, JSON.stringify(body))?.catch((err) => console.log(err))\n }\n\n private start(): void {\n const interval = setInterval(this.flush.bind(this), this.config.flushInterval)\n if (interval.unref != null) {\n interval.unref()\n }\n }\n}\n\nexport interface CollectorConstructor extends TelemetryConfig {\n id: string\n api_key: string\n}\n","import sendBeacon from './sendBeacon.js'\nimport { HeartBeatConfig } from './types.js'\n\nexport class HeartBeat {\n private intervalId?: number\n\n constructor(private readonly params: HeartBeatConstructor) {}\n\n public start(): void {\n this.stop()\n // @ts-expect-error - setInterval ID is actually a number\n this.intervalId = setInterval(this.beat.bind(this), this.params.frequency)\n }\n\n public stop(): void {\n if (this.intervalId !== undefined) {\n clearInterval(this.intervalId)\n }\n }\n\n private beat(): void {\n sendBeacon(this.params.endpoint)?.catch((err) => console.log(err))\n }\n}\n\nexport interface HeartBeatConstructor extends HeartBeatConfig {\n endpoint: string\n}\n","import { createId } from '@paralleldrive/cuid2'\nimport sendBeacon from './sendBeacon.js'\nimport { OramaInitResponse } from './types.js'\nimport { LOCAL_STORAGE_USER_ID_KEY } from './constants.js'\n\ntype ProfileConstructor = {\n endpoint: string\n apiKey: string\n}\n\ntype ProfileParams = {\n identifyUrl: string\n index: string\n}\n\nexport class Profile {\n private readonly endpoint: string\n private readonly apiKey: string\n\n private userId: string\n private identity?: string\n private userAlias?: string\n private params?: ProfileParams\n\n constructor({ endpoint, apiKey }: ProfileConstructor) {\n if (!endpoint || !apiKey) {\n throw new Error('Endpoint and API Key are required to create a Profile')\n }\n\n if (typeof endpoint !== 'string' || typeof apiKey !== 'string') {\n throw new Error('Endpoint and API Key must be strings')\n }\n\n if (typeof localStorage !== 'undefined') {\n // Browser side\n const userId = localStorage.getItem(LOCAL_STORAGE_USER_ID_KEY)\n\n if (userId) {\n this.userId = userId\n } else {\n this.userId = createId()\n localStorage.setItem(LOCAL_STORAGE_USER_ID_KEY, this.userId)\n }\n } else {\n // Server side\n this.userId = createId()\n }\n\n this.endpoint = endpoint\n this.apiKey = apiKey\n }\n\n setParams(params: ProfileParams) {\n const { protocol, host } = new URL(params.identifyUrl)\n const telemetryDomain = `${protocol}//${host}/identify`\n\n this.params = {\n identifyUrl: telemetryDomain,\n index: params.index\n }\n }\n\n getIdentity() {\n return this.identity\n }\n\n getUserId() {\n return this.userId\n }\n\n getAlias() {\n return this.userAlias\n }\n\n private async sendProfileData(data: Record<string, any>) {\n if (!this.params) {\n throw new Error('Orama Profile is not initialized')\n }\n\n const body = JSON.stringify({\n ...data,\n visitorId: this.getUserId(),\n index: this.params.index\n })\n\n await sendBeacon(`${this.params?.identifyUrl}?api-key=${this.apiKey}`, body)\n }\n\n async identify(initPromise: Promise<OramaInitResponse | null>, identity: string) {\n if (typeof identity !== 'string') {\n throw new Error('Identity must be a string')\n }\n\n await initPromise\n\n await this.sendProfileData({\n entity: 'identity',\n id: identity\n })\n\n this.identity = identity\n }\n\n async alias(initPromise: Promise<OramaInitResponse | null>, alias: string) {\n if (typeof alias !== 'string') {\n throw new Error('Identity must be a string')\n }\n\n await initPromise\n\n await this.sendProfileData({\n entity: 'alias',\n id: alias\n })\n\n this.userAlias = alias\n }\n\n reset() {\n this.userId = createId()\n this.identity = undefined\n this.userAlias = undefined\n }\n}\n","import type { Nullable } from '@orama/orama'\nimport type { OpenAI } from 'openai'\nimport type { IOramaProxy } from './types.js'\nimport * as CONST from './constants.js'\n\nexport type EmbeddingModel = keyof typeof embeddingsModels\nexport type ChatModel = keyof typeof chatModels\nexport type ChatMessage = OpenAI.ChatCompletionMessageParam\n\nexport type ChatParams = {\n messages: ChatMessage[]\n model: ChatModel\n}\n\nexport type SummaryParams = {\n prompt: string\n docIDs: string[]\n indexID: string\n model: ChatModel\n deploymentID?: string\n fresh?: boolean\n}\n\nconst OPENAI_EMBEDDINGS_MODEL_ADA = 'text-embedding-ada-002'\nconst OPENAI_EMBEDDINGS_MODEL_3_SMALL = 'text-embedding-3-small'\nconst OPENAI_EMBEDDINGS_MODEL_3_LARGE = 'text-embedding-3-large'\nconst ORAMA_EMBEDDINGS_MODEL_GTE_SMALL = 'gte-small'\nconst ORAMA_EMBEDDINGS_MODEL_GTE_MEDIUM = 'gte-medium'\nconst ORAMA_EMBEDDINGS_MODEL_GTE_LARGE = 'gte-large'\n\nconst OPENAI_CHAT_MODE_GPT_4O = 'gpt-4o'\nconst OPENAI_CHAT_MODE_GPT_4O_MINI = 'gpt-4o-mini'\nconst OPENAI_CHAT_MODE_GPT_4_TURBO = 'gpt-4-turbo'\nconst OPENAI_CHAT_MODEL_GPT_4_TURBO_2024_04_09 = 'gpt-4-turbo-2024-04-09'\nconst OPENAI_CHAT_MODE_GPT_4_0125_PREVIEW = 'gpt-4-0125-preview'\nconst OPENAI_CHAT_MODEL_GPT4_1106_PREVIEW = 'gpt-4-1106-preview'\nconst OPENAI_CHAT_MODEL_GPT4_TURBO_PREVIEW = 'gpt-4-turbo-preview'\nconst OPENAI_CHAT_MODEL_GPT4 = 'gpt-4'\nconst OPENAI_CHAT_MODEL_GPT3_5_TURBO = 'gpt-3.5-turbo'\nconst OPENAI_CHAT_MODEL_GPT3_3_5_TURBO_0125 = 'gpt-3.5-turbo-0125'\n\nconst embeddingsModels = {\n [`openai/${OPENAI_EMBEDDINGS_MODEL_ADA}`]: `openai/${OPENAI_EMBEDDINGS_MODEL_ADA}`,\n [`openai/${OPENAI_EMBEDDINGS_MODEL_3_SMALL}`]: `openai/${OPENAI_EMBEDDINGS_MODEL_3_SMALL}`,\n [`openai/${OPENAI_EMBEDDINGS_MODEL_3_LARGE}`]: `openai/${OPENAI_EMBEDDINGS_MODEL_3_LARGE}`,\n [`orama/${ORAMA_EMBEDDINGS_MODEL_GTE_LARGE}`]: `orama/${ORAMA_EMBEDDINGS_MODEL_GTE_LARGE}`,\n [`orama/${ORAMA_EMBEDDINGS_MODEL_GTE_MEDIUM}`]: `orama/${ORAMA_EMBEDDINGS_MODEL_GTE_MEDIUM}`,\n [`orama/${ORAMA_EMBEDDINGS_MODEL_GTE_SMALL}`]: `orama/${ORAMA_EMBEDDINGS_MODEL_GTE_SMALL}`\n}\n\nconst chatModels = {\n [`openai/${OPENAI_CHAT_MODEL_GPT3_5_TURBO}`]: OPENAI_CHAT_MODEL_GPT3_5_TURBO,\n [`openai/${OPENAI_CHAT_MODEL_GPT4}`]: OPENAI_CHAT_MODEL_GPT4,\n [`openai/${OPENAI_CHAT_MODEL_GPT4_1106_PREVIEW}`]: OPENAI_CHAT_MODEL_GPT4_1106_PREVIEW,\n [`openai/${OPENAI_CHAT_MODE_GPT_4_0125_PREVIEW}`]: OPENAI_CHAT_MODE_GPT_4_0125_PREVIEW,\n [`openai/${OPENAI_CHAT_MODEL_GPT4_TURBO_PREVIEW}`]: OPENAI_CHAT_MODEL_GPT4_TURBO_PREVIEW,\n [`openai/${OPENAI_CHAT_MODEL_GPT3_3_5_TURBO_0125}`]: OPENAI_CHAT_MODEL_GPT3_3_5_TURBO_0125,\n [`openai/${OPENAI_CHAT_MODEL_GPT_4_TURBO_2024_04_09}`]: OPENAI_CHAT_MODEL_GPT_4_TURBO_2024_04_09,\n [`openai/${OPENAI_CHAT_MODE_GPT_4O}`]: OPENAI_CHAT_MODE_GPT_4O,\n [`openai/${OPENAI_CHAT_MODE_GPT_4O_MINI}`]: OPENAI_CHAT_MODE_GPT_4O_MINI,\n [`openai/${OPENAI_CHAT_MODE_GPT_4_TURBO}`]: OPENAI_CHAT_MODE_GPT_4_TURBO\n}\n\nexport class OramaProxy {\n private CSRFToken = ''\n private ready: Promise<boolean>\n private readonly api_key: string\n private publicKey?: CryptoKey\n private summaryAbortController?: Nullable<AbortController> = null\n\n constructor(params: IOramaProxy) {\n this.api_key = params.api_key\n\n this.ready = this.init()\n .then(() => true)\n .catch((err) => {\n console.log(err)\n return false\n })\n }\n\n public async generateEmbeddings(text: string, model: EmbeddingModel): Promise<number[]> {\n const isReady = await this.ready\n\n if (!isReady) {\n console.log('OramaProxy had an error during the initialization')\n return []\n }\n\n const endpoint = `${CONST.ORAMA_PROXY_ENDPOINT}${CONST.ORAMA_PROXY_EMBEDDINGS_ENDPOINT}?apiKey=${encodeURIComponent(this.api_key)}`\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: this.getHeaders(),\n body: new URLSearchParams({\n query: text,\n csrf: this.CSRFToken,\n model: embeddingsModels[model]\n }).toString()\n })\n\n let embeddings = await response.json()\n\n if (embeddings.length === 1) {\n embeddings = embeddings[0]\n }\n\n return embeddings\n }\n\n public async *summaryStream(params: SummaryParams): AsyncGenerator<string> {\n const isReady = await this.ready\n\n if (!isReady) {\n console.log('OramaProxy had an error during the initialization')\n return\n }\n\n // Abort previous request and initiate a new AbortController.\n // This will allow us to cancel the request when a new one is made.\n if (this.summaryAbortController) {\n this.summaryAbortController.abort()\n }\n\n this.summaryAbortController = new AbortController()\n\n const endpoint = `${CONST.ORAMA_PROXY_ENDPOINT}${CONST.ORAMA_PROXY_SUMMARY_ENDPOINT}?apiKey=${encodeURIComponent(this.api_key)}`\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: this.getHeaders(),\n body: new URLSearchParams({\n prompt: params.prompt,\n cache: params.fresh ? 'false' : 'true',\n docIDs: JSON.stringify(params.docIDs),\n indexID: params.indexID,\n deploymentID: params.deploymentID ?? '',\n csrf: this.CSRFToken,\n model: chatModels[params.model]\n }).toString(),\n signal: this.summaryAbortController?.signal\n })\n\n if (!response.ok || response.body == null) {\n throw response.statusText\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n\n while (true) {\n const { value, done } = await reader.read()\n if (done) {\n break\n }\n const decodedChunk = decoder.decode(value, { stream: true })\n yield decodedChunk\n }\n } catch (error: any) {\n if (error.name !== 'AbortError') {\n throw error\n }\n }\n }\n\n public async summary(params: SummaryParams): Promise<string> {\n const isReady = await this.ready\n\n if (!isReady) {\n console.log('OramaProxy had an error during the initialization')\n return ''\n }\n\n let response = ''\n\n for await (const msg of this.summaryStream(params)) {\n response += msg\n }\n\n return response\n }\n\n public async chat(params: ChatParams): Promise<string> {\n const isReady = await this.ready\n\n if (!isReady) {\n console.log('OramaProxy had an error during the initialization')\n return ''\n }\n\n let response = ''\n\n for await (const msg of this.chatStream(params)) {\n response += msg\n }\n\n return response\n }\n\n public async *chatStream(params: ChatParams): AsyncGenerator<string> {\n const isReady = await this.ready\n\n if (!isReady) {\n console.log('OramaProxy had an error during the initialization')\n return ''\n }\n\n const endpoint = `${CONST.ORAMA_PROXY_ENDPOINT}${CONST.ORAMA_PROXY_CHAT_ENDPOINT}?apiKey=${encodeURIComponent(this.api_key)}`\n\n let messages = params.messages\n if (this.publicKey) {\n messages = (await Promise.all(\n messages.map(async (message) => {\n if (!message.content) {\n return message\n }\n if (typeof message.content !== 'string') {\n return message\n }\n return {\n ...message,\n content: await encryptData(this.publicKey!, message.content)\n }\n })\n )) as any // Too hard to type this\n }\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: this.getHeaders(),\n body: new URLSearchParams({\n messages: JSON.stringify(messages),\n csrf: this.CSRFToken,\n model: chatModels[params.model]\n }).toString()\n })\n\n if (!response.ok || response.body == null) {\n throw response.statusText\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n\n while (true) {\n const { value, done } = await reader.read()\n if (done) {\n break\n }\n\n const decodedChunk = decoder.decode(value, { stream: true })\n yield decodedChunk\n }\n }\n\n private async init() {\n const endpoint = `${CONST.ORAMA_PROXY_ENDPOINT}${CONST.ORAMA_PROXY_INIT_ENDPOINT}?apiKey=${encodeURIComponent(this.api_key)}`\n const response = await fetch(endpoint, {\n headers: {\n referer: this.getReferrer()\n }\n })\n\n const data = await response.json()\n this.CSRFToken = data.csrfToken\n if (data.encryption?.enabled === true) {\n this.publicKey = await importPublicKey(restoreKey(data.encryption.publicKey))\n }\n }\n\n private isServer() {\n return typeof window === 'undefined'\n }\n\n private getHeaders() {\n return {\n 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',\n referer: this.getReferrer()\n }\n }\n\n private getReferrer() {\n return this.isServer() ? 'http://localhost' : window.location.href\n }\n}\n\nasync function importPublicKey(keyData: ArrayBuffer) {\n const key = await crypto.subtle.importKey('spki', keyData, { name: 'RSA-OAEP', hash: { name: 'SHA-256' } }, true, ['encrypt'])\n return key\n}\n\nasync function encryptPieceData(publicKey: CryptoKey, encodedData: Uint8Array) {\n const encryptedData = await crypto.subtle.encrypt({ name: 'RSA-OAEP' }, publicKey, encodedData)\n return new Uint8Array(encryptedData)\n}\n\nfunction restoreKey(s: number[]): Uint8Array {\n return Uint8Array.from(s)\n}\n\nconst BATCH_SIZE = 50\nasync function encryptData(publicKey: CryptoKey, data: string) {\n const encodedData = new TextEncoder().encode(data)\n\n const arr = []\n for (let i = 0; i < encodedData.length; i += BATCH_SIZE) {\n const item = encodedData.subarray(i, i + BATCH_SIZE)\n const encryptedData = await encryptPieceData(publicKey, item)\n arr.push(Array.from(encryptedData))\n }\n\n return arr\n}\n","export const ENDPOINT_SNAPSHOT = 'snapshot'\nexport const ENDPOINT_NOTIFY = 'notify'\nexport const ENDPOINT_DEPLOY = 'deploy'\nexport const ENDPOINT_HAS_DATA = 'has-data'\nexport const ENDPOINT_UPDATE_SCHEMA = 'update-schema'\n\nexport const METHOD_POST = 'POST'\nexport const METHOD_GET = 'GET'\nexport const METHOD_PUT = 'PUT'\nexport const METHOD_DELETE = 'DELETE'\n\nexport const API_BASE_URL = 'https://api.askorama.ai'\nexport const API_V1_BASE_URL = `${API_BASE_URL}/api/v1`\n","import type { Nullable } from '@orama/orama'\nimport type { CloudManager } from './index.js'\nimport type { Endpoint, EndpointDeploy, EndpointHasData, EndpointNotify, EndpointSnapshot, EndpointUpdateSchema } from './types.js'\nimport * as CONST from './constants.js'\n\ntype IndexManagerParams = {\n manager: CloudManager\n indexID: string\n}\n\ntype SnapshotData = any[] | object | unknown\n\ntype CallWebhookPayload<E extends Endpoint> = E extends EndpointSnapshot\n ? SnapshotData\n : E extends EndpointNotify\n ? any[]\n : E extends EndpointDeploy\n ? undefined\n : E extends EndpointUpdateSchema \n ? { schema: { [key: string]: any }, embeddings?: any }\n : never\n\nexport class IndexManager {\n private manager: CloudManager\n private indexId: Nullable<string> = null\n\n constructor(params: IndexManagerParams) {\n this.manager = params.manager\n this.indexId = params.indexID\n\n this.manager.setIndexID(params.indexID)\n }\n\n public async empty(): Promise<boolean> {\n const resp = await this.callIndexWebhook<EndpointSnapshot>(CONST.ENDPOINT_SNAPSHOT, [])\n return (resp as any).success\n }\n\n public async snapshot(data: CallWebhookPayload<EndpointSnapshot>): Promise<boolean> {\n const resp = await this.callIndexWebhook<EndpointSnapshot>(CONST.ENDPOINT_SNAPSHOT, data)\n return (resp as any).success\n }\n\n public async insert(data: CallWebhookPayload<EndpointNotify>): Promise<boolean> {\n const resp = await this.callIndexWebhook<EndpointNotify>(CONST.ENDPOINT_NOTIFY, { upsert: data } as any)\n return (resp as any).success\n }\n\n public async update(data: CallWebhookPayload<EndpointNotify>): Promise<boolean> {\n const resp = await this.callIndexWebhook<EndpointNotify>(CONST.ENDPOINT_NOTIFY, { upsert: data } as any)\n return (resp as any).success\n }\n\n public async delete(data: CallWebhookPayload<EndpointNotify>): Promise<boolean> {\n try {\n await this.callIndexWebhook<EndpointNotify>(CONST.ENDPOINT_NOTIFY, { remove: data } as any)\n } catch (e) {\n console.error(e)\n return false\n }\n\n return true\n }\n\n public async updateSchema(schema: CallWebhookPayload<EndpointUpdateSchema>): Promise<boolean> {\n try {\n await this.callIndexWebhook<EndpointUpdateSchema>(CONST.ENDPOINT_UPDATE_SCHEMA, schema)\n } catch (e) {\n console.error(e)\n return false\n }\n return true\n }\n\n public async deploy(): Promise<boolean> {\n try {\n const resp = await this.callIndexWebhook<EndpointDeploy>(CONST.ENDPOINT_DEPLOY)\n } catch (e) {\n console.error(e)\n return false\n }\n\n return true\n }\n\n public async hasPendingOperations(): Promise<boolean> {\n const resp = await this.callIndexWebhook<EndpointHasData>(CONST.ENDPOINT_HAS_DATA)\n return (resp as any).hasData\n }\n\n private checkIndexID() {\n if (!this.indexId) {\n throw new Error('Index ID is not set')\n }\n }\n\n private callIndexWebhook<E extends Endpoint>(endpoint: E, payload?: CallWebhookPayload<E>) {\n this.checkIndexID()\n return this.manager.callIndexWebhook(endpoint, payload)\n }\n}\n","import type { Nullable, insert } from '@orama/orama'\nimport type { Endpoint, Method } from './types.js'\nimport { IndexManager } from './index-manager.js'\nimport { API_V1_BASE_URL } from './constants.js'\n\ntype CloudManagerConfig = {\n api_key: string,\n baseURL?: string\n}\n\ntype CallConfig = {\n method: Method\n headers: {\n 'Content-Type': string\n Authorization: string\n }\n body?: string\n}\n\ntype Payload = UpsertPayload | RemovePayload | InsertPayload\n\ntype UpsertPayload = {\n upsert: any[]\n}\n\ntype RemovePayload = {\n remove: any[]\n}\n\ntype InsertPayload = {\n insert: any[]\n}\n\nexport class CloudManager {\n private indexId: Nullable<string> = null\n private apiKey: string\n private baseURL: string\n\n constructor(config: CloudManagerConfig) {\n this.apiKey = config.api_key\n this.baseURL = config?.baseURL || API_V1_BASE_URL\n }\n\n index(indexId: string): IndexManager {\n return new IndexManager({ manager: this, indexID: indexId })\n }\n\n setIndexID(id: string) {\n this.indexId = id\n }\n\n async callIndexWebhook<T = unknown>(endpoint: Endpoint, payload?: T): Promise<Response> {\n const config: CallConfig = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`\n }\n }\n\n if (payload) {\n config.body = JSON.stringify(payload)\n }\n\n const resp = await fetch(`${this.baseURL}/webhooks/${this.indexId}/${endpoint}`, config)\n\n return resp.json()\n }\n}\n"],"mappings":"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","names":["src_exports","__export","pluginSecureProxy","number","n","exports","bool","b","bytes","lengths","hash","exists","instance","checkFinished","output","out","min","assert","U32_MASK64","_32n","fromBig","le","split","lst","Ah","Al","i","h","l","toBig","shrSH","s","shrSL","rotrSH","rotrSL","rotrBH","rotrBL","rotr32H","rotr32L","rotlSH","rotlSL","rotlBH","rotlBL","add","Bh","Bl","add3L","Cl","add3H","low","Ch","add4L","Dl","add4H","Dh","add5L","El","add5H","Eh","u64","Ie","w","a","crypto_1","we","u8a","u8","arr","u32","createView","rotr","word","shift","hexes","v","bytesToHex","hex","hexToBytes","len","array","j","hexByte","byte","nextTick","asyncLoop","iters","tick","cb","ts","diff","utf8ToBytes","str","toBytes","data","concatBytes","arrays","r","sum","pad","Hash","isPlainObject","obj","checkOpts","defaults","opts","wrapConstructor","hashCons","hashC","msg","tmp","wrapConstructorWithOpts","wrapXOFConstructorWithOpts","randomBytes","bytesLength","_assert_js_1","me","_u64_js_1","Se","utils_js_1","SHA3_PI","SHA3_ROTL","_SHA3_IOTA","_0n","_1n","_2n","_7n","_256n","_0x71n","round","R","x","y","t","SHA3_IOTA_H","SHA3_IOTA_L","rotlH","rotlL","keccakP","rounds","B","idx1","idx0","B0","B1","Th","Tl","curH","curL","PI","Keccak","_Keccak","blockLen","suffix","outputLen","enableXOF","state","pos","take","bufferOut","to","gen","genShake","require_src","__commonJSMin","module","sha3","ve","defaultLength","bigLength","createEntropy","length","random","entropy","bufToBigInt","buf","bits","value","bi","input","alphabet","randomLetter","createFingerprint","globalObj","globals","sourceString","createCounter","count","initialCountMax","init","counter","fingerprint","firstLetter","time","salt","hashInput","createId","isCuid","id","minLength","maxLength","regex","require_cuid2","getConstants","Ue","baseId","Date","now","toString","slice","nano","BigInt","milli","second","import_cuid2","K","ORAMA_PROXY_ENDPOINT","ORAMA_PROXY_INIT_ENDPOINT","ORAMA_PROXY_CHAT_ENDPOINT","ORAMA_PROXY_SUMMARY_ENDPOINT","ORAMA_PROXY_EMBEDDINGS_ENDPOINT","import_cuid2","K","OPENAI_EMBEDDINGS_MODEL_ADA","OPENAI_EMBEDDINGS_MODEL_3_SMALL","OPENAI_EMBEDDINGS_MODEL_3_LARGE","ORAMA_EMBEDDINGS_MODEL_GTE_SMALL","ORAMA_EMBEDDINGS_MODEL_GTE_MEDIUM","ORAMA_EMBEDDINGS_MODEL_GTE_LARGE","OPENAI_CHAT_MODE_GPT_4O","OPENAI_CHAT_MODE_GPT_4O_MINI","OPENAI_CHAT_MODE_GPT_4_TURBO","OPENAI_CHAT_MODEL_GPT_4_TURBO_2024_04_09","OPENAI_CHAT_MODE_GPT_4_0125_PREVIEW","OPENAI_CHAT_MODEL_GPT4_1106_PREVIEW","OPENAI_CHAT_MODEL_GPT4_TURBO_PREVIEW","OPENAI_CHAT_MODEL_GPT4","OPENAI_CHAT_MODEL_GPT3_5_TURBO","OPENAI_CHAT_MODEL_GPT3_3_5_TURBO_0125","embeddingsModels","chatModels","OramaProxy","params","__publicField","err","text","model","endpoint","ORAMA_PROXY_ENDPOINT","ORAMA_PROXY_EMBEDDINGS_ENDPOINT","embeddings","ORAMA_PROXY_SUMMARY_ENDPOINT","response","reader","decoder","value","done","error","msg","ORAMA_PROXY_CHAT_ENDPOINT","messages","message","encryptData","ORAMA_PROXY_INIT_ENDPOINT","data","importPublicKey","restoreKey","keyData","encryptPieceData","publicKey","encodedData","encryptedData","s","BATCH_SIZE","arr","i","item","API_BASE_URL","API_V1_BASE_URL","getPropertyValue","obj","path","current","key","getPropertiesValues","schema","properties","prop","value","pluginSecureProxy","pluginParams","proxy","ht","_db","_id","params","values","embeddings","term"]}
|
1
|
+
{"version":3,"sources":["../src/index.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/node_modules/.pnpm/@noble+hashes@1.5.0/node_modules/@noble/hashes/src/_assert.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/node_modules/.pnpm/@noble+hashes@1.5.0/node_modules/@noble/hashes/src/_u64.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/node_modules/.pnpm/@noble+hashes@1.5.0/node_modules/@noble/hashes/src/crypto.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/node_modules/.pnpm/@noble+hashes@1.5.0/node_modules/@noble/hashes/src/utils.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/node_modules/.pnpm/@noble+hashes@1.5.0/node_modules/@noble/hashes/src/sha3.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/node_modules/.pnpm/@orama+cuid2@2.2.3/node_modules/@orama/cuid2/src/index.js","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/node_modules/.pnpm/@orama+cuid2@2.2.3/node_modules/@orama/cuid2/index.js","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/node_modules/.pnpm/@orama+orama@2.1.1/node_modules/@orama/orama/src/utils.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/node_modules/.pnpm/@orama+orama@2.1.1/node_modules/@orama/orama/src/components/defaults.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/src/client.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/src/answerSession.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/src/constants.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/src/utils.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/src/cache.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/package.json","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/src/sendBeacon.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/src/collector.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/src/heartbeat.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/src/profile.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/src/proxy.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/src/manager/constants.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/src/manager/index-manager.ts","../../../node_modules/.pnpm/@oramacloud+client@1.3.20_typescript@5.7.2_zod@3.24.0/node_modules/@oramacloud/client/src/manager/index.ts"],"sourcesContent":["import type { AnyOrama, SearchParams, TypedDocument, OramaPluginSync, PartialSchemaDeep } from '@orama/orama'\nimport { OramaProxy, EmbeddingModel, ChatModel } from '@oramacloud/client'\n\nexport type SecureProxyExtra = {\n proxy: OramaProxy\n pluginParams: SecureProxyPluginOptions\n}\n\nexport type LLMModel = ChatModel\n\nexport type SecureProxyPluginOptions = {\n apiKey: string\n embeddings: {\n defaultProperty: string\n model: EmbeddingModel,\n onInsert?: {\n generate: boolean\n properties: string[]\n verbose?: boolean\n }\n }\n chat?: {\n model: LLMModel\n }\n}\n\nfunction getPropertyValue (obj: object, path: string) {\n return path.split('.').reduce((current, key) => \n current && current[key] !== undefined ? current[key] : undefined, obj\n )\n}\n\n\nfunction getPropertiesValues(schema: object, properties: string[]) {\n return properties\n .map(prop => getPropertyValue(schema, prop))\n .filter(value => value !== undefined)\n .join('. ')\n}\n\nexport function pluginSecureProxy(pluginParams: SecureProxyPluginOptions): OramaPluginSync<SecureProxyExtra> {\n if (!pluginParams.apiKey) throw new Error('Missing \"apiKey\" parameter for plugin-secure-proxy')\n if (!pluginParams.embeddings.defaultProperty) throw new Error('Missing \"embeddings.defaultProperty\" parameter for plugin-secure-proxy')\n if (!pluginParams.embeddings.model) throw new Error('Missing \"embeddings.model\" parameter for plugin-secure-proxy')\n\n const proxy = new OramaProxy({\n api_key: pluginParams.apiKey\n })\n\n return {\n name: 'orama-secure-proxy',\n extra: {\n proxy,\n pluginParams\n },\n\n async beforeInsert<T extends TypedDocument<any>>(_db: AnyOrama, _id: string, params: PartialSchemaDeep<T>) {\n if (!pluginParams.embeddings?.onInsert?.generate) {\n return\n }\n\n if (!pluginParams.embeddings?.onInsert?.properties) {\n throw new Error('Missing \"embeddingsConfig.properties\" parameter for plugin-secure-proxy')\n }\n\n const properties = pluginParams.embeddings.onInsert.properties\n const values = getPropertiesValues(params, properties)\n\n if (pluginParams.embeddings.onInsert.verbose) {\n console.log(`Generating embeddings for properties ${properties.join(', ')}: ${values}`)\n }\n\n const embeddings = await proxy.generateEmbeddings(values, pluginParams.embeddings.model)\n\n params[pluginParams.embeddings.defaultProperty] = embeddings\n },\n \n async beforeSearch<T extends AnyOrama>(_db: AnyOrama, params: SearchParams<T, TypedDocument<any>>) {\n if (params.mode !== 'vector' && params.mode !== 'hybrid') {\n return\n }\n\n if (params?.vector?.value) {\n return\n }\n\n if (!params.term) {\n throw new Error('Neither \"term\" nor \"vector\" parameters were provided')\n }\n\n const term = params.term\n const embeddings = await proxy.generateEmbeddings(term, pluginParams.embeddings.model)\n\n if (!params.vector) {\n params.vector = {\n // eslint-disable-next-line\n // @ts-ignore\n property: params?.vector?.property ?? pluginParams.embeddings.defaultProperty,\n value: embeddings\n }\n }\n\n params.vector.value = embeddings\n }\n }\n}\n","function number(n: number) {\n if (!Number.isSafeInteger(n) || n < 0) throw new Error(`positive integer expected, not ${n}`);\n}\n\nfunction bool(b: boolean) {\n if (typeof b !== 'boolean') throw new Error(`boolean expected, not ${b}`);\n}\n\n// copied from utils\nexport function isBytes(a: unknown): a is Uint8Array {\n return (\n a instanceof Uint8Array ||\n (a != null && typeof a === 'object' && a.constructor.name === 'Uint8Array')\n );\n}\n\nfunction bytes(b: Uint8Array | undefined, ...lengths: number[]) {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error(`Uint8Array expected of length ${lengths}, not of length=${b.length}`);\n}\n\ntype Hash = {\n (data: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create: any;\n};\nfunction hash(h: Hash) {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be wrapped by utils.wrapConstructor');\n number(h.outputLen);\n number(h.blockLen);\n}\n\nfunction exists(instance: any, checkFinished = true) {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\nfunction output(out: any, instance: any) {\n bytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error(`digestInto() expects output buffer of length at least ${min}`);\n }\n}\n\nexport { number, bool, bytes, hash, exists, output };\n\nconst assert = { number, bool, bytes, hash, exists, output };\nexport default assert;\n","const U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n\n// We are not using BigUint64Array, because they are extremely slow as per 2022\nfunction fromBig(n: bigint, le = false) {\n if (le) return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n\nfunction split(lst: bigint[], le = false) {\n let Ah = new Uint32Array(lst.length);\n let Al = new Uint32Array(lst.length);\n for (let i = 0; i < lst.length; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\n\nconst toBig = (h: number, l: number) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h: number, _l: number, s: number) => h >>> s;\nconst shrSL = (h: number, l: number, s: number) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h: number, l: number, s: number) => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h: number, l: number, s: number) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h: number, l: number, s: number) => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h: number, l: number, s: number) => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h: number, l: number) => l;\nconst rotr32L = (h: number, _l: number) => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h: number, l: number, s: number) => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h: number, l: number, s: number) => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h: number, l: number, s: number) => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h: number, l: number, s: number) => (h << (s - 32)) | (l >>> (64 - s));\n\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(Ah: number, Al: number, Bh: number, Bl: number) {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al: number, Bl: number, Cl: number) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low: number, Ah: number, Bh: number, Ch: number) =>\n (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al: number, Bl: number, Cl: number, Dl: number) =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number) =>\n (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al: number, Bl: number, Cl: number, Dl: number, El: number) =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) =>\n (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n\n// prettier-ignore\nexport {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\n// prettier-ignore\nconst u64 = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n","// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// See utils.ts for details.\ndeclare const globalThis: Record<string, any> | undefined;\nexport const crypto =\n typeof globalThis === 'object' && 'crypto' in globalThis ? globalThis.crypto : undefined;\n","/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\nimport { bytes as abytes } from './_assert.js';\n// export { isBytes } from './_assert.js';\n// We can't reuse isBytes from _assert, because somehow this causes huge perf issues\nexport function isBytes(a: unknown): a is Uint8Array {\n return (\n a instanceof Uint8Array ||\n (a != null && typeof a === 'object' && a.constructor.name === 'Uint8Array')\n );\n}\n\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n// Cast array to different type\nexport const u8 = (arr: TypedArray) => new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\nexport const u32 = (arr: TypedArray) =>\n new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n\n// Cast array to view\nexport const createView = (arr: TypedArray) =>\n new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n\n// The rotate right (circular right shift) operation for uint32\nexport const rotr = (word: number, shift: number) => (word << (32 - shift)) | (word >>> shift);\n// The rotate left (circular left shift) operation for uint32\nexport const rotl = (word: number, shift: number) =>\n (word << shift) | ((word >>> (32 - shift)) >>> 0);\n\nexport const isLE = new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44;\n// The byte swap operation for uint32\nexport const byteSwap = (word: number) =>\n ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff);\n// Conditionally byte swap if on a big-endian platform\nexport const byteSwapIfBE = isLE ? (n: number) => n : (n: number) => byteSwap(n);\n\n// In place byte swap for Uint32Array\nexport function byteSwap32(arr: Uint32Array) {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n}\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n/**\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, _A: 65, _F: 70, _a: 97, _f: 102 } as const;\nfunction asciiToBase16(char: number): number | undefined {\n if (char >= asciis._0 && char <= asciis._9) return char - asciis._0;\n if (char >= asciis._A && char <= asciis._F) return char - (asciis._A - 10);\n if (char >= asciis._a && char <= asciis._f) return char - (asciis._a - 10);\n return;\n}\n\n/**\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('padded hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2;\n }\n return array;\n}\n\n// There is no setImmediate in browser and setTimeout is slow.\n// call of async fn will return Promise, which will be fullfiled only on\n// next scheduler queue processing step and this is exactly what we need.\nexport const nextTick = async () => {};\n\n// Returns control to thread each 'tick' ms to avoid blocking\nexport async function asyncLoop(iters: number, tick: number, cb: (i: number) => void) {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick) continue;\n await nextTick();\n ts += diff;\n }\n}\n\n// Global symbols in both browsers and Node.js since v11\n// See https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\n\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error(`utf8ToBytes expected string, got ${typeof str}`);\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\nexport type Input = Uint8Array | string;\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data: Input): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/**\n * Copies several Uint8Arrays into one.\n */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\n// For runtime check if class implements interface\nexport abstract class Hash<T extends Hash<T>> {\n abstract blockLen: number; // Bytes per block\n abstract outputLen: number; // Bytes in output\n abstract update(buf: Input): this;\n // Writes digest into buf\n abstract digestInto(buf: Uint8Array): void;\n abstract digest(): Uint8Array;\n /**\n * Resets internal state. Makes Hash instance unusable.\n * Reset is impossible for keyed hashes if key is consumed into state. If digest is not consumed\n * by user, they will need to manually call `destroy()` when zeroing is necessary.\n */\n abstract destroy(): void;\n /**\n * Clones hash instance. Unsafe: doesn't check whether `to` is valid. Can be used as `clone()`\n * when no options are passed.\n * Reasons to use `_cloneInto` instead of clone: 1) performance 2) reuse instance => all internal\n * buffers are overwritten => causes buffer overwrite which is used for digest in some cases.\n * There are no guarantees for clean-up because it's impossible in JS.\n */\n abstract _cloneInto(to?: T): T;\n // Safe version that clones internal state\n clone(): T {\n return this._cloneInto();\n }\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\nconst toStr = {}.toString;\ntype EmptyObj = {};\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && toStr.call(opts) !== '[object Object]')\n throw new Error('Options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\nexport type CHash = ReturnType<typeof wrapConstructor>;\n\nexport function wrapConstructor<T extends Hash<T>>(hashCons: () => Hash<T>) {\n const hashC = (msg: Input): Uint8Array => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\n\nexport function wrapConstructorWithOpts<H extends Hash<H>, T extends Object>(\n hashCons: (opts?: T) => Hash<H>\n) {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts: T) => hashCons(opts);\n return hashC;\n}\n\nexport function wrapXOFConstructorWithOpts<H extends HashXOF<H>, T extends Object>(\n hashCons: (opts?: T) => HashXOF<H>\n) {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts: T) => hashCons(opts);\n return hashC;\n}\n\n/**\n * Secure PRNG. Uses `crypto.getRandomValues`, which defers to OS.\n */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto && typeof crypto.randomBytes === 'function') {\n return crypto.randomBytes(bytesLength);\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n","import { bytes, exists, number, output } from './_assert.js';\nimport { rotlBH, rotlBL, rotlSH, rotlSL, split } from './_u64.js';\nimport {\n Hash,\n u32,\n Input,\n toBytes,\n wrapConstructor,\n wrapXOFConstructorWithOpts,\n HashXOF,\n isLE,\n byteSwap32,\n} from './utils.js';\n\n// SHA3 (keccak) is based on a new design: basically, the internal state is bigger than output size.\n// It's called a sponge function.\n\n// Various per round constants calculations\nconst SHA3_PI: number[] = [];\nconst SHA3_ROTL: number[] = [];\nconst _SHA3_IOTA: bigint[] = [];\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nconst _2n = /* @__PURE__ */ BigInt(2);\nconst _7n = /* @__PURE__ */ BigInt(7);\nconst _256n = /* @__PURE__ */ BigInt(256);\nconst _0x71n = /* @__PURE__ */ BigInt(0x71);\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n // Pi\n [x, y] = [y, (2 * x + 3 * y) % 5];\n SHA3_PI.push(2 * (5 * y + x));\n // Rotational\n SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n // Iota\n let t = _0n;\n for (let j = 0; j < 7; j++) {\n R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n if (R & _2n) t ^= _1n << ((_1n << /* @__PURE__ */ BigInt(j)) - _1n);\n }\n _SHA3_IOTA.push(t);\n}\nconst [SHA3_IOTA_H, SHA3_IOTA_L] = /* @__PURE__ */ split(_SHA3_IOTA, true);\n\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h: number, l: number, s: number) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));\nconst rotlL = (h: number, l: number, s: number) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));\n\n// Same as keccakf1600, but allows to skip some rounds\nexport function keccakP(s: Uint32Array, rounds: number = 24) {\n const B = new Uint32Array(5 * 2);\n // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n for (let round = 24 - rounds; round < 24; round++) {\n // Theta θ\n for (let x = 0; x < 10; x++) B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n for (let x = 0; x < 10; x += 2) {\n const idx1 = (x + 8) % 10;\n const idx0 = (x + 2) % 10;\n const B0 = B[idx0];\n const B1 = B[idx0 + 1];\n const Th = rotlH(B0, B1, 1) ^ B[idx1];\n const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n for (let y = 0; y < 50; y += 10) {\n s[x + y] ^= Th;\n s[x + y + 1] ^= Tl;\n }\n }\n // Rho (ρ) and Pi (π)\n let curH = s[2];\n let curL = s[3];\n for (let t = 0; t < 24; t++) {\n const shift = SHA3_ROTL[t];\n const Th = rotlH(curH, curL, shift);\n const Tl = rotlL(curH, curL, shift);\n const PI = SHA3_PI[t];\n curH = s[PI];\n curL = s[PI + 1];\n s[PI] = Th;\n s[PI + 1] = Tl;\n }\n // Chi (χ)\n for (let y = 0; y < 50; y += 10) {\n for (let x = 0; x < 10; x++) B[x] = s[y + x];\n for (let x = 0; x < 10; x++) s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n }\n // Iota (ι)\n s[0] ^= SHA3_IOTA_H[round];\n s[1] ^= SHA3_IOTA_L[round];\n }\n B.fill(0);\n}\n\nexport class Keccak extends Hash<Keccak> implements HashXOF<Keccak> {\n protected state: Uint8Array;\n protected pos = 0;\n protected posOut = 0;\n protected finished = false;\n protected state32: Uint32Array;\n protected destroyed = false;\n // NOTE: we accept arguments in bytes instead of bits here.\n constructor(\n public blockLen: number,\n public suffix: number,\n public outputLen: number,\n protected enableXOF = false,\n protected rounds: number = 24\n ) {\n super();\n // Can be passed from user as dkLen\n number(outputLen);\n // 1600 = 5x5 matrix of 64bit. 1600 bits === 200 bytes\n if (0 >= this.blockLen || this.blockLen >= 200)\n throw new Error('Sha3 supports only keccak-f1600 function');\n this.state = new Uint8Array(200);\n this.state32 = u32(this.state);\n }\n protected keccak() {\n if (!isLE) byteSwap32(this.state32);\n keccakP(this.state32, this.rounds);\n if (!isLE) byteSwap32(this.state32);\n this.posOut = 0;\n this.pos = 0;\n }\n update(data: Input) {\n exists(this);\n const { blockLen, state } = this;\n data = toBytes(data);\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n for (let i = 0; i < take; i++) state[this.pos++] ^= data[pos++];\n if (this.pos === blockLen) this.keccak();\n }\n return this;\n }\n protected finish() {\n if (this.finished) return;\n this.finished = true;\n const { state, suffix, pos, blockLen } = this;\n // Do the padding\n state[pos] ^= suffix;\n if ((suffix & 0x80) !== 0 && pos === blockLen - 1) this.keccak();\n state[blockLen - 1] ^= 0x80;\n this.keccak();\n }\n protected writeInto(out: Uint8Array): Uint8Array {\n exists(this, false);\n bytes(out);\n this.finish();\n const bufferOut = this.state;\n const { blockLen } = this;\n for (let pos = 0, len = out.length; pos < len; ) {\n if (this.posOut >= blockLen) this.keccak();\n const take = Math.min(blockLen - this.posOut, len - pos);\n out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n this.posOut += take;\n pos += take;\n }\n return out;\n }\n xofInto(out: Uint8Array): Uint8Array {\n // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n if (!this.enableXOF) throw new Error('XOF is not possible for this instance');\n return this.writeInto(out);\n }\n xof(bytes: number): Uint8Array {\n number(bytes);\n return this.xofInto(new Uint8Array(bytes));\n }\n digestInto(out: Uint8Array) {\n output(out, this);\n if (this.finished) throw new Error('digest() was already called');\n this.writeInto(out);\n this.destroy();\n return out;\n }\n digest() {\n return this.digestInto(new Uint8Array(this.outputLen));\n }\n destroy() {\n this.destroyed = true;\n this.state.fill(0);\n }\n _cloneInto(to?: Keccak): Keccak {\n const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n to ||= new Keccak(blockLen, suffix, outputLen, enableXOF, rounds);\n to.state32.set(this.state32);\n to.pos = this.pos;\n to.posOut = this.posOut;\n to.finished = this.finished;\n to.rounds = rounds;\n // Suffix can change in cSHAKE\n to.suffix = suffix;\n to.outputLen = outputLen;\n to.enableXOF = enableXOF;\n to.destroyed = this.destroyed;\n return to;\n }\n}\n\nconst gen = (suffix: number, blockLen: number, outputLen: number) =>\n wrapConstructor(() => new Keccak(blockLen, suffix, outputLen));\n\nexport const sha3_224 = /* @__PURE__ */ gen(0x06, 144, 224 / 8);\n/**\n * SHA3-256 hash function\n * @param message - that would be hashed\n */\nexport const sha3_256 = /* @__PURE__ */ gen(0x06, 136, 256 / 8);\nexport const sha3_384 = /* @__PURE__ */ gen(0x06, 104, 384 / 8);\nexport const sha3_512 = /* @__PURE__ */ gen(0x06, 72, 512 / 8);\nexport const keccak_224 = /* @__PURE__ */ gen(0x01, 144, 224 / 8);\n/**\n * keccak-256 hash function. Different from SHA3-256.\n * @param message - that would be hashed\n */\nexport const keccak_256 = /* @__PURE__ */ gen(0x01, 136, 256 / 8);\nexport const keccak_384 = /* @__PURE__ */ gen(0x01, 104, 384 / 8);\nexport const keccak_512 = /* @__PURE__ */ gen(0x01, 72, 512 / 8);\n\nexport type ShakeOpts = { dkLen?: number };\n\nconst genShake = (suffix: number, blockLen: number, outputLen: number) =>\n wrapXOFConstructorWithOpts<HashXOF<Keccak>, ShakeOpts>(\n (opts: ShakeOpts = {}) =>\n new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true)\n );\n\nexport const shake128 = /* @__PURE__ */ genShake(0x1f, 168, 128 / 8);\nexport const shake256 = /* @__PURE__ */ genShake(0x1f, 136, 256 / 8);\n","/* global global, window, module */\nconst { sha3_512: sha3 } = require(\"@noble/hashes/sha3\");\n\nconst defaultLength = 24;\nconst bigLength = 32;\n\nconst createEntropy = (length = 4, random = Math.random) => {\n let entropy = \"\";\n\n while (entropy.length < length) {\n entropy = entropy + Math.floor(random() * 36).toString(36);\n }\n return entropy;\n};\n\n/*\n * Adapted from https://github.com/juanelas/bigint-conversion\n * MIT License Copyright (c) 2018 Juan Hernández Serrano\n */\nfunction bufToBigInt(buf) {\n let bits = BigInt(8);\n\n let value = BigInt(0);\n for (const i of buf.values()) {\n const bi = BigInt(i);\n value = (value << bits) + bi;\n }\n return value;\n}\n\nconst hash = (input = \"\") => {\n // Drop the first character because it will bias the histogram\n // to the left.\n return bufToBigInt(sha3(input)).toString(36).slice(1);\n};\n\nconst alphabet = Array.from({ length: 26 }, (x, i) =>\n String.fromCharCode(i + 97)\n);\n\nconst randomLetter = (random) =>\n alphabet[Math.floor(random() * alphabet.length)];\n\n/*\nThis is a fingerprint of the host environment. It is used to help\nprevent collisions when generating ids in a distributed system.\nIf no global object is available, you can pass in your own, or fall back\non a random string.\n*/\nconst createFingerprint = ({\n globalObj = typeof global !== \"undefined\"\n ? global\n : typeof window !== \"undefined\"\n ? window\n : {},\n random = Math.random,\n} = {}) => {\n const globals = Object.keys(globalObj).toString();\n const sourceString = globals.length\n ? globals + createEntropy(bigLength, random)\n : createEntropy(bigLength, random);\n\n return hash(sourceString).substring(0, bigLength);\n};\n\nconst createCounter = (count) => () => {\n return count++;\n};\n\n// ~22k hosts before 50% chance of initial counter collision\n// with a remaining counter range of 9.0e+15 in JavaScript.\nconst initialCountMax = 476782367;\n\nconst init = ({\n // Fallback if the user does not pass in a CSPRNG. This should be OK\n // because we don't rely solely on the random number generator for entropy.\n // We also use the host fingerprint, current time, and a session counter.\n random = Math.random,\n counter = createCounter(Math.floor(random() * initialCountMax)),\n length = defaultLength,\n fingerprint = createFingerprint({ random }),\n} = {}) => {\n return function cuid2() {\n const firstLetter = randomLetter(random);\n\n // If we're lucky, the `.toString(36)` calls may reduce hashing rounds\n // by shortening the input to the hash function a little.\n const time = Date.now().toString(36);\n const count = counter().toString(36);\n\n // The salt should be long enough to be globally unique across the full\n // length of the hash. For simplicity, we use the same length as the\n // intended id output.\n const salt = createEntropy(length, random);\n const hashInput = `${time + salt + count + fingerprint}`;\n\n return `${firstLetter + hash(hashInput).substring(1, length)}`;\n };\n};\n\nconst createId = init();\n\nconst isCuid = (id, { minLength = 2, maxLength = bigLength } = {}) => {\n const length = id.length;\n const regex = /^[a-z][0-9a-z]+$/;\n\n try {\n if (\n typeof id === \"string\" &&\n length >= minLength &&\n length <= maxLength &&\n regex.test(id)\n )\n return true;\n } finally {\n }\n\n return false;\n};\n\nmodule.exports.getConstants = () => ({ defaultLength, bigLength });\nmodule.exports.init = init;\nmodule.exports.createId = createId;\nmodule.exports.bufToBigInt = bufToBigInt;\nmodule.exports.createCounter = createCounter;\nmodule.exports.createFingerprint = createFingerprint;\nmodule.exports.isCuid = isCuid;\n","const { createId, init, getConstants, isCuid } = require(\"./src/index\");\n\nmodule.exports.createId = createId;\nmodule.exports.init = init;\nmodule.exports.getConstants = getConstants;\nmodule.exports.isCuid = isCuid;\n","import type { AnyDocument, GeosearchDistanceUnit, Results, SearchableValue, TokenScore } from './types.js'\nimport { createError } from './errors.js'\n\nconst baseId = Date.now().toString().slice(5)\nlet lastId = 0\n\nconst k = 1024\nconst nano = BigInt(1e3)\nconst milli = BigInt(1e6)\nconst second = BigInt(1e9)\n\nexport const isServer = typeof window === 'undefined'\n\n/**\n * This value can be increased up to 100_000\n * But i don't know if this value change from nodejs to nodejs\n * So I will keep a safer value here.\n */\nexport const MAX_ARGUMENT_FOR_STACK = 65535\n\n/**\n * This method is needed to used because of issues like: https://github.com/askorama/orama/issues/301\n * that issue is caused because the array that is pushed is huge (>100k)\n *\n * @example\n * ```ts\n * safeArrayPush(myArray, [1, 2])\n * ```\n */\nexport function safeArrayPush<T>(arr: T[], newArr: T[]): void {\n if (newArr.length < MAX_ARGUMENT_FOR_STACK) {\n Array.prototype.push.apply(arr, newArr)\n } else {\n const newArrLength = newArr.length\n for (let i = 0; i < newArrLength; i += MAX_ARGUMENT_FOR_STACK) {\n Array.prototype.push.apply(arr, newArr.slice(i, i + MAX_ARGUMENT_FOR_STACK))\n }\n }\n}\n\nexport function sprintf(template: string, ...args: Array<string | number>): string {\n return template.replace(\n /%(?:(?<position>\\d+)\\$)?(?<width>-?\\d*\\.?\\d*)(?<type>[dfs])/g,\n function (...replaceArgs: Array<string | number | Record<string, string>>): string {\n const groups = replaceArgs[replaceArgs.length - 1] as Record<string, string>\n const { width: rawWidth, type, position } = groups\n\n const replacement = position ? args[Number.parseInt(position) - 1]! : args.shift()!\n const width = rawWidth === '' ? 0 : Number.parseInt(rawWidth)\n\n switch (type) {\n case 'd':\n return replacement.toString().padStart(width, '0')\n case 'f': {\n let value = replacement\n const [padding, precision] = rawWidth.split('.').map((w) => Number.parseFloat(w))\n\n if (typeof precision === 'number' && precision >= 0) {\n value = (value as number).toFixed(precision)\n }\n\n return typeof padding === 'number' && padding >= 0 ? value.toString().padStart(width, '0') : value.toString()\n }\n case 's':\n return width < 0\n ? (replacement as string).toString().padEnd(-width, ' ')\n : (replacement as string).toString().padStart(width, ' ')\n\n default:\n return replacement as string\n }\n }\n )\n}\n\nexport async function formatBytes(bytes: number, decimals = 2): Promise<string> {\n if (bytes === 0) {\n return '0 Bytes'\n }\n const dm = decimals < 0 ? 0 : decimals\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`\n}\n\nexport function isInsideWebWorker(): boolean {\n // @ts-expect-error - WebWorker global scope\n return typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope\n}\n\nexport function isInsideNode(): boolean {\n return typeof process !== 'undefined' && process.release && process.release.name === 'node'\n}\n\nexport function getNanosecondTimeViaPerformance() {\n return BigInt(Math.floor(performance.now() * 1e6))\n}\n\nexport async function formatNanoseconds(value: number | bigint): Promise<string> {\n if (typeof value === 'number') {\n value = BigInt(value)\n }\n\n if (value < nano) {\n return `${value}ns`\n } else if (value < milli) {\n return `${value / nano}μs`\n } else if (value < second) {\n return `${value / milli}ms`\n }\n\n return `${value / second}s`\n}\n\n// TODO: none of these operations is async. Should we change the signature of this function?\nexport async function getNanosecondsTime(): Promise<bigint> {\n if (isInsideWebWorker()) {\n return getNanosecondTimeViaPerformance()\n }\n\n if (isInsideNode()) {\n return process.hrtime.bigint()\n }\n\n if (typeof process !== 'undefined' && typeof process?.hrtime?.bigint === 'function') {\n return process.hrtime.bigint()\n }\n\n if (typeof performance !== 'undefined') {\n return getNanosecondTimeViaPerformance()\n }\n\n // @todo: fallback to V8 native method to get microtime\n return BigInt(0)\n}\n\nexport async function uniqueId(): Promise<string> {\n return `${baseId}-${lastId++}`\n}\n\nexport function getOwnProperty<T = unknown>(object: Record<string, T>, property: string): T | undefined {\n // Checks if `hasOwn` method is defined avoiding errors with older Node.js versions\n if (Object.hasOwn === undefined) {\n return Object.prototype.hasOwnProperty.call(object, property) ? object[property] : undefined\n }\n\n return Object.hasOwn(object, property) ? object[property] : undefined\n}\n\nexport function getTokenFrequency(token: string, tokens: string[]): number {\n let count = 0\n\n for (const t of tokens) {\n if (t === token) {\n count++\n }\n }\n\n return count\n}\n\nexport function insertSortedValue(\n arr: TokenScore[],\n el: TokenScore,\n compareFn = sortTokenScorePredicate\n): TokenScore[] {\n let low = 0\n let high = arr.length\n let mid\n\n while (low < high) {\n mid = (low + high) >>> 1\n if (compareFn(el, arr[mid]) < 0) {\n high = mid\n } else {\n low = mid + 1\n }\n }\n\n arr.splice(low, 0, el)\n\n return arr\n}\n\nexport function sortTokenScorePredicate(a: TokenScore, b: TokenScore): number {\n if (b[1] === a[1]) {\n return a[0] - b[0]\n }\n\n return b[1] - a[1]\n}\n\n// Intersection function taken from https://github.com/lovasoa/fast_array_intersect.\n// MIT Licensed at the time of writing.\nexport function intersect<T>(arrays: Array<readonly T[]>): T[] {\n if (arrays.length === 0) {\n return []\n } else if (arrays.length === 1) {\n return arrays[0] as T[]\n }\n\n for (let i = 1; i < arrays.length; i++) {\n if (arrays[i].length < arrays[0].length) {\n const tmp = arrays[0]\n arrays[0] = arrays[i]\n arrays[i] = tmp\n }\n }\n\n const set = new Map()\n for (const elem of arrays[0]) {\n set.set(elem, 1)\n }\n for (let i = 1; i < arrays.length; i++) {\n let found = 0\n for (const elem of arrays[i]) {\n const count = set.get(elem)\n if (count === i) {\n set.set(elem, count + 1)\n found++\n }\n }\n if (found === 0) return []\n }\n\n return arrays[0].filter((e) => {\n const count = set.get(e)\n if (count !== undefined) set.set(e, 0)\n return count === arrays.length\n })\n}\n\nexport async function getDocumentProperties(\n doc: AnyDocument,\n paths: string[]\n): Promise<Record<string, SearchableValue>> {\n const properties: Record<string, SearchableValue> = {}\n\n const pathsLength = paths.length\n for (let i = 0; i < pathsLength; i++) {\n const path = paths[i]\n const pathTokens = path.split('.')\n\n let current: SearchableValue | AnyDocument | undefined = doc\n const pathTokensLength = pathTokens.length\n for (let j = 0; j < pathTokensLength; j++) {\n current = current[pathTokens[j]!]\n\n // We found an object but we were supposed to be done\n if (typeof current === 'object') {\n if (\n current !== null &&\n 'lat' in current &&\n 'lon' in current &&\n typeof current.lat === 'number' &&\n typeof current.lon === 'number'\n ) {\n current = properties[path] = current as SearchableValue\n break\n } else if (!Array.isArray(current) && current !== null && j === pathTokensLength - 1) {\n current = undefined\n break\n }\n } else if ((current === null || typeof current !== 'object') && j < pathTokensLength - 1) {\n // We can't recurse anymore but we were supposed to\n current = undefined\n break\n }\n }\n\n if (typeof current !== 'undefined') {\n properties[path] = current as SearchableValue\n }\n }\n\n return properties\n}\n\nexport async function getNested<T = SearchableValue>(obj: object, path: string): Promise<T | undefined> {\n const props = await getDocumentProperties(obj as AnyDocument, [path])\n\n return props[path] as T | undefined\n}\n\nexport function flattenObject(obj: object, prefix = ''): AnyDocument {\n const result: AnyDocument = {}\n\n for (const key in obj) {\n const prop = `${prefix}${key}`\n const objKey = (obj as AnyDocument)[key]\n\n if (typeof objKey === 'object' && objKey !== null) {\n Object.assign(result, flattenObject(objKey, `${prop}.`))\n } else {\n result[prop] = objKey\n }\n }\n return result\n}\n\nconst mapDistanceToMeters = {\n cm: 0.01,\n m: 1,\n km: 1000,\n ft: 0.3048,\n yd: 0.9144,\n mi: 1609.344\n}\n\nexport function convertDistanceToMeters(distance: number, unit: GeosearchDistanceUnit): number {\n const ratio = mapDistanceToMeters[unit]\n\n if (ratio === undefined) {\n throw new Error(createError('INVALID_DISTANCE_SUFFIX', distance).message)\n }\n\n return distance * ratio\n}\n\nexport function removeVectorsFromHits(searchResult: Results<AnyDocument>, vectorProperties: string[]): void {\n searchResult.hits = searchResult.hits.map((result) => ({\n ...result,\n document: {\n ...result.document,\n // Remove embeddings from the result\n ...vectorProperties.reduce((acc, prop) => {\n const path = prop.split('.')\n const lastKey = path.pop()!\n let obj = acc\n for (const key of path) {\n obj[key] = obj[key] ?? {}\n obj = obj[key] as any\n }\n obj[lastKey] = null\n return acc\n }, result.document)\n }\n }))\n}\n","import { createError } from '../errors.js'\nimport { Point } from '../trees/bkd.js'\nimport {\n AnyDocument,\n AnyOrama,\n ArraySearchableType,\n ElapsedTime,\n ScalarSearchableType,\n SearchableType,\n TypedDocument,\n Vector\n} from '../types.js'\nimport { formatNanoseconds, uniqueId } from '../utils.js'\n\nexport { getDocumentProperties } from '../utils.js'\n\nexport async function formatElapsedTime(n: bigint): Promise<ElapsedTime> {\n return {\n raw: Number(n),\n formatted: await formatNanoseconds(n)\n }\n}\n\nexport async function getDocumentIndexId(doc: AnyDocument): Promise<string> {\n if (doc.id) {\n if (typeof doc.id !== 'string') {\n throw createError('DOCUMENT_ID_MUST_BE_STRING', typeof doc.id)\n }\n\n return doc.id\n }\n\n return await uniqueId()\n}\n\nexport async function validateSchema<T extends AnyOrama, ResultDocument extends TypedDocument<T>>(\n doc: ResultDocument,\n schema: T['schema']\n): Promise<string | undefined> {\n for (const [prop, type] of Object.entries(schema)) {\n const value = doc[prop]\n\n if (typeof value === 'undefined') {\n continue\n }\n\n if (\n type === 'geopoint' &&\n typeof value === 'object' &&\n typeof value.lon === 'number' &&\n typeof value.lat === 'number'\n ) {\n continue\n }\n\n if (type === 'enum' && (typeof value === 'string' || typeof value === 'number')) {\n continue\n }\n if (type === 'enum[]' && Array.isArray(value)) {\n const valueLength = value.length\n for (let i = 0; i < valueLength; i++) {\n if (typeof value[i] !== 'string' && typeof value[i] !== 'number') {\n return prop + '.' + i\n }\n }\n continue\n }\n\n if (isVectorType(type)) {\n const vectorSize = getVectorSize(type)\n if (!Array.isArray(value) || value.length !== vectorSize) {\n throw createError('INVALID_INPUT_VECTOR', prop, vectorSize, value.length)\n }\n continue\n }\n\n if (isArrayType(type)) {\n if (!Array.isArray(value)) {\n return prop\n }\n const expectedType = getInnerType(type)\n\n const valueLength = value.length\n for (let i = 0; i < valueLength; i++) {\n if (typeof value[i] !== expectedType) {\n return prop + '.' + i\n }\n }\n\n continue\n }\n\n if (typeof type === 'object') {\n if (!value || typeof value !== 'object') {\n return prop\n }\n\n // using as ResultDocument is not exactly right but trying to be type-safe here is not useful\n const subProp = await validateSchema(value as ResultDocument, type)\n if (subProp) {\n return prop + '.' + subProp\n }\n continue\n }\n\n if (typeof value !== type) {\n return prop\n }\n }\n\n return undefined\n}\n\nconst IS_ARRAY_TYPE: Record<SearchableType, boolean> = {\n string: false,\n number: false,\n boolean: false,\n enum: false,\n geopoint: false,\n 'string[]': true,\n 'number[]': true,\n 'boolean[]': true,\n 'enum[]': true\n}\n\nconst INNER_TYPE: Record<ArraySearchableType, ScalarSearchableType> = {\n 'string[]': 'string',\n 'number[]': 'number',\n 'boolean[]': 'boolean',\n 'enum[]': 'enum'\n}\n\nexport function isGeoPointType(type: unknown): type is Point {\n return type === 'geopoint'\n}\n\nexport function isVectorType(type: unknown): type is Vector {\n return typeof type === 'string' && /^vector\\[\\d+\\]$/.test(type)\n}\n\nexport function isArrayType(type: unknown): type is ArraySearchableType {\n return typeof type === 'string' && IS_ARRAY_TYPE[type]\n}\n\nexport function getInnerType(type: ArraySearchableType): ScalarSearchableType {\n return INNER_TYPE[type]\n}\n\nexport function getVectorSize(type: string): number {\n const size = Number(type.slice(7, -1))\n\n switch (true) {\n case isNaN(size):\n throw createError('INVALID_VECTOR_VALUE', type)\n case size <= 0:\n throw createError('INVALID_VECTOR_SIZE', type)\n default:\n return size\n }\n}\n","import type { Endpoint, IOramaClient, Method, OramaInitResponse, HeartBeatConfig, OramaError, Override, IOramaClientMultiSearch } from './types.js'\nimport type { SearchParams, Results, AnyDocument, AnyOrama, Nullable, InternalTypedDocument } from '@orama/orama'\nimport type { Message, InferenceType, Interaction } from './answerSession.js'\nimport { formatElapsedTime } from '@orama/orama/components'\nimport { createId } from '@orama/cuid2'\n\nimport { AnswerSession } from './answerSession.js'\nimport { Cache } from './cache.js'\nimport * as CONST from './constants.js'\nimport { Collector } from './collector.js'\nimport { HeartBeat } from './heartbeat.js'\nimport { version } from '../package.json'\nimport { Profile } from './profile.js'\nimport { MULTI_INDEX_BASE } from './constants.js'\n\nexport interface SearchConfig {\n abortController?: AbortController\n abortSignal?: AbortSignal\n fresh?: boolean\n debounce?: number\n}\n\nexport type SearchMode = 'fulltext' | 'vector' | 'hybrid'\n\ntype AdditionalSearchParams = {\n mode?: SearchMode\n returning?: string[],\n mergeResults?: boolean\n}\n\nexport type AnswerParams = {\n type: 'documentation'\n query: string\n messages: Array<{ role: 'user' | 'system'; content: string }>\n context: Results<any>['hits']\n}\n\nexport type SortByClauseUnion = SortByClause | SortByClause[]\n\ntype Order = 'ASC' | 'DESC' | 'asc' | 'desc'\n\ntype SortByClause = {\n property: string\n order?: Order\n}\n\nexport type ClientSearchParams = Override<SearchParams<AnyOrama>, { sortBy?: SortByClauseUnion }> & AdditionalSearchParams\nexport type OramaClientSearchResult<M> = M extends true ? Results<DocumentType> : Results<DocumentType>[] \n\nexport type AnswerSessionParams = {\n inferenceType?: InferenceType\n initialMessages?: Message[]\n userContext?: unknown\n events?: {\n onMessageChange?: (messages: Message[]) => void\n onMessageLoading?: (receivingMessage: boolean) => void\n onAnswerAborted?: (aborted: true) => void\n onSourceChange?: <T = AnyDocument>(sources: Results<T>) => void\n onQueryTranslated?: (query: SearchParams<AnyOrama>) => void\n onRelatedQueries?: (relatedQueries: string[]) => void\n onNewInteractionStarted?: (interactionId: string) => void\n onStateChange?: (state: Interaction[]) => void\n }\n systemPrompts?: string[]\n}\n\nexport { AnswerSession, type Message }\n\nfunction isAbortController(signal: AbortSignal | AbortController | undefined): signal is AbortController {\n return signal !== undefined && (signal as AbortController)?.signal !== undefined\n}\n\nexport class OramaClient<M extends boolean = true> {\n private readonly id = createId()\n private readonly api_key: string\n private readonly endpoint: string\n private readonly multiIndexSearch: boolean\n private readonly mergeResults: M\n private readonly multiIndexIndexes?: IOramaClientMultiSearch<M>['indexes'] \n private readonly answersApiBaseURL: string | undefined\n private readonly collector?: Collector\n private readonly cache?: Cache<OramaClientSearchResult<M>>\n private readonly profile: Profile\n private searchDebounceTimer?: any // NodeJS.Timer\n private searchRequestCounter = 0\n private blockSearchTillAuth = false\n\n private heartbeat?: HeartBeat\n private initPromise?: Promise<OramaInitResponse | null>\n\n constructor(params: IOramaClient | IOramaClientMultiSearch<M>) {\n //TODO: fix this once we can handle multi search telemetry\n if('indexes' in params) {\n //this telemetry will be wrong\n this.api_key = params.indexes[0].api_key\n this.multiIndexIndexes = params.indexes\n\n //check indexes for endpoint\n const firstEndpointOrigin = (new URL(params.indexes[0].endpoint)).origin\n if(params.indexes.some(i => (new URL(i.endpoint)).origin !== firstEndpointOrigin)){\n throw new Error('All indexes must have the same endpoint origin')\n }\n this.endpoint = firstEndpointOrigin + MULTI_INDEX_BASE\n this.multiIndexSearch = true\n this.mergeResults = params.mergeResults ?? true as M\n }else{\n this.api_key = params.api_key\n this.endpoint = params.endpoint\n this.multiIndexSearch = false\n //shouldn't matter for single results\n this.mergeResults = true as M\n }\n\n this.answersApiBaseURL = params.answersApiBaseURL\n\n // Enable profile tracking\n this.profile = new Profile({ endpoint: this.endpoint, apiKey: this.api_key })\n\n // Telemetry is enabled by default\n if (params.telemetry !== false) {\n const telementryConfig = {\n id: this.id,\n api_key: this.api_key,\n flushInterval: params.telemetry?.flushInterval ?? CONST.DEFAULT_TELEMETRY_FLUSH_INTERVAL,\n flushSize: params.telemetry?.flushSize ?? CONST.DEFAULT_TELEMETRY_FLUSH_SIZE\n }\n this.collector = Collector.create(telementryConfig, this.profile)\n }\n\n // Cache is enabled by default\n if (params.cache !== false) {\n const cacheParams = {}\n this.cache = new Cache<OramaClientSearchResult<M>>(cacheParams)\n }\n\n this.init()\n }\n\n private customerUserToken: string | undefined = undefined\n private searchToken: string | undefined = undefined\n public setAuthToken(customerAuthToken: string | null) {\n if (customerAuthToken === null) {\n // unlogged user\n this.customerUserToken = undefined\n this.searchToken = undefined\n } else {\n this.customerUserToken = customerAuthToken\n // forgot the previous search token\n this.searchToken = undefined\n }\n // Re-do the init\n this.init()\n }\n\n private onAuthTokenExpired?: (token: string) => void\n public setOnAuthTokenExpired(onAuthTokenExpired: (token: string) => void) {\n this.onAuthTokenExpired = onAuthTokenExpired\n }\n\n private addSearchResultsToCollector(searchResults: Nullable<OramaClientSearchResult<M>>, roundTripTime: number, query: ClientSearchParams, cached: boolean) {\n if (this.collector) {\n if(Array.isArray(searchResults)){\n for(const sr of searchResults){\n this.collector.add({\n rawSearchString: query.term,\n resultsCount: sr.hits?.length ?? 0,\n roundTripTime,\n query,\n cached,\n searchedAt: new Date(),\n userId: this.profile.getUserId()\n })\n }\n }else{\n this.collector.add({\n rawSearchString: query.term,\n resultsCount: searchResults?.hits?.length ?? 0,\n roundTripTime,\n query,\n cached,\n searchedAt: new Date(),\n userId: this.profile.getUserId()\n })\n }\n }\n }\n\n public async search(query: ClientSearchParams, config?: SearchConfig): Promise<Nullable<OramaClientSearchResult<M>>>\n public async search<SchemaType extends object, DocumentType extends InternalTypedDocument<SchemaType> = InternalTypedDocument<SchemaType>>(\n query: ClientSearchParams,\n config?: SearchConfig,\n ): Promise<Nullable<OramaClientSearchResult<M>>> {\n await this.initPromise\n\n // Avoid perform search if the user is not authenticated yet\n if (this.blockSearchTillAuth) {\n console.warn('Search request blocked until user is authenticated')\n return null\n }\n\n const currentRequestNumber = ++this.searchRequestCounter\n const cacheKey = `search-${JSON.stringify(query)}`\n\n let searchResults: Nullable<OramaClientSearchResult<M>> = null\n let roundTripTime: number\n let cached = false\n const shouldUseCache = config?.fresh !== true && this.cache?.has(cacheKey)\n\n const performSearch = async () => {\n try {\n const timeStart = Date.now()\n if(this.multiIndexSearch){\n searchResults = await this.fetch<OramaClientSearchResult<M>>('multi_search', 'POST', { q: {...query, mergeResults: this.mergeResults}, sst: this.searchToken, indexes: this.multiIndexIndexes }, config?.abortController)\n }else{ \n searchResults = await this.fetch<OramaClientSearchResult<M>>('search', 'POST', { q: query, sst: this.searchToken }, config?.abortController)\n }\n const timeEnd = Date.now()\n roundTripTime = timeEnd - timeStart\n const elapsed = await formatElapsedTime(BigInt(timeEnd * CONST.MICROSECONDS_BASE - timeStart * CONST.MICROSECONDS_BASE))\n if(!Array.isArray(searchResults)){\n searchResults.elapsed = elapsed\n }else{\n for(const sr of searchResults){\n sr.elapsed = elapsed\n }\n }\n this.cache?.set(cacheKey, searchResults)\n } catch (error: any) {\n if (error.name !== 'AbortError') {\n console.error('Search request failed', error)\n throw error\n }\n }\n this.addSearchResultsToCollector(searchResults, roundTripTime, query, cached)\n\n\n return searchResults\n }\n\n if (shouldUseCache && this.cache) {\n roundTripTime = 0\n searchResults = this.cache.get(cacheKey) as OramaClientSearchResult<M>\n cached = true\n this.addSearchResultsToCollector(searchResults, roundTripTime, query, cached)\n } else {\n if (config?.debounce) {\n return new Promise((resolve, reject) => {\n clearTimeout(this.searchDebounceTimer)\n this.searchDebounceTimer = setTimeout(\n async () => {\n try {\n await performSearch()\n resolve(searchResults)\n } catch (error) {\n if ((error as any).name !== 'AbortError') {\n console.error('Search request failed', error)\n reject(error)\n }\n }\n },\n config?.debounce || 300\n )\n if ('unref' in this.searchDebounceTimer) {\n this.searchDebounceTimer.unref()\n }\n })\n }\n return performSearch()\n }\n\n if (currentRequestNumber === this.searchRequestCounter) {\n return searchResults\n }\n\n return null\n }\n\n public async vectorSearch(query: ClientSearchParams, config?: SearchConfig): Promise<Pick<Results<AnyDocument>, 'hits' | 'elapsed'>> {\n await this.initPromise\n\n const cacheKey = `vectorSearch-${JSON.stringify(query)}`\n\n let roundTripTime: number\n let searchResults: Results<AnyDocument>\n let cached = false\n\n const shouldUseCache = config?.fresh !== true && this.cache?.has(cacheKey)\n if (shouldUseCache === true && this.cache != null) {\n roundTripTime = 0\n searchResults = this.cache.get(cacheKey) as Results<AnyDocument>\n cached = true\n } else {\n const timeStart = Date.now()\n searchResults = await this.fetch<Results<AnyDocument>>('vector-search2', 'POST', { q: query }, config?.abortSignal ?? config?.abortController)\n const timeEnd = Date.now()\n\n searchResults.elapsed = await formatElapsedTime(BigInt(timeEnd * CONST.MICROSECONDS_BASE - timeStart * CONST.MICROSECONDS_BASE))\n roundTripTime = timeEnd - timeStart\n\n this.cache?.set(cacheKey, searchResults as OramaClientSearchResult<M>) \n }\n\n if (this.collector != null) {\n this.collector.add({\n rawSearchString: query.term,\n resultsCount: searchResults.hits?.length ?? 0,\n roundTripTime,\n query,\n cached,\n searchedAt: new Date(),\n userId: this.profile.getUserId()\n })\n }\n\n return searchResults\n }\n\n public createAnswerSession(params?: AnswerSessionParams) {\n return new AnswerSession({\n inferenceType: params?.inferenceType || 'documentation',\n initialMessages: params?.initialMessages || [],\n oramaClient: this,\n events: params?.events,\n userContext: params?.userContext,\n systemPrompts: params?.systemPrompts ?? []\n })\n }\n\n public startHeartBeat(config: HeartBeatConfig): void {\n this.heartbeat?.stop()\n this.heartbeat = new HeartBeat({\n ...config,\n endpoint: `${this.endpoint}/health?api-key=${this.api_key}`\n })\n this.heartbeat.start()\n }\n\n public stopHeartBeat(): void {\n this.heartbeat?.stop()\n }\n\n public async getPop(): Promise<string> {\n const g = await this.initPromise\n return g?.pop ?? ''\n }\n\n private expirationTimer: ReturnType<typeof setTimeout> | undefined\n private init(): void {\n let fetchParams: [Endpoint, Method, object?, AbortController?, Record<string,any>?] = [\n 'init',\n 'GET',\n undefined,\n undefined,\n { token: this.customerUserToken }\n ]\n\n if(this.multiIndexSearch){\n fetchParams = [\n 'init_multi_search',\n 'POST',\n { indexes: this.multiIndexIndexes },\n undefined,\n { token: this.customerUserToken }\n ]\n }\n this.initPromise = this.fetch<OramaInitResponse>(...fetchParams).then((b: OramaInitResponse) => {\n this.collector?.setParams({\n endpoint: b.collectUrl,\n deploymentID: b.deploymentID,\n index: b.index\n })\n\n this.profile?.setParams({\n identifyUrl: b.collectUrl,\n index: b.index\n })\n\n if (b.searchSession) {\n if ('required' in b.searchSession && b.searchSession.required === true) {\n this.blockSearchTillAuth = true\n } else if ('token' in b.searchSession) {\n const searchToken = b.searchSession.token\n this.searchToken = searchToken\n const maxAge = b.searchSession.maxAge\n this.blockSearchTillAuth = false\n\n if (this.expirationTimer) {\n clearTimeout(this.expirationTimer)\n }\n this.expirationTimer = setTimeout(() => {\n if (this.searchToken === searchToken) {\n this.searchToken = undefined\n this.blockSearchTillAuth = true\n this.onAuthTokenExpired?.(searchToken)\n }\n }, maxAge * 1000)\n if ('unref' in this.expirationTimer) {\n this.expirationTimer.unref()\n }\n }\n }\n\n return b\n })\n .catch((err) => {\n console.log(err)\n return null\n })\n }\n\n private async fetch<T = unknown>(\n path: Endpoint,\n method: Method,\n body?: object,\n abort?: AbortController | AbortSignal,\n queryParams?: Record<string, string | undefined>\n ): Promise<T> {\n const abortSignal = isAbortController(abort) ? abort?.signal : abort\n if (abortSignal?.aborted === true) {\n throw new Error('Request aborted')\n }\n\n const requestOptions: RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n // Unfortunatelly we can't send this headers otherwise we should pay CORS preflight request\n // 'x-orama-instance-id': this.id,\n // 'x-orama-version': version\n },\n signal: abortSignal\n }\n\n if (method === 'POST' && body !== undefined) {\n const b = body as any\n b.version = version\n b.id = this.id\n b.visitorId = this.profile.getUserId()\n\n requestOptions.body = Object.entries(b)\n .filter(([_, value]) => !!value)\n .map(([key, value]) => `${key}=${encodeURIComponent(JSON.stringify(value))}`)\n .join('&')\n }\n\n const url = new URL(`${this.endpoint}/${path}`)\n if(!this.multiIndexSearch){\n url.searchParams.append('api-key', this.api_key)\n }\n if (queryParams) {\n for (const [key, value] of Object.entries(queryParams)) {\n if (value) {\n url.searchParams.append(key, value)\n }\n }\n }\n const res: Response = await fetch(url, requestOptions)\n\n if (!res.ok) {\n const error = new Error() as OramaError\n error.httpResponse = res\n throw error\n }\n\n return await res.json()\n }\n\n /**\n * Methods associated with profile tracking\n */\n public getIdentity(): string | undefined {\n return this.profile.getIdentity()\n }\n\n public getUserId(): string {\n return this.profile.getUserId()\n }\n\n public getAlias(): string | undefined {\n return this.profile.getAlias()\n }\n\n public async identify(identity: string): Promise<void> {\n if (this.initPromise === undefined) {\n throw new Error('OramaClient not initialized')\n }\n\n await this.profile.identify(this.initPromise, identity)\n }\n\n public async alias(alias: string): Promise<void> {\n if (this.initPromise === undefined) {\n throw new Error('OramaClient not initialized')\n }\n\n await this.profile.alias(this.initPromise, alias)\n }\n\n public reset(): void {\n this.profile.reset()\n }\n}\n","import type { Results, AnyDocument, SearchParams, AnyOrama, Nullable } from '@orama/orama'\nimport { createId } from '@orama/cuid2'\nimport { ORAMA_ANSWER_ENDPOINT } from './constants.js'\nimport type { OramaClient } from './client.js'\nimport { parseSSE, serializeUserContext } from './utils.js'\n\nexport type Context = Results<AnyDocument>['hits']\n\nexport type Message = {\n role: 'user' | 'assistant'\n content: string\n}\n\nexport type InferenceType = 'documentation'\n\nexport type AnswerParams<M extends boolean, UserContext = unknown> = {\n initialMessages: Message[]\n inferenceType: InferenceType\n oramaClient: OramaClient<M>\n userContext?: UserContext\n events?: {\n onMessageChange?: (messages: Message[]) => void\n onMessageLoading?: (receivingMessage: boolean) => void\n onAnswerAborted?: (aborted: true) => void\n onSourceChange?: <T = AnyDocument>(sources: Results<T>) => void\n onQueryTranslated?: (query: SearchParams<AnyOrama>) => void\n onRelatedQueries?: (relatedQueries: string[]) => void\n onNewInteractionStarted?: (interactionId: string) => void\n onStateChange?: (state: Interaction[]) => void\n },\n systemPrompts?: string[]\n}\n\nexport type Interaction<T = AnyDocument> = {\n interactionId: string\n query: string\n response: string\n relatedQueries: Nullable<string[]>\n sources: Nullable<Results<T>>\n translatedQuery: Nullable<SearchParams<AnyOrama>>\n aborted: boolean\n loading: boolean\n error: boolean\n errorMessage: string | null\n}\n\nexport type AskParams = SearchParams<AnyOrama> & {\n userData?: unknown\n related?: {\n howMany?: 1 | 2 | 3 | 4 | 5\n format?: 'question' | 'query'\n }\n}\n\nexport class AnswerSession<M extends boolean> {\n private messages: Message[]\n private inferenceType: InferenceType\n private oramaClient: OramaClient< M>\n private endpoint: string\n private abortController?: AbortController\n private events: AnswerParams<M>['events']\n private userContext?: AnswerParams<M>['userContext']\n private conversationID: string\n private lastInteractionParams?: AskParams\n public state: Interaction[] = []\n private systemPrompts?: string[]\n\n\n constructor(params: AnswerParams<M>) {\n // @ts-expect-error - sorry again TypeScript :-)\n const oaramaAnswerHostAddress = params.oramaClient.answersApiBaseURL || ORAMA_ANSWER_ENDPOINT\n\n this.messages = params.initialMessages || []\n this.inferenceType = params.inferenceType\n this.oramaClient = params.oramaClient\n // @ts-expect-error - sorry TypeScript\n this.endpoint = `${oaramaAnswerHostAddress}/v1/answer?api-key=${this.oramaClient.api_key}`\n this.events = params.events\n this.conversationID = createId()\n this.userContext = params.userContext\n }\n\n public async askStream(params: AskParams): Promise<AsyncGenerator<string>> {\n this.messages.push({ role: 'user', content: params.term ?? '' })\n return this.fetchAnswer(params)\n }\n\n public async ask(params: AskParams): Promise<string> {\n const generator = await this.askStream(params)\n let result = ''\n for await (const message of generator) {\n result = message\n }\n\n if (this.events?.onMessageChange) {\n this.events.onMessageChange(this.messages)\n }\n\n return result\n }\n\n public getMessages(): Message[] {\n return this.messages\n }\n\n public clearSession(): void {\n this.messages = []\n this.state = []\n\n if (this.events?.onMessageChange) {\n this.events.onMessageChange(this.messages)\n }\n\n if (this.events?.onStateChange) {\n this.events.onStateChange(this.state)\n }\n }\n\n public abortAnswer() {\n if (!this.abortController) {\n throw new Error('AbortController is not ready')\n }\n\n this.abortController.abort()\n this.abortController = undefined\n this.state[this.state.length - 1].aborted = true\n }\n\n public async regenerateLast({ stream = true } = {}): Promise<string | AsyncGenerator<string>> {\n if (this.state.length === 0 || this.messages.length === 0) {\n throw new Error('No messages to regenerate')\n }\n\n const isLastMessageAssistant = this.messages.at(-1)?.role === 'assistant'\n\n if (!isLastMessageAssistant) {\n throw new Error('Last message is not an assistant message')\n }\n\n this.messages.pop()\n this.state.pop()\n\n if (stream) {\n return this.askStream(this.lastInteractionParams as AskParams)\n }\n\n return this.ask(this.lastInteractionParams as AskParams)\n }\n\n private addNewEmptyAssistantMessage(): void {\n this.messages.push({ role: 'assistant', content: '' })\n }\n\n private async *fetchAnswer(params: AskParams): AsyncGenerator<string> {\n this.abortController = new AbortController()\n this.lastInteractionParams = params\n const interactionId = createId()\n\n let reader: ReadableStreamDefaultReader | null = null\n\n const currentStateIndex = this.state.length\n\n this.state.push({\n interactionId,\n query: params.term ?? '',\n response: '',\n relatedQueries: null,\n sources: null,\n translatedQuery: null,\n aborted: false,\n loading: true,\n error: false,\n errorMessage: null\n })\n\n try {\n if (this.events?.onNewInteractionStarted) {\n this.events.onNewInteractionStarted(interactionId)\n }\n\n if (this.events?.onStateChange) {\n this.events.onStateChange(this.state)\n }\n\n const requestBody = new URLSearchParams()\n requestBody.append('type', this.inferenceType)\n requestBody.append('messages', JSON.stringify(this.messages))\n requestBody.append('query', params.term ?? '')\n requestBody.append('conversationId', this.conversationID)\n requestBody.append('userId', this.oramaClient.getUserId())\n // @ts-expect-error - yeah it's private but we need it here\n requestBody.append('endpoint', this.oramaClient.endpoint)\n requestBody.append('searchParams', JSON.stringify(params))\n requestBody.append('identity', this.oramaClient.getIdentity() ?? '')\n requestBody.append('interactionId', interactionId)\n requestBody.append('alias', this.oramaClient.getAlias() ?? '')\n\n const systemPromptConfiguration = this.getSystemPromptConfiguration()\n if (systemPromptConfiguration) {\n requestBody.append('systemPrompts', JSON.stringify(systemPromptConfiguration))\n }\n\n if (this.userContext) {\n requestBody.append('userContext', serializeUserContext(this.userContext))\n }\n\n if (params.userData) {\n requestBody.append('userData', serializeUserContext(params.userData))\n }\n\n if (params.related) {\n if (params.related?.howMany && params.related?.howMany > 5) {\n throw new Error('Can generate at most 5 related queries')\n }\n\n requestBody.append('related', JSON.stringify({ enabled: true, howMany: params.related.howMany ?? 3, format: params.related.format ?? 'question' }))\n }\n\n const response = await fetch(this.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: requestBody.toString(),\n signal: this.abortController.signal\n })\n\n if (!response.ok || !response.body) {\n throw new Error(response.statusText)\n }\n\n reader = response.body.getReader()\n const decoder = new TextDecoder()\n const messageQueue: string[] = []\n let buffer = ''\n\n if (this.events?.onMessageLoading) {\n this.events.onMessageLoading(true)\n }\n\n this.addNewEmptyAssistantMessage()\n\n const lastMessage = this.messages.at(-1) as Message\n\n while (true) {\n const { value, done } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n\n // biome-ignore lint/suspicious/noImplicitAnyLet: <explanation>\n let endOfMessageIndex\n\n // biome-ignore lint/suspicious/noAssignInExpressions: this saves a variable allocation on each iteration\n while ((endOfMessageIndex = buffer.indexOf('\\n\\n')) !== -1) {\n const rawMessage = buffer.slice(0, endOfMessageIndex)\n buffer = buffer.slice(endOfMessageIndex + 2)\n\n try {\n const event = parseSSE(rawMessage)\n const parsedMessage = JSON.parse(event.data)\n\n // MANAGE INCOMING SOURCES\n if (parsedMessage.type === 'sources') {\n this.state[currentStateIndex].sources = parsedMessage.message\n\n if (this.events?.onSourceChange) {\n this.events.onSourceChange(parsedMessage.message)\n }\n\n if (this.events?.onStateChange) {\n this.events.onStateChange(this.state)\n }\n\n // MANAGE INCOMING TRANSLATED QUERY\n } else if (parsedMessage.type === 'query-translated') {\n this.state[currentStateIndex].translatedQuery = parsedMessage.message\n\n if (this.events?.onQueryTranslated) {\n this.events.onQueryTranslated(parsedMessage.message)\n }\n\n if (this.events?.onStateChange) {\n this.events.onStateChange(this.state)\n }\n\n // MANAGE INCOMING RELATED QUERIES\n } else if (parsedMessage.type === 'related-queries') {\n this.state[currentStateIndex].relatedQueries = parsedMessage.message\n\n if (this.events?.onRelatedQueries) {\n this.events.onRelatedQueries(parsedMessage.message)\n }\n\n if (this.events?.onStateChange) {\n this.events.onStateChange(this.state)\n }\n\n // MANAGE INCOMING MESSAGE CHUNK\n } else if (parsedMessage.type === 'text') {\n messageQueue.push(parsedMessage.message)\n\n // Process the message queue immediately, regardless of endOfBlock\n while (messageQueue.length > 0) {\n lastMessage.content += messageQueue.shift()\n this.state[currentStateIndex].response = lastMessage.content\n\n if (this.events?.onStateChange) {\n this.events.onStateChange(this.state)\n }\n\n if (this.events?.onMessageChange) {\n this.events.onMessageChange(this.messages)\n }\n\n yield lastMessage.content\n }\n\n // ALL OTHER CASES\n } else {\n // https://shorturl.at/PlUKm\n }\n } catch (e) {\n console.error('Error parsing SSE event:', e)\n console.error('Raw message:', rawMessage)\n }\n }\n }\n } catch (err: any) {\n if (err.name === 'AbortError') {\n this.state[currentStateIndex].aborted = true\n\n if (this.events?.onAnswerAborted) {\n this.events.onAnswerAborted(true)\n }\n } else {\n this.state[currentStateIndex].error = true\n this.state[currentStateIndex].errorMessage = err.message ?? 'Unknown error'\n throw err\n }\n } finally {\n reader?.releaseLock()\n this.state[currentStateIndex].loading = false\n\n if (this.events?.onStateChange) {\n this.events.onStateChange(this.state)\n }\n\n if (this.events?.onMessageLoading) {\n this.events.onMessageLoading(false)\n }\n }\n }\n\n /**\n * Methods associated with custom system prompts\n */\n public setSystemPromptConfiguration(config: { systemPrompts: string[] }) {\n if (Array.isArray(config.systemPrompts)) {\n if (!config.systemPrompts.every((prompt) => typeof prompt === 'string')) {\n throw new Error('Invalid system prompt configuration')\n }\n \n this.systemPrompts = config.systemPrompts\n }\n\n return this\n }\n \n public getSystemPromptConfiguration(): string[] | undefined {\n return this.systemPrompts\n }\n}\n","export const MICROSECONDS_BASE = 1_000_000\n\nexport const DEFAULT_TELEMETRY_FLUSH_INTERVAL = 5000\n\nexport const DEFAULT_TELEMETRY_FLUSH_SIZE = 25\n\nexport const ORAMA_ANSWER_ENDPOINT = 'https://answer.api.orama.com'\n\nexport const ORAMA_PROXY_ENDPOINT = 'https://secure-proxy.orama.run'\nexport const ORAMA_PROXY_INIT_ENDPOINT = '/init'\nexport const ORAMA_PROXY_CHAT_ENDPOINT = '/chat'\nexport const ORAMA_PROXY_SUMMARY_ENDPOINT = '/summary'\nexport const ORAMA_PROXY_EMBEDDINGS_ENDPOINT = '/query'\n\nexport const MULTI_INDEX_BASE = '/v1/indexes'\n\nexport const LOCAL_STORAGE_USER_ID_KEY = 'orama_user_id'\nexport const LOCAL_STORAGE_SERVER_SIDE_SESSION_KEY = 'server-side-session'\n","export const hasLocalStorage = typeof localStorage !== 'undefined'\n\ntype SSESourcePayload = {\n type: 'sources'\n message: object\n}\n\ntype SSETextStreamPayload = {\n type: 'text'\n message: string\n endOfBlock: boolean\n}\n\ntype SSEParsedPayload = SSESourcePayload | SSETextStreamPayload\n\ntype SSEPayload = {\n data: string\n event: string\n}\n\nexport function throttle(func: (...args: any[]) => any, limit: number) {\n let inThrottle: boolean\n return function () {\n const args = arguments\n const context = this\n if (!inThrottle) {\n func.apply(context, args)\n inThrottle = true\n setTimeout(() => (inThrottle = false), limit)\n }\n }\n}\n\nexport function debounce(func: (...args: any[]) => any, delay: number) {\n let debounceTimer: NodeJS.Timer\n return function () {\n const context = this\n const args = arguments\n clearTimeout(debounceTimer)\n debounceTimer = setTimeout(() => func.apply(context, args), delay)\n }\n}\n\nexport function parseSSE(input: string): SSEPayload {\n const [event, ...data] = input.split('\\n')\n const eventData = data.join('\\n').replace('data: ', '')\n\n return {\n event: event.replace('event: ', ''),\n data: eventData\n }\n}\n\nexport function serializeUserContext(userContext: unknown): string {\n if (typeof userContext === 'object') {\n return JSON.stringify(userContext)\n }\n\n return `${userContext}`\n}\n","import type { CacheConfig, Optional } from './types.js'\n\ntype CacheMap<T = unknown> = Map<string, T>\n\nexport class Cache<V = unknown> {\n private readonly cache: CacheMap<V>\n private readonly config: CacheConstructorParams\n\n constructor(config: CacheConstructorParams) {\n this.cache = new Map()\n this.config = config\n }\n\n public set(key: string, value: V): void {\n this.cache.set(key, value)\n }\n\n public get(key: string): Optional<V> {\n return this.cache.get(key)\n }\n\n public has(key: string): boolean {\n return this.cache.has(key)\n }\n\n public delete(key: string): boolean {\n return this.cache.delete(key)\n }\n\n public clear(): void {\n this.cache.clear()\n }\n\n public size(): number {\n return this.cache.size\n }\n}\n\nexport interface CacheConstructorParams extends CacheConfig {}\n","{\n \"name\": \"@oramacloud/client\",\n \"version\": \"1.3.20\",\n \"description\": \"Orama SDK for Node.js, Deno, and Browsers\",\n \"type\": \"module\",\n \"sideEffects\": false,\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"runkitExampleFilename\": \"./example/runkit.js\",\n \"exports\": {\n \".\": {\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"browser\": \"./dist/index.global.js\"\n },\n \"./react\": {\n \"require\": \"./dist/react/index.cjs\",\n \"import\": \"./dist/react/index.js\",\n \"types\": \"./dist/react/index.d.ts\"\n },\n \"./vue\": {\n \"require\": \"./dist/vue/index.cjs\",\n \"import\": \"./dist/vue/index.js\",\n \"types\": \"./dist/vue/index.d.ts\"\n }\n },\n \"scripts\": {\n \"format\": \"bunx @biomejs/biome format src --write\",\n \"build\": \"npm run build:lib && npm run build:react && npm run build:vue\",\n \"dev\": \"run-p watch:lib watch:react watch:vue\",\n \"watch:lib\": \"tsup --config tsup.lib.js --watch src\",\n \"watch:react\": \"tsup --config tsup.react.js --watch\",\n \"watch:vue\": \"tsup --config tsup.vue.js --watch\",\n \"build:lib\": \"tsup --config tsup.lib.js\",\n \"build:react\": \"tsup --config tsup.react.js\",\n \"build:vue\": \"tsup --config tsup.vue.js\",\n \"test\": \"glob -c \\\"node --import tsx --no-warnings --test\\\" \\\"./tests/**/*.test.ts\\\"\",\n \"serve:example\": \"esbuild src/index.ts --bundle --outfile=example/out.js --format=esm --watch --servedir=example\",\n \"prepare\": \"husky install\"\n },\n \"keywords\": [\n \"orama\",\n \"search engine\",\n \"sdk\"\n ],\n \"files\": [\n \"dist\",\n \"example/runkit.js\"\n ],\n \"author\": {\n \"name\": \"Michele Riva\",\n \"email\": \"michele.riva@oramasearch.com\",\n \"url\": \"https://github.com/MicheleRiva\"\n },\n \"license\": \"ISC\",\n \"dependencies\": {\n \"@orama/cuid2\": \"^2.2.3\",\n \"@orama/orama\": \"^2.0.16\",\n \"lodash\": \"^4.17.21\",\n \"openai\": \"^4.24.1\",\n \"react\": \"^18.2.0\",\n \"vue\": \"^3.4.25\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"1.8.1\",\n \"@fastify/formbody\": \"^7.4.0\",\n \"@types/lodash\": \"^4.14.202\",\n \"@types/node\": \"^20.3.1\",\n \"@types/react\": \"^18.2.14\",\n \"dotenv\": \"^16.3.1\",\n \"esbuild\": \"0.18.5\",\n \"fastify\": \"^4.19.2\",\n \"glob\": \"^11.0.0\",\n \"husky\": \"^8.0.3\",\n \"npm-run-all\": \"^4.1.5\",\n \"ts-standard\": \"^12.0.2\",\n \"tsup\": \"^8.3.0\",\n \"tsx\": \"^4.7.0\",\n \"typescript\": \"^5.1.3\"\n },\n \"ts-standard\": {\n \"ignore\": [\n \"dist\",\n \"node_modules\"\n ]\n },\n \"packageManager\": \"pnpm@9.10.0+sha512.73a29afa36a0d092ece5271de5177ecbf8318d454ecd701343131b8ebc0c1a91c487da46ab77c8e596d6acf1461e3594ced4becedf8921b074fbd8653ed7051c\"\n}\n","export default function sendBeacon(endpoint: string, body?: string): Promise<Response> | undefined {\n if (typeof navigator !== 'undefined') {\n if (typeof navigator.sendBeacon !== 'undefined') {\n navigator.sendBeacon(endpoint, body)\n }\n return\n }\n\n fetch(endpoint, {\n method: 'POST',\n body,\n headers: {\n 'Content-Type': 'application/json'\n }\n }).then(\n () => {},\n (e) => console.log(e)\n )\n}\n","import type { SearchEvent, ICollector, TelemetryConfig } from './types.js'\nimport pkg from '../package.json'\nimport sendBeacon from './sendBeacon.js'\nimport type { Profile } from './profile.js'\n\ntype Data = any[]\n\nexport class Collector {\n private data: Data\n private params?: ICollector\n private readonly config: CollectorConstructor\n private readonly profile: Profile\n\n private constructor(config: CollectorConstructor, profile: Profile) {\n this.data = []\n this.config = config\n this.profile = profile\n }\n\n public setParams(params: ICollector): void {\n this.params = params\n }\n\n public static create(config: CollectorConstructor, profile: Profile): Collector {\n const collector = new Collector(config, profile)\n collector.start()\n return collector\n }\n\n public add(data: SearchEvent): void {\n this.data.push({\n rawSearchString: data.rawSearchString,\n query: data.query,\n resultsCount: data.resultsCount,\n roundTripTime: data.roundTripTime,\n searchedAt: data.searchedAt,\n userId: this.profile.getUserId(),\n identity: this.profile.getIdentity(),\n alias: this.profile.getAlias(),\n // The referer is different for every event:\n // the user can search in different pages of the website\n // and the referer will be different for each page\n referer: typeof location !== 'undefined' ? location.toString() : undefined\n })\n\n if (this.params != null && this.data.length >= this.config.flushSize) {\n this.flush()\n }\n }\n\n public flush(): void {\n if (this.params == null || this.data.length === 0) {\n return\n }\n\n // Swap out the data array *sync*\n // so that we can continue to collect events\n const data = this.data\n this.data = []\n\n const body = {\n source: 'fe',\n deploymentID: this.params.deploymentID,\n index: this.params.index,\n oramaId: this.config.id,\n oramaVersion: pkg.version,\n // The user agent is the same for every event\n // Because we use \"application/x-www-form-urlencoded\",\n // the browser doens't send the user agent automatically\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n events: data\n }\n\n sendBeacon(this.params.endpoint + `?api-key=${this.config.api_key}`, JSON.stringify(body))?.catch((err) => console.log(err))\n }\n\n private start(): void {\n const interval = setInterval(this.flush.bind(this), this.config.flushInterval)\n if (interval.unref != null) {\n interval.unref()\n }\n }\n}\n\nexport interface CollectorConstructor extends TelemetryConfig {\n id: string\n api_key: string\n}\n","import sendBeacon from './sendBeacon.js'\nimport { HeartBeatConfig } from './types.js'\n\nexport class HeartBeat {\n private intervalId?: number\n\n constructor(private readonly params: HeartBeatConstructor) {}\n\n public start(): void {\n this.stop()\n // @ts-expect-error - setInterval ID is actually a number\n this.intervalId = setInterval(this.beat.bind(this), this.params.frequency)\n }\n\n public stop(): void {\n if (this.intervalId !== undefined) {\n clearInterval(this.intervalId)\n }\n }\n\n private beat(): void {\n sendBeacon(this.params.endpoint)?.catch((err) => console.log(err))\n }\n}\n\nexport interface HeartBeatConstructor extends HeartBeatConfig {\n endpoint: string\n}\n","import { createId } from '@orama/cuid2'\nimport sendBeacon from './sendBeacon.js'\nimport type { OramaInitResponse } from './types.js'\nimport { LOCAL_STORAGE_USER_ID_KEY } from './constants.js'\n\ntype ProfileConstructor = {\n endpoint: string\n apiKey: string\n}\n\ntype ProfileParams = {\n identifyUrl: string\n index: string\n}\n\nexport class Profile {\n private readonly endpoint: string\n private readonly apiKey: string\n\n private userId: string\n private identity?: string\n private userAlias?: string\n private params?: ProfileParams\n\n constructor({ endpoint, apiKey }: ProfileConstructor) {\n if (!endpoint || !apiKey) {\n throw new Error('Endpoint and API Key are required to create a Profile')\n }\n\n if (typeof endpoint !== 'string' || typeof apiKey !== 'string') {\n throw new Error('Endpoint and API Key must be strings')\n }\n\n if (typeof localStorage !== 'undefined') {\n // Browser side\n const userId = localStorage.getItem(LOCAL_STORAGE_USER_ID_KEY)\n\n if (userId) {\n this.userId = userId\n } else {\n this.userId = createId()\n localStorage.setItem(LOCAL_STORAGE_USER_ID_KEY, this.userId)\n }\n } else {\n // Server side\n this.userId = createId()\n }\n\n this.endpoint = endpoint\n this.apiKey = apiKey\n }\n\n setParams(params: ProfileParams) {\n const { protocol, host } = new URL(params.identifyUrl)\n const telemetryDomain = `${protocol}//${host}/identify`\n\n this.params = {\n identifyUrl: telemetryDomain,\n index: params.index\n }\n }\n\n getIdentity() {\n return this.identity\n }\n\n getUserId() {\n return this.userId\n }\n\n getAlias() {\n return this.userAlias\n }\n\n private async sendProfileData(data: Record<string, any>) {\n if (!this.params) {\n throw new Error('Orama Profile is not initialized')\n }\n\n const body = JSON.stringify({\n ...data,\n visitorId: this.getUserId(),\n index: this.params.index\n })\n\n await sendBeacon(`${this.params?.identifyUrl}?api-key=${this.apiKey}`, body)\n }\n\n async identify(initPromise: Promise<OramaInitResponse | null>, identity: string) {\n if (typeof identity !== 'string') {\n throw new Error('Identity must be a string')\n }\n\n await initPromise\n\n await this.sendProfileData({\n entity: 'identity',\n id: identity\n })\n\n this.identity = identity\n }\n\n async alias(initPromise: Promise<OramaInitResponse | null>, alias: string) {\n if (typeof alias !== 'string') {\n throw new Error('Identity must be a string')\n }\n\n await initPromise\n\n await this.sendProfileData({\n entity: 'alias',\n id: alias\n })\n\n this.userAlias = alias\n }\n\n reset() {\n this.userId = createId()\n this.identity = undefined\n this.userAlias = undefined\n }\n}\n","import type { Nullable } from '@orama/orama'\nimport type { OpenAI } from 'openai'\nimport type { IOramaProxy } from './types.js'\nimport * as CONST from './constants.js'\n\nexport type EmbeddingModel = keyof typeof embeddingsModels\nexport type ChatModel = keyof typeof chatModels\nexport type ChatMessage = OpenAI.ChatCompletionMessageParam\n\nexport type ChatParams = {\n messages: ChatMessage[]\n model: ChatModel\n}\n\nexport type SummaryParams = {\n prompt: string\n docIDs: string[]\n indexID: string\n model: ChatModel\n deploymentID?: string\n fresh?: boolean\n}\n\nconst OPENAI_EMBEDDINGS_MODEL_ADA = 'text-embedding-ada-002'\nconst OPENAI_EMBEDDINGS_MODEL_3_SMALL = 'text-embedding-3-small'\nconst OPENAI_EMBEDDINGS_MODEL_3_LARGE = 'text-embedding-3-large'\nconst ORAMA_EMBEDDINGS_MODEL_GTE_SMALL = 'gte-small'\nconst ORAMA_EMBEDDINGS_MODEL_GTE_MEDIUM = 'gte-medium'\nconst ORAMA_EMBEDDINGS_MODEL_GTE_LARGE = 'gte-large'\n\nconst OPENAI_CHAT_MODE_GPT_4O = 'gpt-4o'\nconst OPENAI_CHAT_MODE_GPT_4O_MINI = 'gpt-4o-mini'\nconst OPENAI_CHAT_MODE_GPT_4_TURBO = 'gpt-4-turbo'\nconst OPENAI_CHAT_MODEL_GPT_4_TURBO_2024_04_09 = 'gpt-4-turbo-2024-04-09'\nconst OPENAI_CHAT_MODE_GPT_4_0125_PREVIEW = 'gpt-4-0125-preview'\nconst OPENAI_CHAT_MODEL_GPT4_1106_PREVIEW = 'gpt-4-1106-preview'\nconst OPENAI_CHAT_MODEL_GPT4_TURBO_PREVIEW = 'gpt-4-turbo-preview'\nconst OPENAI_CHAT_MODEL_GPT4 = 'gpt-4'\nconst OPENAI_CHAT_MODEL_GPT3_5_TURBO = 'gpt-3.5-turbo'\nconst OPENAI_CHAT_MODEL_GPT3_3_5_TURBO_0125 = 'gpt-3.5-turbo-0125'\n\nconst embeddingsModels = {\n [`openai/${OPENAI_EMBEDDINGS_MODEL_ADA}`]: `openai/${OPENAI_EMBEDDINGS_MODEL_ADA}`,\n [`openai/${OPENAI_EMBEDDINGS_MODEL_3_SMALL}`]: `openai/${OPENAI_EMBEDDINGS_MODEL_3_SMALL}`,\n [`openai/${OPENAI_EMBEDDINGS_MODEL_3_LARGE}`]: `openai/${OPENAI_EMBEDDINGS_MODEL_3_LARGE}`,\n [`orama/${ORAMA_EMBEDDINGS_MODEL_GTE_LARGE}`]: `orama/${ORAMA_EMBEDDINGS_MODEL_GTE_LARGE}`,\n [`orama/${ORAMA_EMBEDDINGS_MODEL_GTE_MEDIUM}`]: `orama/${ORAMA_EMBEDDINGS_MODEL_GTE_MEDIUM}`,\n [`orama/${ORAMA_EMBEDDINGS_MODEL_GTE_SMALL}`]: `orama/${ORAMA_EMBEDDINGS_MODEL_GTE_SMALL}`\n}\n\nconst chatModels = {\n [`openai/${OPENAI_CHAT_MODEL_GPT3_5_TURBO}`]: OPENAI_CHAT_MODEL_GPT3_5_TURBO,\n [`openai/${OPENAI_CHAT_MODEL_GPT4}`]: OPENAI_CHAT_MODEL_GPT4,\n [`openai/${OPENAI_CHAT_MODEL_GPT4_1106_PREVIEW}`]: OPENAI_CHAT_MODEL_GPT4_1106_PREVIEW,\n [`openai/${OPENAI_CHAT_MODE_GPT_4_0125_PREVIEW}`]: OPENAI_CHAT_MODE_GPT_4_0125_PREVIEW,\n [`openai/${OPENAI_CHAT_MODEL_GPT4_TURBO_PREVIEW}`]: OPENAI_CHAT_MODEL_GPT4_TURBO_PREVIEW,\n [`openai/${OPENAI_CHAT_MODEL_GPT3_3_5_TURBO_0125}`]: OPENAI_CHAT_MODEL_GPT3_3_5_TURBO_0125,\n [`openai/${OPENAI_CHAT_MODEL_GPT_4_TURBO_2024_04_09}`]: OPENAI_CHAT_MODEL_GPT_4_TURBO_2024_04_09,\n [`openai/${OPENAI_CHAT_MODE_GPT_4O}`]: OPENAI_CHAT_MODE_GPT_4O,\n [`openai/${OPENAI_CHAT_MODE_GPT_4O_MINI}`]: OPENAI_CHAT_MODE_GPT_4O_MINI,\n [`openai/${OPENAI_CHAT_MODE_GPT_4_TURBO}`]: OPENAI_CHAT_MODE_GPT_4_TURBO\n}\n\nexport class OramaProxy {\n private CSRFToken = ''\n private ready: Promise<boolean>\n private readonly api_key: string\n private publicKey?: CryptoKey\n private summaryAbortController?: Nullable<AbortController> = null\n\n constructor(params: IOramaProxy) {\n this.api_key = params.api_key\n\n this.ready = this.init()\n .then(() => true)\n .catch((err) => {\n console.log(err)\n return false\n })\n }\n\n public async generateEmbeddings(text: string, model: EmbeddingModel): Promise<number[]> {\n const isReady = await this.ready\n\n if (!isReady) {\n console.log('OramaProxy had an error during the initialization')\n return []\n }\n\n const endpoint = `${CONST.ORAMA_PROXY_ENDPOINT}${CONST.ORAMA_PROXY_EMBEDDINGS_ENDPOINT}?apiKey=${encodeURIComponent(this.api_key)}`\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: this.getHeaders(),\n body: new URLSearchParams({\n query: text,\n csrf: this.CSRFToken,\n model: embeddingsModels[model]\n }).toString()\n })\n\n let embeddings = await response.json()\n\n if (embeddings.length === 1) {\n embeddings = embeddings[0]\n }\n\n return embeddings\n }\n\n public async *summaryStream(params: SummaryParams): AsyncGenerator<string> {\n const isReady = await this.ready\n\n if (!isReady) {\n console.log('OramaProxy had an error during the initialization')\n return\n }\n\n // Abort previous request and initiate a new AbortController.\n // This will allow us to cancel the request when a new one is made.\n if (this.summaryAbortController) {\n this.summaryAbortController.abort()\n }\n\n this.summaryAbortController = new AbortController()\n\n const endpoint = `${CONST.ORAMA_PROXY_ENDPOINT}${CONST.ORAMA_PROXY_SUMMARY_ENDPOINT}?apiKey=${encodeURIComponent(this.api_key)}`\n\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: this.getHeaders(),\n body: new URLSearchParams({\n prompt: params.prompt,\n cache: params.fresh ? 'false' : 'true',\n docIDs: JSON.stringify(params.docIDs),\n indexID: params.indexID,\n deploymentID: params.deploymentID ?? '',\n csrf: this.CSRFToken,\n model: chatModels[params.model]\n }).toString(),\n signal: this.summaryAbortController?.signal\n })\n\n if (!response.ok || response.body == null) {\n throw response.statusText\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n\n while (true) {\n const { value, done } = await reader.read()\n if (done) {\n break\n }\n const decodedChunk = decoder.decode(value, { stream: true })\n yield decodedChunk\n }\n } catch (error: any) {\n if (error.name !== 'AbortError') {\n throw error\n }\n }\n }\n\n public async summary(params: SummaryParams): Promise<string> {\n const isReady = await this.ready\n\n if (!isReady) {\n console.log('OramaProxy had an error during the initialization')\n return ''\n }\n\n let response = ''\n\n for await (const msg of this.summaryStream(params)) {\n response += msg\n }\n\n return response\n }\n\n public async chat(params: ChatParams): Promise<string> {\n const isReady = await this.ready\n\n if (!isReady) {\n console.log('OramaProxy had an error during the initialization')\n return ''\n }\n\n let response = ''\n\n for await (const msg of this.chatStream(params)) {\n response += msg\n }\n\n return response\n }\n\n public async *chatStream(params: ChatParams): AsyncGenerator<string> {\n const isReady = await this.ready\n\n if (!isReady) {\n console.log('OramaProxy had an error during the initialization')\n return ''\n }\n\n const endpoint = `${CONST.ORAMA_PROXY_ENDPOINT}${CONST.ORAMA_PROXY_CHAT_ENDPOINT}?apiKey=${encodeURIComponent(this.api_key)}`\n\n let messages = params.messages\n if (this.publicKey) {\n messages = (await Promise.all(\n messages.map(async (message) => {\n if (!message.content) {\n return message\n }\n if (typeof message.content !== 'string') {\n return message\n }\n return {\n ...message,\n content: await encryptData(this.publicKey!, message.content)\n }\n })\n )) as any // Too hard to type this\n }\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: this.getHeaders(),\n body: new URLSearchParams({\n messages: JSON.stringify(messages),\n csrf: this.CSRFToken,\n model: chatModels[params.model]\n }).toString()\n })\n\n if (!response.ok || response.body == null) {\n throw response.statusText\n }\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n\n while (true) {\n const { value, done } = await reader.read()\n if (done) {\n break\n }\n\n const decodedChunk = decoder.decode(value, { stream: true })\n yield decodedChunk\n }\n }\n\n private async init() {\n const endpoint = `${CONST.ORAMA_PROXY_ENDPOINT}${CONST.ORAMA_PROXY_INIT_ENDPOINT}?apiKey=${encodeURIComponent(this.api_key)}`\n const response = await fetch(endpoint, {\n headers: {\n referer: this.getReferrer()\n }\n })\n\n const data = await response.json()\n this.CSRFToken = data.csrfToken\n if (data.encryption?.enabled === true) {\n this.publicKey = await importPublicKey(restoreKey(data.encryption.publicKey))\n }\n }\n\n private isServer() {\n return typeof window === 'undefined'\n }\n\n private getHeaders() {\n return {\n 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',\n referer: this.getReferrer()\n }\n }\n\n private getReferrer() {\n return this.isServer() ? 'http://localhost' : window.location.href\n }\n}\n\nasync function importPublicKey(keyData: ArrayBuffer) {\n const key = await crypto.subtle.importKey('spki', keyData, { name: 'RSA-OAEP', hash: { name: 'SHA-256' } }, true, ['encrypt'])\n return key\n}\n\nasync function encryptPieceData(publicKey: CryptoKey, encodedData: Uint8Array) {\n const encryptedData = await crypto.subtle.encrypt({ name: 'RSA-OAEP' }, publicKey, encodedData)\n return new Uint8Array(encryptedData)\n}\n\nfunction restoreKey(s: number[]): Uint8Array {\n return Uint8Array.from(s)\n}\n\nconst BATCH_SIZE = 50\nasync function encryptData(publicKey: CryptoKey, data: string) {\n const encodedData = new TextEncoder().encode(data)\n\n const arr = []\n for (let i = 0; i < encodedData.length; i += BATCH_SIZE) {\n const item = encodedData.subarray(i, i + BATCH_SIZE)\n const encryptedData = await encryptPieceData(publicKey, item)\n arr.push(Array.from(encryptedData))\n }\n\n return arr\n}\n","export const ENDPOINT_SNAPSHOT = 'snapshot'\nexport const ENDPOINT_NOTIFY = 'notify'\nexport const ENDPOINT_DEPLOY = 'deploy'\nexport const ENDPOINT_HAS_DATA = 'has-data'\nexport const ENDPOINT_UPDATE_SCHEMA = 'update-schema'\n\nexport const METHOD_POST = 'POST'\nexport const METHOD_GET = 'GET'\nexport const METHOD_PUT = 'PUT'\nexport const METHOD_DELETE = 'DELETE'\n\nexport const API_BASE_URL = 'https://api.askorama.ai'\nexport const API_V1_BASE_URL = `${API_BASE_URL}/api/v1`\n","import type { Nullable } from '@orama/orama'\nimport type { CloudManager } from './index.js'\nimport type { Endpoint, EndpointDeploy, EndpointHasData, EndpointNotify, EndpointSnapshot, EndpointUpdateSchema } from './types.js'\nimport * as CONST from './constants.js'\n\ntype IndexManagerParams = {\n manager: CloudManager\n indexID: string\n}\n\ntype SnapshotData = any[] | object | unknown\n\ntype CallWebhookPayload<E extends Endpoint> = E extends EndpointSnapshot\n ? SnapshotData\n : E extends EndpointNotify\n ? any[]\n : E extends EndpointDeploy\n ? undefined\n : E extends EndpointUpdateSchema\n ? { schema: { [key: string]: any }; embeddings?: any }\n : never\n\nexport class IndexManager {\n private manager: CloudManager\n private indexId: Nullable<string> = null\n\n constructor(params: IndexManagerParams) {\n this.manager = params.manager\n this.indexId = params.indexID\n\n this.manager.setIndexID(params.indexID)\n }\n\n public async empty(): Promise<boolean> {\n const resp = await this.callIndexWebhook<EndpointSnapshot>(CONST.ENDPOINT_SNAPSHOT, [])\n return (resp as any).success\n }\n\n public async snapshot(data: CallWebhookPayload<EndpointSnapshot>): Promise<boolean> {\n const resp = await this.callIndexWebhook<EndpointSnapshot>(CONST.ENDPOINT_SNAPSHOT, data)\n return (resp as any).success\n }\n\n public async insert(data: CallWebhookPayload<EndpointNotify>): Promise<boolean> {\n const resp = await this.callIndexWebhook<EndpointNotify>(CONST.ENDPOINT_NOTIFY, { upsert: data } as any)\n return (resp as any).success\n }\n\n public async update(data: CallWebhookPayload<EndpointNotify>): Promise<boolean> {\n const resp = await this.callIndexWebhook<EndpointNotify>(CONST.ENDPOINT_NOTIFY, { upsert: data } as any)\n return (resp as any).success\n }\n\n public async delete(data: CallWebhookPayload<EndpointNotify>): Promise<boolean> {\n try {\n await this.callIndexWebhook<EndpointNotify>(CONST.ENDPOINT_NOTIFY, { remove: data } as any)\n } catch (e) {\n console.error(e)\n return false\n }\n\n return true\n }\n\n public async updateSchema(schema: CallWebhookPayload<EndpointUpdateSchema>): Promise<boolean> {\n try {\n await this.callIndexWebhook<EndpointUpdateSchema>(CONST.ENDPOINT_UPDATE_SCHEMA, schema)\n } catch (e) {\n console.error(e)\n return false\n }\n return true\n }\n\n public async deploy(): Promise<boolean> {\n try {\n const resp = await this.callIndexWebhook<EndpointDeploy>(CONST.ENDPOINT_DEPLOY)\n } catch (e) {\n console.error(e)\n return false\n }\n\n return true\n }\n\n public async hasPendingOperations(): Promise<boolean> {\n const resp = await this.callIndexWebhook<EndpointHasData>(CONST.ENDPOINT_HAS_DATA)\n return (resp as any).hasData\n }\n\n private checkIndexID() {\n if (!this.indexId) {\n throw new Error('Index ID is not set')\n }\n }\n\n private callIndexWebhook<E extends Endpoint>(endpoint: E, payload?: CallWebhookPayload<E>) {\n this.checkIndexID()\n return this.manager.callIndexWebhook(endpoint, payload)\n }\n}\n","import type { Nullable, insert } from '@orama/orama'\nimport type { Endpoint, Method } from './types.js'\nimport { IndexManager } from './index-manager.js'\nimport { API_V1_BASE_URL } from './constants.js'\n\ntype CloudManagerConfig = {\n api_key: string\n baseURL?: string\n}\n\ntype CallConfig = {\n method: Method\n headers: {\n 'Content-Type': string\n Authorization: string\n }\n body?: string\n}\n\ntype Payload = UpsertPayload | RemovePayload | InsertPayload\n\ntype UpsertPayload = {\n upsert: any[]\n}\n\ntype RemovePayload = {\n remove: any[]\n}\n\ntype InsertPayload = {\n insert: any[]\n}\n\nexport class CloudManager {\n private indexId: Nullable<string> = null\n private apiKey: string\n private baseURL: string\n\n constructor(config: CloudManagerConfig) {\n this.apiKey = config.api_key\n this.baseURL = config?.baseURL || API_V1_BASE_URL\n }\n\n index(indexId: string): IndexManager {\n return new IndexManager({ manager: this, indexID: indexId })\n }\n\n setIndexID(id: string) {\n this.indexId = id\n }\n\n async callIndexWebhook<T = unknown>(endpoint: Endpoint, payload?: T): Promise<Response> {\n const config: CallConfig = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`\n }\n }\n\n if (payload) {\n config.body = JSON.stringify(payload)\n }\n\n const resp = await fetch(`${this.baseURL}/webhooks/${this.indexId}/${endpoint}`, config)\n\n return resp.json()\n }\n}\n"],"mappings":"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","names":["src_exports","__export","pluginSecureProxy","exports","isBytes","number","bool","bytes","hash","exists","output","n","b","a","lengths","h","instance","checkFinished","out","min","assert","fromBig","split","add","U32_MASK64","_32n","le","lst","Ah","Al","i","l","toBig","shrSH","_l","s","shrSL","rotrSH","rotrSL","rotrBH","rotrBL","rotr32H","_h","rotr32L","rotlSH","rotlSL","rotlBH","rotlBL","Bh","Bl","add3L","Cl","add3H","low","Ch","add4L","Dl","add4H","Dh","add5L","El","add5H","Eh","u64","qe","T","byteSwap32","bytesToHex","hexToBytes","asyncLoop","utf8ToBytes","toBytes","concatBytes","checkOpts","wrapConstructor","wrapConstructorWithOpts","wrapXOFConstructorWithOpts","randomBytes","crypto_1","$e","_assert_js_1","Q","u8","arr","u32","createView","rotr","word","shift","rotl","byteSwap","hexes","_","hex","asciis","asciiToBase16","char","hl","al","array","ai","hi","n1","n2","nextTick","iters","tick","cb","ts","diff","str","data","arrays","sum","res","pad","Hash","toStr","defaults","opts","hashCons","hashC","msg","tmp","bytesLength","Je","p","keccakP","_u64_js_1","je","utils_js_1","SHA3_PI","SHA3_ROTL","_SHA3_IOTA","_0n","_1n","_2n","_7n","_256n","_0x71n","round","R","x","y","t","j","SHA3_IOTA_H","SHA3_IOTA_L","rotlH","rotlL","rounds","B","idx1","idx0","B0","B1","Th","Tl","curH","curL","PI","Keccak","_Keccak","blockLen","suffix","outputLen","enableXOF","state","len","pos","take","bufferOut","to","gen","genShake","require_src","__commonJSMin","module","sha3","defaultLength","bigLength","createEntropy","length","random","entropy","bufToBigInt","buf","bits","value","bi","input","alphabet","randomLetter","createFingerprint","globalObj","globals","sourceString","createCounter","count","initialCountMax","init","counter","fingerprint","firstLetter","time","salt","hashInput","createId","isCuid","id","minLength","maxLength","regex","require_cuid2","getConstants","it","baseId","Date","now","toString","slice","nano","BigInt","milli","second","import_cuid2","Y","B","ORAMA_PROXY_ENDPOINT","ORAMA_PROXY_INIT_ENDPOINT","ORAMA_PROXY_CHAT_ENDPOINT","ORAMA_PROXY_SUMMARY_ENDPOINT","ORAMA_PROXY_EMBEDDINGS_ENDPOINT","import_cuid2","Y","B","OPENAI_EMBEDDINGS_MODEL_ADA","OPENAI_EMBEDDINGS_MODEL_3_SMALL","OPENAI_EMBEDDINGS_MODEL_3_LARGE","ORAMA_EMBEDDINGS_MODEL_GTE_SMALL","ORAMA_EMBEDDINGS_MODEL_GTE_MEDIUM","ORAMA_EMBEDDINGS_MODEL_GTE_LARGE","OPENAI_CHAT_MODE_GPT_4O","OPENAI_CHAT_MODE_GPT_4O_MINI","OPENAI_CHAT_MODE_GPT_4_TURBO","OPENAI_CHAT_MODEL_GPT_4_TURBO_2024_04_09","OPENAI_CHAT_MODE_GPT_4_0125_PREVIEW","OPENAI_CHAT_MODEL_GPT4_1106_PREVIEW","OPENAI_CHAT_MODEL_GPT4_TURBO_PREVIEW","OPENAI_CHAT_MODEL_GPT4","OPENAI_CHAT_MODEL_GPT3_5_TURBO","OPENAI_CHAT_MODEL_GPT3_3_5_TURBO_0125","embeddingsModels","chatModels","OramaProxy","params","__publicField","err","text","model","endpoint","ORAMA_PROXY_ENDPOINT","ORAMA_PROXY_EMBEDDINGS_ENDPOINT","embeddings","ORAMA_PROXY_SUMMARY_ENDPOINT","response","reader","decoder","value","done","error","msg","ORAMA_PROXY_CHAT_ENDPOINT","messages","message","encryptData","ORAMA_PROXY_INIT_ENDPOINT","data","importPublicKey","restoreKey","keyData","encryptPieceData","publicKey","encodedData","encryptedData","s","BATCH_SIZE","arr","i","item","API_BASE_URL","API_V1_BASE_URL","getPropertyValue","obj","path","current","key","getPropertiesValues","schema","properties","prop","value","pluginSecureProxy","pluginParams","proxy","Lt","_db","_id","params","values","embeddings","term"]}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@orama/plugin-secure-proxy",
|
3
|
-
"version": "3.0.
|
3
|
+
"version": "3.0.6",
|
4
4
|
"description": "Orama plugin for generating embeddings securely on the front-end",
|
5
5
|
"keywords": [
|
6
6
|
"orama",
|
@@ -45,7 +45,7 @@
|
|
45
45
|
"ts-standard": "^12.0.2",
|
46
46
|
"tsup": "^7.2.0",
|
47
47
|
"typescript": "^5.0.0",
|
48
|
-
"@orama/orama": "3.0.
|
48
|
+
"@orama/orama": "3.0.6"
|
49
49
|
},
|
50
50
|
"tap": {
|
51
51
|
"extends": "src/tests/config/tap.yml"
|