s3db.js 7.3.1 → 7.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/s3db.cjs.js +2394 -191
- package/dist/s3db.cjs.min.js +1 -1
- package/dist/s3db.es.js +2394 -191
- package/dist/s3db.es.min.js +1 -1
- package/dist/s3db.iife.js +2393 -190
- package/dist/s3db.iife.min.js +1 -1
- package/package.json +25 -26
- package/src/plugins/cache/filesystem-cache.class.js +1 -1
- package/src/plugins/cache/partition-aware-filesystem-cache.class.js +1 -1
- package/src/plugins/cache/s3-cache.class.js +1 -1
package/dist/s3db.iife.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var S3DB=function(t,e,r,i,n,s,o,a,c,u,l){"use strict";const h="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",f=Object.fromEntries([...h].map((t,e)=>[t,e])),d=t=>{if("number"!=typeof t||isNaN(t))return"undefined";if(!isFinite(t))return"undefined";if(0===t)return h[0];if(t<0)return"-"+d(-Math.floor(t));t=Math.floor(t);let e="";for(;t;)e=h[t%62]+e,t=Math.floor(t/62);return e},p=t=>{if("string"!=typeof t)return NaN;if(""===t)return 0;let e=!1;"-"===t[0]&&(e=!0,t=t.slice(1));let r=0;for(let e=0;e<t.length;e++){const i=f[t[e]];if(void 0===i)return NaN;r=62*r+i}return e?-r:r},m=t=>{if("number"!=typeof t||isNaN(t))return"undefined";if(!isFinite(t))return"undefined";const e=t<0;t=Math.abs(t);const[r,i]=t.toString().split("."),n=d(Number(r));return i?(e?"-":"")+n+"."+i:(e?"-":"")+n},g=t=>{if("string"!=typeof t)return NaN;let e=!1;"-"===t[0]&&(e=!0,t=t.slice(1));const[r,i]=t.split("."),n=p(r);if(isNaN(n))return NaN;const s=i?Number(n+"."+i):n;return e?-s:s};function y(t){"string"!=typeof t&&(t=String(t));let e=0;for(let r=0;r<t.length;r++){const i=t.codePointAt(r);i<=127?e+=1:i<=2047?e+=2:i<=65535?e+=3:i<=1114111&&(e+=4,i>65535&&r++)}return e}function b(t){let e=0;for(const r of Object.keys(t))e+=y(r);return e}function w(t){return null==t?"":"boolean"==typeof t?t?"1":"0":"number"==typeof t?String(t):"string"==typeof t?t:Array.isArray(t)?0===t.length?"[]":t.map(t=>String(t)).join("|"):"object"==typeof t?JSON.stringify(t):String(t)}function v(t){const e={};for(const[r,i]of Object.entries(t)){const t=y(w(i));e[r]=t}return e}function k(t){const e=v(t);return Object.values(e).reduce((t,e)=>t+e,0)+b(t)}function O(t={}){const{version:e="1",timestamps:r=!1,id:i=""}=t,n={_v:String(e)};r&&(n.createdAt="2024-01-01T00:00:00.000Z",n.updatedAt="2024-01-01T00:00:00.000Z"),i&&(n.id=i);const s={};for(const[t,e]of Object.entries(n))s[t]=e;return k(s)}function S(t={}){const{s3Limit:e=2048,systemConfig:r={}}=t;return e-O(r)}class _ extends Error{constructor({verbose:t,bucket:e,key:r,message:i,code:n,statusCode:s,requestId:o,awsMessage:a,original:c,commandName:u,commandInput:l,metadata:h,suggestion:f,...d}){t&&(i+=`\n\nVerbose:\n\n${JSON.stringify(d,null,2)}`),super(i),"function"==typeof Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error(i).stack,super.name=this.constructor.name,this.name=this.constructor.name,this.bucket=e,this.key=r,this.thrownAt=new Date,this.code=n,this.statusCode=s,this.requestId=o,this.awsMessage=a,this.original=c,this.commandName=u,this.commandInput=l,this.metadata=h,this.suggestion=f,this.data={bucket:e,key:r,...d,verbose:t,message:i}}toJson(){return{name:this.name,message:this.message,code:this.code,statusCode:this.statusCode,requestId:this.requestId,awsMessage:this.awsMessage,bucket:this.bucket,key:this.key,thrownAt:this.thrownAt,commandName:this.commandName,commandInput:this.commandInput,metadata:this.metadata,suggestion:this.suggestion,data:this.data,original:this.original,stack:this.stack}}toString(){return`${this.name} | ${this.message}`}}class j extends _{constructor(t,e={}){let r,i,n,s,o,a;e.original&&(o=e.original,r=o.code||o.Code||o.name,i=o.statusCode||o.$metadata&&o.$metadata.httpStatusCode,n=o.requestId||o.$metadata&&o.$metadata.requestId,s=o.message,a=o.$metadata?{...o.$metadata}:void 0),super({message:t,...e,code:r,statusCode:i,requestId:n,awsMessage:s,original:o,metadata:a})}}class x extends j{constructor(t,e={}){super(t,e),Object.assign(this,e)}}class R extends j{constructor(t,e={}){super(t,e),Object.assign(this,e)}}class D extends j{constructor({bucket:t,resourceName:e,id:r,original:i,...n}){if("string"!=typeof r)throw new Error("id must be a string");if("string"!=typeof t)throw new Error("bucket must be a string");if("string"!=typeof e)throw new Error("resourceName must be a string");super(`Resource not found: ${e}/${r} [bucket:${t}]`,{bucket:t,resourceName:e,id:r,original:i,...n})}}class A extends j{constructor({bucket:t,original:e,...r}){if("string"!=typeof t)throw new Error("bucket must be a string");super(`Bucket does not exists [bucket:${t}]`,{bucket:t,original:e,...r})}}class E extends j{constructor({bucket:t,key:e,resourceName:r,id:i,original:n,...s}){if("string"!=typeof e)throw new Error("key must be a string");if("string"!=typeof t)throw new Error("bucket must be a string");if(void 0!==i&&"string"!=typeof i)throw new Error("id must be a string");super(`No such key: ${e} [bucket:${t}]`,{bucket:t,key:e,resourceName:r,id:i,original:n,...s}),this.resourceName=r,this.id=i}}class N extends j{constructor({bucket:t,key:e,resourceName:r,id:i,original:n,...s}){if("string"!=typeof e)throw new Error("key must be a string");if("string"!=typeof t)throw new Error("bucket must be a string");super(`Not found: ${e} [bucket:${t}]`,{bucket:t,key:e,resourceName:r,id:i,original:n,...s}),this.resourceName=r,this.id=i}}class P extends j{constructor({bucket:t,original:e,...r}){if("string"!=typeof t)throw new Error("bucket must be a string");super(`Missing metadata for bucket [bucket:${t}]`,{bucket:t,original:e,...r})}}class I extends j{constructor({bucket:t,resourceName:e,attributes:r,validation:i,message:n,original:s,...o}){if("string"!=typeof t)throw new Error("bucket must be a string");if("string"!=typeof e)throw new Error("resourceName must be a string");super(n||`Validation error: This item is not valid. Resource=${e} [bucket:${t}].\n${JSON.stringify(i,null,2)}`,{bucket:t,resourceName:e,attributes:r,validation:i,original:s,...o})}}class C extends j{}const M={NotFound:N,NoSuchKey:E,UnknownError:C,NoSuchBucket:A,MissingMetadata:P,InvalidResourceItem:I};function T(t,e={}){const r=t.code||t.Code||t.name,i=t.$metadata?{...t.$metadata}:void 0,n=e.commandName,s=e.commandInput;let o;return"NoSuchKey"===r||"NotFound"===r?(o="Check if the key exists in the specified bucket and if your credentials have permission.",new E({...e,original:t,metadata:i,commandName:n,commandInput:s,suggestion:o})):"NoSuchBucket"===r?(o="Check if the bucket exists and if your credentials have permission.",new A({...e,original:t,metadata:i,commandName:n,commandInput:s,suggestion:o})):"AccessDenied"===r||403===t.statusCode||"Forbidden"===r?(o="Check your credentials and bucket policy.",new R("Access denied",{...e,original:t,metadata:i,commandName:n,commandInput:s,suggestion:o})):"ValidationError"===r||400===t.statusCode?(o="Check the request parameters and payload.",new x("Validation error",{...e,original:t,metadata:i,commandName:n,commandInput:s,suggestion:o})):"MissingMetadata"===r?(o="Check if the object metadata is present and valid.",new P({...e,original:t,metadata:i,commandName:n,commandInput:s,suggestion:o})):(o="Check the error details and AWS documentation.",new C("Unknown error",{...e,original:t,metadata:i,commandName:n,commandInput:s,suggestion:o}))}class L extends j{constructor(t,e={}){super(t,{...e,suggestion:"Check the connection string format and credentials."})}}class $ extends j{constructor(t,e={}){super(t,{...e,suggestion:"Check if the crypto library is available and input is valid."})}}class U extends j{constructor(t,e={}){super(t,{...e,suggestion:"Check schema definition and input data."})}}class B extends j{constructor(t,e={}){super(t,{...e,suggestion:e.suggestion||"Check resource configuration, attributes, and operation context."}),Object.assign(this,e)}}class F extends j{constructor(t,e={}){super(t,{...e,suggestion:e.suggestion||"Check partition definition, fields, and input values."})}}function V(t){if(null==t){const t=new Error("fnOrPromise cannot be null or undefined");return t.stack=(new Error).stack,[!1,t,void 0]}if("function"==typeof t)try{const e=t();return null==e?[!0,null,e]:"function"==typeof e.then?e.then(t=>[!0,null,t]).catch(t=>{if(t instanceof Error&&Object.isExtensible(t)){const e=Object.getOwnPropertyDescriptor(t,"stack");if(e&&e.writable&&e.configurable&&t.hasOwnProperty("stack"))try{t.stack=(new Error).stack}catch(t){}}return[!1,t,void 0]}):[!0,null,e]}catch(t){if(t instanceof Error&&Object.isExtensible(t)){const e=Object.getOwnPropertyDescriptor(t,"stack");if(e&&e.writable&&e.configurable&&t.hasOwnProperty("stack"))try{t.stack=(new Error).stack}catch(t){}}return[!1,t,void 0]}return"function"==typeof t.then?Promise.resolve(t).then(t=>[!0,null,t]).catch(t=>{if(t instanceof Error&&Object.isExtensible(t)){const e=Object.getOwnPropertyDescriptor(t,"stack");if(e&&e.writable&&e.configurable&&t.hasOwnProperty("stack"))try{t.stack=(new Error).stack}catch(t){}}return[!1,t,void 0]}):[!0,null,t]}function z(t){try{return[!0,null,t()]}catch(t){return[!1,t,null]}}var K=V;async function H(){let t;if("undefined"!=typeof process){const[e,r,i]=await K(async()=>{const{webcrypto:t}=await import("crypto");return t});if(!e)throw new $("Crypto API not available",{original:r,context:"dynamicCrypto"});t=i}else"undefined"!=typeof window&&(t=window.crypto);if(!t)throw new $("Could not load any crypto library",{context:"dynamicCrypto"});return t}async function q(t){const[e,r,i]=await K(H);if(!e)throw new $("Crypto API not available",{original:r});const n=(new TextEncoder).encode(t),[s,o,a]=await K(()=>i.subtle.digest("SHA-256",n));if(!s)throw new $("SHA-256 digest failed",{original:o,input:t});return Array.from(new Uint8Array(a)).map(t=>t.toString(16).padStart(2,"0")).join("")}async function W(t,e){const[r,i,n]=await K(H);if(!r)throw new $("Crypto API not available",{original:i});const s=n.getRandomValues(new Uint8Array(16)),[o,a,c]=await K(()=>G(e,s));if(!o)throw new $("Key derivation failed",{original:a,passphrase:e,salt:s});const u=n.getRandomValues(new Uint8Array(12)),l=(new TextEncoder).encode(t),[h,f,d]=await K(()=>n.subtle.encrypt({name:"AES-GCM",iv:u},c,l));if(!h)throw new $("Encryption failed",{original:f,content:t});const p=new Uint8Array(s.length+u.length+d.byteLength);return p.set(s),p.set(u,s.length),p.set(new Uint8Array(d),s.length+u.length),function(t){if("undefined"!=typeof process)return Buffer.from(t).toString("base64");{const[e,r,i]=z(()=>String.fromCharCode.apply(null,new Uint8Array(t)));if(!e)throw new $("Failed to convert ArrayBuffer to base64 (browser)",{original:r});return window.btoa(i)}}(p)}async function J(t,e){const[r,i,n]=await K(H);if(!r)throw new $("Crypto API not available",{original:i});const s=function(t){if("undefined"!=typeof process)return new Uint8Array(Buffer.from(t,"base64"));{const[e,r,i]=z(()=>window.atob(t));if(!e)throw new $("Failed to decode base64 (browser)",{original:r});const n=i.length,s=new Uint8Array(n);for(let t=0;t<n;t++)s[t]=i.charCodeAt(t);return s}}(t),o=s.slice(0,16),a=s.slice(16,28),c=s.slice(28),[u,l,h]=await K(()=>G(e,o));if(!u)throw new $("Key derivation failed (decrypt)",{original:l,passphrase:e,salt:o});const[f,d,p]=await K(()=>n.subtle.decrypt({name:"AES-GCM",iv:a},h,c));if(!f)throw new $("Decryption failed",{original:d,encryptedBase64:t});return(new TextDecoder).decode(p)}async function Y(t){if("undefined"==typeof process)throw new $("MD5 hashing is only available in Node.js environment",{context:"md5"});const[e,r,i]=await K(async()=>{const{createHash:e}=await import("crypto");return e("md5").update(t).digest("base64")});if(!e)throw new $("MD5 hashing failed",{original:r,data:t});return i}async function G(t,e){const[r,i,n]=await K(H);if(!r)throw new $("Crypto API not available",{original:i});const s=(new TextEncoder).encode(t),[o,a,c]=await K(()=>n.subtle.importKey("raw",s,{name:"PBKDF2"},!1,["deriveKey"]));if(!o)throw new $("importKey failed",{original:a,passphrase:t});const[u,l,h]=await K(()=>n.subtle.deriveKey({name:"PBKDF2",salt:e,iterations:1e5,hash:"SHA-256"},c,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]));if(!u)throw new $("deriveKey failed",{original:l,passphrase:t,salt:e});return h}const Z=e.customAlphabet(e.urlAlphabet,22),Q=e.customAlphabet("ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789",16);var X;function tt(){}function et(){et.init.call(this)}function rt(t){return void 0===t._maxListeners?et.defaultMaxListeners:t._maxListeners}function it(t,e,r,i){var n,s,o,a;if("function"!=typeof r)throw new TypeError('"listener" argument must be a function');if((s=t._events)?(s.newListener&&(t.emit("newListener",e,r.listener?r.listener:r),s=t._events),o=s[e]):(s=t._events=new tt,t._eventsCount=0),o){if("function"==typeof o?o=s[e]=i?[r,o]:[o,r]:i?o.unshift(r):o.push(r),!o.warned&&(n=rt(t))&&n>0&&o.length>n){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+e+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=t,c.type=e,c.count=o.length,a=c,"function"==typeof console.warn?console.warn(a):console.log(a)}}else o=s[e]=r,++t._eventsCount;return t}function nt(t,e,r){var i=!1;function n(){t.removeListener(e,n),i||(i=!0,r.apply(t,arguments))}return n.listener=r,n}function st(t){var e=this._events;if(e){var r=e[t];if("function"==typeof r)return 1;if(r)return r.length}return 0}function ot(t,e){for(var r=new Array(e);e--;)r[e]=t[e];return r}tt.prototype=Object.create(null),et.EventEmitter=et,et.usingDomains=!1,et.prototype.domain=void 0,et.prototype._events=void 0,et.prototype._maxListeners=void 0,et.defaultMaxListeners=10,et.init=function(){this.domain=null,et.usingDomains&&(!X.active||this instanceof X.Domain||(this.domain=X.active)),this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new tt,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},et.prototype.setMaxListeners=function(t){if("number"!=typeof t||t<0||isNaN(t))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=t,this},et.prototype.getMaxListeners=function(){return rt(this)},et.prototype.emit=function(t){var e,r,i,n,s,o,a,c="error"===t;if(o=this._events)c=c&&null==o.error;else if(!c)return!1;if(a=this.domain,c){if(e=arguments[1],!a){if(e instanceof Error)throw e;var u=new Error('Uncaught, unspecified "error" event. ('+e+")");throw u.context=e,u}return e||(e=new Error('Uncaught, unspecified "error" event')),e.domainEmitter=this,e.domain=a,e.domainThrown=!1,a.emit("error",e),!1}if(!(r=o[t]))return!1;var l="function"==typeof r;switch(i=arguments.length){case 1:!function(t,e,r){if(e)t.call(r);else for(var i=t.length,n=ot(t,i),s=0;s<i;++s)n[s].call(r)}(r,l,this);break;case 2:!function(t,e,r,i){if(e)t.call(r,i);else for(var n=t.length,s=ot(t,n),o=0;o<n;++o)s[o].call(r,i)}(r,l,this,arguments[1]);break;case 3:!function(t,e,r,i,n){if(e)t.call(r,i,n);else for(var s=t.length,o=ot(t,s),a=0;a<s;++a)o[a].call(r,i,n)}(r,l,this,arguments[1],arguments[2]);break;case 4:!function(t,e,r,i,n,s){if(e)t.call(r,i,n,s);else for(var o=t.length,a=ot(t,o),c=0;c<o;++c)a[c].call(r,i,n,s)}(r,l,this,arguments[1],arguments[2],arguments[3]);break;default:for(n=new Array(i-1),s=1;s<i;s++)n[s-1]=arguments[s];!function(t,e,r,i){if(e)t.apply(r,i);else for(var n=t.length,s=ot(t,n),o=0;o<n;++o)s[o].apply(r,i)}(r,l,this,n)}return!0},et.prototype.addListener=function(t,e){return it(this,t,e,!1)},et.prototype.on=et.prototype.addListener,et.prototype.prependListener=function(t,e){return it(this,t,e,!0)},et.prototype.once=function(t,e){if("function"!=typeof e)throw new TypeError('"listener" argument must be a function');return this.on(t,nt(this,t,e)),this},et.prototype.prependOnceListener=function(t,e){if("function"!=typeof e)throw new TypeError('"listener" argument must be a function');return this.prependListener(t,nt(this,t,e)),this},et.prototype.removeListener=function(t,e){var r,i,n,s,o;if("function"!=typeof e)throw new TypeError('"listener" argument must be a function');if(!(i=this._events))return this;if(!(r=i[t]))return this;if(r===e||r.listener&&r.listener===e)0===--this._eventsCount?this._events=new tt:(delete i[t],i.removeListener&&this.emit("removeListener",t,r.listener||e));else if("function"!=typeof r){for(n=-1,s=r.length;s-- >0;)if(r[s]===e||r[s].listener&&r[s].listener===e){o=r[s].listener,n=s;break}if(n<0)return this;if(1===r.length){if(r[0]=void 0,0===--this._eventsCount)return this._events=new tt,this;delete i[t]}else!function(t,e){for(var r=e,i=r+1,n=t.length;i<n;r+=1,i+=1)t[r]=t[i];t.pop()}(r,n);i.removeListener&&this.emit("removeListener",t,o||e)}return this},et.prototype.off=function(t,e){return this.removeListener(t,e)},et.prototype.removeAllListeners=function(t){var e,r;if(!(r=this._events))return this;if(!r.removeListener)return 0===arguments.length?(this._events=new tt,this._eventsCount=0):r[t]&&(0===--this._eventsCount?this._events=new tt:delete r[t]),this;if(0===arguments.length){for(var i,n=Object.keys(r),s=0;s<n.length;++s)"removeListener"!==(i=n[s])&&this.removeAllListeners(i);return this.removeAllListeners("removeListener"),this._events=new tt,this._eventsCount=0,this}if("function"==typeof(e=r[t]))this.removeListener(t,e);else if(e)do{this.removeListener(t,e[e.length-1])}while(e[0]);return this},et.prototype.listeners=function(t){var e,r=this._events;return r&&(e=r[t])?"function"==typeof e?[e.listener||e]:function(t){for(var e=new Array(t.length),r=0;r<e.length;++r)e[r]=t[r].listener||t[r];return e}(e):[]},et.listenerCount=function(t,e){return"function"==typeof t.listenerCount?t.listenerCount(e):st.call(t,e)},et.prototype.listenerCount=st,et.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};var at=class extends et{constructor(t={}){super(),this.name=this.constructor.name,this.options=t,this.hooks=new Map}async setup(t){this.database=t,this.beforeSetup(),await this.onSetup(),this.afterSetup()}async start(){this.beforeStart(),await this.onStart(),this.afterStart()}async stop(){this.beforeStop(),await this.onStop(),this.afterStop()}async onSetup(){}async onStart(){}async onStop(){}addHook(t,e,r){this.hooks.has(t)||this.hooks.set(t,new Map);const i=this.hooks.get(t);i.has(e)||i.set(e,[]),i.get(e).push(r)}removeHook(t,e,r){const i=this.hooks.get(t);if(i&&i.has(e)){const t=i.get(e),n=t.indexOf(r);n>-1&&t.splice(n,1)}}wrapResourceMethod(t,e,r){const i=t[e];if(t._pluginWrappers||(t._pluginWrappers=new Map),t._pluginWrappers.has(e)||t._pluginWrappers.set(e,[]),t._pluginWrappers.get(e).push(r),!t[`_wrapped_${e}`]){t[`_wrapped_${e}`]=i;const r=i&&i._isMockFunction;t[e]=async function(...r){let i=await t[`_wrapped_${e}`](...r);for(const n of t._pluginWrappers.get(e))i=await n.call(this,i,r,e);return i},r&&(Object.setPrototypeOf(t[e],Object.getPrototypeOf(i)),Object.assign(t[e],i))}}addMiddleware(t,e,r){if(t._pluginMiddlewares||(t._pluginMiddlewares={}),!t._pluginMiddlewares[e]){t._pluginMiddlewares[e]=[];const r=t[e].bind(t);t[e]=async function(...i){let n=-1;const s=async(...i)=>(n++,n<t._pluginMiddlewares[e].length?await t._pluginMiddlewares[e][n].call(this,s,...i):await r(...i));return await s(...i)}}t._pluginMiddlewares[e].push(r)}getPartitionValues(t,e){if(!e.config?.partitions)return{};const r={};for(const[i,n]of Object.entries(e.config.partitions))if(n.fields){r[i]={};for(const[s,o]of Object.entries(n.fields)){const n=this.getNestedFieldValue(t,s);null!=n&&(r[i][s]=e.applyPartitionRule(n,o))}}else r[i]={};return r}getNestedFieldValue(t,e){if(!e.includes("."))return t[e]??null;const r=e.split(".");let i=t;for(const t of r){if(!i||"object"!=typeof i||!(t in i))return null;i=i[t]}return i??null}beforeSetup(){this.emit("plugin.beforeSetup",new Date)}afterSetup(){this.emit("plugin.afterSetup",new Date)}beforeStart(){this.emit("plugin.beforeStart",new Date)}afterStart(){this.emit("plugin.afterStart",new Date)}beforeStop(){this.emit("plugin.beforeStop",new Date)}afterStop(){this.emit("plugin.afterStop",new Date)}};const ct={setup(t){},start(){},stop(){}};function ut(t,e){for(var r=0,i=t.length-1;i>=0;i--){var n=t[i];"."===n?t.splice(i,1):".."===n?(t.splice(i,1),r++):r&&(t.splice(i,1),r--)}if(e)for(;r--;r)t.unshift("..");return t}var lt=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,ht=function(t){return lt.exec(t).slice(1)};function ft(){for(var t="",e=!1,r=arguments.length-1;r>=-1&&!e;r--){var i=r>=0?arguments[r]:"/";if("string"!=typeof i)throw new TypeError("Arguments to path.resolve must be strings");i&&(t=i+"/"+t,e="/"===i.charAt(0))}return(e?"/":"")+(t=ut(yt(t.split("/"),function(t){return!!t}),!e).join("/"))||"."}function dt(t){var e=pt(t),r="/"===bt(t,-1);return(t=ut(yt(t.split("/"),function(t){return!!t}),!e).join("/"))||e||(t="."),t&&r&&(t+="/"),(e?"/":"")+t}function pt(t){return"/"===t.charAt(0)}function mt(){return dt(yt(Array.prototype.slice.call(arguments,0),function(t,e){if("string"!=typeof t)throw new TypeError("Arguments to path.join must be strings");return t}).join("/"))}var gt={extname:function(t){return ht(t)[3]},basename:function(t,e){var r=ht(t)[2];return e&&r.substr(-1*e.length)===e&&(r=r.substr(0,r.length-e.length)),r},dirname:function(t){var e=ht(t),r=e[0],i=e[1];return r||i?(i&&(i=i.substr(0,i.length-1)),r+i):"."},sep:"/",delimiter:":",relative:function(t,e){function r(t){for(var e=0;e<t.length&&""===t[e];e++);for(var r=t.length-1;r>=0&&""===t[r];r--);return e>r?[]:t.slice(e,r-e+1)}t=ft(t).substr(1),e=ft(e).substr(1);for(var i=r(t.split("/")),n=r(e.split("/")),s=Math.min(i.length,n.length),o=s,a=0;a<s;a++)if(i[a]!==n[a]){o=a;break}var c=[];for(a=o;a<i.length;a++)c.push("..");return(c=c.concat(n.slice(o))).join("/")},join:mt,isAbsolute:pt,normalize:dt,resolve:ft};function yt(t,e){if(t.filter)return t.filter(e);for(var r=[],i=0;i<t.length;i++)e(t[i],i,t)&&r.push(t[i]);return r}var bt="b"==="ab".substr(-1)?function(t,e,r){return t.substr(e,r)}:function(t,e,r){return e<0&&(e=t.length+e),t.substr(e,r)};class wt extends et{constructor(t={}){super(),this.config=t}async _set(t,e){}async _get(t){}async _del(t){}async _clear(t){}validateKey(t){if(null==t||"string"!=typeof t||!t)throw new Error("Invalid key")}async set(t,e){return this.validateKey(t),await this._set(t,e),this.emit("set",e),e}async get(t){this.validateKey(t);const e=await this._get(t);return this.emit("get",e),e}async del(t){this.validateKey(t);const e=await this._del(t);return this.emit("delete",e),e}async delete(t){return this.del(t)}async clear(t){const e=await this._clear(t);return this.emit("clear",e),e}}function vt(){throw new Error("setTimeout has not been defined")}function kt(){throw new Error("clearTimeout has not been defined")}var Ot=vt,St=kt;function _t(t){if(Ot===setTimeout)return setTimeout(t,0);if((Ot===vt||!Ot)&&setTimeout)return Ot=setTimeout,setTimeout(t,0);try{return Ot(t,0)}catch(e){try{return Ot.call(null,t,0)}catch(e){return Ot.call(this,t,0)}}}"function"==typeof global.setTimeout&&(Ot=setTimeout),"function"==typeof global.clearTimeout&&(St=clearTimeout);var jt,xt=[],Rt=!1,Dt=-1;function At(){Rt&&jt&&(Rt=!1,jt.length?xt=jt.concat(xt):Dt=-1,xt.length&&Et())}function Et(){if(!Rt){var t=_t(At);Rt=!0;for(var e=xt.length;e;){for(jt=xt,xt=[];++Dt<e;)jt&&jt[Dt].run();Dt=-1,e=xt.length}jt=null,Rt=!1,function(t){if(St===clearTimeout)return clearTimeout(t);if((St===kt||!St)&&clearTimeout)return St=clearTimeout,clearTimeout(t);try{return St(t)}catch(e){try{return St.call(null,t)}catch(e){return St.call(this,t)}}}(t)}}function Nt(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)e[r-1]=arguments[r];xt.push(new Pt(t,e)),1!==xt.length||Rt||_t(Et)}function Pt(t,e){this.fun=t,this.array=e}Pt.prototype.run=function(){this.fun.apply(null,this.array)};var It,Ct={env:{}};It="function"==typeof Object.create?function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:function(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t};var Mt=/%[sdj%]/g;function Tt(t){if(!Jt(t)){for(var e=[],r=0;r<arguments.length;r++)e.push(Bt(arguments[r]));return e.join(" ")}r=1;for(var i=arguments,n=i.length,s=String(t).replace(Mt,function(t){if("%%"===t)return"%";if(r>=n)return t;switch(t){case"%s":return String(i[r++]);case"%d":return Number(i[r++]);case"%j":try{return JSON.stringify(i[r++])}catch(t){return"[Circular]"}default:return t}}),o=i[r];r<n;o=i[++r])Wt(o)||!Zt(o)?s+=" "+o:s+=" "+Bt(o);return s}function Lt(t,e){if(Yt(global.process))return function(){return Lt(t,e).apply(this,arguments)};if(!0===Ct.noDeprecation)return t;var r=!1;return function(){if(!r){if(Ct.throwDeprecation)throw new Error(e);Ct.traceDeprecation?console.trace(e):console.error(e),r=!0}return t.apply(this,arguments)}}var $t,Ut={};function Bt(t,e){var r={seen:[],stylize:Vt};return arguments.length>=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),qt(e)?r.showHidden=e:e&&function(t,e){if(!e||!Zt(e))return t;var r=Object.keys(e),i=r.length;for(;i--;)t[r[i]]=e[r[i]]}(r,e),Yt(r.showHidden)&&(r.showHidden=!1),Yt(r.depth)&&(r.depth=2),Yt(r.colors)&&(r.colors=!1),Yt(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=Ft),zt(r,t,r.depth)}function Ft(t,e){var r=Bt.styles[e];return r?"["+Bt.colors[r][0]+"m"+t+"["+Bt.colors[r][1]+"m":t}function Vt(t,e){return t}function zt(t,e,r){if(t.customInspect&&e&&te(e.inspect)&&e.inspect!==Bt&&(!e.constructor||e.constructor.prototype!==e)){var i=e.inspect(r,t);return Jt(i)||(i=zt(t,i,r)),i}var n=function(t,e){if(Yt(e))return t.stylize("undefined","undefined");if(Jt(e)){var r="'"+JSON.stringify(e).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return t.stylize(r,"string")}if(i=e,"number"==typeof i)return t.stylize(""+e,"number");var i;if(qt(e))return t.stylize(""+e,"boolean");if(Wt(e))return t.stylize("null","null")}(t,e);if(n)return n;var s=Object.keys(e),o=function(t){var e={};return t.forEach(function(t,r){e[t]=!0}),e}(s);if(t.showHidden&&(s=Object.getOwnPropertyNames(e)),Xt(e)&&(s.indexOf("message")>=0||s.indexOf("description")>=0))return Kt(e);if(0===s.length){if(te(e)){var a=e.name?": "+e.name:"";return t.stylize("[Function"+a+"]","special")}if(Gt(e))return t.stylize(RegExp.prototype.toString.call(e),"regexp");if(Qt(e))return t.stylize(Date.prototype.toString.call(e),"date");if(Xt(e))return Kt(e)}var c,u,l="",h=!1,f=["{","}"];(c=e,Array.isArray(c)&&(h=!0,f=["[","]"]),te(e))&&(l=" [Function"+(e.name?": "+e.name:"")+"]");return Gt(e)&&(l=" "+RegExp.prototype.toString.call(e)),Qt(e)&&(l=" "+Date.prototype.toUTCString.call(e)),Xt(e)&&(l=" "+Kt(e)),0!==s.length||h&&0!=e.length?r<0?Gt(e)?t.stylize(RegExp.prototype.toString.call(e),"regexp"):t.stylize("[Object]","special"):(t.seen.push(e),u=h?function(t,e,r,i,n){for(var s=[],o=0,a=e.length;o<a;++o)re(e,String(o))?s.push(Ht(t,e,r,i,String(o),!0)):s.push("");return n.forEach(function(n){n.match(/^\d+$/)||s.push(Ht(t,e,r,i,n,!0))}),s}(t,e,r,o,s):s.map(function(i){return Ht(t,e,r,o,i,h)}),t.seen.pop(),function(t,e,r){var i=t.reduce(function(t,e){return e.indexOf("\n"),t+e.replace(/\u001b\[\d\d?m/g,"").length+1},0);if(i>60)return r[0]+(""===e?"":e+"\n ")+" "+t.join(",\n ")+" "+r[1];return r[0]+e+" "+t.join(", ")+" "+r[1]}(u,l,f)):f[0]+l+f[1]}function Kt(t){return"["+Error.prototype.toString.call(t)+"]"}function Ht(t,e,r,i,n,s){var o,a,c;if((c=Object.getOwnPropertyDescriptor(e,n)||{value:e[n]}).get?a=c.set?t.stylize("[Getter/Setter]","special"):t.stylize("[Getter]","special"):c.set&&(a=t.stylize("[Setter]","special")),re(i,n)||(o="["+n+"]"),a||(t.seen.indexOf(c.value)<0?(a=Wt(r)?zt(t,c.value,null):zt(t,c.value,r-1)).indexOf("\n")>-1&&(a=s?a.split("\n").map(function(t){return" "+t}).join("\n").substr(2):"\n"+a.split("\n").map(function(t){return" "+t}).join("\n")):a=t.stylize("[Circular]","special")),Yt(o)){if(s&&n.match(/^\d+$/))return a;(o=JSON.stringify(""+n)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(o=o.substr(1,o.length-2),o=t.stylize(o,"name")):(o=o.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),o=t.stylize(o,"string"))}return o+": "+a}function qt(t){return"boolean"==typeof t}function Wt(t){return null===t}function Jt(t){return"string"==typeof t}function Yt(t){return void 0===t}function Gt(t){return Zt(t)&&"[object RegExp]"===ee(t)}function Zt(t){return"object"==typeof t&&null!==t}function Qt(t){return Zt(t)&&"[object Date]"===ee(t)}function Xt(t){return Zt(t)&&("[object Error]"===ee(t)||t instanceof Error)}function te(t){return"function"==typeof t}function ee(t){return Object.prototype.toString.call(t)}function re(t,e){return Object.prototype.hasOwnProperty.call(t,e)}Bt.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},Bt.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"};var ie=[],ne=[],se="undefined"!=typeof Uint8Array?Uint8Array:Array,oe=!1;function ae(){oe=!0;for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e=0;e<64;++e)ie[e]=t[e],ne[t.charCodeAt(e)]=e;ne["-".charCodeAt(0)]=62,ne["_".charCodeAt(0)]=63}function ce(t){return ie[t>>18&63]+ie[t>>12&63]+ie[t>>6&63]+ie[63&t]}function ue(t,e,r){for(var i,n=[],s=e;s<r;s+=3)i=(t[s]<<16)+(t[s+1]<<8)+t[s+2],n.push(ce(i));return n.join("")}function le(t){var e;oe||ae();for(var r=t.length,i=r%3,n="",s=[],o=16383,a=0,c=r-i;a<c;a+=o)s.push(ue(t,a,a+o>c?c:a+o));return 1===i?(e=t[r-1],n+=ie[e>>2],n+=ie[e<<4&63],n+="=="):2===i&&(e=(t[r-2]<<8)+t[r-1],n+=ie[e>>10],n+=ie[e>>4&63],n+=ie[e<<2&63],n+="="),s.push(n),s.join("")}function he(t,e,r,i,n){var s,o,a=8*n-i-1,c=(1<<a)-1,u=c>>1,l=-7,h=r?n-1:0,f=r?-1:1,d=t[e+h];for(h+=f,s=d&(1<<-l)-1,d>>=-l,l+=a;l>0;s=256*s+t[e+h],h+=f,l-=8);for(o=s&(1<<-l)-1,s>>=-l,l+=i;l>0;o=256*o+t[e+h],h+=f,l-=8);if(0===s)s=1-u;else{if(s===c)return o?NaN:1/0*(d?-1:1);o+=Math.pow(2,i),s-=u}return(d?-1:1)*o*Math.pow(2,s-i)}function fe(t,e,r,i,n,s){var o,a,c,u=8*s-n-1,l=(1<<u)-1,h=l>>1,f=23===n?Math.pow(2,-24)-Math.pow(2,-77):0,d=i?0:s-1,p=i?1:-1,m=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,o=l):(o=Math.floor(Math.log(e)/Math.LN2),e*(c=Math.pow(2,-o))<1&&(o--,c*=2),(e+=o+h>=1?f/c:f*Math.pow(2,1-h))*c>=2&&(o++,c/=2),o+h>=l?(a=0,o=l):o+h>=1?(a=(e*c-1)*Math.pow(2,n),o+=h):(a=e*Math.pow(2,h-1)*Math.pow(2,n),o=0));n>=8;t[r+d]=255&a,d+=p,a/=256,n-=8);for(o=o<<n|a,u+=n;u>0;t[r+d]=255&o,d+=p,o/=256,u-=8);t[r+d-p]|=128*m}var de={}.toString,pe=Array.isArray||function(t){return"[object Array]"==de.call(t)};function me(){return ye.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function ge(t,e){if(me()<e)throw new RangeError("Invalid typed array length");return ye.TYPED_ARRAY_SUPPORT?(t=new Uint8Array(e)).__proto__=ye.prototype:(null===t&&(t=new ye(e)),t.length=e),t}function ye(t,e,r){if(!(ye.TYPED_ARRAY_SUPPORT||this instanceof ye))return new ye(t,e,r);if("number"==typeof t){if("string"==typeof e)throw new Error("If encoding is specified then the first argument must be a string");return ve(this,t)}return be(this,t,e,r)}function be(t,e,r,i){if("number"==typeof e)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer?function(t,e,r,i){if(e.byteLength,r<0||e.byteLength<r)throw new RangeError("'offset' is out of bounds");if(e.byteLength<r+(i||0))throw new RangeError("'length' is out of bounds");e=void 0===r&&void 0===i?new Uint8Array(e):void 0===i?new Uint8Array(e,r):new Uint8Array(e,r,i);ye.TYPED_ARRAY_SUPPORT?(t=e).__proto__=ye.prototype:t=ke(t,e);return t}(t,e,r,i):"string"==typeof e?function(t,e,r){"string"==typeof r&&""!==r||(r="utf8");if(!ye.isEncoding(r))throw new TypeError('"encoding" must be a valid string encoding');var i=0|_e(e,r);t=ge(t,i);var n=t.write(e,r);n!==i&&(t=t.slice(0,n));return t}(t,e,r):function(t,e){if(Se(e)){var r=0|Oe(e.length);return 0===(t=ge(t,r)).length||e.copy(t,0,0,r),t}if(e){if("undefined"!=typeof ArrayBuffer&&e.buffer instanceof ArrayBuffer||"length"in e)return"number"!=typeof e.length||(i=e.length)!=i?ge(t,0):ke(t,e);if("Buffer"===e.type&&pe(e.data))return ke(t,e.data)}var i;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(t,e)}function we(t){if("number"!=typeof t)throw new TypeError('"size" argument must be a number');if(t<0)throw new RangeError('"size" argument must not be negative')}function ve(t,e){if(we(e),t=ge(t,e<0?0:0|Oe(e)),!ye.TYPED_ARRAY_SUPPORT)for(var r=0;r<e;++r)t[r]=0;return t}function ke(t,e){var r=e.length<0?0:0|Oe(e.length);t=ge(t,r);for(var i=0;i<r;i+=1)t[i]=255&e[i];return t}function Oe(t){if(t>=me())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+me().toString(16)+" bytes");return 0|t}function Se(t){return!(null==t||!t._isBuffer)}function _e(t,e){if(Se(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var r=t.length;if(0===r)return 0;for(var i=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return Ze(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return Qe(t).length;default:if(i)return Ze(t).length;e=(""+e).toLowerCase(),i=!0}}function je(t,e,r){var i=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return Be(this,e,r);case"utf8":case"utf-8":return Te(this,e,r);case"ascii":return $e(this,e,r);case"latin1":case"binary":return Ue(this,e,r);case"base64":return Me(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Fe(this,e,r);default:if(i)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),i=!0}}function xe(t,e,r){var i=t[e];t[e]=t[r],t[r]=i}function Re(t,e,r,i,n){if(0===t.length)return-1;if("string"==typeof r?(i=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=n?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(n)return-1;r=t.length-1}else if(r<0){if(!n)return-1;r=0}if("string"==typeof e&&(e=ye.from(e,i)),Se(e))return 0===e.length?-1:De(t,e,r,i,n);if("number"==typeof e)return e&=255,ye.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?n?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):De(t,[e],r,i,n);throw new TypeError("val must be string, number or Buffer")}function De(t,e,r,i,n){var s,o=1,a=t.length,c=e.length;if(void 0!==i&&("ucs2"===(i=String(i).toLowerCase())||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(t.length<2||e.length<2)return-1;o=2,a/=2,c/=2,r/=2}function u(t,e){return 1===o?t[e]:t.readUInt16BE(e*o)}if(n){var l=-1;for(s=r;s<a;s++)if(u(t,s)===u(e,-1===l?0:s-l)){if(-1===l&&(l=s),s-l+1===c)return l*o}else-1!==l&&(s-=s-l),l=-1}else for(r+c>a&&(r=a-c),s=r;s>=0;s--){for(var h=!0,f=0;f<c;f++)if(u(t,s+f)!==u(e,f)){h=!1;break}if(h)return s}return-1}function Ae(t,e,r,i){r=Number(r)||0;var n=t.length-r;i?(i=Number(i))>n&&(i=n):i=n;var s=e.length;if(s%2!=0)throw new TypeError("Invalid hex string");i>s/2&&(i=s/2);for(var o=0;o<i;++o){var a=parseInt(e.substr(2*o,2),16);if(isNaN(a))return o;t[r+o]=a}return o}function Ee(t,e,r,i){return Xe(Ze(e,t.length-r),t,r,i)}function Ne(t,e,r,i){return Xe(function(t){for(var e=[],r=0;r<t.length;++r)e.push(255&t.charCodeAt(r));return e}(e),t,r,i)}function Pe(t,e,r,i){return Ne(t,e,r,i)}function Ie(t,e,r,i){return Xe(Qe(e),t,r,i)}function Ce(t,e,r,i){return Xe(function(t,e){for(var r,i,n,s=[],o=0;o<t.length&&!((e-=2)<0);++o)i=(r=t.charCodeAt(o))>>8,n=r%256,s.push(n),s.push(i);return s}(e,t.length-r),t,r,i)}function Me(t,e,r){return 0===e&&r===t.length?le(t):le(t.slice(e,r))}function Te(t,e,r){r=Math.min(t.length,r);for(var i=[],n=e;n<r;){var s,o,a,c,u=t[n],l=null,h=u>239?4:u>223?3:u>191?2:1;if(n+h<=r)switch(h){case 1:u<128&&(l=u);break;case 2:128==(192&(s=t[n+1]))&&(c=(31&u)<<6|63&s)>127&&(l=c);break;case 3:s=t[n+1],o=t[n+2],128==(192&s)&&128==(192&o)&&(c=(15&u)<<12|(63&s)<<6|63&o)>2047&&(c<55296||c>57343)&&(l=c);break;case 4:s=t[n+1],o=t[n+2],a=t[n+3],128==(192&s)&&128==(192&o)&&128==(192&a)&&(c=(15&u)<<18|(63&s)<<12|(63&o)<<6|63&a)>65535&&c<1114112&&(l=c)}null===l?(l=65533,h=1):l>65535&&(l-=65536,i.push(l>>>10&1023|55296),l=56320|1023&l),i.push(l),n+=h}return function(t){var e=t.length;if(e<=Le)return String.fromCharCode.apply(String,t);var r="",i=0;for(;i<e;)r+=String.fromCharCode.apply(String,t.slice(i,i+=Le));return r}(i)}ye.TYPED_ARRAY_SUPPORT=void 0===global.TYPED_ARRAY_SUPPORT||global.TYPED_ARRAY_SUPPORT,me(),ye.poolSize=8192,ye._augment=function(t){return t.__proto__=ye.prototype,t},ye.from=function(t,e,r){return be(null,t,e,r)},ye.TYPED_ARRAY_SUPPORT&&(ye.prototype.__proto__=Uint8Array.prototype,ye.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&ye[Symbol.species]),ye.alloc=function(t,e,r){return function(t,e,r,i){return we(e),e<=0?ge(t,e):void 0!==r?"string"==typeof i?ge(t,e).fill(r,i):ge(t,e).fill(r):ge(t,e)}(null,t,e,r)},ye.allocUnsafe=function(t){return ve(null,t)},ye.allocUnsafeSlow=function(t){return ve(null,t)},ye.isBuffer=function(t){return null!=t&&(!!t._isBuffer||tr(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&tr(t.slice(0,0))}(t))},ye.compare=function(t,e){if(!Se(t)||!Se(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var r=t.length,i=e.length,n=0,s=Math.min(r,i);n<s;++n)if(t[n]!==e[n]){r=t[n],i=e[n];break}return r<i?-1:i<r?1:0},ye.isEncoding=function(t){switch(String(t).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},ye.concat=function(t,e){if(!pe(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return ye.alloc(0);var r;if(void 0===e)for(e=0,r=0;r<t.length;++r)e+=t[r].length;var i=ye.allocUnsafe(e),n=0;for(r=0;r<t.length;++r){var s=t[r];if(!Se(s))throw new TypeError('"list" argument must be an Array of Buffers');s.copy(i,n),n+=s.length}return i},ye.byteLength=_e,ye.prototype._isBuffer=!0,ye.prototype.swap16=function(){var t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var e=0;e<t;e+=2)xe(this,e,e+1);return this},ye.prototype.swap32=function(){var t=this.length;if(t%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var e=0;e<t;e+=4)xe(this,e,e+3),xe(this,e+1,e+2);return this},ye.prototype.swap64=function(){var t=this.length;if(t%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var e=0;e<t;e+=8)xe(this,e,e+7),xe(this,e+1,e+6),xe(this,e+2,e+5),xe(this,e+3,e+4);return this},ye.prototype.toString=function(){var t=0|this.length;return 0===t?"":0===arguments.length?Te(this,0,t):je.apply(this,arguments)},ye.prototype.equals=function(t){if(!Se(t))throw new TypeError("Argument must be a Buffer");return this===t||0===ye.compare(this,t)},ye.prototype.inspect=function(){var t="";return this.length>0&&(t=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(t+=" ... ")),"<Buffer "+t+">"},ye.prototype.compare=function(t,e,r,i,n){if(!Se(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===i&&(i=0),void 0===n&&(n=this.length),e<0||r>t.length||i<0||n>this.length)throw new RangeError("out of range index");if(i>=n&&e>=r)return 0;if(i>=n)return-1;if(e>=r)return 1;if(this===t)return 0;for(var s=(n>>>=0)-(i>>>=0),o=(r>>>=0)-(e>>>=0),a=Math.min(s,o),c=this.slice(i,n),u=t.slice(e,r),l=0;l<a;++l)if(c[l]!==u[l]){s=c[l],o=u[l];break}return s<o?-1:o<s?1:0},ye.prototype.includes=function(t,e,r){return-1!==this.indexOf(t,e,r)},ye.prototype.indexOf=function(t,e,r){return Re(this,t,e,r,!0)},ye.prototype.lastIndexOf=function(t,e,r){return Re(this,t,e,r,!1)},ye.prototype.write=function(t,e,r,i){if(void 0===e)i="utf8",r=this.length,e=0;else if(void 0===r&&"string"==typeof e)i=e,r=this.length,e=0;else{if(!isFinite(e))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");e|=0,isFinite(r)?(r|=0,void 0===i&&(i="utf8")):(i=r,r=void 0)}var n=this.length-e;if((void 0===r||r>n)&&(r=n),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");for(var s=!1;;)switch(i){case"hex":return Ae(this,t,e,r);case"utf8":case"utf-8":return Ee(this,t,e,r);case"ascii":return Ne(this,t,e,r);case"latin1":case"binary":return Pe(this,t,e,r);case"base64":return Ie(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Ce(this,t,e,r);default:if(s)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),s=!0}},ye.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var Le=4096;function $e(t,e,r){var i="";r=Math.min(t.length,r);for(var n=e;n<r;++n)i+=String.fromCharCode(127&t[n]);return i}function Ue(t,e,r){var i="";r=Math.min(t.length,r);for(var n=e;n<r;++n)i+=String.fromCharCode(t[n]);return i}function Be(t,e,r){var i=t.length;(!e||e<0)&&(e=0),(!r||r<0||r>i)&&(r=i);for(var n="",s=e;s<r;++s)n+=Ge(t[s]);return n}function Fe(t,e,r){for(var i=t.slice(e,r),n="",s=0;s<i.length;s+=2)n+=String.fromCharCode(i[s]+256*i[s+1]);return n}function Ve(t,e,r){if(t%1!=0||t<0)throw new RangeError("offset is not uint");if(t+e>r)throw new RangeError("Trying to access beyond buffer length")}function ze(t,e,r,i,n,s){if(!Se(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>n||e<s)throw new RangeError('"value" argument is out of bounds');if(r+i>t.length)throw new RangeError("Index out of range")}function Ke(t,e,r,i){e<0&&(e=65535+e+1);for(var n=0,s=Math.min(t.length-r,2);n<s;++n)t[r+n]=(e&255<<8*(i?n:1-n))>>>8*(i?n:1-n)}function He(t,e,r,i){e<0&&(e=4294967295+e+1);for(var n=0,s=Math.min(t.length-r,4);n<s;++n)t[r+n]=e>>>8*(i?n:3-n)&255}function qe(t,e,r,i,n,s){if(r+i>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function We(t,e,r,i,n){return n||qe(t,0,r,4),fe(t,e,r,i,23,4),r+4}function Je(t,e,r,i,n){return n||qe(t,0,r,8),fe(t,e,r,i,52,8),r+8}ye.prototype.slice=function(t,e){var r,i=this.length;if((t=~~t)<0?(t+=i)<0&&(t=0):t>i&&(t=i),(e=void 0===e?i:~~e)<0?(e+=i)<0&&(e=0):e>i&&(e=i),e<t&&(e=t),ye.TYPED_ARRAY_SUPPORT)(r=this.subarray(t,e)).__proto__=ye.prototype;else{var n=e-t;r=new ye(n,void 0);for(var s=0;s<n;++s)r[s]=this[s+t]}return r},ye.prototype.readUIntLE=function(t,e,r){t|=0,e|=0,r||Ve(t,e,this.length);for(var i=this[t],n=1,s=0;++s<e&&(n*=256);)i+=this[t+s]*n;return i},ye.prototype.readUIntBE=function(t,e,r){t|=0,e|=0,r||Ve(t,e,this.length);for(var i=this[t+--e],n=1;e>0&&(n*=256);)i+=this[t+--e]*n;return i},ye.prototype.readUInt8=function(t,e){return e||Ve(t,1,this.length),this[t]},ye.prototype.readUInt16LE=function(t,e){return e||Ve(t,2,this.length),this[t]|this[t+1]<<8},ye.prototype.readUInt16BE=function(t,e){return e||Ve(t,2,this.length),this[t]<<8|this[t+1]},ye.prototype.readUInt32LE=function(t,e){return e||Ve(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},ye.prototype.readUInt32BE=function(t,e){return e||Ve(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},ye.prototype.readIntLE=function(t,e,r){t|=0,e|=0,r||Ve(t,e,this.length);for(var i=this[t],n=1,s=0;++s<e&&(n*=256);)i+=this[t+s]*n;return i>=(n*=128)&&(i-=Math.pow(2,8*e)),i},ye.prototype.readIntBE=function(t,e,r){t|=0,e|=0,r||Ve(t,e,this.length);for(var i=e,n=1,s=this[t+--i];i>0&&(n*=256);)s+=this[t+--i]*n;return s>=(n*=128)&&(s-=Math.pow(2,8*e)),s},ye.prototype.readInt8=function(t,e){return e||Ve(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},ye.prototype.readInt16LE=function(t,e){e||Ve(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},ye.prototype.readInt16BE=function(t,e){e||Ve(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},ye.prototype.readInt32LE=function(t,e){return e||Ve(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},ye.prototype.readInt32BE=function(t,e){return e||Ve(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},ye.prototype.readFloatLE=function(t,e){return e||Ve(t,4,this.length),he(this,t,!0,23,4)},ye.prototype.readFloatBE=function(t,e){return e||Ve(t,4,this.length),he(this,t,!1,23,4)},ye.prototype.readDoubleLE=function(t,e){return e||Ve(t,8,this.length),he(this,t,!0,52,8)},ye.prototype.readDoubleBE=function(t,e){return e||Ve(t,8,this.length),he(this,t,!1,52,8)},ye.prototype.writeUIntLE=function(t,e,r,i){(t=+t,e|=0,r|=0,i)||ze(this,t,e,r,Math.pow(2,8*r)-1,0);var n=1,s=0;for(this[e]=255&t;++s<r&&(n*=256);)this[e+s]=t/n&255;return e+r},ye.prototype.writeUIntBE=function(t,e,r,i){(t=+t,e|=0,r|=0,i)||ze(this,t,e,r,Math.pow(2,8*r)-1,0);var n=r-1,s=1;for(this[e+n]=255&t;--n>=0&&(s*=256);)this[e+n]=t/s&255;return e+r},ye.prototype.writeUInt8=function(t,e,r){return t=+t,e|=0,r||ze(this,t,e,1,255,0),ye.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},ye.prototype.writeUInt16LE=function(t,e,r){return t=+t,e|=0,r||ze(this,t,e,2,65535,0),ye.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):Ke(this,t,e,!0),e+2},ye.prototype.writeUInt16BE=function(t,e,r){return t=+t,e|=0,r||ze(this,t,e,2,65535,0),ye.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):Ke(this,t,e,!1),e+2},ye.prototype.writeUInt32LE=function(t,e,r){return t=+t,e|=0,r||ze(this,t,e,4,4294967295,0),ye.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):He(this,t,e,!0),e+4},ye.prototype.writeUInt32BE=function(t,e,r){return t=+t,e|=0,r||ze(this,t,e,4,4294967295,0),ye.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):He(this,t,e,!1),e+4},ye.prototype.writeIntLE=function(t,e,r,i){if(t=+t,e|=0,!i){var n=Math.pow(2,8*r-1);ze(this,t,e,r,n-1,-n)}var s=0,o=1,a=0;for(this[e]=255&t;++s<r&&(o*=256);)t<0&&0===a&&0!==this[e+s-1]&&(a=1),this[e+s]=(t/o|0)-a&255;return e+r},ye.prototype.writeIntBE=function(t,e,r,i){if(t=+t,e|=0,!i){var n=Math.pow(2,8*r-1);ze(this,t,e,r,n-1,-n)}var s=r-1,o=1,a=0;for(this[e+s]=255&t;--s>=0&&(o*=256);)t<0&&0===a&&0!==this[e+s+1]&&(a=1),this[e+s]=(t/o|0)-a&255;return e+r},ye.prototype.writeInt8=function(t,e,r){return t=+t,e|=0,r||ze(this,t,e,1,127,-128),ye.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},ye.prototype.writeInt16LE=function(t,e,r){return t=+t,e|=0,r||ze(this,t,e,2,32767,-32768),ye.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):Ke(this,t,e,!0),e+2},ye.prototype.writeInt16BE=function(t,e,r){return t=+t,e|=0,r||ze(this,t,e,2,32767,-32768),ye.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):Ke(this,t,e,!1),e+2},ye.prototype.writeInt32LE=function(t,e,r){return t=+t,e|=0,r||ze(this,t,e,4,2147483647,-2147483648),ye.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):He(this,t,e,!0),e+4},ye.prototype.writeInt32BE=function(t,e,r){return t=+t,e|=0,r||ze(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),ye.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):He(this,t,e,!1),e+4},ye.prototype.writeFloatLE=function(t,e,r){return We(this,t,e,!0,r)},ye.prototype.writeFloatBE=function(t,e,r){return We(this,t,e,!1,r)},ye.prototype.writeDoubleLE=function(t,e,r){return Je(this,t,e,!0,r)},ye.prototype.writeDoubleBE=function(t,e,r){return Je(this,t,e,!1,r)},ye.prototype.copy=function(t,e,r,i){if(r||(r=0),i||0===i||(i=this.length),e>=t.length&&(e=t.length),e||(e=0),i>0&&i<r&&(i=r),i===r)return 0;if(0===t.length||0===this.length)return 0;if(e<0)throw new RangeError("targetStart out of bounds");if(r<0||r>=this.length)throw new RangeError("sourceStart out of bounds");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),t.length-e<i-r&&(i=t.length-e+r);var n,s=i-r;if(this===t&&r<e&&e<i)for(n=s-1;n>=0;--n)t[n+e]=this[n+r];else if(s<1e3||!ye.TYPED_ARRAY_SUPPORT)for(n=0;n<s;++n)t[n+e]=this[n+r];else Uint8Array.prototype.set.call(t,this.subarray(r,r+s),e);return s},ye.prototype.fill=function(t,e,r,i){if("string"==typeof t){if("string"==typeof e?(i=e,e=0,r=this.length):"string"==typeof r&&(i=r,r=this.length),1===t.length){var n=t.charCodeAt(0);n<256&&(t=n)}if(void 0!==i&&"string"!=typeof i)throw new TypeError("encoding must be a string");if("string"==typeof i&&!ye.isEncoding(i))throw new TypeError("Unknown encoding: "+i)}else"number"==typeof t&&(t&=255);if(e<0||this.length<e||this.length<r)throw new RangeError("Out of range index");if(r<=e)return this;var s;if(e>>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(s=e;s<r;++s)this[s]=t;else{var o=Se(t)?t:Ze(new ye(t,i).toString()),a=o.length;for(s=0;s<r-e;++s)this[s+e]=o[s%a]}return this};var Ye=/[^+\/0-9A-Za-z-_]/g;function Ge(t){return t<16?"0"+t.toString(16):t.toString(16)}function Ze(t,e){var r;e=e||1/0;for(var i=t.length,n=null,s=[],o=0;o<i;++o){if((r=t.charCodeAt(o))>55295&&r<57344){if(!n){if(r>56319){(e-=3)>-1&&s.push(239,191,189);continue}if(o+1===i){(e-=3)>-1&&s.push(239,191,189);continue}n=r;continue}if(r<56320){(e-=3)>-1&&s.push(239,191,189),n=r;continue}r=65536+(n-55296<<10|r-56320)}else n&&(e-=3)>-1&&s.push(239,191,189);if(n=null,r<128){if((e-=1)<0)break;s.push(r)}else if(r<2048){if((e-=2)<0)break;s.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;s.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;s.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return s}function Qe(t){return function(t){var e,r,i,n,s,o;oe||ae();var a=t.length;if(a%4>0)throw new Error("Invalid string. Length must be a multiple of 4");s="="===t[a-2]?2:"="===t[a-1]?1:0,o=new se(3*a/4-s),i=s>0?a-4:a;var c=0;for(e=0,r=0;e<i;e+=4,r+=3)n=ne[t.charCodeAt(e)]<<18|ne[t.charCodeAt(e+1)]<<12|ne[t.charCodeAt(e+2)]<<6|ne[t.charCodeAt(e+3)],o[c++]=n>>16&255,o[c++]=n>>8&255,o[c++]=255&n;return 2===s?(n=ne[t.charCodeAt(e)]<<2|ne[t.charCodeAt(e+1)]>>4,o[c++]=255&n):1===s&&(n=ne[t.charCodeAt(e)]<<10|ne[t.charCodeAt(e+1)]<<4|ne[t.charCodeAt(e+2)]>>2,o[c++]=n>>8&255,o[c++]=255&n),o}(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(Ye,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function Xe(t,e,r,i){for(var n=0;n<i&&!(n+r>=e.length||n>=t.length);++n)e[n+r]=t[n];return n}function tr(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}function er(){this.head=null,this.tail=null,this.length=0}er.prototype.push=function(t){var e={data:t,next:null};this.length>0?this.tail.next=e:this.head=e,this.tail=e,++this.length},er.prototype.unshift=function(t){var e={data:t,next:this.head};0===this.length&&(this.tail=e),this.head=e,++this.length},er.prototype.shift=function(){if(0!==this.length){var t=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,t}},er.prototype.clear=function(){this.head=this.tail=null,this.length=0},er.prototype.join=function(t){if(0===this.length)return"";for(var e=this.head,r=""+e.data;e=e.next;)r+=t+e.data;return r},er.prototype.concat=function(t){if(0===this.length)return ye.alloc(0);if(1===this.length)return this.head.data;for(var e=ye.allocUnsafe(t>>>0),r=this.head,i=0;r;)r.data.copy(e,i),i+=r.data.length,r=r.next;return e};var rr=ye.isEncoding||function(t){switch(t&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function ir(t){switch(this.encoding=(t||"utf8").toLowerCase().replace(/[-_]/,""),function(t){if(t&&!rr(t))throw new Error("Unknown encoding: "+t)}(t),this.encoding){case"utf8":this.surrogateSize=3;break;case"ucs2":case"utf16le":this.surrogateSize=2,this.detectIncompleteChar=sr;break;case"base64":this.surrogateSize=3,this.detectIncompleteChar=or;break;default:return void(this.write=nr)}this.charBuffer=new ye(6),this.charReceived=0,this.charLength=0}function nr(t){return t.toString(this.encoding)}function sr(t){this.charReceived=t.length%2,this.charLength=this.charReceived?2:0}function or(t){this.charReceived=t.length%3,this.charLength=this.charReceived?3:0}ir.prototype.write=function(t){for(var e="";this.charLength;){var r=t.length>=this.charLength-this.charReceived?this.charLength-this.charReceived:t.length;if(t.copy(this.charBuffer,this.charReceived,0,r),this.charReceived+=r,this.charReceived<this.charLength)return"";if(t=t.slice(r,t.length),!((n=(e=this.charBuffer.slice(0,this.charLength).toString(this.encoding)).charCodeAt(e.length-1))>=55296&&n<=56319)){if(this.charReceived=this.charLength=0,0===t.length)return e;break}this.charLength+=this.surrogateSize,e=""}this.detectIncompleteChar(t);var i=t.length;this.charLength&&(t.copy(this.charBuffer,0,t.length-this.charReceived,i),i-=this.charReceived);var n;i=(e+=t.toString(this.encoding,0,i)).length-1;if((n=e.charCodeAt(i))>=55296&&n<=56319){var s=this.surrogateSize;return this.charLength+=s,this.charReceived+=s,this.charBuffer.copy(this.charBuffer,s,0,s),t.copy(this.charBuffer,0,0,s),e.substring(0,i)}return e},ir.prototype.detectIncompleteChar=function(t){for(var e=t.length>=3?3:t.length;e>0;e--){var r=t[t.length-e];if(1==e&&r>>5==6){this.charLength=2;break}if(e<=2&&r>>4==14){this.charLength=3;break}if(e<=3&&r>>3==30){this.charLength=4;break}}this.charReceived=e},ir.prototype.end=function(t){var e="";if(t&&t.length&&(e=this.write(t)),this.charReceived){var r=this.charReceived,i=this.charBuffer,n=this.encoding;e+=i.slice(0,r).toString(n)}return e},ur.ReadableState=cr;var ar=function(t){if(Yt($t)&&($t=Ct.env.NODE_DEBUG||""),t=t.toUpperCase(),!Ut[t])if(new RegExp("\\b"+t+"\\b","i").test($t)){Ut[t]=function(){var e=Tt.apply(null,arguments);console.error("%s %d: %s",t,0,e)}}else Ut[t]=function(){};return Ut[t]}("stream");function cr(t,e){t=t||{},this.objectMode=!!t.objectMode,e instanceof Lr&&(this.objectMode=this.objectMode||!!t.readableObjectMode);var r=t.highWaterMark,i=this.objectMode?16:16384;this.highWaterMark=r||0===r?r:i,this.highWaterMark=~~this.highWaterMark,this.buffer=new er,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.ranOut=!1,this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(this.decoder=new ir(t.encoding),this.encoding=t.encoding)}function ur(t){if(!(this instanceof ur))return new ur(t);this._readableState=new cr(t,this),this.readable=!0,t&&"function"==typeof t.read&&(this._read=t.read),et.call(this)}function lr(t,e,r,i,n){var s=function(t,e){var r=null;Buffer.isBuffer(e)||"string"==typeof e||null==e||t.objectMode||(r=new TypeError("Invalid non-string/buffer chunk"));return r}(e,r);if(s)t.emit("error",s);else if(null===r)e.reading=!1,function(t,e){if(e.ended)return;if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,dr(t)}(t,e);else if(e.objectMode||r&&r.length>0)if(e.ended&&!n){var o=new Error("stream.push() after EOF");t.emit("error",o)}else if(e.endEmitted&&n){var a=new Error("stream.unshift() after end event");t.emit("error",a)}else{var c;!e.decoder||n||i||(r=e.decoder.write(r),c=!e.objectMode&&0===r.length),n||(e.reading=!1),c||(e.flowing&&0===e.length&&!e.sync?(t.emit("data",r),t.read(0)):(e.length+=e.objectMode?1:r.length,n?e.buffer.unshift(r):e.buffer.push(r),e.needReadable&&dr(t))),function(t,e){e.readingMore||(e.readingMore=!0,Nt(mr,t,e))}(t,e)}else n||(e.reading=!1);return function(t){return!t.ended&&(t.needReadable||t.length<t.highWaterMark||0===t.length)}(e)}It(ur,et),ur.prototype.push=function(t,e){var r=this._readableState;return r.objectMode||"string"!=typeof t||(e=e||r.defaultEncoding)!==r.encoding&&(t=Buffer.from(t,e),e=""),lr(this,r,t,e,!1)},ur.prototype.unshift=function(t){return lr(this,this._readableState,t,"",!0)},ur.prototype.isPaused=function(){return!1===this._readableState.flowing},ur.prototype.setEncoding=function(t){return this._readableState.decoder=new ir(t),this._readableState.encoding=t,this};var hr=8388608;function fr(t,e){return t<=0||0===e.length&&e.ended?0:e.objectMode?1:t!=t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=function(t){return t>=hr?t=hr:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}function dr(t){var e=t._readableState;e.needReadable=!1,e.emittedReadable||(ar("emitReadable",e.flowing),e.emittedReadable=!0,e.sync?Nt(pr,t):pr(t))}function pr(t){ar("emit readable"),t.emit("readable"),br(t)}function mr(t,e){for(var r=e.length;!e.reading&&!e.flowing&&!e.ended&&e.length<e.highWaterMark&&(ar("maybeReadMore read 0"),t.read(0),r!==e.length);)r=e.length;e.readingMore=!1}function gr(t){ar("readable nexttick read 0"),t.read(0)}function yr(t,e){e.reading||(ar("resume read 0"),t.read(0)),e.resumeScheduled=!1,e.awaitDrain=0,t.emit("resume"),br(t),e.flowing&&!e.reading&&t.read(0)}function br(t){var e=t._readableState;for(ar("flow",e.flowing);e.flowing&&null!==t.read(););}function wr(t,e){return 0===e.length?null:(e.objectMode?r=e.buffer.shift():!t||t>=e.length?(r=e.decoder?e.buffer.join(""):1===e.buffer.length?e.buffer.head.data:e.buffer.concat(e.length),e.buffer.clear()):r=function(t,e,r){var i;t<e.head.data.length?(i=e.head.data.slice(0,t),e.head.data=e.head.data.slice(t)):i=t===e.head.data.length?e.shift():r?function(t,e){var r=e.head,i=1,n=r.data;t-=n.length;for(;r=r.next;){var s=r.data,o=t>s.length?s.length:t;if(o===s.length?n+=s:n+=s.slice(0,t),0===(t-=o)){o===s.length?(++i,r.next?e.head=r.next:e.head=e.tail=null):(e.head=r,r.data=s.slice(o));break}++i}return e.length-=i,n}(t,e):function(t,e){var r=Buffer.allocUnsafe(t),i=e.head,n=1;i.data.copy(r),t-=i.data.length;for(;i=i.next;){var s=i.data,o=t>s.length?s.length:t;if(s.copy(r,r.length-t,0,o),0===(t-=o)){o===s.length?(++n,i.next?e.head=i.next:e.head=e.tail=null):(e.head=i,i.data=s.slice(o));break}++n}return e.length-=n,r}(t,e);return i}(t,e.buffer,e.decoder),r);var r}function vr(t){var e=t._readableState;if(e.length>0)throw new Error('"endReadable()" called on non-empty stream');e.endEmitted||(e.ended=!0,Nt(kr,e,t))}function kr(t,e){t.endEmitted||0!==t.length||(t.endEmitted=!0,e.readable=!1,e.emit("end"))}function Or(t,e){for(var r=0,i=t.length;r<i;r++)if(t[r]===e)return r;return-1}function Sr(){}function _r(t,e,r){this.chunk=t,this.encoding=e,this.callback=r,this.next=null}function jr(t,e){Object.defineProperty(this,"buffer",{get:Lt(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.")}),t=t||{},this.objectMode=!!t.objectMode,e instanceof Lr&&(this.objectMode=this.objectMode||!!t.writableObjectMode);var r=t.highWaterMark,i=this.objectMode?16:16384;this.highWaterMark=r||0===r?r:i,this.highWaterMark=~~this.highWaterMark,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1;var n=!1===t.decodeStrings;this.decodeStrings=!n,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(t){!function(t,e){var r=t._writableState,i=r.sync,n=r.writecb;if(function(t){t.writing=!1,t.writecb=null,t.length-=t.writelen,t.writelen=0}(r),e)!function(t,e,r,i,n){--e.pendingcb,r?Nt(n,i):n(i);t._writableState.errorEmitted=!0,t.emit("error",i)}(t,r,i,e,n);else{var s=Er(r);s||r.corked||r.bufferProcessing||!r.bufferedRequest||Ar(t,r),i?Nt(Dr,t,r,s,n):Dr(t,r,s,n)}}(e,t)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new Ir(this)}function xr(t){if(!(this instanceof xr||this instanceof Lr))return new xr(t);this._writableState=new jr(t,this),this.writable=!0,t&&("function"==typeof t.write&&(this._write=t.write),"function"==typeof t.writev&&(this._writev=t.writev)),et.call(this)}function Rr(t,e,r,i,n,s,o){e.writelen=i,e.writecb=o,e.writing=!0,e.sync=!0,r?t._writev(n,e.onwrite):t._write(n,s,e.onwrite),e.sync=!1}function Dr(t,e,r,i){r||function(t,e){0===e.length&&e.needDrain&&(e.needDrain=!1,t.emit("drain"))}(t,e),e.pendingcb--,i(),Pr(t,e)}function Ar(t,e){e.bufferProcessing=!0;var r=e.bufferedRequest;if(t._writev&&r&&r.next){var i=e.bufferedRequestCount,n=new Array(i),s=e.corkedRequestsFree;s.entry=r;for(var o=0;r;)n[o]=r,r=r.next,o+=1;Rr(t,e,!0,e.length,n,"",s.finish),e.pendingcb++,e.lastBufferedRequest=null,s.next?(e.corkedRequestsFree=s.next,s.next=null):e.corkedRequestsFree=new Ir(e)}else{for(;r;){var a=r.chunk,c=r.encoding,u=r.callback;if(Rr(t,e,!1,e.objectMode?1:a.length,a,c,u),r=r.next,e.writing)break}null===r&&(e.lastBufferedRequest=null)}e.bufferedRequestCount=0,e.bufferedRequest=r,e.bufferProcessing=!1}function Er(t){return t.ending&&0===t.length&&null===t.bufferedRequest&&!t.finished&&!t.writing}function Nr(t,e){e.prefinished||(e.prefinished=!0,t.emit("prefinish"))}function Pr(t,e){var r=Er(e);return r&&(0===e.pendingcb?(Nr(t,e),e.finished=!0,t.emit("finish")):Nr(t,e)),r}function Ir(t){var e=this;this.next=null,this.entry=null,this.finish=function(r){var i=e.entry;for(e.entry=null;i;){var n=i.callback;t.pendingcb--,n(r),i=i.next}t.corkedRequestsFree?t.corkedRequestsFree.next=e:t.corkedRequestsFree=e}}ur.prototype.read=function(t){ar("read",t),t=parseInt(t,10);var e=this._readableState,r=t;if(0!==t&&(e.emittedReadable=!1),0===t&&e.needReadable&&(e.length>=e.highWaterMark||e.ended))return ar("read: emitReadable",e.length,e.ended),0===e.length&&e.ended?vr(this):dr(this),null;if(0===(t=fr(t,e))&&e.ended)return 0===e.length&&vr(this),null;var i,n=e.needReadable;return ar("need readable",n),(0===e.length||e.length-t<e.highWaterMark)&&ar("length less than watermark",n=!0),e.ended||e.reading?ar("reading or ended",n=!1):n&&(ar("do read"),e.reading=!0,e.sync=!0,0===e.length&&(e.needReadable=!0),this._read(e.highWaterMark),e.sync=!1,e.reading||(t=fr(r,e))),null===(i=t>0?wr(t,e):null)?(e.needReadable=!0,t=0):e.length-=t,0===e.length&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&vr(this)),null!==i&&this.emit("data",i),i},ur.prototype._read=function(t){this.emit("error",new Error("not implemented"))},ur.prototype.pipe=function(t,e){var r=this,i=this._readableState;switch(i.pipesCount){case 0:i.pipes=t;break;case 1:i.pipes=[i.pipes,t];break;default:i.pipes.push(t)}i.pipesCount+=1,ar("pipe count=%d opts=%j",i.pipesCount,e);var n=!e||!1!==e.end?o:u;function s(t){ar("onunpipe"),t===r&&u()}function o(){ar("onend"),t.end()}i.endEmitted?Nt(n):r.once("end",n),t.on("unpipe",s);var a=function(t){return function(){var e=t._readableState;ar("pipeOnDrain",e.awaitDrain),e.awaitDrain&&e.awaitDrain--,0===e.awaitDrain&&t.listeners("data").length&&(e.flowing=!0,br(t))}}(r);t.on("drain",a);var c=!1;function u(){ar("cleanup"),t.removeListener("close",d),t.removeListener("finish",p),t.removeListener("drain",a),t.removeListener("error",f),t.removeListener("unpipe",s),r.removeListener("end",o),r.removeListener("end",u),r.removeListener("data",h),c=!0,!i.awaitDrain||t._writableState&&!t._writableState.needDrain||a()}var l=!1;function h(e){ar("ondata"),l=!1,!1!==t.write(e)||l||((1===i.pipesCount&&i.pipes===t||i.pipesCount>1&&-1!==Or(i.pipes,t))&&!c&&(ar("false write response, pause",r._readableState.awaitDrain),r._readableState.awaitDrain++,l=!0),r.pause())}function f(e){var r;ar("onerror",e),m(),t.removeListener("error",f),0===(r="error",t.listeners(r).length)&&t.emit("error",e)}function d(){t.removeListener("finish",p),m()}function p(){ar("onfinish"),t.removeListener("close",d),m()}function m(){ar("unpipe"),r.unpipe(t)}return r.on("data",h),function(t,e,r){if("function"==typeof t.prependListener)return t.prependListener(e,r);t._events&&t._events[e]?Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]:t.on(e,r)}(t,"error",f),t.once("close",d),t.once("finish",p),t.emit("pipe",r),i.flowing||(ar("pipe resume"),r.resume()),t},ur.prototype.unpipe=function(t){var e=this._readableState;if(0===e.pipesCount)return this;if(1===e.pipesCount)return t&&t!==e.pipes||(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this)),this;if(!t){var r=e.pipes,i=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var n=0;n<i;n++)r[n].emit("unpipe",this);return this}var s=Or(e.pipes,t);return-1===s||(e.pipes.splice(s,1),e.pipesCount-=1,1===e.pipesCount&&(e.pipes=e.pipes[0]),t.emit("unpipe",this)),this},ur.prototype.on=function(t,e){var r=et.prototype.on.call(this,t,e);if("data"===t)!1!==this._readableState.flowing&&this.resume();else if("readable"===t){var i=this._readableState;i.endEmitted||i.readableListening||(i.readableListening=i.needReadable=!0,i.emittedReadable=!1,i.reading?i.length&&dr(this):Nt(gr,this))}return r},ur.prototype.addListener=ur.prototype.on,ur.prototype.resume=function(){var t=this._readableState;return t.flowing||(ar("resume"),t.flowing=!0,function(t,e){e.resumeScheduled||(e.resumeScheduled=!0,Nt(yr,t,e))}(this,t)),this},ur.prototype.pause=function(){return ar("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(ar("pause"),this._readableState.flowing=!1,this.emit("pause")),this},ur.prototype.wrap=function(t){var e=this._readableState,r=!1,i=this;for(var n in t.on("end",function(){if(ar("wrapped end"),e.decoder&&!e.ended){var t=e.decoder.end();t&&t.length&&i.push(t)}i.push(null)}),t.on("data",function(n){(ar("wrapped data"),e.decoder&&(n=e.decoder.write(n)),e.objectMode&&null==n)||(e.objectMode||n&&n.length)&&(i.push(n)||(r=!0,t.pause()))}),t)void 0===this[n]&&"function"==typeof t[n]&&(this[n]=function(e){return function(){return t[e].apply(t,arguments)}}(n));return function(t,e){for(var r=0,i=t.length;r<i;r++)e(t[r],r)}(["error","close","destroy","pause","resume"],function(e){t.on(e,i.emit.bind(i,e))}),i._read=function(e){ar("wrapped _read",e),r&&(r=!1,t.resume())},i},ur._fromList=wr,xr.WritableState=jr,It(xr,et),jr.prototype.getBuffer=function(){for(var t=this.bufferedRequest,e=[];t;)e.push(t),t=t.next;return e},xr.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},xr.prototype.write=function(t,e,r){var i=this._writableState,n=!1;return"function"==typeof e&&(r=e,e=null),ye.isBuffer(t)?e="buffer":e||(e=i.defaultEncoding),"function"!=typeof r&&(r=Sr),i.ended?function(t,e){var r=new Error("write after end");t.emit("error",r),Nt(e,r)}(this,r):function(t,e,r,i){var n=!0,s=!1;return null===r?s=new TypeError("May not write null values to stream"):ye.isBuffer(r)||"string"==typeof r||void 0===r||e.objectMode||(s=new TypeError("Invalid non-string/buffer chunk")),s&&(t.emit("error",s),Nt(i,s),n=!1),n}(this,i,t,r)&&(i.pendingcb++,n=function(t,e,r,i,n){r=function(t,e,r){t.objectMode||!1===t.decodeStrings||"string"!=typeof e||(e=ye.from(e,r));return e}(e,r,i),ye.isBuffer(r)&&(i="buffer");var s=e.objectMode?1:r.length;e.length+=s;var o=e.length<e.highWaterMark;o||(e.needDrain=!0);if(e.writing||e.corked){var a=e.lastBufferedRequest;e.lastBufferedRequest=new _r(r,i,n),a?a.next=e.lastBufferedRequest:e.bufferedRequest=e.lastBufferedRequest,e.bufferedRequestCount+=1}else Rr(t,e,!1,s,r,i,n);return o}(this,i,t,e,r)),n},xr.prototype.cork=function(){this._writableState.corked++},xr.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,t.writing||t.corked||t.finished||t.bufferProcessing||!t.bufferedRequest||Ar(this,t))},xr.prototype.setDefaultEncoding=function(t){if("string"==typeof t&&(t=t.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((t+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+t);return this._writableState.defaultEncoding=t,this},xr.prototype._write=function(t,e,r){r(new Error("not implemented"))},xr.prototype._writev=null,xr.prototype.end=function(t,e,r){var i=this._writableState;"function"==typeof t?(r=t,t=null,e=null):"function"==typeof e&&(r=e,e=null),null!=t&&this.write(t,e),i.corked&&(i.corked=1,this.uncork()),i.ending||i.finished||function(t,e,r){e.ending=!0,Pr(t,e),r&&(e.finished?Nt(r):t.once("finish",r));e.ended=!0,t.writable=!1}(this,i,r)},It(Lr,ur);for(var Cr=Object.keys(xr.prototype),Mr=0;Mr<Cr.length;Mr++){var Tr=Cr[Mr];Lr.prototype[Tr]||(Lr.prototype[Tr]=xr.prototype[Tr])}function Lr(t){if(!(this instanceof Lr))return new Lr(t);ur.call(this,t),xr.call(this,t),t&&!1===t.readable&&(this.readable=!1),t&&!1===t.writable&&(this.writable=!1),this.allowHalfOpen=!0,t&&!1===t.allowHalfOpen&&(this.allowHalfOpen=!1),this.once("end",$r)}function $r(){this.allowHalfOpen||this._writableState.ended||Nt(Ur,this)}function Ur(t){t.end()}function Br(t){this.afterTransform=function(e,r){return function(t,e,r){var i=t._transformState;i.transforming=!1;var n=i.writecb;if(!n)return t.emit("error",new Error("no writecb in Transform class"));i.writechunk=null,i.writecb=null,null!=r&&t.push(r);n(e);var s=t._readableState;s.reading=!1,(s.needReadable||s.length<s.highWaterMark)&&t._read(s.highWaterMark)}(t,e,r)},this.needTransform=!1,this.transforming=!1,this.writecb=null,this.writechunk=null,this.writeencoding=null}function Fr(t){if(!(this instanceof Fr))return new Fr(t);Lr.call(this,t),this._transformState=new Br(this);var e=this;this._readableState.needReadable=!0,this._readableState.sync=!1,t&&("function"==typeof t.transform&&(this._transform=t.transform),"function"==typeof t.flush&&(this._flush=t.flush)),this.once("prefinish",function(){"function"==typeof this._flush?this._flush(function(t){Vr(e,t)}):Vr(e)})}function Vr(t,e){if(e)return t.emit("error",e);var r=t._writableState,i=t._transformState;if(r.length)throw new Error("Calling transform done when ws.length != 0");if(i.transforming)throw new Error("Calling transform done when still transforming");return t.push(null)}function zr(t){if(!(this instanceof zr))return new zr(t);Fr.call(this,t)}function Kr(){et.call(this)}It(Fr,Lr),Fr.prototype.push=function(t,e){return this._transformState.needTransform=!1,Lr.prototype.push.call(this,t,e)},Fr.prototype._transform=function(t,e,r){throw new Error("Not implemented")},Fr.prototype._write=function(t,e,r){var i=this._transformState;if(i.writecb=r,i.writechunk=t,i.writeencoding=e,!i.transforming){var n=this._readableState;(i.needTransform||n.needReadable||n.length<n.highWaterMark)&&this._read(n.highWaterMark)}},Fr.prototype._read=function(t){var e=this._transformState;null!==e.writechunk&&e.writecb&&!e.transforming?(e.transforming=!0,this._transform(e.writechunk,e.writeencoding,e.afterTransform)):e.needTransform=!0},It(zr,Fr),zr.prototype._transform=function(t,e,r){r(null,t)},It(Kr,et),Kr.Readable=ur,Kr.Writable=xr,Kr.Duplex=Lr,Kr.Transform=Fr,Kr.PassThrough=zr,Kr.Stream=Kr,Kr.prototype.pipe=function(t,e){var r=this;function i(e){t.writable&&!1===t.write(e)&&r.pause&&r.pause()}function n(){r.readable&&r.resume&&r.resume()}r.on("data",i),t.on("drain",n),t._isStdio||e&&!1===e.end||(r.on("end",o),r.on("close",a));var s=!1;function o(){s||(s=!0,t.end())}function a(){s||(s=!0,"function"==typeof t.destroy&&t.destroy())}function c(t){if(u(),0===et.listenerCount(this,"error"))throw t}function u(){r.removeListener("data",i),t.removeListener("drain",n),r.removeListener("end",o),r.removeListener("close",a),r.removeListener("error",c),t.removeListener("error",c),r.removeListener("end",u),r.removeListener("close",u),t.removeListener("close",u)}return r.on("error",c),t.on("error",c),r.on("end",u),r.on("close",u),t.on("close",u),t.emit("pipe",r),t};class Hr extends et{constructor({resource:t}){super(),this.resource=t,this.client=t.client,this.stream=new n.ReadableStream({highWaterMark:3*this.client.parallelism,start:this._start.bind(this),pull:this._pull.bind(this),cancel:this._cancel.bind(this)})}build(){return this.stream.getReader()}async _start(t){this.controller=t,this.continuationToken=null,this.closeNextIteration=!1}async _pull(t){if(this.closeNextIteration)return void t.close();const e=await this.client.listObjects({prefix:`resource=${this.resource.name}`,continuationToken:this.continuationToken}),r=e?.Contents.map(t=>t.Key).map(t=>t.replace(this.client.config.keyPrefix,"")).map(t=>t.startsWith("/")?t.replace("/",""):t).map(t=>t.replace(`resource=${this.resource.name}/id=`,""));this.continuationToken=e.NextContinuationToken,this.enqueue(r),e.IsTruncated||(this.closeNextIteration=!0)}enqueue(t){t.forEach(t=>{this.controller.enqueue(t),this.emit("id",t)})}_cancel(t){}}var qr=Hr;class Wr extends qr{enqueue(t){this.controller.enqueue(t),this.emit("page",t)}}class Jr extends et{constructor({resource:t,batchSize:e=10,concurrency:r=5}){if(super(),!t)throw new Error("Resource is required for ResourceReader");this.resource=t,this.client=t.client,this.batchSize=e,this.concurrency=r,this.input=new Wr({resource:this.resource}),this.transform=new Fr({objectMode:!0,transform:this._transform.bind(this)}),this.input.on("data",t=>{this.transform.write(t)}),this.input.on("end",()=>{this.transform.end()}),this.input.on("error",t=>{this.emit("error",t)}),this.transform.on("data",t=>{this.emit("data",t)}),this.transform.on("end",()=>{this.emit("end")}),this.transform.on("error",t=>{this.emit("error",t)})}build(){return this}async _transform(t,e,r){const[n,s]=await K(async()=>{await i.PromisePool.for(t).withConcurrency(this.concurrency).handleError(async(t,e)=>{this.emit("error",t,e)}).process(async t=>{const e=await this.resource.get(t);return this.push(e),e})});r(s)}resume(){this.input.resume()}}class Yr extends et{constructor({resource:t,batchSize:e=10,concurrency:r=5}){super(),this.resource=t,this.client=t.client,this.batchSize=e,this.concurrency=r,this.buffer=[],this.writing=!1,this.writable=new xr({objectMode:!0,write:this._write.bind(this)}),this.writable.on("finish",()=>{this.emit("finish")}),this.writable.on("error",t=>{this.emit("error",t)})}build(){return this}write(t){return this.buffer.push(t),this._maybeWrite().catch(t=>{this.emit("error",t)}),!0}end(){this.ended=!0,this._maybeWrite().catch(t=>{this.emit("error",t)})}async _maybeWrite(){if(!this.writing&&(0!==this.buffer.length||this.ended)){for(this.writing=!0;this.buffer.length>0;){const t=this.buffer.splice(0,this.batchSize),[e,r]=await K(async()=>{await i.PromisePool.for(t).withConcurrency(this.concurrency).handleError(async(t,e)=>{this.emit("error",t,e)}).process(async t=>{const[e,r,i]=await K(async()=>await this.resource.insert(t));return e?i:(this.emit("error",r,t),null)})});e||this.emit("error",r)}this.writing=!1,this.ended&&this.writable.emit("finish")}}async _write(t,e,r){r()}}function Gr(t){return new Promise((e,r)=>{if(!t)return r(new Error("streamToString: stream is undefined"));const i=[];t.on("data",t=>i.push(t)),t.on("error",r),t.on("end",()=>e(Buffer.concat(i).toString("utf-8")))})}var Zr=class extends wt{constructor({client:t,keyPrefix:e="cache",ttl:r=0,prefix:i}){super({client:t,keyPrefix:e,ttl:r,prefix:i}),this.client=t,this.keyPrefix=e,this.config.ttl=r,this.config.client=t,this.config.prefix=void 0!==i?i:e+(e.endsWith("/")?"":"/")}async _set(t,e){let i=JSON.stringify(e);const n=i.length;return i=r.gzipSync(i).toString("base64"),this.client.putObject({key:mt(this.keyPrefix,t),body:i,contentEncoding:"gzip",contentType:"application/gzip",metadata:{compressor:"zlib",compressed:"true","client-id":this.client.id,"length-serialized":String(n),"length-compressed":String(i.length),"compression-gain":(i.length/n).toFixed(2)}})}async _get(t){const[e,i,n]=await K(async()=>{const{Body:e}=await this.client.getObject(mt(this.keyPrefix,t));let i=await Gr(e);return i=Buffer.from(i,"base64"),i=r.unzipSync(i).toString(),JSON.parse(i)});if(e)return n;if("NoSuchKey"===i.name||"NotFound"===i.name)return null;throw i}async _del(t){return await this.client.deleteObject(mt(this.keyPrefix,t)),!0}async _clear(){const t=await this.client.getAllKeys({prefix:this.keyPrefix});await this.client.deleteObjects(t)}async size(){return(await this.keys()).length}async keys(){const t=await this.client.getAllKeys({prefix:this.keyPrefix}),e=this.keyPrefix.endsWith("/")?this.keyPrefix:this.keyPrefix+"/";return t.map(t=>t.startsWith(e)?t.slice(e.length):t)}};var Qr=class extends wt{constructor(t={}){super(t),this.cache={},this.meta={},this.maxSize=t.maxSize||0,this.ttl=t.ttl||0}async _set(t,e){if(this.maxSize>0&&Object.keys(this.cache).length>=this.maxSize){const t=Object.entries(this.meta).sort((t,e)=>t[1].ts-e[1].ts)[0]?.[0];t&&(delete this.cache[t],delete this.meta[t])}return this.cache[t]=e,this.meta[t]={ts:Date.now()},e}async _get(t){if(!Object.prototype.hasOwnProperty.call(this.cache,t))return null;if(this.ttl>0){const e=Date.now(),r=this.meta[t];if(r&&e-r.ts>1e3*this.ttl)return delete this.cache[t],delete this.meta[t],null}return this.cache[t]}async _del(t){return delete this.cache[t],delete this.meta[t],!0}async _clear(t){if(!t)return this.cache={},this.meta={},!0;for(const e of Object.keys(this.cache))e.startsWith(t)&&(delete this.cache[e],delete this.meta[e]);return!0}async size(){return Object.keys(this.cache).length}async keys(){return Object.keys(this.cache)}};const Xr={async setup(t){t&&t.client&&(this.client=t.client,this.map={PutObjectCommand:"put",GetObjectCommand:"get",HeadObjectCommand:"head",DeleteObjectCommand:"delete",DeleteObjectsCommand:"delete",ListObjectsV2Command:"list"},this.costs={total:0,prices:{put:5e-6,copy:5e-6,list:5e-6,post:5e-6,get:4e-4/1e3,select:4e-4/1e3,delete:4e-4/1e3,head:4e-4/1e3},requests:{total:0,put:0,post:0,copy:0,list:0,get:0,select:0,delete:0,head:0},events:{total:0,PutObjectCommand:0,GetObjectCommand:0,HeadObjectCommand:0,DeleteObjectCommand:0,DeleteObjectsCommand:0,ListObjectsV2Command:0}},this.client.costs=JSON.parse(JSON.stringify(this.costs)))},async start(){this.client&&(this.client.on("command.response",t=>this.addRequest(t,this.map[t])),this.client.on("command.error",t=>this.addRequest(t,this.map[t])))},addRequest(t,e){e&&(this.costs.events[t]++,this.costs.events.total++,this.costs.requests.total++,this.costs.requests[e]++,this.costs.total+=this.costs.prices[e],this.client&&this.client.costs&&(this.client.costs.events[t]++,this.client.costs.events.total++,this.client.costs.requests.total++,this.client.costs.requests[e]++,this.client.costs.total+=this.client.costs.prices[e]))}};class ti{constructor(t){let e;const[r,i,n]=K(()=>new URL(t));if(!r)throw new L("Invalid connection string: "+t,{original:i,input:t});e=n,this.region="us-east-1","s3:"===e.protocol?this.defineFromS3(e):this.defineFromCustomUri(e);for(const[t,r]of e.searchParams.entries())this[t]=r}defineFromS3(t){const[e,r,i]=z(()=>decodeURIComponent(t.hostname));if(!e)throw new L("Invalid bucket in connection string",{original:r,input:t.hostname});this.bucket=i||"s3db";const[n,s,o]=z(()=>decodeURIComponent(t.username));if(!n)throw new L("Invalid accessKeyId in connection string",{original:s,input:t.username});this.accessKeyId=o;const[a,c,u]=z(()=>decodeURIComponent(t.password));if(!a)throw new L("Invalid secretAccessKey in connection string",{original:c,input:t.password});if(this.secretAccessKey=u,this.endpoint="https://s3.us-east-1.amazonaws.com",["/","",null].includes(t.pathname))this.keyPrefix="";else{let[,...e]=t.pathname.split("/");this.keyPrefix=[...e||[]].join("/")}}defineFromCustomUri(t){this.forcePathStyle=!0,this.endpoint=t.origin;const[e,r,i]=z(()=>decodeURIComponent(t.username));if(!e)throw new L("Invalid accessKeyId in connection string",{original:r,input:t.username});this.accessKeyId=i;const[n,s,o]=z(()=>decodeURIComponent(t.password));if(!n)throw new L("Invalid secretAccessKey in connection string",{original:s,input:t.password});if(this.secretAccessKey=o,["/","",null].includes(t.pathname))this.bucket="s3db",this.keyPrefix="";else{let[,e,...r]=t.pathname.split("/");if(e){const[t,r,i]=z(()=>decodeURIComponent(e));if(!t)throw new L("Invalid bucket in connection string",{original:r,input:e});this.bucket=i}else this.bucket="s3db";this.keyPrefix=[...r||[]].join("/")}}}class ei extends et{constructor({verbose:t=!1,id:e=null,AwsS3Client:r,connectionString:i,parallelism:n=10}){super(),this.verbose=t,this.id=e??Z(),this.parallelism=n,this.config=new ti(i),this.client=r||this.createClient()}createClient(){let t={region:this.config.region,endpoint:this.config.endpoint};this.config.forcePathStyle&&(t.forcePathStyle=!0),this.config.accessKeyId&&(t.credentials={accessKeyId:this.config.accessKeyId,secretAccessKey:this.config.secretAccessKey});const e=new c.S3Client(t);return e.middlewareStack.add((t,e)=>async r=>{if("DeleteObjectsCommand"===e.commandName){const t=r.request.body;if(t&&"string"==typeof t){const e=await Y(t);r.request.headers["Content-MD5"]=e}}return t(r)},{step:"build",name:"addContentMd5ForDeleteObjects",priority:"high"}),e}async sendCommand(t){this.emit("command.request",t.constructor.name,t.input);const[e,r,i]=await K(()=>this.client.send(t));if(!e){throw T(r,{bucket:this.config.bucket,key:t.input&&t.input.Key,commandName:t.constructor.name,commandInput:t.input})}return this.emit("command.response",t.constructor.name,i,t.input),i}async putObject({key:t,metadata:e,contentType:r,body:i,contentEncoding:n,contentLength:s}){const o="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"";o&>.join(o,t);const a={};if(e)for(const[t,r]of Object.entries(e)){a[String(t).replace(/[^a-zA-Z0-9\-_]/g,"_")]=String(r)}const u={Bucket:this.config.bucket,Key:o?gt.join(o,t):t,Metadata:a,Body:i||Buffer.alloc(0)};let l,h;void 0!==r&&(u.ContentType=r),void 0!==n&&(u.ContentEncoding=n),void 0!==s&&(u.ContentLength=s);try{return l=await this.sendCommand(new c.PutObjectCommand(u)),l}catch(e){throw h=e,T(e,{bucket:this.config.bucket,key:t,commandName:"PutObjectCommand",commandInput:u})}finally{this.emit("putObject",h||l,{key:t,metadata:e,contentType:r,body:i,contentEncoding:n,contentLength:s})}}async getObject(t){const e="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"",r={Bucket:this.config.bucket,Key:e?gt.join(e,t):t};let i,n;try{return i=await this.sendCommand(new c.GetObjectCommand(r)),i}catch(e){throw n=e,T(e,{bucket:this.config.bucket,key:t,commandName:"GetObjectCommand",commandInput:r})}finally{this.emit("getObject",n||i,{key:t})}}async headObject(t){const e="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"",r={Bucket:this.config.bucket,Key:e?gt.join(e,t):t};let i,n;try{return i=await this.sendCommand(new c.HeadObjectCommand(r)),i}catch(e){throw n=e,T(e,{bucket:this.config.bucket,key:t,commandName:"HeadObjectCommand",commandInput:r})}finally{this.emit("headObject",n||i,{key:t})}}async copyObject({from:t,to:e}){const r={Bucket:this.config.bucket,Key:this.config.keyPrefix?gt.join(this.config.keyPrefix,e):e,CopySource:gt.join(this.config.bucket,this.config.keyPrefix?gt.join(this.config.keyPrefix,t):t)};let i,n;try{return i=await this.sendCommand(new c.CopyObjectCommand(r)),i}catch(t){throw n=t,T(t,{bucket:this.config.bucket,key:e,commandName:"CopyObjectCommand",commandInput:r})}finally{this.emit("copyObject",n||i,{from:t,to:e})}}async exists(t){const[e,r]=await K(()=>this.headObject(t));if(e)return!0;if("NoSuchKey"===r.name||"NotFound"===r.name)return!1;throw r}async deleteObject(t){const e="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"";e&>.join(e,t);const r={Bucket:this.config.bucket,Key:e?gt.join(e,t):t};let i,n;try{return i=await this.sendCommand(new c.DeleteObjectCommand(r)),i}catch(e){throw n=e,T(e,{bucket:this.config.bucket,key:t,commandName:"DeleteObjectCommand",commandInput:r})}finally{this.emit("deleteObject",n||i,{key:t})}}async deleteObjects(t){const e="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"",r=s.chunk(t,1e3),{results:n,errors:o}=await i.PromisePool.for(r).withConcurrency(this.parallelism).process(async t=>{for(const r of t)e&>.join(e,r),this.config.bucket,await this.exists(r);const r={Bucket:this.config.bucket,Delete:{Objects:t.map(t=>({Key:e?gt.join(e,t):t}))}};let i;const[n,s,o]=await K(()=>this.sendCommand(new c.DeleteObjectsCommand(r)));if(!n)throw s;return i=o,i&&i.Errors&&i.Errors.length,i&&i.Deleted&&(i.Deleted.length,t.length),i}),a={deleted:n,notFound:o};return this.emit("deleteObjects",a,t),a}async deleteAll({prefix:t}={}){const e="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"";let r,i=0;do{const n=new c.ListObjectsV2Command({Bucket:this.config.bucket,Prefix:e?gt.join(e,t||""):t||"",ContinuationToken:r}),s=await this.client.send(n);if(s.Contents&&s.Contents.length>0){const e=new c.DeleteObjectsCommand({Bucket:this.config.bucket,Delete:{Objects:s.Contents.map(t=>({Key:t.Key}))}}),r=await this.client.send(e),n=r.Deleted?r.Deleted.length:0;i+=n,this.emit("deleteAll",{prefix:t,batch:n,total:i})}r=s.IsTruncated?s.NextContinuationToken:void 0}while(r);return this.emit("deleteAllComplete",{prefix:t,totalDeleted:i}),i}async moveObject({from:t,to:e}){const[r,i]=await K(async()=>{await this.copyObject({from:t,to:e}),await this.deleteObject(t)});if(!r)throw new C("Unknown error in moveObject",{bucket:this.config.bucket,from:t,to:e,original:i});return!0}async listObjects({prefix:t,maxKeys:e=1e3,continuationToken:r}={}){const i={Bucket:this.config.bucket,MaxKeys:e,ContinuationToken:r,Prefix:this.config.keyPrefix?gt.join(this.config.keyPrefix,t||""):t||""},[n,s,o]=await K(()=>this.sendCommand(new c.ListObjectsV2Command(i)));if(!n)throw new C("Unknown error in listObjects",{prefix:t,bucket:this.config.bucket,original:s});return this.emit("listObjects",o,i),o}async count({prefix:t}={}){let e,r=0,i=!0;for(;i;){const n={prefix:t,continuationToken:e},s=await this.listObjects(n);r+=s.KeyCount||0,i=s.IsTruncated||!1,e=s.NextContinuationToken}return this.emit("count",r,{prefix:t}),r}async getAllKeys({prefix:t}={}){let e,r=[],i=!0;for(;i;){const n={prefix:t,continuationToken:e},s=await this.listObjects(n);s.Contents&&(r=r.concat(s.Contents.map(t=>t.Key))),i=s.IsTruncated||!1,e=s.NextContinuationToken}return this.config.keyPrefix&&(r=r.map(t=>t.replace(this.config.keyPrefix,"")).map(t=>t.startsWith("/")?t.replace("/",""):t)),this.emit("getAllKeys",r,{prefix:t}),r}async getContinuationTokenAfterOffset(t={}){const{prefix:e,offset:r=1e3}=t;if(0===r)return null;let i,n=!0,s=0;for(;n;){const t={prefix:e,maxKeys:r<1e3?r:r-s>1e3?1e3:r-s,continuationToken:i},o=await this.listObjects(t);if(o.Contents&&(s+=o.Contents.length),n=o.IsTruncated||!1,i=o.NextContinuationToken,s>=r)break}return this.emit("getContinuationTokenAfterOffset",i||null,t),i||null}async getKeysPage(t={}){const{prefix:e,offset:r=0,amount:i=100}=t;let n,s=[],o=!0;if(r>0&&(n=await this.getContinuationTokenAfterOffset({prefix:e,offset:r}),!n))return this.emit("getKeysPage",[],t),[];for(;o;){const t={prefix:e,continuationToken:n},r=await this.listObjects(t);if(r.Contents&&(s=s.concat(r.Contents.map(t=>t.Key))),o=r.IsTruncated||!1,n=r.NextContinuationToken,s.length>=i){s=s.slice(0,i);break}}return this.config.keyPrefix&&(s=s.map(t=>t.replace(this.config.keyPrefix,"")).map(t=>t.startsWith("/")?t.replace("/",""):t)),this.emit("getKeysPage",s,t),s}async moveAllObjects({prefixFrom:t,prefixTo:e}){const r=await this.getAllKeys({prefix:t}),{results:n,errors:s}=await i.PromisePool.for(r).withConcurrency(this.parallelism).process(async r=>{const i=r.replace(t,e),[n,s]=await K(async()=>{await this.moveObject({from:r,to:i})});if(!n)throw new C("Unknown error in moveAllObjects",{bucket:this.config.bucket,from:r,to:i,original:s});return i});if(this.emit("moveAllObjects",{results:n,errors:s},{prefixFrom:t,prefixTo:e}),s.length>0)throw new Error("Some objects could not be moved");return n}}var ri=ei;async function ii(t,e,r){if(!this.passphrase)return e.push(new x("Missing configuration for secrets encryption.",{actual:t,type:"encryptionKeyMissing",suggestion:"Provide a passphrase for secret encryption."})),t;const[i,n,s]=await K(()=>W(String(t),this.passphrase));return i?s:(e.push(new x("Problem encrypting secret.",{actual:t,type:"encryptionProblem",error:n,suggestion:"Check the passphrase and input value."})),t)}async function ni(t,e,r){if(s.isString(t))return t;const[i,n,o]=z(()=>JSON.stringify(t));if(!i)throw new x("Failed to stringify JSON",{original:n,input:t});return o}class si extends l{constructor({options:t,passphrase:e,autoEncrypt:r=!0}={}){super(s.merge({},{useNewCustomCheckerFunction:!0,messages:{encryptionKeyMissing:"Missing configuration for secrets encryption.",encryptionProblem:"Problem encrypting secret. Actual: {actual}. Error: {error}"},defaults:{string:{trim:!0},object:{strict:"remove"},number:{convert:!0}}},t)),this.passphrase=e,this.autoEncrypt=r,this.alias("secret",{type:"string",custom:this.autoEncrypt?ii:void 0,messages:{string:"The '{field}' field must be a string.",stringMin:"This secret '{field}' field length must be at least {expected} long."}}),this.alias("secretAny",{type:"any",custom:this.autoEncrypt?ii:void 0}),this.alias("secretNumber",{type:"number",custom:this.autoEncrypt?ii:void 0}),this.alias("json",{type:"any",custom:this.autoEncrypt?ni:void 0})}}const oi=new Proxy(si,{instance:null,construct(t,e){return this.instance||(this.instance=new t(...e)),this.instance}});const ai={trim:t=>null==t?t:t.trim(),encrypt:async(t,{passphrase:e})=>{if(null==t)return t;const[r,i,n]=await V(()=>W(t,e));return r?n:t},decrypt:async(t,{passphrase:e})=>{if(null==t)return t;const[r,i,n]=await V(()=>J(t,e));return r?"null"===n?null:"undefined"!==n?n:void 0:t},toString:t=>null==t?t:String(t),fromArray:(t,{separator:e})=>{if(null==t||!Array.isArray(t))return t;if(0===t.length)return"";return t.map(t=>"string"==typeof t?t.replace(/\\/g,"\\\\").replace(new RegExp(`\\${e}`,"g"),`\\${e}`):String(t)).join(e)},toArray:(t,{separator:e})=>{if(Array.isArray(t))return t;if(null==t)return t;if(""===t)return[];const r=[];let i="",n=0;const s=String(t);for(;n<s.length;)"\\"===s[n]&&n+1<s.length?(i+=s[n+1],n+=2):s[n]===e?(r.push(i),i="",n++):(i+=s[n],n++);return r.push(i),r},toJSON:t=>{if(null===t)return null;if(void 0===t)return;if("string"==typeof t){const[e,r,i]=z(()=>JSON.parse(t));return t}const[e,r,i]=z(()=>JSON.stringify(t));return e?i:t},fromJSON:t=>{if(null===t)return null;if(void 0===t)return;if("string"!=typeof t)return t;if(""===t)return"";const[e,r,i]=z(()=>JSON.parse(t));return e?i:t},toNumber:t=>s.isString(t)?t.includes(".")?parseFloat(t):parseInt(t):t,toBool:t=>[!0,1,"true","1","yes","y"].includes(t),fromBool:t=>[!0,1,"true","1","yes","y"].includes(t)?"1":"0",fromBase62:t=>{if(null==t||""===t)return t;if("number"==typeof t)return t;if("string"==typeof t){const e=p(t);return isNaN(e)?void 0:e}},toBase62:t=>{if(null==t||""===t)return t;if("number"==typeof t)return d(t);if("string"==typeof t){const e=Number(t);return isNaN(e)?t:d(e)}return t},fromBase62Decimal:t=>{if(null==t||""===t)return t;if("number"==typeof t)return t;if("string"==typeof t){const e=g(t);return isNaN(e)?void 0:e}},toBase62Decimal:t=>{if(null==t||""===t)return t;if("number"==typeof t)return m(t);if("string"==typeof t){const e=Number(t);return isNaN(e)?t:m(e)}return t},fromArrayOfNumbers:(t,{separator:e})=>{if(null==t||!Array.isArray(t))return t;if(0===t.length)return"";return t.map(t=>{if("number"==typeof t&&!isNaN(t))return d(t);const e=Number(t);return isNaN(e)?"":d(e)}).join(e)},toArrayOfNumbers:(t,{separator:e})=>{if(Array.isArray(t))return t.map(t=>"number"==typeof t?t:p(t));if(null==t)return t;if(""===t)return[];const r=String(t),i=[];let n="",s=0;for(;s<r.length;)"\\"===r[s]&&s+1<r.length?(n+=r[s+1],s+=2):r[s]===e?(i.push(n),n="",s++):(n+=r[s],s++);return i.push(n),i.map(t=>{if("number"==typeof t)return t;if("string"==typeof t&&""!==t){const e=p(t);return isNaN(e)?NaN:e}return NaN})},fromArrayOfDecimals:(t,{separator:e})=>{if(null==t||!Array.isArray(t))return t;if(0===t.length)return"";return t.map(t=>{if("number"==typeof t&&!isNaN(t))return m(t);const e=Number(t);return isNaN(e)?"":m(e)}).join(e)},toArrayOfDecimals:(t,{separator:e})=>{if(Array.isArray(t))return t.map(t=>"number"==typeof t?t:g(t));if(null==t)return t;if(""===t)return[];const r=String(t),i=[];let n="",s=0;for(;s<r.length;)"\\"===r[s]&&s+1<r.length?(n+=r[s+1],s+=2):r[s]===e?(i.push(n),n="",s++):(n+=r[s],s++);return i.push(n),i.map(t=>{if("number"==typeof t)return t;if("string"==typeof t&&""!==t){const e=g(t);return isNaN(e)?NaN:e}return NaN})}};class ci{constructor(t){const{map:e,name:r,attributes:i,passphrase:n,version:o=1,options:a={}}=t;this.name=r,this.version=o,this.attributes=i||{},this.passphrase=n??"secret",this.options=s.merge({},this.defaultOptions(),a),this.allNestedObjectsOptional=this.options.allNestedObjectsOptional??!1;const c=this.preprocessAttributesForValidation(this.attributes);if(this.validator=new oi({autoEncrypt:!1}).compile(s.merge({$$async:!0},c)),this.options.generateAutoHooks&&this.generateAutoHooks(),s.isEmpty(e)){const t=u.flatten(this.attributes,{safe:!0}),e=Object.keys(t).filter(t=>!t.includes("$$")),r=this.extractObjectKeys(this.attributes),i=[...new Set([...e,...r])],{mapping:n,reversedMapping:s}=function(t){const e={},r={};return t.forEach((t,i)=>{const n=d(i);e[t]=n,r[n]=t}),{mapping:e,reversedMapping:r}}(i);this.map=n,this.reversedMap=s}else this.map=e,this.reversedMap=s.invert(e)}defaultOptions(){return{autoEncrypt:!0,autoDecrypt:!0,arraySeparator:"|",generateAutoHooks:!0,hooks:{beforeMap:{},afterMap:{},beforeUnmap:{},afterUnmap:{}}}}addHook(t,e,r){this.options.hooks[t][e]||(this.options.hooks[t][e]=[]),this.options.hooks[t][e]=s.uniq([...this.options.hooks[t][e],r])}extractObjectKeys(t,e=""){const r=[];for(const[i,n]of Object.entries(t)){if(i.startsWith("$$"))continue;const t=e?`${e}.${i}`:i;"object"!=typeof n||null===n||Array.isArray(n)||(r.push(t),"object"===n.$$type&&r.push(...this.extractObjectKeys(n,t)))}return r}generateAutoHooks(){const t=u.flatten(s.cloneDeep(this.attributes),{safe:!0});for(const[e,r]of Object.entries(t))if(r.includes("array")){if(r.includes("items:string"))this.addHook("beforeMap",e,"fromArray"),this.addHook("afterUnmap",e,"toArray");else if(r.includes("items:number")){r.includes("integer:true")||r.includes("|integer:")||r.includes("|integer")?(this.addHook("beforeMap",e,"fromArrayOfNumbers"),this.addHook("afterUnmap",e,"toArrayOfNumbers")):(this.addHook("beforeMap",e,"fromArrayOfDecimals"),this.addHook("afterUnmap",e,"toArrayOfDecimals"))}}else if(r.includes("secret"))this.options.autoEncrypt&&this.addHook("beforeMap",e,"encrypt"),this.options.autoDecrypt&&this.addHook("afterUnmap",e,"decrypt");else{if(r.includes("number")){r.includes("integer:true")||r.includes("|integer:")||r.includes("|integer")?(this.addHook("beforeMap",e,"toBase62"),this.addHook("afterUnmap",e,"fromBase62")):(this.addHook("beforeMap",e,"toBase62Decimal"),this.addHook("afterUnmap",e,"fromBase62Decimal"));continue}r.includes("boolean")?(this.addHook("beforeMap",e,"fromBool"),this.addHook("afterUnmap",e,"toBool")):(r.includes("json")||"object"===r||r.includes("object"))&&(this.addHook("beforeMap",e,"toJSON"),this.addHook("afterUnmap",e,"fromJSON"))}}static import(t){let{map:e,name:r,options:i,version:n,attributes:o}=s.isString(t)?JSON.parse(t):t;const[a,c,u]=z(()=>ci._importAttributes(o));if(!a)throw new U("Failed to import schema attributes",{original:c,input:o});o=u;return new ci({map:e,name:r,options:i,version:n,attributes:o})}static _importAttributes(t){if("string"==typeof t){const[e,r,i]=z(()=>JSON.parse(t));if(e&&"object"==typeof i&&null!==i){const[e,r,n]=z(()=>ci._importAttributes(i));if(!e)throw new U("Failed to parse nested schema attribute",{original:r,input:t});return n}return t}if(Array.isArray(t)){const[e,r,i]=z(()=>t.map(t=>ci._importAttributes(t)));if(!e)throw new U("Failed to import array schema attributes",{original:r,input:t});return i}if("object"==typeof t&&null!==t){const e={};for(const[r,i]of Object.entries(t)){const[t,n,s]=z(()=>ci._importAttributes(i));if(!t)throw new U("Failed to import object schema attribute",{original:n,key:r,input:i});e[r]=s}return e}return t}export(){return{version:this.version,name:this.name,options:this.options,attributes:this._exportAttributes(this.attributes),map:this.map}}_exportAttributes(t){if("string"==typeof t)return t;if(Array.isArray(t))return t.map(t=>this._exportAttributes(t));if("object"==typeof t&&null!==t){const e={};for(const[r,i]of Object.entries(t))e[r]=this._exportAttributes(i);return e}return t}async applyHooksActions(t,e){const r=s.cloneDeep(t);for(const[t,i]of Object.entries(this.options.hooks[e]))for(const e of i){const i=s.get(r,t);void 0!==i&&"function"==typeof ai[e]&&s.set(r,t,await ai[e](i,{passphrase:this.passphrase,separator:this.options.arraySeparator}))}return r}async validate(t,{mutateOriginal:e=!1}={}){let r=e?t:s.cloneDeep(t);return await this.validator(r)}async mapper(t){let e=s.cloneDeep(t);e=await this.applyHooksActions(e,"beforeMap");const r=u.flatten(e,{safe:!0}),i={_v:this.version+""};for(const[t,e]of Object.entries(r)){const r=this.map[t]||t,n=this.getAttributeDefinition(t);"number"==typeof e&&"string"==typeof n&&n.includes("number")?i[r]=d(e):"string"==typeof e?"[object Object]"===e?i[r]="{}":(e.startsWith("{")||e.startsWith("["),i[r]=e):Array.isArray(e)||"object"==typeof e&&null!==e?i[r]=JSON.stringify(e):i[r]=e}return await this.applyHooksActions(i,"afterMap"),i}async unmapper(t,e){let r=s.cloneDeep(t);delete r._v,r=await this.applyHooksActions(r,"beforeUnmap");const i=e?s.invert(e):this.reversedMap,n={};for(const[t,e]of Object.entries(r)){const r=i&&i[t]?i[t]:t;let s=e;const o=this.getAttributeDefinition(r);if("string"!=typeof o||!o.includes("number")||o.includes("array")||o.includes("decimal")){if("string"==typeof e)if("[object Object]"===e)s={};else if(e.startsWith("{")||e.startsWith("[")){const[t,r,i]=z(()=>JSON.parse(e));t&&(s=i)}}else"string"==typeof s&&""!==s?s=p(s):"number"==typeof s||(s=void 0);if(this.attributes&&"string"==typeof o&&o.includes("array"))if(Array.isArray(s));else if("string"==typeof s&&s.trim().startsWith("[")){const[t,e,r]=z(()=>JSON.parse(s));t&&Array.isArray(r)&&(s=r)}else s=ai.toArray(s,{separator:this.options.arraySeparator});if(this.options.hooks&&this.options.hooks.afterUnmap&&this.options.hooks.afterUnmap[r])for(const t of this.options.hooks.afterUnmap[r])"function"==typeof ai[t]&&(s=await ai[t](s,{passphrase:this.passphrase,separator:this.options.arraySeparator}));n[r]=s}await this.applyHooksActions(n,"afterUnmap");const o=u.unflatten(n);for(const[e,r]of Object.entries(t))e.startsWith("$")&&(o[e]=r);return o}getAttributeDefinition(t){const e=t.split(".");let r=this.attributes;for(const t of e){if(!r)return;r=r[t]}return r}preprocessAttributesForValidation(t){const e={};for(const[r,i]of Object.entries(t))if("object"!=typeof i||null===i||Array.isArray(i))e[r]=i;else{const t=i.$$type&&i.$$type.includes("required"),n=i.$$type&&i.$$type.includes("optional"),s={type:"object",properties:this.preprocessAttributesForValidation(i),strict:!1};t||(n||this.allNestedObjectsOptional)&&(s.optional=!0),e[r]=s}return e}}var ui=ci;const li=2047;var hi=Object.freeze({__proto__:null,S3_METADATA_LIMIT_BYTES:li,handleGet:async function({resource:t,metadata:e,body:r}){return{metadata:e,body:r}},handleInsert:async function({resource:t,data:e,mappedData:r,originalData:i}){const n=k(r),s=S({s3Limit:li,systemConfig:{version:t.version,timestamps:t.config.timestamps,id:e.id}});if(n>s)throw new Error(`S3 metadata size exceeds 2KB limit. Current size: ${n} bytes, effective limit: ${s} bytes, absolute limit: 2047 bytes`);return{mappedData:r,body:JSON.stringify(r)}},handleUpdate:async function({resource:t,id:e,data:r,mappedData:i,originalData:n}){const s=k(i),o=S({s3Limit:li,systemConfig:{version:t.version,timestamps:t.config.timestamps,id:e}});if(s>o)throw new Error(`S3 metadata size exceeds 2KB limit. Current size: ${s} bytes, effective limit: ${o} bytes, absolute limit: 2047 bytes`);return{mappedData:i,body:JSON.stringify(i)}},handleUpsert:async function({resource:t,id:e,data:r,mappedData:i}){const n=k(i),s=S({s3Limit:li,systemConfig:{version:t.version,timestamps:t.config.timestamps,id:e}});if(n>s)throw new Error(`S3 metadata size exceeds 2KB limit. Current size: ${n} bytes, effective limit: ${s} bytes, absolute limit: 2047 bytes`);return{mappedData:i,body:""}}});var fi=Object.freeze({__proto__:null,handleGet:async function({resource:t,metadata:e,body:r}){return{metadata:e,body:r}},handleInsert:async function({resource:t,data:e,mappedData:r,originalData:i}){const n=k(r);return n>S({s3Limit:li,systemConfig:{version:t.version,timestamps:t.config.timestamps,id:e.id}})&&t.emit("exceedsLimit",{operation:"insert",totalSize:n,limit:2047,excess:n-2047,data:i||e}),{mappedData:r,body:JSON.stringify(e)}},handleUpdate:async function({resource:t,id:e,data:r,mappedData:i,originalData:n}){const s=k(i);return s>S({s3Limit:li,systemConfig:{version:t.version,timestamps:t.config.timestamps,id:e}})&&t.emit("exceedsLimit",{operation:"update",id:e,totalSize:s,limit:2047,excess:s-2047,data:n||r}),{mappedData:i,body:JSON.stringify(r)}},handleUpsert:async function({resource:t,id:e,data:r,mappedData:i,originalData:n}){const s=k(i);return s>S({s3Limit:li,systemConfig:{version:t.version,timestamps:t.config.timestamps,id:e}})&&t.emit("exceedsLimit",{operation:"upsert",id:e,totalSize:s,limit:2047,excess:s-2047,data:n||r}),{mappedData:i,body:JSON.stringify(r)}}});const di="$truncated",pi="true",mi=y(di)+y(pi);async function gi({resource:t,data:e,mappedData:r,originalData:i}){const n=S({s3Limit:li,systemConfig:{version:t.version,timestamps:t.config.timestamps,id:e.id}}),s=v(r),o=Object.entries(s).sort(([,t],[,e])=>t-e),a={};let c=0,u=!1;r._v&&(a._v=r._v,c+=s._v);for(const[t,e]of o){if("_v"===t)continue;const i=r[t];if(!(c+(e+(u?0:mi))<=n)){const e=n-c-(u?0:mi);if(e>0){const r=yi(i,e);a[t]=r,u=!0,c+=y(r)}else a[t]="",u=!0;break}a[t]=i,c+=e}let l=k(a)+(u?mi:0);for(;l>n;){const t=Object.keys(a).filter(t=>"_v"!==t&&"$truncated"!==t);if(0===t.length)break;a[t[t.length-1]]="",l=k(a)+mi,u=!0}return u&&(a[di]=pi),{mappedData:a,body:JSON.stringify(r)}}function yi(t,e){if("string"==typeof t)return bi(t,e);if("object"==typeof t&&null!==t){return bi(JSON.stringify(t),e)}return bi(String(t),e)}function bi(t,e){const r=new TextEncoder;let i=r.encode(t);if(i.length<=e)return t;let n=t.length;for(;n>0;){const s=t.substring(0,n);if(i=r.encode(s),i.length<=e)return s;n--}return""}var wi=Object.freeze({__proto__:null,handleGet:async function({resource:t,metadata:e,body:r}){return{metadata:e,body:r}},handleInsert:gi,handleUpdate:async function({resource:t,id:e,data:r,mappedData:i,originalData:n}){return gi({resource:t,data:r,mappedData:i,originalData:n})},handleUpsert:async function({resource:t,id:e,data:r,mappedData:i}){return gi({resource:t,data:r,mappedData:i})}});const vi="$overflow",ki="true",Oi=y(vi)+y(ki);async function Si({resource:t,data:e,mappedData:r,originalData:i}){const n=S({s3Limit:li,systemConfig:{version:t.version,timestamps:t.config.timestamps,id:e.id}}),s=v(r),o=Object.entries(s).sort(([,t],[,e])=>t-e),a={},c={};let u=0,l=!1;r._v&&(a._v=r._v,u+=s._v);let h=n;for(const[t,e]of o)"_v"!==t&&(!l&&u+e>n&&(h-=Oi,l=!0),!l&&u+e<=h?(a[t]=r[t],u+=e):(c[t]=r[t],l=!0));l&&(a[vi]=ki);const f=Object.keys(c).length>0;let d=f?JSON.stringify(c):"";return f||(d="{}"),{mappedData:a,body:d}}async function _i({resource:t,data:e,mappedData:r}){const i={_v:r._v||String(t.version)};i._map=JSON.stringify(t.schema.map);return{mappedData:i,body:JSON.stringify(r)}}const ji={"user-managed":fi,"enforce-limits":hi,"truncate-data":wi,"body-overflow":Object.freeze({__proto__:null,handleGet:async function({resource:t,metadata:e,body:r}){let i={};if(r&&""!==r.trim()){const[t,e,n]=z(()=>JSON.parse(r));i=t?n:{}}const n={...i,...e};return delete n.$overflow,{metadata:n,body:r}},handleInsert:Si,handleUpdate:async function({resource:t,id:e,data:r,mappedData:i,originalData:n}){return Si({resource:t,data:r,mappedData:i,originalData:n})},handleUpsert:async function({resource:t,id:e,data:r,mappedData:i}){return Si({resource:t,data:r,mappedData:i})}}),"body-only":Object.freeze({__proto__:null,handleGet:async function({resource:t,metadata:e,body:r}){let i={};if(r&&""!==r.trim()){const[t,e,n]=z(()=>JSON.parse(r));i=t?n:{}}return{metadata:{...i,...e},body:r}},handleInsert:_i,handleUpdate:async function({resource:t,id:e,data:r,mappedData:i}){const n={_v:i._v||String(t.version)};return n._map=JSON.stringify(t.schema.map),{mappedData:n,body:JSON.stringify(i)}},handleUpsert:async function({resource:t,id:e,data:r,mappedData:i}){return _i({resource:t,data:r,mappedData:i})}})};function xi(t){const e=ji[t];if(!e)throw new Error(`Unknown behavior: ${t}. Available behaviors: ${Object.keys(ji).join(", ")}`);return e}const Ri=Object.keys(ji),Di="user-managed";class Ai extends et{constructor(t={}){super(),this._instanceId=Math.random().toString(36).slice(2,8);const e=function(t){const e=[];t.name?"string"!=typeof t.name?e.push("Resource 'name' must be a string"):""===t.name.trim()&&e.push("Resource 'name' cannot be empty"):e.push("Resource 'name' is required");t.client||e.push("S3 'client' is required");t.attributes?"object"!=typeof t.attributes||Array.isArray(t.attributes)?e.push("Resource 'attributes' must be an object"):0===Object.keys(t.attributes).length&&e.push("Resource 'attributes' cannot be empty"):e.push("Resource 'attributes' are required");void 0!==t.version&&"string"!=typeof t.version&&e.push("Resource 'version' must be a string");void 0!==t.behavior&&"string"!=typeof t.behavior&&e.push("Resource 'behavior' must be a string");void 0!==t.passphrase&&"string"!=typeof t.passphrase&&e.push("Resource 'passphrase' must be a string");void 0!==t.parallelism&&("number"==typeof t.parallelism&&Number.isInteger(t.parallelism)?t.parallelism<1&&e.push("Resource 'parallelism' must be greater than 0"):e.push("Resource 'parallelism' must be an integer"));void 0===t.observers||Array.isArray(t.observers)||e.push("Resource 'observers' must be an array");const r=["cache","autoDecrypt","timestamps","paranoid","allNestedObjectsOptional"];for(const i of r)void 0!==t[i]&&"boolean"!=typeof t[i]&&e.push(`Resource '${i}' must be a boolean`);void 0!==t.idGenerator&&("function"!=typeof t.idGenerator&&"number"!=typeof t.idGenerator?e.push("Resource 'idGenerator' must be a function or a number (size)"):"number"==typeof t.idGenerator&&t.idGenerator<=0&&e.push("Resource 'idGenerator' size must be greater than 0"));void 0!==t.idSize&&("number"==typeof t.idSize&&Number.isInteger(t.idSize)?t.idSize<=0&&e.push("Resource 'idSize' must be greater than 0"):e.push("Resource 'idSize' must be an integer"));if(void 0!==t.partitions)if("object"!=typeof t.partitions||Array.isArray(t.partitions))e.push("Resource 'partitions' must be an object");else for(const[r,i]of Object.entries(t.partitions))if("object"!=typeof i||Array.isArray(i))e.push(`Partition '${r}' must be an object`);else if(i.fields)if("object"!=typeof i.fields||Array.isArray(i.fields))e.push(`Partition '${r}.fields' must be an object`);else for(const[t,n]of Object.entries(i.fields))"string"!=typeof n&&e.push(`Partition '${r}.fields.${t}' must be a string`);else e.push(`Partition '${r}' must have a 'fields' property`);if(void 0!==t.hooks)if("object"!=typeof t.hooks||Array.isArray(t.hooks))e.push("Resource 'hooks' must be an object");else{const r=["beforeInsert","afterInsert","beforeUpdate","afterUpdate","beforeDelete","afterDelete"];for(const[i,n]of Object.entries(t.hooks))if(r.includes(i))if(Array.isArray(n))for(let t=0;t<n.length;t++){const e=n[t];if("function"==typeof e);else if("string"==typeof e)continue}else e.push(`Resource 'hooks.${i}' must be an array`);else e.push(`Invalid hook event '${i}'. Valid events: ${r.join(", ")}`)}return{isValid:0===e.length,errors:e}}(t);if(!e.isValid)throw new B(`Invalid Resource ${t.name} configuration`,{resourceName:t.name,validation:e.errors,operation:"constructor",suggestion:"Check resource config and attributes."});const{name:r,client:i,version:n="1",attributes:s={},behavior:o=Di,passphrase:a="secret",parallelism:c=10,observers:u=[],cache:l=!1,autoDecrypt:h=!0,timestamps:f=!1,partitions:d={},paranoid:p=!0,allNestedObjectsOptional:m=!0,hooks:g={},idGenerator:y,idSize:b=22,versioningEnabled:w=!1}=t;if(this.name=r,this.client=i,this.version=n,this.behavior=o,this.observers=u,this.parallelism=c,this.passphrase=a??"secret",this.versioningEnabled=w,this.idGenerator=this.configureIdGenerator(y,b),this.config={cache:l,hooks:g,paranoid:p,timestamps:f,partitions:d,autoDecrypt:h,allNestedObjectsOptional:m},this.hooks={beforeInsert:[],afterInsert:[],beforeUpdate:[],afterUpdate:[],beforeDelete:[],afterDelete:[]},this.attributes=s||{},this.map=t.map,this.applyConfiguration({map:this.map}),g)for(const[t,e]of Object.entries(g))if(Array.isArray(e)&&this.hooks[t])for(const r of e)"function"==typeof r&&this.hooks[t].push(r.bind(this));this._initMiddleware()}configureIdGenerator(t,r){return"function"==typeof t?t:"number"==typeof t&&t>0?e.customAlphabet(e.urlAlphabet,t):"number"==typeof r&&r>0&&22!==r?e.customAlphabet(e.urlAlphabet,r):Z}get options(){return{timestamps:this.config.timestamps,partitions:this.config.partitions||{},cache:this.config.cache,autoDecrypt:this.config.autoDecrypt,paranoid:this.config.paranoid,allNestedObjectsOptional:this.config.allNestedObjectsOptional}}export(){const t=this.schema.export();return t.behavior=this.behavior,t.timestamps=this.config.timestamps,t.partitions=this.config.partitions||{},t.paranoid=this.config.paranoid,t.allNestedObjectsOptional=this.config.allNestedObjectsOptional,t.autoDecrypt=this.config.autoDecrypt,t.cache=this.config.cache,t.hooks=this.hooks,t.map=this.map,t}applyConfiguration({map:t}={}){this.config.timestamps&&(this.attributes.createdAt||(this.attributes.createdAt="string|optional"),this.attributes.updatedAt||(this.attributes.updatedAt="string|optional"),this.config.partitions||(this.config.partitions={}),this.config.partitions.byCreatedDate||(this.config.partitions.byCreatedDate={fields:{createdAt:"date|maxlength:10"}}),this.config.partitions.byUpdatedDate||(this.config.partitions.byUpdatedDate={fields:{updatedAt:"date|maxlength:10"}})),this.setupPartitionHooks(),this.versioningEnabled&&(this.config.partitions.byVersion||(this.config.partitions.byVersion={fields:{_v:"string"}})),this.schema=new ui({name:this.name,attributes:this.attributes,passphrase:this.passphrase,version:this.version,options:{autoDecrypt:this.config.autoDecrypt,allNestedObjectsOptional:this.config.allNestedObjectsOptional},map:t||this.map}),this.validatePartitions()}updateAttributes(t){const e=this.attributes;return this.attributes=t,this.applyConfiguration({map:this.schema?.map}),{oldAttributes:e,newAttributes:t}}addHook(t,e){this.hooks[t]&&this.hooks[t].push(e.bind(this))}async executeHooks(t,e){if(!this.hooks[t])return e;let r=e;for(const e of this.hooks[t])r=await e(r);return r}setupPartitionHooks(){if(!this.config.partitions)return;const t=this.config.partitions;0!==Object.keys(t).length&&(this.hooks.afterInsert||(this.hooks.afterInsert=[]),this.hooks.afterInsert.push(async t=>(await this.createPartitionReferences(t),t)),this.hooks.afterDelete||(this.hooks.afterDelete=[]),this.hooks.afterDelete.push(async t=>(await this.deletePartitionReferences(t),t)))}async validate(t){const e={original:s.cloneDeep(t),isValid:!1,errors:[]},r=await this.schema.validate(t,{mutateOriginal:!1});return!0===r?e.isValid=!0:e.errors=r,e.data=t,e}validatePartitions(){if(!this.config.partitions)return;const t=this.config.partitions;if(0===Object.keys(t).length)return;const e=Object.keys(this.attributes||{});for(const[r,i]of Object.entries(t))if(i.fields)for(const t of Object.keys(i.fields))if(!this.fieldExistsInAttributes(t))throw new F(`Partition '${r}' uses field '${t}' which does not exist in resource attributes. Available fields: ${e.join(", ")}.`,{resourceName:this.name,partitionName:r,fieldName:t,availableFields:e,operation:"validatePartitions"})}fieldExistsInAttributes(t){if(t.startsWith("_"))return!0;if(!t.includes("."))return Object.keys(this.attributes||{}).includes(t);const e=t.split(".");let r=this.attributes||{};for(const t of e){if(!r||"object"!=typeof r||!(t in r))return!1;r=r[t]}return!0}applyPartitionRule(t,e){if(null==t)return t;let r=t;if("string"==typeof e&&e.includes("maxlength:")){const t=e.match(/maxlength:(\d+)/);if(t){const e=parseInt(t[1]);"string"==typeof r&&r.length>e&&(r=r.substring(0,e))}}if(e.includes("date"))if(r instanceof Date)r=r.toISOString().split("T")[0];else if("string"==typeof r)if(r.includes("T")&&r.includes("Z"))r=r.split("T")[0];else{const t=new Date(r);isNaN(t.getTime())||(r=t.toISOString().split("T")[0])}return r}getResourceKey(t){return mt("resource="+this.name,"data",`id=${t}`)}getPartitionKey({partitionName:t,id:e,data:r}){if(!this.config.partitions||!this.config.partitions[t])throw new F(`Partition '${t}' not found`,{resourceName:this.name,partitionName:t,operation:"getPartitionKey"});const i=this.config.partitions[t],n=[],s=Object.entries(i.fields).sort(([t],[e])=>t.localeCompare(e));for(const[t,e]of s){const i=this.getNestedFieldValue(r,t),s=this.applyPartitionRule(i,e);if(null==s)return null;n.push(`${t}=${s}`)}if(0===n.length)return null;const o=e||r?.id;return o?mt(`resource=${this.name}`,`partition=${t}`,...n,`id=${o}`):null}getNestedFieldValue(t,e){if(!e.includes("."))return t[e];const r=e.split(".");let i=t;for(const t of r){if(!i||"object"!=typeof i||!(t in i))return;i=i[t]}return i}calculateContentLength(t){return t?Buffer.isBuffer(t)?t.length:"string"==typeof t?Buffer.byteLength(t,"utf8"):"object"==typeof t?Buffer.byteLength(JSON.stringify(t),"utf8"):Buffer.byteLength(String(t),"utf8"):0}async insert({id:t,...e}){if(await this.exists(t))throw new Error(`Resource with id '${t}' already exists`);this.getResourceKey(t||"(auto)"),this.options.timestamps&&(e.createdAt=(new Date).toISOString(),e.updatedAt=(new Date).toISOString());const r={id:t,...this.applyDefaults(e)},i=await this.executeHooks("beforeInsert",r),n=Object.keys(i).filter(t=>!(t in r)||i[t]!==r[t]),s={};for(const t of n)s[t]=i[t];const{errors:o,isValid:a,data:c}=await this.validate(i);if(!a){const t=o&&o.length&&o[0].message?o[0].message:"Insert failed";throw new I({bucket:this.client.config.bucket,resourceName:this.name,attributes:i,validation:o,message:t})}const{id:u,...l}=c;Object.assign(l,s);const h=u||t||this.idGenerator(),f=await this.schema.mapper(l);f._v=String(this.version);const d=xi(this.behavior),{mappedData:p,body:m}=await d.handleInsert({resource:this,data:l,mappedData:f,originalData:r}),g=p,y=this.getResourceKey(h);let b;if(m&&""!==m){const[t,e]=await K(()=>Promise.resolve(JSON.parse(m)));t&&(b="application/json")}if("body-only"===this.behavior&&(!m||""===m))throw new Error(`[Resource.insert] Tentativa de gravar objeto sem body! Dados: id=${h}, resource=${this.name}`);const[w,v,O]=await K(()=>this.client.putObject({key:y,body:m,contentType:b,metadata:g}));if(!w){const t=v&&v.message?v.message:"";if(t.includes("metadata headers exceed")||t.includes("Insert failed")){const t=k(g),e=S({s3Limit:2047,systemConfig:{version:this.version,timestamps:this.config.timestamps,id:h}}),r=t-e;throw v.totalSize=t,v.limit=2047,v.effectiveLimit=e,v.excess=r,new B("metadata headers exceed",{resourceName:this.name,operation:"insert",id:h,totalSize:t,effectiveLimit:e,excess:r,suggestion:"Reduce metadata size or number of fields."})}throw T(v,{bucket:this.client.config.bucket,key:y,resourceName:this.name,operation:"insert",id:h})}let _=await this.composeFullObjectFromWrite({id:h,metadata:g,body:m,behavior:this.behavior});const j=await this.executeHooks("afterInsert",_);return this.emit("insert",{..._,$before:{...r},$after:{...j}}),j}async get(t){if(s.isObject(t))throw new Error("id cannot be an object");if(s.isEmpty(t))throw new Error("id cannot be empty");const e=this.getResourceKey(t),[r,i,n]=await K(()=>this.client.getObject(e));if(!r)throw T(i,{bucket:this.client.config.bucket,key:e,resourceName:this.name,operation:"get",id:t});if(0===n.ContentLength){const r=new Error(`No such key: ${e} [bucket:${this.client.config.bucket}]`);throw r.name="NoSuchKey",T(r,{bucket:this.client.config.bucket,key:e,resourceName:this.name,operation:"get",id:t})}const o=n.Metadata?._v||this.version,a="string"==typeof o&&o.startsWith("v")?o.slice(1):o,c=await this.getSchemaForVersion(a);let u=await c.unmapper(n.Metadata);const l=xi(this.behavior);let h="";if(n.ContentLength>0){const[t,r,i]=await K(()=>this.client.getObject(e));h=t?await Gr(i.Body):""}const{metadata:f}=await l.handleGet({resource:this,metadata:u,body:h});let d=await this.composeFullObjectFromWrite({id:t,metadata:f,body:h,behavior:this.behavior});d._contentLength=n.ContentLength,d._lastModified=n.LastModified,d._hasContent=n.ContentLength>0,d._mimeType=n.ContentType||null,d._v=a,n.VersionId&&(d._versionId=n.VersionId),n.Expiration&&(d._expiresAt=n.Expiration),d._definitionHash=this.getDefinitionHash(),a!==this.version&&(d=await this.applyVersionMapping(d,a,this.version)),this.emit("get",d);return d}async exists(t){const e=this.getResourceKey(t),[r,i]=await K(()=>this.client.headObject(e));return r}async update(t,e){if(s.isEmpty(t))throw new Error("id cannot be empty");if(!await this.exists(t))throw new Error(`Resource with id '${t}' does not exist`);const r=await this.get(t),i=s.cloneDeep(e);let n=s.cloneDeep(r);for(const[t,e]of Object.entries(i))if(t.includes(".")){let r=n;const i=t.split(".");for(let t=0;t<i.length-1;t++)"object"==typeof r[i[t]]&&null!==r[i[t]]||(r[i[t]]={}),r=r[i[t]];r[i[i.length-1]]=s.cloneDeep(e)}else"object"!=typeof e||null===e||Array.isArray(e)?n[t]=s.cloneDeep(e):n[t]=s.merge({},n[t],e);if(this.config.timestamps){const t=(new Date).toISOString();n.updatedAt=t,n.metadata||(n.metadata={}),n.metadata.updatedAt=t}const o=await this.executeHooks("beforeUpdate",s.cloneDeep(n)),a={...r,...o,id:t},{isValid:c,errors:u,data:l}=await this.validate(s.cloneDeep(a));if(!c)throw new I({bucket:this.client.config.bucket,resourceName:this.name,attributes:o,validation:u,message:"validation: "+(u&&u.length?JSON.stringify(u):"unknown")});await this.schema.mapper(l);const h=xi(this.behavior),f=await this.schema.mapper({...r,...o});f._v=String(this.version),await h.handleUpdate({resource:this,id:t,data:{...r,...o},mappedData:f,originalData:{...i,id:t}});const{id:d,...p}=l,m={...r,id:t},g={...p,id:t};await this.handlePartitionReferenceUpdates(m,g);const y=await this.schema.mapper(p);y._v=String(this.version);const b=xi(this.behavior),{mappedData:w,body:v}=await b.handleUpdate({resource:this,id:t,data:p,mappedData:y,originalData:{...i,id:t}}),O=w,_=this.getResourceKey(t);let j,x=v;if(""===v&&"body-overflow"!==this.behavior){const[t,e,r]=await K(()=>this.client.getObject(_));if(t&&r.ContentLength>0){const t=Buffer.from(await r.Body.transformToByteArray()),e=t.toString(),[i,n]=await K(()=>Promise.resolve(JSON.parse(e)));i||(x=t,j=r.ContentType)}}let R=j;if(x&&""!==x&&!R){const[t,e]=await K(()=>Promise.resolve(JSON.parse(x)));t&&(R="application/json")}this.versioningEnabled&&r._v!==this.version&&await this.createHistoricalVersion(t,r);const[D,A]=await K(()=>this.client.putObject({key:_,body:x,contentType:R,metadata:O}));if(!D&&A&&A.message&&A.message.includes("metadata headers exceed")){const e=k(O),r=S({s3Limit:2047,systemConfig:{version:this.version,timestamps:this.config.timestamps,id:t}}),i=e-r;throw A.totalSize=e,A.limit=2047,A.effectiveLimit=r,A.excess=i,this.emit("exceedsLimit",{operation:"update",totalSize:e,limit:2047,effectiveLimit:r,excess:i,data:p}),new B("metadata headers exceed",{resourceName:this.name,operation:"update",id:t,totalSize:e,effectiveLimit:r,excess:i,suggestion:"Reduce metadata size or number of fields."})}if(!D)throw T(A,{bucket:this.client.config.bucket,key:_,resourceName:this.name,operation:"update",id:t});const E=await this.composeFullObjectFromWrite({id:t,metadata:O,body:x,behavior:this.behavior}),N=await this.executeHooks("afterUpdate",E);return this.emit("update",{...E,$before:{...r},$after:{...N}}),N}async delete(t){if(s.isEmpty(t))throw new Error("id cannot be empty");let e,r=null;const[i,n,o]=await K(()=>this.get(t));i?e=o:(e={id:t},r=n),await this.executeHooks("beforeDelete",e);const a=this.getResourceKey(t),[c,u,l]=await K(()=>this.client.deleteObject(a));if(this.emit("delete",{...e,$before:{...e},$after:null}),r)throw T(r,{bucket:this.client.config.bucket,key:a,resourceName:this.name,operation:"delete",id:t});if(!c)throw T(u,{key:a,resourceName:this.name,operation:"delete",id:t});return await this.executeHooks("afterDelete",e),l}async upsert({id:t,...e}){return await this.exists(t)?this.update(t,e):this.insert({id:t,...e})}async count({partition:t=null,partitionValues:e={}}={}){let r;if(t&&Object.keys(e).length>0){const i=this.config.partitions[t];if(!i)throw new F(`Partition '${t}' not found`,{resourceName:this.name,partitionName:t,operation:"count"});const n=[],s=Object.entries(i.fields).sort(([t],[e])=>t.localeCompare(e));for(const[t,r]of s){const i=e[t];if(null!=i){const e=this.applyPartitionRule(i,r);n.push(`${t}=${e}`)}}r=n.length>0?`resource=${this.name}/partition=${t}/${n.join("/")}`:`resource=${this.name}/partition=${t}`}else r=`resource=${this.name}/data`;const i=await this.client.count({prefix:r});return this.emit("count",i),i}async insertMany(t){const{results:e}=await i.PromisePool.for(t).withConcurrency(this.parallelism).handleError(async(t,e)=>{this.emit("error",t,e),this.observers.map(r=>r.emit("error",this.name,t,e))}).process(async t=>await this.insert(t));return this.emit("insertMany",t.length),e}async deleteMany(t){const e=s.chunk(t.map(t=>this.getResourceKey(t)),1e3);t.map(t=>this.getResourceKey(t));const{results:r}=await i.PromisePool.for(e).withConcurrency(this.parallelism).handleError(async(t,e)=>{this.emit("error",t,e),this.observers.map(r=>r.emit("error",this.name,t,e))}).process(async t=>{const e=await this.client.deleteObjects(t);return t.forEach(t=>{const e=t.split("/").find(t=>t.startsWith("id=")),r=e?e.replace("id=",""):null;r&&(this.emit("deleted",r),this.observers.map(t=>t.emit("deleted",this.name,r)))}),e});return this.emit("deleteMany",t.length),r}async deleteAll(){if(!1!==this.config.paranoid)throw new B("deleteAll() is a dangerous operation and requires paranoid: false option.",{resourceName:this.name,operation:"deleteAll",paranoid:this.config.paranoid,suggestion:"Set paranoid: false to allow deleteAll."});const t=`resource=${this.name}/data`,e=await this.client.deleteAll({prefix:t});return this.emit("deleteAll",{version:this.version,prefix:t,deletedCount:e}),{deletedCount:e,version:this.version}}async deleteAllData(){if(!1!==this.config.paranoid)throw new B("deleteAllData() is a dangerous operation and requires paranoid: false option.",{resourceName:this.name,operation:"deleteAllData",paranoid:this.config.paranoid,suggestion:"Set paranoid: false to allow deleteAllData."});const t=`resource=${this.name}`,e=await this.client.deleteAll({prefix:t});return this.emit("deleteAllData",{resource:this.name,prefix:t,deletedCount:e}),{deletedCount:e,resource:this.name}}async listIds({partition:t=null,partitionValues:e={},limit:r,offset:i=0}={}){let n;if(t&&Object.keys(e).length>0){if(!this.config.partitions||!this.config.partitions[t])throw new F(`Partition '${t}' not found`,{resourceName:this.name,partitionName:t,operation:"listIds"});const r=this.config.partitions[t],i=[],s=Object.entries(r.fields).sort(([t],[e])=>t.localeCompare(e));for(const[t,r]of s){const n=e[t];if(null!=n){const e=this.applyPartitionRule(n,r);i.push(`${t}=${e}`)}}n=i.length>0?`resource=${this.name}/partition=${t}/${i.join("/")}`:`resource=${this.name}/partition=${t}`}else n=`resource=${this.name}/data`;const s=(await this.client.getKeysPage({prefix:n,offset:i,amount:r||1e3})).map(t=>{const e=t.split("/").find(t=>t.startsWith("id="));return e?e.replace("id=",""):null}).filter(Boolean);return this.emit("listIds",s.length),s}async list({partition:t=null,partitionValues:e={},limit:r,offset:i=0}={}){const[n,s,o]=await K(async()=>t?await this.listPartition({partition:t,partitionValues:e,limit:r,offset:i}):await this.listMain({limit:r,offset:i}));return n?o:this.handleListError(s,{partition:t,partitionValues:e})}async listMain({limit:t,offset:e=0}){const[r,i,n]=await K(()=>this.listIds({limit:t,offset:e}));if(!r)throw i;const s=await this.processListResults(n,"main");return this.emit("list",{count:s.length,errors:0}),s}async listPartition({partition:t,partitionValues:e,limit:r,offset:i=0}){if(!this.config.partitions?.[t])return this.emit("list",{partition:t,partitionValues:e,count:0,errors:0}),[];const n=this.config.partitions[t],s=this.buildPartitionPrefix(t,n,e),[o,a,c]=await K(()=>this.client.getAllKeys({prefix:s}));if(!o)throw a;const u=this.extractIdsFromKeys(c).slice(i),l=r?u.slice(0,r):u,h=await this.processPartitionResults(l,t,n,c);return this.emit("list",{partition:t,partitionValues:e,count:h.length,errors:0}),h}buildPartitionPrefix(t,e,r){const i=[],n=Object.entries(e.fields).sort(([t],[e])=>t.localeCompare(e));for(const[t,e]of n){const n=r[t];if(null!=n){const r=this.applyPartitionRule(n,e);i.push(`${t}=${r}`)}}return i.length>0?`resource=${this.name}/partition=${t}/${i.join("/")}`:`resource=${this.name}/partition=${t}`}extractIdsFromKeys(t){return t.map(t=>{const e=t.split("/").find(t=>t.startsWith("id="));return e?e.replace("id=",""):null}).filter(Boolean)}async processListResults(t,e="main"){const{results:r,errors:n}=await i.PromisePool.for(t).withConcurrency(this.parallelism).handleError(async(t,e)=>{this.emit("error",t,content),this.observers.map(e=>e.emit("error",this.name,t,content))}).process(async t=>{const[r,i,n]=await K(()=>this.get(t));return r?n:this.handleResourceError(i,t,e)});return this.emit("list",{count:r.length,errors:0}),r}async processPartitionResults(t,e,r,n){const s=Object.entries(r.fields).sort(([t],[e])=>t.localeCompare(e)),{results:o,errors:a}=await i.PromisePool.for(t).withConcurrency(this.parallelism).handleError(async(t,e)=>{this.emit("error",t,content),this.observers.map(e=>e.emit("error",this.name,t,content))}).process(async t=>{const[r,i,o]=await K(async()=>{const r=this.extractPartitionValuesFromKey(t,n,s);return await this.getFromPartition({id:t,partitionName:e,partitionValues:r})});return r?o:this.handleResourceError(i,t,"partition")});return o.filter(t=>null!==t)}extractPartitionValuesFromKey(t,e,r){const i=e.find(e=>e.includes(`id=${t}`));if(!i)throw new F(`Partition key not found for ID ${t}`,{resourceName:this.name,id:t,operation:"extractPartitionValuesFromKey"});const n=i.split("/"),s={};for(const[t]of r){const e=n.find(e=>e.startsWith(`${t}=`));if(e){const r=e.replace(`${t}=`,"");s[t]=r}}return s}handleResourceError(t,e,r){if(t.message.includes("Cipher job failed")||t.message.includes("OperationError"))return{id:e,_decryptionFailed:!0,_error:t.message,..."partition"===r&&{_partition:r}};throw t}handleListError(t,{partition:e,partitionValues:r}){return t.message.includes("Partition '")&&t.message.includes("' not found"),this.emit("list",{partition:e,partitionValues:r,count:0,errors:1}),[]}async getMany(t){const{results:e,errors:r}=await i.PromisePool.for(t).withConcurrency(this.client.parallelism).handleError(async(t,e)=>(this.emit("error",t,content),this.observers.map(e=>e.emit("error",this.name,t,content)),{id:e,_error:t.message,_decryptionFailed:t.message.includes("Cipher job failed")||t.message.includes("OperationError")})).process(async t=>{const[e,r,i]=await K(()=>this.get(t));if(e)return i;if(r.message.includes("Cipher job failed")||r.message.includes("OperationError"))return{id:t,_decryptionFailed:!0,_error:r.message};throw r});return this.emit("getMany",t.length),e}async getAll(){const[t,e,r]=await K(()=>this.listIds());if(!t)throw e;const i=[];for(const t of r){const[e,r,n]=await K(()=>this.get(t));e&&i.push(n)}return i}async page({offset:t=0,size:e=100,partition:r=null,partitionValues:i={},skipCount:n=!1}={}){const[s,o,a]=await K(async()=>{let s=null,o=null;if(!n){const[t,n,a]=await K(()=>this.count({partition:r,partitionValues:i}));t?(s=a,o=Math.ceil(s/e)):(s=null,o=null)}const a=Math.floor(t/e);let c=[];if(e<=0)c=[];else{const[n,s,o]=await K(()=>this.list({partition:r,partitionValues:i,limit:e,offset:t}));c=n?o:[]}const u={items:c,totalItems:s,page:a,pageSize:e,totalPages:o,hasMore:c.length===e&&t+e<(s||1/0),_debug:{requestedSize:e,requestedOffset:t,actualItemsReturned:c.length,skipCount:n,hasTotalItems:null!==s}};return this.emit("page",u),u});return s?a:{items:[],totalItems:null,page:Math.floor(t/e),pageSize:e,totalPages:null,_debug:{requestedSize:e,requestedOffset:t,actualItemsReturned:0,skipCount:n,hasTotalItems:!1,error:o.message}}}readable(){return new Jr({resource:this}).build()}writable(){return new Yr({resource:this}).build()}async setContent({id:t,buffer:e,contentType:r="application/octet-stream"}){const[i,n,s]=await K(()=>this.get(t));if(!i||!s)throw new B(`Resource with id '${t}' not found`,{resourceName:this.name,id:t,operation:"setContent"});const o={...s,_hasContent:!0,_contentLength:e.length,_mimeType:r},a=await this.schema.mapper(o),[c,u]=await K(()=>this.client.putObject({key:this.getResourceKey(t),metadata:a,body:e,contentType:r}));if(!c)throw u;return this.emit("setContent",{id:t,contentType:r,contentLength:e.length}),o}async content(t){const e=this.getResourceKey(t),[r,i,n]=await K(()=>this.client.getObject(e));if(!r){if("NoSuchKey"===i.name)return{buffer:null,contentType:null};throw i}const s=Buffer.from(await n.Body.transformToByteArray()),o=n.ContentType||null;return this.emit("content",t,s.length,o),{buffer:s,contentType:o}}async hasContent(t){const e=this.getResourceKey(t),[r,i,n]=await K(()=>this.client.headObject(e));return!!r&&n.ContentLength>0}async deleteContent(t){const e=this.getResourceKey(t),[r,i,n]=await K(()=>this.client.headObject(e));if(!r)throw i;const s=n.Metadata||{},[o,a,c]=await K(()=>this.client.putObject({key:e,body:"",metadata:s}));if(!o)throw a;return this.emit("deleteContent",t),c}getDefinitionHash(){const t={attributes:this.attributes,behavior:this.behavior},e=a(t);return`sha256:${o.createHash("sha256").update(e).digest("hex")}`}extractVersionFromKey(t){const e=t.split("/").find(t=>t.startsWith("v="));return e?e.replace("v=",""):null}async getSchemaForVersion(t){if(t===this.version)return this.schema;const[e,r,i]=await K(()=>Promise.resolve(new ui({name:this.name,attributes:this.attributes,passphrase:this.passphrase,version:t,options:{...this.config,autoDecrypt:!0,autoEncrypt:!0}})));return e?i:this.schema}async createPartitionReferences(t){const e=this.config.partitions;if(e&&0!==Object.keys(e).length)for(const[r,i]of Object.entries(e)){const e=this.getPartitionKey({partitionName:r,id:t.id,data:t});if(e){const t={_v:String(this.version)};await this.client.putObject({key:e,metadata:t,body:"",contentType:void 0})}}}async deletePartitionReferences(t){const e=this.config.partitions;if(!e||0===Object.keys(e).length)return;const r=[];for(const[i,n]of Object.entries(e)){const e=this.getPartitionKey({partitionName:i,id:t.id,data:t});e&&r.push(e)}if(r.length>0){const[t,e]=await K(()=>this.client.deleteObjects(r))}}async query(t={},{limit:e=100,offset:r=0,partition:i=null,partitionValues:n={}}={}){if(0===Object.keys(t).length)return await this.list({partition:i,partitionValues:n,limit:e,offset:r});const s=[];let o=r;const a=Math.min(e,50);for(;s.length<e;){const e=await this.list({partition:i,partitionValues:n,limit:a,offset:o});if(0===e.length)break;const r=e.filter(e=>Object.entries(t).every(([t,r])=>e[t]===r));if(s.push(...r),o+=a,e.length<a)break}return s.slice(0,e)}async handlePartitionReferenceUpdates(t,e){const r=this.config.partitions;if(!r||0===Object.keys(r).length)return;for(const[i,n]of Object.entries(r)){const[r,s]=await K(()=>this.handlePartitionReferenceUpdate(i,n,t,e))}const i=e.id||t.id;for(const[t,n]of Object.entries(r)){const r=`resource=${this.name}/partition=${t}`;let n=[];const[s,o,a]=await K(()=>this.client.getAllKeys({prefix:r}));if(!s)continue;n=a;const c=this.getPartitionKey({partitionName:t,id:i,data:e});for(const t of n)if(t.endsWith(`/id=${i}`)&&t!==c){const[e,r]=await K(()=>this.client.deleteObject(t))}}}async handlePartitionReferenceUpdate(t,e,r,i){const n=i.id||r.id,s=this.getPartitionKey({partitionName:t,id:n,data:r}),o=this.getPartitionKey({partitionName:t,id:n,data:i});if(s!==o){if(s){const[t,e]=await K(async()=>{await this.client.deleteObject(s)})}if(o){const[t,e]=await K(async()=>{const t={_v:String(this.version)};await this.client.putObject({key:o,metadata:t,body:"",contentType:void 0})})}}else if(o){const[t,e]=await K(async()=>{const t={_v:String(this.version)};await this.client.putObject({key:o,metadata:t,body:"",contentType:void 0})})}}async updatePartitionReferences(t){const e=this.config.partitions;if(e&&0!==Object.keys(e).length)for(const[r,i]of Object.entries(e)){if(!i||!i.fields||"object"!=typeof i.fields)continue;const e=this.getPartitionKey({partitionName:r,id:t.id,data:t});if(e){const t={_v:String(this.version)},[r,i]=await K(async()=>{await this.client.putObject({key:e,metadata:t,body:"",contentType:void 0})})}}}async getFromPartition({id:t,partitionName:e,partitionValues:r={}}){if(!this.config.partitions||!this.config.partitions[e])throw new F(`Partition '${e}' not found`,{resourceName:this.name,partitionName:e,operation:"getFromPartition"});const i=this.config.partitions[e],n=[],s=Object.entries(i.fields).sort(([t],[e])=>t.localeCompare(e));for(const[t,e]of s){const i=r[t];if(null!=i){const r=this.applyPartitionRule(i,e);n.push(`${t}=${r}`)}}if(0===n.length)throw new F(`No partition values provided for partition '${e}'`,{resourceName:this.name,partitionName:e,operation:"getFromPartition"});const o=mt(`resource=${this.name}`,`partition=${e}`,...n,`id=${t}`),[a,c]=await K(async()=>{await this.client.headObject(o)});if(!a)throw new B(`Resource with id '${t}' not found in partition '${e}'`,{resourceName:this.name,id:t,partitionName:e,operation:"getFromPartition"});const u=await this.get(t);return u._partition=e,u._partitionValues=r,this.emit("getFromPartition",u),u}async createHistoricalVersion(t,e){const r=mt(`resource=${this.name}`,"historical",`id=${t}`),i={...e,_v:e._v||this.version,_historicalTimestamp:(new Date).toISOString()},n=await this.schema.mapper(i),s=xi(this.behavior),{mappedData:o,body:a}=await s.handleInsert({resource:this,data:i,mappedData:n}),c={...o,_v:e._v||this.version,_historicalTimestamp:i._historicalTimestamp};let u;if(a&&""!==a){const[t,e]=await K(()=>Promise.resolve(JSON.parse(a)));t&&(u="application/json")}await this.client.putObject({key:r,metadata:c,body:a,contentType:u})}async applyVersionMapping(t,e,r){if(e===r)return t;return{...t,_v:r,_originalVersion:e,_versionMapped:!0}}async composeFullObjectFromWrite({id:t,metadata:e,body:r,behavior:i}){const n={};e&&"true"===e.$truncated&&(n.$truncated="true"),e&&"true"===e.$overflow&&(n.$overflow="true");let s={};const[o,a,c]=await K(()=>this.schema.unmapper(e));s=o?c:e;const u=t=>{if(!t||"object"!=typeof t)return t;const e={};for(const[r,i]of Object.entries(t))r.startsWith("_")||(e[r]=i);return e},l=t=>{if("object"==typeof t&&null!==t)return t;if("string"==typeof t){if("[object Object]"===t)return{};if(t.startsWith("{")||t.startsWith("[")){const[e,r,i]=z(()=>JSON.parse(t));return e?i:t}return t}return t};if("body-overflow"===i){const i=e&&"true"===e.$overflow;let n={};if(i&&r){const[t,e,i]=await K(()=>Promise.resolve(JSON.parse(r)));if(t){const[t,e,r]=await K(()=>this.schema.unmapper(i));n=t?r:{}}}const o={...s,...n,id:t};Object.keys(o).forEach(t=>{o[t]=l(o[t])});const a=u(o);return i&&(a.$overflow="true"),a}if("body-only"===i){const[i,n,s]=await K(()=>Promise.resolve(r?JSON.parse(r):{}));let o=this.schema.map;if(e&&e._map){const[t,r,i]=await K(()=>Promise.resolve("string"==typeof e._map?JSON.parse(e._map):e._map));o=t?i:this.schema.map}const[a,c,u]=await K(()=>this.schema.unmapper(s,o)),h=a?{...u,id:t}:{id:t};return Object.keys(h).forEach(t=>{h[t]=l(h[t])}),h}const h={...s,id:t};Object.keys(h).forEach(t=>{h[t]=l(h[t])});const f=u(h);return n.$truncated&&(f.$truncated=n.$truncated),n.$overflow&&(f.$overflow=n.$overflow),f}emit(t,...e){return super.emit(t,...e)}async replace(t,e){await this.delete(t),await new Promise(t=>setTimeout(t,100));const r=Date.now();for(;Date.now()-r<5e3;){if(!await this.exists(t))break;await new Promise(t=>setTimeout(t,50))}try{return await this.insert({...e,id:t})}catch(r){if(r&&r.message&&r.message.includes("already exists")){return await this.update(t,e)}throw r}}_initMiddleware(){this._middlewares=new Map,this._middlewareMethods=["get","list","listIds","getAll","count","page","insert","update","delete","deleteMany","exists","getMany"];for(const t of this._middlewareMethods)this._middlewares.set(t,[]),this[`_original_${t}`]||(this[`_original_${t}`]=this[t].bind(this),this[t]=async(...e)=>{const r={resource:this,args:e,method:t};let i=-1;const n=this._middlewares.get(t),s=async e=>{if(e<=i)throw new Error("next() called multiple times");return i=e,e<n.length?await n[e](r,()=>s(e+1)):await this[`_original_${t}`](...r.args)};return await s(0)})}useMiddleware(t,e){if(this._middlewares||this._initMiddleware(),!this._middlewares.has(t))throw new B(`No such method for middleware: ${t}`,{operation:"useMiddleware",method:t});this._middlewares.get(t).push(e)}applyDefaults(t){const e={...t};for(const[t,r]of Object.entries(this.attributes))if(void 0===e[t]&&"string"==typeof r&&r.includes("default:")){const i=r.match(/default:([^|]+)/);if(i){let n=i[1];r.includes("boolean")?n="true"===n:r.includes("number")&&(n=Number(n)),e[t]=n}}return e}}var Ei=Ai;class Ni extends et{constructor(t){super(),this.version="1",this.s3dbVersion=(()=>{const[t,e,r]=K(()=>"7.2.1");return t?r:"latest"})(),this.resources={},this.savedMetadata=null,this.options=t,this.verbose=t.verbose||!1,this.parallelism=parseInt(t.parallelism+"")||10,this.plugins=t.plugins||[],this.pluginList=t.plugins||[],this.cache=t.cache,this.passphrase=t.passphrase||"secret",this.versioningEnabled=t.versioningEnabled||!1;let e=t.connectionString;if(!e&&(t.bucket||t.accessKeyId||t.secretAccessKey)){const{bucket:r,region:i,accessKeyId:n,secretAccessKey:s,endpoint:o,forcePathStyle:a}=t;if(o){const t=new URL(o);n&&(t.username=encodeURIComponent(n)),s&&(t.password=encodeURIComponent(s)),t.pathname=`/${r||"s3db"}`,a&&t.searchParams.set("forcePathStyle","true"),e=t.toString()}else if(n&&s){const t=new URLSearchParams;t.set("region",i||"us-east-1"),a&&t.set("forcePathStyle","true"),e=`s3://${encodeURIComponent(n)}:${encodeURIComponent(s)}@${r||"s3db"}?${t.toString()}`}}this.client=t.client||new ri({verbose:this.verbose,parallelism:this.parallelism,connectionString:e}),this.bucket=this.client.bucket,this.keyPrefix=this.client.keyPrefix,this._exitListenerRegistered||(this._exitListenerRegistered=!0,process.on("exit",async()=>{if(this.isConnected())try{await this.disconnect()}catch(t){}}))}async connect(){await this.startPlugins();let t=null;if(await this.client.exists("s3db.json")){const e=await this.client.getObject("s3db.json");t=JSON.parse(await Gr(e?.Body))}else t=this.blankMetadataStructure(),await this.uploadMetadataFile();this.savedMetadata=t;const e=this.detectDefinitionChanges(t);for(const[e,r]of Object.entries(t.resources||{})){const t=r.currentVersion||"v0",i=r.versions?.[t];i&&(this.resources[e]=new Ei({name:e,client:this.client,database:this,version:t,attributes:i.attributes,behavior:i.behavior||"user-managed",parallelism:this.parallelism,passphrase:this.passphrase,observers:[this],cache:this.cache,timestamps:void 0!==i.timestamps&&i.timestamps,partitions:r.partitions||i.partitions||{},paranoid:void 0===i.paranoid||i.paranoid,allNestedObjectsOptional:void 0===i.allNestedObjectsOptional||i.allNestedObjectsOptional,autoDecrypt:void 0===i.autoDecrypt||i.autoDecrypt,hooks:i.hooks||{},versioningEnabled:this.versioningEnabled,map:i.map}))}e.length>0&&this.emit("resourceDefinitionsChanged",{changes:e,metadata:this.savedMetadata}),this.emit("connected",new Date)}detectDefinitionChanges(t){const e=[];for(const[r,i]of Object.entries(this.resources)){const n=this.generateDefinitionHash(i.export()),s=t.resources?.[r];if(s){const t=s.currentVersion||"v0",i=s.versions?.[t],o=i?.hash;o!==n&&e.push({type:"changed",resourceName:r,currentHash:n,savedHash:o,fromVersion:t,toVersion:this.getNextVersion(s.versions)})}else e.push({type:"new",resourceName:r,currentHash:n,savedHash:null})}for(const[r,i]of Object.entries(t.resources||{}))if(!this.resources[r]){const t=i.currentVersion||"v0",n=i.versions?.[t];e.push({type:"deleted",resourceName:r,currentHash:null,savedHash:n?.hash,deletedVersion:t})}return e}generateDefinitionHash(t,e=void 0){const r={...t.attributes};t.timestamps&&(delete r.createdAt,delete r.updatedAt);const i={attributes:r,behavior:e||t.behavior||"user-managed",partitions:t.partitions||{}},n=a(i);return`sha256:${o.createHash("sha256").update(n).digest("hex")}`}getNextVersion(t={}){const e=Object.keys(t).filter(t=>t.startsWith("v")).map(t=>parseInt(t.substring(1))).filter(t=>!isNaN(t));return`v${(e.length>0?Math.max(...e):-1)+1}`}async startPlugins(){const t=this;if(!s.isEmpty(this.pluginList)){const e=this.pluginList.map(t=>s.isFunction(t)?new t(this):t),r=e.map(async e=>{e.beforeSetup&&await e.beforeSetup(),await e.setup(t),e.afterSetup&&await e.afterSetup()});await Promise.all(r);const i=e.map(async t=>{t.beforeStart&&await t.beforeStart(),await t.start(),t.afterStart&&await t.afterStart()});await Promise.all(i)}}async usePlugin(t,e=null){const r=e||t.constructor.name.replace("Plugin","").toLowerCase();return this.plugins[r]=t,this.isConnected()&&(await t.setup(this),await t.start()),t}async uploadMetadataFile(){const t={version:this.version,s3dbVersion:this.s3dbVersion,lastUpdated:(new Date).toISOString(),resources:{}};Object.entries(this.resources).forEach(([e,r])=>{const i=r.export(),n=this.generateDefinitionHash(i),s=this.savedMetadata?.resources?.[e],o=s?.currentVersion||"v0",a=s?.versions?.[o];let c,u;a&&a.hash===n?(c=o,u=!1):(c=this.getNextVersion(s?.versions),u=!0),t.resources[e]={currentVersion:c,partitions:r.config.partitions||{},versions:{...s?.versions,[c]:{hash:n,attributes:i.attributes,behavior:i.behavior||"user-managed",timestamps:r.config.timestamps,partitions:r.config.partitions,paranoid:r.config.paranoid,allNestedObjectsOptional:r.config.allNestedObjectsOptional,autoDecrypt:r.config.autoDecrypt,cache:r.config.cache,hooks:r.config.hooks,createdAt:u?(new Date).toISOString():a?.createdAt}}},r.version!==c&&(r.version=c,r.emit("versionUpdated",{oldVersion:o,newVersion:c}))}),await this.client.putObject({key:"s3db.json",body:JSON.stringify(t,null,2),contentType:"application/json"}),this.savedMetadata=t,this.emit("metadataUploaded",t)}blankMetadataStructure(){return{version:"1",s3dbVersion:this.s3dbVersion,resources:{}}}resourceExists(t){return!!this.resources[t]}resourceExistsWithSameHash({name:t,attributes:e,behavior:r="user-managed",partitions:i={},options:n={}}){if(!this.resources[t])return{exists:!1,sameHash:!1,hash:null};const s=this.resources[t],o=this.generateDefinitionHash(s.export()),a=new Ei({name:t,attributes:e,behavior:r,partitions:i,client:this.client,version:s.version,passphrase:this.passphrase,versioningEnabled:this.versioningEnabled,...n}),c=this.generateDefinitionHash(a.export());return{exists:!0,sameHash:o===c,hash:c,existingHash:o}}async createResource({name:t,attributes:e,behavior:r="user-managed",hooks:i,...n}){if(this.resources[t]){const s=this.resources[t];if(Object.assign(s.config,{cache:this.cache,...n}),r&&(s.behavior=r),s.versioningEnabled=this.versioningEnabled,s.updateAttributes(e),i)for(const[t,e]of Object.entries(i))if(Array.isArray(e)&&s.hooks[t])for(const r of e)"function"==typeof r&&s.hooks[t].push(r.bind(s));const o=this.generateDefinitionHash(s.export(),s.behavior),a=this.savedMetadata?.resources?.[t],c=a?.currentVersion||"v0",u=a?.versions?.[c];return u&&u.hash===o||await this.uploadMetadataFile(),this.emit("s3db.resourceUpdated",t),s}const s=this.savedMetadata?.resources?.[t],o=s?.currentVersion||"v0",a=new Ei({name:t,client:this.client,version:void 0!==n.version?n.version:o,attributes:e,behavior:r,parallelism:this.parallelism,passphrase:void 0!==n.passphrase?n.passphrase:this.passphrase,observers:[this],cache:void 0!==n.cache?n.cache:this.cache,timestamps:void 0!==n.timestamps&&n.timestamps,partitions:n.partitions||{},paranoid:void 0===n.paranoid||n.paranoid,allNestedObjectsOptional:void 0===n.allNestedObjectsOptional||n.allNestedObjectsOptional,autoDecrypt:void 0===n.autoDecrypt||n.autoDecrypt,hooks:i||{},versioningEnabled:this.versioningEnabled,map:n.map,idGenerator:n.idGenerator,idSize:n.idSize});return a.database=this,this.resources[t]=a,await this.uploadMetadataFile(),this.emit("s3db.resourceCreated",t),a}resource(t){return this.resources[t]?this.resources[t]:Promise.reject(`resource ${t} does not exist`)}async listResources(){return Object.keys(this.resources).map(t=>({name:t}))}async getResource(t){if(!this.resources[t])throw new D({bucket:this.client.config.bucket,resourceName:t,id:t});return this.resources[t]}get config(){return{version:this.version,s3dbVersion:this.s3dbVersion,bucket:this.bucket,keyPrefix:this.keyPrefix,parallelism:this.parallelism,verbose:this.verbose}}isConnected(){return!!this.savedMetadata}async disconnect(){try{if(this.pluginList&&this.pluginList.length>0){for(const t of this.pluginList)t&&"function"==typeof t.removeAllListeners&&t.removeAllListeners();const t=this.pluginList.map(async t=>{try{t&&"function"==typeof t.stop&&await t.stop()}catch(t){}});await Promise.all(t)}if(this.resources&&Object.keys(this.resources).length>0){for(const[t,e]of Object.entries(this.resources))try{e&&"function"==typeof e.removeAllListeners&&e.removeAllListeners(),e._pluginWrappers&&e._pluginWrappers.clear(),e._pluginMiddlewares&&(e._pluginMiddlewares={}),e.observers&&Array.isArray(e.observers)&&(e.observers=[])}catch(t){}Object.keys(this.resources).forEach(t=>delete this.resources[t])}this.client&&"function"==typeof this.client.removeAllListeners&&this.client.removeAllListeners(),this.removeAllListeners(),this.savedMetadata=null,this.plugins={},this.pluginList=[],this.emit("disconnected",new Date)}catch(t){}}}function Pi(t){return"string"==typeof t?t.trim().toLowerCase():t}return t.AVAILABLE_BEHAVIORS=Ri,t.AuditPlugin=class extends at{constructor(t={}){super(t),this.auditResource=null,this.config={includeData:!1!==t.includeData,includePartitions:!1!==t.includePartitions,maxDataSize:t.maxDataSize||1e4,...t}}async onSetup(){const[t,e,r]=await K(()=>this.database.createResource({name:"audits",attributes:{id:"string|required",resourceName:"string|required",operation:"string|required",recordId:"string|required",userId:"string|optional",timestamp:"string|required",oldData:"string|optional",newData:"string|optional",partition:"string|optional",partitionValues:"string|optional",metadata:"string|optional"},behavior:"body-overflow"}));this.auditResource=t?r:this.database.resources.audits||null,(t||this.auditResource)&&(this.installDatabaseProxy(),this.installEventListeners())}async onStart(){}async onStop(){}installDatabaseProxy(){if(this.database._auditProxyInstalled)return;const t=this.installEventListenersForResource.bind(this);this.database._originalCreateResource=this.database.createResource,this.database.createResource=async function(...e){const r=await this._originalCreateResource(...e);return"audits"!==r.name&&t(r),r},this.database._auditProxyInstalled=!0}installEventListeners(){for(const t of Object.values(this.database.resources))"audits"!==t.name&&this.installEventListenersForResource(t)}installEventListenersForResource(t){t.on("insert",async e=>{const r=e.id||"auto-generated",i=this.config.includePartitions?this.getPartitionValues(e,t):null,n={id:`audit-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,resourceName:t.name,operation:"insert",recordId:r,userId:this.getCurrentUserId?.()||"system",timestamp:(new Date).toISOString(),oldData:null,newData:!1===this.config.includeData?null:JSON.stringify(this.truncateData(e)),partition:this.config.includePartitions?this.getPrimaryPartition(i):null,partitionValues:this.config.includePartitions&&i&&Object.keys(i).length>0?JSON.stringify(i):null,metadata:JSON.stringify({source:"audit-plugin",version:"2.0"})};this.logAudit(n).catch(console.error)}),t.on("update",async e=>{const r=e.id;let i=e.$before;if(this.config.includeData&&!i){const[e,n,s]=await K(()=>t.get(r));e&&(i=s)}const n=this.config.includePartitions?this.getPartitionValues(e,t):null,s={id:`audit-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,resourceName:t.name,operation:"update",recordId:r,userId:this.getCurrentUserId?.()||"system",timestamp:(new Date).toISOString(),oldData:i&&!1===this.config.includeData?null:i?JSON.stringify(this.truncateData(i)):null,newData:!1===this.config.includeData?null:JSON.stringify(this.truncateData(e)),partition:this.config.includePartitions?this.getPrimaryPartition(n):null,partitionValues:this.config.includePartitions&&n&&Object.keys(n).length>0?JSON.stringify(n):null,metadata:JSON.stringify({source:"audit-plugin",version:"2.0"})};this.logAudit(s).catch(console.error)}),t.on("delete",async e=>{const r=e.id;let i=e;if(this.config.includeData&&!i){const[e,n,s]=await K(()=>t.get(r));e&&(i=s)}const n=i&&this.config.includePartitions?this.getPartitionValues(i,t):null,s={id:`audit-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,resourceName:t.name,operation:"delete",recordId:r,userId:this.getCurrentUserId?.()||"system",timestamp:(new Date).toISOString(),oldData:i&&!1===this.config.includeData?null:i?JSON.stringify(this.truncateData(i)):null,newData:null,partition:this.config.includePartitions?this.getPrimaryPartition(n):null,partitionValues:this.config.includePartitions&&n&&Object.keys(n).length>0?JSON.stringify(n):null,metadata:JSON.stringify({source:"audit-plugin",version:"2.0"})};this.logAudit(s).catch(console.error)}),t.useMiddleware("deleteMany",async(e,r)=>{const i=e.args[0],n={};if(this.config.includeData)for(const e of i){const[r,i,s]=await K(()=>t.get(e));n[e]=r?s:null}const s=await r();if(s&&s.length>0&&this.config.includeData)for(const e of i){const r=n[e],i=r&&this.config.includePartitions?this.getPartitionValues(r,t):null,s={id:`audit-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,resourceName:t.name,operation:"delete",recordId:e,userId:this.getCurrentUserId?.()||"system",timestamp:(new Date).toISOString(),oldData:!1===this.config.includeData?null:JSON.stringify(this.truncateData(r)),newData:null,partition:this.config.includePartitions?this.getPrimaryPartition(i):null,partitionValues:this.config.includePartitions&&i&&Object.keys(i).length>0?JSON.stringify(i):null,metadata:JSON.stringify({source:"audit-plugin",version:"2.0",batchOperation:!0})};this.logAudit(s).catch(console.error)}return s})}getPartitionValues(t,e){if(!t)return null;const r=e.config?.partitions||{},i={};for(const[e,n]of Object.entries(r))if(n.fields){const r={};for(const[e,i]of Object.entries(n.fields)){const i=this.getNestedFieldValue(t,e);null!=i&&(r[e]=i)}Object.keys(r).length>0&&(i[e]=r)}return i}getNestedFieldValue(t,e){if(!e.includes("."))return t[e];const r=e.split(".");let i=t;for(const t of r){if(!i||"object"!=typeof i||!(t in i))return;i=i[t]}return i}getPrimaryPartition(t){if(!t)return null;const e=Object.keys(t);return e.length>0?e[0]:null}async logAudit(t){t.id||(t.id=`audit-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);return await this.auditResource.insert(t)}truncateData(t){if(!t)return t;const e={};for(const[r,i]of Object.entries(t))r.startsWith("_")||"$overflow"===r||(e[r]=i);const r=JSON.stringify(e);if(r.length<=this.config.maxDataSize)return e;let i={...e},n=JSON.stringify(i).length;const s=JSON.stringify({_truncated:!0,_originalSize:r.length,_truncatedAt:(new Date).toISOString()}).length,o=this.config.maxDataSize-s;for(const[t,e]of Object.entries(i))if("string"==typeof e&&n>o){const r=n-o,s=Math.max(0,e.length-r-3);s<e.length&&(i[t]=e.substring(0,s)+"...",n=JSON.stringify(i).length)}return{...i,_truncated:!0,_originalSize:r.length,_truncatedAt:(new Date).toISOString()}}async getAuditLogs(t={}){if(!this.auditResource)return[];const[e,r,i]=await K(async()=>{const{resourceName:e,operation:r,recordId:i,userId:n,partition:s,startDate:o,endDate:a,limit:c=100,offset:u=0}=t;let l=(await this.auditResource.getAll()).filter(t=>(!e||t.resourceName===e)&&((!r||t.operation===r)&&((!i||t.recordId===i)&&((!n||t.userId===n)&&((!s||t.partition===s)&&(!(o&&new Date(t.timestamp)<new Date(o))&&!(a&&new Date(t.timestamp)>new Date(a))))))));l.sort((t,e)=>new Date(e.timestamp)-new Date(t.timestamp));return l.slice(u,u+c).map(t=>{const[e,,r]="string"==typeof t.oldData?z(()=>JSON.parse(t.oldData)):[!0,null,t.oldData],[i,,n]="string"==typeof t.newData?z(()=>JSON.parse(t.newData)):[!0,null,t.newData],[s,,o]=t.partitionValues&&"string"==typeof t.partitionValues?z(()=>JSON.parse(t.partitionValues)):[!0,null,t.partitionValues],[a,,c]=t.metadata&&"string"==typeof t.metadata?z(()=>JSON.parse(t.metadata)):[!0,null,t.metadata];return{...t,oldData:null===t.oldData||void 0===t.oldData||"null"===t.oldData?null:e?r:null,newData:null===t.newData||void 0===t.newData||"null"===t.newData?null:i?n:null,partitionValues:s?o:t.partitionValues,metadata:a?c:t.metadata}})});return e?i:[]}async getRecordHistory(t,e){return this.getAuditLogs({resourceName:t,recordId:e,limit:1e3})}async getPartitionHistory(t,e,r){return this.getAuditLogs({resourceName:t,partition:e,limit:1e3})}async getAuditStats(t={}){const{resourceName:e,startDate:r,endDate:i}=t,n=await this.getAuditLogs({resourceName:e,startDate:r,endDate:i,limit:1e4}),s={total:n.length,byOperation:{},byResource:{},byPartition:{},byUser:{},timeline:{}};for(const t of n)if(s.byOperation[t.operation]=(s.byOperation[t.operation]||0)+1,s.byResource[t.resourceName]=(s.byResource[t.resourceName]||0)+1,t.partition&&(s.byPartition[t.partition]=(s.byPartition[t.partition]||0)+1),s.byUser[t.userId]=(s.byUser[t.userId]||0)+1,t.timestamp){const e=t.timestamp.split("T")[0];s.timeline[e]=(s.timeline[e]||0)+1}return s}},t.AuthenticationError=class extends j{constructor(t,e={}){super(t,e),Object.assign(this,e)}},t.BaseError=_,t.CachePlugin=class extends at{constructor(t={}){super(t),this.driver=t.driver,this.config={includePartitions:!1!==t.includePartitions,...t}}async setup(t){await super.setup(t)}async onSetup(){this.config.driver?this.driver=this.config.driver:"memory"===this.config.driverType?this.driver=new Qr(this.config.memoryOptions||{}):this.driver=new Zr({client:this.database.client,...this.config.s3Options||{}}),this.installDatabaseProxy(),this.installResourceHooks()}async onStart(){}async onStop(){}installDatabaseProxy(){if(this.database._cacheProxyInstalled)return;const t=this.installResourceHooks.bind(this);this.database._originalCreateResourceForCache=this.database.createResource,this.database.createResource=async function(...e){const r=await this._originalCreateResourceForCache(...e);return t(r),r},this.database._cacheProxyInstalled=!0}installResourceHooks(){for(const t of Object.values(this.database.resources))this.installResourceHooksForResource(t)}installResourceHooksForResource(t){if(!this.driver)return;Object.defineProperty(t,"cache",{value:this.driver,writable:!0,configurable:!0,enumerable:!1}),t.cacheKeyFor=async(e={})=>{const{action:r,params:i={},partition:n,partitionValues:s}=e;return this.generateCacheKey(t,r,i,n,s)};const e=["count","listIds","getMany","getAll","page","list","get"];for(const r of e)t.useMiddleware(r,async(e,i)=>{let n;if("getMany"===r)n=await t.cacheKeyFor({action:r,params:{ids:e.args[0]}});else if("page"===r){const{offset:i,size:s,partition:o,partitionValues:a}=e.args[0]||{};n=await t.cacheKeyFor({action:r,params:{offset:i,size:s},partition:o,partitionValues:a})}else if("list"===r||"listIds"===r||"count"===r){const{partition:i,partitionValues:s}=e.args[0]||{};n=await t.cacheKeyFor({action:r,partition:i,partitionValues:s})}else"getAll"===r?n=await t.cacheKeyFor({action:r}):"get"===r&&(n=await t.cacheKeyFor({action:r,params:{id:e.args[0]}}));const[s,o,a]=await K(()=>t.cache.get(n));if(s&&null!=a)return a;if(!s&&"NoSuchKey"!==o.name)throw o;const c=await i();return await t.cache.set(n,c),c});const r=["insert","update","delete","deleteMany"];for(const e of r)t.useMiddleware(e,async(r,i)=>{const n=await i();if("insert"===e)await this.clearCacheForResource(t,r.args[0]);else if("update"===e)await this.clearCacheForResource(t,{id:r.args[0],...r.args[1]});else if("delete"===e){let e={id:r.args[0]};if("function"==typeof t.get){const[i,n,s]=await K(()=>t.get(r.args[0]));i&&s&&(e=s)}await this.clearCacheForResource(t,e)}else"deleteMany"===e&&await this.clearCacheForResource(t);return n})}async clearCacheForResource(t,e){if(!t.cache)return;const r=`resource=${t.name}`;if(await t.cache.clear(r),!0===this.config.includePartitions&&t.config?.partitions&&Object.keys(t.config.partitions).length>0)if(e){const i=this.getPartitionValues(e,t);for(const[e,n]of Object.entries(i))if(n&&Object.keys(n).length>0&&Object.values(n).some(t=>null!=t)){const i=mt(r,`partition=${e}`);await t.cache.clear(i)}}else for(const e of Object.keys(t.config.partitions)){const i=mt(r,`partition=${e}`);await t.cache.clear(i)}}async generateCacheKey(t,e,r={},i=null,n=null){const s=[`resource=${t.name}`,`action=${e}`];if(i&&n&&Object.keys(n).length>0){s.push(`partition:${i}`);for(const[t,e]of Object.entries(n))null!=e&&s.push(`${t}:${e}`)}if(Object.keys(r).length>0){const t=await this.hashParams(r);s.push(t)}return mt(...s)+".json.gz"}async hashParams(t){const e=Object.keys(t).sort().map(e=>`${e}:${t[e]}`).join("|")||"empty";return await q(e)}async getCacheStats(){return this.driver?{size:await this.driver.size(),keys:await this.driver.keys(),driver:this.driver.constructor.name}:null}async clearAllCache(){if(this.driver)for(const t of Object.values(this.database.resources))if(t.cache){const e=`resource=${t.name}`;await t.cache.clear(e)}}async warmCache(t,e={}){const r=this.database.resources[t];if(!r)throw new Error(`Resource '${t}' not found`);const{includePartitions:i=!0}=e;if(await r.getAll(),i&&r.config.partitions)for(const[t,e]of Object.entries(r.config.partitions))if(e.fields){const e=await r.getAll(),i=Array.isArray(e)?e:[],n=new Set;for(const e of i.slice(0,10)){const i=this.getPartitionValues(e,r);i[t]&&n.add(JSON.stringify(i[t]))}for(const e of n){const i=JSON.parse(e);await r.list({partition:t,partitionValues:i})}}}},t.Client=ei,t.ConnectionString=ti,t.ConnectionStringError=L,t.CostsPlugin=Xr,t.CryptoError=$,t.DEFAULT_BEHAVIOR=Di,t.Database=Ni,t.DatabaseError=class extends j{constructor(t,e={}){super(t,e),Object.assign(this,e)}},t.EncryptionError=class extends j{constructor(t,e={}){super(t,e),Object.assign(this,e)}},t.ErrorMap=M,t.FullTextPlugin=class extends at{constructor(t={}){super(),this.indexResource=null,this.config={minWordLength:t.minWordLength||3,maxResults:t.maxResults||100,...t},this.indexes=new Map}async setup(t){this.database=t;const[e,r,i]=await K(()=>t.createResource({name:"fulltext_indexes",attributes:{id:"string|required",resourceName:"string|required",fieldName:"string|required",word:"string|required",recordIds:"json|required",count:"number|required",lastUpdated:"string|required"}}));this.indexResource=e?i:t.resources.fulltext_indexes,await this.loadIndexes(),this.installIndexingHooks()}async start(){}async stop(){await this.saveIndexes()}async loadIndexes(){if(!this.indexResource)return;const[t,e,r]=await K(()=>this.indexResource.getAll());if(t)for(const t of r){const e=`${t.resourceName}:${t.fieldName}:${t.word}`;this.indexes.set(e,{recordIds:t.recordIds||[],count:t.count||0})}}async saveIndexes(){if(!this.indexResource)return;const[t,e]=await K(async()=>{const t=await this.indexResource.getAll();for(const e of t)await this.indexResource.delete(e.id);for(const[t,e]of this.indexes.entries()){const[r,i,n]=t.split(":");await this.indexResource.insert({id:`index-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,resourceName:r,fieldName:i,word:n,recordIds:e.recordIds,count:e.count,lastUpdated:(new Date).toISOString()})}})}installIndexingHooks(){this.database.plugins||(this.database.plugins={}),this.database.plugins.fulltext=this;for(const t of Object.values(this.database.resources))"fulltext_indexes"!==t.name&&this.installResourceHooks(t);this.database._fulltextProxyInstalled||(this.database._previousCreateResourceForFullText=this.database.createResource,this.database.createResource=async function(...t){const e=await this._previousCreateResourceForFullText(...t);return this.plugins?.fulltext&&"fulltext_indexes"!==e.name&&this.plugins.fulltext.installResourceHooks(e),e},this.database._fulltextProxyInstalled=!0);for(const t of Object.values(this.database.resources))"fulltext_indexes"!==t.name&&this.installResourceHooks(t)}installResourceHooks(t){t._insert=t.insert,t._update=t.update,t._delete=t.delete,t._deleteMany=t.deleteMany,this.wrapResourceMethod(t,"insert",async(e,r,i)=>{const[n]=r;return this.indexRecord(t.name,e.id,n).catch(console.error),e}),this.wrapResourceMethod(t,"update",async(e,r,i)=>{const[n,s]=r;return this.removeRecordFromIndex(t.name,n).catch(console.error),this.indexRecord(t.name,n,e).catch(console.error),e}),this.wrapResourceMethod(t,"delete",async(e,r,i)=>{const[n]=r;return this.removeRecordFromIndex(t.name,n).catch(console.error),e}),this.wrapResourceMethod(t,"deleteMany",async(e,r,i)=>{const[n]=r;for(const e of n)this.removeRecordFromIndex(t.name,e).catch(console.error);return e})}async indexRecord(t,e,r){const i=this.getIndexedFields(t);if(i&&0!==i.length)for(const n of i){const i=this.getFieldValue(r,n);if(!i)continue;const s=this.tokenize(i);for(const r of s){if(r.length<this.config.minWordLength)continue;const i=`${t}:${n}:${r.toLowerCase()}`,s=this.indexes.get(i)||{recordIds:[],count:0};s.recordIds.includes(e)||(s.recordIds.push(e),s.count=s.recordIds.length),this.indexes.set(i,s)}}}async removeRecordFromIndex(t,e){for(const[r,i]of this.indexes.entries())if(r.startsWith(`${t}:`)){const t=i.recordIds.indexOf(e);t>-1&&(i.recordIds.splice(t,1),i.count=i.recordIds.length,0===i.recordIds.length?this.indexes.delete(r):this.indexes.set(r,i))}}getFieldValue(t,e){if(!e.includes("."))return t&&void 0!==t[e]?t[e]:null;const r=e.split(".");let i=t;for(const t of r){if(!i||"object"!=typeof i||!(t in i))return null;i=i[t]}return i}tokenize(t){if(!t)return[];return String(t).toLowerCase().replace(/[^\w\s\u00C0-\u017F]/g," ").split(/\s+/).filter(t=>t.length>0)}getIndexedFields(t){if(this.config.fields)return this.config.fields;return{users:["name","email"],products:["name","description"],articles:["title","content"]}[t]||[]}async search(t,e,r={}){const{fields:i=null,limit:n=this.config.maxResults,offset:s=0,exactMatch:o=!1}=r;if(!e||0===e.trim().length)return[];const a=this.tokenize(e),c=new Map,u=i||this.getIndexedFields(t);if(0===u.length)return[];for(const e of a)if(!(e.length<this.config.minWordLength))for(const r of u)if(o){const i=`${t}:${r}:${e.toLowerCase()}`,n=this.indexes.get(i);if(n)for(const t of n.recordIds){const e=c.get(t)||0;c.set(t,e+1)}}else for(const[i,n]of this.indexes.entries())if(i.startsWith(`${t}:${r}:${e.toLowerCase()}`))for(const t of n.recordIds){const e=c.get(t)||0;c.set(t,e+1)}return Array.from(c.entries()).map(([t,e])=>({recordId:t,score:e})).sort((t,e)=>e.score-t.score).slice(s,s+n)}async searchRecords(t,e,r={}){const i=await this.search(t,e,r);if(0===i.length)return[];const n=this.database.resources[t];if(!n)throw new Error(`Resource '${t}' not found`);const s=i.map(t=>t.recordId);return(await n.getMany(s)).filter(t=>t&&"object"==typeof t).map(t=>{const e=i.find(e=>e.recordId===t.id);return{...t,_searchScore:e?e.score:0}}).sort((t,e)=>e._searchScore-t._searchScore)}async rebuildIndex(t){const e=this.database.resources[t];if(!e)throw new Error(`Resource '${t}' not found`);for(const[e]of this.indexes.entries())e.startsWith(`${t}:`)&&this.indexes.delete(e);const r=await e.getAll();for(let e=0;e<r.length;e+=100){const i=r.slice(e,e+100);for(const e of i){const[r,i]=await K(()=>this.indexRecord(t,e.id,e))}}await this.saveIndexes()}async getIndexStats(){const t={totalIndexes:this.indexes.size,resources:{},totalWords:0};for(const[e,r]of this.indexes.entries()){const[i,n]=e.split(":");t.resources[i]||(t.resources[i]={fields:{},totalRecords:new Set,totalWords:0}),t.resources[i].fields[n]||(t.resources[i].fields[n]={words:0,totalOccurrences:0}),t.resources[i].fields[n].words++,t.resources[i].fields[n].totalOccurrences+=r.count,t.resources[i].totalWords++;for(const e of r.recordIds)t.resources[i].totalRecords.add(e);t.totalWords++}for(const e in t.resources)t.resources[e].totalRecords=t.resources[e].totalRecords.size;return t}async rebuildAllIndexes({timeout:t}={}){return t?Promise.race([this._rebuildAllIndexesInternal(),new Promise((e,r)=>setTimeout(()=>r(new Error("Timeout")),t))]):this._rebuildAllIndexesInternal()}async _rebuildAllIndexesInternal(){const t=Object.keys(this.database.resources).filter(t=>"fulltext_indexes"!==t);for(const e of t){const[t,r]=await K(()=>this.rebuildIndex(e))}}async clearIndex(t){for(const[e]of this.indexes.entries())e.startsWith(`${t}:`)&&this.indexes.delete(e);await this.saveIndexes()}async clearAllIndexes(){this.indexes.clear(),await this.saveIndexes()}},t.InvalidResourceItem=I,t.MetricsPlugin=class extends at{constructor(t={}){super(),this.config={collectPerformance:!1!==t.collectPerformance,collectErrors:!1!==t.collectErrors,collectUsage:!1!==t.collectUsage,retentionDays:t.retentionDays||30,flushInterval:t.flushInterval||6e4,...t},this.metrics={operations:{insert:{count:0,totalTime:0,errors:0},update:{count:0,totalTime:0,errors:0},delete:{count:0,totalTime:0,errors:0},get:{count:0,totalTime:0,errors:0},list:{count:0,totalTime:0,errors:0},count:{count:0,totalTime:0,errors:0}},resources:{},errors:[],performance:[],startTime:(new Date).toISOString()},this.flushTimer=null}async setup(t){if(this.database=t,"test"===process.env.NODE_ENV)return;const[e,r]=await K(async()=>{const[e,r,i]=await K(()=>t.createResource({name:"metrics",attributes:{id:"string|required",type:"string|required",resourceName:"string",operation:"string",count:"number|required",totalTime:"number|required",errors:"number|required",avgTime:"number|required",timestamp:"string|required",metadata:"json"}}));this.metricsResource=e?i:t.resources.metrics;const[n,s,o]=await K(()=>t.createResource({name:"error_logs",attributes:{id:"string|required",resourceName:"string|required",operation:"string|required",error:"string|required",timestamp:"string|required",metadata:"json"}}));this.errorsResource=n?o:t.resources.error_logs;const[a,c,u]=await K(()=>t.createResource({name:"performance_logs",attributes:{id:"string|required",resourceName:"string|required",operation:"string|required",duration:"number|required",timestamp:"string|required",metadata:"json"}}));this.performanceResource=a?u:t.resources.performance_logs});e||(this.metricsResource=t.resources.metrics,this.errorsResource=t.resources.error_logs,this.performanceResource=t.resources.performance_logs),this.installMetricsHooks(),"test"!==process.env.NODE_ENV&&this.startFlushTimer()}async start(){}async stop(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),"test"!==process.env.NODE_ENV&&await this.flushMetrics()}installMetricsHooks(){for(const t of Object.values(this.database.resources))["metrics","error_logs","performance_logs"].includes(t.name)||this.installResourceHooks(t);this.database._createResource=this.database.createResource,this.database.createResource=async function(...t){const e=await this._createResource(...t);return this.plugins?.metrics&&!["metrics","error_logs","performance_logs"].includes(e.name)&&this.plugins.metrics.installResourceHooks(e),e}}installResourceHooks(t){t._insert=t.insert,t._update=t.update,t._delete=t.delete,t._deleteMany=t.deleteMany,t._get=t.get,t._getMany=t.getMany,t._getAll=t.getAll,t._list=t.list,t._listIds=t.listIds,t._count=t.count,t._page=t.page,t.insert=async function(...e){const r=Date.now(),[i,n,s]=await K(()=>t._insert(...e));if(this.recordOperation(t.name,"insert",Date.now()-r,!i),i||this.recordError(t.name,"insert",n),!i)throw n;return s}.bind(this),t.update=async function(...e){const r=Date.now(),[i,n,s]=await K(()=>t._update(...e));if(this.recordOperation(t.name,"update",Date.now()-r,!i),i||this.recordError(t.name,"update",n),!i)throw n;return s}.bind(this),t.delete=async function(...e){const r=Date.now(),[i,n,s]=await K(()=>t._delete(...e));if(this.recordOperation(t.name,"delete",Date.now()-r,!i),i||this.recordError(t.name,"delete",n),!i)throw n;return s}.bind(this),t.deleteMany=async function(...e){const r=Date.now(),[i,n,s]=await K(()=>t._deleteMany(...e));if(this.recordOperation(t.name,"delete",Date.now()-r,!i),i||this.recordError(t.name,"delete",n),!i)throw n;return s}.bind(this),t.get=async function(...e){const r=Date.now(),[i,n,s]=await K(()=>t._get(...e));if(this.recordOperation(t.name,"get",Date.now()-r,!i),i||this.recordError(t.name,"get",n),!i)throw n;return s}.bind(this),t.getMany=async function(...e){const r=Date.now(),[i,n,s]=await K(()=>t._getMany(...e));if(this.recordOperation(t.name,"get",Date.now()-r,!i),i||this.recordError(t.name,"get",n),!i)throw n;return s}.bind(this),t.getAll=async function(...e){const r=Date.now(),[i,n,s]=await K(()=>t._getAll(...e));if(this.recordOperation(t.name,"list",Date.now()-r,!i),i||this.recordError(t.name,"list",n),!i)throw n;return s}.bind(this),t.list=async function(...e){const r=Date.now(),[i,n,s]=await K(()=>t._list(...e));if(this.recordOperation(t.name,"list",Date.now()-r,!i),i||this.recordError(t.name,"list",n),!i)throw n;return s}.bind(this),t.listIds=async function(...e){const r=Date.now(),[i,n,s]=await K(()=>t._listIds(...e));if(this.recordOperation(t.name,"list",Date.now()-r,!i),i||this.recordError(t.name,"list",n),!i)throw n;return s}.bind(this),t.count=async function(...e){const r=Date.now(),[i,n,s]=await K(()=>t._count(...e));if(this.recordOperation(t.name,"count",Date.now()-r,!i),i||this.recordError(t.name,"count",n),!i)throw n;return s}.bind(this),t.page=async function(...e){const r=Date.now(),[i,n,s]=await K(()=>t._page(...e));if(this.recordOperation(t.name,"list",Date.now()-r,!i),i||this.recordError(t.name,"list",n),!i)throw n;return s}.bind(this)}recordOperation(t,e,r,i){this.metrics.operations[e]&&(this.metrics.operations[e].count++,this.metrics.operations[e].totalTime+=r,i&&this.metrics.operations[e].errors++),this.metrics.resources[t]||(this.metrics.resources[t]={insert:{count:0,totalTime:0,errors:0},update:{count:0,totalTime:0,errors:0},delete:{count:0,totalTime:0,errors:0},get:{count:0,totalTime:0,errors:0},list:{count:0,totalTime:0,errors:0},count:{count:0,totalTime:0,errors:0}}),this.metrics.resources[t][e]&&(this.metrics.resources[t][e].count++,this.metrics.resources[t][e].totalTime+=r,i&&this.metrics.resources[t][e].errors++),this.config.collectPerformance&&this.metrics.performance.push({resourceName:t,operation:e,duration:r,timestamp:(new Date).toISOString()})}recordError(t,e,r){this.config.collectErrors&&this.metrics.errors.push({resourceName:t,operation:e,error:r.message,stack:r.stack,timestamp:(new Date).toISOString()})}startFlushTimer(){this.flushTimer&&clearInterval(this.flushTimer),this.config.flushInterval>0&&(this.flushTimer=setInterval(()=>{this.flushMetrics().catch(console.error)},this.config.flushInterval))}async flushMetrics(){if(!this.metricsResource)return;const[t,e]=await K(async()=>{const t="test"===process.env.NODE_ENV?{}:{global:"true"},e="test"===process.env.NODE_ENV?{}:{perf:"true"},r="test"===process.env.NODE_ENV?{}:{error:"true"},i="test"===process.env.NODE_ENV?{}:{resource:"true"};for(const[e,r]of Object.entries(this.metrics.operations))r.count>0&&await this.metricsResource.insert({id:`metrics-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,type:"operation",resourceName:"global",operation:e,count:r.count,totalTime:r.totalTime,errors:r.errors,avgTime:r.count>0?r.totalTime/r.count:0,timestamp:(new Date).toISOString(),metadata:t});for(const[t,e]of Object.entries(this.metrics.resources))for(const[r,n]of Object.entries(e))n.count>0&&await this.metricsResource.insert({id:`metrics-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,type:"operation",resourceName:t,operation:r,count:n.count,totalTime:n.totalTime,errors:n.errors,avgTime:n.count>0?n.totalTime/n.count:0,timestamp:(new Date).toISOString(),metadata:i});if(this.config.collectPerformance&&this.metrics.performance.length>0)for(const t of this.metrics.performance)await this.performanceResource.insert({id:`perf-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,resourceName:t.resourceName,operation:t.operation,duration:t.duration,timestamp:t.timestamp,metadata:e});if(this.config.collectErrors&&this.metrics.errors.length>0)for(const t of this.metrics.errors)await this.errorsResource.insert({id:`error-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,resourceName:t.resourceName,operation:t.operation,error:t.error,stack:t.stack,timestamp:t.timestamp,metadata:r});this.resetMetrics()});t||console.error("Failed to flush metrics:",e)}resetMetrics(){for(const t of Object.keys(this.metrics.operations))this.metrics.operations[t]={count:0,totalTime:0,errors:0};for(const t of Object.keys(this.metrics.resources))for(const e of Object.keys(this.metrics.resources[t]))this.metrics.resources[t][e]={count:0,totalTime:0,errors:0};this.metrics.performance=[],this.metrics.errors=[]}async getMetrics(t={}){const{type:e="operation",resourceName:r,operation:i,startDate:n,endDate:s,limit:o=100,offset:a=0}=t;if(!this.metricsResource)return[];let c=(await this.metricsResource.getAll()).filter(t=>(!e||t.type===e)&&((!r||t.resourceName===r)&&((!i||t.operation===i)&&(!(n&&new Date(t.timestamp)<new Date(n))&&!(s&&new Date(t.timestamp)>new Date(s))))));return c.sort((t,e)=>new Date(e.timestamp)-new Date(t.timestamp)),c.slice(a,a+o)}async getErrorLogs(t={}){if(!this.errorsResource)return[];const{resourceName:e,operation:r,startDate:i,endDate:n,limit:s=100,offset:o=0}=t;let a=(await this.errorsResource.getAll()).filter(t=>(!e||t.resourceName===e)&&((!r||t.operation===r)&&(!(i&&new Date(t.timestamp)<new Date(i))&&!(n&&new Date(t.timestamp)>new Date(n)))));return a.sort((t,e)=>new Date(e.timestamp)-new Date(t.timestamp)),a.slice(o,o+s)}async getPerformanceLogs(t={}){if(!this.performanceResource)return[];const{resourceName:e,operation:r,startDate:i,endDate:n,limit:s=100,offset:o=0}=t;let a=(await this.performanceResource.getAll()).filter(t=>(!e||t.resourceName===e)&&((!r||t.operation===r)&&(!(i&&new Date(t.timestamp)<new Date(i))&&!(n&&new Date(t.timestamp)>new Date(n)))));return a.sort((t,e)=>new Date(e.timestamp)-new Date(t.timestamp)),a.slice(o,o+s)}async getStats(){const t=new Date,e=new Date(t.getTime()-864e5),[r,i,n]=await Promise.all([this.getMetrics({startDate:e.toISOString()}),this.getErrorLogs({startDate:e.toISOString()}),this.getPerformanceLogs({startDate:e.toISOString()})]),s={period:"24h",totalOperations:0,totalErrors:i.length,avgResponseTime:0,operationsByType:{},resources:{},uptime:{startTime:this.metrics.startTime,duration:t.getTime()-new Date(this.metrics.startTime).getTime()}};for(const t of r)if("operation"===t.type){s.totalOperations+=t.count,s.operationsByType[t.operation]||(s.operationsByType[t.operation]={count:0,errors:0,avgTime:0}),s.operationsByType[t.operation].count+=t.count,s.operationsByType[t.operation].errors+=t.errors;const e=s.operationsByType[t.operation],r=e.count,i=(e.avgTime*(r-t.count)+t.totalTime)/r;e.avgTime=i}const o=r.reduce((t,e)=>t+e.totalTime,0),a=r.reduce((t,e)=>t+e.count,0);return s.avgResponseTime=a>0?o/a:0,s}async cleanupOldData(){const t=new Date;if(t.setDate(t.getDate()-this.config.retentionDays),this.metricsResource){const e=await this.getMetrics({endDate:t.toISOString()});for(const t of e)await this.metricsResource.delete(t.id)}if(this.errorsResource){const e=await this.getErrorLogs({endDate:t.toISOString()});for(const t of e)await this.errorsResource.delete(t.id)}if(this.performanceResource){const e=await this.getPerformanceLogs({endDate:t.toISOString()});for(const t of e)await this.performanceResource.delete(t.id)}}},t.MissingMetadata=P,t.NoSuchBucket=A,t.NoSuchKey=E,t.NotFound=N,t.PartitionError=F,t.PermissionError=R,t.Plugin=at,t.PluginObject=ct,t.ReplicatorPlugin=class extends at{constructor(t={}){if(super(),!t.replicators||!Array.isArray(t.replicators))throw new Error("ReplicatorPlugin: replicators array is required");for(const e of t.replicators){if(!e.driver)throw new Error("ReplicatorPlugin: each replicator must have a driver");if(!e.resources||"object"!=typeof e.resources)throw new Error("ReplicatorPlugin: each replicator must have resources config");if(0===Object.keys(e.resources).length)throw new Error("ReplicatorPlugin: each replicator must have at least one resource configured")}this.config={replicators:t.replicators||[],logErrors:!1!==t.logErrors,replicatorLogResource:t.replicatorLogResource||"replicator_log",enabled:!1!==t.enabled,batchSize:t.batchSize||100,maxRetries:t.maxRetries||3,timeout:t.timeout||3e4,verbose:t.verbose||!1,...t},this.replicators=[],this.database=null,this.eventListenersInstalled=new Set}async decompressData(t){return t}filterInternalFields(t){if(!t||"object"!=typeof t)return t;const e={};for(const[r,i]of Object.entries(t))r.startsWith("_")||"$overflow"===r||"$before"===r||"$after"===r||(e[r]=i);return e}installEventListeners(t,e,r){t&&!this.eventListenersInstalled.has(t.name)&&(t.on("insert",async e=>{try{const i={...e,createdAt:(new Date).toISOString()};await r.processReplicatorEvent("insert",t.name,i.id,i)}catch(e){this.emit("error",{operation:"insert",error:e.message,resource:t.name})}}),t.on("update",async(e,i)=>{try{const n={...e,updatedAt:(new Date).toISOString()};await r.processReplicatorEvent("update",t.name,n.id,n,i)}catch(e){this.emit("error",{operation:"update",error:e.message,resource:t.name})}}),t.on("delete",async e=>{try{await r.processReplicatorEvent("delete",t.name,e.id,e)}catch(e){this.emit("error",{operation:"delete",error:e.message,resource:t.name})}}),this.eventListenersInstalled.add(t.name))}async getCompleteData(t,e){const[r,i,n]=await K(()=>t.get(e.id));return r?n:e}async setup(t){this.database=t;try{await this.initializeReplicators(t)}catch(t){throw this.emit("error",{operation:"setup",error:t.message}),t}try{if(this.config.replicatorLogResource){await t.createResource({name:this.config.replicatorLogResource,behavior:"body-overflow",attributes:{operation:"string",resourceName:"string",recordId:"string",data:"string",error:"string|optional",replicator:"string",timestamp:"string",status:"string"}})}}catch(t){}await this.uploadMetadataFile(t);const e=t.createResource.bind(t);t.createResource=async r=>{const i=await e(r);return i&&this.installEventListeners(i,t,this),i};for(const e in t.resources){const r=t.resources[e];this.installEventListeners(r,t,this)}}async initializeReplicators(t){for(const e of this.config.replicators){const{driver:r,config:i,resources:n}=e,s=this.createReplicator(r,i,n);s&&(await s.initialize(t),this.replicators.push(s))}}async start(){}async stop(){}async processReplicatorEvent(t,e,r,i,n=null){if(!this.config.enabled)return;const s=this.replicators.filter(r=>r.shouldReplicateResource&&r.shouldReplicateResource(e,t));if(0===s.length)return;const o=s.map(async s=>{try{const o=await this.retryWithBackoff(()=>s.replicate(e,t,i,r,n),this.config.maxRetries);return this.emit("replicated",{replicator:s.name||s.id,resourceName:e,operation:t,recordId:r,result:o,success:!0}),o}catch(n){throw this.emit("replicator_error",{replicator:s.name||s.id,resourceName:e,operation:t,recordId:r,error:n.message}),this.config.logErrors&&this.database&&await this.logError(s,e,t,r,i,n),n}});return Promise.allSettled(o)}async processreplicatorItem(t){const e=this.replicators.filter(e=>e.shouldReplicateResource&&e.shouldReplicateResource(t.resourceName,t.operation));if(0===e.length)return;const r=e.map(async e=>{try{const[r,i,n]=await K(()=>e.replicate(t.resourceName,t.operation,t.data,t.recordId,t.beforeData));return r?(this.emit("replicated",{replicator:e.name||e.id,resourceName:t.resourceName,operation:t.operation,recordId:t.recordId,result:n,success:!0}),{success:!0,result:n}):(this.emit("replicator_error",{replicator:e.name||e.id,resourceName:t.resourceName,operation:t.operation,recordId:t.recordId,error:i.message}),this.config.logErrors&&this.database&&await this.logError(e,t.resourceName,t.operation,t.recordId,t.data,i),{success:!1,error:i.message})}catch(r){return this.emit("replicator_error",{replicator:e.name||e.id,resourceName:t.resourceName,operation:t.operation,recordId:t.recordId,error:r.message}),this.config.logErrors&&this.database&&await this.logError(e,t.resourceName,t.operation,t.recordId,t.data,r),{success:!1,error:r.message}}});return Promise.allSettled(r)}async logreplicator(t){const e=this.replicatorLog||this.database.resources[Pi(this.config.replicatorLogResource)];if(!e)return this.database&&this.database.options&&this.database.options.connectionString,void this.emit("replicator.log.failed",{error:"replicator log resource not found",item:t});const r={id:t.id||`repl-${Date.now()}-${Math.random().toString(36).slice(2)}`,resource:t.resource||t.resourceName||"",action:t.operation||t.action||"",data:t.data||{},timestamp:"number"==typeof t.timestamp?t.timestamp:Date.now(),createdAt:t.createdAt||(new Date).toISOString().slice(0,10)};try{await e.insert(r)}catch(e){this.emit("replicator.log.failed",{error:e,item:t})}}async updatereplicatorLog(t,e){if(!this.replicatorLog)return;const[r,i]=await K(async()=>{await this.replicatorLog.update(t,{...e,lastAttempt:(new Date).toISOString()})});r||this.emit("replicator.updateLog.failed",{error:i.message,logId:t,updates:e})}async getreplicatorStats(){return{replicators:await Promise.all(this.replicators.map(async t=>{const e=await t.instance.getStatus();return{id:t.id,driver:t.driver,config:t.config,status:e}})),queue:{length:this.queue.length,isProcessing:this.isProcessing},stats:this.stats,lastSync:this.stats.lastSync}}async getreplicatorLogs(t={}){if(!this.replicatorLog)return[];const{resourceName:e,operation:r,status:i,limit:n=100,offset:s=0}=t;let o={};e&&(o.resourceName=e),r&&(o.operation=r),i&&(o.status=i);return(await this.replicatorLog.list(o)).slice(s,s+n)}async retryFailedreplicators(){if(!this.replicatorLog)return{retried:0};const t=await this.replicatorLog.list({status:"failed"});let e=0;for(const r of t){const[t,i]=await K(async()=>{await this.processReplicatorEvent(r.resourceName,r.operation,r.recordId,r.data)});t&&e++}return{retried:e}}async syncAllData(t){const e=this.replicators.find(e=>e.id===t);if(!e)throw new Error(`Replicator not found: ${t}`);this.stats.lastSync=(new Date).toISOString();for(const r in this.database.resources)if(Pi(r)!==Pi("replicator_logs")&&e.instance.shouldReplicateResource(r)){this.emit("replicator.sync.resource",{resourceName:r,replicatorId:t});const i=this.database.resources[r],n=await i.getAll();for(const t of n)await e.instance.replicate(r,"insert",t,t.id)}this.emit("replicator.sync.completed",{replicatorId:t,stats:this.stats})}async cleanup(){try{if(this.replicators&&this.replicators.length>0){const t=this.replicators.map(async t=>{try{t&&"function"==typeof t.cleanup&&await t.cleanup()}catch(t){}});await Promise.allSettled(t)}this.replicators=[],this.database=null,this.eventListenersInstalled.clear(),this.removeAllListeners()}catch(t){}}},t.Resource=Ai,t.ResourceError=B,t.ResourceIdsPageReader=Wr,t.ResourceIdsReader=Hr,t.ResourceNotFound=D,t.ResourceReader=Jr,t.ResourceWriter=Yr,t.S3db=Ni,t.S3dbError=j,t.Schema=ci,t.SchemaError=U,t.UnknownError=C,t.ValidationError=x,t.Validator=si,t.behaviors=ji,t.calculateAttributeNamesSize=b,t.calculateAttributeSizes=v,t.calculateEffectiveLimit=S,t.calculateSystemOverhead=O,t.calculateTotalSize=k,t.calculateUTF8Bytes=y,t.decode=p,t.decodeDecimal=g,t.decrypt=J,t.default=class extends Ni{},t.encode=d,t.encodeDecimal=m,t.encrypt=W,t.getBehavior=xi,t.getSizeBreakdown=function(t){const e=v(t),r=b(t),i=Object.values(e).reduce((t,e)=>t+e,0),n=i+r,s=Object.entries(e).sort(([,t],[,e])=>e-t).map(([t,e])=>({attribute:t,size:e,percentage:(e/n*100).toFixed(2)+"%"}));return{total:n,valueSizes:e,namesSize:r,valueTotal:i,breakdown:s,detailedBreakdown:{values:i,names:r,total:n}}},t.idGenerator=Z,t.mapAwsError=T,t.md5=Y,t.passwordGenerator=Q,t.sha256=q,t.streamToString=Gr,t.transformValue=w,t.tryFn=V,t.tryFnSync=z,Object.defineProperty(t,"__esModule",{value:!0}),t}({},nanoid,zlib,PromisePool,streams,_,crypto,stringify,AWS,flat,FastestValidator);
|
|
1
|
+
var S3DB=function(t,e,r,i,s,n,a,o,c,u,l){"use strict";const h="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",f=Object.fromEntries([...h].map((t,e)=>[t,e])),d=t=>{if("number"!=typeof t||isNaN(t))return"undefined";if(!isFinite(t))return"undefined";if(0===t)return h[0];if(t<0)return"-"+d(-Math.floor(t));t=Math.floor(t);let e="";for(;t;)e=h[t%62]+e,t=Math.floor(t/62);return e},p=t=>{if("string"!=typeof t)return NaN;if(""===t)return 0;let e=!1;"-"===t[0]&&(e=!0,t=t.slice(1));let r=0;for(let e=0;e<t.length;e++){const i=f[t[e]];if(void 0===i)return NaN;r=62*r+i}return e?-r:r},m=t=>{if("number"!=typeof t||isNaN(t))return"undefined";if(!isFinite(t))return"undefined";const e=t<0;t=Math.abs(t);const[r,i]=t.toString().split("."),s=d(Number(r));return i?(e?"-":"")+s+"."+i:(e?"-":"")+s},g=t=>{if("string"!=typeof t)return NaN;let e=!1;"-"===t[0]&&(e=!0,t=t.slice(1));const[r,i]=t.split("."),s=p(r);if(isNaN(s))return NaN;const n=i?Number(s+"."+i):s;return e?-n:n};function y(t){"string"!=typeof t&&(t=String(t));let e=0;for(let r=0;r<t.length;r++){const i=t.codePointAt(r);i<=127?e+=1:i<=2047?e+=2:i<=65535?e+=3:i<=1114111&&(e+=4,i>65535&&r++)}return e}function b(t){let e=0;for(const r of Object.keys(t))e+=y(r);return e}function w(t){return null==t?"":"boolean"==typeof t?t?"1":"0":"number"==typeof t?String(t):"string"==typeof t?t:Array.isArray(t)?0===t.length?"[]":t.map(t=>String(t)).join("|"):"object"==typeof t?JSON.stringify(t):String(t)}function v(t){const e={};for(const[r,i]of Object.entries(t)){const t=y(w(i));e[r]=t}return e}function S(t){const e=v(t);return Object.values(e).reduce((t,e)=>t+e,0)+b(t)}function k(t={}){const{version:e="1",timestamps:r=!1,id:i=""}=t,s={_v:String(e)};r&&(s.createdAt="2024-01-01T00:00:00.000Z",s.updatedAt="2024-01-01T00:00:00.000Z"),i&&(s.id=i);const n={};for(const[t,e]of Object.entries(s))n[t]=e;return S(n)}function O(t={}){const{s3Limit:e=2048,systemConfig:r={}}=t;return e-k(r)}class _ extends Error{constructor({verbose:t,bucket:e,key:r,message:i,code:s,statusCode:n,requestId:a,awsMessage:o,original:c,commandName:u,commandInput:l,metadata:h,suggestion:f,...d}){t&&(i+=`\n\nVerbose:\n\n${JSON.stringify(d,null,2)}`),super(i),"function"==typeof Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error(i).stack,super.name=this.constructor.name,this.name=this.constructor.name,this.bucket=e,this.key=r,this.thrownAt=new Date,this.code=s,this.statusCode=n,this.requestId=a,this.awsMessage=o,this.original=c,this.commandName=u,this.commandInput=l,this.metadata=h,this.suggestion=f,this.data={bucket:e,key:r,...d,verbose:t,message:i}}toJson(){return{name:this.name,message:this.message,code:this.code,statusCode:this.statusCode,requestId:this.requestId,awsMessage:this.awsMessage,bucket:this.bucket,key:this.key,thrownAt:this.thrownAt,commandName:this.commandName,commandInput:this.commandInput,metadata:this.metadata,suggestion:this.suggestion,data:this.data,original:this.original,stack:this.stack}}toString(){return`${this.name} | ${this.message}`}}class j extends _{constructor(t,e={}){let r,i,s,n,a,o;e.original&&(a=e.original,r=a.code||a.Code||a.name,i=a.statusCode||a.$metadata&&a.$metadata.httpStatusCode,s=a.requestId||a.$metadata&&a.$metadata.requestId,n=a.message,o=a.$metadata?{...a.$metadata}:void 0),super({message:t,...e,code:r,statusCode:i,requestId:s,awsMessage:n,original:a,metadata:o})}}class R extends j{constructor(t,e={}){super(t,e),Object.assign(this,e)}}class E extends j{constructor(t,e={}){super(t,e),Object.assign(this,e)}}class x extends j{constructor({bucket:t,resourceName:e,id:r,original:i,...s}){if("string"!=typeof r)throw new Error("id must be a string");if("string"!=typeof t)throw new Error("bucket must be a string");if("string"!=typeof e)throw new Error("resourceName must be a string");super(`Resource not found: ${e}/${r} [bucket:${t}]`,{bucket:t,resourceName:e,id:r,original:i,...s})}}class D extends j{constructor({bucket:t,original:e,...r}){if("string"!=typeof t)throw new Error("bucket must be a string");super(`Bucket does not exists [bucket:${t}]`,{bucket:t,original:e,...r})}}class A extends j{constructor({bucket:t,key:e,resourceName:r,id:i,original:s,...n}){if("string"!=typeof e)throw new Error("key must be a string");if("string"!=typeof t)throw new Error("bucket must be a string");if(void 0!==i&&"string"!=typeof i)throw new Error("id must be a string");super(`No such key: ${e} [bucket:${t}]`,{bucket:t,key:e,resourceName:r,id:i,original:s,...n}),this.resourceName=r,this.id=i}}class N extends j{constructor({bucket:t,key:e,resourceName:r,id:i,original:s,...n}){if("string"!=typeof e)throw new Error("key must be a string");if("string"!=typeof t)throw new Error("bucket must be a string");super(`Not found: ${e} [bucket:${t}]`,{bucket:t,key:e,resourceName:r,id:i,original:s,...n}),this.resourceName=r,this.id=i}}class P extends j{constructor({bucket:t,original:e,...r}){if("string"!=typeof t)throw new Error("bucket must be a string");super(`Missing metadata for bucket [bucket:${t}]`,{bucket:t,original:e,...r})}}class C extends j{constructor({bucket:t,resourceName:e,attributes:r,validation:i,message:s,original:n,...a}){if("string"!=typeof t)throw new Error("bucket must be a string");if("string"!=typeof e)throw new Error("resourceName must be a string");super(s||`Validation error: This item is not valid. Resource=${e} [bucket:${t}].\n${JSON.stringify(i,null,2)}`,{bucket:t,resourceName:e,attributes:r,validation:i,original:n,...a})}}class I extends j{}const T={NotFound:N,NoSuchKey:A,UnknownError:I,NoSuchBucket:D,MissingMetadata:P,InvalidResourceItem:C};function $(t,e={}){const r=t.code||t.Code||t.name,i=t.$metadata?{...t.$metadata}:void 0,s=e.commandName,n=e.commandInput;let a;return"NoSuchKey"===r||"NotFound"===r?(a="Check if the key exists in the specified bucket and if your credentials have permission.",new A({...e,original:t,metadata:i,commandName:s,commandInput:n,suggestion:a})):"NoSuchBucket"===r?(a="Check if the bucket exists and if your credentials have permission.",new D({...e,original:t,metadata:i,commandName:s,commandInput:n,suggestion:a})):"AccessDenied"===r||403===t.statusCode||"Forbidden"===r?(a="Check your credentials and bucket policy.",new E("Access denied",{...e,original:t,metadata:i,commandName:s,commandInput:n,suggestion:a})):"ValidationError"===r||400===t.statusCode?(a="Check the request parameters and payload.",new R("Validation error",{...e,original:t,metadata:i,commandName:s,commandInput:n,suggestion:a})):"MissingMetadata"===r?(a="Check if the object metadata is present and valid.",new P({...e,original:t,metadata:i,commandName:s,commandInput:n,suggestion:a})):(a="Check the error details and AWS documentation.",new I("Unknown error",{...e,original:t,metadata:i,commandName:s,commandInput:n,suggestion:a}))}class M extends j{constructor(t,e={}){super(t,{...e,suggestion:"Check the connection string format and credentials."})}}class L extends j{constructor(t,e={}){super(t,{...e,suggestion:"Check if the crypto library is available and input is valid."})}}class U extends j{constructor(t,e={}){super(t,{...e,suggestion:"Check schema definition and input data."})}}class F extends j{constructor(t,e={}){super(t,{...e,suggestion:e.suggestion||"Check resource configuration, attributes, and operation context."}),Object.assign(this,e)}}class B extends j{constructor(t,e={}){super(t,{...e,suggestion:e.suggestion||"Check partition definition, fields, and input values."})}}function q(t){if(null==t){const t=new Error("fnOrPromise cannot be null or undefined");return t.stack=(new Error).stack,[!1,t,void 0]}if("function"==typeof t)try{const e=t();return null==e?[!0,null,e]:"function"==typeof e.then?e.then(t=>[!0,null,t]).catch(t=>{if(t instanceof Error&&Object.isExtensible(t)){const e=Object.getOwnPropertyDescriptor(t,"stack");if(e&&e.writable&&e.configurable&&t.hasOwnProperty("stack"))try{t.stack=(new Error).stack}catch(t){}}return[!1,t,void 0]}):[!0,null,e]}catch(t){if(t instanceof Error&&Object.isExtensible(t)){const e=Object.getOwnPropertyDescriptor(t,"stack");if(e&&e.writable&&e.configurable&&t.hasOwnProperty("stack"))try{t.stack=(new Error).stack}catch(t){}}return[!1,t,void 0]}return"function"==typeof t.then?Promise.resolve(t).then(t=>[!0,null,t]).catch(t=>{if(t instanceof Error&&Object.isExtensible(t)){const e=Object.getOwnPropertyDescriptor(t,"stack");if(e&&e.writable&&e.configurable&&t.hasOwnProperty("stack"))try{t.stack=(new Error).stack}catch(t){}}return[!1,t,void 0]}):[!0,null,t]}function z(t){try{return[!0,null,t()]}catch(t){return[!1,t,null]}}var V=q;async function K(){let t;if("undefined"!=typeof process){const[e,r,i]=await V(async()=>{const{webcrypto:t}=await import("crypto");return t});if(!e)throw new L("Crypto API not available",{original:r,context:"dynamicCrypto"});t=i}else"undefined"!=typeof window&&(t=window.crypto);if(!t)throw new L("Could not load any crypto library",{context:"dynamicCrypto"});return t}async function W(t){const[e,r,i]=await V(K);if(!e)throw new L("Crypto API not available",{original:r});const s=(new TextEncoder).encode(t),[n,a,o]=await V(()=>i.subtle.digest("SHA-256",s));if(!n)throw new L("SHA-256 digest failed",{original:a,input:t});return Array.from(new Uint8Array(o)).map(t=>t.toString(16).padStart(2,"0")).join("")}async function H(t,e){const[r,i,s]=await V(K);if(!r)throw new L("Crypto API not available",{original:i});const n=s.getRandomValues(new Uint8Array(16)),[a,o,c]=await V(()=>G(e,n));if(!a)throw new L("Key derivation failed",{original:o,passphrase:e,salt:n});const u=s.getRandomValues(new Uint8Array(12)),l=(new TextEncoder).encode(t),[h,f,d]=await V(()=>s.subtle.encrypt({name:"AES-GCM",iv:u},c,l));if(!h)throw new L("Encryption failed",{original:f,content:t});const p=new Uint8Array(n.length+u.length+d.byteLength);return p.set(n),p.set(u,n.length),p.set(new Uint8Array(d),n.length+u.length),function(t){if("undefined"!=typeof process)return Buffer.from(t).toString("base64");{const[e,r,i]=z(()=>String.fromCharCode.apply(null,new Uint8Array(t)));if(!e)throw new L("Failed to convert ArrayBuffer to base64 (browser)",{original:r});return window.btoa(i)}}(p)}async function J(t,e){const[r,i,s]=await V(K);if(!r)throw new L("Crypto API not available",{original:i});const n=function(t){if("undefined"!=typeof process)return new Uint8Array(Buffer.from(t,"base64"));{const[e,r,i]=z(()=>window.atob(t));if(!e)throw new L("Failed to decode base64 (browser)",{original:r});const s=i.length,n=new Uint8Array(s);for(let t=0;t<s;t++)n[t]=i.charCodeAt(t);return n}}(t),a=n.slice(0,16),o=n.slice(16,28),c=n.slice(28),[u,l,h]=await V(()=>G(e,a));if(!u)throw new L("Key derivation failed (decrypt)",{original:l,passphrase:e,salt:a});const[f,d,p]=await V(()=>s.subtle.decrypt({name:"AES-GCM",iv:o},h,c));if(!f)throw new L("Decryption failed",{original:d,encryptedBase64:t});return(new TextDecoder).decode(p)}async function Y(t){if("undefined"==typeof process)throw new L("MD5 hashing is only available in Node.js environment",{context:"md5"});const[e,r,i]=await V(async()=>{const{createHash:e}=await import("crypto");return e("md5").update(t).digest("base64")});if(!e)throw new L("MD5 hashing failed",{original:r,data:t});return i}async function G(t,e){const[r,i,s]=await V(K);if(!r)throw new L("Crypto API not available",{original:i});const n=(new TextEncoder).encode(t),[a,o,c]=await V(()=>s.subtle.importKey("raw",n,{name:"PBKDF2"},!1,["deriveKey"]));if(!a)throw new L("importKey failed",{original:o,passphrase:t});const[u,l,h]=await V(()=>s.subtle.deriveKey({name:"PBKDF2",salt:e,iterations:1e5,hash:"SHA-256"},c,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]));if(!u)throw new L("deriveKey failed",{original:l,passphrase:t,salt:e});return h}const Q=e.customAlphabet(e.urlAlphabet,22),X=e.customAlphabet("ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789",16);var Z;function tt(){}function et(){et.init.call(this)}function rt(t){return void 0===t._maxListeners?et.defaultMaxListeners:t._maxListeners}function it(t,e,r,i){var s,n,a,o;if("function"!=typeof r)throw new TypeError('"listener" argument must be a function');if((n=t._events)?(n.newListener&&(t.emit("newListener",e,r.listener?r.listener:r),n=t._events),a=n[e]):(n=t._events=new tt,t._eventsCount=0),a){if("function"==typeof a?a=n[e]=i?[r,a]:[a,r]:i?a.unshift(r):a.push(r),!a.warned&&(s=rt(t))&&s>0&&a.length>s){a.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+a.length+" "+e+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=t,c.type=e,c.count=a.length,o=c,"function"==typeof console.warn?console.warn(o):console.log(o)}}else a=n[e]=r,++t._eventsCount;return t}function st(t,e,r){var i=!1;function s(){t.removeListener(e,s),i||(i=!0,r.apply(t,arguments))}return s.listener=r,s}function nt(t){var e=this._events;if(e){var r=e[t];if("function"==typeof r)return 1;if(r)return r.length}return 0}function at(t,e){for(var r=new Array(e);e--;)r[e]=t[e];return r}tt.prototype=Object.create(null),et.EventEmitter=et,et.usingDomains=!1,et.prototype.domain=void 0,et.prototype._events=void 0,et.prototype._maxListeners=void 0,et.defaultMaxListeners=10,et.init=function(){this.domain=null,et.usingDomains&&(!Z.active||this instanceof Z.Domain||(this.domain=Z.active)),this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new tt,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},et.prototype.setMaxListeners=function(t){if("number"!=typeof t||t<0||isNaN(t))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=t,this},et.prototype.getMaxListeners=function(){return rt(this)},et.prototype.emit=function(t){var e,r,i,s,n,a,o,c="error"===t;if(a=this._events)c=c&&null==a.error;else if(!c)return!1;if(o=this.domain,c){if(e=arguments[1],!o){if(e instanceof Error)throw e;var u=new Error('Uncaught, unspecified "error" event. ('+e+")");throw u.context=e,u}return e||(e=new Error('Uncaught, unspecified "error" event')),e.domainEmitter=this,e.domain=o,e.domainThrown=!1,o.emit("error",e),!1}if(!(r=a[t]))return!1;var l="function"==typeof r;switch(i=arguments.length){case 1:!function(t,e,r){if(e)t.call(r);else for(var i=t.length,s=at(t,i),n=0;n<i;++n)s[n].call(r)}(r,l,this);break;case 2:!function(t,e,r,i){if(e)t.call(r,i);else for(var s=t.length,n=at(t,s),a=0;a<s;++a)n[a].call(r,i)}(r,l,this,arguments[1]);break;case 3:!function(t,e,r,i,s){if(e)t.call(r,i,s);else for(var n=t.length,a=at(t,n),o=0;o<n;++o)a[o].call(r,i,s)}(r,l,this,arguments[1],arguments[2]);break;case 4:!function(t,e,r,i,s,n){if(e)t.call(r,i,s,n);else for(var a=t.length,o=at(t,a),c=0;c<a;++c)o[c].call(r,i,s,n)}(r,l,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=new Array(i-1),n=1;n<i;n++)s[n-1]=arguments[n];!function(t,e,r,i){if(e)t.apply(r,i);else for(var s=t.length,n=at(t,s),a=0;a<s;++a)n[a].apply(r,i)}(r,l,this,s)}return!0},et.prototype.addListener=function(t,e){return it(this,t,e,!1)},et.prototype.on=et.prototype.addListener,et.prototype.prependListener=function(t,e){return it(this,t,e,!0)},et.prototype.once=function(t,e){if("function"!=typeof e)throw new TypeError('"listener" argument must be a function');return this.on(t,st(this,t,e)),this},et.prototype.prependOnceListener=function(t,e){if("function"!=typeof e)throw new TypeError('"listener" argument must be a function');return this.prependListener(t,st(this,t,e)),this},et.prototype.removeListener=function(t,e){var r,i,s,n,a;if("function"!=typeof e)throw new TypeError('"listener" argument must be a function');if(!(i=this._events))return this;if(!(r=i[t]))return this;if(r===e||r.listener&&r.listener===e)0===--this._eventsCount?this._events=new tt:(delete i[t],i.removeListener&&this.emit("removeListener",t,r.listener||e));else if("function"!=typeof r){for(s=-1,n=r.length;n-- >0;)if(r[n]===e||r[n].listener&&r[n].listener===e){a=r[n].listener,s=n;break}if(s<0)return this;if(1===r.length){if(r[0]=void 0,0===--this._eventsCount)return this._events=new tt,this;delete i[t]}else!function(t,e){for(var r=e,i=r+1,s=t.length;i<s;r+=1,i+=1)t[r]=t[i];t.pop()}(r,s);i.removeListener&&this.emit("removeListener",t,a||e)}return this},et.prototype.off=function(t,e){return this.removeListener(t,e)},et.prototype.removeAllListeners=function(t){var e,r;if(!(r=this._events))return this;if(!r.removeListener)return 0===arguments.length?(this._events=new tt,this._eventsCount=0):r[t]&&(0===--this._eventsCount?this._events=new tt:delete r[t]),this;if(0===arguments.length){for(var i,s=Object.keys(r),n=0;n<s.length;++n)"removeListener"!==(i=s[n])&&this.removeAllListeners(i);return this.removeAllListeners("removeListener"),this._events=new tt,this._eventsCount=0,this}if("function"==typeof(e=r[t]))this.removeListener(t,e);else if(e)do{this.removeListener(t,e[e.length-1])}while(e[0]);return this},et.prototype.listeners=function(t){var e,r=this._events;return r&&(e=r[t])?"function"==typeof e?[e.listener||e]:function(t){for(var e=new Array(t.length),r=0;r<e.length;++r)e[r]=t[r].listener||t[r];return e}(e):[]},et.listenerCount=function(t,e){return"function"==typeof t.listenerCount?t.listenerCount(e):nt.call(t,e)},et.prototype.listenerCount=nt,et.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};var ot=class extends et{constructor(t={}){super(),this.name=this.constructor.name,this.options=t,this.hooks=new Map}async setup(t){this.database=t,this.beforeSetup(),await this.onSetup(),this.afterSetup()}async start(){this.beforeStart(),await this.onStart(),this.afterStart()}async stop(){this.beforeStop(),await this.onStop(),this.afterStop()}async onSetup(){}async onStart(){}async onStop(){}addHook(t,e,r){this.hooks.has(t)||this.hooks.set(t,new Map);const i=this.hooks.get(t);i.has(e)||i.set(e,[]),i.get(e).push(r)}removeHook(t,e,r){const i=this.hooks.get(t);if(i&&i.has(e)){const t=i.get(e),s=t.indexOf(r);s>-1&&t.splice(s,1)}}wrapResourceMethod(t,e,r){const i=t[e];if(t._pluginWrappers||(t._pluginWrappers=new Map),t._pluginWrappers.has(e)||t._pluginWrappers.set(e,[]),t._pluginWrappers.get(e).push(r),!t[`_wrapped_${e}`]){t[`_wrapped_${e}`]=i;const r=i&&i._isMockFunction;t[e]=async function(...r){let i=await t[`_wrapped_${e}`](...r);for(const s of t._pluginWrappers.get(e))i=await s.call(this,i,r,e);return i},r&&(Object.setPrototypeOf(t[e],Object.getPrototypeOf(i)),Object.assign(t[e],i))}}addMiddleware(t,e,r){if(t._pluginMiddlewares||(t._pluginMiddlewares={}),!t._pluginMiddlewares[e]){t._pluginMiddlewares[e]=[];const r=t[e].bind(t);t[e]=async function(...i){let s=-1;const n=async(...i)=>(s++,s<t._pluginMiddlewares[e].length?await t._pluginMiddlewares[e][s].call(this,n,...i):await r(...i));return await n(...i)}}t._pluginMiddlewares[e].push(r)}getPartitionValues(t,e){if(!e.config?.partitions)return{};const r={};for(const[i,s]of Object.entries(e.config.partitions))if(s.fields){r[i]={};for(const[n,a]of Object.entries(s.fields)){const s=this.getNestedFieldValue(t,n);null!=s&&(r[i][n]=e.applyPartitionRule(s,a))}}else r[i]={};return r}getNestedFieldValue(t,e){if(!e.includes("."))return t[e]??null;const r=e.split(".");let i=t;for(const t of r){if(!i||"object"!=typeof i||!(t in i))return null;i=i[t]}return i??null}beforeSetup(){this.emit("plugin.beforeSetup",new Date)}afterSetup(){this.emit("plugin.afterSetup",new Date)}beforeStart(){this.emit("plugin.beforeStart",new Date)}afterStart(){this.emit("plugin.afterStart",new Date)}beforeStop(){this.emit("plugin.beforeStop",new Date)}afterStop(){this.emit("plugin.afterStop",new Date)}};const ct={setup(t){},start(){},stop(){}};function ut(t,e){for(var r=0,i=t.length-1;i>=0;i--){var s=t[i];"."===s?t.splice(i,1):".."===s?(t.splice(i,1),r++):r&&(t.splice(i,1),r--)}if(e)for(;r--;r)t.unshift("..");return t}var lt=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,ht=function(t){return lt.exec(t).slice(1)};function ft(){for(var t="",e=!1,r=arguments.length-1;r>=-1&&!e;r--){var i=r>=0?arguments[r]:"/";if("string"!=typeof i)throw new TypeError("Arguments to path.resolve must be strings");i&&(t=i+"/"+t,e="/"===i.charAt(0))}return(e?"/":"")+(t=ut(yt(t.split("/"),function(t){return!!t}),!e).join("/"))||"."}function dt(t){var e=pt(t),r="/"===bt(t,-1);return(t=ut(yt(t.split("/"),function(t){return!!t}),!e).join("/"))||e||(t="."),t&&r&&(t+="/"),(e?"/":"")+t}function pt(t){return"/"===t.charAt(0)}function mt(){return dt(yt(Array.prototype.slice.call(arguments,0),function(t,e){if("string"!=typeof t)throw new TypeError("Arguments to path.join must be strings");return t}).join("/"))}var gt={extname:function(t){return ht(t)[3]},basename:function(t,e){var r=ht(t)[2];return e&&r.substr(-1*e.length)===e&&(r=r.substr(0,r.length-e.length)),r},dirname:function(t){var e=ht(t),r=e[0],i=e[1];return r||i?(i&&(i=i.substr(0,i.length-1)),r+i):"."},sep:"/",delimiter:":",relative:function(t,e){function r(t){for(var e=0;e<t.length&&""===t[e];e++);for(var r=t.length-1;r>=0&&""===t[r];r--);return e>r?[]:t.slice(e,r-e+1)}t=ft(t).substr(1),e=ft(e).substr(1);for(var i=r(t.split("/")),s=r(e.split("/")),n=Math.min(i.length,s.length),a=n,o=0;o<n;o++)if(i[o]!==s[o]){a=o;break}var c=[];for(o=a;o<i.length;o++)c.push("..");return(c=c.concat(s.slice(a))).join("/")},join:mt,isAbsolute:pt,normalize:dt,resolve:ft};function yt(t,e){if(t.filter)return t.filter(e);for(var r=[],i=0;i<t.length;i++)e(t[i],i,t)&&r.push(t[i]);return r}var bt="b"==="ab".substr(-1)?function(t,e,r){return t.substr(e,r)}:function(t,e,r){return e<0&&(e=t.length+e),t.substr(e,r)};class wt extends et{constructor(t={}){super(),this.config=t}async _set(t,e){}async _get(t){}async _del(t){}async _clear(t){}validateKey(t){if(null==t||"string"!=typeof t||!t)throw new Error("Invalid key")}async set(t,e){return this.validateKey(t),await this._set(t,e),this.emit("set",e),e}async get(t){this.validateKey(t);const e=await this._get(t);return this.emit("get",e),e}async del(t){this.validateKey(t);const e=await this._del(t);return this.emit("delete",e),e}async delete(t){return this.del(t)}async clear(t){const e=await this._clear(t);return this.emit("clear",e),e}}function vt(){throw new Error("setTimeout has not been defined")}function St(){throw new Error("clearTimeout has not been defined")}var kt=vt,Ot=St;function _t(t){if(kt===setTimeout)return setTimeout(t,0);if((kt===vt||!kt)&&setTimeout)return kt=setTimeout,setTimeout(t,0);try{return kt(t,0)}catch(e){try{return kt.call(null,t,0)}catch(e){return kt.call(this,t,0)}}}"function"==typeof global.setTimeout&&(kt=setTimeout),"function"==typeof global.clearTimeout&&(Ot=clearTimeout);var jt,Rt=[],Et=!1,xt=-1;function Dt(){Et&&jt&&(Et=!1,jt.length?Rt=jt.concat(Rt):xt=-1,Rt.length&&At())}function At(){if(!Et){var t=_t(Dt);Et=!0;for(var e=Rt.length;e;){for(jt=Rt,Rt=[];++xt<e;)jt&&jt[xt].run();xt=-1,e=Rt.length}jt=null,Et=!1,function(t){if(Ot===clearTimeout)return clearTimeout(t);if((Ot===St||!Ot)&&clearTimeout)return Ot=clearTimeout,clearTimeout(t);try{return Ot(t)}catch(e){try{return Ot.call(null,t)}catch(e){return Ot.call(this,t)}}}(t)}}function Nt(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)e[r-1]=arguments[r];Rt.push(new Pt(t,e)),1!==Rt.length||Et||_t(At)}function Pt(t,e){this.fun=t,this.array=e}Pt.prototype.run=function(){this.fun.apply(null,this.array)};var Ct,It={env:{}};Ct="function"==typeof Object.create?function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:function(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t};var Tt=Object.getOwnPropertyDescriptors||function(t){for(var e=Object.keys(t),r={},i=0;i<e.length;i++)r[e[i]]=Object.getOwnPropertyDescriptor(t,e[i]);return r},$t=/%[sdj%]/g;function Mt(t){if(!Yt(t)){for(var e=[],r=0;r<arguments.length;r++)e.push(Bt(arguments[r]));return e.join(" ")}r=1;for(var i=arguments,s=i.length,n=String(t).replace($t,function(t){if("%%"===t)return"%";if(r>=s)return t;switch(t){case"%s":return String(i[r++]);case"%d":return Number(i[r++]);case"%j":try{return JSON.stringify(i[r++])}catch(t){return"[Circular]"}default:return t}}),a=i[r];r<s;a=i[++r])Jt(a)||!Xt(a)?n+=" "+a:n+=" "+Bt(a);return n}function Lt(t,e){if(Gt(global.process))return function(){return Lt(t,e).apply(this,arguments)};if(!0===It.noDeprecation)return t;var r=!1;return function(){if(!r){if(It.throwDeprecation)throw new Error(e);It.traceDeprecation?console.trace(e):console.error(e),r=!0}return t.apply(this,arguments)}}var Ut,Ft={};function Bt(t,e){var r={seen:[],stylize:zt};return arguments.length>=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),Ht(e)?r.showHidden=e:e&&function(t,e){if(!e||!Xt(e))return t;var r=Object.keys(e),i=r.length;for(;i--;)t[r[i]]=e[r[i]]}(r,e),Gt(r.showHidden)&&(r.showHidden=!1),Gt(r.depth)&&(r.depth=2),Gt(r.colors)&&(r.colors=!1),Gt(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=qt),Vt(r,t,r.depth)}function qt(t,e){var r=Bt.styles[e];return r?"["+Bt.colors[r][0]+"m"+t+"["+Bt.colors[r][1]+"m":t}function zt(t,e){return t}function Vt(t,e,r){if(t.customInspect&&e&&ee(e.inspect)&&e.inspect!==Bt&&(!e.constructor||e.constructor.prototype!==e)){var i=e.inspect(r,t);return Yt(i)||(i=Vt(t,i,r)),i}var s=function(t,e){if(Gt(e))return t.stylize("undefined","undefined");if(Yt(e)){var r="'"+JSON.stringify(e).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return t.stylize(r,"string")}if(i=e,"number"==typeof i)return t.stylize(""+e,"number");var i;if(Ht(e))return t.stylize(""+e,"boolean");if(Jt(e))return t.stylize("null","null")}(t,e);if(s)return s;var n=Object.keys(e),a=function(t){var e={};return t.forEach(function(t,r){e[t]=!0}),e}(n);if(t.showHidden&&(n=Object.getOwnPropertyNames(e)),te(e)&&(n.indexOf("message")>=0||n.indexOf("description")>=0))return Kt(e);if(0===n.length){if(ee(e)){var o=e.name?": "+e.name:"";return t.stylize("[Function"+o+"]","special")}if(Qt(e))return t.stylize(RegExp.prototype.toString.call(e),"regexp");if(Zt(e))return t.stylize(Date.prototype.toString.call(e),"date");if(te(e))return Kt(e)}var c,u,l="",h=!1,f=["{","}"];(c=e,Array.isArray(c)&&(h=!0,f=["[","]"]),ee(e))&&(l=" [Function"+(e.name?": "+e.name:"")+"]");return Qt(e)&&(l=" "+RegExp.prototype.toString.call(e)),Zt(e)&&(l=" "+Date.prototype.toUTCString.call(e)),te(e)&&(l=" "+Kt(e)),0!==n.length||h&&0!=e.length?r<0?Qt(e)?t.stylize(RegExp.prototype.toString.call(e),"regexp"):t.stylize("[Object]","special"):(t.seen.push(e),u=h?function(t,e,r,i,s){for(var n=[],a=0,o=e.length;a<o;++a)ie(e,String(a))?n.push(Wt(t,e,r,i,String(a),!0)):n.push("");return s.forEach(function(s){s.match(/^\d+$/)||n.push(Wt(t,e,r,i,s,!0))}),n}(t,e,r,a,n):n.map(function(i){return Wt(t,e,r,a,i,h)}),t.seen.pop(),function(t,e,r){var i=t.reduce(function(t,e){return e.indexOf("\n"),t+e.replace(/\u001b\[\d\d?m/g,"").length+1},0);if(i>60)return r[0]+(""===e?"":e+"\n ")+" "+t.join(",\n ")+" "+r[1];return r[0]+e+" "+t.join(", ")+" "+r[1]}(u,l,f)):f[0]+l+f[1]}function Kt(t){return"["+Error.prototype.toString.call(t)+"]"}function Wt(t,e,r,i,s,n){var a,o,c;if((c=Object.getOwnPropertyDescriptor(e,s)||{value:e[s]}).get?o=c.set?t.stylize("[Getter/Setter]","special"):t.stylize("[Getter]","special"):c.set&&(o=t.stylize("[Setter]","special")),ie(i,s)||(a="["+s+"]"),o||(t.seen.indexOf(c.value)<0?(o=Jt(r)?Vt(t,c.value,null):Vt(t,c.value,r-1)).indexOf("\n")>-1&&(o=n?o.split("\n").map(function(t){return" "+t}).join("\n").substr(2):"\n"+o.split("\n").map(function(t){return" "+t}).join("\n")):o=t.stylize("[Circular]","special")),Gt(a)){if(n&&s.match(/^\d+$/))return o;(a=JSON.stringify(""+s)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(a=a.substr(1,a.length-2),a=t.stylize(a,"name")):(a=a.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),a=t.stylize(a,"string"))}return a+": "+o}function Ht(t){return"boolean"==typeof t}function Jt(t){return null===t}function Yt(t){return"string"==typeof t}function Gt(t){return void 0===t}function Qt(t){return Xt(t)&&"[object RegExp]"===re(t)}function Xt(t){return"object"==typeof t&&null!==t}function Zt(t){return Xt(t)&&"[object Date]"===re(t)}function te(t){return Xt(t)&&("[object Error]"===re(t)||t instanceof Error)}function ee(t){return"function"==typeof t}function re(t){return Object.prototype.toString.call(t)}function ie(t,e){return Object.prototype.hasOwnProperty.call(t,e)}Bt.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},Bt.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"};var se="undefined"!=typeof Symbol?Symbol("util.promisify.custom"):void 0;function ne(t){if("function"!=typeof t)throw new TypeError('The "original" argument must be of type Function');if(se&&t[se]){var e;if("function"!=typeof(e=t[se]))throw new TypeError('The "util.promisify.custom" argument must be of type Function');return Object.defineProperty(e,se,{value:e,enumerable:!1,writable:!1,configurable:!0}),e}function e(){for(var e,r,i=new Promise(function(t,i){e=t,r=i}),s=[],n=0;n<arguments.length;n++)s.push(arguments[n]);s.push(function(t,i){t?r(t):e(i)});try{t.apply(this,s)}catch(t){r(t)}return i}return Object.setPrototypeOf(e,Object.getPrototypeOf(t)),se&&Object.defineProperty(e,se,{value:e,enumerable:!1,writable:!1,configurable:!0}),Object.defineProperties(e,Tt(t))}ne.custom=se;var ae=[],oe=[],ce="undefined"!=typeof Uint8Array?Uint8Array:Array,ue=!1;function le(){ue=!0;for(var t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e=0;e<64;++e)ae[e]=t[e],oe[t.charCodeAt(e)]=e;oe["-".charCodeAt(0)]=62,oe["_".charCodeAt(0)]=63}function he(t){return ae[t>>18&63]+ae[t>>12&63]+ae[t>>6&63]+ae[63&t]}function fe(t,e,r){for(var i,s=[],n=e;n<r;n+=3)i=(t[n]<<16)+(t[n+1]<<8)+t[n+2],s.push(he(i));return s.join("")}function de(t){var e;ue||le();for(var r=t.length,i=r%3,s="",n=[],a=16383,o=0,c=r-i;o<c;o+=a)n.push(fe(t,o,o+a>c?c:o+a));return 1===i?(e=t[r-1],s+=ae[e>>2],s+=ae[e<<4&63],s+="=="):2===i&&(e=(t[r-2]<<8)+t[r-1],s+=ae[e>>10],s+=ae[e>>4&63],s+=ae[e<<2&63],s+="="),n.push(s),n.join("")}function pe(t,e,r,i,s){var n,a,o=8*s-i-1,c=(1<<o)-1,u=c>>1,l=-7,h=r?s-1:0,f=r?-1:1,d=t[e+h];for(h+=f,n=d&(1<<-l)-1,d>>=-l,l+=o;l>0;n=256*n+t[e+h],h+=f,l-=8);for(a=n&(1<<-l)-1,n>>=-l,l+=i;l>0;a=256*a+t[e+h],h+=f,l-=8);if(0===n)n=1-u;else{if(n===c)return a?NaN:1/0*(d?-1:1);a+=Math.pow(2,i),n-=u}return(d?-1:1)*a*Math.pow(2,n-i)}function me(t,e,r,i,s,n){var a,o,c,u=8*n-s-1,l=(1<<u)-1,h=l>>1,f=23===s?Math.pow(2,-24)-Math.pow(2,-77):0,d=i?0:n-1,p=i?1:-1,m=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(o=isNaN(e)?1:0,a=l):(a=Math.floor(Math.log(e)/Math.LN2),e*(c=Math.pow(2,-a))<1&&(a--,c*=2),(e+=a+h>=1?f/c:f*Math.pow(2,1-h))*c>=2&&(a++,c/=2),a+h>=l?(o=0,a=l):a+h>=1?(o=(e*c-1)*Math.pow(2,s),a+=h):(o=e*Math.pow(2,h-1)*Math.pow(2,s),a=0));s>=8;t[r+d]=255&o,d+=p,o/=256,s-=8);for(a=a<<s|o,u+=s;u>0;t[r+d]=255&a,d+=p,a/=256,u-=8);t[r+d-p]|=128*m}var ge={}.toString,ye=Array.isArray||function(t){return"[object Array]"==ge.call(t)};function be(){return ve.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function we(t,e){if(be()<e)throw new RangeError("Invalid typed array length");return ve.TYPED_ARRAY_SUPPORT?(t=new Uint8Array(e)).__proto__=ve.prototype:(null===t&&(t=new ve(e)),t.length=e),t}function ve(t,e,r){if(!(ve.TYPED_ARRAY_SUPPORT||this instanceof ve))return new ve(t,e,r);if("number"==typeof t){if("string"==typeof e)throw new Error("If encoding is specified then the first argument must be a string");return Oe(this,t)}return Se(this,t,e,r)}function Se(t,e,r,i){if("number"==typeof e)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&e instanceof ArrayBuffer?function(t,e,r,i){if(e.byteLength,r<0||e.byteLength<r)throw new RangeError("'offset' is out of bounds");if(e.byteLength<r+(i||0))throw new RangeError("'length' is out of bounds");e=void 0===r&&void 0===i?new Uint8Array(e):void 0===i?new Uint8Array(e,r):new Uint8Array(e,r,i);ve.TYPED_ARRAY_SUPPORT?(t=e).__proto__=ve.prototype:t=_e(t,e);return t}(t,e,r,i):"string"==typeof e?function(t,e,r){"string"==typeof r&&""!==r||(r="utf8");if(!ve.isEncoding(r))throw new TypeError('"encoding" must be a valid string encoding');var i=0|Ee(e,r);t=we(t,i);var s=t.write(e,r);s!==i&&(t=t.slice(0,s));return t}(t,e,r):function(t,e){if(Re(e)){var r=0|je(e.length);return 0===(t=we(t,r)).length||e.copy(t,0,0,r),t}if(e){if("undefined"!=typeof ArrayBuffer&&e.buffer instanceof ArrayBuffer||"length"in e)return"number"!=typeof e.length||(i=e.length)!=i?we(t,0):_e(t,e);if("Buffer"===e.type&&ye(e.data))return _e(t,e.data)}var i;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(t,e)}function ke(t){if("number"!=typeof t)throw new TypeError('"size" argument must be a number');if(t<0)throw new RangeError('"size" argument must not be negative')}function Oe(t,e){if(ke(e),t=we(t,e<0?0:0|je(e)),!ve.TYPED_ARRAY_SUPPORT)for(var r=0;r<e;++r)t[r]=0;return t}function _e(t,e){var r=e.length<0?0:0|je(e.length);t=we(t,r);for(var i=0;i<r;i+=1)t[i]=255&e[i];return t}function je(t){if(t>=be())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+be().toString(16)+" bytes");return 0|t}function Re(t){return!(null==t||!t._isBuffer)}function Ee(t,e){if(Re(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var r=t.length;if(0===r)return 0;for(var i=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return tr(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return er(t).length;default:if(i)return tr(t).length;e=(""+e).toLowerCase(),i=!0}}function xe(t,e,r){var i=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return ze(this,e,r);case"utf8":case"utf-8":return Ue(this,e,r);case"ascii":return Be(this,e,r);case"latin1":case"binary":return qe(this,e,r);case"base64":return Le(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Ve(this,e,r);default:if(i)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),i=!0}}function De(t,e,r){var i=t[e];t[e]=t[r],t[r]=i}function Ae(t,e,r,i,s){if(0===t.length)return-1;if("string"==typeof r?(i=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=s?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(s)return-1;r=t.length-1}else if(r<0){if(!s)return-1;r=0}if("string"==typeof e&&(e=ve.from(e,i)),Re(e))return 0===e.length?-1:Ne(t,e,r,i,s);if("number"==typeof e)return e&=255,ve.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?s?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):Ne(t,[e],r,i,s);throw new TypeError("val must be string, number or Buffer")}function Ne(t,e,r,i,s){var n,a=1,o=t.length,c=e.length;if(void 0!==i&&("ucs2"===(i=String(i).toLowerCase())||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(t.length<2||e.length<2)return-1;a=2,o/=2,c/=2,r/=2}function u(t,e){return 1===a?t[e]:t.readUInt16BE(e*a)}if(s){var l=-1;for(n=r;n<o;n++)if(u(t,n)===u(e,-1===l?0:n-l)){if(-1===l&&(l=n),n-l+1===c)return l*a}else-1!==l&&(n-=n-l),l=-1}else for(r+c>o&&(r=o-c),n=r;n>=0;n--){for(var h=!0,f=0;f<c;f++)if(u(t,n+f)!==u(e,f)){h=!1;break}if(h)return n}return-1}function Pe(t,e,r,i){r=Number(r)||0;var s=t.length-r;i?(i=Number(i))>s&&(i=s):i=s;var n=e.length;if(n%2!=0)throw new TypeError("Invalid hex string");i>n/2&&(i=n/2);for(var a=0;a<i;++a){var o=parseInt(e.substr(2*a,2),16);if(isNaN(o))return a;t[r+a]=o}return a}function Ce(t,e,r,i){return rr(tr(e,t.length-r),t,r,i)}function Ie(t,e,r,i){return rr(function(t){for(var e=[],r=0;r<t.length;++r)e.push(255&t.charCodeAt(r));return e}(e),t,r,i)}function Te(t,e,r,i){return Ie(t,e,r,i)}function $e(t,e,r,i){return rr(er(e),t,r,i)}function Me(t,e,r,i){return rr(function(t,e){for(var r,i,s,n=[],a=0;a<t.length&&!((e-=2)<0);++a)i=(r=t.charCodeAt(a))>>8,s=r%256,n.push(s),n.push(i);return n}(e,t.length-r),t,r,i)}function Le(t,e,r){return 0===e&&r===t.length?de(t):de(t.slice(e,r))}function Ue(t,e,r){r=Math.min(t.length,r);for(var i=[],s=e;s<r;){var n,a,o,c,u=t[s],l=null,h=u>239?4:u>223?3:u>191?2:1;if(s+h<=r)switch(h){case 1:u<128&&(l=u);break;case 2:128==(192&(n=t[s+1]))&&(c=(31&u)<<6|63&n)>127&&(l=c);break;case 3:n=t[s+1],a=t[s+2],128==(192&n)&&128==(192&a)&&(c=(15&u)<<12|(63&n)<<6|63&a)>2047&&(c<55296||c>57343)&&(l=c);break;case 4:n=t[s+1],a=t[s+2],o=t[s+3],128==(192&n)&&128==(192&a)&&128==(192&o)&&(c=(15&u)<<18|(63&n)<<12|(63&a)<<6|63&o)>65535&&c<1114112&&(l=c)}null===l?(l=65533,h=1):l>65535&&(l-=65536,i.push(l>>>10&1023|55296),l=56320|1023&l),i.push(l),s+=h}return function(t){var e=t.length;if(e<=Fe)return String.fromCharCode.apply(String,t);var r="",i=0;for(;i<e;)r+=String.fromCharCode.apply(String,t.slice(i,i+=Fe));return r}(i)}ve.TYPED_ARRAY_SUPPORT=void 0===global.TYPED_ARRAY_SUPPORT||global.TYPED_ARRAY_SUPPORT,be(),ve.poolSize=8192,ve._augment=function(t){return t.__proto__=ve.prototype,t},ve.from=function(t,e,r){return Se(null,t,e,r)},ve.TYPED_ARRAY_SUPPORT&&(ve.prototype.__proto__=Uint8Array.prototype,ve.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&ve[Symbol.species]),ve.alloc=function(t,e,r){return function(t,e,r,i){return ke(e),e<=0?we(t,e):void 0!==r?"string"==typeof i?we(t,e).fill(r,i):we(t,e).fill(r):we(t,e)}(null,t,e,r)},ve.allocUnsafe=function(t){return Oe(null,t)},ve.allocUnsafeSlow=function(t){return Oe(null,t)},ve.isBuffer=function(t){return null!=t&&(!!t._isBuffer||ir(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&ir(t.slice(0,0))}(t))},ve.compare=function(t,e){if(!Re(t)||!Re(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var r=t.length,i=e.length,s=0,n=Math.min(r,i);s<n;++s)if(t[s]!==e[s]){r=t[s],i=e[s];break}return r<i?-1:i<r?1:0},ve.isEncoding=function(t){switch(String(t).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},ve.concat=function(t,e){if(!ye(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return ve.alloc(0);var r;if(void 0===e)for(e=0,r=0;r<t.length;++r)e+=t[r].length;var i=ve.allocUnsafe(e),s=0;for(r=0;r<t.length;++r){var n=t[r];if(!Re(n))throw new TypeError('"list" argument must be an Array of Buffers');n.copy(i,s),s+=n.length}return i},ve.byteLength=Ee,ve.prototype._isBuffer=!0,ve.prototype.swap16=function(){var t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var e=0;e<t;e+=2)De(this,e,e+1);return this},ve.prototype.swap32=function(){var t=this.length;if(t%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var e=0;e<t;e+=4)De(this,e,e+3),De(this,e+1,e+2);return this},ve.prototype.swap64=function(){var t=this.length;if(t%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var e=0;e<t;e+=8)De(this,e,e+7),De(this,e+1,e+6),De(this,e+2,e+5),De(this,e+3,e+4);return this},ve.prototype.toString=function(){var t=0|this.length;return 0===t?"":0===arguments.length?Ue(this,0,t):xe.apply(this,arguments)},ve.prototype.equals=function(t){if(!Re(t))throw new TypeError("Argument must be a Buffer");return this===t||0===ve.compare(this,t)},ve.prototype.inspect=function(){var t="";return this.length>0&&(t=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(t+=" ... ")),"<Buffer "+t+">"},ve.prototype.compare=function(t,e,r,i,s){if(!Re(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===i&&(i=0),void 0===s&&(s=this.length),e<0||r>t.length||i<0||s>this.length)throw new RangeError("out of range index");if(i>=s&&e>=r)return 0;if(i>=s)return-1;if(e>=r)return 1;if(this===t)return 0;for(var n=(s>>>=0)-(i>>>=0),a=(r>>>=0)-(e>>>=0),o=Math.min(n,a),c=this.slice(i,s),u=t.slice(e,r),l=0;l<o;++l)if(c[l]!==u[l]){n=c[l],a=u[l];break}return n<a?-1:a<n?1:0},ve.prototype.includes=function(t,e,r){return-1!==this.indexOf(t,e,r)},ve.prototype.indexOf=function(t,e,r){return Ae(this,t,e,r,!0)},ve.prototype.lastIndexOf=function(t,e,r){return Ae(this,t,e,r,!1)},ve.prototype.write=function(t,e,r,i){if(void 0===e)i="utf8",r=this.length,e=0;else if(void 0===r&&"string"==typeof e)i=e,r=this.length,e=0;else{if(!isFinite(e))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");e|=0,isFinite(r)?(r|=0,void 0===i&&(i="utf8")):(i=r,r=void 0)}var s=this.length-e;if((void 0===r||r>s)&&(r=s),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");for(var n=!1;;)switch(i){case"hex":return Pe(this,t,e,r);case"utf8":case"utf-8":return Ce(this,t,e,r);case"ascii":return Ie(this,t,e,r);case"latin1":case"binary":return Te(this,t,e,r);case"base64":return $e(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Me(this,t,e,r);default:if(n)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),n=!0}},ve.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var Fe=4096;function Be(t,e,r){var i="";r=Math.min(t.length,r);for(var s=e;s<r;++s)i+=String.fromCharCode(127&t[s]);return i}function qe(t,e,r){var i="";r=Math.min(t.length,r);for(var s=e;s<r;++s)i+=String.fromCharCode(t[s]);return i}function ze(t,e,r){var i=t.length;(!e||e<0)&&(e=0),(!r||r<0||r>i)&&(r=i);for(var s="",n=e;n<r;++n)s+=Ze(t[n]);return s}function Ve(t,e,r){for(var i=t.slice(e,r),s="",n=0;n<i.length;n+=2)s+=String.fromCharCode(i[n]+256*i[n+1]);return s}function Ke(t,e,r){if(t%1!=0||t<0)throw new RangeError("offset is not uint");if(t+e>r)throw new RangeError("Trying to access beyond buffer length")}function We(t,e,r,i,s,n){if(!Re(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>s||e<n)throw new RangeError('"value" argument is out of bounds');if(r+i>t.length)throw new RangeError("Index out of range")}function He(t,e,r,i){e<0&&(e=65535+e+1);for(var s=0,n=Math.min(t.length-r,2);s<n;++s)t[r+s]=(e&255<<8*(i?s:1-s))>>>8*(i?s:1-s)}function Je(t,e,r,i){e<0&&(e=4294967295+e+1);for(var s=0,n=Math.min(t.length-r,4);s<n;++s)t[r+s]=e>>>8*(i?s:3-s)&255}function Ye(t,e,r,i,s,n){if(r+i>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function Ge(t,e,r,i,s){return s||Ye(t,0,r,4),me(t,e,r,i,23,4),r+4}function Qe(t,e,r,i,s){return s||Ye(t,0,r,8),me(t,e,r,i,52,8),r+8}ve.prototype.slice=function(t,e){var r,i=this.length;if((t=~~t)<0?(t+=i)<0&&(t=0):t>i&&(t=i),(e=void 0===e?i:~~e)<0?(e+=i)<0&&(e=0):e>i&&(e=i),e<t&&(e=t),ve.TYPED_ARRAY_SUPPORT)(r=this.subarray(t,e)).__proto__=ve.prototype;else{var s=e-t;r=new ve(s,void 0);for(var n=0;n<s;++n)r[n]=this[n+t]}return r},ve.prototype.readUIntLE=function(t,e,r){t|=0,e|=0,r||Ke(t,e,this.length);for(var i=this[t],s=1,n=0;++n<e&&(s*=256);)i+=this[t+n]*s;return i},ve.prototype.readUIntBE=function(t,e,r){t|=0,e|=0,r||Ke(t,e,this.length);for(var i=this[t+--e],s=1;e>0&&(s*=256);)i+=this[t+--e]*s;return i},ve.prototype.readUInt8=function(t,e){return e||Ke(t,1,this.length),this[t]},ve.prototype.readUInt16LE=function(t,e){return e||Ke(t,2,this.length),this[t]|this[t+1]<<8},ve.prototype.readUInt16BE=function(t,e){return e||Ke(t,2,this.length),this[t]<<8|this[t+1]},ve.prototype.readUInt32LE=function(t,e){return e||Ke(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},ve.prototype.readUInt32BE=function(t,e){return e||Ke(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},ve.prototype.readIntLE=function(t,e,r){t|=0,e|=0,r||Ke(t,e,this.length);for(var i=this[t],s=1,n=0;++n<e&&(s*=256);)i+=this[t+n]*s;return i>=(s*=128)&&(i-=Math.pow(2,8*e)),i},ve.prototype.readIntBE=function(t,e,r){t|=0,e|=0,r||Ke(t,e,this.length);for(var i=e,s=1,n=this[t+--i];i>0&&(s*=256);)n+=this[t+--i]*s;return n>=(s*=128)&&(n-=Math.pow(2,8*e)),n},ve.prototype.readInt8=function(t,e){return e||Ke(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},ve.prototype.readInt16LE=function(t,e){e||Ke(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},ve.prototype.readInt16BE=function(t,e){e||Ke(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},ve.prototype.readInt32LE=function(t,e){return e||Ke(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},ve.prototype.readInt32BE=function(t,e){return e||Ke(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},ve.prototype.readFloatLE=function(t,e){return e||Ke(t,4,this.length),pe(this,t,!0,23,4)},ve.prototype.readFloatBE=function(t,e){return e||Ke(t,4,this.length),pe(this,t,!1,23,4)},ve.prototype.readDoubleLE=function(t,e){return e||Ke(t,8,this.length),pe(this,t,!0,52,8)},ve.prototype.readDoubleBE=function(t,e){return e||Ke(t,8,this.length),pe(this,t,!1,52,8)},ve.prototype.writeUIntLE=function(t,e,r,i){(t=+t,e|=0,r|=0,i)||We(this,t,e,r,Math.pow(2,8*r)-1,0);var s=1,n=0;for(this[e]=255&t;++n<r&&(s*=256);)this[e+n]=t/s&255;return e+r},ve.prototype.writeUIntBE=function(t,e,r,i){(t=+t,e|=0,r|=0,i)||We(this,t,e,r,Math.pow(2,8*r)-1,0);var s=r-1,n=1;for(this[e+s]=255&t;--s>=0&&(n*=256);)this[e+s]=t/n&255;return e+r},ve.prototype.writeUInt8=function(t,e,r){return t=+t,e|=0,r||We(this,t,e,1,255,0),ve.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},ve.prototype.writeUInt16LE=function(t,e,r){return t=+t,e|=0,r||We(this,t,e,2,65535,0),ve.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):He(this,t,e,!0),e+2},ve.prototype.writeUInt16BE=function(t,e,r){return t=+t,e|=0,r||We(this,t,e,2,65535,0),ve.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):He(this,t,e,!1),e+2},ve.prototype.writeUInt32LE=function(t,e,r){return t=+t,e|=0,r||We(this,t,e,4,4294967295,0),ve.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):Je(this,t,e,!0),e+4},ve.prototype.writeUInt32BE=function(t,e,r){return t=+t,e|=0,r||We(this,t,e,4,4294967295,0),ve.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):Je(this,t,e,!1),e+4},ve.prototype.writeIntLE=function(t,e,r,i){if(t=+t,e|=0,!i){var s=Math.pow(2,8*r-1);We(this,t,e,r,s-1,-s)}var n=0,a=1,o=0;for(this[e]=255&t;++n<r&&(a*=256);)t<0&&0===o&&0!==this[e+n-1]&&(o=1),this[e+n]=(t/a|0)-o&255;return e+r},ve.prototype.writeIntBE=function(t,e,r,i){if(t=+t,e|=0,!i){var s=Math.pow(2,8*r-1);We(this,t,e,r,s-1,-s)}var n=r-1,a=1,o=0;for(this[e+n]=255&t;--n>=0&&(a*=256);)t<0&&0===o&&0!==this[e+n+1]&&(o=1),this[e+n]=(t/a|0)-o&255;return e+r},ve.prototype.writeInt8=function(t,e,r){return t=+t,e|=0,r||We(this,t,e,1,127,-128),ve.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},ve.prototype.writeInt16LE=function(t,e,r){return t=+t,e|=0,r||We(this,t,e,2,32767,-32768),ve.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):He(this,t,e,!0),e+2},ve.prototype.writeInt16BE=function(t,e,r){return t=+t,e|=0,r||We(this,t,e,2,32767,-32768),ve.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):He(this,t,e,!1),e+2},ve.prototype.writeInt32LE=function(t,e,r){return t=+t,e|=0,r||We(this,t,e,4,2147483647,-2147483648),ve.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):Je(this,t,e,!0),e+4},ve.prototype.writeInt32BE=function(t,e,r){return t=+t,e|=0,r||We(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),ve.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):Je(this,t,e,!1),e+4},ve.prototype.writeFloatLE=function(t,e,r){return Ge(this,t,e,!0,r)},ve.prototype.writeFloatBE=function(t,e,r){return Ge(this,t,e,!1,r)},ve.prototype.writeDoubleLE=function(t,e,r){return Qe(this,t,e,!0,r)},ve.prototype.writeDoubleBE=function(t,e,r){return Qe(this,t,e,!1,r)},ve.prototype.copy=function(t,e,r,i){if(r||(r=0),i||0===i||(i=this.length),e>=t.length&&(e=t.length),e||(e=0),i>0&&i<r&&(i=r),i===r)return 0;if(0===t.length||0===this.length)return 0;if(e<0)throw new RangeError("targetStart out of bounds");if(r<0||r>=this.length)throw new RangeError("sourceStart out of bounds");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),t.length-e<i-r&&(i=t.length-e+r);var s,n=i-r;if(this===t&&r<e&&e<i)for(s=n-1;s>=0;--s)t[s+e]=this[s+r];else if(n<1e3||!ve.TYPED_ARRAY_SUPPORT)for(s=0;s<n;++s)t[s+e]=this[s+r];else Uint8Array.prototype.set.call(t,this.subarray(r,r+n),e);return n},ve.prototype.fill=function(t,e,r,i){if("string"==typeof t){if("string"==typeof e?(i=e,e=0,r=this.length):"string"==typeof r&&(i=r,r=this.length),1===t.length){var s=t.charCodeAt(0);s<256&&(t=s)}if(void 0!==i&&"string"!=typeof i)throw new TypeError("encoding must be a string");if("string"==typeof i&&!ve.isEncoding(i))throw new TypeError("Unknown encoding: "+i)}else"number"==typeof t&&(t&=255);if(e<0||this.length<e||this.length<r)throw new RangeError("Out of range index");if(r<=e)return this;var n;if(e>>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(n=e;n<r;++n)this[n]=t;else{var a=Re(t)?t:tr(new ve(t,i).toString()),o=a.length;for(n=0;n<r-e;++n)this[n+e]=a[n%o]}return this};var Xe=/[^+\/0-9A-Za-z-_]/g;function Ze(t){return t<16?"0"+t.toString(16):t.toString(16)}function tr(t,e){var r;e=e||1/0;for(var i=t.length,s=null,n=[],a=0;a<i;++a){if((r=t.charCodeAt(a))>55295&&r<57344){if(!s){if(r>56319){(e-=3)>-1&&n.push(239,191,189);continue}if(a+1===i){(e-=3)>-1&&n.push(239,191,189);continue}s=r;continue}if(r<56320){(e-=3)>-1&&n.push(239,191,189),s=r;continue}r=65536+(s-55296<<10|r-56320)}else s&&(e-=3)>-1&&n.push(239,191,189);if(s=null,r<128){if((e-=1)<0)break;n.push(r)}else if(r<2048){if((e-=2)<0)break;n.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;n.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;n.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return n}function er(t){return function(t){var e,r,i,s,n,a;ue||le();var o=t.length;if(o%4>0)throw new Error("Invalid string. Length must be a multiple of 4");n="="===t[o-2]?2:"="===t[o-1]?1:0,a=new ce(3*o/4-n),i=n>0?o-4:o;var c=0;for(e=0,r=0;e<i;e+=4,r+=3)s=oe[t.charCodeAt(e)]<<18|oe[t.charCodeAt(e+1)]<<12|oe[t.charCodeAt(e+2)]<<6|oe[t.charCodeAt(e+3)],a[c++]=s>>16&255,a[c++]=s>>8&255,a[c++]=255&s;return 2===n?(s=oe[t.charCodeAt(e)]<<2|oe[t.charCodeAt(e+1)]>>4,a[c++]=255&s):1===n&&(s=oe[t.charCodeAt(e)]<<10|oe[t.charCodeAt(e+1)]<<4|oe[t.charCodeAt(e+2)]>>2,a[c++]=s>>8&255,a[c++]=255&s),a}(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(Xe,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function rr(t,e,r,i){for(var s=0;s<i&&!(s+r>=e.length||s>=t.length);++s)e[s+r]=t[s];return s}function ir(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}function sr(){this.head=null,this.tail=null,this.length=0}sr.prototype.push=function(t){var e={data:t,next:null};this.length>0?this.tail.next=e:this.head=e,this.tail=e,++this.length},sr.prototype.unshift=function(t){var e={data:t,next:this.head};0===this.length&&(this.tail=e),this.head=e,++this.length},sr.prototype.shift=function(){if(0!==this.length){var t=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,t}},sr.prototype.clear=function(){this.head=this.tail=null,this.length=0},sr.prototype.join=function(t){if(0===this.length)return"";for(var e=this.head,r=""+e.data;e=e.next;)r+=t+e.data;return r},sr.prototype.concat=function(t){if(0===this.length)return ve.alloc(0);if(1===this.length)return this.head.data;for(var e=ve.allocUnsafe(t>>>0),r=this.head,i=0;r;)r.data.copy(e,i),i+=r.data.length,r=r.next;return e};var nr=ve.isEncoding||function(t){switch(t&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function ar(t){switch(this.encoding=(t||"utf8").toLowerCase().replace(/[-_]/,""),function(t){if(t&&!nr(t))throw new Error("Unknown encoding: "+t)}(t),this.encoding){case"utf8":this.surrogateSize=3;break;case"ucs2":case"utf16le":this.surrogateSize=2,this.detectIncompleteChar=cr;break;case"base64":this.surrogateSize=3,this.detectIncompleteChar=ur;break;default:return void(this.write=or)}this.charBuffer=new ve(6),this.charReceived=0,this.charLength=0}function or(t){return t.toString(this.encoding)}function cr(t){this.charReceived=t.length%2,this.charLength=this.charReceived?2:0}function ur(t){this.charReceived=t.length%3,this.charLength=this.charReceived?3:0}ar.prototype.write=function(t){for(var e="";this.charLength;){var r=t.length>=this.charLength-this.charReceived?this.charLength-this.charReceived:t.length;if(t.copy(this.charBuffer,this.charReceived,0,r),this.charReceived+=r,this.charReceived<this.charLength)return"";if(t=t.slice(r,t.length),!((s=(e=this.charBuffer.slice(0,this.charLength).toString(this.encoding)).charCodeAt(e.length-1))>=55296&&s<=56319)){if(this.charReceived=this.charLength=0,0===t.length)return e;break}this.charLength+=this.surrogateSize,e=""}this.detectIncompleteChar(t);var i=t.length;this.charLength&&(t.copy(this.charBuffer,0,t.length-this.charReceived,i),i-=this.charReceived);var s;i=(e+=t.toString(this.encoding,0,i)).length-1;if((s=e.charCodeAt(i))>=55296&&s<=56319){var n=this.surrogateSize;return this.charLength+=n,this.charReceived+=n,this.charBuffer.copy(this.charBuffer,n,0,n),t.copy(this.charBuffer,0,0,n),e.substring(0,i)}return e},ar.prototype.detectIncompleteChar=function(t){for(var e=t.length>=3?3:t.length;e>0;e--){var r=t[t.length-e];if(1==e&&r>>5==6){this.charLength=2;break}if(e<=2&&r>>4==14){this.charLength=3;break}if(e<=3&&r>>3==30){this.charLength=4;break}}this.charReceived=e},ar.prototype.end=function(t){var e="";if(t&&t.length&&(e=this.write(t)),this.charReceived){var r=this.charReceived,i=this.charBuffer,s=this.encoding;e+=i.slice(0,r).toString(s)}return e},fr.ReadableState=hr;var lr=function(t){if(Gt(Ut)&&(Ut=It.env.NODE_DEBUG||""),t=t.toUpperCase(),!Ft[t])if(new RegExp("\\b"+t+"\\b","i").test(Ut)){Ft[t]=function(){var e=Mt.apply(null,arguments);console.error("%s %d: %s",t,0,e)}}else Ft[t]=function(){};return Ft[t]}("stream");function hr(t,e){t=t||{},this.objectMode=!!t.objectMode,e instanceof Fr&&(this.objectMode=this.objectMode||!!t.readableObjectMode);var r=t.highWaterMark,i=this.objectMode?16:16384;this.highWaterMark=r||0===r?r:i,this.highWaterMark=~~this.highWaterMark,this.buffer=new sr,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.ranOut=!1,this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(this.decoder=new ar(t.encoding),this.encoding=t.encoding)}function fr(t){if(!(this instanceof fr))return new fr(t);this._readableState=new hr(t,this),this.readable=!0,t&&"function"==typeof t.read&&(this._read=t.read),et.call(this)}function dr(t,e,r,i,s){var n=function(t,e){var r=null;Buffer.isBuffer(e)||"string"==typeof e||null==e||t.objectMode||(r=new TypeError("Invalid non-string/buffer chunk"));return r}(e,r);if(n)t.emit("error",n);else if(null===r)e.reading=!1,function(t,e){if(e.ended)return;if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,gr(t)}(t,e);else if(e.objectMode||r&&r.length>0)if(e.ended&&!s){var a=new Error("stream.push() after EOF");t.emit("error",a)}else if(e.endEmitted&&s){var o=new Error("stream.unshift() after end event");t.emit("error",o)}else{var c;!e.decoder||s||i||(r=e.decoder.write(r),c=!e.objectMode&&0===r.length),s||(e.reading=!1),c||(e.flowing&&0===e.length&&!e.sync?(t.emit("data",r),t.read(0)):(e.length+=e.objectMode?1:r.length,s?e.buffer.unshift(r):e.buffer.push(r),e.needReadable&&gr(t))),function(t,e){e.readingMore||(e.readingMore=!0,Nt(br,t,e))}(t,e)}else s||(e.reading=!1);return function(t){return!t.ended&&(t.needReadable||t.length<t.highWaterMark||0===t.length)}(e)}Ct(fr,et),fr.prototype.push=function(t,e){var r=this._readableState;return r.objectMode||"string"!=typeof t||(e=e||r.defaultEncoding)!==r.encoding&&(t=Buffer.from(t,e),e=""),dr(this,r,t,e,!1)},fr.prototype.unshift=function(t){return dr(this,this._readableState,t,"",!0)},fr.prototype.isPaused=function(){return!1===this._readableState.flowing},fr.prototype.setEncoding=function(t){return this._readableState.decoder=new ar(t),this._readableState.encoding=t,this};var pr=8388608;function mr(t,e){return t<=0||0===e.length&&e.ended?0:e.objectMode?1:t!=t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=function(t){return t>=pr?t=pr:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}function gr(t){var e=t._readableState;e.needReadable=!1,e.emittedReadable||(lr("emitReadable",e.flowing),e.emittedReadable=!0,e.sync?Nt(yr,t):yr(t))}function yr(t){lr("emit readable"),t.emit("readable"),Sr(t)}function br(t,e){for(var r=e.length;!e.reading&&!e.flowing&&!e.ended&&e.length<e.highWaterMark&&(lr("maybeReadMore read 0"),t.read(0),r!==e.length);)r=e.length;e.readingMore=!1}function wr(t){lr("readable nexttick read 0"),t.read(0)}function vr(t,e){e.reading||(lr("resume read 0"),t.read(0)),e.resumeScheduled=!1,e.awaitDrain=0,t.emit("resume"),Sr(t),e.flowing&&!e.reading&&t.read(0)}function Sr(t){var e=t._readableState;for(lr("flow",e.flowing);e.flowing&&null!==t.read(););}function kr(t,e){return 0===e.length?null:(e.objectMode?r=e.buffer.shift():!t||t>=e.length?(r=e.decoder?e.buffer.join(""):1===e.buffer.length?e.buffer.head.data:e.buffer.concat(e.length),e.buffer.clear()):r=function(t,e,r){var i;t<e.head.data.length?(i=e.head.data.slice(0,t),e.head.data=e.head.data.slice(t)):i=t===e.head.data.length?e.shift():r?function(t,e){var r=e.head,i=1,s=r.data;t-=s.length;for(;r=r.next;){var n=r.data,a=t>n.length?n.length:t;if(a===n.length?s+=n:s+=n.slice(0,t),0===(t-=a)){a===n.length?(++i,r.next?e.head=r.next:e.head=e.tail=null):(e.head=r,r.data=n.slice(a));break}++i}return e.length-=i,s}(t,e):function(t,e){var r=Buffer.allocUnsafe(t),i=e.head,s=1;i.data.copy(r),t-=i.data.length;for(;i=i.next;){var n=i.data,a=t>n.length?n.length:t;if(n.copy(r,r.length-t,0,a),0===(t-=a)){a===n.length?(++s,i.next?e.head=i.next:e.head=e.tail=null):(e.head=i,i.data=n.slice(a));break}++s}return e.length-=s,r}(t,e);return i}(t,e.buffer,e.decoder),r);var r}function Or(t){var e=t._readableState;if(e.length>0)throw new Error('"endReadable()" called on non-empty stream');e.endEmitted||(e.ended=!0,Nt(_r,e,t))}function _r(t,e){t.endEmitted||0!==t.length||(t.endEmitted=!0,e.readable=!1,e.emit("end"))}function jr(t,e){for(var r=0,i=t.length;r<i;r++)if(t[r]===e)return r;return-1}function Rr(){}function Er(t,e,r){this.chunk=t,this.encoding=e,this.callback=r,this.next=null}function xr(t,e){Object.defineProperty(this,"buffer",{get:Lt(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.")}),t=t||{},this.objectMode=!!t.objectMode,e instanceof Fr&&(this.objectMode=this.objectMode||!!t.writableObjectMode);var r=t.highWaterMark,i=this.objectMode?16:16384;this.highWaterMark=r||0===r?r:i,this.highWaterMark=~~this.highWaterMark,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1;var s=!1===t.decodeStrings;this.decodeStrings=!s,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(t){!function(t,e){var r=t._writableState,i=r.sync,s=r.writecb;if(function(t){t.writing=!1,t.writecb=null,t.length-=t.writelen,t.writelen=0}(r),e)!function(t,e,r,i,s){--e.pendingcb,r?Nt(s,i):s(i);t._writableState.errorEmitted=!0,t.emit("error",i)}(t,r,i,e,s);else{var n=Cr(r);n||r.corked||r.bufferProcessing||!r.bufferedRequest||Pr(t,r),i?Nt(Nr,t,r,n,s):Nr(t,r,n,s)}}(e,t)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new $r(this)}function Dr(t){if(!(this instanceof Dr||this instanceof Fr))return new Dr(t);this._writableState=new xr(t,this),this.writable=!0,t&&("function"==typeof t.write&&(this._write=t.write),"function"==typeof t.writev&&(this._writev=t.writev)),et.call(this)}function Ar(t,e,r,i,s,n,a){e.writelen=i,e.writecb=a,e.writing=!0,e.sync=!0,r?t._writev(s,e.onwrite):t._write(s,n,e.onwrite),e.sync=!1}function Nr(t,e,r,i){r||function(t,e){0===e.length&&e.needDrain&&(e.needDrain=!1,t.emit("drain"))}(t,e),e.pendingcb--,i(),Tr(t,e)}function Pr(t,e){e.bufferProcessing=!0;var r=e.bufferedRequest;if(t._writev&&r&&r.next){var i=e.bufferedRequestCount,s=new Array(i),n=e.corkedRequestsFree;n.entry=r;for(var a=0;r;)s[a]=r,r=r.next,a+=1;Ar(t,e,!0,e.length,s,"",n.finish),e.pendingcb++,e.lastBufferedRequest=null,n.next?(e.corkedRequestsFree=n.next,n.next=null):e.corkedRequestsFree=new $r(e)}else{for(;r;){var o=r.chunk,c=r.encoding,u=r.callback;if(Ar(t,e,!1,e.objectMode?1:o.length,o,c,u),r=r.next,e.writing)break}null===r&&(e.lastBufferedRequest=null)}e.bufferedRequestCount=0,e.bufferedRequest=r,e.bufferProcessing=!1}function Cr(t){return t.ending&&0===t.length&&null===t.bufferedRequest&&!t.finished&&!t.writing}function Ir(t,e){e.prefinished||(e.prefinished=!0,t.emit("prefinish"))}function Tr(t,e){var r=Cr(e);return r&&(0===e.pendingcb?(Ir(t,e),e.finished=!0,t.emit("finish")):Ir(t,e)),r}function $r(t){var e=this;this.next=null,this.entry=null,this.finish=function(r){var i=e.entry;for(e.entry=null;i;){var s=i.callback;t.pendingcb--,s(r),i=i.next}t.corkedRequestsFree?t.corkedRequestsFree.next=e:t.corkedRequestsFree=e}}fr.prototype.read=function(t){lr("read",t),t=parseInt(t,10);var e=this._readableState,r=t;if(0!==t&&(e.emittedReadable=!1),0===t&&e.needReadable&&(e.length>=e.highWaterMark||e.ended))return lr("read: emitReadable",e.length,e.ended),0===e.length&&e.ended?Or(this):gr(this),null;if(0===(t=mr(t,e))&&e.ended)return 0===e.length&&Or(this),null;var i,s=e.needReadable;return lr("need readable",s),(0===e.length||e.length-t<e.highWaterMark)&&lr("length less than watermark",s=!0),e.ended||e.reading?lr("reading or ended",s=!1):s&&(lr("do read"),e.reading=!0,e.sync=!0,0===e.length&&(e.needReadable=!0),this._read(e.highWaterMark),e.sync=!1,e.reading||(t=mr(r,e))),null===(i=t>0?kr(t,e):null)?(e.needReadable=!0,t=0):e.length-=t,0===e.length&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&Or(this)),null!==i&&this.emit("data",i),i},fr.prototype._read=function(t){this.emit("error",new Error("not implemented"))},fr.prototype.pipe=function(t,e){var r=this,i=this._readableState;switch(i.pipesCount){case 0:i.pipes=t;break;case 1:i.pipes=[i.pipes,t];break;default:i.pipes.push(t)}i.pipesCount+=1,lr("pipe count=%d opts=%j",i.pipesCount,e);var s=!e||!1!==e.end?a:u;function n(t){lr("onunpipe"),t===r&&u()}function a(){lr("onend"),t.end()}i.endEmitted?Nt(s):r.once("end",s),t.on("unpipe",n);var o=function(t){return function(){var e=t._readableState;lr("pipeOnDrain",e.awaitDrain),e.awaitDrain&&e.awaitDrain--,0===e.awaitDrain&&t.listeners("data").length&&(e.flowing=!0,Sr(t))}}(r);t.on("drain",o);var c=!1;function u(){lr("cleanup"),t.removeListener("close",d),t.removeListener("finish",p),t.removeListener("drain",o),t.removeListener("error",f),t.removeListener("unpipe",n),r.removeListener("end",a),r.removeListener("end",u),r.removeListener("data",h),c=!0,!i.awaitDrain||t._writableState&&!t._writableState.needDrain||o()}var l=!1;function h(e){lr("ondata"),l=!1,!1!==t.write(e)||l||((1===i.pipesCount&&i.pipes===t||i.pipesCount>1&&-1!==jr(i.pipes,t))&&!c&&(lr("false write response, pause",r._readableState.awaitDrain),r._readableState.awaitDrain++,l=!0),r.pause())}function f(e){var r;lr("onerror",e),m(),t.removeListener("error",f),0===(r="error",t.listeners(r).length)&&t.emit("error",e)}function d(){t.removeListener("finish",p),m()}function p(){lr("onfinish"),t.removeListener("close",d),m()}function m(){lr("unpipe"),r.unpipe(t)}return r.on("data",h),function(t,e,r){if("function"==typeof t.prependListener)return t.prependListener(e,r);t._events&&t._events[e]?Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]:t.on(e,r)}(t,"error",f),t.once("close",d),t.once("finish",p),t.emit("pipe",r),i.flowing||(lr("pipe resume"),r.resume()),t},fr.prototype.unpipe=function(t){var e=this._readableState;if(0===e.pipesCount)return this;if(1===e.pipesCount)return t&&t!==e.pipes||(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this)),this;if(!t){var r=e.pipes,i=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var s=0;s<i;s++)r[s].emit("unpipe",this);return this}var n=jr(e.pipes,t);return-1===n||(e.pipes.splice(n,1),e.pipesCount-=1,1===e.pipesCount&&(e.pipes=e.pipes[0]),t.emit("unpipe",this)),this},fr.prototype.on=function(t,e){var r=et.prototype.on.call(this,t,e);if("data"===t)!1!==this._readableState.flowing&&this.resume();else if("readable"===t){var i=this._readableState;i.endEmitted||i.readableListening||(i.readableListening=i.needReadable=!0,i.emittedReadable=!1,i.reading?i.length&&gr(this):Nt(wr,this))}return r},fr.prototype.addListener=fr.prototype.on,fr.prototype.resume=function(){var t=this._readableState;return t.flowing||(lr("resume"),t.flowing=!0,function(t,e){e.resumeScheduled||(e.resumeScheduled=!0,Nt(vr,t,e))}(this,t)),this},fr.prototype.pause=function(){return lr("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(lr("pause"),this._readableState.flowing=!1,this.emit("pause")),this},fr.prototype.wrap=function(t){var e=this._readableState,r=!1,i=this;for(var s in t.on("end",function(){if(lr("wrapped end"),e.decoder&&!e.ended){var t=e.decoder.end();t&&t.length&&i.push(t)}i.push(null)}),t.on("data",function(s){(lr("wrapped data"),e.decoder&&(s=e.decoder.write(s)),e.objectMode&&null==s)||(e.objectMode||s&&s.length)&&(i.push(s)||(r=!0,t.pause()))}),t)void 0===this[s]&&"function"==typeof t[s]&&(this[s]=function(e){return function(){return t[e].apply(t,arguments)}}(s));return function(t,e){for(var r=0,i=t.length;r<i;r++)e(t[r],r)}(["error","close","destroy","pause","resume"],function(e){t.on(e,i.emit.bind(i,e))}),i._read=function(e){lr("wrapped _read",e),r&&(r=!1,t.resume())},i},fr._fromList=kr,Dr.WritableState=xr,Ct(Dr,et),xr.prototype.getBuffer=function(){for(var t=this.bufferedRequest,e=[];t;)e.push(t),t=t.next;return e},Dr.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},Dr.prototype.write=function(t,e,r){var i=this._writableState,s=!1;return"function"==typeof e&&(r=e,e=null),ve.isBuffer(t)?e="buffer":e||(e=i.defaultEncoding),"function"!=typeof r&&(r=Rr),i.ended?function(t,e){var r=new Error("write after end");t.emit("error",r),Nt(e,r)}(this,r):function(t,e,r,i){var s=!0,n=!1;return null===r?n=new TypeError("May not write null values to stream"):ve.isBuffer(r)||"string"==typeof r||void 0===r||e.objectMode||(n=new TypeError("Invalid non-string/buffer chunk")),n&&(t.emit("error",n),Nt(i,n),s=!1),s}(this,i,t,r)&&(i.pendingcb++,s=function(t,e,r,i,s){r=function(t,e,r){t.objectMode||!1===t.decodeStrings||"string"!=typeof e||(e=ve.from(e,r));return e}(e,r,i),ve.isBuffer(r)&&(i="buffer");var n=e.objectMode?1:r.length;e.length+=n;var a=e.length<e.highWaterMark;a||(e.needDrain=!0);if(e.writing||e.corked){var o=e.lastBufferedRequest;e.lastBufferedRequest=new Er(r,i,s),o?o.next=e.lastBufferedRequest:e.bufferedRequest=e.lastBufferedRequest,e.bufferedRequestCount+=1}else Ar(t,e,!1,n,r,i,s);return a}(this,i,t,e,r)),s},Dr.prototype.cork=function(){this._writableState.corked++},Dr.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,t.writing||t.corked||t.finished||t.bufferProcessing||!t.bufferedRequest||Pr(this,t))},Dr.prototype.setDefaultEncoding=function(t){if("string"==typeof t&&(t=t.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((t+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+t);return this._writableState.defaultEncoding=t,this},Dr.prototype._write=function(t,e,r){r(new Error("not implemented"))},Dr.prototype._writev=null,Dr.prototype.end=function(t,e,r){var i=this._writableState;"function"==typeof t?(r=t,t=null,e=null):"function"==typeof e&&(r=e,e=null),null!=t&&this.write(t,e),i.corked&&(i.corked=1,this.uncork()),i.ending||i.finished||function(t,e,r){e.ending=!0,Tr(t,e),r&&(e.finished?Nt(r):t.once("finish",r));e.ended=!0,t.writable=!1}(this,i,r)},Ct(Fr,fr);for(var Mr=Object.keys(Dr.prototype),Lr=0;Lr<Mr.length;Lr++){var Ur=Mr[Lr];Fr.prototype[Ur]||(Fr.prototype[Ur]=Dr.prototype[Ur])}function Fr(t){if(!(this instanceof Fr))return new Fr(t);fr.call(this,t),Dr.call(this,t),t&&!1===t.readable&&(this.readable=!1),t&&!1===t.writable&&(this.writable=!1),this.allowHalfOpen=!0,t&&!1===t.allowHalfOpen&&(this.allowHalfOpen=!1),this.once("end",Br)}function Br(){this.allowHalfOpen||this._writableState.ended||Nt(qr,this)}function qr(t){t.end()}function zr(t){this.afterTransform=function(e,r){return function(t,e,r){var i=t._transformState;i.transforming=!1;var s=i.writecb;if(!s)return t.emit("error",new Error("no writecb in Transform class"));i.writechunk=null,i.writecb=null,null!=r&&t.push(r);s(e);var n=t._readableState;n.reading=!1,(n.needReadable||n.length<n.highWaterMark)&&t._read(n.highWaterMark)}(t,e,r)},this.needTransform=!1,this.transforming=!1,this.writecb=null,this.writechunk=null,this.writeencoding=null}function Vr(t){if(!(this instanceof Vr))return new Vr(t);Fr.call(this,t),this._transformState=new zr(this);var e=this;this._readableState.needReadable=!0,this._readableState.sync=!1,t&&("function"==typeof t.transform&&(this._transform=t.transform),"function"==typeof t.flush&&(this._flush=t.flush)),this.once("prefinish",function(){"function"==typeof this._flush?this._flush(function(t){Kr(e,t)}):Kr(e)})}function Kr(t,e){if(e)return t.emit("error",e);var r=t._writableState,i=t._transformState;if(r.length)throw new Error("Calling transform done when ws.length != 0");if(i.transforming)throw new Error("Calling transform done when still transforming");return t.push(null)}function Wr(t){if(!(this instanceof Wr))return new Wr(t);Vr.call(this,t)}function Hr(){et.call(this)}Ct(Vr,Fr),Vr.prototype.push=function(t,e){return this._transformState.needTransform=!1,Fr.prototype.push.call(this,t,e)},Vr.prototype._transform=function(t,e,r){throw new Error("Not implemented")},Vr.prototype._write=function(t,e,r){var i=this._transformState;if(i.writecb=r,i.writechunk=t,i.writeencoding=e,!i.transforming){var s=this._readableState;(i.needTransform||s.needReadable||s.length<s.highWaterMark)&&this._read(s.highWaterMark)}},Vr.prototype._read=function(t){var e=this._transformState;null!==e.writechunk&&e.writecb&&!e.transforming?(e.transforming=!0,this._transform(e.writechunk,e.writeencoding,e.afterTransform)):e.needTransform=!0},Ct(Wr,Vr),Wr.prototype._transform=function(t,e,r){r(null,t)},Ct(Hr,et),Hr.Readable=fr,Hr.Writable=Dr,Hr.Duplex=Fr,Hr.Transform=Vr,Hr.PassThrough=Wr,Hr.Stream=Hr,Hr.prototype.pipe=function(t,e){var r=this;function i(e){t.writable&&!1===t.write(e)&&r.pause&&r.pause()}function s(){r.readable&&r.resume&&r.resume()}r.on("data",i),t.on("drain",s),t._isStdio||e&&!1===e.end||(r.on("end",a),r.on("close",o));var n=!1;function a(){n||(n=!0,t.end())}function o(){n||(n=!0,"function"==typeof t.destroy&&t.destroy())}function c(t){if(u(),0===et.listenerCount(this,"error"))throw t}function u(){r.removeListener("data",i),t.removeListener("drain",s),r.removeListener("end",a),r.removeListener("close",o),r.removeListener("error",c),t.removeListener("error",c),r.removeListener("end",u),r.removeListener("close",u),t.removeListener("close",u)}return r.on("error",c),t.on("error",c),r.on("end",u),r.on("close",u),t.on("close",u),t.emit("pipe",r),t};class Jr extends et{constructor({resource:t}){super(),this.resource=t,this.client=t.client,this.stream=new s.ReadableStream({highWaterMark:3*this.client.parallelism,start:this._start.bind(this),pull:this._pull.bind(this),cancel:this._cancel.bind(this)})}build(){return this.stream.getReader()}async _start(t){this.controller=t,this.continuationToken=null,this.closeNextIteration=!1}async _pull(t){if(this.closeNextIteration)return void t.close();const e=await this.client.listObjects({prefix:`resource=${this.resource.name}`,continuationToken:this.continuationToken}),r=e?.Contents.map(t=>t.Key).map(t=>t.replace(this.client.config.keyPrefix,"")).map(t=>t.startsWith("/")?t.replace("/",""):t).map(t=>t.replace(`resource=${this.resource.name}/id=`,""));this.continuationToken=e.NextContinuationToken,this.enqueue(r),e.IsTruncated||(this.closeNextIteration=!0)}enqueue(t){t.forEach(t=>{this.controller.enqueue(t),this.emit("id",t)})}_cancel(t){}}var Yr=Jr;class Gr extends Yr{enqueue(t){this.controller.enqueue(t),this.emit("page",t)}}class Qr extends et{constructor({resource:t,batchSize:e=10,concurrency:r=5}){if(super(),!t)throw new Error("Resource is required for ResourceReader");this.resource=t,this.client=t.client,this.batchSize=e,this.concurrency=r,this.input=new Gr({resource:this.resource}),this.transform=new Vr({objectMode:!0,transform:this._transform.bind(this)}),this.input.on("data",t=>{this.transform.write(t)}),this.input.on("end",()=>{this.transform.end()}),this.input.on("error",t=>{this.emit("error",t)}),this.transform.on("data",t=>{this.emit("data",t)}),this.transform.on("end",()=>{this.emit("end")}),this.transform.on("error",t=>{this.emit("error",t)})}build(){return this}async _transform(t,e,r){const[s,n]=await V(async()=>{await i.PromisePool.for(t).withConcurrency(this.concurrency).handleError(async(t,e)=>{this.emit("error",t,e)}).process(async t=>{const e=await this.resource.get(t);return this.push(e),e})});r(n)}resume(){this.input.resume()}}class Xr extends et{constructor({resource:t,batchSize:e=10,concurrency:r=5}){super(),this.resource=t,this.client=t.client,this.batchSize=e,this.concurrency=r,this.buffer=[],this.writing=!1,this.writable=new Dr({objectMode:!0,write:this._write.bind(this)}),this.writable.on("finish",()=>{this.emit("finish")}),this.writable.on("error",t=>{this.emit("error",t)})}build(){return this}write(t){return this.buffer.push(t),this._maybeWrite().catch(t=>{this.emit("error",t)}),!0}end(){this.ended=!0,this._maybeWrite().catch(t=>{this.emit("error",t)})}async _maybeWrite(){if(!this.writing&&(0!==this.buffer.length||this.ended)){for(this.writing=!0;this.buffer.length>0;){const t=this.buffer.splice(0,this.batchSize),[e,r]=await V(async()=>{await i.PromisePool.for(t).withConcurrency(this.concurrency).handleError(async(t,e)=>{this.emit("error",t,e)}).process(async t=>{const[e,r,i]=await V(async()=>await this.resource.insert(t));return e?i:(this.emit("error",r,t),null)})});e||this.emit("error",r)}this.writing=!1,this.ended&&this.writable.emit("finish")}}async _write(t,e,r){r()}}function Zr(t){return new Promise((e,r)=>{if(!t)return r(new Error("streamToString: stream is undefined"));const i=[];t.on("data",t=>i.push(t)),t.on("error",r),t.on("end",()=>e(Buffer.concat(i).toString("utf-8")))})}var ti=class extends wt{constructor({client:t,keyPrefix:e="cache",ttl:r=0,prefix:i}){super({client:t,keyPrefix:e,ttl:r,prefix:i}),this.client=t,this.keyPrefix=e,this.config.ttl=r,this.config.client=t,this.config.prefix=void 0!==i?i:e+(e.endsWith("/")?"":"/")}async _set(t,e){let i=JSON.stringify(e);const s=i.length;return i=r.gzipSync(i).toString("base64"),this.client.putObject({key:mt(this.keyPrefix,t),body:i,contentEncoding:"gzip",contentType:"application/gzip",metadata:{compressor:"zlib",compressed:"true","client-id":this.client.id,"length-serialized":String(s),"length-compressed":String(i.length),"compression-gain":(i.length/s).toFixed(2)}})}async _get(t){const[e,i,s]=await V(async()=>{const{Body:e}=await this.client.getObject(mt(this.keyPrefix,t));let i=await Zr(e);return i=Buffer.from(i,"base64"),i=r.unzipSync(i).toString(),JSON.parse(i)});if(e)return s;if("NoSuchKey"===i.name||"NotFound"===i.name)return null;throw i}async _del(t){return await this.client.deleteObject(mt(this.keyPrefix,t)),!0}async _clear(){const t=await this.client.getAllKeys({prefix:this.keyPrefix});await this.client.deleteObjects(t)}async size(){return(await this.keys()).length}async keys(){const t=await this.client.getAllKeys({prefix:this.keyPrefix}),e=this.keyPrefix.endsWith("/")?this.keyPrefix:this.keyPrefix+"/";return t.map(t=>t.startsWith(e)?t.slice(e.length):t)}};var ei=class extends wt{constructor(t={}){super(t),this.cache={},this.meta={},this.maxSize=t.maxSize||0,this.ttl=t.ttl||0}async _set(t,e){if(this.maxSize>0&&Object.keys(this.cache).length>=this.maxSize){const t=Object.entries(this.meta).sort((t,e)=>t[1].ts-e[1].ts)[0]?.[0];t&&(delete this.cache[t],delete this.meta[t])}return this.cache[t]=e,this.meta[t]={ts:Date.now()},e}async _get(t){if(!Object.prototype.hasOwnProperty.call(this.cache,t))return null;if(this.ttl>0){const e=Date.now(),r=this.meta[t];if(r&&e-r.ts>1e3*this.ttl)return delete this.cache[t],delete this.meta[t],null}return this.cache[t]}async _del(t){return delete this.cache[t],delete this.meta[t],!0}async _clear(t){if(!t)return this.cache={},this.meta={},!0;for(const e of Object.keys(this.cache))e.startsWith(t)&&(delete this.cache[e],delete this.meta[e]);return!0}async size(){return Object.keys(this.cache).length}async keys(){return Object.keys(this.cache)}},ri={};const ii=ne(ri.readFile),si=ne(ri.writeFile),ni=ne(ri.unlink),ai=ne(ri.readdir),oi=ne(ri.stat),ci=ne(ri.mkdir);class ui extends wt{constructor({directory:t,prefix:e="cache",ttl:r=36e5,enableCompression:i=!0,compressionThreshold:s=1024,createDirectory:n=!0,fileExtension:a=".cache",enableMetadata:o=!0,maxFileSize:c=10485760,enableStats:u=!1,enableCleanup:l=!0,cleanupInterval:h=3e5,encoding:f="utf8",fileMode:d=420,enableBackup:p=!1,backupSuffix:m=".bak",enableLocking:g=!1,lockTimeout:y=5e3,enableJournal:b=!1,journalFile:w="cache.journal",...v}){if(super(v),!t)throw new Error("FilesystemCache: directory parameter is required");this.directory=gt.resolve(t),this.prefix=e,this.ttl=r,this.enableCompression=i,this.compressionThreshold=s,this.createDirectory=n,this.fileExtension=a,this.enableMetadata=o,this.maxFileSize=c,this.enableStats=u,this.enableCleanup=l,this.cleanupInterval=h,this.encoding=f,this.fileMode=d,this.enableBackup=p,this.backupSuffix=m,this.enableLocking=g,this.lockTimeout=y,this.enableJournal=b,this.journalFile=gt.join(this.directory,w),this.stats={hits:0,misses:0,sets:0,deletes:0,clears:0,errors:0},this.locks=new Map,this.cleanupTimer=null,this._init()}async _init(){this.createDirectory&&await this._ensureDirectory(this.directory),this.enableCleanup&&this.cleanupInterval>0&&(this.cleanupTimer=setInterval(()=>{this._cleanup().catch(t=>{console.warn("FilesystemCache cleanup error:",t.message)})},this.cleanupInterval))}async _ensureDirectory(t){const[e,r]=await V(async()=>{await ci(t,{recursive:!0})});if(!e&&"EEXIST"!==r.code)throw new Error(`Failed to create cache directory: ${r.message}`)}_getFilePath(t){const e=t.replace(/[<>:"/\\|?*]/g,"_"),r=`${this.prefix}_${e}${this.fileExtension}`;return gt.join(this.directory,r)}_getMetadataPath(t){return t+".meta"}async _set(t,e){const i=this._getFilePath(t);try{let s=JSON.stringify(e);const n=Buffer.byteLength(s,this.encoding);if(n>this.maxFileSize)throw new Error(`Cache data exceeds maximum file size: ${n} > ${this.maxFileSize}`);let a=!1,o=s;if(this.enableCompression&&n>=this.compressionThreshold){o=r.gzipSync(Buffer.from(s,this.encoding)).toString("base64"),a=!0}if(this.enableBackup&&await this._fileExists(i)){const t=i+this.backupSuffix;await this._copyFile(i,t)}this.enableLocking&&await this._acquireLock(i);try{if(await si(i,o,{encoding:a?"utf8":this.encoding,mode:this.fileMode}),this.enableMetadata){const e={key:t,timestamp:Date.now(),ttl:this.ttl,compressed:a,originalSize:n,compressedSize:a?Buffer.byteLength(o,"utf8"):n,compressionRatio:a?(Buffer.byteLength(o,"utf8")/n).toFixed(2):1};await si(this._getMetadataPath(i),JSON.stringify(e),{encoding:this.encoding,mode:this.fileMode})}this.enableStats&&this.stats.sets++,this.enableJournal&&await this._journalOperation("set",t,{size:n,compressed:a})}finally{this.enableLocking&&this._releaseLock(i)}return e}catch(e){throw this.enableStats&&this.stats.errors++,new Error(`Failed to set cache key '${t}': ${e.message}`)}}async _get(t){const e=this._getFilePath(t);try{if(!await this._fileExists(e))return this.enableStats&&this.stats.misses++,null;let i=!1;if(this.enableMetadata){const t=this._getMetadataPath(e);if(await this._fileExists(t)){const[e,r,s]=await V(async()=>{const e=await ii(t,this.encoding);return JSON.parse(e)});if(e&&s.ttl>0){i=Date.now()-s.timestamp>s.ttl}}}else if(this.ttl>0){const t=await oi(e);i=Date.now()-t.mtime.getTime()>this.ttl}if(i)return await this._del(t),this.enableStats&&this.stats.misses++,null;this.enableLocking&&await this._acquireLock(e);try{const t=await ii(e,this.encoding);let i=!1;if(this.enableMetadata){const t=this._getMetadataPath(e);if(await this._fileExists(t)){const[e,r,s]=await V(async()=>{const e=await ii(t,this.encoding);return JSON.parse(e)});e&&(i=s.compressed)}}let s=t;if(i||this.enableCompression&&t.match(/^[A-Za-z0-9+/=]+$/))try{const e=Buffer.from(t,"base64");s=r.gunzipSync(e).toString(this.encoding)}catch(e){s=t}const n=JSON.parse(s);return this.enableStats&&this.stats.hits++,n}finally{this.enableLocking&&this._releaseLock(e)}}catch(e){return this.enableStats&&this.stats.errors++,await this._del(t),null}}async _del(t){const e=this._getFilePath(t);try{if(await this._fileExists(e)&&await ni(e),this.enableMetadata){const t=this._getMetadataPath(e);await this._fileExists(t)&&await ni(t)}if(this.enableBackup){const t=e+this.backupSuffix;await this._fileExists(t)&&await ni(t)}return this.enableStats&&this.stats.deletes++,this.enableJournal&&await this._journalOperation("delete",t),!0}catch(e){throw this.enableStats&&this.stats.errors++,new Error(`Failed to delete cache key '${t}': ${e.message}`)}}async _clear(t){try{const e=(await ai(this.directory)).filter(e=>{if(!e.startsWith(this.prefix))return!1;if(!e.endsWith(this.fileExtension))return!1;if(t){return e.slice(this.prefix.length+1,-this.fileExtension.length).startsWith(t)}return!0});for(const t of e){const e=gt.join(this.directory,t);if(await this._fileExists(e)&&await ni(e),this.enableMetadata){const t=this._getMetadataPath(e);await this._fileExists(t)&&await ni(t)}if(this.enableBackup){const t=e+this.backupSuffix;await this._fileExists(t)&&await ni(t)}}return this.enableStats&&this.stats.clears++,this.enableJournal&&await this._journalOperation("clear",t||"all",{count:e.length}),!0}catch(t){throw this.enableStats&&this.stats.errors++,new Error(`Failed to clear cache: ${t.message}`)}}async size(){return(await this.keys()).length}async keys(){try{const t=(await ai(this.directory)).filter(t=>t.startsWith(this.prefix)&&t.endsWith(this.fileExtension));return t.map(t=>t.slice(this.prefix.length+1,-this.fileExtension.length))}catch(t){return console.warn("FilesystemCache: Failed to list keys:",t.message),[]}}async _fileExists(t){const[e]=await V(async()=>{await oi(t)});return e}async _copyFile(t,e){const[r,i]=await V(async()=>{const r=await ii(t);await si(e,r)});r||console.warn("FilesystemCache: Failed to create backup:",i.message)}async _cleanup(){if(this.ttl&&!(this.ttl<=0))try{const t=await ai(this.directory),e=Date.now();for(const r of t){if(!r.startsWith(this.prefix)||!r.endsWith(this.fileExtension))continue;const t=gt.join(this.directory,r);let i=!1;if(this.enableMetadata){const r=this._getMetadataPath(t);if(await this._fileExists(r)){const[t,s,n]=await V(async()=>{const t=await ii(r,this.encoding);return JSON.parse(t)});if(t&&n.ttl>0){i=e-n.timestamp>n.ttl}}}else{const[r,s,n]=await V(async()=>await oi(t));if(r){i=e-n.mtime.getTime()>this.ttl}}if(i){const t=r.slice(this.prefix.length+1,-this.fileExtension.length);await this._del(t)}}}catch(t){console.warn("FilesystemCache cleanup error:",t.message)}}async _acquireLock(t){if(!this.enableLocking)return;const e=t,r=Date.now();for(;this.locks.has(e);){if(Date.now()-r>this.lockTimeout)throw new Error(`Lock timeout for file: ${t}`);await new Promise(t=>setTimeout(t,10))}this.locks.set(e,Date.now())}_releaseLock(t){this.enableLocking&&this.locks.delete(t)}async _journalOperation(t,e,r={}){if(!this.enableJournal)return;const i={timestamp:(new Date).toISOString(),operation:t,key:e,metadata:r},[s,n]=await V(async()=>{const t=JSON.stringify(i)+"\n";await ri.promises.appendFile(this.journalFile,t,this.encoding)});s||console.warn("FilesystemCache journal error:",n.message)}destroy(){this.cleanupTimer&&(clearInterval(this.cleanupTimer),this.cleanupTimer=null)}getStats(){return{...this.stats,directory:this.directory,ttl:this.ttl,compression:this.enableCompression,metadata:this.enableMetadata,cleanup:this.enableCleanup,locking:this.enableLocking,journal:this.enableJournal}}}ne(ri.mkdir);const li=ne(ri.rm),hi=ne(ri.readdir),fi=ne(ri.stat),di=ne(ri.writeFile),pi=ne(ri.readFile);class mi extends ui{constructor({partitionStrategy:t="hierarchical",trackUsage:e=!0,preloadRelated:r=!1,preloadThreshold:i=10,maxCacheSize:s=null,usageStatsFile:n="partition-usage.json",...a}){super(a),this.partitionStrategy=t,this.trackUsage=e,this.preloadRelated=r,this.preloadThreshold=i,this.maxCacheSize=s,this.usageStatsFile=gt.join(this.directory,n),this.partitionUsage=new Map,this.loadUsageStats()}_getPartitionCacheKey(t,e,r,i={},s={}){const n=[`resource=${t}`,`action=${e}`];if(r&&Object.keys(i).length>0){n.push(`partition=${r}`);const t=Object.entries(i).sort(([t],[e])=>t.localeCompare(e));for(const[e,r]of t)null!=r&&n.push(`${e}=${r}`)}if(Object.keys(s).length>0){const t=Object.entries(s).sort(([t],[e])=>t.localeCompare(e)).map(([t,e])=>`${t}=${e}`).join("|");n.push(`params=${Buffer.from(t).toString("base64")}`)}return n.join("/")+this.fileExtension}_getPartitionDirectory(t,e,r={}){const i=gt.join(this.directory,`resource=${t}`);if(!e)return i;if("flat"===this.partitionStrategy)return gt.join(i,"partitions");if("temporal"===this.partitionStrategy&&this._isTemporalPartition(e,r))return this._getTemporalDirectory(i,e,r);const s=[i,`partition=${e}`],n=Object.entries(r).sort(([t],[e])=>t.localeCompare(e));for(const[t,e]of n)null!=e&&s.push(`${t}=${this._sanitizePathValue(e)}`);return gt.join(...s)}async _set(t,e,r={}){const{resource:i,action:s,partition:n,partitionValues:a,params:o}=r;if(i&&n){const t=this._getPartitionCacheKey(i,s,n,a,o),r=this._getPartitionDirectory(i,n,a);await this._ensureDirectory(r);const c=gt.join(r,this._sanitizeFileName(t));this.trackUsage&&await this._trackPartitionUsage(i,n,a);const u={data:e,metadata:{resource:i,partition:n,partitionValues:a,timestamp:Date.now(),ttl:this.ttl}};return this._writeFileWithMetadata(c,u)}return super._set(t,e)}async _get(t,e={}){const{resource:r,action:i,partition:s,partitionValues:n,params:a}=e;if(r&&s){const t=this._getPartitionCacheKey(r,i,s,n,a),e=this._getPartitionDirectory(r,s,n),o=gt.join(e,this._sanitizeFileName(t));if(!await this._fileExists(o))return this.preloadRelated&&await this._preloadRelatedPartitions(r,s,n),null;const c=await this._readFileWithMetadata(o);return c&&this.trackUsage&&await this._trackPartitionUsage(r,s,n),c?.data||null}return super._get(t)}async clearPartition(t,e,r={}){const i=this._getPartitionDirectory(t,e,r),[s,n]=await V(async()=>{await this._fileExists(i)&&await li(i,{recursive:!0})});s||console.warn(`Failed to clear partition cache: ${n.message}`);const a=this._getUsageKey(t,e,r);return this.partitionUsage.delete(a),await this._saveUsageStats(),s}async clearResourcePartitions(t){const e=gt.join(this.directory,`resource=${t}`),[r,i]=await V(async()=>{await this._fileExists(e)&&await li(e,{recursive:!0})});for(const[e]of this.partitionUsage.entries())e.startsWith(`${t}/`)&&this.partitionUsage.delete(e);return await this._saveUsageStats(),r}async getPartitionStats(t,e=null){const r={totalFiles:0,totalSize:0,partitions:{},usage:{}},i=gt.join(this.directory,`resource=${t}`);if(!await this._fileExists(i))return r;await this._calculateDirectoryStats(i,r);for(const[i,s]of this.partitionUsage.entries())if(i.startsWith(`${t}/`)){const t=i.split("/")[1];e&&t!==e||(r.usage[t]=s)}return r}async getCacheRecommendations(t){const e=[],r=Date.now();for(const[i,s]of this.partitionUsage.entries())if(i.startsWith(`${t}/`)){const[,t]=i.split("/"),n=(r-s.lastAccess)/864e5,a=s.count/Math.max(1,n);let o="keep",c=s.count;n>30?(o="archive",c=0):a<.1?(o="reduce_ttl",c=1):a>10&&(o="preload",c=100),e.push({partition:t,recommendation:o,priority:c,usage:a,lastAccess:new Date(s.lastAccess).toISOString()})}return e.sort((t,e)=>e.priority-t.priority)}async warmPartitionCache(t,e={}){const{partitions:r=[],maxFiles:i=1e3}=e;let s=0;for(const e of r){const r=`${t}/${e}`,n=this.partitionUsage.get(r);if(n&&n.count>=this.preloadThreshold&&(console.log(`🔥 Warming cache for ${t}/${e} (${n.count} accesses)`),s++),s>=i)break}return s}async _trackPartitionUsage(t,e,r){const i=this._getUsageKey(t,e,r),s=this.partitionUsage.get(i)||{count:0,firstAccess:Date.now(),lastAccess:Date.now()};s.count++,s.lastAccess=Date.now(),this.partitionUsage.set(i,s),s.count%10==0&&await this._saveUsageStats()}_getUsageKey(t,e,r){const i=Object.entries(r).sort(([t],[e])=>t.localeCompare(e)).map(([t,e])=>`${t}=${e}`).join("|");return`${t}/${e}/${i}`}async _preloadRelatedPartitions(t,e,r){console.log(`🎯 Preloading related partitions for ${t}/${e}`),r.timestamp||r.date}_isTemporalPartition(t,e){const r=["date","timestamp","createdAt","updatedAt"];return Object.keys(e).some(t=>r.some(e=>t.toLowerCase().includes(e)))}_getTemporalDirectory(t,e,r){const i=Object.values(r)[0];if("string"==typeof i&&i.match(/^\d{4}-\d{2}-\d{2}/)){const[e,r,s]=i.split("-");return gt.join(t,"temporal",e,r,s)}return gt.join(t,`partition=${e}`)}_sanitizePathValue(t){return String(t).replace(/[<>:"/\\|?*]/g,"_")}_sanitizeFileName(t){return t.replace(/[<>:"/\\|?*]/g,"_")}async _calculateDirectoryStats(t,e){const[r,i,s]=await V(()=>hi(t));if(r)for(const r of s){const i=gt.join(t,r),[s,n,a]=await V(()=>fi(i));s&&(a.isDirectory()?await this._calculateDirectoryStats(i,e):(e.totalFiles++,e.totalSize+=a.size))}}async loadUsageStats(){const[t,e,r]=await V(async()=>{const t=await pi(this.usageStatsFile,"utf8");return JSON.parse(t)});t&&r&&(this.partitionUsage=new Map(Object.entries(r)))}async _saveUsageStats(){const t=Object.fromEntries(this.partitionUsage);await V(async()=>{await di(this.usageStatsFile,JSON.stringify(t,null,2),"utf8")})}async _writeFileWithMetadata(t,e){const r=JSON.stringify(e),[i,s]=await V(async()=>{await di(t,r,{encoding:this.encoding,mode:this.fileMode})});if(!i)throw new Error(`Failed to write cache file: ${s.message}`);return!0}async _readFileWithMetadata(t){const[e,r,i]=await V(async()=>await pi(t,this.encoding));if(!e||!i)return null;try{return JSON.parse(i)}catch(t){return{data:i}}}}const gi={async setup(t){t&&t.client&&(this.client=t.client,this.map={PutObjectCommand:"put",GetObjectCommand:"get",HeadObjectCommand:"head",DeleteObjectCommand:"delete",DeleteObjectsCommand:"delete",ListObjectsV2Command:"list"},this.costs={total:0,prices:{put:5e-6,copy:5e-6,list:5e-6,post:5e-6,get:4e-4/1e3,select:4e-4/1e3,delete:4e-4/1e3,head:4e-4/1e3},requests:{total:0,put:0,post:0,copy:0,list:0,get:0,select:0,delete:0,head:0},events:{total:0,PutObjectCommand:0,GetObjectCommand:0,HeadObjectCommand:0,DeleteObjectCommand:0,DeleteObjectsCommand:0,ListObjectsV2Command:0}},this.client.costs=JSON.parse(JSON.stringify(this.costs)))},async start(){this.client&&(this.client.on("command.response",t=>this.addRequest(t,this.map[t])),this.client.on("command.error",t=>this.addRequest(t,this.map[t])))},addRequest(t,e){e&&(this.costs.events[t]++,this.costs.events.total++,this.costs.requests.total++,this.costs.requests[e]++,this.costs.total+=this.costs.prices[e],this.client&&this.client.costs&&(this.client.costs.events[t]++,this.client.costs.events.total++,this.client.costs.requests.total++,this.client.costs.requests[e]++,this.client.costs.total+=this.client.costs.prices[e]))}};var yi=class extends et{constructor(t={}){super(),this.config=t,this.name=this.constructor.name,this.enabled=!1!==t.enabled}async initialize(t){this.database=t,this.emit("initialized",{replicator:this.name})}async replicate(t,e,r,i){throw new Error(`replicate() method must be implemented by ${this.name}`)}async replicateBatch(t,e){throw new Error(`replicateBatch() method must be implemented by ${this.name}`)}async testConnection(){throw new Error(`testConnection() method must be implemented by ${this.name}`)}async getStatus(){return{name:this.name,config:this.config,connected:!1}}async cleanup(){this.emit("cleanup",{replicator:this.name})}validateConfig(){return{isValid:!0,errors:[]}}};var bi=class extends yi{constructor(t={},e={}){super(t),this.projectId=t.projectId,this.datasetId=t.datasetId,this.bigqueryClient=null,this.credentials=t.credentials,this.location=t.location||"US",this.logTable=t.logTable,this.resources=this.parseResourcesConfig(e)}parseResourcesConfig(t){const e={};for(const[r,i]of Object.entries(t))"string"==typeof i?e[r]=[{table:i,actions:["insert"],transform:null}]:Array.isArray(i)?e[r]=i.map(t=>"string"==typeof t?{table:t,actions:["insert"],transform:null}:{table:t.table,actions:t.actions||["insert"],transform:t.transform||null}):"object"==typeof i&&(e[r]=[{table:i.table,actions:i.actions||["insert"],transform:i.transform||null}]);return e}validateConfig(){const t=[];this.projectId||t.push("projectId is required"),this.datasetId||t.push("datasetId is required"),0===Object.keys(this.resources).length&&t.push("At least one resource must be configured");for(const[e,r]of Object.entries(this.resources))for(const i of r){i.table||t.push(`Table name is required for resource '${e}'`),Array.isArray(i.actions)&&0!==i.actions.length||t.push(`Actions array is required for resource '${e}'`);const r=["insert","update","delete"],s=i.actions.filter(t=>!r.includes(t));s.length>0&&t.push(`Invalid actions for resource '${e}': ${s.join(", ")}. Valid actions: ${r.join(", ")}`),i.transform&&"function"!=typeof i.transform&&t.push(`Transform must be a function for resource '${e}'`)}return{isValid:0===t.length,errors:t}}async initialize(t){await super.initialize(t);const[e,r,i]=await V(()=>import("@google-cloud/bigquery"));if(!e)throw this.emit("initialization_error",{replicator:this.name,error:r.message}),r;const{BigQuery:s}=i;this.bigqueryClient=new s({projectId:this.projectId,credentials:this.credentials,location:this.location}),this.emit("initialized",{replicator:this.name,projectId:this.projectId,datasetId:this.datasetId,resources:Object.keys(this.resources)})}shouldReplicateResource(t){return this.resources.hasOwnProperty(t)}shouldReplicateAction(t,e){return!!this.resources[t]&&this.resources[t].some(t=>t.actions.includes(e))}getTablesForResource(t,e){return this.resources[t]?this.resources[t].filter(t=>t.actions.includes(e)).map(t=>({table:t.table,transform:t.transform})):[]}applyTransform(t,e){if(!e)return t;let r=JSON.parse(JSON.stringify(t));return r._length&&delete r._length,e(r)}async replicate(t,e,r,i,s=null){if(!this.enabled||!this.shouldReplicateResource(t))return{skipped:!0,reason:"resource_not_included"};if(!this.shouldReplicateAction(t,e))return{skipped:!0,reason:"action_not_included"};const n=this.getTablesForResource(t,e);if(0===n.length)return{skipped:!0,reason:"no_tables_for_action"};const a=[],o=[],[c,u,l]=await V(async()=>{const s=this.bigqueryClient.dataset(this.datasetId);for(const t of n){const[n,c]=await V(async()=>{const n=s.table(t.table);let o;if("insert"===e){const e=this.applyTransform(r,t.transform);o=await n.insert([e])}else if("update"===e){const e=this.applyTransform(r,t.transform),s=Object.keys(e).filter(t=>"id"!==t).map(t=>`${t} = @${t}`).join(", "),n={id:i,...e},a=`UPDATE \`${this.projectId}.${this.datasetId}.${t.table}\` SET ${s} WHERE id = @id`,c=2;let u=null;for(let t=1;t<=c;t++)try{const[t]=await this.bigqueryClient.createQueryJob({query:a,params:n,location:this.location});await t.getQueryResults(),o=[t];break}catch(e){if(u=e,e?.message?.includes("streaming buffer")&&t<c){const t=30;await new Promise(e=>setTimeout(e,1e3*t));continue}throw e}if(!o)throw u}else{if("delete"!==e)throw new Error(`Unsupported operation: ${e}`);{const e=`DELETE FROM \`${this.projectId}.${this.datasetId}.${t.table}\` WHERE id = @id`,[r]=await this.bigqueryClient.createQueryJob({query:e,params:{id:i},location:this.location});await r.getQueryResults(),o=[r]}}a.push({table:t.table,success:!0,jobId:o[0]?.id})});n||o.push({table:t.table,error:c.message})}if(this.logTable){const[n,a]=await V(async()=>{const n=s.table(this.logTable);await n.insert([{resource_name:t,operation:e,record_id:i,data:JSON.stringify(r),timestamp:(new Date).toISOString(),source:"s3db-replicator"}])})}const c=0===o.length;return this.emit("replicated",{replicator:this.name,resourceName:t,operation:e,id:i,tables:n.map(t=>t.table),results:a,errors:o,success:c}),{success:c,results:a,errors:o,tables:n.map(t=>t.table)}});return c?l:(this.emit("replicator_error",{replicator:this.name,resourceName:t,operation:e,id:i,error:u.message}),{success:!1,error:u.message})}async replicateBatch(t,e){const r=[],i=[];for(const s of e){const[e,n,a]=await V(()=>this.replicate(t,s.operation,s.data,s.id,s.beforeData));e?r.push(a):i.push({id:s.id,error:n.message})}return{success:0===i.length,results:r,errors:i}}async testConnection(){const[t,e]=await V(async()=>{this.bigqueryClient||await this.initialize();const t=this.bigqueryClient.dataset(this.datasetId);return await t.getMetadata(),!0});return!!t||(this.emit("connection_error",{replicator:this.name,error:e.message}),!1)}async cleanup(){}getStatus(){return{...super.getStatus(),projectId:this.projectId,datasetId:this.datasetId,resources:this.resources,logTable:this.logTable}}};var wi=class extends yi{constructor(t={},e={}){super(t),this.connectionString=t.connectionString,this.host=t.host,this.port=t.port||5432,this.database=t.database,this.user=t.user,this.password=t.password,this.client=null,this.ssl=t.ssl,this.logTable=t.logTable,this.resources=this.parseResourcesConfig(e)}parseResourcesConfig(t){const e={};for(const[r,i]of Object.entries(t))"string"==typeof i?e[r]=[{table:i,actions:["insert"]}]:Array.isArray(i)?e[r]=i.map(t=>"string"==typeof t?{table:t,actions:["insert"]}:{table:t.table,actions:t.actions||["insert"]}):"object"==typeof i&&(e[r]=[{table:i.table,actions:i.actions||["insert"]}]);return e}validateConfig(){const t=[];this.connectionString||this.host&&this.database||t.push("Either connectionString or host+database must be provided"),0===Object.keys(this.resources).length&&t.push("At least one resource must be configured");for(const[e,r]of Object.entries(this.resources))for(const i of r){i.table||t.push(`Table name is required for resource '${e}'`),Array.isArray(i.actions)&&0!==i.actions.length||t.push(`Actions array is required for resource '${e}'`);const r=["insert","update","delete"],s=i.actions.filter(t=>!r.includes(t));s.length>0&&t.push(`Invalid actions for resource '${e}': ${s.join(", ")}. Valid actions: ${r.join(", ")}`)}return{isValid:0===t.length,errors:t}}async initialize(t){await super.initialize(t);const[e,r,i]=await V(()=>import("pg"));if(!e)throw this.emit("initialization_error",{replicator:this.name,error:r.message}),r;const{Client:s}=i,n=this.connectionString?{connectionString:this.connectionString,ssl:this.ssl}:{host:this.host,port:this.port,database:this.database,user:this.user,password:this.password,ssl:this.ssl};this.client=new s(n),await this.client.connect(),this.logTable&&await this.createLogTableIfNotExists(),this.emit("initialized",{replicator:this.name,database:this.database||"postgres",resources:Object.keys(this.resources)})}async createLogTableIfNotExists(){const t=`\n CREATE TABLE IF NOT EXISTS ${this.logTable} (\n id SERIAL PRIMARY KEY,\n resource_name VARCHAR(255) NOT NULL,\n operation VARCHAR(50) NOT NULL,\n record_id VARCHAR(255) NOT NULL,\n data JSONB,\n timestamp TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n source VARCHAR(100) DEFAULT 's3db-replicator',\n created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()\n );\n CREATE INDEX IF NOT EXISTS idx_${this.logTable}_resource_name ON ${this.logTable}(resource_name);\n CREATE INDEX IF NOT EXISTS idx_${this.logTable}_operation ON ${this.logTable}(operation);\n CREATE INDEX IF NOT EXISTS idx_${this.logTable}_record_id ON ${this.logTable}(record_id);\n CREATE INDEX IF NOT EXISTS idx_${this.logTable}_timestamp ON ${this.logTable}(timestamp);\n `;await this.client.query(t)}shouldReplicateResource(t){return this.resources.hasOwnProperty(t)}shouldReplicateAction(t,e){return!!this.resources[t]&&this.resources[t].some(t=>t.actions.includes(e))}getTablesForResource(t,e){return this.resources[t]?this.resources[t].filter(t=>t.actions.includes(e)).map(t=>t.table):[]}async replicate(t,e,r,i,s=null){if(!this.enabled||!this.shouldReplicateResource(t))return{skipped:!0,reason:"resource_not_included"};if(!this.shouldReplicateAction(t,e))return{skipped:!0,reason:"action_not_included"};const n=this.getTablesForResource(t,e);if(0===n.length)return{skipped:!0,reason:"no_tables_for_action"};const a=[],o=[],[c,u,l]=await V(async()=>{for(const t of n){const[s,n]=await V(async()=>{let s;if("insert"===e){const e=Object.keys(r),i=e.map(t=>r[t]),n=e.map(t=>`"${t}"`).join(", "),a=e.map((t,e)=>`$${e+1}`).join(", "),o=`INSERT INTO ${t} (${n}) VALUES (${a}) ON CONFLICT (id) DO NOTHING RETURNING *`;s=await this.client.query(o,i)}else if("update"===e){const e=Object.keys(r).filter(t=>"id"!==t),n=e.map((t,e)=>`"${t}"=$${e+1}`).join(", "),a=e.map(t=>r[t]);a.push(i);const o=`UPDATE ${t} SET ${n} WHERE id=$${e.length+1} RETURNING *`;s=await this.client.query(o,a)}else{if("delete"!==e)throw new Error(`Unsupported operation: ${e}`);{const e=`DELETE FROM ${t} WHERE id=$1 RETURNING *`;s=await this.client.query(e,[i])}}a.push({table:t,success:!0,rows:s.rows,rowCount:s.rowCount})});s||o.push({table:t,error:n.message})}if(this.logTable){const[s,n]=await V(async()=>{await this.client.query(`INSERT INTO ${this.logTable} (resource_name, operation, record_id, data, timestamp, source) VALUES ($1, $2, $3, $4, $5, $6)`,[t,e,i,JSON.stringify(r),(new Date).toISOString(),"s3db-replicator"])})}const s=0===o.length;return this.emit("replicated",{replicator:this.name,resourceName:t,operation:e,id:i,tables:n,results:a,errors:o,success:s}),{success:s,results:a,errors:o,tables:n}});return c?l:(this.emit("replicator_error",{replicator:this.name,resourceName:t,operation:e,id:i,error:u.message}),{success:!1,error:u.message})}async replicateBatch(t,e){const r=[],i=[];for(const s of e){const[e,n,a]=await V(()=>this.replicate(t,s.operation,s.data,s.id,s.beforeData));e?r.push(a):i.push({id:s.id,error:n.message})}return{success:0===i.length,results:r,errors:i}}async testConnection(){const[t,e]=await V(async()=>(this.client||await this.initialize(),await this.client.query("SELECT 1"),!0));return!!t||(this.emit("connection_error",{replicator:this.name,error:e.message}),!1)}async cleanup(){this.client&&await this.client.end()}getStatus(){return{...super.getStatus(),database:this.database||"postgres",resources:this.resources,logTable:this.logTable}}};class vi{constructor(t){let e;const[r,i,s]=V(()=>new URL(t));if(!r)throw new M("Invalid connection string: "+t,{original:i,input:t});e=s,this.region="us-east-1","s3:"===e.protocol?this.defineFromS3(e):this.defineFromCustomUri(e);for(const[t,r]of e.searchParams.entries())this[t]=r}defineFromS3(t){const[e,r,i]=z(()=>decodeURIComponent(t.hostname));if(!e)throw new M("Invalid bucket in connection string",{original:r,input:t.hostname});this.bucket=i||"s3db";const[s,n,a]=z(()=>decodeURIComponent(t.username));if(!s)throw new M("Invalid accessKeyId in connection string",{original:n,input:t.username});this.accessKeyId=a;const[o,c,u]=z(()=>decodeURIComponent(t.password));if(!o)throw new M("Invalid secretAccessKey in connection string",{original:c,input:t.password});if(this.secretAccessKey=u,this.endpoint="https://s3.us-east-1.amazonaws.com",["/","",null].includes(t.pathname))this.keyPrefix="";else{let[,...e]=t.pathname.split("/");this.keyPrefix=[...e||[]].join("/")}}defineFromCustomUri(t){this.forcePathStyle=!0,this.endpoint=t.origin;const[e,r,i]=z(()=>decodeURIComponent(t.username));if(!e)throw new M("Invalid accessKeyId in connection string",{original:r,input:t.username});this.accessKeyId=i;const[s,n,a]=z(()=>decodeURIComponent(t.password));if(!s)throw new M("Invalid secretAccessKey in connection string",{original:n,input:t.password});if(this.secretAccessKey=a,["/","",null].includes(t.pathname))this.bucket="s3db",this.keyPrefix="";else{let[,e,...r]=t.pathname.split("/");if(e){const[t,r,i]=z(()=>decodeURIComponent(e));if(!t)throw new M("Invalid bucket in connection string",{original:r,input:e});this.bucket=i}else this.bucket="s3db";this.keyPrefix=[...r||[]].join("/")}}}class Si extends et{constructor({verbose:t=!1,id:e=null,AwsS3Client:r,connectionString:i,parallelism:s=10}){super(),this.verbose=t,this.id=e??Q(),this.parallelism=s,this.config=new vi(i),this.client=r||this.createClient()}createClient(){let t={region:this.config.region,endpoint:this.config.endpoint};this.config.forcePathStyle&&(t.forcePathStyle=!0),this.config.accessKeyId&&(t.credentials={accessKeyId:this.config.accessKeyId,secretAccessKey:this.config.secretAccessKey});const e=new c.S3Client(t);return e.middlewareStack.add((t,e)=>async r=>{if("DeleteObjectsCommand"===e.commandName){const t=r.request.body;if(t&&"string"==typeof t){const e=await Y(t);r.request.headers["Content-MD5"]=e}}return t(r)},{step:"build",name:"addContentMd5ForDeleteObjects",priority:"high"}),e}async sendCommand(t){this.emit("command.request",t.constructor.name,t.input);const[e,r,i]=await V(()=>this.client.send(t));if(!e){throw $(r,{bucket:this.config.bucket,key:t.input&&t.input.Key,commandName:t.constructor.name,commandInput:t.input})}return this.emit("command.response",t.constructor.name,i,t.input),i}async putObject({key:t,metadata:e,contentType:r,body:i,contentEncoding:s,contentLength:n}){const a="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"";a&>.join(a,t);const o={};if(e)for(const[t,r]of Object.entries(e)){o[String(t).replace(/[^a-zA-Z0-9\-_]/g,"_")]=String(r)}const u={Bucket:this.config.bucket,Key:a?gt.join(a,t):t,Metadata:o,Body:i||Buffer.alloc(0)};let l,h;void 0!==r&&(u.ContentType=r),void 0!==s&&(u.ContentEncoding=s),void 0!==n&&(u.ContentLength=n);try{return l=await this.sendCommand(new c.PutObjectCommand(u)),l}catch(e){throw h=e,$(e,{bucket:this.config.bucket,key:t,commandName:"PutObjectCommand",commandInput:u})}finally{this.emit("putObject",h||l,{key:t,metadata:e,contentType:r,body:i,contentEncoding:s,contentLength:n})}}async getObject(t){const e="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"",r={Bucket:this.config.bucket,Key:e?gt.join(e,t):t};let i,s;try{return i=await this.sendCommand(new c.GetObjectCommand(r)),i}catch(e){throw s=e,$(e,{bucket:this.config.bucket,key:t,commandName:"GetObjectCommand",commandInput:r})}finally{this.emit("getObject",s||i,{key:t})}}async headObject(t){const e="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"",r={Bucket:this.config.bucket,Key:e?gt.join(e,t):t};let i,s;try{return i=await this.sendCommand(new c.HeadObjectCommand(r)),i}catch(e){throw s=e,$(e,{bucket:this.config.bucket,key:t,commandName:"HeadObjectCommand",commandInput:r})}finally{this.emit("headObject",s||i,{key:t})}}async copyObject({from:t,to:e}){const r={Bucket:this.config.bucket,Key:this.config.keyPrefix?gt.join(this.config.keyPrefix,e):e,CopySource:gt.join(this.config.bucket,this.config.keyPrefix?gt.join(this.config.keyPrefix,t):t)};let i,s;try{return i=await this.sendCommand(new c.CopyObjectCommand(r)),i}catch(t){throw s=t,$(t,{bucket:this.config.bucket,key:e,commandName:"CopyObjectCommand",commandInput:r})}finally{this.emit("copyObject",s||i,{from:t,to:e})}}async exists(t){const[e,r]=await V(()=>this.headObject(t));if(e)return!0;if("NoSuchKey"===r.name||"NotFound"===r.name)return!1;throw r}async deleteObject(t){const e="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"";e&>.join(e,t);const r={Bucket:this.config.bucket,Key:e?gt.join(e,t):t};let i,s;try{return i=await this.sendCommand(new c.DeleteObjectCommand(r)),i}catch(e){throw s=e,$(e,{bucket:this.config.bucket,key:t,commandName:"DeleteObjectCommand",commandInput:r})}finally{this.emit("deleteObject",s||i,{key:t})}}async deleteObjects(t){const e="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"",r=n.chunk(t,1e3),{results:s,errors:a}=await i.PromisePool.for(r).withConcurrency(this.parallelism).process(async t=>{for(const r of t)e&>.join(e,r),this.config.bucket,await this.exists(r);const r={Bucket:this.config.bucket,Delete:{Objects:t.map(t=>({Key:e?gt.join(e,t):t}))}};let i;const[s,n,a]=await V(()=>this.sendCommand(new c.DeleteObjectsCommand(r)));if(!s)throw n;return i=a,i&&i.Errors&&i.Errors.length,i&&i.Deleted&&(i.Deleted.length,t.length),i}),o={deleted:s,notFound:a};return this.emit("deleteObjects",o,t),o}async deleteAll({prefix:t}={}){const e="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"";let r,i=0;do{const s=new c.ListObjectsV2Command({Bucket:this.config.bucket,Prefix:e?gt.join(e,t||""):t||"",ContinuationToken:r}),n=await this.client.send(s);if(n.Contents&&n.Contents.length>0){const e=new c.DeleteObjectsCommand({Bucket:this.config.bucket,Delete:{Objects:n.Contents.map(t=>({Key:t.Key}))}}),r=await this.client.send(e),s=r.Deleted?r.Deleted.length:0;i+=s,this.emit("deleteAll",{prefix:t,batch:s,total:i})}r=n.IsTruncated?n.NextContinuationToken:void 0}while(r);return this.emit("deleteAllComplete",{prefix:t,totalDeleted:i}),i}async moveObject({from:t,to:e}){const[r,i]=await V(async()=>{await this.copyObject({from:t,to:e}),await this.deleteObject(t)});if(!r)throw new I("Unknown error in moveObject",{bucket:this.config.bucket,from:t,to:e,original:i});return!0}async listObjects({prefix:t,maxKeys:e=1e3,continuationToken:r}={}){const i={Bucket:this.config.bucket,MaxKeys:e,ContinuationToken:r,Prefix:this.config.keyPrefix?gt.join(this.config.keyPrefix,t||""):t||""},[s,n,a]=await V(()=>this.sendCommand(new c.ListObjectsV2Command(i)));if(!s)throw new I("Unknown error in listObjects",{prefix:t,bucket:this.config.bucket,original:n});return this.emit("listObjects",a,i),a}async count({prefix:t}={}){let e,r=0,i=!0;for(;i;){const s={prefix:t,continuationToken:e},n=await this.listObjects(s);r+=n.KeyCount||0,i=n.IsTruncated||!1,e=n.NextContinuationToken}return this.emit("count",r,{prefix:t}),r}async getAllKeys({prefix:t}={}){let e,r=[],i=!0;for(;i;){const s={prefix:t,continuationToken:e},n=await this.listObjects(s);n.Contents&&(r=r.concat(n.Contents.map(t=>t.Key))),i=n.IsTruncated||!1,e=n.NextContinuationToken}return this.config.keyPrefix&&(r=r.map(t=>t.replace(this.config.keyPrefix,"")).map(t=>t.startsWith("/")?t.replace("/",""):t)),this.emit("getAllKeys",r,{prefix:t}),r}async getContinuationTokenAfterOffset(t={}){const{prefix:e,offset:r=1e3}=t;if(0===r)return null;let i,s=!0,n=0;for(;s;){const t={prefix:e,maxKeys:r<1e3?r:r-n>1e3?1e3:r-n,continuationToken:i},a=await this.listObjects(t);if(a.Contents&&(n+=a.Contents.length),s=a.IsTruncated||!1,i=a.NextContinuationToken,n>=r)break}return this.emit("getContinuationTokenAfterOffset",i||null,t),i||null}async getKeysPage(t={}){const{prefix:e,offset:r=0,amount:i=100}=t;let s,n=[],a=!0;if(r>0&&(s=await this.getContinuationTokenAfterOffset({prefix:e,offset:r}),!s))return this.emit("getKeysPage",[],t),[];for(;a;){const t={prefix:e,continuationToken:s},r=await this.listObjects(t);if(r.Contents&&(n=n.concat(r.Contents.map(t=>t.Key))),a=r.IsTruncated||!1,s=r.NextContinuationToken,n.length>=i){n=n.slice(0,i);break}}return this.config.keyPrefix&&(n=n.map(t=>t.replace(this.config.keyPrefix,"")).map(t=>t.startsWith("/")?t.replace("/",""):t)),this.emit("getKeysPage",n,t),n}async moveAllObjects({prefixFrom:t,prefixTo:e}){const r=await this.getAllKeys({prefix:t}),{results:s,errors:n}=await i.PromisePool.for(r).withConcurrency(this.parallelism).process(async r=>{const i=r.replace(t,e),[s,n]=await V(async()=>{await this.moveObject({from:r,to:i})});if(!s)throw new I("Unknown error in moveAllObjects",{bucket:this.config.bucket,from:r,to:i,original:n});return i});if(this.emit("moveAllObjects",{results:s,errors:n},{prefixFrom:t,prefixTo:e}),n.length>0)throw new Error("Some objects could not be moved");return s}}var ki=Si;async function Oi(t,e,r){if(!this.passphrase)return e.push(new R("Missing configuration for secrets encryption.",{actual:t,type:"encryptionKeyMissing",suggestion:"Provide a passphrase for secret encryption."})),t;const[i,s,n]=await V(()=>H(String(t),this.passphrase));return i?n:(e.push(new R("Problem encrypting secret.",{actual:t,type:"encryptionProblem",error:s,suggestion:"Check the passphrase and input value."})),t)}async function _i(t,e,r){if(n.isString(t))return t;const[i,s,a]=z(()=>JSON.stringify(t));if(!i)throw new R("Failed to stringify JSON",{original:s,input:t});return a}class ji extends l{constructor({options:t,passphrase:e,autoEncrypt:r=!0}={}){super(n.merge({},{useNewCustomCheckerFunction:!0,messages:{encryptionKeyMissing:"Missing configuration for secrets encryption.",encryptionProblem:"Problem encrypting secret. Actual: {actual}. Error: {error}"},defaults:{string:{trim:!0},object:{strict:"remove"},number:{convert:!0}}},t)),this.passphrase=e,this.autoEncrypt=r,this.alias("secret",{type:"string",custom:this.autoEncrypt?Oi:void 0,messages:{string:"The '{field}' field must be a string.",stringMin:"This secret '{field}' field length must be at least {expected} long."}}),this.alias("secretAny",{type:"any",custom:this.autoEncrypt?Oi:void 0}),this.alias("secretNumber",{type:"number",custom:this.autoEncrypt?Oi:void 0}),this.alias("json",{type:"any",custom:this.autoEncrypt?_i:void 0})}}const Ri=new Proxy(ji,{instance:null,construct(t,e){return this.instance||(this.instance=new t(...e)),this.instance}});const Ei={trim:t=>null==t?t:t.trim(),encrypt:async(t,{passphrase:e})=>{if(null==t)return t;const[r,i,s]=await q(()=>H(t,e));return r?s:t},decrypt:async(t,{passphrase:e})=>{if(null==t)return t;const[r,i,s]=await q(()=>J(t,e));return r?"null"===s?null:"undefined"!==s?s:void 0:t},toString:t=>null==t?t:String(t),fromArray:(t,{separator:e})=>{if(null==t||!Array.isArray(t))return t;if(0===t.length)return"";return t.map(t=>"string"==typeof t?t.replace(/\\/g,"\\\\").replace(new RegExp(`\\${e}`,"g"),`\\${e}`):String(t)).join(e)},toArray:(t,{separator:e})=>{if(Array.isArray(t))return t;if(null==t)return t;if(""===t)return[];const r=[];let i="",s=0;const n=String(t);for(;s<n.length;)"\\"===n[s]&&s+1<n.length?(i+=n[s+1],s+=2):n[s]===e?(r.push(i),i="",s++):(i+=n[s],s++);return r.push(i),r},toJSON:t=>{if(null===t)return null;if(void 0===t)return;if("string"==typeof t){const[e,r,i]=z(()=>JSON.parse(t));return t}const[e,r,i]=z(()=>JSON.stringify(t));return e?i:t},fromJSON:t=>{if(null===t)return null;if(void 0===t)return;if("string"!=typeof t)return t;if(""===t)return"";const[e,r,i]=z(()=>JSON.parse(t));return e?i:t},toNumber:t=>n.isString(t)?t.includes(".")?parseFloat(t):parseInt(t):t,toBool:t=>[!0,1,"true","1","yes","y"].includes(t),fromBool:t=>[!0,1,"true","1","yes","y"].includes(t)?"1":"0",fromBase62:t=>{if(null==t||""===t)return t;if("number"==typeof t)return t;if("string"==typeof t){const e=p(t);return isNaN(e)?void 0:e}},toBase62:t=>{if(null==t||""===t)return t;if("number"==typeof t)return d(t);if("string"==typeof t){const e=Number(t);return isNaN(e)?t:d(e)}return t},fromBase62Decimal:t=>{if(null==t||""===t)return t;if("number"==typeof t)return t;if("string"==typeof t){const e=g(t);return isNaN(e)?void 0:e}},toBase62Decimal:t=>{if(null==t||""===t)return t;if("number"==typeof t)return m(t);if("string"==typeof t){const e=Number(t);return isNaN(e)?t:m(e)}return t},fromArrayOfNumbers:(t,{separator:e})=>{if(null==t||!Array.isArray(t))return t;if(0===t.length)return"";return t.map(t=>{if("number"==typeof t&&!isNaN(t))return d(t);const e=Number(t);return isNaN(e)?"":d(e)}).join(e)},toArrayOfNumbers:(t,{separator:e})=>{if(Array.isArray(t))return t.map(t=>"number"==typeof t?t:p(t));if(null==t)return t;if(""===t)return[];const r=String(t),i=[];let s="",n=0;for(;n<r.length;)"\\"===r[n]&&n+1<r.length?(s+=r[n+1],n+=2):r[n]===e?(i.push(s),s="",n++):(s+=r[n],n++);return i.push(s),i.map(t=>{if("number"==typeof t)return t;if("string"==typeof t&&""!==t){const e=p(t);return isNaN(e)?NaN:e}return NaN})},fromArrayOfDecimals:(t,{separator:e})=>{if(null==t||!Array.isArray(t))return t;if(0===t.length)return"";return t.map(t=>{if("number"==typeof t&&!isNaN(t))return m(t);const e=Number(t);return isNaN(e)?"":m(e)}).join(e)},toArrayOfDecimals:(t,{separator:e})=>{if(Array.isArray(t))return t.map(t=>"number"==typeof t?t:g(t));if(null==t)return t;if(""===t)return[];const r=String(t),i=[];let s="",n=0;for(;n<r.length;)"\\"===r[n]&&n+1<r.length?(s+=r[n+1],n+=2):r[n]===e?(i.push(s),s="",n++):(s+=r[n],n++);return i.push(s),i.map(t=>{if("number"==typeof t)return t;if("string"==typeof t&&""!==t){const e=g(t);return isNaN(e)?NaN:e}return NaN})}};class xi{constructor(t){const{map:e,name:r,attributes:i,passphrase:s,version:a=1,options:o={}}=t;this.name=r,this.version=a,this.attributes=i||{},this.passphrase=s??"secret",this.options=n.merge({},this.defaultOptions(),o),this.allNestedObjectsOptional=this.options.allNestedObjectsOptional??!1;const c=this.preprocessAttributesForValidation(this.attributes);if(this.validator=new Ri({autoEncrypt:!1}).compile(n.merge({$$async:!0},c)),this.options.generateAutoHooks&&this.generateAutoHooks(),n.isEmpty(e)){const t=u.flatten(this.attributes,{safe:!0}),e=Object.keys(t).filter(t=>!t.includes("$$")),r=this.extractObjectKeys(this.attributes),i=[...new Set([...e,...r])],{mapping:s,reversedMapping:n}=function(t){const e={},r={};return t.forEach((t,i)=>{const s=d(i);e[t]=s,r[s]=t}),{mapping:e,reversedMapping:r}}(i);this.map=s,this.reversedMap=n}else this.map=e,this.reversedMap=n.invert(e)}defaultOptions(){return{autoEncrypt:!0,autoDecrypt:!0,arraySeparator:"|",generateAutoHooks:!0,hooks:{beforeMap:{},afterMap:{},beforeUnmap:{},afterUnmap:{}}}}addHook(t,e,r){this.options.hooks[t][e]||(this.options.hooks[t][e]=[]),this.options.hooks[t][e]=n.uniq([...this.options.hooks[t][e],r])}extractObjectKeys(t,e=""){const r=[];for(const[i,s]of Object.entries(t)){if(i.startsWith("$$"))continue;const t=e?`${e}.${i}`:i;"object"!=typeof s||null===s||Array.isArray(s)||(r.push(t),"object"===s.$$type&&r.push(...this.extractObjectKeys(s,t)))}return r}generateAutoHooks(){const t=u.flatten(n.cloneDeep(this.attributes),{safe:!0});for(const[e,r]of Object.entries(t))if(r.includes("array")){if(r.includes("items:string"))this.addHook("beforeMap",e,"fromArray"),this.addHook("afterUnmap",e,"toArray");else if(r.includes("items:number")){r.includes("integer:true")||r.includes("|integer:")||r.includes("|integer")?(this.addHook("beforeMap",e,"fromArrayOfNumbers"),this.addHook("afterUnmap",e,"toArrayOfNumbers")):(this.addHook("beforeMap",e,"fromArrayOfDecimals"),this.addHook("afterUnmap",e,"toArrayOfDecimals"))}}else if(r.includes("secret"))this.options.autoEncrypt&&this.addHook("beforeMap",e,"encrypt"),this.options.autoDecrypt&&this.addHook("afterUnmap",e,"decrypt");else{if(r.includes("number")){r.includes("integer:true")||r.includes("|integer:")||r.includes("|integer")?(this.addHook("beforeMap",e,"toBase62"),this.addHook("afterUnmap",e,"fromBase62")):(this.addHook("beforeMap",e,"toBase62Decimal"),this.addHook("afterUnmap",e,"fromBase62Decimal"));continue}r.includes("boolean")?(this.addHook("beforeMap",e,"fromBool"),this.addHook("afterUnmap",e,"toBool")):(r.includes("json")||"object"===r||r.includes("object"))&&(this.addHook("beforeMap",e,"toJSON"),this.addHook("afterUnmap",e,"fromJSON"))}}static import(t){let{map:e,name:r,options:i,version:s,attributes:a}=n.isString(t)?JSON.parse(t):t;const[o,c,u]=z(()=>xi._importAttributes(a));if(!o)throw new U("Failed to import schema attributes",{original:c,input:a});a=u;return new xi({map:e,name:r,options:i,version:s,attributes:a})}static _importAttributes(t){if("string"==typeof t){const[e,r,i]=z(()=>JSON.parse(t));if(e&&"object"==typeof i&&null!==i){const[e,r,s]=z(()=>xi._importAttributes(i));if(!e)throw new U("Failed to parse nested schema attribute",{original:r,input:t});return s}return t}if(Array.isArray(t)){const[e,r,i]=z(()=>t.map(t=>xi._importAttributes(t)));if(!e)throw new U("Failed to import array schema attributes",{original:r,input:t});return i}if("object"==typeof t&&null!==t){const e={};for(const[r,i]of Object.entries(t)){const[t,s,n]=z(()=>xi._importAttributes(i));if(!t)throw new U("Failed to import object schema attribute",{original:s,key:r,input:i});e[r]=n}return e}return t}export(){return{version:this.version,name:this.name,options:this.options,attributes:this._exportAttributes(this.attributes),map:this.map}}_exportAttributes(t){if("string"==typeof t)return t;if(Array.isArray(t))return t.map(t=>this._exportAttributes(t));if("object"==typeof t&&null!==t){const e={};for(const[r,i]of Object.entries(t))e[r]=this._exportAttributes(i);return e}return t}async applyHooksActions(t,e){const r=n.cloneDeep(t);for(const[t,i]of Object.entries(this.options.hooks[e]))for(const e of i){const i=n.get(r,t);void 0!==i&&"function"==typeof Ei[e]&&n.set(r,t,await Ei[e](i,{passphrase:this.passphrase,separator:this.options.arraySeparator}))}return r}async validate(t,{mutateOriginal:e=!1}={}){let r=e?t:n.cloneDeep(t);return await this.validator(r)}async mapper(t){let e=n.cloneDeep(t);e=await this.applyHooksActions(e,"beforeMap");const r=u.flatten(e,{safe:!0}),i={_v:this.version+""};for(const[t,e]of Object.entries(r)){const r=this.map[t]||t,s=this.getAttributeDefinition(t);"number"==typeof e&&"string"==typeof s&&s.includes("number")?i[r]=d(e):"string"==typeof e?"[object Object]"===e?i[r]="{}":(e.startsWith("{")||e.startsWith("["),i[r]=e):Array.isArray(e)||"object"==typeof e&&null!==e?i[r]=JSON.stringify(e):i[r]=e}return await this.applyHooksActions(i,"afterMap"),i}async unmapper(t,e){let r=n.cloneDeep(t);delete r._v,r=await this.applyHooksActions(r,"beforeUnmap");const i=e?n.invert(e):this.reversedMap,s={};for(const[t,e]of Object.entries(r)){const r=i&&i[t]?i[t]:t;let n=e;const a=this.getAttributeDefinition(r);if("string"!=typeof a||!a.includes("number")||a.includes("array")||a.includes("decimal")){if("string"==typeof e)if("[object Object]"===e)n={};else if(e.startsWith("{")||e.startsWith("[")){const[t,r,i]=z(()=>JSON.parse(e));t&&(n=i)}}else"string"==typeof n&&""!==n?n=p(n):"number"==typeof n||(n=void 0);if(this.attributes&&"string"==typeof a&&a.includes("array"))if(Array.isArray(n));else if("string"==typeof n&&n.trim().startsWith("[")){const[t,e,r]=z(()=>JSON.parse(n));t&&Array.isArray(r)&&(n=r)}else n=Ei.toArray(n,{separator:this.options.arraySeparator});if(this.options.hooks&&this.options.hooks.afterUnmap&&this.options.hooks.afterUnmap[r])for(const t of this.options.hooks.afterUnmap[r])"function"==typeof Ei[t]&&(n=await Ei[t](n,{passphrase:this.passphrase,separator:this.options.arraySeparator}));s[r]=n}await this.applyHooksActions(s,"afterUnmap");const a=u.unflatten(s);for(const[e,r]of Object.entries(t))e.startsWith("$")&&(a[e]=r);return a}getAttributeDefinition(t){const e=t.split(".");let r=this.attributes;for(const t of e){if(!r)return;r=r[t]}return r}preprocessAttributesForValidation(t){const e={};for(const[r,i]of Object.entries(t))if("object"!=typeof i||null===i||Array.isArray(i))e[r]=i;else{const t=i.$$type&&i.$$type.includes("required"),s=i.$$type&&i.$$type.includes("optional"),n={type:"object",properties:this.preprocessAttributesForValidation(i),strict:!1};t||(s||this.allNestedObjectsOptional)&&(n.optional=!0),e[r]=n}return e}}var Di=xi;const Ai=2047;var Ni=Object.freeze({__proto__:null,S3_METADATA_LIMIT_BYTES:Ai,handleGet:async function({resource:t,metadata:e,body:r}){return{metadata:e,body:r}},handleInsert:async function({resource:t,data:e,mappedData:r,originalData:i}){const s=S(r),n=O({s3Limit:Ai,systemConfig:{version:t.version,timestamps:t.config.timestamps,id:e.id}});if(s>n)throw new Error(`S3 metadata size exceeds 2KB limit. Current size: ${s} bytes, effective limit: ${n} bytes, absolute limit: 2047 bytes`);return{mappedData:r,body:JSON.stringify(r)}},handleUpdate:async function({resource:t,id:e,data:r,mappedData:i,originalData:s}){const n=S(i),a=O({s3Limit:Ai,systemConfig:{version:t.version,timestamps:t.config.timestamps,id:e}});if(n>a)throw new Error(`S3 metadata size exceeds 2KB limit. Current size: ${n} bytes, effective limit: ${a} bytes, absolute limit: 2047 bytes`);return{mappedData:i,body:JSON.stringify(i)}},handleUpsert:async function({resource:t,id:e,data:r,mappedData:i}){const s=S(i),n=O({s3Limit:Ai,systemConfig:{version:t.version,timestamps:t.config.timestamps,id:e}});if(s>n)throw new Error(`S3 metadata size exceeds 2KB limit. Current size: ${s} bytes, effective limit: ${n} bytes, absolute limit: 2047 bytes`);return{mappedData:i,body:""}}});var Pi=Object.freeze({__proto__:null,handleGet:async function({resource:t,metadata:e,body:r}){return{metadata:e,body:r}},handleInsert:async function({resource:t,data:e,mappedData:r,originalData:i}){const s=S(r);return s>O({s3Limit:Ai,systemConfig:{version:t.version,timestamps:t.config.timestamps,id:e.id}})&&t.emit("exceedsLimit",{operation:"insert",totalSize:s,limit:2047,excess:s-2047,data:i||e}),{mappedData:r,body:JSON.stringify(e)}},handleUpdate:async function({resource:t,id:e,data:r,mappedData:i,originalData:s}){const n=S(i);return n>O({s3Limit:Ai,systemConfig:{version:t.version,timestamps:t.config.timestamps,id:e}})&&t.emit("exceedsLimit",{operation:"update",id:e,totalSize:n,limit:2047,excess:n-2047,data:s||r}),{mappedData:i,body:JSON.stringify(r)}},handleUpsert:async function({resource:t,id:e,data:r,mappedData:i,originalData:s}){const n=S(i);return n>O({s3Limit:Ai,systemConfig:{version:t.version,timestamps:t.config.timestamps,id:e}})&&t.emit("exceedsLimit",{operation:"upsert",id:e,totalSize:n,limit:2047,excess:n-2047,data:s||r}),{mappedData:i,body:JSON.stringify(r)}}});const Ci="$truncated",Ii="true",Ti=y(Ci)+y(Ii);async function $i({resource:t,data:e,mappedData:r,originalData:i}){const s=O({s3Limit:Ai,systemConfig:{version:t.version,timestamps:t.config.timestamps,id:e.id}}),n=v(r),a=Object.entries(n).sort(([,t],[,e])=>t-e),o={};let c=0,u=!1;r._v&&(o._v=r._v,c+=n._v);for(const[t,e]of a){if("_v"===t)continue;const i=r[t];if(!(c+(e+(u?0:Ti))<=s)){const e=s-c-(u?0:Ti);if(e>0){const r=Mi(i,e);o[t]=r,u=!0,c+=y(r)}else o[t]="",u=!0;break}o[t]=i,c+=e}let l=S(o)+(u?Ti:0);for(;l>s;){const t=Object.keys(o).filter(t=>"_v"!==t&&"$truncated"!==t);if(0===t.length)break;o[t[t.length-1]]="",l=S(o)+Ti,u=!0}return u&&(o[Ci]=Ii),{mappedData:o,body:JSON.stringify(r)}}function Mi(t,e){if("string"==typeof t)return Li(t,e);if("object"==typeof t&&null!==t){return Li(JSON.stringify(t),e)}return Li(String(t),e)}function Li(t,e){const r=new TextEncoder;let i=r.encode(t);if(i.length<=e)return t;let s=t.length;for(;s>0;){const n=t.substring(0,s);if(i=r.encode(n),i.length<=e)return n;s--}return""}var Ui=Object.freeze({__proto__:null,handleGet:async function({resource:t,metadata:e,body:r}){return{metadata:e,body:r}},handleInsert:$i,handleUpdate:async function({resource:t,id:e,data:r,mappedData:i,originalData:s}){return $i({resource:t,data:r,mappedData:i,originalData:s})},handleUpsert:async function({resource:t,id:e,data:r,mappedData:i}){return $i({resource:t,data:r,mappedData:i})}});const Fi="$overflow",Bi="true",qi=y(Fi)+y(Bi);async function zi({resource:t,data:e,mappedData:r,originalData:i}){const s=O({s3Limit:Ai,systemConfig:{version:t.version,timestamps:t.config.timestamps,id:e.id}}),n=v(r),a=Object.entries(n).sort(([,t],[,e])=>t-e),o={},c={};let u=0,l=!1;r._v&&(o._v=r._v,u+=n._v);let h=s;for(const[t,e]of a)"_v"!==t&&(!l&&u+e>s&&(h-=qi,l=!0),!l&&u+e<=h?(o[t]=r[t],u+=e):(c[t]=r[t],l=!0));l&&(o[Fi]=Bi);const f=Object.keys(c).length>0;let d=f?JSON.stringify(c):"";return f||(d="{}"),{mappedData:o,body:d}}async function Vi({resource:t,data:e,mappedData:r}){const i={_v:r._v||String(t.version)};i._map=JSON.stringify(t.schema.map);return{mappedData:i,body:JSON.stringify(r)}}const Ki={"user-managed":Pi,"enforce-limits":Ni,"truncate-data":Ui,"body-overflow":Object.freeze({__proto__:null,handleGet:async function({resource:t,metadata:e,body:r}){let i={};if(r&&""!==r.trim()){const[t,e,s]=z(()=>JSON.parse(r));i=t?s:{}}const s={...i,...e};return delete s.$overflow,{metadata:s,body:r}},handleInsert:zi,handleUpdate:async function({resource:t,id:e,data:r,mappedData:i,originalData:s}){return zi({resource:t,data:r,mappedData:i,originalData:s})},handleUpsert:async function({resource:t,id:e,data:r,mappedData:i}){return zi({resource:t,data:r,mappedData:i})}}),"body-only":Object.freeze({__proto__:null,handleGet:async function({resource:t,metadata:e,body:r}){let i={};if(r&&""!==r.trim()){const[t,e,s]=z(()=>JSON.parse(r));i=t?s:{}}return{metadata:{...i,...e},body:r}},handleInsert:Vi,handleUpdate:async function({resource:t,id:e,data:r,mappedData:i}){const s={_v:i._v||String(t.version)};return s._map=JSON.stringify(t.schema.map),{mappedData:s,body:JSON.stringify(i)}},handleUpsert:async function({resource:t,id:e,data:r,mappedData:i}){return Vi({resource:t,data:r,mappedData:i})}})};function Wi(t){const e=Ki[t];if(!e)throw new Error(`Unknown behavior: ${t}. Available behaviors: ${Object.keys(Ki).join(", ")}`);return e}const Hi=Object.keys(Ki),Ji="user-managed";class Yi extends et{constructor(t={}){super(),this._instanceId=Math.random().toString(36).slice(2,8);const e=function(t){const e=[];t.name?"string"!=typeof t.name?e.push("Resource 'name' must be a string"):""===t.name.trim()&&e.push("Resource 'name' cannot be empty"):e.push("Resource 'name' is required");t.client||e.push("S3 'client' is required");t.attributes?"object"!=typeof t.attributes||Array.isArray(t.attributes)?e.push("Resource 'attributes' must be an object"):0===Object.keys(t.attributes).length&&e.push("Resource 'attributes' cannot be empty"):e.push("Resource 'attributes' are required");void 0!==t.version&&"string"!=typeof t.version&&e.push("Resource 'version' must be a string");void 0!==t.behavior&&"string"!=typeof t.behavior&&e.push("Resource 'behavior' must be a string");void 0!==t.passphrase&&"string"!=typeof t.passphrase&&e.push("Resource 'passphrase' must be a string");void 0!==t.parallelism&&("number"==typeof t.parallelism&&Number.isInteger(t.parallelism)?t.parallelism<1&&e.push("Resource 'parallelism' must be greater than 0"):e.push("Resource 'parallelism' must be an integer"));void 0===t.observers||Array.isArray(t.observers)||e.push("Resource 'observers' must be an array");const r=["cache","autoDecrypt","timestamps","paranoid","allNestedObjectsOptional"];for(const i of r)void 0!==t[i]&&"boolean"!=typeof t[i]&&e.push(`Resource '${i}' must be a boolean`);void 0!==t.idGenerator&&("function"!=typeof t.idGenerator&&"number"!=typeof t.idGenerator?e.push("Resource 'idGenerator' must be a function or a number (size)"):"number"==typeof t.idGenerator&&t.idGenerator<=0&&e.push("Resource 'idGenerator' size must be greater than 0"));void 0!==t.idSize&&("number"==typeof t.idSize&&Number.isInteger(t.idSize)?t.idSize<=0&&e.push("Resource 'idSize' must be greater than 0"):e.push("Resource 'idSize' must be an integer"));if(void 0!==t.partitions)if("object"!=typeof t.partitions||Array.isArray(t.partitions))e.push("Resource 'partitions' must be an object");else for(const[r,i]of Object.entries(t.partitions))if("object"!=typeof i||Array.isArray(i))e.push(`Partition '${r}' must be an object`);else if(i.fields)if("object"!=typeof i.fields||Array.isArray(i.fields))e.push(`Partition '${r}.fields' must be an object`);else for(const[t,s]of Object.entries(i.fields))"string"!=typeof s&&e.push(`Partition '${r}.fields.${t}' must be a string`);else e.push(`Partition '${r}' must have a 'fields' property`);if(void 0!==t.hooks)if("object"!=typeof t.hooks||Array.isArray(t.hooks))e.push("Resource 'hooks' must be an object");else{const r=["beforeInsert","afterInsert","beforeUpdate","afterUpdate","beforeDelete","afterDelete"];for(const[i,s]of Object.entries(t.hooks))if(r.includes(i))if(Array.isArray(s))for(let t=0;t<s.length;t++){const e=s[t];if("function"==typeof e);else if("string"==typeof e)continue}else e.push(`Resource 'hooks.${i}' must be an array`);else e.push(`Invalid hook event '${i}'. Valid events: ${r.join(", ")}`)}return{isValid:0===e.length,errors:e}}(t);if(!e.isValid)throw new F(`Invalid Resource ${t.name} configuration`,{resourceName:t.name,validation:e.errors,operation:"constructor",suggestion:"Check resource config and attributes."});const{name:r,client:i,version:s="1",attributes:n={},behavior:a=Ji,passphrase:o="secret",parallelism:c=10,observers:u=[],cache:l=!1,autoDecrypt:h=!0,timestamps:f=!1,partitions:d={},paranoid:p=!0,allNestedObjectsOptional:m=!0,hooks:g={},idGenerator:y,idSize:b=22,versioningEnabled:w=!1}=t;if(this.name=r,this.client=i,this.version=s,this.behavior=a,this.observers=u,this.parallelism=c,this.passphrase=o??"secret",this.versioningEnabled=w,this.idGenerator=this.configureIdGenerator(y,b),this.config={cache:l,hooks:g,paranoid:p,timestamps:f,partitions:d,autoDecrypt:h,allNestedObjectsOptional:m},this.hooks={beforeInsert:[],afterInsert:[],beforeUpdate:[],afterUpdate:[],beforeDelete:[],afterDelete:[]},this.attributes=n||{},this.map=t.map,this.applyConfiguration({map:this.map}),g)for(const[t,e]of Object.entries(g))if(Array.isArray(e)&&this.hooks[t])for(const r of e)"function"==typeof r&&this.hooks[t].push(r.bind(this));this._initMiddleware()}configureIdGenerator(t,r){return"function"==typeof t?t:"number"==typeof t&&t>0?e.customAlphabet(e.urlAlphabet,t):"number"==typeof r&&r>0&&22!==r?e.customAlphabet(e.urlAlphabet,r):Q}get options(){return{timestamps:this.config.timestamps,partitions:this.config.partitions||{},cache:this.config.cache,autoDecrypt:this.config.autoDecrypt,paranoid:this.config.paranoid,allNestedObjectsOptional:this.config.allNestedObjectsOptional}}export(){const t=this.schema.export();return t.behavior=this.behavior,t.timestamps=this.config.timestamps,t.partitions=this.config.partitions||{},t.paranoid=this.config.paranoid,t.allNestedObjectsOptional=this.config.allNestedObjectsOptional,t.autoDecrypt=this.config.autoDecrypt,t.cache=this.config.cache,t.hooks=this.hooks,t.map=this.map,t}applyConfiguration({map:t}={}){this.config.timestamps&&(this.attributes.createdAt||(this.attributes.createdAt="string|optional"),this.attributes.updatedAt||(this.attributes.updatedAt="string|optional"),this.config.partitions||(this.config.partitions={}),this.config.partitions.byCreatedDate||(this.config.partitions.byCreatedDate={fields:{createdAt:"date|maxlength:10"}}),this.config.partitions.byUpdatedDate||(this.config.partitions.byUpdatedDate={fields:{updatedAt:"date|maxlength:10"}})),this.setupPartitionHooks(),this.versioningEnabled&&(this.config.partitions.byVersion||(this.config.partitions.byVersion={fields:{_v:"string"}})),this.schema=new Di({name:this.name,attributes:this.attributes,passphrase:this.passphrase,version:this.version,options:{autoDecrypt:this.config.autoDecrypt,allNestedObjectsOptional:this.config.allNestedObjectsOptional},map:t||this.map}),this.validatePartitions()}updateAttributes(t){const e=this.attributes;return this.attributes=t,this.applyConfiguration({map:this.schema?.map}),{oldAttributes:e,newAttributes:t}}addHook(t,e){this.hooks[t]&&this.hooks[t].push(e.bind(this))}async executeHooks(t,e){if(!this.hooks[t])return e;let r=e;for(const e of this.hooks[t])r=await e(r);return r}setupPartitionHooks(){if(!this.config.partitions)return;const t=this.config.partitions;0!==Object.keys(t).length&&(this.hooks.afterInsert||(this.hooks.afterInsert=[]),this.hooks.afterInsert.push(async t=>(await this.createPartitionReferences(t),t)),this.hooks.afterDelete||(this.hooks.afterDelete=[]),this.hooks.afterDelete.push(async t=>(await this.deletePartitionReferences(t),t)))}async validate(t){const e={original:n.cloneDeep(t),isValid:!1,errors:[]},r=await this.schema.validate(t,{mutateOriginal:!1});return!0===r?e.isValid=!0:e.errors=r,e.data=t,e}validatePartitions(){if(!this.config.partitions)return;const t=this.config.partitions;if(0===Object.keys(t).length)return;const e=Object.keys(this.attributes||{});for(const[r,i]of Object.entries(t))if(i.fields)for(const t of Object.keys(i.fields))if(!this.fieldExistsInAttributes(t))throw new B(`Partition '${r}' uses field '${t}' which does not exist in resource attributes. Available fields: ${e.join(", ")}.`,{resourceName:this.name,partitionName:r,fieldName:t,availableFields:e,operation:"validatePartitions"})}fieldExistsInAttributes(t){if(t.startsWith("_"))return!0;if(!t.includes("."))return Object.keys(this.attributes||{}).includes(t);const e=t.split(".");let r=this.attributes||{};for(const t of e){if(!r||"object"!=typeof r||!(t in r))return!1;r=r[t]}return!0}applyPartitionRule(t,e){if(null==t)return t;let r=t;if("string"==typeof e&&e.includes("maxlength:")){const t=e.match(/maxlength:(\d+)/);if(t){const e=parseInt(t[1]);"string"==typeof r&&r.length>e&&(r=r.substring(0,e))}}if(e.includes("date"))if(r instanceof Date)r=r.toISOString().split("T")[0];else if("string"==typeof r)if(r.includes("T")&&r.includes("Z"))r=r.split("T")[0];else{const t=new Date(r);isNaN(t.getTime())||(r=t.toISOString().split("T")[0])}return r}getResourceKey(t){return mt("resource="+this.name,"data",`id=${t}`)}getPartitionKey({partitionName:t,id:e,data:r}){if(!this.config.partitions||!this.config.partitions[t])throw new B(`Partition '${t}' not found`,{resourceName:this.name,partitionName:t,operation:"getPartitionKey"});const i=this.config.partitions[t],s=[],n=Object.entries(i.fields).sort(([t],[e])=>t.localeCompare(e));for(const[t,e]of n){const i=this.getNestedFieldValue(r,t),n=this.applyPartitionRule(i,e);if(null==n)return null;s.push(`${t}=${n}`)}if(0===s.length)return null;const a=e||r?.id;return a?mt(`resource=${this.name}`,`partition=${t}`,...s,`id=${a}`):null}getNestedFieldValue(t,e){if(!e.includes("."))return t[e];const r=e.split(".");let i=t;for(const t of r){if(!i||"object"!=typeof i||!(t in i))return;i=i[t]}return i}calculateContentLength(t){return t?Buffer.isBuffer(t)?t.length:"string"==typeof t?Buffer.byteLength(t,"utf8"):"object"==typeof t?Buffer.byteLength(JSON.stringify(t),"utf8"):Buffer.byteLength(String(t),"utf8"):0}async insert({id:t,...e}){if(await this.exists(t))throw new Error(`Resource with id '${t}' already exists`);this.getResourceKey(t||"(auto)"),this.options.timestamps&&(e.createdAt=(new Date).toISOString(),e.updatedAt=(new Date).toISOString());const r={id:t,...this.applyDefaults(e)},i=await this.executeHooks("beforeInsert",r),s=Object.keys(i).filter(t=>!(t in r)||i[t]!==r[t]),n={};for(const t of s)n[t]=i[t];const{errors:a,isValid:o,data:c}=await this.validate(i);if(!o){const t=a&&a.length&&a[0].message?a[0].message:"Insert failed";throw new C({bucket:this.client.config.bucket,resourceName:this.name,attributes:i,validation:a,message:t})}const{id:u,...l}=c;Object.assign(l,n);const h=u||t||this.idGenerator(),f=await this.schema.mapper(l);f._v=String(this.version);const d=Wi(this.behavior),{mappedData:p,body:m}=await d.handleInsert({resource:this,data:l,mappedData:f,originalData:r}),g=p,y=this.getResourceKey(h);let b;if(m&&""!==m){const[t,e]=await V(()=>Promise.resolve(JSON.parse(m)));t&&(b="application/json")}if("body-only"===this.behavior&&(!m||""===m))throw new Error(`[Resource.insert] Attempt to save object without body! Data: id=${h}, resource=${this.name}`);const[w,v,k]=await V(()=>this.client.putObject({key:y,body:m,contentType:b,metadata:g}));if(!w){const t=v&&v.message?v.message:"";if(t.includes("metadata headers exceed")||t.includes("Insert failed")){const t=S(g),e=O({s3Limit:2047,systemConfig:{version:this.version,timestamps:this.config.timestamps,id:h}}),r=t-e;throw v.totalSize=t,v.limit=2047,v.effectiveLimit=e,v.excess=r,new F("metadata headers exceed",{resourceName:this.name,operation:"insert",id:h,totalSize:t,effectiveLimit:e,excess:r,suggestion:"Reduce metadata size or number of fields."})}throw $(v,{bucket:this.client.config.bucket,key:y,resourceName:this.name,operation:"insert",id:h})}let _=await this.composeFullObjectFromWrite({id:h,metadata:g,body:m,behavior:this.behavior});const j=await this.executeHooks("afterInsert",_);return this.emit("insert",{..._,$before:{...r},$after:{...j}}),j}async get(t){if(n.isObject(t))throw new Error("id cannot be an object");if(n.isEmpty(t))throw new Error("id cannot be empty");const e=this.getResourceKey(t),[r,i,s]=await V(()=>this.client.getObject(e));if(!r)throw $(i,{bucket:this.client.config.bucket,key:e,resourceName:this.name,operation:"get",id:t});if(0===s.ContentLength){const r=new Error(`No such key: ${e} [bucket:${this.client.config.bucket}]`);throw r.name="NoSuchKey",$(r,{bucket:this.client.config.bucket,key:e,resourceName:this.name,operation:"get",id:t})}const a=s.Metadata?._v||this.version,o="string"==typeof a&&a.startsWith("v")?a.slice(1):a,c=await this.getSchemaForVersion(o);let u=await c.unmapper(s.Metadata);const l=Wi(this.behavior);let h="";if(s.ContentLength>0){const[t,r,i]=await V(()=>this.client.getObject(e));h=t?await Zr(i.Body):""}const{metadata:f}=await l.handleGet({resource:this,metadata:u,body:h});let d=await this.composeFullObjectFromWrite({id:t,metadata:f,body:h,behavior:this.behavior});d._contentLength=s.ContentLength,d._lastModified=s.LastModified,d._hasContent=s.ContentLength>0,d._mimeType=s.ContentType||null,d._v=o,s.VersionId&&(d._versionId=s.VersionId),s.Expiration&&(d._expiresAt=s.Expiration),d._definitionHash=this.getDefinitionHash(),o!==this.version&&(d=await this.applyVersionMapping(d,o,this.version)),this.emit("get",d);return d}async exists(t){const e=this.getResourceKey(t),[r,i]=await V(()=>this.client.headObject(e));return r}async update(t,e){if(n.isEmpty(t))throw new Error("id cannot be empty");if(!await this.exists(t))throw new Error(`Resource with id '${t}' does not exist`);const r=await this.get(t),i=n.cloneDeep(e);let s=n.cloneDeep(r);for(const[t,e]of Object.entries(i))if(t.includes(".")){let r=s;const i=t.split(".");for(let t=0;t<i.length-1;t++)"object"==typeof r[i[t]]&&null!==r[i[t]]||(r[i[t]]={}),r=r[i[t]];r[i[i.length-1]]=n.cloneDeep(e)}else"object"!=typeof e||null===e||Array.isArray(e)?s[t]=n.cloneDeep(e):s[t]=n.merge({},s[t],e);if(this.config.timestamps){const t=(new Date).toISOString();s.updatedAt=t,s.metadata||(s.metadata={}),s.metadata.updatedAt=t}const a=await this.executeHooks("beforeUpdate",n.cloneDeep(s)),o={...r,...a,id:t},{isValid:c,errors:u,data:l}=await this.validate(n.cloneDeep(o));if(!c)throw new C({bucket:this.client.config.bucket,resourceName:this.name,attributes:a,validation:u,message:"validation: "+(u&&u.length?JSON.stringify(u):"unknown")});await this.schema.mapper(l);const h=Wi(this.behavior),f=await this.schema.mapper({...r,...a});f._v=String(this.version),await h.handleUpdate({resource:this,id:t,data:{...r,...a},mappedData:f,originalData:{...i,id:t}});const{id:d,...p}=l,m={...r,id:t},g={...p,id:t};await this.handlePartitionReferenceUpdates(m,g);const y=await this.schema.mapper(p);y._v=String(this.version);const b=Wi(this.behavior),{mappedData:w,body:v}=await b.handleUpdate({resource:this,id:t,data:p,mappedData:y,originalData:{...i,id:t}}),k=w,_=this.getResourceKey(t);let j,R=v;if(""===v&&"body-overflow"!==this.behavior){const[t,e,r]=await V(()=>this.client.getObject(_));if(t&&r.ContentLength>0){const t=Buffer.from(await r.Body.transformToByteArray()),e=t.toString(),[i,s]=await V(()=>Promise.resolve(JSON.parse(e)));i||(R=t,j=r.ContentType)}}let E=j;if(R&&""!==R&&!E){const[t,e]=await V(()=>Promise.resolve(JSON.parse(R)));t&&(E="application/json")}this.versioningEnabled&&r._v!==this.version&&await this.createHistoricalVersion(t,r);const[x,D]=await V(()=>this.client.putObject({key:_,body:R,contentType:E,metadata:k}));if(!x&&D&&D.message&&D.message.includes("metadata headers exceed")){const e=S(k),r=O({s3Limit:2047,systemConfig:{version:this.version,timestamps:this.config.timestamps,id:t}}),i=e-r;throw D.totalSize=e,D.limit=2047,D.effectiveLimit=r,D.excess=i,this.emit("exceedsLimit",{operation:"update",totalSize:e,limit:2047,effectiveLimit:r,excess:i,data:p}),new F("metadata headers exceed",{resourceName:this.name,operation:"update",id:t,totalSize:e,effectiveLimit:r,excess:i,suggestion:"Reduce metadata size or number of fields."})}if(!x)throw $(D,{bucket:this.client.config.bucket,key:_,resourceName:this.name,operation:"update",id:t});const A=await this.composeFullObjectFromWrite({id:t,metadata:k,body:R,behavior:this.behavior}),N=await this.executeHooks("afterUpdate",A);return this.emit("update",{...A,$before:{...r},$after:{...N}}),N}async delete(t){if(n.isEmpty(t))throw new Error("id cannot be empty");let e,r=null;const[i,s,a]=await V(()=>this.get(t));i?e=a:(e={id:t},r=s),await this.executeHooks("beforeDelete",e);const o=this.getResourceKey(t),[c,u,l]=await V(()=>this.client.deleteObject(o));if(this.emit("delete",{...e,$before:{...e},$after:null}),r)throw $(r,{bucket:this.client.config.bucket,key:o,resourceName:this.name,operation:"delete",id:t});if(!c)throw $(u,{key:o,resourceName:this.name,operation:"delete",id:t});return await this.executeHooks("afterDelete",e),l}async upsert({id:t,...e}){return await this.exists(t)?this.update(t,e):this.insert({id:t,...e})}async count({partition:t=null,partitionValues:e={}}={}){let r;if(t&&Object.keys(e).length>0){const i=this.config.partitions[t];if(!i)throw new B(`Partition '${t}' not found`,{resourceName:this.name,partitionName:t,operation:"count"});const s=[],n=Object.entries(i.fields).sort(([t],[e])=>t.localeCompare(e));for(const[t,r]of n){const i=e[t];if(null!=i){const e=this.applyPartitionRule(i,r);s.push(`${t}=${e}`)}}r=s.length>0?`resource=${this.name}/partition=${t}/${s.join("/")}`:`resource=${this.name}/partition=${t}`}else r=`resource=${this.name}/data`;const i=await this.client.count({prefix:r});return this.emit("count",i),i}async insertMany(t){const{results:e}=await i.PromisePool.for(t).withConcurrency(this.parallelism).handleError(async(t,e)=>{this.emit("error",t,e),this.observers.map(r=>r.emit("error",this.name,t,e))}).process(async t=>await this.insert(t));return this.emit("insertMany",t.length),e}async deleteMany(t){const e=n.chunk(t.map(t=>this.getResourceKey(t)),1e3);t.map(t=>this.getResourceKey(t));const{results:r}=await i.PromisePool.for(e).withConcurrency(this.parallelism).handleError(async(t,e)=>{this.emit("error",t,e),this.observers.map(r=>r.emit("error",this.name,t,e))}).process(async t=>{const e=await this.client.deleteObjects(t);return t.forEach(t=>{const e=t.split("/").find(t=>t.startsWith("id=")),r=e?e.replace("id=",""):null;r&&(this.emit("deleted",r),this.observers.map(t=>t.emit("deleted",this.name,r)))}),e});return this.emit("deleteMany",t.length),r}async deleteAll(){if(!1!==this.config.paranoid)throw new F("deleteAll() is a dangerous operation and requires paranoid: false option.",{resourceName:this.name,operation:"deleteAll",paranoid:this.config.paranoid,suggestion:"Set paranoid: false to allow deleteAll."});const t=`resource=${this.name}/data`,e=await this.client.deleteAll({prefix:t});return this.emit("deleteAll",{version:this.version,prefix:t,deletedCount:e}),{deletedCount:e,version:this.version}}async deleteAllData(){if(!1!==this.config.paranoid)throw new F("deleteAllData() is a dangerous operation and requires paranoid: false option.",{resourceName:this.name,operation:"deleteAllData",paranoid:this.config.paranoid,suggestion:"Set paranoid: false to allow deleteAllData."});const t=`resource=${this.name}`,e=await this.client.deleteAll({prefix:t});return this.emit("deleteAllData",{resource:this.name,prefix:t,deletedCount:e}),{deletedCount:e,resource:this.name}}async listIds({partition:t=null,partitionValues:e={},limit:r,offset:i=0}={}){let s;if(t&&Object.keys(e).length>0){if(!this.config.partitions||!this.config.partitions[t])throw new B(`Partition '${t}' not found`,{resourceName:this.name,partitionName:t,operation:"listIds"});const r=this.config.partitions[t],i=[],n=Object.entries(r.fields).sort(([t],[e])=>t.localeCompare(e));for(const[t,r]of n){const s=e[t];if(null!=s){const e=this.applyPartitionRule(s,r);i.push(`${t}=${e}`)}}s=i.length>0?`resource=${this.name}/partition=${t}/${i.join("/")}`:`resource=${this.name}/partition=${t}`}else s=`resource=${this.name}/data`;const n=(await this.client.getKeysPage({prefix:s,offset:i,amount:r||1e3})).map(t=>{const e=t.split("/").find(t=>t.startsWith("id="));return e?e.replace("id=",""):null}).filter(Boolean);return this.emit("listIds",n.length),n}async list({partition:t=null,partitionValues:e={},limit:r,offset:i=0}={}){const[s,n,a]=await V(async()=>t?await this.listPartition({partition:t,partitionValues:e,limit:r,offset:i}):await this.listMain({limit:r,offset:i}));return s?a:this.handleListError(n,{partition:t,partitionValues:e})}async listMain({limit:t,offset:e=0}){const[r,i,s]=await V(()=>this.listIds({limit:t,offset:e}));if(!r)throw i;const n=await this.processListResults(s,"main");return this.emit("list",{count:n.length,errors:0}),n}async listPartition({partition:t,partitionValues:e,limit:r,offset:i=0}){if(!this.config.partitions?.[t])return this.emit("list",{partition:t,partitionValues:e,count:0,errors:0}),[];const s=this.config.partitions[t],n=this.buildPartitionPrefix(t,s,e),[a,o,c]=await V(()=>this.client.getAllKeys({prefix:n}));if(!a)throw o;const u=this.extractIdsFromKeys(c).slice(i),l=r?u.slice(0,r):u,h=await this.processPartitionResults(l,t,s,c);return this.emit("list",{partition:t,partitionValues:e,count:h.length,errors:0}),h}buildPartitionPrefix(t,e,r){const i=[],s=Object.entries(e.fields).sort(([t],[e])=>t.localeCompare(e));for(const[t,e]of s){const s=r[t];if(null!=s){const r=this.applyPartitionRule(s,e);i.push(`${t}=${r}`)}}return i.length>0?`resource=${this.name}/partition=${t}/${i.join("/")}`:`resource=${this.name}/partition=${t}`}extractIdsFromKeys(t){return t.map(t=>{const e=t.split("/").find(t=>t.startsWith("id="));return e?e.replace("id=",""):null}).filter(Boolean)}async processListResults(t,e="main"){const{results:r,errors:s}=await i.PromisePool.for(t).withConcurrency(this.parallelism).handleError(async(t,e)=>{this.emit("error",t,content),this.observers.map(e=>e.emit("error",this.name,t,content))}).process(async t=>{const[r,i,s]=await V(()=>this.get(t));return r?s:this.handleResourceError(i,t,e)});return this.emit("list",{count:r.length,errors:0}),r}async processPartitionResults(t,e,r,s){const n=Object.entries(r.fields).sort(([t],[e])=>t.localeCompare(e)),{results:a,errors:o}=await i.PromisePool.for(t).withConcurrency(this.parallelism).handleError(async(t,e)=>{this.emit("error",t,content),this.observers.map(e=>e.emit("error",this.name,t,content))}).process(async t=>{const[r,i,a]=await V(async()=>{const r=this.extractPartitionValuesFromKey(t,s,n);return await this.getFromPartition({id:t,partitionName:e,partitionValues:r})});return r?a:this.handleResourceError(i,t,"partition")});return a.filter(t=>null!==t)}extractPartitionValuesFromKey(t,e,r){const i=e.find(e=>e.includes(`id=${t}`));if(!i)throw new B(`Partition key not found for ID ${t}`,{resourceName:this.name,id:t,operation:"extractPartitionValuesFromKey"});const s=i.split("/"),n={};for(const[t]of r){const e=s.find(e=>e.startsWith(`${t}=`));if(e){const r=e.replace(`${t}=`,"");n[t]=r}}return n}handleResourceError(t,e,r){if(t.message.includes("Cipher job failed")||t.message.includes("OperationError"))return{id:e,_decryptionFailed:!0,_error:t.message,..."partition"===r&&{_partition:r}};throw t}handleListError(t,{partition:e,partitionValues:r}){return t.message.includes("Partition '")&&t.message.includes("' not found"),this.emit("list",{partition:e,partitionValues:r,count:0,errors:1}),[]}async getMany(t){const{results:e,errors:r}=await i.PromisePool.for(t).withConcurrency(this.client.parallelism).handleError(async(t,e)=>(this.emit("error",t,content),this.observers.map(e=>e.emit("error",this.name,t,content)),{id:e,_error:t.message,_decryptionFailed:t.message.includes("Cipher job failed")||t.message.includes("OperationError")})).process(async t=>{const[e,r,i]=await V(()=>this.get(t));if(e)return i;if(r.message.includes("Cipher job failed")||r.message.includes("OperationError"))return{id:t,_decryptionFailed:!0,_error:r.message};throw r});return this.emit("getMany",t.length),e}async getAll(){const[t,e,r]=await V(()=>this.listIds());if(!t)throw e;const i=[];for(const t of r){const[e,r,s]=await V(()=>this.get(t));e&&i.push(s)}return i}async page({offset:t=0,size:e=100,partition:r=null,partitionValues:i={},skipCount:s=!1}={}){const[n,a,o]=await V(async()=>{let n=null,a=null;if(!s){const[t,s,o]=await V(()=>this.count({partition:r,partitionValues:i}));t?(n=o,a=Math.ceil(n/e)):(n=null,a=null)}const o=Math.floor(t/e);let c=[];if(e<=0)c=[];else{const[s,n,a]=await V(()=>this.list({partition:r,partitionValues:i,limit:e,offset:t}));c=s?a:[]}const u={items:c,totalItems:n,page:o,pageSize:e,totalPages:a,hasMore:c.length===e&&t+e<(n||1/0),_debug:{requestedSize:e,requestedOffset:t,actualItemsReturned:c.length,skipCount:s,hasTotalItems:null!==n}};return this.emit("page",u),u});return n?o:{items:[],totalItems:null,page:Math.floor(t/e),pageSize:e,totalPages:null,_debug:{requestedSize:e,requestedOffset:t,actualItemsReturned:0,skipCount:s,hasTotalItems:!1,error:a.message}}}readable(){return new Qr({resource:this}).build()}writable(){return new Xr({resource:this}).build()}async setContent({id:t,buffer:e,contentType:r="application/octet-stream"}){const[i,s,n]=await V(()=>this.get(t));if(!i||!n)throw new F(`Resource with id '${t}' not found`,{resourceName:this.name,id:t,operation:"setContent"});const a={...n,_hasContent:!0,_contentLength:e.length,_mimeType:r},o=await this.schema.mapper(a),[c,u]=await V(()=>this.client.putObject({key:this.getResourceKey(t),metadata:o,body:e,contentType:r}));if(!c)throw u;return this.emit("setContent",{id:t,contentType:r,contentLength:e.length}),a}async content(t){const e=this.getResourceKey(t),[r,i,s]=await V(()=>this.client.getObject(e));if(!r){if("NoSuchKey"===i.name)return{buffer:null,contentType:null};throw i}const n=Buffer.from(await s.Body.transformToByteArray()),a=s.ContentType||null;return this.emit("content",t,n.length,a),{buffer:n,contentType:a}}async hasContent(t){const e=this.getResourceKey(t),[r,i,s]=await V(()=>this.client.headObject(e));return!!r&&s.ContentLength>0}async deleteContent(t){const e=this.getResourceKey(t),[r,i,s]=await V(()=>this.client.headObject(e));if(!r)throw i;const n=s.Metadata||{},[a,o,c]=await V(()=>this.client.putObject({key:e,body:"",metadata:n}));if(!a)throw o;return this.emit("deleteContent",t),c}getDefinitionHash(){const t={attributes:this.attributes,behavior:this.behavior},e=o(t);return`sha256:${a.createHash("sha256").update(e).digest("hex")}`}extractVersionFromKey(t){const e=t.split("/").find(t=>t.startsWith("v="));return e?e.replace("v=",""):null}async getSchemaForVersion(t){if(t===this.version)return this.schema;const[e,r,i]=await V(()=>Promise.resolve(new Di({name:this.name,attributes:this.attributes,passphrase:this.passphrase,version:t,options:{...this.config,autoDecrypt:!0,autoEncrypt:!0}})));return e?i:this.schema}async createPartitionReferences(t){const e=this.config.partitions;if(e&&0!==Object.keys(e).length)for(const[r,i]of Object.entries(e)){const e=this.getPartitionKey({partitionName:r,id:t.id,data:t});if(e){const t={_v:String(this.version)};await this.client.putObject({key:e,metadata:t,body:"",contentType:void 0})}}}async deletePartitionReferences(t){const e=this.config.partitions;if(!e||0===Object.keys(e).length)return;const r=[];for(const[i,s]of Object.entries(e)){const e=this.getPartitionKey({partitionName:i,id:t.id,data:t});e&&r.push(e)}if(r.length>0){const[t,e]=await V(()=>this.client.deleteObjects(r))}}async query(t={},{limit:e=100,offset:r=0,partition:i=null,partitionValues:s={}}={}){if(0===Object.keys(t).length)return await this.list({partition:i,partitionValues:s,limit:e,offset:r});const n=[];let a=r;const o=Math.min(e,50);for(;n.length<e;){const e=await this.list({partition:i,partitionValues:s,limit:o,offset:a});if(0===e.length)break;const r=e.filter(e=>Object.entries(t).every(([t,r])=>e[t]===r));if(n.push(...r),a+=o,e.length<o)break}return n.slice(0,e)}async handlePartitionReferenceUpdates(t,e){const r=this.config.partitions;if(!r||0===Object.keys(r).length)return;for(const[i,s]of Object.entries(r)){const[r,n]=await V(()=>this.handlePartitionReferenceUpdate(i,s,t,e))}const i=e.id||t.id;for(const[t,s]of Object.entries(r)){const r=`resource=${this.name}/partition=${t}`;let s=[];const[n,a,o]=await V(()=>this.client.getAllKeys({prefix:r}));if(!n)continue;s=o;const c=this.getPartitionKey({partitionName:t,id:i,data:e});for(const t of s)if(t.endsWith(`/id=${i}`)&&t!==c){const[e,r]=await V(()=>this.client.deleteObject(t))}}}async handlePartitionReferenceUpdate(t,e,r,i){const s=i.id||r.id,n=this.getPartitionKey({partitionName:t,id:s,data:r}),a=this.getPartitionKey({partitionName:t,id:s,data:i});if(n!==a){if(n){const[t,e]=await V(async()=>{await this.client.deleteObject(n)})}if(a){const[t,e]=await V(async()=>{const t={_v:String(this.version)};await this.client.putObject({key:a,metadata:t,body:"",contentType:void 0})})}}else if(a){const[t,e]=await V(async()=>{const t={_v:String(this.version)};await this.client.putObject({key:a,metadata:t,body:"",contentType:void 0})})}}async updatePartitionReferences(t){const e=this.config.partitions;if(e&&0!==Object.keys(e).length)for(const[r,i]of Object.entries(e)){if(!i||!i.fields||"object"!=typeof i.fields)continue;const e=this.getPartitionKey({partitionName:r,id:t.id,data:t});if(e){const t={_v:String(this.version)},[r,i]=await V(async()=>{await this.client.putObject({key:e,metadata:t,body:"",contentType:void 0})})}}}async getFromPartition({id:t,partitionName:e,partitionValues:r={}}){if(!this.config.partitions||!this.config.partitions[e])throw new B(`Partition '${e}' not found`,{resourceName:this.name,partitionName:e,operation:"getFromPartition"});const i=this.config.partitions[e],s=[],n=Object.entries(i.fields).sort(([t],[e])=>t.localeCompare(e));for(const[t,e]of n){const i=r[t];if(null!=i){const r=this.applyPartitionRule(i,e);s.push(`${t}=${r}`)}}if(0===s.length)throw new B(`No partition values provided for partition '${e}'`,{resourceName:this.name,partitionName:e,operation:"getFromPartition"});const a=mt(`resource=${this.name}`,`partition=${e}`,...s,`id=${t}`),[o,c]=await V(async()=>{await this.client.headObject(a)});if(!o)throw new F(`Resource with id '${t}' not found in partition '${e}'`,{resourceName:this.name,id:t,partitionName:e,operation:"getFromPartition"});const u=await this.get(t);return u._partition=e,u._partitionValues=r,this.emit("getFromPartition",u),u}async createHistoricalVersion(t,e){const r=mt(`resource=${this.name}`,"historical",`id=${t}`),i={...e,_v:e._v||this.version,_historicalTimestamp:(new Date).toISOString()},s=await this.schema.mapper(i),n=Wi(this.behavior),{mappedData:a,body:o}=await n.handleInsert({resource:this,data:i,mappedData:s}),c={...a,_v:e._v||this.version,_historicalTimestamp:i._historicalTimestamp};let u;if(o&&""!==o){const[t,e]=await V(()=>Promise.resolve(JSON.parse(o)));t&&(u="application/json")}await this.client.putObject({key:r,metadata:c,body:o,contentType:u})}async applyVersionMapping(t,e,r){if(e===r)return t;return{...t,_v:r,_originalVersion:e,_versionMapped:!0}}async composeFullObjectFromWrite({id:t,metadata:e,body:r,behavior:i}){const s={};e&&"true"===e.$truncated&&(s.$truncated="true"),e&&"true"===e.$overflow&&(s.$overflow="true");let n={};const[a,o,c]=await V(()=>this.schema.unmapper(e));n=a?c:e;const u=t=>{if(!t||"object"!=typeof t)return t;const e={};for(const[r,i]of Object.entries(t))r.startsWith("_")||(e[r]=i);return e},l=t=>{if("object"==typeof t&&null!==t)return t;if("string"==typeof t){if("[object Object]"===t)return{};if(t.startsWith("{")||t.startsWith("[")){const[e,r,i]=z(()=>JSON.parse(t));return e?i:t}return t}return t};if("body-overflow"===i){const i=e&&"true"===e.$overflow;let s={};if(i&&r){const[t,e,i]=await V(()=>Promise.resolve(JSON.parse(r)));if(t){const[t,e,r]=await V(()=>this.schema.unmapper(i));s=t?r:{}}}const a={...n,...s,id:t};Object.keys(a).forEach(t=>{a[t]=l(a[t])});const o=u(a);return i&&(o.$overflow="true"),o}if("body-only"===i){const[i,s,n]=await V(()=>Promise.resolve(r?JSON.parse(r):{}));let a=this.schema.map;if(e&&e._map){const[t,r,i]=await V(()=>Promise.resolve("string"==typeof e._map?JSON.parse(e._map):e._map));a=t?i:this.schema.map}const[o,c,u]=await V(()=>this.schema.unmapper(n,a)),h=o?{...u,id:t}:{id:t};return Object.keys(h).forEach(t=>{h[t]=l(h[t])}),h}const h={...n,id:t};Object.keys(h).forEach(t=>{h[t]=l(h[t])});const f=u(h);return s.$truncated&&(f.$truncated=s.$truncated),s.$overflow&&(f.$overflow=s.$overflow),f}emit(t,...e){return super.emit(t,...e)}async replace(t,e){await this.delete(t),await new Promise(t=>setTimeout(t,100));const r=Date.now();for(;Date.now()-r<5e3;){if(!await this.exists(t))break;await new Promise(t=>setTimeout(t,50))}try{return await this.insert({...e,id:t})}catch(r){if(r&&r.message&&r.message.includes("already exists")){return await this.update(t,e)}throw r}}_initMiddleware(){this._middlewares=new Map,this._middlewareMethods=["get","list","listIds","getAll","count","page","insert","update","delete","deleteMany","exists","getMany"];for(const t of this._middlewareMethods)this._middlewares.set(t,[]),this[`_original_${t}`]||(this[`_original_${t}`]=this[t].bind(this),this[t]=async(...e)=>{const r={resource:this,args:e,method:t};let i=-1;const s=this._middlewares.get(t),n=async e=>{if(e<=i)throw new Error("next() called multiple times");return i=e,e<s.length?await s[e](r,()=>n(e+1)):await this[`_original_${t}`](...r.args)};return await n(0)})}useMiddleware(t,e){if(this._middlewares||this._initMiddleware(),!this._middlewares.has(t))throw new F(`No such method for middleware: ${t}`,{operation:"useMiddleware",method:t});this._middlewares.get(t).push(e)}applyDefaults(t){const e={...t};for(const[t,r]of Object.entries(this.attributes))if(void 0===e[t]&&"string"==typeof r&&r.includes("default:")){const i=r.match(/default:([^|]+)/);if(i){let s=i[1];r.includes("boolean")?s="true"===s:r.includes("number")&&(s=Number(s)),e[t]=s}}return e}}var Gi=Yi;class Qi extends et{constructor(t){super(),this.version="1",this.s3dbVersion=(()=>{const[t,e,r]=V(()=>"7.3.3");return t?r:"latest"})(),this.resources={},this.savedMetadata=null,this.options=t,this.verbose=t.verbose||!1,this.parallelism=parseInt(t.parallelism+"")||10,this.plugins=t.plugins||[],this.pluginList=t.plugins||[],this.cache=t.cache,this.passphrase=t.passphrase||"secret",this.versioningEnabled=t.versioningEnabled||!1;let e=t.connectionString;if(!e&&(t.bucket||t.accessKeyId||t.secretAccessKey)){const{bucket:r,region:i,accessKeyId:s,secretAccessKey:n,endpoint:a,forcePathStyle:o}=t;if(a){const t=new URL(a);s&&(t.username=encodeURIComponent(s)),n&&(t.password=encodeURIComponent(n)),t.pathname=`/${r||"s3db"}`,o&&t.searchParams.set("forcePathStyle","true"),e=t.toString()}else if(s&&n){const t=new URLSearchParams;t.set("region",i||"us-east-1"),o&&t.set("forcePathStyle","true"),e=`s3://${encodeURIComponent(s)}:${encodeURIComponent(n)}@${r||"s3db"}?${t.toString()}`}}this.client=t.client||new ki({verbose:this.verbose,parallelism:this.parallelism,connectionString:e}),this.bucket=this.client.bucket,this.keyPrefix=this.client.keyPrefix,this._exitListenerRegistered||(this._exitListenerRegistered=!0,process.on("exit",async()=>{if(this.isConnected())try{await this.disconnect()}catch(t){}}))}async connect(){await this.startPlugins();let t=null;if(await this.client.exists("s3db.json")){const e=await this.client.getObject("s3db.json");t=JSON.parse(await Zr(e?.Body))}else t=this.blankMetadataStructure(),await this.uploadMetadataFile();this.savedMetadata=t;const e=this.detectDefinitionChanges(t);for(const[e,r]of Object.entries(t.resources||{})){const t=r.currentVersion||"v0",i=r.versions?.[t];i&&(this.resources[e]=new Gi({name:e,client:this.client,database:this,version:t,attributes:i.attributes,behavior:i.behavior||"user-managed",parallelism:this.parallelism,passphrase:this.passphrase,observers:[this],cache:this.cache,timestamps:void 0!==i.timestamps&&i.timestamps,partitions:r.partitions||i.partitions||{},paranoid:void 0===i.paranoid||i.paranoid,allNestedObjectsOptional:void 0===i.allNestedObjectsOptional||i.allNestedObjectsOptional,autoDecrypt:void 0===i.autoDecrypt||i.autoDecrypt,hooks:i.hooks||{},versioningEnabled:this.versioningEnabled,map:i.map}))}e.length>0&&this.emit("resourceDefinitionsChanged",{changes:e,metadata:this.savedMetadata}),this.emit("connected",new Date)}detectDefinitionChanges(t){const e=[];for(const[r,i]of Object.entries(this.resources)){const s=this.generateDefinitionHash(i.export()),n=t.resources?.[r];if(n){const t=n.currentVersion||"v0",i=n.versions?.[t],a=i?.hash;a!==s&&e.push({type:"changed",resourceName:r,currentHash:s,savedHash:a,fromVersion:t,toVersion:this.getNextVersion(n.versions)})}else e.push({type:"new",resourceName:r,currentHash:s,savedHash:null})}for(const[r,i]of Object.entries(t.resources||{}))if(!this.resources[r]){const t=i.currentVersion||"v0",s=i.versions?.[t];e.push({type:"deleted",resourceName:r,currentHash:null,savedHash:s?.hash,deletedVersion:t})}return e}generateDefinitionHash(t,e=void 0){const r={...t.attributes};t.timestamps&&(delete r.createdAt,delete r.updatedAt);const i={attributes:r,behavior:e||t.behavior||"user-managed",partitions:t.partitions||{}},s=o(i);return`sha256:${a.createHash("sha256").update(s).digest("hex")}`}getNextVersion(t={}){const e=Object.keys(t).filter(t=>t.startsWith("v")).map(t=>parseInt(t.substring(1))).filter(t=>!isNaN(t));return`v${(e.length>0?Math.max(...e):-1)+1}`}async startPlugins(){const t=this;if(!n.isEmpty(this.pluginList)){const e=this.pluginList.map(t=>n.isFunction(t)?new t(this):t),r=e.map(async e=>{e.beforeSetup&&await e.beforeSetup(),await e.setup(t),e.afterSetup&&await e.afterSetup()});await Promise.all(r);const i=e.map(async t=>{t.beforeStart&&await t.beforeStart(),await t.start(),t.afterStart&&await t.afterStart()});await Promise.all(i)}}async usePlugin(t,e=null){const r=e||t.constructor.name.replace("Plugin","").toLowerCase();return this.plugins[r]=t,this.isConnected()&&(await t.setup(this),await t.start()),t}async uploadMetadataFile(){const t={version:this.version,s3dbVersion:this.s3dbVersion,lastUpdated:(new Date).toISOString(),resources:{}};Object.entries(this.resources).forEach(([e,r])=>{const i=r.export(),s=this.generateDefinitionHash(i),n=this.savedMetadata?.resources?.[e],a=n?.currentVersion||"v0",o=n?.versions?.[a];let c,u;o&&o.hash===s?(c=a,u=!1):(c=this.getNextVersion(n?.versions),u=!0),t.resources[e]={currentVersion:c,partitions:r.config.partitions||{},versions:{...n?.versions,[c]:{hash:s,attributes:i.attributes,behavior:i.behavior||"user-managed",timestamps:r.config.timestamps,partitions:r.config.partitions,paranoid:r.config.paranoid,allNestedObjectsOptional:r.config.allNestedObjectsOptional,autoDecrypt:r.config.autoDecrypt,cache:r.config.cache,hooks:r.config.hooks,createdAt:u?(new Date).toISOString():o?.createdAt}}},r.version!==c&&(r.version=c,r.emit("versionUpdated",{oldVersion:a,newVersion:c}))}),await this.client.putObject({key:"s3db.json",body:JSON.stringify(t,null,2),contentType:"application/json"}),this.savedMetadata=t,this.emit("metadataUploaded",t)}blankMetadataStructure(){return{version:"1",s3dbVersion:this.s3dbVersion,resources:{}}}resourceExists(t){return!!this.resources[t]}resourceExistsWithSameHash({name:t,attributes:e,behavior:r="user-managed",partitions:i={},options:s={}}){if(!this.resources[t])return{exists:!1,sameHash:!1,hash:null};const n=this.resources[t],a=this.generateDefinitionHash(n.export()),o=new Gi({name:t,attributes:e,behavior:r,partitions:i,client:this.client,version:n.version,passphrase:this.passphrase,versioningEnabled:this.versioningEnabled,...s}),c=this.generateDefinitionHash(o.export());return{exists:!0,sameHash:a===c,hash:c,existingHash:a}}async createResource({name:t,attributes:e,behavior:r="user-managed",hooks:i,...s}){if(this.resources[t]){const n=this.resources[t];if(Object.assign(n.config,{cache:this.cache,...s}),r&&(n.behavior=r),n.versioningEnabled=this.versioningEnabled,n.updateAttributes(e),i)for(const[t,e]of Object.entries(i))if(Array.isArray(e)&&n.hooks[t])for(const r of e)"function"==typeof r&&n.hooks[t].push(r.bind(n));const a=this.generateDefinitionHash(n.export(),n.behavior),o=this.savedMetadata?.resources?.[t],c=o?.currentVersion||"v0",u=o?.versions?.[c];return u&&u.hash===a||await this.uploadMetadataFile(),this.emit("s3db.resourceUpdated",t),n}const n=this.savedMetadata?.resources?.[t],a=n?.currentVersion||"v0",o=new Gi({name:t,client:this.client,version:void 0!==s.version?s.version:a,attributes:e,behavior:r,parallelism:this.parallelism,passphrase:void 0!==s.passphrase?s.passphrase:this.passphrase,observers:[this],cache:void 0!==s.cache?s.cache:this.cache,timestamps:void 0!==s.timestamps&&s.timestamps,partitions:s.partitions||{},paranoid:void 0===s.paranoid||s.paranoid,allNestedObjectsOptional:void 0===s.allNestedObjectsOptional||s.allNestedObjectsOptional,autoDecrypt:void 0===s.autoDecrypt||s.autoDecrypt,hooks:i||{},versioningEnabled:this.versioningEnabled,map:s.map,idGenerator:s.idGenerator,idSize:s.idSize});return o.database=this,this.resources[t]=o,await this.uploadMetadataFile(),this.emit("s3db.resourceCreated",t),o}resource(t){return this.resources[t]?this.resources[t]:Promise.reject(`resource ${t} does not exist`)}async listResources(){return Object.keys(this.resources).map(t=>({name:t}))}async getResource(t){if(!this.resources[t])throw new x({bucket:this.client.config.bucket,resourceName:t,id:t});return this.resources[t]}get config(){return{version:this.version,s3dbVersion:this.s3dbVersion,bucket:this.bucket,keyPrefix:this.keyPrefix,parallelism:this.parallelism,verbose:this.verbose}}isConnected(){return!!this.savedMetadata}async disconnect(){try{if(this.pluginList&&this.pluginList.length>0){for(const t of this.pluginList)t&&"function"==typeof t.removeAllListeners&&t.removeAllListeners();const t=this.pluginList.map(async t=>{try{t&&"function"==typeof t.stop&&await t.stop()}catch(t){}});await Promise.all(t)}if(this.resources&&Object.keys(this.resources).length>0){for(const[t,e]of Object.entries(this.resources))try{e&&"function"==typeof e.removeAllListeners&&e.removeAllListeners(),e._pluginWrappers&&e._pluginWrappers.clear(),e._pluginMiddlewares&&(e._pluginMiddlewares={}),e.observers&&Array.isArray(e.observers)&&(e.observers=[])}catch(t){}Object.keys(this.resources).forEach(t=>delete this.resources[t])}this.client&&"function"==typeof this.client.removeAllListeners&&this.client.removeAllListeners(),this.removeAllListeners(),this.savedMetadata=null,this.plugins={},this.pluginList=[],this.emit("disconnected",new Date)}catch(t){}}}class Xi extends Qi{}function Zi(t){return"string"==typeof t?t.trim().toLowerCase():t}var ts=class extends yi{constructor(t={},e=[],r=null){super(t),this.instanceId=Math.random().toString(36).slice(2,10),this.client=r,this.connectionString=t.connectionString;let i=e;if(e)if(Array.isArray(e)){i={};for(const t of e)"string"==typeof t&&(i[Zi(t)]=t)}else"string"==typeof e&&(i[Zi(e)]=e);else i={};this.resourcesMap=this._normalizeResources(i)}_normalizeResources(t){if(!t)return{};if(Array.isArray(t)){const e={};for(const r of t)"string"==typeof r?e[Zi(r)]=r:Array.isArray(r)&&"string"==typeof r[0]?e[Zi(r[0])]=r:"object"==typeof r&&r.resource&&(e[Zi(r.resource)]={...r});return e}if("object"==typeof t){const e={};for(const[r,i]of Object.entries(t)){const t=Zi(r);"string"==typeof i?e[t]=i:Array.isArray(i)?e[t]=i.map(t=>"string"==typeof t||"function"==typeof t?t:"object"==typeof t&&t.resource?{...t}:t):"function"==typeof i?e[t]=i:"object"==typeof i&&i.resource&&(e[t]={...i})}return e}if("function"==typeof t)return t;if("string"==typeof t){return{[Zi(t)]:t}}return{}}validateConfig(){const t=[];return this.client||this.connectionString||t.push("You must provide a client or a connectionString"),(!this.resourcesMap||"object"==typeof this.resourcesMap&&0===Object.keys(this.resourcesMap).length)&&t.push("You must provide a resources map or array"),{isValid:0===t.length,errors:t}}async initialize(t){try{if(await super.initialize(t),this.client)this.targetDatabase=this.client;else{if(!this.connectionString)throw new Error("S3dbReplicator: No client or connectionString provided");{const t={connectionString:this.connectionString,region:this.region,keyPrefix:this.keyPrefix,verbose:this.config.verbose||!1};this.targetDatabase=new Xi(t),await this.targetDatabase.connect()}}this.emit("connected",{replicator:this.name,target:this.connectionString||"client-provided"})}catch(t){throw t}}async replicate(t,e,r,i,s){let n,a,o,c;"object"==typeof t&&t.resource?(n=t.resource,a=t.operation,o=t.data,c=t.id):(n=t,a=e,o=r,c=i);const u=Zi(n),l=this._resolveDestResource(u,o),h=this._getDestResourceObj(l),f=this._applyTransformer(u,o);let d;if("insert"===a)d=await h.insert(f);else if("update"===a)d=await h.update(c,f);else{if("delete"!==a)throw new Error(`Invalid operation: ${a}. Supported operations are: insert, update, delete`);d=await h.delete(c)}return d}_applyTransformer(t,e){const r=Zi(t),i=this.resourcesMap[r];let s;return i?(Array.isArray(i)&&"function"==typeof i[1]?s=i[1](e):"function"==typeof i?s=i(e):"object"==typeof i?"function"==typeof i.transform?s=i.transform(e):"function"==typeof i.transformer&&(s=i.transformer(e)):s=e,s&&e&&e.id&&!s.id&&(s.id=e.id),!s&&e&&(s=e),s):e}_resolveDestResource(t,e){const r=Zi(t),i=this.resourcesMap[r];if(!i)return t;if(Array.isArray(i)){if("string"==typeof i[0])return i[0];if("object"==typeof i[0]&&i[0].resource)return i[0].resource;if("function"==typeof i[0])return t}return"string"==typeof i?i:(t&&!targetResourceName&&(targetResourceName=t),"object"==typeof i&&i.resource?i.resource:t)}_getDestResourceObj(t){if(!this.client||!this.client.resources)return null;const e=Object.keys(this.client.resources),r=Zi(t),i=e.find(t=>Zi(t)===r);if(!i)throw new Error(`[S3dbReplicator] Destination resource not found: ${t}. Available: ${e.join(", ")}`);return this.client.resources[i]}async replicateBatch(t,e){if(!this.enabled||!this.shouldReplicateResource(t))return{skipped:!0,reason:"resource_not_included"};const r=[],i=[];for(const s of e){const[e,n,a]=await V(()=>this.replicate({resource:t,operation:s.operation,id:s.id,data:s.data,beforeData:s.beforeData}));e?r.push(a):i.push({id:s.id,error:n.message})}return this.emit("batch_replicated",{replicator:this.name,resourceName:t,total:e.length,successful:r.length,errors:i.length}),{success:0===i.length,results:r,errors:i,total:e.length}}async testConnection(){const[t,e]=await V(async()=>(this.targetDatabase||await this.initialize(this.database),await this.targetDatabase.listResources(),!0));return!!t||(this.emit("connection_error",{replicator:this.name,error:e.message}),!1)}async getStatus(){return{...await super.getStatus(),connected:!!this.targetDatabase,targetDatabase:this.connectionString||"client-provided",resources:Object.keys(this.resourcesMap||{}),totalreplicators:this.listenerCount("replicated"),totalErrors:this.listenerCount("replicator_error")}}async cleanup(){this.targetDatabase&&this.targetDatabase.removeAllListeners(),await super.cleanup()}shouldReplicateResource(t,e){const r=Zi(t),i=this.resourcesMap[r];if(!i)return!1;if(!e)return!0;if(Array.isArray(i)){for(const t of i)if("object"==typeof t&&t.resource){if(!t.actions||!Array.isArray(t.actions))return!0;if(t.actions.includes(e))return!0}else if("string"==typeof t||"function"==typeof t)return!0;return!1}return"object"==typeof i&&i.resource?!i.actions||!Array.isArray(i.actions)||i.actions.includes(e):"string"==typeof i||"function"==typeof i}};const es={s3db:ts,sqs:class extends yi{constructor(t={},e=[],r=null){if(super(t),this.client=r,this.queueUrl=t.queueUrl,this.queues=t.queues||{},this.defaultQueue=t.defaultQueue||t.defaultQueueUrl||t.queueUrlDefault,this.region=t.region||"us-east-1",this.sqsClient=r||null,this.messageGroupId=t.messageGroupId,this.deduplicationId=t.deduplicationId,Array.isArray(e)){this.resources={};for(const t of e)"string"==typeof t?this.resources[t]=!0:"object"==typeof t&&t.name&&(this.resources[t.name]=t)}else if("object"==typeof e){this.resources=e;for(const[t,r]of Object.entries(e))r&&r.queueUrl&&(this.queues[t]=r.queueUrl)}else this.resources={}}validateConfig(){const t=[];return this.queueUrl||0!==Object.keys(this.queues).length||this.defaultQueue||this.resourceQueueMap||t.push("Either queueUrl, queues object, defaultQueue, or resourceQueueMap must be provided"),{isValid:0===t.length,errors:t}}getQueueUrlsForResource(t){if(this.resourceQueueMap&&this.resourceQueueMap[t])return this.resourceQueueMap[t];if(this.queues[t])return[this.queues[t]];if(this.queueUrl)return[this.queueUrl];if(this.defaultQueue)return[this.defaultQueue];throw new Error(`No queue URL found for resource '${t}'`)}_applyTransformer(t,e){const r=this.resources[t];let i=e;return r?("function"==typeof r.transform?i=r.transform(e):"function"==typeof r.transformer&&(i=r.transformer(e)),i||e):e}createMessage(t,e,r,i,s=null){const n={resource:t,action:e,timestamp:(new Date).toISOString(),source:"s3db-replicator"};switch(e){case"insert":case"delete":default:return{...n,data:r};case"update":return{...n,before:s,data:r}}}async initialize(t,e){if(await super.initialize(t),!this.sqsClient){const[t,r,i]=await V(()=>import("@aws-sdk/client-sqs"));if(!t)throw this.emit("initialization_error",{replicator:this.name,error:r.message}),r;const{SQSClient:s}=i;this.sqsClient=e||new s({region:this.region,credentials:this.config.credentials}),this.emit("initialized",{replicator:this.name,queueUrl:this.queueUrl,queues:this.queues,defaultQueue:this.defaultQueue})}}async replicate(t,e,r,i,s=null){if(!this.enabled||!this.shouldReplicateResource(t))return{skipped:!0,reason:"resource_not_included"};const[n,a,o]=await V(async()=>{const{SendMessageCommand:n}=await import("@aws-sdk/client-sqs"),a=this.getQueueUrlsForResource(t),o=this._applyTransformer(t,r),c=this.createMessage(t,e,o,i,s),u=[];for(const r of a){const s=new n({QueueUrl:r,MessageBody:JSON.stringify(c),MessageGroupId:this.messageGroupId,MessageDeduplicationId:this.deduplicationId?`${t}:${e}:${i}`:void 0}),a=await this.sqsClient.send(s);u.push({queueUrl:r,messageId:a.MessageId}),this.emit("replicated",{replicator:this.name,resource:t,operation:e,id:i,queueUrl:r,messageId:a.MessageId,success:!0})}return{success:!0,results:u}});return n?o:(this.emit("replicator_error",{replicator:this.name,resource:t,operation:e,id:i,error:a.message}),{success:!1,error:a.message})}async replicateBatch(t,e){if(!this.enabled||!this.shouldReplicateResource(t))return{skipped:!0,reason:"resource_not_included"};const[r,i,s]=await V(async()=>{const{SendMessageBatchCommand:r}=await import("@aws-sdk/client-sqs"),i=this.getQueueUrlsForResource(t),s=[];for(let t=0;t<e.length;t+=10)s.push(e.slice(t,t+10));const n=[],a=[];for(const e of s){const[s,o]=await V(async()=>{const s=e.map((e,r)=>({Id:`${e.id}-${r}`,MessageBody:JSON.stringify(this.createMessage(t,e.operation,e.data,e.id,e.beforeData)),MessageGroupId:this.messageGroupId,MessageDeduplicationId:this.deduplicationId?`${t}:${e.operation}:${e.id}`:void 0})),a=new r({QueueUrl:i[0],Entries:s}),o=await this.sqsClient.send(a);n.push(o)});if(!s&&(a.push({batch:e.length,error:o.message}),o.message&&(o.message.includes("Batch error")||o.message.includes("Connection")||o.message.includes("Network"))))throw o}return this.emit("batch_replicated",{replicator:this.name,resource:t,queueUrl:i[0],total:e.length,successful:n.length,errors:a.length}),{success:0===a.length,results:n,errors:a,total:e.length,queueUrl:i[0]}});if(r)return s;const n=i?.message||i||"Unknown error";return this.emit("batch_replicator_error",{replicator:this.name,resource:t,error:n}),{success:!1,error:n}}async testConnection(){const[t,e]=await V(async()=>{this.sqsClient||await this.initialize(this.database);const{GetQueueAttributesCommand:t}=await import("@aws-sdk/client-sqs"),e=new t({QueueUrl:this.queueUrl,AttributeNames:["QueueArn"]});return await this.sqsClient.send(e),!0});return!!t||(this.emit("connection_error",{replicator:this.name,error:e.message}),!1)}async getStatus(){return{...await super.getStatus(),connected:!!this.sqsClient,queueUrl:this.queueUrl,region:this.region,resources:Object.keys(this.resources||{}),totalreplicators:this.listenerCount("replicated"),totalErrors:this.listenerCount("replicator_error")}}async cleanup(){this.sqsClient&&this.sqsClient.destroy(),await super.cleanup()}shouldReplicateResource(t){return this.resourceQueueMap&&Object.keys(this.resourceQueueMap).includes(t)||this.queues&&Object.keys(this.queues).includes(t)||!(!this.defaultQueue&&!this.queueUrl)||this.resources&&Object.keys(this.resources).includes(t)||!1}},bigquery:bi,postgres:wi};function rs(t){return"string"==typeof t?t.trim().toLowerCase():t}return t.AVAILABLE_BEHAVIORS=Hi,t.AuditPlugin=class extends ot{constructor(t={}){super(t),this.auditResource=null,this.config={includeData:!1!==t.includeData,includePartitions:!1!==t.includePartitions,maxDataSize:t.maxDataSize||1e4,...t}}async onSetup(){const[t,e,r]=await V(()=>this.database.createResource({name:"audits",attributes:{id:"string|required",resourceName:"string|required",operation:"string|required",recordId:"string|required",userId:"string|optional",timestamp:"string|required",oldData:"string|optional",newData:"string|optional",partition:"string|optional",partitionValues:"string|optional",metadata:"string|optional"},behavior:"body-overflow"}));this.auditResource=t?r:this.database.resources.audits||null,(t||this.auditResource)&&(this.installDatabaseProxy(),this.installEventListeners())}async onStart(){}async onStop(){}installDatabaseProxy(){if(this.database._auditProxyInstalled)return;const t=this.installEventListenersForResource.bind(this);this.database._originalCreateResource=this.database.createResource,this.database.createResource=async function(...e){const r=await this._originalCreateResource(...e);return"audits"!==r.name&&t(r),r},this.database._auditProxyInstalled=!0}installEventListeners(){for(const t of Object.values(this.database.resources))"audits"!==t.name&&this.installEventListenersForResource(t)}installEventListenersForResource(t){t.on("insert",async e=>{const r=e.id||"auto-generated",i=this.config.includePartitions?this.getPartitionValues(e,t):null,s={id:`audit-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,resourceName:t.name,operation:"insert",recordId:r,userId:this.getCurrentUserId?.()||"system",timestamp:(new Date).toISOString(),oldData:null,newData:!1===this.config.includeData?null:JSON.stringify(this.truncateData(e)),partition:this.config.includePartitions?this.getPrimaryPartition(i):null,partitionValues:this.config.includePartitions&&i&&Object.keys(i).length>0?JSON.stringify(i):null,metadata:JSON.stringify({source:"audit-plugin",version:"2.0"})};this.logAudit(s).catch(()=>{})}),t.on("update",async e=>{const r=e.id;let i=e.$before;if(this.config.includeData&&!i){const[e,s,n]=await V(()=>t.get(r));e&&(i=n)}const s=this.config.includePartitions?this.getPartitionValues(e,t):null,n={id:`audit-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,resourceName:t.name,operation:"update",recordId:r,userId:this.getCurrentUserId?.()||"system",timestamp:(new Date).toISOString(),oldData:i&&!1===this.config.includeData?null:i?JSON.stringify(this.truncateData(i)):null,newData:!1===this.config.includeData?null:JSON.stringify(this.truncateData(e)),partition:this.config.includePartitions?this.getPrimaryPartition(s):null,partitionValues:this.config.includePartitions&&s&&Object.keys(s).length>0?JSON.stringify(s):null,metadata:JSON.stringify({source:"audit-plugin",version:"2.0"})};this.logAudit(n).catch(()=>{})}),t.on("delete",async e=>{const r=e.id;let i=e;if(this.config.includeData&&!i){const[e,s,n]=await V(()=>t.get(r));e&&(i=n)}const s=i&&this.config.includePartitions?this.getPartitionValues(i,t):null,n={id:`audit-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,resourceName:t.name,operation:"delete",recordId:r,userId:this.getCurrentUserId?.()||"system",timestamp:(new Date).toISOString(),oldData:i&&!1===this.config.includeData?null:i?JSON.stringify(this.truncateData(i)):null,newData:null,partition:this.config.includePartitions?this.getPrimaryPartition(s):null,partitionValues:this.config.includePartitions&&s&&Object.keys(s).length>0?JSON.stringify(s):null,metadata:JSON.stringify({source:"audit-plugin",version:"2.0"})};this.logAudit(n).catch(()=>{})}),t.useMiddleware("deleteMany",async(e,r)=>{const i=e.args[0],s={};if(this.config.includeData)for(const e of i){const[r,i,n]=await V(()=>t.get(e));s[e]=r?n:null}const n=await r();if(n&&n.length>0&&this.config.includeData)for(const e of i){const r=s[e],i=r&&this.config.includePartitions?this.getPartitionValues(r,t):null,n={id:`audit-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,resourceName:t.name,operation:"delete",recordId:e,userId:this.getCurrentUserId?.()||"system",timestamp:(new Date).toISOString(),oldData:!1===this.config.includeData?null:JSON.stringify(this.truncateData(r)),newData:null,partition:this.config.includePartitions?this.getPrimaryPartition(i):null,partitionValues:this.config.includePartitions&&i&&Object.keys(i).length>0?JSON.stringify(i):null,metadata:JSON.stringify({source:"audit-plugin",version:"2.0",batchOperation:!0})};this.logAudit(n).catch(()=>{})}return n})}getPartitionValues(t,e){if(!t)return null;const r=e.config?.partitions||{},i={};for(const[e,s]of Object.entries(r))if(s.fields){const r={};for(const[e,i]of Object.entries(s.fields)){const i=this.getNestedFieldValue(t,e);null!=i&&(r[e]=i)}Object.keys(r).length>0&&(i[e]=r)}return i}getNestedFieldValue(t,e){if(!e.includes("."))return t[e];const r=e.split(".");let i=t;for(const t of r){if(!i||"object"!=typeof i||!(t in i))return;i=i[t]}return i}getPrimaryPartition(t){if(!t)return null;const e=Object.keys(t);return e.length>0?e[0]:null}async logAudit(t){t.id||(t.id=`audit-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);return await this.auditResource.insert(t)}truncateData(t){if(!t)return t;const e={};for(const[r,i]of Object.entries(t))r.startsWith("_")||"$overflow"===r||(e[r]=i);const r=JSON.stringify(e);if(r.length<=this.config.maxDataSize)return e;let i={...e},s=JSON.stringify(i).length;const n=JSON.stringify({_truncated:!0,_originalSize:r.length,_truncatedAt:(new Date).toISOString()}).length,a=this.config.maxDataSize-n;for(const[t,e]of Object.entries(i))if("string"==typeof e&&s>a){const r=s-a,n=Math.max(0,e.length-r-3);n<e.length&&(i[t]=e.substring(0,n)+"...",s=JSON.stringify(i).length)}return{...i,_truncated:!0,_originalSize:r.length,_truncatedAt:(new Date).toISOString()}}async getAuditLogs(t={}){if(!this.auditResource)return[];const[e,r,i]=await V(async()=>{const{resourceName:e,operation:r,recordId:i,userId:s,partition:n,startDate:a,endDate:o,limit:c=100,offset:u=0}=t;let l=(await this.auditResource.getAll()).filter(t=>(!e||t.resourceName===e)&&((!r||t.operation===r)&&((!i||t.recordId===i)&&((!s||t.userId===s)&&((!n||t.partition===n)&&(!(a&&new Date(t.timestamp)<new Date(a))&&!(o&&new Date(t.timestamp)>new Date(o))))))));l.sort((t,e)=>new Date(e.timestamp)-new Date(t.timestamp));return l.slice(u,u+c).map(t=>{const[e,,r]="string"==typeof t.oldData?z(()=>JSON.parse(t.oldData)):[!0,null,t.oldData],[i,,s]="string"==typeof t.newData?z(()=>JSON.parse(t.newData)):[!0,null,t.newData],[n,,a]=t.partitionValues&&"string"==typeof t.partitionValues?z(()=>JSON.parse(t.partitionValues)):[!0,null,t.partitionValues],[o,,c]=t.metadata&&"string"==typeof t.metadata?z(()=>JSON.parse(t.metadata)):[!0,null,t.metadata];return{...t,oldData:null===t.oldData||void 0===t.oldData||"null"===t.oldData?null:e?r:null,newData:null===t.newData||void 0===t.newData||"null"===t.newData?null:i?s:null,partitionValues:n?a:t.partitionValues,metadata:o?c:t.metadata}})});return e?i:[]}async getRecordHistory(t,e){return this.getAuditLogs({resourceName:t,recordId:e,limit:1e3})}async getPartitionHistory(t,e,r){return this.getAuditLogs({resourceName:t,partition:e,limit:1e3})}async getAuditStats(t={}){const{resourceName:e,startDate:r,endDate:i}=t,s=await this.getAuditLogs({resourceName:e,startDate:r,endDate:i,limit:1e4}),n={total:s.length,byOperation:{},byResource:{},byPartition:{},byUser:{},timeline:{}};for(const t of s)if(n.byOperation[t.operation]=(n.byOperation[t.operation]||0)+1,n.byResource[t.resourceName]=(n.byResource[t.resourceName]||0)+1,t.partition&&(n.byPartition[t.partition]=(n.byPartition[t.partition]||0)+1),n.byUser[t.userId]=(n.byUser[t.userId]||0)+1,t.timestamp){const e=t.timestamp.split("T")[0];n.timeline[e]=(n.timeline[e]||0)+1}return n}},t.AuthenticationError=class extends j{constructor(t,e={}){super(t,e),Object.assign(this,e)}},t.BaseError=_,t.CachePlugin=class extends ot{constructor(t={}){super(t),this.driver=t.driver,this.config={includePartitions:!1!==t.includePartitions,partitionStrategy:t.partitionStrategy||"hierarchical",partitionAware:!1!==t.partitionAware,trackUsage:!1!==t.trackUsage,preloadRelated:!1!==t.preloadRelated,...t}}async setup(t){await super.setup(t)}async onSetup(){this.config.driver?this.driver=this.config.driver:"memory"===this.config.driverType?this.driver=new ei(this.config.memoryOptions||{}):"filesystem"===this.config.driverType?this.config.partitionAware?this.driver=new mi({partitionStrategy:this.config.partitionStrategy,trackUsage:this.config.trackUsage,preloadRelated:this.config.preloadRelated,...this.config.filesystemOptions}):this.driver=new ui(this.config.filesystemOptions||{}):this.driver=new ti({client:this.database.client,...this.config.s3Options||{}}),this.installDatabaseProxy(),this.installResourceHooks()}async onStart(){}async onStop(){}installDatabaseProxy(){if(this.database._cacheProxyInstalled)return;const t=this.installResourceHooks.bind(this);this.database._originalCreateResourceForCache=this.database.createResource,this.database.createResource=async function(...e){const r=await this._originalCreateResourceForCache(...e);return t(r),r},this.database._cacheProxyInstalled=!0}installResourceHooks(){for(const t of Object.values(this.database.resources))this.installResourceHooksForResource(t)}installResourceHooksForResource(t){if(!this.driver)return;Object.defineProperty(t,"cache",{value:this.driver,writable:!0,configurable:!0,enumerable:!1}),t.cacheKeyFor=async(e={})=>{const{action:r,params:i={},partition:s,partitionValues:n}=e;return this.generateCacheKey(t,r,i,s,n)},this.driver instanceof mi&&(t.clearPartitionCache=async(e,r={})=>await this.driver.clearPartition(t.name,e,r),t.getPartitionCacheStats=async(e=null)=>await this.driver.getPartitionStats(t.name,e),t.getCacheRecommendations=async()=>await this.driver.getCacheRecommendations(t.name),t.warmPartitionCache=async(e=[],r={})=>await this.driver.warmPartitionCache(t.name,{partitions:e,...r}));const e=["count","listIds","getMany","getAll","page","list","get"];for(const r of e)t.useMiddleware(r,async(e,i)=>{let s;if("getMany"===r)s=await t.cacheKeyFor({action:r,params:{ids:e.args[0]}});else if("page"===r){const{offset:i,size:n,partition:a,partitionValues:o}=e.args[0]||{};s=await t.cacheKeyFor({action:r,params:{offset:i,size:n},partition:a,partitionValues:o})}else if("list"===r||"listIds"===r||"count"===r){const{partition:i,partitionValues:n}=e.args[0]||{};s=await t.cacheKeyFor({action:r,partition:i,partitionValues:n})}else"getAll"===r?s=await t.cacheKeyFor({action:r}):"get"===r&&(s=await t.cacheKeyFor({action:r,params:{id:e.args[0]}}));if(this.driver instanceof mi){let n,a;if("list"===r||"listIds"===r||"count"===r||"page"===r){const t=e.args[0]||{};n=t.partition,a=t.partitionValues}const[o,c,u]=await V(()=>t.cache._get(s,{resource:t.name,action:r,partition:n,partitionValues:a}));if(o&&null!=u)return u;if(!o&&"NoSuchKey"!==c.name)throw c;const l=await i();return await t.cache._set(s,l,{resource:t.name,action:r,partition:n,partitionValues:a}),l}{const[e,r,n]=await V(()=>t.cache.get(s));if(e&&null!=n)return n;if(!e&&"NoSuchKey"!==r.name)throw r;const a=await i();return await t.cache.set(s,a),a}});const r=["insert","update","delete","deleteMany"];for(const e of r)t.useMiddleware(e,async(r,i)=>{const s=await i();if("insert"===e)await this.clearCacheForResource(t,r.args[0]);else if("update"===e)await this.clearCacheForResource(t,{id:r.args[0],...r.args[1]});else if("delete"===e){let e={id:r.args[0]};if("function"==typeof t.get){const[i,s,n]=await V(()=>t.get(r.args[0]));i&&n&&(e=n)}await this.clearCacheForResource(t,e)}else"deleteMany"===e&&await this.clearCacheForResource(t);return s})}async clearCacheForResource(t,e){if(!t.cache)return;const r=`resource=${t.name}`;if(await t.cache.clear(r),!0===this.config.includePartitions&&t.config?.partitions&&Object.keys(t.config.partitions).length>0)if(e){const i=this.getPartitionValues(e,t);for(const[e,s]of Object.entries(i))if(s&&Object.keys(s).length>0&&Object.values(s).some(t=>null!=t)){const i=mt(r,`partition=${e}`);await t.cache.clear(i)}}else for(const e of Object.keys(t.config.partitions)){const i=mt(r,`partition=${e}`);await t.cache.clear(i)}}async generateCacheKey(t,e,r={},i=null,s=null){const n=[`resource=${t.name}`,`action=${e}`];if(i&&s&&Object.keys(s).length>0){n.push(`partition:${i}`);for(const[t,e]of Object.entries(s))null!=e&&n.push(`${t}:${e}`)}if(Object.keys(r).length>0){const t=await this.hashParams(r);n.push(t)}return mt(...n)+".json.gz"}async hashParams(t){const e=Object.keys(t).sort().map(e=>`${e}:${t[e]}`).join("|")||"empty";return await W(e)}async getCacheStats(){return this.driver?{size:await this.driver.size(),keys:await this.driver.keys(),driver:this.driver.constructor.name}:null}async clearAllCache(){if(this.driver)for(const t of Object.values(this.database.resources))if(t.cache){const e=`resource=${t.name}`;await t.cache.clear(e)}}async warmCache(t,e={}){const r=this.database.resources[t];if(!r)throw new Error(`Resource '${t}' not found`);const{includePartitions:i=!0}=e;if(this.driver instanceof mi&&r.warmPartitionCache){const t=r.config.partitions?Object.keys(r.config.partitions):[];return await r.warmPartitionCache(t,e)}if(await r.getAll(),i&&r.config.partitions)for(const[t,e]of Object.entries(r.config.partitions))if(e.fields){const e=await r.getAll(),i=Array.isArray(e)?e:[],s=new Set;for(const e of i.slice(0,10)){const i=this.getPartitionValues(e,r);i[t]&&s.add(JSON.stringify(i[t]))}for(const e of s){const i=JSON.parse(e);await r.list({partition:t,partitionValues:i})}}}async getPartitionCacheStats(t,e=null){if(!(this.driver instanceof mi))throw new Error("Partition cache statistics are only available with PartitionAwareFilesystemCache");return await this.driver.getPartitionStats(t,e)}async getCacheRecommendations(t){if(!(this.driver instanceof mi))throw new Error("Cache recommendations are only available with PartitionAwareFilesystemCache");return await this.driver.getCacheRecommendations(t)}async clearPartitionCache(t,e,r={}){if(!(this.driver instanceof mi))throw new Error("Partition cache clearing is only available with PartitionAwareFilesystemCache");return await this.driver.clearPartition(t,e,r)}async analyzeCacheUsage(){if(!(this.driver instanceof mi))return{message:"Cache usage analysis is only available with PartitionAwareFilesystemCache"};const t={totalResources:Object.keys(this.database.resources).length,resourceStats:{},recommendations:{},summary:{mostUsedPartitions:[],leastUsedPartitions:[],suggestedOptimizations:[]}};for(const[e,r]of Object.entries(this.database.resources))try{t.resourceStats[e]=await this.driver.getPartitionStats(e),t.recommendations[e]=await this.driver.getCacheRecommendations(e)}catch(r){t.resourceStats[e]={error:r.message}}const e=Object.values(t.recommendations).flat();return t.summary.mostUsedPartitions=e.filter(t=>"preload"===t.recommendation).sort((t,e)=>e.priority-t.priority).slice(0,5),t.summary.leastUsedPartitions=e.filter(t=>"archive"===t.recommendation).slice(0,5),t.summary.suggestedOptimizations=[`Consider preloading ${t.summary.mostUsedPartitions.length} high-usage partitions`,`Archive ${t.summary.leastUsedPartitions.length} unused partitions`,"Monitor cache hit rates for partition efficiency"],t}},t.Client=Si,t.ConnectionString=vi,t.ConnectionStringError=M,t.CostsPlugin=gi,t.CryptoError=L,t.DEFAULT_BEHAVIOR=Ji,t.Database=Qi,t.DatabaseError=class extends j{constructor(t,e={}){super(t,e),Object.assign(this,e)}},t.EncryptionError=class extends j{constructor(t,e={}){super(t,e),Object.assign(this,e)}},t.ErrorMap=T,t.FullTextPlugin=class extends ot{constructor(t={}){super(),this.indexResource=null,this.config={minWordLength:t.minWordLength||3,maxResults:t.maxResults||100,...t},this.indexes=new Map}async setup(t){this.database=t;const[e,r,i]=await V(()=>t.createResource({name:"fulltext_indexes",attributes:{id:"string|required",resourceName:"string|required",fieldName:"string|required",word:"string|required",recordIds:"json|required",count:"number|required",lastUpdated:"string|required"}}));this.indexResource=e?i:t.resources.fulltext_indexes,await this.loadIndexes(),this.installIndexingHooks()}async start(){}async stop(){await this.saveIndexes()}async loadIndexes(){if(!this.indexResource)return;const[t,e,r]=await V(()=>this.indexResource.getAll());if(t)for(const t of r){const e=`${t.resourceName}:${t.fieldName}:${t.word}`;this.indexes.set(e,{recordIds:t.recordIds||[],count:t.count||0})}}async saveIndexes(){if(!this.indexResource)return;const[t,e]=await V(async()=>{const t=await this.indexResource.getAll();for(const e of t)await this.indexResource.delete(e.id);for(const[t,e]of this.indexes.entries()){const[r,i,s]=t.split(":");await this.indexResource.insert({id:`index-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,resourceName:r,fieldName:i,word:s,recordIds:e.recordIds,count:e.count,lastUpdated:(new Date).toISOString()})}})}installIndexingHooks(){this.database.plugins||(this.database.plugins={}),this.database.plugins.fulltext=this;for(const t of Object.values(this.database.resources))"fulltext_indexes"!==t.name&&this.installResourceHooks(t);this.database._fulltextProxyInstalled||(this.database._previousCreateResourceForFullText=this.database.createResource,this.database.createResource=async function(...t){const e=await this._previousCreateResourceForFullText(...t);return this.plugins?.fulltext&&"fulltext_indexes"!==e.name&&this.plugins.fulltext.installResourceHooks(e),e},this.database._fulltextProxyInstalled=!0);for(const t of Object.values(this.database.resources))"fulltext_indexes"!==t.name&&this.installResourceHooks(t)}installResourceHooks(t){t._insert=t.insert,t._update=t.update,t._delete=t.delete,t._deleteMany=t.deleteMany,this.wrapResourceMethod(t,"insert",async(e,r,i)=>{const[s]=r;return this.indexRecord(t.name,e.id,s).catch(()=>{}),e}),this.wrapResourceMethod(t,"update",async(e,r,i)=>{const[s,n]=r;return this.removeRecordFromIndex(t.name,s).catch(()=>{}),this.indexRecord(t.name,s,e).catch(()=>{}),e}),this.wrapResourceMethod(t,"delete",async(e,r,i)=>{const[s]=r;return this.removeRecordFromIndex(t.name,s).catch(()=>{}),e}),this.wrapResourceMethod(t,"deleteMany",async(e,r,i)=>{const[s]=r;for(const e of s)this.removeRecordFromIndex(t.name,e).catch(()=>{});return e})}async indexRecord(t,e,r){const i=this.getIndexedFields(t);if(i&&0!==i.length)for(const s of i){const i=this.getFieldValue(r,s);if(!i)continue;const n=this.tokenize(i);for(const r of n){if(r.length<this.config.minWordLength)continue;const i=`${t}:${s}:${r.toLowerCase()}`,n=this.indexes.get(i)||{recordIds:[],count:0};n.recordIds.includes(e)||(n.recordIds.push(e),n.count=n.recordIds.length),this.indexes.set(i,n)}}}async removeRecordFromIndex(t,e){for(const[r,i]of this.indexes.entries())if(r.startsWith(`${t}:`)){const t=i.recordIds.indexOf(e);t>-1&&(i.recordIds.splice(t,1),i.count=i.recordIds.length,0===i.recordIds.length?this.indexes.delete(r):this.indexes.set(r,i))}}getFieldValue(t,e){if(!e.includes("."))return t&&void 0!==t[e]?t[e]:null;const r=e.split(".");let i=t;for(const t of r){if(!i||"object"!=typeof i||!(t in i))return null;i=i[t]}return i}tokenize(t){if(!t)return[];return String(t).toLowerCase().replace(/[^\w\s\u00C0-\u017F]/g," ").split(/\s+/).filter(t=>t.length>0)}getIndexedFields(t){if(this.config.fields)return this.config.fields;return{users:["name","email"],products:["name","description"],articles:["title","content"]}[t]||[]}async search(t,e,r={}){const{fields:i=null,limit:s=this.config.maxResults,offset:n=0,exactMatch:a=!1}=r;if(!e||0===e.trim().length)return[];const o=this.tokenize(e),c=new Map,u=i||this.getIndexedFields(t);if(0===u.length)return[];for(const e of o)if(!(e.length<this.config.minWordLength))for(const r of u)if(a){const i=`${t}:${r}:${e.toLowerCase()}`,s=this.indexes.get(i);if(s)for(const t of s.recordIds){const e=c.get(t)||0;c.set(t,e+1)}}else for(const[i,s]of this.indexes.entries())if(i.startsWith(`${t}:${r}:${e.toLowerCase()}`))for(const t of s.recordIds){const e=c.get(t)||0;c.set(t,e+1)}return Array.from(c.entries()).map(([t,e])=>({recordId:t,score:e})).sort((t,e)=>e.score-t.score).slice(n,n+s)}async searchRecords(t,e,r={}){const i=await this.search(t,e,r);if(0===i.length)return[];const s=this.database.resources[t];if(!s)throw new Error(`Resource '${t}' not found`);const n=i.map(t=>t.recordId);return(await s.getMany(n)).filter(t=>t&&"object"==typeof t).map(t=>{const e=i.find(e=>e.recordId===t.id);return{...t,_searchScore:e?e.score:0}}).sort((t,e)=>e._searchScore-t._searchScore)}async rebuildIndex(t){const e=this.database.resources[t];if(!e)throw new Error(`Resource '${t}' not found`);for(const[e]of this.indexes.entries())e.startsWith(`${t}:`)&&this.indexes.delete(e);const r=await e.getAll();for(let e=0;e<r.length;e+=100){const i=r.slice(e,e+100);for(const e of i){const[r,i]=await V(()=>this.indexRecord(t,e.id,e))}}await this.saveIndexes()}async getIndexStats(){const t={totalIndexes:this.indexes.size,resources:{},totalWords:0};for(const[e,r]of this.indexes.entries()){const[i,s]=e.split(":");t.resources[i]||(t.resources[i]={fields:{},totalRecords:new Set,totalWords:0}),t.resources[i].fields[s]||(t.resources[i].fields[s]={words:0,totalOccurrences:0}),t.resources[i].fields[s].words++,t.resources[i].fields[s].totalOccurrences+=r.count,t.resources[i].totalWords++;for(const e of r.recordIds)t.resources[i].totalRecords.add(e);t.totalWords++}for(const e in t.resources)t.resources[e].totalRecords=t.resources[e].totalRecords.size;return t}async rebuildAllIndexes({timeout:t}={}){return t?Promise.race([this._rebuildAllIndexesInternal(),new Promise((e,r)=>setTimeout(()=>r(new Error("Timeout")),t))]):this._rebuildAllIndexesInternal()}async _rebuildAllIndexesInternal(){const t=Object.keys(this.database.resources).filter(t=>"fulltext_indexes"!==t);for(const e of t){const[t,r]=await V(()=>this.rebuildIndex(e))}}async clearIndex(t){for(const[e]of this.indexes.entries())e.startsWith(`${t}:`)&&this.indexes.delete(e);await this.saveIndexes()}async clearAllIndexes(){this.indexes.clear(),await this.saveIndexes()}},t.InvalidResourceItem=C,t.MetricsPlugin=class extends ot{constructor(t={}){super(),this.config={collectPerformance:!1!==t.collectPerformance,collectErrors:!1!==t.collectErrors,collectUsage:!1!==t.collectUsage,retentionDays:t.retentionDays||30,flushInterval:t.flushInterval||6e4,...t},this.metrics={operations:{insert:{count:0,totalTime:0,errors:0},update:{count:0,totalTime:0,errors:0},delete:{count:0,totalTime:0,errors:0},get:{count:0,totalTime:0,errors:0},list:{count:0,totalTime:0,errors:0},count:{count:0,totalTime:0,errors:0}},resources:{},errors:[],performance:[],startTime:(new Date).toISOString()},this.flushTimer=null}async setup(t){if(this.database=t,"test"===process.env.NODE_ENV)return;const[e,r]=await V(async()=>{const[e,r,i]=await V(()=>t.createResource({name:"metrics",attributes:{id:"string|required",type:"string|required",resourceName:"string",operation:"string",count:"number|required",totalTime:"number|required",errors:"number|required",avgTime:"number|required",timestamp:"string|required",metadata:"json"}}));this.metricsResource=e?i:t.resources.metrics;const[s,n,a]=await V(()=>t.createResource({name:"error_logs",attributes:{id:"string|required",resourceName:"string|required",operation:"string|required",error:"string|required",timestamp:"string|required",metadata:"json"}}));this.errorsResource=s?a:t.resources.error_logs;const[o,c,u]=await V(()=>t.createResource({name:"performance_logs",attributes:{id:"string|required",resourceName:"string|required",operation:"string|required",duration:"number|required",timestamp:"string|required",metadata:"json"}}));this.performanceResource=o?u:t.resources.performance_logs});e||(this.metricsResource=t.resources.metrics,this.errorsResource=t.resources.error_logs,this.performanceResource=t.resources.performance_logs),this.installMetricsHooks(),"test"!==process.env.NODE_ENV&&this.startFlushTimer()}async start(){}async stop(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),"test"!==process.env.NODE_ENV&&await this.flushMetrics()}installMetricsHooks(){for(const t of Object.values(this.database.resources))["metrics","error_logs","performance_logs"].includes(t.name)||this.installResourceHooks(t);this.database._createResource=this.database.createResource,this.database.createResource=async function(...t){const e=await this._createResource(...t);return this.plugins?.metrics&&!["metrics","error_logs","performance_logs"].includes(e.name)&&this.plugins.metrics.installResourceHooks(e),e}}installResourceHooks(t){t._insert=t.insert,t._update=t.update,t._delete=t.delete,t._deleteMany=t.deleteMany,t._get=t.get,t._getMany=t.getMany,t._getAll=t.getAll,t._list=t.list,t._listIds=t.listIds,t._count=t.count,t._page=t.page,t.insert=async function(...e){const r=Date.now(),[i,s,n]=await V(()=>t._insert(...e));if(this.recordOperation(t.name,"insert",Date.now()-r,!i),i||this.recordError(t.name,"insert",s),!i)throw s;return n}.bind(this),t.update=async function(...e){const r=Date.now(),[i,s,n]=await V(()=>t._update(...e));if(this.recordOperation(t.name,"update",Date.now()-r,!i),i||this.recordError(t.name,"update",s),!i)throw s;return n}.bind(this),t.delete=async function(...e){const r=Date.now(),[i,s,n]=await V(()=>t._delete(...e));if(this.recordOperation(t.name,"delete",Date.now()-r,!i),i||this.recordError(t.name,"delete",s),!i)throw s;return n}.bind(this),t.deleteMany=async function(...e){const r=Date.now(),[i,s,n]=await V(()=>t._deleteMany(...e));if(this.recordOperation(t.name,"delete",Date.now()-r,!i),i||this.recordError(t.name,"delete",s),!i)throw s;return n}.bind(this),t.get=async function(...e){const r=Date.now(),[i,s,n]=await V(()=>t._get(...e));if(this.recordOperation(t.name,"get",Date.now()-r,!i),i||this.recordError(t.name,"get",s),!i)throw s;return n}.bind(this),t.getMany=async function(...e){const r=Date.now(),[i,s,n]=await V(()=>t._getMany(...e));if(this.recordOperation(t.name,"get",Date.now()-r,!i),i||this.recordError(t.name,"get",s),!i)throw s;return n}.bind(this),t.getAll=async function(...e){const r=Date.now(),[i,s,n]=await V(()=>t._getAll(...e));if(this.recordOperation(t.name,"list",Date.now()-r,!i),i||this.recordError(t.name,"list",s),!i)throw s;return n}.bind(this),t.list=async function(...e){const r=Date.now(),[i,s,n]=await V(()=>t._list(...e));if(this.recordOperation(t.name,"list",Date.now()-r,!i),i||this.recordError(t.name,"list",s),!i)throw s;return n}.bind(this),t.listIds=async function(...e){const r=Date.now(),[i,s,n]=await V(()=>t._listIds(...e));if(this.recordOperation(t.name,"list",Date.now()-r,!i),i||this.recordError(t.name,"list",s),!i)throw s;return n}.bind(this),t.count=async function(...e){const r=Date.now(),[i,s,n]=await V(()=>t._count(...e));if(this.recordOperation(t.name,"count",Date.now()-r,!i),i||this.recordError(t.name,"count",s),!i)throw s;return n}.bind(this),t.page=async function(...e){const r=Date.now(),[i,s,n]=await V(()=>t._page(...e));if(this.recordOperation(t.name,"list",Date.now()-r,!i),i||this.recordError(t.name,"list",s),!i)throw s;return n}.bind(this)}recordOperation(t,e,r,i){this.metrics.operations[e]&&(this.metrics.operations[e].count++,this.metrics.operations[e].totalTime+=r,i&&this.metrics.operations[e].errors++),this.metrics.resources[t]||(this.metrics.resources[t]={insert:{count:0,totalTime:0,errors:0},update:{count:0,totalTime:0,errors:0},delete:{count:0,totalTime:0,errors:0},get:{count:0,totalTime:0,errors:0},list:{count:0,totalTime:0,errors:0},count:{count:0,totalTime:0,errors:0}}),this.metrics.resources[t][e]&&(this.metrics.resources[t][e].count++,this.metrics.resources[t][e].totalTime+=r,i&&this.metrics.resources[t][e].errors++),this.config.collectPerformance&&this.metrics.performance.push({resourceName:t,operation:e,duration:r,timestamp:(new Date).toISOString()})}recordError(t,e,r){this.config.collectErrors&&this.metrics.errors.push({resourceName:t,operation:e,error:r.message,stack:r.stack,timestamp:(new Date).toISOString()})}startFlushTimer(){this.flushTimer&&clearInterval(this.flushTimer),this.config.flushInterval>0&&(this.flushTimer=setInterval(()=>{this.flushMetrics().catch(()=>{})},this.config.flushInterval))}async flushMetrics(){if(!this.metricsResource)return;const[t,e]=await V(async()=>{const t="test"===process.env.NODE_ENV?{}:{global:"true"},e="test"===process.env.NODE_ENV?{}:{perf:"true"},r="test"===process.env.NODE_ENV?{}:{error:"true"},i="test"===process.env.NODE_ENV?{}:{resource:"true"};for(const[e,r]of Object.entries(this.metrics.operations))r.count>0&&await this.metricsResource.insert({id:`metrics-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,type:"operation",resourceName:"global",operation:e,count:r.count,totalTime:r.totalTime,errors:r.errors,avgTime:r.count>0?r.totalTime/r.count:0,timestamp:(new Date).toISOString(),metadata:t});for(const[t,e]of Object.entries(this.metrics.resources))for(const[r,s]of Object.entries(e))s.count>0&&await this.metricsResource.insert({id:`metrics-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,type:"operation",resourceName:t,operation:r,count:s.count,totalTime:s.totalTime,errors:s.errors,avgTime:s.count>0?s.totalTime/s.count:0,timestamp:(new Date).toISOString(),metadata:i});if(this.config.collectPerformance&&this.metrics.performance.length>0)for(const t of this.metrics.performance)await this.performanceResource.insert({id:`perf-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,resourceName:t.resourceName,operation:t.operation,duration:t.duration,timestamp:t.timestamp,metadata:e});if(this.config.collectErrors&&this.metrics.errors.length>0)for(const t of this.metrics.errors)await this.errorsResource.insert({id:`error-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,resourceName:t.resourceName,operation:t.operation,error:t.error,stack:t.stack,timestamp:t.timestamp,metadata:r});this.resetMetrics()})}resetMetrics(){for(const t of Object.keys(this.metrics.operations))this.metrics.operations[t]={count:0,totalTime:0,errors:0};for(const t of Object.keys(this.metrics.resources))for(const e of Object.keys(this.metrics.resources[t]))this.metrics.resources[t][e]={count:0,totalTime:0,errors:0};this.metrics.performance=[],this.metrics.errors=[]}async getMetrics(t={}){const{type:e="operation",resourceName:r,operation:i,startDate:s,endDate:n,limit:a=100,offset:o=0}=t;if(!this.metricsResource)return[];let c=(await this.metricsResource.getAll()).filter(t=>(!e||t.type===e)&&((!r||t.resourceName===r)&&((!i||t.operation===i)&&(!(s&&new Date(t.timestamp)<new Date(s))&&!(n&&new Date(t.timestamp)>new Date(n))))));return c.sort((t,e)=>new Date(e.timestamp)-new Date(t.timestamp)),c.slice(o,o+a)}async getErrorLogs(t={}){if(!this.errorsResource)return[];const{resourceName:e,operation:r,startDate:i,endDate:s,limit:n=100,offset:a=0}=t;let o=(await this.errorsResource.getAll()).filter(t=>(!e||t.resourceName===e)&&((!r||t.operation===r)&&(!(i&&new Date(t.timestamp)<new Date(i))&&!(s&&new Date(t.timestamp)>new Date(s)))));return o.sort((t,e)=>new Date(e.timestamp)-new Date(t.timestamp)),o.slice(a,a+n)}async getPerformanceLogs(t={}){if(!this.performanceResource)return[];const{resourceName:e,operation:r,startDate:i,endDate:s,limit:n=100,offset:a=0}=t;let o=(await this.performanceResource.getAll()).filter(t=>(!e||t.resourceName===e)&&((!r||t.operation===r)&&(!(i&&new Date(t.timestamp)<new Date(i))&&!(s&&new Date(t.timestamp)>new Date(s)))));return o.sort((t,e)=>new Date(e.timestamp)-new Date(t.timestamp)),o.slice(a,a+n)}async getStats(){const t=new Date,e=new Date(t.getTime()-864e5),[r,i,s]=await Promise.all([this.getMetrics({startDate:e.toISOString()}),this.getErrorLogs({startDate:e.toISOString()}),this.getPerformanceLogs({startDate:e.toISOString()})]),n={period:"24h",totalOperations:0,totalErrors:i.length,avgResponseTime:0,operationsByType:{},resources:{},uptime:{startTime:this.metrics.startTime,duration:t.getTime()-new Date(this.metrics.startTime).getTime()}};for(const t of r)if("operation"===t.type){n.totalOperations+=t.count,n.operationsByType[t.operation]||(n.operationsByType[t.operation]={count:0,errors:0,avgTime:0}),n.operationsByType[t.operation].count+=t.count,n.operationsByType[t.operation].errors+=t.errors;const e=n.operationsByType[t.operation],r=e.count,i=(e.avgTime*(r-t.count)+t.totalTime)/r;e.avgTime=i}const a=r.reduce((t,e)=>t+e.totalTime,0),o=r.reduce((t,e)=>t+e.count,0);return n.avgResponseTime=o>0?a/o:0,n}async cleanupOldData(){const t=new Date;if(t.setDate(t.getDate()-this.config.retentionDays),this.metricsResource){const e=await this.getMetrics({endDate:t.toISOString()});for(const t of e)await this.metricsResource.delete(t.id)}if(this.errorsResource){const e=await this.getErrorLogs({endDate:t.toISOString()});for(const t of e)await this.errorsResource.delete(t.id)}if(this.performanceResource){const e=await this.getPerformanceLogs({endDate:t.toISOString()});for(const t of e)await this.performanceResource.delete(t.id)}}},t.MissingMetadata=P,t.NoSuchBucket=D,t.NoSuchKey=A,t.NotFound=N,t.PartitionError=B,t.PermissionError=E,t.Plugin=ot,t.PluginObject=ct,t.ReplicatorPlugin=class extends ot{constructor(t={}){if(super(),!t.replicators||!Array.isArray(t.replicators))throw new Error("ReplicatorPlugin: replicators array is required");for(const e of t.replicators){if(!e.driver)throw new Error("ReplicatorPlugin: each replicator must have a driver");if(!e.resources||"object"!=typeof e.resources)throw new Error("ReplicatorPlugin: each replicator must have resources config");if(0===Object.keys(e.resources).length)throw new Error("ReplicatorPlugin: each replicator must have at least one resource configured")}this.config={replicators:t.replicators||[],logErrors:!1!==t.logErrors,replicatorLogResource:t.replicatorLogResource||"replicator_log",enabled:!1!==t.enabled,batchSize:t.batchSize||100,maxRetries:t.maxRetries||3,timeout:t.timeout||3e4,verbose:t.verbose||!1,...t},this.replicators=[],this.database=null,this.eventListenersInstalled=new Set}async decompressData(t){return t}filterInternalFields(t){if(!t||"object"!=typeof t)return t;const e={};for(const[r,i]of Object.entries(t))r.startsWith("_")||"$overflow"===r||"$before"===r||"$after"===r||(e[r]=i);return e}installEventListeners(t,e,r){t&&!this.eventListenersInstalled.has(t.name)&&t.name!==this.config.replicatorLogResource&&(t.on("insert",async e=>{try{const i={...e,createdAt:(new Date).toISOString()};await r.processReplicatorEvent("insert",t.name,i.id,i)}catch(e){this.emit("error",{operation:"insert",error:e.message,resource:t.name})}}),t.on("update",async(e,i)=>{try{const s={...e,updatedAt:(new Date).toISOString()};await r.processReplicatorEvent("update",t.name,s.id,s,i)}catch(e){this.emit("error",{operation:"update",error:e.message,resource:t.name})}}),t.on("delete",async e=>{try{await r.processReplicatorEvent("delete",t.name,e.id,e)}catch(e){this.emit("error",{operation:"delete",error:e.message,resource:t.name})}}),this.eventListenersInstalled.add(t.name))}async getCompleteData(t,e){const[r,i,s]=await V(()=>t.get(e.id));return r?s:e}async setup(t){this.database=t;try{await this.initializeReplicators(t)}catch(t){throw this.emit("error",{operation:"setup",error:t.message}),t}try{if(this.config.replicatorLogResource){await t.createResource({name:this.config.replicatorLogResource,behavior:"body-overflow",attributes:{operation:"string",resourceName:"string",recordId:"string",data:"string",error:"string|optional",replicator:"string",timestamp:"string",status:"string"}})}}catch(t){}await this.uploadMetadataFile(t);const e=t.createResource.bind(t);t.createResource=async r=>{const i=await e(r);return i&&this.installEventListeners(i,t,this),i};for(const e in t.resources){const r=t.resources[e];this.installEventListeners(r,t,this)}}createReplicator(t,e,r,i){return function(t,e={},r=[],i=null){const s=es[t];if(!s)throw new Error(`Unknown replicator driver: ${t}. Available drivers: ${Object.keys(es).join(", ")}`);return new s(e,r,i)}(t,e,r,i)}async initializeReplicators(t){for(const e of this.config.replicators){const{driver:r,config:i={},resources:s,client:n,...a}=e,o=s||i.resources||{},c={...i,...a},u=this.createReplicator(r,c,o,n);u&&(await u.initialize(t),this.replicators.push(u))}}async start(){}async stop(){}filterInternalFields(t){if(!t||"object"!=typeof t)return t;const e={};for(const[r,i]of Object.entries(t))r.startsWith("_")||r.startsWith("$")||(e[r]=i);return e}async uploadMetadataFile(t){"function"==typeof t.uploadMetadataFile&&await t.uploadMetadataFile()}async getCompleteData(t,e){try{const[r,i,s]=await V(()=>t.get(e.id));if(r&&s)return s}catch(t){}return e}async retryWithBackoff(t,e=3){let r;for(let i=1;i<=e;i++)try{return await t()}catch(t){if(r=t,i===e)throw t;const s=1e3*Math.pow(2,i-1);await new Promise(t=>setTimeout(t,s))}throw r}async logError(t,e,r,i,s,n){try{const a=this.config.replicatorLogResource;if(this.database&&this.database.resources&&this.database.resources[a]){const o=this.database.resources[a];await o.insert({replicator:t.name||t.id,resourceName:e,operation:r,recordId:i,data:JSON.stringify(s),error:n.message,timestamp:(new Date).toISOString(),status:"error"})}}catch(t){}}async processReplicatorEvent(t,e,r,i,s=null){if(!this.config.enabled)return;const n=this.replicators.filter(r=>r.shouldReplicateResource&&r.shouldReplicateResource(e,t));if(0===n.length)return;const a=n.map(async n=>{try{const a=await this.retryWithBackoff(()=>n.replicate(e,t,i,r,s),this.config.maxRetries);return this.emit("replicated",{replicator:n.name||n.id,resourceName:e,operation:t,recordId:r,result:a,success:!0}),a}catch(s){throw this.emit("replicator_error",{replicator:n.name||n.id,resourceName:e,operation:t,recordId:r,error:s.message}),this.config.logErrors&&this.database&&await this.logError(n,e,t,r,i,s),s}});return Promise.allSettled(a)}async processreplicatorItem(t){const e=this.replicators.filter(e=>e.shouldReplicateResource&&e.shouldReplicateResource(t.resourceName,t.operation));if(0===e.length)return;const r=e.map(async e=>{try{const[r,i,s]=await V(()=>e.replicate(t.resourceName,t.operation,t.data,t.recordId,t.beforeData));return r?(this.emit("replicated",{replicator:e.name||e.id,resourceName:t.resourceName,operation:t.operation,recordId:t.recordId,result:s,success:!0}),{success:!0,result:s}):(this.emit("replicator_error",{replicator:e.name||e.id,resourceName:t.resourceName,operation:t.operation,recordId:t.recordId,error:i.message}),this.config.logErrors&&this.database&&await this.logError(e,t.resourceName,t.operation,t.recordId,t.data,i),{success:!1,error:i.message})}catch(r){return this.emit("replicator_error",{replicator:e.name||e.id,resourceName:t.resourceName,operation:t.operation,recordId:t.recordId,error:r.message}),this.config.logErrors&&this.database&&await this.logError(e,t.resourceName,t.operation,t.recordId,t.data,r),{success:!1,error:r.message}}});return Promise.allSettled(r)}async logreplicator(t){const e=this.replicatorLog||this.database.resources[rs(this.config.replicatorLogResource)];if(!e)return this.database&&this.database.options&&this.database.options.connectionString,void this.emit("replicator.log.failed",{error:"replicator log resource not found",item:t});const r={id:t.id||`repl-${Date.now()}-${Math.random().toString(36).slice(2)}`,resource:t.resource||t.resourceName||"",action:t.operation||t.action||"",data:t.data||{},timestamp:"number"==typeof t.timestamp?t.timestamp:Date.now(),createdAt:t.createdAt||(new Date).toISOString().slice(0,10)};try{await e.insert(r)}catch(e){this.emit("replicator.log.failed",{error:e,item:t})}}async updatereplicatorLog(t,e){if(!this.replicatorLog)return;const[r,i]=await V(async()=>{await this.replicatorLog.update(t,{...e,lastAttempt:(new Date).toISOString()})});r||this.emit("replicator.updateLog.failed",{error:i.message,logId:t,updates:e})}async getreplicatorStats(){return{replicators:await Promise.all(this.replicators.map(async t=>{const e=await t.getStatus();return{id:t.id,driver:t.driver,config:t.config,status:e}})),queue:{length:this.queue.length,isProcessing:this.isProcessing},stats:this.stats,lastSync:this.stats.lastSync}}async getreplicatorLogs(t={}){if(!this.replicatorLog)return[];const{resourceName:e,operation:r,status:i,limit:s=100,offset:n=0}=t;let a={};e&&(a.resourceName=e),r&&(a.operation=r),i&&(a.status=i);return(await this.replicatorLog.list(a)).slice(n,n+s)}async retryFailedreplicators(){if(!this.replicatorLog)return{retried:0};const t=await this.replicatorLog.list({status:"failed"});let e=0;for(const r of t){const[t,i]=await V(async()=>{await this.processReplicatorEvent(r.resourceName,r.operation,r.recordId,r.data)});t&&e++}return{retried:e}}async syncAllData(t){const e=this.replicators.find(e=>e.id===t);if(!e)throw new Error(`Replicator not found: ${t}`);this.stats.lastSync=(new Date).toISOString();for(const r in this.database.resources)if(rs(r)!==rs("replicator_logs")&&e.shouldReplicateResource(r)){this.emit("replicator.sync.resource",{resourceName:r,replicatorId:t});const i=this.database.resources[r],s=await i.getAll();for(const t of s)await e.replicate(r,"insert",t,t.id)}this.emit("replicator.sync.completed",{replicatorId:t,stats:this.stats})}async cleanup(){try{if(this.replicators&&this.replicators.length>0){const t=this.replicators.map(async t=>{try{t&&"function"==typeof t.cleanup&&await t.cleanup()}catch(t){}});await Promise.allSettled(t)}this.replicators=[],this.database=null,this.eventListenersInstalled.clear(),this.removeAllListeners()}catch(t){}}},t.Resource=Yi,t.ResourceError=F,t.ResourceIdsPageReader=Gr,t.ResourceIdsReader=Jr,t.ResourceNotFound=x,t.ResourceReader=Qr,t.ResourceWriter=Xr,t.S3db=Qi,t.S3dbError=j,t.Schema=xi,t.SchemaError=U,t.UnknownError=I,t.ValidationError=R,t.Validator=ji,t.behaviors=Ki,t.calculateAttributeNamesSize=b,t.calculateAttributeSizes=v,t.calculateEffectiveLimit=O,t.calculateSystemOverhead=k,t.calculateTotalSize=S,t.calculateUTF8Bytes=y,t.decode=p,t.decodeDecimal=g,t.decrypt=J,t.default=Xi,t.encode=d,t.encodeDecimal=m,t.encrypt=H,t.getBehavior=Wi,t.getSizeBreakdown=function(t){const e=v(t),r=b(t),i=Object.values(e).reduce((t,e)=>t+e,0),s=i+r,n=Object.entries(e).sort(([,t],[,e])=>e-t).map(([t,e])=>({attribute:t,size:e,percentage:(e/s*100).toFixed(2)+"%"}));return{total:s,valueSizes:e,namesSize:r,valueTotal:i,breakdown:n,detailedBreakdown:{values:i,names:r,total:s}}},t.idGenerator=Q,t.mapAwsError=$,t.md5=Y,t.passwordGenerator=X,t.sha256=W,t.streamToString=Zr,t.transformValue=w,t.tryFn=q,t.tryFnSync=z,Object.defineProperty(t,"__esModule",{value:!0}),t}({},nanoid,zlib,PromisePool,streams,_,crypto,stringify,AWS,flat,FastestValidator);
|