@openfin/cloud-notification-core-api 0.0.1-alpha.d138264 → 0.0.1-alpha.e65a7a2

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.
Files changed (4) hide show
  1. package/bundle.d.ts +569 -284
  2. package/index.cjs +324 -179
  3. package/index.mjs +323 -179
  4. package/package.json +1 -1
package/index.cjs CHANGED
@@ -1,9 +1,12 @@
1
1
  'use strict';
2
2
 
3
3
  var buffer = require('buffer');
4
- var z = require('zod');
5
4
  var mqtt = require('mqtt');
6
5
 
6
+ var g;(function(r){r.assertEqual=n=>n;function e(n){}r.assertIs=e;function t(n){throw new Error}r.assertNever=t,r.arrayToEnum=n=>{let a={};for(let i of n)a[i]=i;return a},r.getValidEnumValues=n=>{let a=r.objectKeys(n).filter(o=>typeof n[n[o]]!="number"),i={};for(let o of a)i[o]=n[o];return r.objectValues(i)},r.objectValues=n=>r.objectKeys(n).map(function(a){return n[a]}),r.objectKeys=typeof Object.keys=="function"?n=>Object.keys(n):n=>{let a=[];for(let i in n)Object.prototype.hasOwnProperty.call(n,i)&&a.push(i);return a},r.find=(n,a)=>{for(let i of n)if(a(i))return i},r.isInteger=typeof Number.isInteger=="function"?n=>Number.isInteger(n):n=>typeof n=="number"&&isFinite(n)&&Math.floor(n)===n;function s(n,a=" | "){return n.map(i=>typeof i=="string"?`'${i}'`:i).join(a)}r.joinValues=s,r.jsonStringifyReplacer=(n,a)=>typeof a=="bigint"?a.toString():a;})(g||(g={}));var be;(function(r){r.mergeShapes=(e,t)=>({...e,...t});})(be||(be={}));var f$1=g.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),j=r=>{switch(typeof r){case "undefined":return f$1.undefined;case "string":return f$1.string;case "number":return isNaN(r)?f$1.nan:f$1.number;case "boolean":return f$1.boolean;case "function":return f$1.function;case "bigint":return f$1.bigint;case "symbol":return f$1.symbol;case "object":return Array.isArray(r)?f$1.array:r===null?f$1.null:r.then&&typeof r.then=="function"&&r.catch&&typeof r.catch=="function"?f$1.promise:typeof Map<"u"&&r instanceof Map?f$1.map:typeof Set<"u"&&r instanceof Set?f$1.set:typeof Date<"u"&&r instanceof Date?f$1.date:f$1.object;default:return f$1.unknown}},d=g.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),ze=r=>JSON.stringify(r,null,2).replace(/"([^"]+)":/g,"$1:"),T=class r extends Error{get errors(){return this.issues}constructor(e){super(),this.issues=[],this.addIssue=s=>{this.issues=[...this.issues,s];},this.addIssues=(s=[])=>{this.issues=[...this.issues,...s];};let t=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,t):this.__proto__=t,this.name="ZodError",this.issues=e;}format(e){let t=e||function(a){return a.message},s={_errors:[]},n=a=>{for(let i of a.issues)if(i.code==="invalid_union")i.unionErrors.map(n);else if(i.code==="invalid_return_type")n(i.returnTypeError);else if(i.code==="invalid_arguments")n(i.argumentsError);else if(i.path.length===0)s._errors.push(t(i));else {let o=s,l=0;for(;l<i.path.length;){let c=i.path[l];l===i.path.length-1?(o[c]=o[c]||{_errors:[]},o[c]._errors.push(t(i))):o[c]=o[c]||{_errors:[]},o=o[c],l++;}}};return n(this),s}static assert(e){if(!(e instanceof r))throw new Error(`Not a ZodError: ${e}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,g.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(e=t=>t.message){let t={},s=[];for(let n of this.issues)n.path.length>0?(t[n.path[0]]=t[n.path[0]]||[],t[n.path[0]].push(e(n))):s.push(e(n));return {formErrors:s,fieldErrors:t}}get formErrors(){return this.flatten()}};T.create=r=>new T(r);var re=(r,e)=>{let t;switch(r.code){case d.invalid_type:r.received===f$1.undefined?t="Required":t=`Expected ${r.expected}, received ${r.received}`;break;case d.invalid_literal:t=`Invalid literal value, expected ${JSON.stringify(r.expected,g.jsonStringifyReplacer)}`;break;case d.unrecognized_keys:t=`Unrecognized key(s) in object: ${g.joinValues(r.keys,", ")}`;break;case d.invalid_union:t="Invalid input";break;case d.invalid_union_discriminator:t=`Invalid discriminator value. Expected ${g.joinValues(r.options)}`;break;case d.invalid_enum_value:t=`Invalid enum value. Expected ${g.joinValues(r.options)}, received '${r.received}'`;break;case d.invalid_arguments:t="Invalid function arguments";break;case d.invalid_return_type:t="Invalid function return type";break;case d.invalid_date:t="Invalid date";break;case d.invalid_string:typeof r.validation=="object"?"includes"in r.validation?(t=`Invalid input: must include "${r.validation.includes}"`,typeof r.validation.position=="number"&&(t=`${t} at one or more positions greater than or equal to ${r.validation.position}`)):"startsWith"in r.validation?t=`Invalid input: must start with "${r.validation.startsWith}"`:"endsWith"in r.validation?t=`Invalid input: must end with "${r.validation.endsWith}"`:g.assertNever(r.validation):r.validation!=="regex"?t=`Invalid ${r.validation}`:t="Invalid";break;case d.too_small:r.type==="array"?t=`Array must contain ${r.exact?"exactly":r.inclusive?"at least":"more than"} ${r.minimum} element(s)`:r.type==="string"?t=`String must contain ${r.exact?"exactly":r.inclusive?"at least":"over"} ${r.minimum} character(s)`:r.type==="number"?t=`Number must be ${r.exact?"exactly equal to ":r.inclusive?"greater than or equal to ":"greater than "}${r.minimum}`:r.type==="date"?t=`Date must be ${r.exact?"exactly equal to ":r.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(r.minimum))}`:t="Invalid input";break;case d.too_big:r.type==="array"?t=`Array must contain ${r.exact?"exactly":r.inclusive?"at most":"less than"} ${r.maximum} element(s)`:r.type==="string"?t=`String must contain ${r.exact?"exactly":r.inclusive?"at most":"under"} ${r.maximum} character(s)`:r.type==="number"?t=`Number must be ${r.exact?"exactly":r.inclusive?"less than or equal to":"less than"} ${r.maximum}`:r.type==="bigint"?t=`BigInt must be ${r.exact?"exactly":r.inclusive?"less than or equal to":"less than"} ${r.maximum}`:r.type==="date"?t=`Date must be ${r.exact?"exactly":r.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(r.maximum))}`:t="Invalid input";break;case d.custom:t="Invalid input";break;case d.invalid_intersection_types:t="Intersection results could not be merged";break;case d.not_multiple_of:t=`Number must be a multiple of ${r.multipleOf}`;break;case d.not_finite:t="Number must be finite";break;default:t=e.defaultError,g.assertNever(r);}return {message:t}},Ee=re;function De(r){Ee=r;}function pe(){return Ee}var me=r=>{let{data:e,path:t,errorMaps:s,issueData:n}=r,a=[...t,...n.path||[]],i={...n,path:a};if(n.message!==void 0)return {...n,path:a,message:n.message};let o="",l=s.filter(c=>!!c).slice().reverse();for(let c of l)o=c(i,{data:e,defaultError:o}).message;return {...n,path:a,message:o}},Le=[];function u(r,e){let t=pe(),s=me({issueData:e,data:r.data,path:r.path,errorMaps:[r.common.contextualErrorMap,r.schemaErrorMap,t,t===re?void 0:re].filter(n=>!!n)});r.common.issues.push(s);}var x=class r{constructor(){this.value="valid";}dirty(){this.value==="valid"&&(this.value="dirty");}abort(){this.value!=="aborted"&&(this.value="aborted");}static mergeArray(e,t){let s=[];for(let n of t){if(n.status==="aborted")return v;n.status==="dirty"&&e.dirty(),s.push(n.value);}return {status:e.value,value:s}}static async mergeObjectAsync(e,t){let s=[];for(let n of t){let a=await n.key,i=await n.value;s.push({key:a,value:i});}return r.mergeObjectSync(e,s)}static mergeObjectSync(e,t){let s={};for(let n of t){let{key:a,value:i}=n;if(a.status==="aborted"||i.status==="aborted")return v;a.status==="dirty"&&e.dirty(),i.status==="dirty"&&e.dirty(),a.value!=="__proto__"&&(typeof i.value<"u"||n.alwaysSet)&&(s[a.value]=i.value);}return {status:e.value,value:s}}},v=Object.freeze({status:"aborted"}),te=r=>({status:"dirty",value:r}),b=r=>({status:"valid",value:r}),we=r=>r.status==="aborted",Te=r=>r.status==="dirty",P=r=>r.status==="valid",ue=r=>typeof Promise<"u"&&r instanceof Promise;function ve(r,e,t,s){if(typeof e=="function"?r!==e||true:!e.has(r))throw new TypeError("Cannot read private member from an object whose class did not declare it");return e.get(r)}function Re(r,e,t,s,n){if(typeof e=="function"?r!==e||true:!e.has(r))throw new TypeError("Cannot write private member to an object whose class did not declare it");return e.set(r,t),t}var h;(function(r){r.errToObj=e=>typeof e=="string"?{message:e}:e||{},r.toString=e=>typeof e=="string"?e:e?.message;})(h||(h={}));var de,ce,S=class{constructor(e,t,s,n){this._cachedPath=[],this.parent=e,this.data=t,this._path=s,this._key=n;}get path(){return this._cachedPath.length||(this._key instanceof Array?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}},Oe=(r,e)=>{if(P(e))return {success:true,data:e.value};if(!r.common.issues.length)throw new Error("Validation failed but no issues detected.");return {success:false,get error(){if(this._error)return this._error;let t=new T(r.common.issues);return this._error=t,this._error}}};function _(r){if(!r)return {};let{errorMap:e,invalid_type_error:t,required_error:s,description:n}=r;if(e&&(t||s))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return e?{errorMap:e,description:n}:{errorMap:(i,o)=>{var l,c;let{message:p}=r;return i.code==="invalid_enum_value"?{message:p??o.defaultError}:typeof o.data>"u"?{message:(l=p??s)!==null&&l!==void 0?l:o.defaultError}:i.code!=="invalid_type"?{message:o.defaultError}:{message:(c=p??t)!==null&&c!==void 0?c:o.defaultError}},description:n}}var y=class{get description(){return this._def.description}_getType(e){return j(e.data)}_getOrReturnCtx(e,t){return t||{common:e.parent.common,data:e.data,parsedType:j(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}_processInputParams(e){return {status:new x,ctx:{common:e.parent.common,data:e.data,parsedType:j(e.data),schemaErrorMap:this._def.errorMap,path:e.path,parent:e.parent}}}_parseSync(e){let t=this._parse(e);if(ue(t))throw new Error("Synchronous parse encountered promise.");return t}_parseAsync(e){let t=this._parse(e);return Promise.resolve(t)}parse(e,t){let s=this.safeParse(e,t);if(s.success)return s.data;throw s.error}safeParse(e,t){var s;let n={common:{issues:[],async:(s=t?.async)!==null&&s!==void 0?s:false,contextualErrorMap:t?.errorMap},path:t?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:j(e)},a=this._parseSync({data:e,path:n.path,parent:n});return Oe(n,a)}"~validate"(e){var t,s;let n={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:j(e)};if(!this["~standard"].async)try{let a=this._parseSync({data:e,path:[],parent:n});return P(a)?{value:a.value}:{issues:n.common.issues}}catch(a){!((s=(t=a?.message)===null||t===void 0?void 0:t.toLowerCase())===null||s===void 0)&&s.includes("encountered")&&(this["~standard"].async=true),n.common={issues:[],async:true};}return this._parseAsync({data:e,path:[],parent:n}).then(a=>P(a)?{value:a.value}:{issues:n.common.issues})}async parseAsync(e,t){let s=await this.safeParseAsync(e,t);if(s.success)return s.data;throw s.error}async safeParseAsync(e,t){let s={common:{issues:[],contextualErrorMap:t?.errorMap,async:true},path:t?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:e,parsedType:j(e)},n=this._parse({data:e,path:s.path,parent:s}),a=await(ue(n)?n:Promise.resolve(n));return Oe(s,a)}refine(e,t){let s=n=>typeof t=="string"||typeof t>"u"?{message:t}:typeof t=="function"?t(n):t;return this._refinement((n,a)=>{let i=e(n),o=()=>a.addIssue({code:d.custom,...s(n)});return typeof Promise<"u"&&i instanceof Promise?i.then(l=>l?true:(o(),false)):i?true:(o(),false)})}refinement(e,t){return this._refinement((s,n)=>e(s)?true:(n.addIssue(typeof t=="function"?t(s,n):t),false))}_refinement(e){return new C({schema:this,typeName:m.ZodEffects,effect:{type:"refinement",refinement:e}})}superRefine(e){return this._refinement(e)}constructor(e){this.spa=this.safeParseAsync,this._def=e,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:t=>this["~validate"](t)};}optional(){return O.create(this,this._def)}nullable(){return R.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return I.create(this)}promise(){return V.create(this,this._def)}or(e){return W.create([this,e],this._def)}and(e){return q.create(this,e,this._def)}transform(e){return new C({..._(this._def),schema:this,typeName:m.ZodEffects,effect:{type:"transform",transform:e}})}default(e){let t=typeof e=="function"?e:()=>e;return new Q({..._(this._def),innerType:this,defaultValue:t,typeName:m.ZodDefault})}brand(){return new le({typeName:m.ZodBranded,type:this,..._(this._def)})}catch(e){let t=typeof e=="function"?e:()=>e;return new X({..._(this._def),innerType:this,catchValue:t,typeName:m.ZodCatch})}describe(e){let t=this.constructor;return new t({...this._def,description:e})}pipe(e){return fe.create(this,e)}readonly(){return K.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}},Ue=/^c[^\s-]{8,}$/i,Fe=/^[0-9a-z]+$/,Be=/^[0-9A-HJKMNP-TV-Z]{26}$/i,We=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,qe=/^[a-z0-9_-]{21}$/i,Je=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,Ye=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,He=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,Ge="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$",ke,Qe=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,Xe=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,Ke=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,et=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,tt=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,rt=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,Ze="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",st=new RegExp(`^${Ze}$`);function je(r){let e="[0-5]\\d";r.precision?e=`${e}\\.\\d{${r.precision}}`:r.precision==null&&(e=`${e}(\\.\\d+)?`);let t=r.precision?"+":"?";return `([01]\\d|2[0-3]):[0-5]\\d(:${e})${t}`}function nt(r){return new RegExp(`^${je(r)}$`)}function Ne(r){let e=`${Ze}T${je(r)}`,t=[];return t.push(r.local?"Z?":"Z"),r.offset&&t.push("([+-]\\d{2}:?\\d{2})"),e=`${e}(${t.join("|")})`,new RegExp(`^${e}$`)}function at(r,e){return !!((e==="v4"||!e)&&Qe.test(r)||(e==="v6"||!e)&&Ke.test(r))}function it(r,e){if(!Je.test(r))return false;try{let[t]=r.split("."),s=t.replace(/-/g,"+").replace(/_/g,"/").padEnd(t.length+(4-t.length%4)%4,"="),n=JSON.parse(atob(s));return !(typeof n!="object"||n===null||!n.typ||!n.alg||e&&n.alg!==e)}catch{return false}}function ot(r,e){return !!((e==="v4"||!e)&&Xe.test(r)||(e==="v6"||!e)&&et.test(r))}var $=class r extends y{_parse(e){if(this._def.coerce&&(e.data=String(e.data)),this._getType(e)!==f$1.string){let a=this._getOrReturnCtx(e);return u(a,{code:d.invalid_type,expected:f$1.string,received:a.parsedType}),v}let s=new x,n;for(let a of this._def.checks)if(a.kind==="min")e.data.length<a.value&&(n=this._getOrReturnCtx(e,n),u(n,{code:d.too_small,minimum:a.value,type:"string",inclusive:true,exact:false,message:a.message}),s.dirty());else if(a.kind==="max")e.data.length>a.value&&(n=this._getOrReturnCtx(e,n),u(n,{code:d.too_big,maximum:a.value,type:"string",inclusive:true,exact:false,message:a.message}),s.dirty());else if(a.kind==="length"){let i=e.data.length>a.value,o=e.data.length<a.value;(i||o)&&(n=this._getOrReturnCtx(e,n),i?u(n,{code:d.too_big,maximum:a.value,type:"string",inclusive:true,exact:true,message:a.message}):o&&u(n,{code:d.too_small,minimum:a.value,type:"string",inclusive:true,exact:true,message:a.message}),s.dirty());}else if(a.kind==="email")He.test(e.data)||(n=this._getOrReturnCtx(e,n),u(n,{validation:"email",code:d.invalid_string,message:a.message}),s.dirty());else if(a.kind==="emoji")ke||(ke=new RegExp(Ge,"u")),ke.test(e.data)||(n=this._getOrReturnCtx(e,n),u(n,{validation:"emoji",code:d.invalid_string,message:a.message}),s.dirty());else if(a.kind==="uuid")We.test(e.data)||(n=this._getOrReturnCtx(e,n),u(n,{validation:"uuid",code:d.invalid_string,message:a.message}),s.dirty());else if(a.kind==="nanoid")qe.test(e.data)||(n=this._getOrReturnCtx(e,n),u(n,{validation:"nanoid",code:d.invalid_string,message:a.message}),s.dirty());else if(a.kind==="cuid")Ue.test(e.data)||(n=this._getOrReturnCtx(e,n),u(n,{validation:"cuid",code:d.invalid_string,message:a.message}),s.dirty());else if(a.kind==="cuid2")Fe.test(e.data)||(n=this._getOrReturnCtx(e,n),u(n,{validation:"cuid2",code:d.invalid_string,message:a.message}),s.dirty());else if(a.kind==="ulid")Be.test(e.data)||(n=this._getOrReturnCtx(e,n),u(n,{validation:"ulid",code:d.invalid_string,message:a.message}),s.dirty());else if(a.kind==="url")try{new URL(e.data);}catch{n=this._getOrReturnCtx(e,n),u(n,{validation:"url",code:d.invalid_string,message:a.message}),s.dirty();}else a.kind==="regex"?(a.regex.lastIndex=0,a.regex.test(e.data)||(n=this._getOrReturnCtx(e,n),u(n,{validation:"regex",code:d.invalid_string,message:a.message}),s.dirty())):a.kind==="trim"?e.data=e.data.trim():a.kind==="includes"?e.data.includes(a.value,a.position)||(n=this._getOrReturnCtx(e,n),u(n,{code:d.invalid_string,validation:{includes:a.value,position:a.position},message:a.message}),s.dirty()):a.kind==="toLowerCase"?e.data=e.data.toLowerCase():a.kind==="toUpperCase"?e.data=e.data.toUpperCase():a.kind==="startsWith"?e.data.startsWith(a.value)||(n=this._getOrReturnCtx(e,n),u(n,{code:d.invalid_string,validation:{startsWith:a.value},message:a.message}),s.dirty()):a.kind==="endsWith"?e.data.endsWith(a.value)||(n=this._getOrReturnCtx(e,n),u(n,{code:d.invalid_string,validation:{endsWith:a.value},message:a.message}),s.dirty()):a.kind==="datetime"?Ne(a).test(e.data)||(n=this._getOrReturnCtx(e,n),u(n,{code:d.invalid_string,validation:"datetime",message:a.message}),s.dirty()):a.kind==="date"?st.test(e.data)||(n=this._getOrReturnCtx(e,n),u(n,{code:d.invalid_string,validation:"date",message:a.message}),s.dirty()):a.kind==="time"?nt(a).test(e.data)||(n=this._getOrReturnCtx(e,n),u(n,{code:d.invalid_string,validation:"time",message:a.message}),s.dirty()):a.kind==="duration"?Ye.test(e.data)||(n=this._getOrReturnCtx(e,n),u(n,{validation:"duration",code:d.invalid_string,message:a.message}),s.dirty()):a.kind==="ip"?at(e.data,a.version)||(n=this._getOrReturnCtx(e,n),u(n,{validation:"ip",code:d.invalid_string,message:a.message}),s.dirty()):a.kind==="jwt"?it(e.data,a.alg)||(n=this._getOrReturnCtx(e,n),u(n,{validation:"jwt",code:d.invalid_string,message:a.message}),s.dirty()):a.kind==="cidr"?ot(e.data,a.version)||(n=this._getOrReturnCtx(e,n),u(n,{validation:"cidr",code:d.invalid_string,message:a.message}),s.dirty()):a.kind==="base64"?tt.test(e.data)||(n=this._getOrReturnCtx(e,n),u(n,{validation:"base64",code:d.invalid_string,message:a.message}),s.dirty()):a.kind==="base64url"?rt.test(e.data)||(n=this._getOrReturnCtx(e,n),u(n,{validation:"base64url",code:d.invalid_string,message:a.message}),s.dirty()):g.assertNever(a);return {status:s.value,value:e.data}}_regex(e,t,s){return this.refinement(n=>e.test(n),{validation:t,code:d.invalid_string,...h.errToObj(s)})}_addCheck(e){return new r({...this._def,checks:[...this._def.checks,e]})}email(e){return this._addCheck({kind:"email",...h.errToObj(e)})}url(e){return this._addCheck({kind:"url",...h.errToObj(e)})}emoji(e){return this._addCheck({kind:"emoji",...h.errToObj(e)})}uuid(e){return this._addCheck({kind:"uuid",...h.errToObj(e)})}nanoid(e){return this._addCheck({kind:"nanoid",...h.errToObj(e)})}cuid(e){return this._addCheck({kind:"cuid",...h.errToObj(e)})}cuid2(e){return this._addCheck({kind:"cuid2",...h.errToObj(e)})}ulid(e){return this._addCheck({kind:"ulid",...h.errToObj(e)})}base64(e){return this._addCheck({kind:"base64",...h.errToObj(e)})}base64url(e){return this._addCheck({kind:"base64url",...h.errToObj(e)})}jwt(e){return this._addCheck({kind:"jwt",...h.errToObj(e)})}ip(e){return this._addCheck({kind:"ip",...h.errToObj(e)})}cidr(e){return this._addCheck({kind:"cidr",...h.errToObj(e)})}datetime(e){var t,s;return typeof e=="string"?this._addCheck({kind:"datetime",precision:null,offset:false,local:false,message:e}):this._addCheck({kind:"datetime",precision:typeof e?.precision>"u"?null:e?.precision,offset:(t=e?.offset)!==null&&t!==void 0?t:false,local:(s=e?.local)!==null&&s!==void 0?s:false,...h.errToObj(e?.message)})}date(e){return this._addCheck({kind:"date",message:e})}time(e){return typeof e=="string"?this._addCheck({kind:"time",precision:null,message:e}):this._addCheck({kind:"time",precision:typeof e?.precision>"u"?null:e?.precision,...h.errToObj(e?.message)})}duration(e){return this._addCheck({kind:"duration",...h.errToObj(e)})}regex(e,t){return this._addCheck({kind:"regex",regex:e,...h.errToObj(t)})}includes(e,t){return this._addCheck({kind:"includes",value:e,position:t?.position,...h.errToObj(t?.message)})}startsWith(e,t){return this._addCheck({kind:"startsWith",value:e,...h.errToObj(t)})}endsWith(e,t){return this._addCheck({kind:"endsWith",value:e,...h.errToObj(t)})}min(e,t){return this._addCheck({kind:"min",value:e,...h.errToObj(t)})}max(e,t){return this._addCheck({kind:"max",value:e,...h.errToObj(t)})}length(e,t){return this._addCheck({kind:"length",value:e,...h.errToObj(t)})}nonempty(e){return this.min(1,h.errToObj(e))}trim(){return new r({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new r({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new r({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return !!this._def.checks.find(e=>e.kind==="datetime")}get isDate(){return !!this._def.checks.find(e=>e.kind==="date")}get isTime(){return !!this._def.checks.find(e=>e.kind==="time")}get isDuration(){return !!this._def.checks.find(e=>e.kind==="duration")}get isEmail(){return !!this._def.checks.find(e=>e.kind==="email")}get isURL(){return !!this._def.checks.find(e=>e.kind==="url")}get isEmoji(){return !!this._def.checks.find(e=>e.kind==="emoji")}get isUUID(){return !!this._def.checks.find(e=>e.kind==="uuid")}get isNANOID(){return !!this._def.checks.find(e=>e.kind==="nanoid")}get isCUID(){return !!this._def.checks.find(e=>e.kind==="cuid")}get isCUID2(){return !!this._def.checks.find(e=>e.kind==="cuid2")}get isULID(){return !!this._def.checks.find(e=>e.kind==="ulid")}get isIP(){return !!this._def.checks.find(e=>e.kind==="ip")}get isCIDR(){return !!this._def.checks.find(e=>e.kind==="cidr")}get isBase64(){return !!this._def.checks.find(e=>e.kind==="base64")}get isBase64url(){return !!this._def.checks.find(e=>e.kind==="base64url")}get minLength(){let e=null;for(let t of this._def.checks)t.kind==="min"&&(e===null||t.value>e)&&(e=t.value);return e}get maxLength(){let e=null;for(let t of this._def.checks)t.kind==="max"&&(e===null||t.value<e)&&(e=t.value);return e}};$.create=r=>{var e;return new $({checks:[],typeName:m.ZodString,coerce:(e=r?.coerce)!==null&&e!==void 0?e:false,..._(r)})};function dt(r,e){let t=(r.toString().split(".")[1]||"").length,s=(e.toString().split(".")[1]||"").length,n=t>s?t:s,a=parseInt(r.toFixed(n).replace(".","")),i=parseInt(e.toFixed(n).replace(".",""));return a%i/Math.pow(10,n)}var z=class r extends y{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf;}_parse(e){if(this._def.coerce&&(e.data=Number(e.data)),this._getType(e)!==f$1.number){let a=this._getOrReturnCtx(e);return u(a,{code:d.invalid_type,expected:f$1.number,received:a.parsedType}),v}let s,n=new x;for(let a of this._def.checks)a.kind==="int"?g.isInteger(e.data)||(s=this._getOrReturnCtx(e,s),u(s,{code:d.invalid_type,expected:"integer",received:"float",message:a.message}),n.dirty()):a.kind==="min"?(a.inclusive?e.data<a.value:e.data<=a.value)&&(s=this._getOrReturnCtx(e,s),u(s,{code:d.too_small,minimum:a.value,type:"number",inclusive:a.inclusive,exact:false,message:a.message}),n.dirty()):a.kind==="max"?(a.inclusive?e.data>a.value:e.data>=a.value)&&(s=this._getOrReturnCtx(e,s),u(s,{code:d.too_big,maximum:a.value,type:"number",inclusive:a.inclusive,exact:false,message:a.message}),n.dirty()):a.kind==="multipleOf"?dt(e.data,a.value)!==0&&(s=this._getOrReturnCtx(e,s),u(s,{code:d.not_multiple_of,multipleOf:a.value,message:a.message}),n.dirty()):a.kind==="finite"?Number.isFinite(e.data)||(s=this._getOrReturnCtx(e,s),u(s,{code:d.not_finite,message:a.message}),n.dirty()):g.assertNever(a);return {status:n.value,value:e.data}}gte(e,t){return this.setLimit("min",e,true,h.toString(t))}gt(e,t){return this.setLimit("min",e,false,h.toString(t))}lte(e,t){return this.setLimit("max",e,true,h.toString(t))}lt(e,t){return this.setLimit("max",e,false,h.toString(t))}setLimit(e,t,s,n){return new r({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:s,message:h.toString(n)}]})}_addCheck(e){return new r({...this._def,checks:[...this._def.checks,e]})}int(e){return this._addCheck({kind:"int",message:h.toString(e)})}positive(e){return this._addCheck({kind:"min",value:0,inclusive:false,message:h.toString(e)})}negative(e){return this._addCheck({kind:"max",value:0,inclusive:false,message:h.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:0,inclusive:true,message:h.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:0,inclusive:true,message:h.toString(e)})}multipleOf(e,t){return this._addCheck({kind:"multipleOf",value:e,message:h.toString(t)})}finite(e){return this._addCheck({kind:"finite",message:h.toString(e)})}safe(e){return this._addCheck({kind:"min",inclusive:true,value:Number.MIN_SAFE_INTEGER,message:h.toString(e)})._addCheck({kind:"max",inclusive:true,value:Number.MAX_SAFE_INTEGER,message:h.toString(e)})}get minValue(){let e=null;for(let t of this._def.checks)t.kind==="min"&&(e===null||t.value>e)&&(e=t.value);return e}get maxValue(){let e=null;for(let t of this._def.checks)t.kind==="max"&&(e===null||t.value<e)&&(e=t.value);return e}get isInt(){return !!this._def.checks.find(e=>e.kind==="int"||e.kind==="multipleOf"&&g.isInteger(e.value))}get isFinite(){let e=null,t=null;for(let s of this._def.checks){if(s.kind==="finite"||s.kind==="int"||s.kind==="multipleOf")return true;s.kind==="min"?(t===null||s.value>t)&&(t=s.value):s.kind==="max"&&(e===null||s.value<e)&&(e=s.value);}return Number.isFinite(t)&&Number.isFinite(e)}};z.create=r=>new z({checks:[],typeName:m.ZodNumber,coerce:r?.coerce||false,..._(r)});var D=class r extends y{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte;}_parse(e){if(this._def.coerce)try{e.data=BigInt(e.data);}catch{return this._getInvalidInput(e)}if(this._getType(e)!==f$1.bigint)return this._getInvalidInput(e);let s,n=new x;for(let a of this._def.checks)a.kind==="min"?(a.inclusive?e.data<a.value:e.data<=a.value)&&(s=this._getOrReturnCtx(e,s),u(s,{code:d.too_small,type:"bigint",minimum:a.value,inclusive:a.inclusive,message:a.message}),n.dirty()):a.kind==="max"?(a.inclusive?e.data>a.value:e.data>=a.value)&&(s=this._getOrReturnCtx(e,s),u(s,{code:d.too_big,type:"bigint",maximum:a.value,inclusive:a.inclusive,message:a.message}),n.dirty()):a.kind==="multipleOf"?e.data%a.value!==BigInt(0)&&(s=this._getOrReturnCtx(e,s),u(s,{code:d.not_multiple_of,multipleOf:a.value,message:a.message}),n.dirty()):g.assertNever(a);return {status:n.value,value:e.data}}_getInvalidInput(e){let t=this._getOrReturnCtx(e);return u(t,{code:d.invalid_type,expected:f$1.bigint,received:t.parsedType}),v}gte(e,t){return this.setLimit("min",e,true,h.toString(t))}gt(e,t){return this.setLimit("min",e,false,h.toString(t))}lte(e,t){return this.setLimit("max",e,true,h.toString(t))}lt(e,t){return this.setLimit("max",e,false,h.toString(t))}setLimit(e,t,s,n){return new r({...this._def,checks:[...this._def.checks,{kind:e,value:t,inclusive:s,message:h.toString(n)}]})}_addCheck(e){return new r({...this._def,checks:[...this._def.checks,e]})}positive(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:false,message:h.toString(e)})}negative(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:false,message:h.toString(e)})}nonpositive(e){return this._addCheck({kind:"max",value:BigInt(0),inclusive:true,message:h.toString(e)})}nonnegative(e){return this._addCheck({kind:"min",value:BigInt(0),inclusive:true,message:h.toString(e)})}multipleOf(e,t){return this._addCheck({kind:"multipleOf",value:e,message:h.toString(t)})}get minValue(){let e=null;for(let t of this._def.checks)t.kind==="min"&&(e===null||t.value>e)&&(e=t.value);return e}get maxValue(){let e=null;for(let t of this._def.checks)t.kind==="max"&&(e===null||t.value<e)&&(e=t.value);return e}};D.create=r=>{var e;return new D({checks:[],typeName:m.ZodBigInt,coerce:(e=r?.coerce)!==null&&e!==void 0?e:false,..._(r)})};var L=class extends y{_parse(e){if(this._def.coerce&&(e.data=!!e.data),this._getType(e)!==f$1.boolean){let s=this._getOrReturnCtx(e);return u(s,{code:d.invalid_type,expected:f$1.boolean,received:s.parsedType}),v}return b(e.data)}};L.create=r=>new L({typeName:m.ZodBoolean,coerce:r?.coerce||false,..._(r)});var U=class r extends y{_parse(e){if(this._def.coerce&&(e.data=new Date(e.data)),this._getType(e)!==f$1.date){let a=this._getOrReturnCtx(e);return u(a,{code:d.invalid_type,expected:f$1.date,received:a.parsedType}),v}if(isNaN(e.data.getTime())){let a=this._getOrReturnCtx(e);return u(a,{code:d.invalid_date}),v}let s=new x,n;for(let a of this._def.checks)a.kind==="min"?e.data.getTime()<a.value&&(n=this._getOrReturnCtx(e,n),u(n,{code:d.too_small,message:a.message,inclusive:true,exact:false,minimum:a.value,type:"date"}),s.dirty()):a.kind==="max"?e.data.getTime()>a.value&&(n=this._getOrReturnCtx(e,n),u(n,{code:d.too_big,message:a.message,inclusive:true,exact:false,maximum:a.value,type:"date"}),s.dirty()):g.assertNever(a);return {status:s.value,value:new Date(e.data.getTime())}}_addCheck(e){return new r({...this._def,checks:[...this._def.checks,e]})}min(e,t){return this._addCheck({kind:"min",value:e.getTime(),message:h.toString(t)})}max(e,t){return this._addCheck({kind:"max",value:e.getTime(),message:h.toString(t)})}get minDate(){let e=null;for(let t of this._def.checks)t.kind==="min"&&(e===null||t.value>e)&&(e=t.value);return e!=null?new Date(e):null}get maxDate(){let e=null;for(let t of this._def.checks)t.kind==="max"&&(e===null||t.value<e)&&(e=t.value);return e!=null?new Date(e):null}};U.create=r=>new U({checks:[],coerce:r?.coerce||false,typeName:m.ZodDate,..._(r)});var se=class extends y{_parse(e){if(this._getType(e)!==f$1.symbol){let s=this._getOrReturnCtx(e);return u(s,{code:d.invalid_type,expected:f$1.symbol,received:s.parsedType}),v}return b(e.data)}};se.create=r=>new se({typeName:m.ZodSymbol,..._(r)});var F=class extends y{_parse(e){if(this._getType(e)!==f$1.undefined){let s=this._getOrReturnCtx(e);return u(s,{code:d.invalid_type,expected:f$1.undefined,received:s.parsedType}),v}return b(e.data)}};F.create=r=>new F({typeName:m.ZodUndefined,..._(r)});var B=class extends y{_parse(e){if(this._getType(e)!==f$1.null){let s=this._getOrReturnCtx(e);return u(s,{code:d.invalid_type,expected:f$1.null,received:s.parsedType}),v}return b(e.data)}};B.create=r=>new B({typeName:m.ZodNull,..._(r)});var M=class extends y{constructor(){super(...arguments),this._any=true;}_parse(e){return b(e.data)}};M.create=r=>new M({typeName:m.ZodAny,..._(r)});var N=class extends y{constructor(){super(...arguments),this._unknown=true;}_parse(e){return b(e.data)}};N.create=r=>new N({typeName:m.ZodUnknown,..._(r)});var A=class extends y{_parse(e){let t=this._getOrReturnCtx(e);return u(t,{code:d.invalid_type,expected:f$1.never,received:t.parsedType}),v}};A.create=r=>new A({typeName:m.ZodNever,..._(r)});var ne=class extends y{_parse(e){if(this._getType(e)!==f$1.undefined){let s=this._getOrReturnCtx(e);return u(s,{code:d.invalid_type,expected:f$1.void,received:s.parsedType}),v}return b(e.data)}};ne.create=r=>new ne({typeName:m.ZodVoid,..._(r)});var I=class r extends y{_parse(e){let{ctx:t,status:s}=this._processInputParams(e),n=this._def;if(t.parsedType!==f$1.array)return u(t,{code:d.invalid_type,expected:f$1.array,received:t.parsedType}),v;if(n.exactLength!==null){let i=t.data.length>n.exactLength.value,o=t.data.length<n.exactLength.value;(i||o)&&(u(t,{code:i?d.too_big:d.too_small,minimum:o?n.exactLength.value:void 0,maximum:i?n.exactLength.value:void 0,type:"array",inclusive:true,exact:true,message:n.exactLength.message}),s.dirty());}if(n.minLength!==null&&t.data.length<n.minLength.value&&(u(t,{code:d.too_small,minimum:n.minLength.value,type:"array",inclusive:true,exact:false,message:n.minLength.message}),s.dirty()),n.maxLength!==null&&t.data.length>n.maxLength.value&&(u(t,{code:d.too_big,maximum:n.maxLength.value,type:"array",inclusive:true,exact:false,message:n.maxLength.message}),s.dirty()),t.common.async)return Promise.all([...t.data].map((i,o)=>n.type._parseAsync(new S(t,i,t.path,o)))).then(i=>x.mergeArray(s,i));let a=[...t.data].map((i,o)=>n.type._parseSync(new S(t,i,t.path,o)));return x.mergeArray(s,a)}get element(){return this._def.type}min(e,t){return new r({...this._def,minLength:{value:e,message:h.toString(t)}})}max(e,t){return new r({...this._def,maxLength:{value:e,message:h.toString(t)}})}length(e,t){return new r({...this._def,exactLength:{value:e,message:h.toString(t)}})}nonempty(e){return this.min(1,e)}};I.create=(r,e)=>new I({type:r,minLength:null,maxLength:null,exactLength:null,typeName:m.ZodArray,..._(e)});function ee(r){if(r instanceof w){let e={};for(let t in r.shape){let s=r.shape[t];e[t]=O.create(ee(s));}return new w({...r._def,shape:()=>e})}else return r instanceof I?new I({...r._def,type:ee(r.element)}):r instanceof O?O.create(ee(r.unwrap())):r instanceof R?R.create(ee(r.unwrap())):r instanceof E?E.create(r.items.map(e=>ee(e))):r}var w=class r extends y{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend;}_getCached(){if(this._cached!==null)return this._cached;let e=this._def.shape(),t=g.objectKeys(e);return this._cached={shape:e,keys:t}}_parse(e){if(this._getType(e)!==f$1.object){let c=this._getOrReturnCtx(e);return u(c,{code:d.invalid_type,expected:f$1.object,received:c.parsedType}),v}let{status:s,ctx:n}=this._processInputParams(e),{shape:a,keys:i}=this._getCached(),o=[];if(!(this._def.catchall instanceof A&&this._def.unknownKeys==="strip"))for(let c in n.data)i.includes(c)||o.push(c);let l=[];for(let c of i){let p=a[c],k=n.data[c];l.push({key:{status:"valid",value:c},value:p._parse(new S(n,k,n.path,c)),alwaysSet:c in n.data});}if(this._def.catchall instanceof A){let c=this._def.unknownKeys;if(c==="passthrough")for(let p of o)l.push({key:{status:"valid",value:p},value:{status:"valid",value:n.data[p]}});else if(c==="strict")o.length>0&&(u(n,{code:d.unrecognized_keys,keys:o}),s.dirty());else if(c!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else {let c=this._def.catchall;for(let p of o){let k=n.data[p];l.push({key:{status:"valid",value:p},value:c._parse(new S(n,k,n.path,p)),alwaysSet:p in n.data});}}return n.common.async?Promise.resolve().then(async()=>{let c=[];for(let p of l){let k=await p.key,he=await p.value;c.push({key:k,value:he,alwaysSet:p.alwaysSet});}return c}).then(c=>x.mergeObjectSync(s,c)):x.mergeObjectSync(s,l)}get shape(){return this._def.shape()}strict(e){return h.errToObj,new r({...this._def,unknownKeys:"strict",...e!==void 0?{errorMap:(t,s)=>{var n,a,i,o;let l=(i=(a=(n=this._def).errorMap)===null||a===void 0?void 0:a.call(n,t,s).message)!==null&&i!==void 0?i:s.defaultError;return t.code==="unrecognized_keys"?{message:(o=h.errToObj(e).message)!==null&&o!==void 0?o:l}:{message:l}}}:{}})}strip(){return new r({...this._def,unknownKeys:"strip"})}passthrough(){return new r({...this._def,unknownKeys:"passthrough"})}extend(e){return new r({...this._def,shape:()=>({...this._def.shape(),...e})})}merge(e){return new r({unknownKeys:e._def.unknownKeys,catchall:e._def.catchall,shape:()=>({...this._def.shape(),...e._def.shape()}),typeName:m.ZodObject})}setKey(e,t){return this.augment({[e]:t})}catchall(e){return new r({...this._def,catchall:e})}pick(e){let t={};return g.objectKeys(e).forEach(s=>{e[s]&&this.shape[s]&&(t[s]=this.shape[s]);}),new r({...this._def,shape:()=>t})}omit(e){let t={};return g.objectKeys(this.shape).forEach(s=>{e[s]||(t[s]=this.shape[s]);}),new r({...this._def,shape:()=>t})}deepPartial(){return ee(this)}partial(e){let t={};return g.objectKeys(this.shape).forEach(s=>{let n=this.shape[s];e&&!e[s]?t[s]=n:t[s]=n.optional();}),new r({...this._def,shape:()=>t})}required(e){let t={};return g.objectKeys(this.shape).forEach(s=>{if(e&&!e[s])t[s]=this.shape[s];else {let a=this.shape[s];for(;a instanceof O;)a=a._def.innerType;t[s]=a;}}),new r({...this._def,shape:()=>t})}keyof(){return Ie(g.objectKeys(this.shape))}};w.create=(r,e)=>new w({shape:()=>r,unknownKeys:"strip",catchall:A.create(),typeName:m.ZodObject,..._(e)});w.strictCreate=(r,e)=>new w({shape:()=>r,unknownKeys:"strict",catchall:A.create(),typeName:m.ZodObject,..._(e)});w.lazycreate=(r,e)=>new w({shape:r,unknownKeys:"strip",catchall:A.create(),typeName:m.ZodObject,..._(e)});var W=class extends y{_parse(e){let{ctx:t}=this._processInputParams(e),s=this._def.options;function n(a){for(let o of a)if(o.result.status==="valid")return o.result;for(let o of a)if(o.result.status==="dirty")return t.common.issues.push(...o.ctx.common.issues),o.result;let i=a.map(o=>new T(o.ctx.common.issues));return u(t,{code:d.invalid_union,unionErrors:i}),v}if(t.common.async)return Promise.all(s.map(async a=>{let i={...t,common:{...t.common,issues:[]},parent:null};return {result:await a._parseAsync({data:t.data,path:t.path,parent:i}),ctx:i}})).then(n);{let a,i=[];for(let l of s){let c={...t,common:{...t.common,issues:[]},parent:null},p=l._parseSync({data:t.data,path:t.path,parent:c});if(p.status==="valid")return p;p.status==="dirty"&&!a&&(a={result:p,ctx:c}),c.common.issues.length&&i.push(c.common.issues);}if(a)return t.common.issues.push(...a.ctx.common.issues),a.result;let o=i.map(l=>new T(l));return u(t,{code:d.invalid_union,unionErrors:o}),v}}get options(){return this._def.options}};W.create=(r,e)=>new W({options:r,typeName:m.ZodUnion,..._(e)});var Z=r=>r instanceof J?Z(r.schema):r instanceof C?Z(r.innerType()):r instanceof Y?[r.value]:r instanceof H?r.options:r instanceof G?g.objectValues(r.enum):r instanceof Q?Z(r._def.innerType):r instanceof F?[void 0]:r instanceof B?[null]:r instanceof O?[void 0,...Z(r.unwrap())]:r instanceof R?[null,...Z(r.unwrap())]:r instanceof le||r instanceof K?Z(r.unwrap()):r instanceof X?Z(r._def.innerType):[],_e=class r extends y{_parse(e){let{ctx:t}=this._processInputParams(e);if(t.parsedType!==f$1.object)return u(t,{code:d.invalid_type,expected:f$1.object,received:t.parsedType}),v;let s=this.discriminator,n=t.data[s],a=this.optionsMap.get(n);return a?t.common.async?a._parseAsync({data:t.data,path:t.path,parent:t}):a._parseSync({data:t.data,path:t.path,parent:t}):(u(t,{code:d.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[s]}),v)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(e,t,s){let n=new Map;for(let a of t){let i=Z(a.shape[e]);if(!i.length)throw new Error(`A discriminator value for key \`${e}\` could not be extracted from all schema options`);for(let o of i){if(n.has(o))throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(o)}`);n.set(o,a);}}return new r({typeName:m.ZodDiscriminatedUnion,discriminator:e,options:t,optionsMap:n,..._(s)})}};function Ce(r,e){let t=j(r),s=j(e);if(r===e)return {valid:true,data:r};if(t===f$1.object&&s===f$1.object){let n=g.objectKeys(e),a=g.objectKeys(r).filter(o=>n.indexOf(o)!==-1),i={...r,...e};for(let o of a){let l=Ce(r[o],e[o]);if(!l.valid)return {valid:false};i[o]=l.data;}return {valid:true,data:i}}else if(t===f$1.array&&s===f$1.array){if(r.length!==e.length)return {valid:false};let n=[];for(let a=0;a<r.length;a++){let i=r[a],o=e[a],l=Ce(i,o);if(!l.valid)return {valid:false};n.push(l.data);}return {valid:true,data:n}}else return t===f$1.date&&s===f$1.date&&+r==+e?{valid:true,data:r}:{valid:false}}var q=class extends y{_parse(e){let{status:t,ctx:s}=this._processInputParams(e),n=(a,i)=>{if(we(a)||we(i))return v;let o=Ce(a.value,i.value);return o.valid?((Te(a)||Te(i))&&t.dirty(),{status:t.value,value:o.data}):(u(s,{code:d.invalid_intersection_types}),v)};return s.common.async?Promise.all([this._def.left._parseAsync({data:s.data,path:s.path,parent:s}),this._def.right._parseAsync({data:s.data,path:s.path,parent:s})]).then(([a,i])=>n(a,i)):n(this._def.left._parseSync({data:s.data,path:s.path,parent:s}),this._def.right._parseSync({data:s.data,path:s.path,parent:s}))}};q.create=(r,e,t)=>new q({left:r,right:e,typeName:m.ZodIntersection,..._(t)});var E=class r extends y{_parse(e){let{status:t,ctx:s}=this._processInputParams(e);if(s.parsedType!==f$1.array)return u(s,{code:d.invalid_type,expected:f$1.array,received:s.parsedType}),v;if(s.data.length<this._def.items.length)return u(s,{code:d.too_small,minimum:this._def.items.length,inclusive:true,exact:false,type:"array"}),v;!this._def.rest&&s.data.length>this._def.items.length&&(u(s,{code:d.too_big,maximum:this._def.items.length,inclusive:true,exact:false,type:"array"}),t.dirty());let a=[...s.data].map((i,o)=>{let l=this._def.items[o]||this._def.rest;return l?l._parse(new S(s,i,s.path,o)):null}).filter(i=>!!i);return s.common.async?Promise.all(a).then(i=>x.mergeArray(t,i)):x.mergeArray(t,a)}get items(){return this._def.items}rest(e){return new r({...this._def,rest:e})}};E.create=(r,e)=>{if(!Array.isArray(r))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new E({items:r,typeName:m.ZodTuple,rest:null,..._(e)})};var ye=class r extends y{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){let{status:t,ctx:s}=this._processInputParams(e);if(s.parsedType!==f$1.object)return u(s,{code:d.invalid_type,expected:f$1.object,received:s.parsedType}),v;let n=[],a=this._def.keyType,i=this._def.valueType;for(let o in s.data)n.push({key:a._parse(new S(s,o,s.path,o)),value:i._parse(new S(s,s.data[o],s.path,o)),alwaysSet:o in s.data});return s.common.async?x.mergeObjectAsync(t,n):x.mergeObjectSync(t,n)}get element(){return this._def.valueType}static create(e,t,s){return t instanceof y?new r({keyType:e,valueType:t,typeName:m.ZodRecord,..._(s)}):new r({keyType:$.create(),valueType:e,typeName:m.ZodRecord,..._(t)})}},ae=class extends y{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(e){let{status:t,ctx:s}=this._processInputParams(e);if(s.parsedType!==f$1.map)return u(s,{code:d.invalid_type,expected:f$1.map,received:s.parsedType}),v;let n=this._def.keyType,a=this._def.valueType,i=[...s.data.entries()].map(([o,l],c)=>({key:n._parse(new S(s,o,s.path,[c,"key"])),value:a._parse(new S(s,l,s.path,[c,"value"]))}));if(s.common.async){let o=new Map;return Promise.resolve().then(async()=>{for(let l of i){let c=await l.key,p=await l.value;if(c.status==="aborted"||p.status==="aborted")return v;(c.status==="dirty"||p.status==="dirty")&&t.dirty(),o.set(c.value,p.value);}return {status:t.value,value:o}})}else {let o=new Map;for(let l of i){let c=l.key,p=l.value;if(c.status==="aborted"||p.status==="aborted")return v;(c.status==="dirty"||p.status==="dirty")&&t.dirty(),o.set(c.value,p.value);}return {status:t.value,value:o}}}};ae.create=(r,e,t)=>new ae({valueType:e,keyType:r,typeName:m.ZodMap,..._(t)});var ie=class r extends y{_parse(e){let{status:t,ctx:s}=this._processInputParams(e);if(s.parsedType!==f$1.set)return u(s,{code:d.invalid_type,expected:f$1.set,received:s.parsedType}),v;let n=this._def;n.minSize!==null&&s.data.size<n.minSize.value&&(u(s,{code:d.too_small,minimum:n.minSize.value,type:"set",inclusive:true,exact:false,message:n.minSize.message}),t.dirty()),n.maxSize!==null&&s.data.size>n.maxSize.value&&(u(s,{code:d.too_big,maximum:n.maxSize.value,type:"set",inclusive:true,exact:false,message:n.maxSize.message}),t.dirty());let a=this._def.valueType;function i(l){let c=new Set;for(let p of l){if(p.status==="aborted")return v;p.status==="dirty"&&t.dirty(),c.add(p.value);}return {status:t.value,value:c}}let o=[...s.data.values()].map((l,c)=>a._parse(new S(s,l,s.path,c)));return s.common.async?Promise.all(o).then(l=>i(l)):i(o)}min(e,t){return new r({...this._def,minSize:{value:e,message:h.toString(t)}})}max(e,t){return new r({...this._def,maxSize:{value:e,message:h.toString(t)}})}size(e,t){return this.min(e,t).max(e,t)}nonempty(e){return this.min(1,e)}};ie.create=(r,e)=>new ie({valueType:r,minSize:null,maxSize:null,typeName:m.ZodSet,..._(e)});var ge=class r extends y{constructor(){super(...arguments),this.validate=this.implement;}_parse(e){let{ctx:t}=this._processInputParams(e);if(t.parsedType!==f$1.function)return u(t,{code:d.invalid_type,expected:f$1.function,received:t.parsedType}),v;function s(o,l){return me({data:o,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,pe(),re].filter(c=>!!c),issueData:{code:d.invalid_arguments,argumentsError:l}})}function n(o,l){return me({data:o,path:t.path,errorMaps:[t.common.contextualErrorMap,t.schemaErrorMap,pe(),re].filter(c=>!!c),issueData:{code:d.invalid_return_type,returnTypeError:l}})}let a={errorMap:t.common.contextualErrorMap},i=t.data;if(this._def.returns instanceof V){let o=this;return b(async function(...l){let c=new T([]),p=await o._def.args.parseAsync(l,a).catch(xe=>{throw c.addIssue(s(l,xe)),c}),k=await Reflect.apply(i,this,p);return await o._def.returns._def.type.parseAsync(k,a).catch(xe=>{throw c.addIssue(n(k,xe)),c})})}else {let o=this;return b(function(...l){let c=o._def.args.safeParse(l,a);if(!c.success)throw new T([s(l,c.error)]);let p=Reflect.apply(i,this,c.data),k=o._def.returns.safeParse(p,a);if(!k.success)throw new T([n(p,k.error)]);return k.data})}}parameters(){return this._def.args}returnType(){return this._def.returns}args(...e){return new r({...this._def,args:E.create(e).rest(N.create())})}returns(e){return new r({...this._def,returns:e})}implement(e){return this.parse(e)}strictImplement(e){return this.parse(e)}static create(e,t,s){return new r({args:e||E.create([]).rest(N.create()),returns:t||N.create(),typeName:m.ZodFunction,..._(s)})}},J=class extends y{get schema(){return this._def.getter()}_parse(e){let{ctx:t}=this._processInputParams(e);return this._def.getter()._parse({data:t.data,path:t.path,parent:t})}};J.create=(r,e)=>new J({getter:r,typeName:m.ZodLazy,..._(e)});var Y=class extends y{_parse(e){if(e.data!==this._def.value){let t=this._getOrReturnCtx(e);return u(t,{received:t.data,code:d.invalid_literal,expected:this._def.value}),v}return {status:"valid",value:e.data}}get value(){return this._def.value}};Y.create=(r,e)=>new Y({value:r,typeName:m.ZodLiteral,..._(e)});function Ie(r,e){return new H({values:r,typeName:m.ZodEnum,..._(e)})}var H=class r extends y{constructor(){super(...arguments),de.set(this,void 0);}_parse(e){if(typeof e.data!="string"){let t=this._getOrReturnCtx(e),s=this._def.values;return u(t,{expected:g.joinValues(s),received:t.parsedType,code:d.invalid_type}),v}if(ve(this,de)||Re(this,de,new Set(this._def.values)),!ve(this,de).has(e.data)){let t=this._getOrReturnCtx(e),s=this._def.values;return u(t,{received:t.data,code:d.invalid_enum_value,options:s}),v}return b(e.data)}get options(){return this._def.values}get enum(){let e={};for(let t of this._def.values)e[t]=t;return e}get Values(){let e={};for(let t of this._def.values)e[t]=t;return e}get Enum(){let e={};for(let t of this._def.values)e[t]=t;return e}extract(e,t=this._def){return r.create(e,{...this._def,...t})}exclude(e,t=this._def){return r.create(this.options.filter(s=>!e.includes(s)),{...this._def,...t})}};de=new WeakMap;H.create=Ie;var G=class extends y{constructor(){super(...arguments),ce.set(this,void 0);}_parse(e){let t=g.getValidEnumValues(this._def.values),s=this._getOrReturnCtx(e);if(s.parsedType!==f$1.string&&s.parsedType!==f$1.number){let n=g.objectValues(t);return u(s,{expected:g.joinValues(n),received:s.parsedType,code:d.invalid_type}),v}if(ve(this,ce)||Re(this,ce,new Set(g.getValidEnumValues(this._def.values))),!ve(this,ce).has(e.data)){let n=g.objectValues(t);return u(s,{received:s.data,code:d.invalid_enum_value,options:n}),v}return b(e.data)}get enum(){return this._def.values}};ce=new WeakMap;G.create=(r,e)=>new G({values:r,typeName:m.ZodNativeEnum,..._(e)});var V=class extends y{unwrap(){return this._def.type}_parse(e){let{ctx:t}=this._processInputParams(e);if(t.parsedType!==f$1.promise&&t.common.async===false)return u(t,{code:d.invalid_type,expected:f$1.promise,received:t.parsedType}),v;let s=t.parsedType===f$1.promise?t.data:Promise.resolve(t.data);return b(s.then(n=>this._def.type.parseAsync(n,{path:t.path,errorMap:t.common.contextualErrorMap})))}};V.create=(r,e)=>new V({type:r,typeName:m.ZodPromise,..._(e)});var C=class extends y{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===m.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(e){let{status:t,ctx:s}=this._processInputParams(e),n=this._def.effect||null,a={addIssue:i=>{u(s,i),i.fatal?t.abort():t.dirty();},get path(){return s.path}};if(a.addIssue=a.addIssue.bind(a),n.type==="preprocess"){let i=n.transform(s.data,a);if(s.common.async)return Promise.resolve(i).then(async o=>{if(t.value==="aborted")return v;let l=await this._def.schema._parseAsync({data:o,path:s.path,parent:s});return l.status==="aborted"?v:l.status==="dirty"||t.value==="dirty"?te(l.value):l});{if(t.value==="aborted")return v;let o=this._def.schema._parseSync({data:i,path:s.path,parent:s});return o.status==="aborted"?v:o.status==="dirty"||t.value==="dirty"?te(o.value):o}}if(n.type==="refinement"){let i=o=>{let l=n.refinement(o,a);if(s.common.async)return Promise.resolve(l);if(l instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return o};if(s.common.async===false){let o=this._def.schema._parseSync({data:s.data,path:s.path,parent:s});return o.status==="aborted"?v:(o.status==="dirty"&&t.dirty(),i(o.value),{status:t.value,value:o.value})}else return this._def.schema._parseAsync({data:s.data,path:s.path,parent:s}).then(o=>o.status==="aborted"?v:(o.status==="dirty"&&t.dirty(),i(o.value).then(()=>({status:t.value,value:o.value}))))}if(n.type==="transform")if(s.common.async===false){let i=this._def.schema._parseSync({data:s.data,path:s.path,parent:s});if(!P(i))return i;let o=n.transform(i.value,a);if(o instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return {status:t.value,value:o}}else return this._def.schema._parseAsync({data:s.data,path:s.path,parent:s}).then(i=>P(i)?Promise.resolve(n.transform(i.value,a)).then(o=>({status:t.value,value:o})):i);g.assertNever(n);}};C.create=(r,e,t)=>new C({schema:r,typeName:m.ZodEffects,effect:e,..._(t)});C.createWithPreprocess=(r,e,t)=>new C({schema:e,effect:{type:"preprocess",transform:r},typeName:m.ZodEffects,..._(t)});var O=class extends y{_parse(e){return this._getType(e)===f$1.undefined?b(void 0):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}};O.create=(r,e)=>new O({innerType:r,typeName:m.ZodOptional,..._(e)});var R=class extends y{_parse(e){return this._getType(e)===f$1.null?b(null):this._def.innerType._parse(e)}unwrap(){return this._def.innerType}};R.create=(r,e)=>new R({innerType:r,typeName:m.ZodNullable,..._(e)});var Q=class extends y{_parse(e){let{ctx:t}=this._processInputParams(e),s=t.data;return t.parsedType===f$1.undefined&&(s=this._def.defaultValue()),this._def.innerType._parse({data:s,path:t.path,parent:t})}removeDefault(){return this._def.innerType}};Q.create=(r,e)=>new Q({innerType:r,typeName:m.ZodDefault,defaultValue:typeof e.default=="function"?e.default:()=>e.default,..._(e)});var X=class extends y{_parse(e){let{ctx:t}=this._processInputParams(e),s={...t,common:{...t.common,issues:[]}},n=this._def.innerType._parse({data:s.data,path:s.path,parent:{...s}});return ue(n)?n.then(a=>({status:"valid",value:a.status==="valid"?a.value:this._def.catchValue({get error(){return new T(s.common.issues)},input:s.data})})):{status:"valid",value:n.status==="valid"?n.value:this._def.catchValue({get error(){return new T(s.common.issues)},input:s.data})}}removeCatch(){return this._def.innerType}};X.create=(r,e)=>new X({innerType:r,typeName:m.ZodCatch,catchValue:typeof e.catch=="function"?e.catch:()=>e.catch,..._(e)});var oe=class extends y{_parse(e){if(this._getType(e)!==f$1.nan){let s=this._getOrReturnCtx(e);return u(s,{code:d.invalid_type,expected:f$1.nan,received:s.parsedType}),v}return {status:"valid",value:e.data}}};oe.create=r=>new oe({typeName:m.ZodNaN,..._(r)});var ct=Symbol("zod_brand"),le=class extends y{_parse(e){let{ctx:t}=this._processInputParams(e),s=t.data;return this._def.type._parse({data:s,path:t.path,parent:t})}unwrap(){return this._def.type}},fe=class r extends y{_parse(e){let{status:t,ctx:s}=this._processInputParams(e);if(s.common.async)return (async()=>{let a=await this._def.in._parseAsync({data:s.data,path:s.path,parent:s});return a.status==="aborted"?v:a.status==="dirty"?(t.dirty(),te(a.value)):this._def.out._parseAsync({data:a.value,path:s.path,parent:s})})();{let n=this._def.in._parseSync({data:s.data,path:s.path,parent:s});return n.status==="aborted"?v:n.status==="dirty"?(t.dirty(),{status:"dirty",value:n.value}):this._def.out._parseSync({data:n.value,path:s.path,parent:s})}}static create(e,t){return new r({in:e,out:t,typeName:m.ZodPipeline})}},K=class extends y{_parse(e){let t=this._def.innerType._parse(e),s=n=>(P(n)&&(n.value=Object.freeze(n.value)),n);return ue(t)?t.then(n=>s(n)):s(t)}unwrap(){return this._def.innerType}};K.create=(r,e)=>new K({innerType:r,typeName:m.ZodReadonly,..._(e)});function Se(r,e){let t=typeof r=="function"?r(e):typeof r=="string"?{message:r}:r;return typeof t=="string"?{message:t}:t}function $e(r,e={},t){return r?M.create().superRefine((s,n)=>{var a,i;let o=r(s);if(o instanceof Promise)return o.then(l=>{var c,p;if(!l){let k=Se(e,s),he=(p=(c=k.fatal)!==null&&c!==void 0?c:t)!==null&&p!==void 0?p:true;n.addIssue({code:"custom",...k,fatal:he});}});if(!o){let l=Se(e,s),c=(i=(a=l.fatal)!==null&&a!==void 0?a:t)!==null&&i!==void 0?i:true;n.addIssue({code:"custom",...l,fatal:c});}}):M.create()}var ut={object:w.lazycreate},m;(function(r){r.ZodString="ZodString",r.ZodNumber="ZodNumber",r.ZodNaN="ZodNaN",r.ZodBigInt="ZodBigInt",r.ZodBoolean="ZodBoolean",r.ZodDate="ZodDate",r.ZodSymbol="ZodSymbol",r.ZodUndefined="ZodUndefined",r.ZodNull="ZodNull",r.ZodAny="ZodAny",r.ZodUnknown="ZodUnknown",r.ZodNever="ZodNever",r.ZodVoid="ZodVoid",r.ZodArray="ZodArray",r.ZodObject="ZodObject",r.ZodUnion="ZodUnion",r.ZodDiscriminatedUnion="ZodDiscriminatedUnion",r.ZodIntersection="ZodIntersection",r.ZodTuple="ZodTuple",r.ZodRecord="ZodRecord",r.ZodMap="ZodMap",r.ZodSet="ZodSet",r.ZodFunction="ZodFunction",r.ZodLazy="ZodLazy",r.ZodLiteral="ZodLiteral",r.ZodEnum="ZodEnum",r.ZodEffects="ZodEffects",r.ZodNativeEnum="ZodNativeEnum",r.ZodOptional="ZodOptional",r.ZodNullable="ZodNullable",r.ZodDefault="ZodDefault",r.ZodCatch="ZodCatch",r.ZodPromise="ZodPromise",r.ZodBranded="ZodBranded",r.ZodPipeline="ZodPipeline",r.ZodReadonly="ZodReadonly";})(m||(m={}));var lt=(r,e={message:`Input not instance of ${r.name}`})=>$e(t=>t instanceof r,e),Me=$.create,Ve=z.create,ft=oe.create,ht=D.create,Pe=L.create,pt=U.create,mt=se.create,vt=F.create,_t=B.create,yt=M.create,gt=N.create,xt=A.create,kt=ne.create,bt=I.create,wt=w.create,Tt=w.strictCreate,Ct=W.create,Ot=_e.create,St=q.create,At=E.create,Et=ye.create,Rt=ae.create,Zt=ie.create,jt=ge.create,Nt=J.create,It=Y.create,$t=H.create,Mt=G.create,Vt=V.create,Ae=C.create,Pt=O.create,zt=R.create,Dt=C.createWithPreprocess,Lt=fe.create,Ut=()=>Me().optional(),Ft=()=>Ve().optional(),Bt=()=>Pe().optional(),Wt={string:r=>$.create({...r,coerce:true}),number:r=>z.create({...r,coerce:true}),boolean:r=>L.create({...r,coerce:true}),bigint:r=>D.create({...r,coerce:true}),date:r=>U.create({...r,coerce:true})},qt=v,Jt=Object.freeze({__proto__:null,defaultErrorMap:re,setErrorMap:De,getErrorMap:pe,makeIssue:me,EMPTY_PATH:Le,addIssueToContext:u,ParseStatus:x,INVALID:v,DIRTY:te,OK:b,isAborted:we,isDirty:Te,isValid:P,isAsync:ue,get util(){return g},get objectUtil(){return be},ZodParsedType:f$1,getParsedType:j,ZodType:y,datetimeRegex:Ne,ZodString:$,ZodNumber:z,ZodBigInt:D,ZodBoolean:L,ZodDate:U,ZodSymbol:se,ZodUndefined:F,ZodNull:B,ZodAny:M,ZodUnknown:N,ZodNever:A,ZodVoid:ne,ZodArray:I,ZodObject:w,ZodUnion:W,ZodDiscriminatedUnion:_e,ZodIntersection:q,ZodTuple:E,ZodRecord:ye,ZodMap:ae,ZodSet:ie,ZodFunction:ge,ZodLazy:J,ZodLiteral:Y,ZodEnum:H,ZodNativeEnum:G,ZodPromise:V,ZodEffects:C,ZodTransformer:C,ZodOptional:O,ZodNullable:R,ZodDefault:Q,ZodCatch:X,ZodNaN:oe,BRAND:ct,ZodBranded:le,ZodPipeline:fe,ZodReadonly:K,custom:$e,Schema:y,ZodSchema:y,late:ut,get ZodFirstPartyTypeKind(){return m},coerce:Wt,any:yt,array:bt,bigint:ht,boolean:Pe,date:pt,discriminatedUnion:Ot,effect:Ae,enum:$t,function:jt,instanceof:lt,intersection:St,lazy:Nt,literal:It,map:Rt,nan:ft,nativeEnum:Mt,never:xt,null:_t,nullable:zt,number:Ve,object:wt,oboolean:Bt,onumber:Ft,optional:Pt,ostring:Ut,pipeline:Lt,preprocess:Dt,promise:Vt,record:Et,set:Zt,strictObject:Tt,string:Me,symbol:mt,transformer:Ae,tuple:At,undefined:vt,union:Ct,unknown:gt,void:kt,NEVER:qt,ZodIssueCode:d,quotelessJson:ze,ZodError:T});
7
+
8
+ Jt.object({sessionId:Jt.string().uuid()});Jt.object({platformId:Jt.string(),sourceId:Jt.string(),isFullApi:Jt.boolean().optional().default(false),timeOffset:Jt.number().default(0)});var i=Jt.object({uuid:Jt.string(),name:Jt.string(),notificationTopic:Jt.string().optional(),eventTopic:Jt.string().optional()});Jt.object({sessionId:Jt.string(),orgId:Jt.string(),userId:Jt.string(),platformId:Jt.string(),sourceId:Jt.string(),groups:Jt.array(i),mqtt:Jt.object({sessionRootTopic:Jt.string(),userNotificationEventsTopic:Jt.string(),allNotificationEventsTopic:Jt.string().optional(),notificationsRootTopic:Jt.string(),eventsRootTopic:Jt.string(),lastWillTopic:Jt.string(),url:Jt.string(),token:Jt.string(),userNotificationTopic:Jt.string()}).optional()}).strict();var e=Jt.enum(["new","update","delete"]),o=Jt.object({correlationId:Jt.string().optional(),targets:Jt.object({groups:Jt.array(Jt.string()).default([]),users:Jt.array(Jt.string()).default([])}),ttlSeconds:Jt.number().optional(),notificationClass:Jt.string().default("interactive").optional(),payload:Jt.unknown()});Jt.object({sessionId:Jt.string().uuid(),timeOffset:Jt.number(),notification:o});Jt.object({sessionId:Jt.string().uuid(),timeOffset:Jt.number().optional().default(0),ttlSeconds:Jt.number().optional(),payload:Jt.unknown()});var l=Jt.object({notificationId:Jt.string().uuid(),category:Jt.string(),type:Jt.string(),sourceId:Jt.string(),platformId:Jt.string(),userId:Jt.string().uuid(),userName:Jt.string().optional(),payload:Jt.unknown().optional(),correlationId:Jt.string().optional()}),f=Jt.object({action:e,notificationId:Jt.string().uuid(),originatingSessionId:Jt.string().uuid(),correlationId:Jt.string().optional(),target:Jt.string(),targetType:Jt.enum(["user","group"]),payload:Jt.unknown(),txInstanceId:Jt.string().uuid()}),n=Jt.object({category:Jt.string(),type:Jt.string(),payload:Jt.unknown().optional()});Jt.object({sessionId:Jt.string().uuid(),timeOffset:Jt.number().optional().default(0),event:n,targets:Jt.object({groups:Jt.array(Jt.string()).default([]),users:Jt.array(Jt.string()).default([])}).optional()});Jt.object({userId:Jt.string().uuid(),platformId:Jt.string(),sourceId:Jt.string(),notificationId:Jt.string().uuid(),category:Jt.string(),type:Jt.string(),sessionId:Jt.string().uuid(),payload:Jt.unknown().optional(),timestamp:Jt.date(),cursor:Jt.string().base64(),correlationId:Jt.string().nullish()});
9
+
7
10
  class CloudNotificationAPIError extends Error {
8
11
  code;
9
12
  constructor(message = 'An unexpected error has occurred', code = 'UNEXPECTED_ERROR', cause) {
@@ -23,7 +26,12 @@ class SessionNotConnectedError extends CloudNotificationAPIError {
23
26
  }
24
27
  }
25
28
  class PublishError extends CloudNotificationAPIError {
26
- constructor(message = 'Publish error', code = 'ERR_PUBLISH_ERROR', cause) {
29
+ constructor(message = 'Error publishing notification', code = 'ERR_PUBLISH_ERROR', cause) {
30
+ super(message, code, cause);
31
+ }
32
+ }
33
+ class EventPublishError extends CloudNotificationAPIError {
34
+ constructor(message = 'Error posting notification event', code = 'ERR_EVENT_PUBLISH_ERROR', cause) {
27
35
  super(message, code, cause);
28
36
  }
29
37
  }
@@ -32,12 +40,20 @@ class EventRetrievalError extends CloudNotificationAPIError {
32
40
  super(message, code, cause);
33
41
  }
34
42
  }
43
+ class NotificationRetrievalError extends CloudNotificationAPIError {
44
+ constructor(message = 'Notification Retrieval error', code = 'ERR_NOTIFICATION_RETRIEVAL_ERROR', cause) {
45
+ super(message, code, cause);
46
+ }
47
+ }
35
48
  class InvalidMessageFormatError extends CloudNotificationAPIError {
36
49
  constructor(zodParseResult) {
37
50
  super(`Message Format Error: ${zodParseResult.error?.toString()}`, 'ERR_MESSAGE_FORMAT_ERROR', undefined);
38
51
  }
39
52
  }
40
53
 
54
+ // Error codes as defined in https://docs.emqx.com/en/cloud/latest/connect_to_deployments/mqtt_client_error_codes.html
55
+ const BadUserNamePasswordError = 134;
56
+
41
57
  class EventController {
42
58
  #eventListeners = new Map();
43
59
  addEventListener(type, callback) {
@@ -67,6 +83,41 @@ class EventController {
67
83
  }
68
84
  }
69
85
 
86
+ function validateConnectParameters(parameters) {
87
+ if (!parameters) {
88
+ throw new Error('Connect parameters must be provided');
89
+ }
90
+ if (!parameters.platformId) {
91
+ throw new Error('platformId must be provided');
92
+ }
93
+ if (parameters.authenticationType === 'jwt' &&
94
+ (!parameters.jwtAuthenticationParameters?.jwtRequestCallback || !parameters.jwtAuthenticationParameters?.authenticationId)) {
95
+ throw new Error('jwtAuthenticationParameters must be provided when using jwt authentication');
96
+ }
97
+ if (parameters.authenticationType === 'basic' &&
98
+ (!parameters.basicAuthenticationParameters?.username || !parameters.basicAuthenticationParameters?.password)) {
99
+ throw new Error('basicAuthenticationParameters must be provided when using basic authentication');
100
+ }
101
+ }
102
+ function handleAPIException(logger, error, message, exceptionConstructor) {
103
+ if (error instanceof Error) {
104
+ logger('error', `${message} - ${error.message}`);
105
+ }
106
+ else {
107
+ logger('error', `${message} - ${error}`);
108
+ }
109
+ throw new exceptionConstructor(undefined, undefined, error);
110
+ }
111
+ async function checkResponse(logger, response, failMessage, failCode) {
112
+ if (!response.ok) {
113
+ if (response.status === 401 || response.status === 403) {
114
+ throw new AuthorizationError();
115
+ }
116
+ const responseBody = await response.text();
117
+ logger('error', `Response check failure ${failMessage} - ${response.status}: ${response.statusText} : ${responseBody}`);
118
+ throw new CloudNotificationAPIError(`${failMessage} (HTTP ${response.status}: ${response.statusText})`, failCode, responseBody);
119
+ }
120
+ }
70
121
  function getRequestHeaders(connectionParameters) {
71
122
  const headers = {};
72
123
  headers['Content-Type'] = 'application/json';
@@ -146,7 +197,7 @@ class TimeDifferenceTracker {
146
197
  #intervalMs;
147
198
  #samples;
148
199
  #connectionParams;
149
- #currentOffset;
200
+ #currentOffset = 0;
150
201
  #timerId;
151
202
  #logger;
152
203
  constructor(timeServerUrl, connectionParameters, logger, intervalMs = 60 * 60 * 1000, samples = 10) {
@@ -222,41 +273,9 @@ class TimeDifferenceTracker {
222
273
  }
223
274
  }
224
275
 
225
- // Error codes as defined in https://docs.emqx.com/en/cloud/latest/connect_to_deployments/mqtt_client_error_codes.html
226
- const BadUserNamePasswordError = 134;
227
- const forwardedNotificationEventSchema = z.object({
228
- notificationId: z.string().uuid(),
229
- category: z.string(),
230
- type: z.string(),
231
- payload: z.unknown().optional(),
232
- correlationId: z.string().optional(),
233
- });
234
- const forwardedMessageSchema = z.object({
235
- action: z.enum(['new', 'update']),
236
- notificationId: z.string().uuid(),
237
- originatingSessionId: z.string().uuid(),
238
- correlationId: z.string().optional(),
239
- target: z.string(),
240
- targetType: z.enum(['user', 'group']),
241
- payload: z.unknown(),
242
- });
243
- const notificationEventDetailSchema = z.object({
244
- userId: z.string().uuid(),
245
- platformId: z.string(),
246
- sourceId: z.string(),
247
- notificationId: z.string().uuid(),
248
- category: z.string(),
249
- type: z.string(),
250
- sessionId: z.string().uuid(),
251
- payload: z.unknown().optional(),
252
- correlationId: z.string().optional(),
253
- timestamp: z.string().datetime(),
254
- });
255
276
  /**
256
- * Represents a single connection to a Cloud Notification service
277
+ * Represents a single connection to the Cloud Notification service
257
278
  *
258
- * @public
259
- * @class
260
279
  */
261
280
  class CloudNotificationAPI {
262
281
  #cloudNotificationSettings;
@@ -264,55 +283,75 @@ class CloudNotificationAPI {
264
283
  #mqttClient;
265
284
  #reconnectRetryLimit = 30;
266
285
  #keepAliveIntervalSeconds = 30;
286
+ #syncTime = true;
267
287
  #timeDifferenceTracker;
268
- #newNotificationsDeDuplicator = new SetWithTTL(10_000);
269
- #logger = (level, message) => {
270
- console[level](message);
271
- };
288
+ #deDuplicator;
272
289
  #reconnectRetries = 0;
273
290
  #connectionParams;
274
291
  #attemptingToReconnect = false;
275
292
  #events = new EventController();
276
293
  #defaultSubscriptionOptions = { qos: 2, nl: true };
294
+ #logger = (level, message) => console[level](message);
295
+ #getCurrentTimeOffset = () => this.#timeDifferenceTracker?.currentOffset || 0;
296
+ /**
297
+ * Constructs a new instance of the CloudNotificationAPI
298
+ *
299
+ * @param cloudNotificationSettings - The settings for the Cloud Notification API.
300
+ */
277
301
  constructor(cloudNotificationSettings) {
278
302
  this.#cloudNotificationSettings = cloudNotificationSettings;
303
+ this.#deDuplicator = new SetWithTTL(cloudNotificationSettings?.deduplicationTTLms || 10_000);
304
+ this.#reconnectRetryLimit = cloudNotificationSettings.reconnectRetryLimit || this.#reconnectRetryLimit;
305
+ this.#keepAliveIntervalSeconds = cloudNotificationSettings.keepAliveIntervalSeconds || this.#keepAliveIntervalSeconds;
306
+ this.#logger = cloudNotificationSettings.logger || this.#logger;
307
+ this.#syncTime = cloudNotificationSettings.syncTime ?? true;
279
308
  }
280
309
  /**
281
- * Connects and creates a session on the Cloud Notifications service
310
+ * Connects and creates a session on the Cloud Notifications service.
282
311
  *
283
- * @param {ConnectParameters} parameters - The parameters to use to connect
284
- * @returns {*} {Promise<void>}
285
- * @memberof CloudNotificationAPI
286
- * @throws {CloudNotificationAPIError} - If an error occurs during connection
287
- * @throws {AuthorizationError} - If the connection is unauthorized
312
+ * @example
313
+ * ```typescript
314
+ * const notificationApi = new CloudNotificationAPI({
315
+ * url: process.env.NOTIFICATION_SERVER_HOST
316
+ * });
317
+ *
318
+ * let connectionResult: ConnectionResult;
319
+ * try {
320
+ * connectionResult = await notificationApi.connect(connectSettings);
321
+ * } catch (errorConnect) {
322
+ * terminal.write(chalk.red(`\nError connecting to notification server: ${errorConnect}\n`));
323
+ * process.exit(1);
324
+ * }
325
+ * ```
326
+ *
327
+ * @param parameters - The parameters to use to connect.
328
+ * @returns A promise that resolves when the connection is established.
329
+ * @throws {@link CloudNotificationAPIError} If an error occurs during connection.
330
+ * @throws {@link AuthorizationError} If the connection is unauthorized.
288
331
  */
289
332
  async connect(parameters) {
290
- this.#validateConnectParams(parameters);
333
+ validateConnectParameters(parameters);
291
334
  this.#connectionParams = parameters;
292
- this.#reconnectRetryLimit = parameters.reconnectRetryLimit || this.#reconnectRetryLimit;
293
- this.#keepAliveIntervalSeconds = parameters.keepAliveIntervalSeconds || this.#keepAliveIntervalSeconds;
294
- this.#logger = parameters.logger || this.#logger;
295
335
  if (this.#timeDifferenceTracker) {
296
336
  this.#timeDifferenceTracker.stop();
297
337
  this.#timeDifferenceTracker = undefined;
298
338
  }
299
339
  this.#timeDifferenceTracker = new TimeDifferenceTracker(this.#cloudNotificationSettings.url, parameters, this.#logger);
300
- if (parameters.syncTime !== false) {
340
+ if (this.#syncTime !== false) {
301
341
  await this.#timeDifferenceTracker.start();
302
342
  }
303
343
  const { platformId, sourceId } = this.#connectionParams;
304
- const timeOffset = Number.isFinite(this.#timeDifferenceTracker?.currentOffset) ? this.#timeDifferenceTracker.currentOffset : 0;
305
344
  const createSessionResponse = await fetch(`${this.#cloudNotificationSettings.url}/api/sessions`, {
306
345
  method: 'POST',
307
346
  headers: getRequestHeaders(this.#connectionParams),
308
347
  body: JSON.stringify({
309
348
  platformId,
310
349
  sourceId,
311
- timeOffset,
350
+ timeOffset: this.#getCurrentTimeOffset(),
312
351
  isFullApi: true,
313
352
  }),
314
353
  });
315
- this.#validateResponse(createSessionResponse);
354
+ await checkResponse(this.#logger, createSessionResponse, 'Error creating session', 'ERR_CREATE_SESSION');
316
355
  if (createSessionResponse.status !== 201) {
317
356
  throw new CloudNotificationAPIError(`Failed to connect to the Cloud Notification service: ${this.#cloudNotificationSettings.url}`, 'ERR_CONNECT', new Error(createSessionResponse.statusText));
318
357
  }
@@ -323,115 +362,229 @@ class CloudNotificationAPI {
323
362
  return { sessionId: this.#sessionDetails.sessionId, platformId, sourceId, userId: this.#sessionDetails.userId, groups: this.#sessionDetails.groups };
324
363
  }
325
364
  /**
326
- * Disconnects from the Cloud Notification service
365
+ * Disconnects from the Cloud Notification service.
327
366
  *
328
- * @returns {*} {Promise<void>}
329
- * @memberof CloudNotificationAPI
330
- * @throws {CloudNotificationAPIError} - If an error occurs during disconnection
367
+ * @returns A promise that resolves when disconnected.
368
+ * @throws {@link CloudNotificationAPIError} If an error occurs during disconnection.
331
369
  */
332
370
  async disconnect() {
333
371
  await this.#disconnect(true);
334
372
  }
335
- async postNotificationEvent(event) {
373
+ /**
374
+ * Posts a notification event to the Cloud Notification service.
375
+ *
376
+ * @param notificationId - The ID of the notification.
377
+ * @param event - The event details, including category, type, and optional payload.
378
+ * @returns A promise that resolves when the event is posted.
379
+ * @throws {@link SessionNotConnectedError} If the session is not connected.
380
+ * @throws {@link PublishError} If an error occurs during publishing.
381
+ */
382
+ async postNotificationEvent(notificationId, event, options) {
336
383
  if (!this.#sessionDetails || !this.#connectionParams) {
337
384
  this.#logger('error', 'Invalid Session');
338
385
  throw new SessionNotConnectedError();
339
386
  }
340
387
  try {
341
- const timeOffset = Number.isFinite(this.#timeDifferenceTracker?.currentOffset) ? this.#timeDifferenceTracker?.currentOffset : 0;
342
388
  const publishPayload = {
343
389
  sessionId: this.#sessionDetails.sessionId,
344
- timeOffset,
390
+ timeOffset: this.#getCurrentTimeOffset(),
345
391
  event,
392
+ targets: options?.targets,
346
393
  };
347
- const publishResponse = await fetch(`${this.#cloudNotificationSettings.url}/api/publish/events`, {
394
+ const publishResponse = await fetch(`${this.#cloudNotificationSettings.url}/api/publications/${notificationId}/events`, {
348
395
  method: 'POST',
349
396
  headers: getRequestHeaders(this.#connectionParams),
350
397
  body: JSON.stringify(publishPayload),
351
398
  });
352
- this.#validateResponse(publishResponse);
399
+ await checkResponse(this.#logger, publishResponse, 'Error posting notification event', 'ERR_POST_NOTIFICATION_EVENT');
353
400
  }
354
401
  catch (error) {
355
- this.#handleAPIException(error, 'Error posting notification event', PublishError);
402
+ handleAPIException(this.#logger, error, 'Error posting notification event', PublishError);
356
403
  }
357
404
  }
358
- async getNotificationEvents(notificationIds) {
359
- if (!this.#sessionDetails || !this.#connectionParams) {
360
- this.#logger('error', 'Invalid Session');
361
- throw new SessionNotConnectedError();
362
- }
363
- if (!Array.isArray(notificationIds) || notificationIds.length === 0) {
364
- this.#logger('error', 'No notification IDs provided');
365
- throw new EventRetrievalError('No notification IDs provided');
366
- }
367
- try {
368
- const url = new URL(`${this.#cloudNotificationSettings.url}/api/publish/events`);
369
- url.searchParams.append('sessionId', this.#sessionDetails.sessionId);
370
- for (const notificationId of notificationIds) {
371
- url.searchParams.append('id', notificationId);
372
- }
373
- const getResponse = await fetch(url, {
374
- method: 'GET',
375
- headers: getRequestHeaders(this.#connectionParams),
376
- });
377
- this.#validateResponse(getResponse);
378
- const events = (await getResponse.json());
379
- return events;
380
- }
381
- catch (error) {
382
- this.#handleAPIException(error, 'Error retrieving notification events', EventRetrievalError);
383
- }
405
+ /**
406
+ * Removes a notification from the notification center for a given set of users or user groups.
407
+ *
408
+ * @param notificationId - The ID of the notification to remove.
409
+ * @param targets - The targets to remove the notification from.
410
+ * @returns A promise that resolves when the notification is removed.
411
+ */
412
+ async removeFromNotificationCenter(notificationId, targets) {
413
+ return this.postNotificationEvent(notificationId, {
414
+ category: 'notification-center-event',
415
+ type: 'notification-closed',
416
+ payload: {},
417
+ }, {
418
+ targets,
419
+ });
384
420
  }
385
- // NOTE: will see if we can strongly type the payload in a future PR OR it will be layered above this core api
421
+ /**
422
+ * Raises a notification to the Cloud Notification service.
423
+ *
424
+ * @param options - The options for the notification.
425
+ * @param payload - The payload of the notification which should generally conform to the notification center schema
426
+ * @returns A promise that resolves with the notification raise result.
427
+ * @throws {@link SessionNotConnectedError} If the session is not connected.
428
+ * @throws {@link PublishError} If an error occurs during publishing.
429
+ */
386
430
  async raiseNotification(options, payload) {
387
431
  if (!this.#sessionDetails || !this.#connectionParams) {
388
432
  this.#logger('error', 'Invalid Session');
389
433
  throw new SessionNotConnectedError();
390
434
  }
391
435
  try {
392
- const timeOffset = Number.isFinite(this.#timeDifferenceTracker?.currentOffset) ? this.#timeDifferenceTracker?.currentOffset : 0;
393
- // NOTE: Will be strongly typed and moved to shared in a future PR
394
436
  const publishPayload = {
395
437
  sessionId: this.#sessionDetails.sessionId,
396
- timeOffset,
438
+ timeOffset: this.#getCurrentTimeOffset(),
397
439
  notification: {
440
+ ttlSeconds: options.ttlSeconds,
398
441
  correlationId: options.correlationId,
399
- ttl: options.ttl,
400
442
  targets: options.targets,
401
- class: 'interactive',
402
443
  payload,
403
444
  },
404
445
  };
405
- const publishResponse = await fetch(`${this.#cloudNotificationSettings.url}/api/publish`, {
446
+ const publishResponse = await fetch(`${this.#cloudNotificationSettings.url}/api/publications`, {
406
447
  method: 'POST',
407
448
  headers: getRequestHeaders(this.#connectionParams),
408
449
  body: JSON.stringify(publishPayload),
409
450
  });
410
- this.#validateResponse(publishResponse);
451
+ await checkResponse(this.#logger, publishResponse, 'Error publishing notification', 'ERR_PUBLISH_NOTIFICATION');
411
452
  const publishResponseBody = (await publishResponse.json());
412
453
  return publishResponseBody;
413
454
  }
414
455
  catch (error) {
415
- this.#handleAPIException(error, 'Error publishing notification', PublishError);
456
+ handleAPIException(this.#logger, error, 'Error publishing notification', PublishError);
416
457
  }
417
458
  }
418
- async updateNotification() {
419
- // TODO: SAAS-2559
459
+ /**
460
+ * Raises a notification update to the Cloud Notification service.
461
+ *
462
+ * @param notificationId - The ID of the notification to update.
463
+ * @param options - The options for the notification update.
464
+ * @param payload - The new payload of the notification which should generally conform to the notification center update schema
465
+ * @throws {@link SessionNotConnectedError} If the session is not connected.
466
+ * @throws {@link PublishError} If an error occurs during publishing of the update.
467
+ */
468
+ async updateNotification(notificationId, options, payload) {
469
+ if (!this.#sessionDetails || !this.#connectionParams) {
470
+ this.#logger('error', 'Invalid Session');
471
+ throw new SessionNotConnectedError();
472
+ }
473
+ try {
474
+ const updatePayload = {
475
+ sessionId: this.#sessionDetails.sessionId,
476
+ timeOffset: this.#getCurrentTimeOffset(),
477
+ ttlSeconds: options.ttlSeconds,
478
+ payload,
479
+ };
480
+ const updateResponse = await fetch(`${this.#cloudNotificationSettings.url}/api/publications/${notificationId}`, {
481
+ method: 'PATCH',
482
+ headers: getRequestHeaders(this.#connectionParams),
483
+ body: JSON.stringify(updatePayload),
484
+ });
485
+ await checkResponse(this.#logger, updateResponse, 'Error updating notification', 'ERR_UPDATING_NOTIFICATION');
486
+ }
487
+ catch (error) {
488
+ handleAPIException(this.#logger, error, 'Error updating notification', PublishError);
489
+ }
420
490
  }
421
- async deleteNotification() {
422
- // TODO: SAAS-2551
491
+ /**
492
+ * Marks a notification as deleted in the Cloud Notification service.
493
+ *
494
+ * This in turn causes notification events to be raised for the notification
495
+ *
496
+ * @param notificationId - The ID of the notification to delete.
497
+ * @returns A promise that resolves when the notification is deleted.
498
+ * @throws {@link SessionNotConnectedError} If the session is not connected.
499
+ */
500
+ async deleteNotification(notificationId) {
501
+ if (!this.#sessionDetails || !this.#connectionParams) {
502
+ this.#logger('error', 'Invalid Session');
503
+ throw new SessionNotConnectedError();
504
+ }
505
+ try {
506
+ const deleteResponse = await fetch(`${this.#cloudNotificationSettings.url}/api/publications/${notificationId}?sessionId=${this.#sessionDetails.sessionId}`, {
507
+ method: 'DELETE',
508
+ headers: getRequestHeaders(this.#connectionParams),
509
+ });
510
+ await checkResponse(this.#logger, deleteResponse, 'Error deleting notification', 'ERR_DELETE_NOTIFICATION');
511
+ }
512
+ catch (error) {
513
+ handleAPIException(this.#logger, error, 'Error deleting notification', PublishError);
514
+ }
423
515
  }
516
+ /**
517
+ * Replays notifications from the Cloud Notification service.
518
+ *
519
+ * This is called at platform startup to populate the notification center with notifications that were missed since the last time the platform was started.
520
+ *
521
+ * @param pageItemLimit - The maximum number of items per page.
522
+ * @param pageStartCursor - The cursor to start the page from. This is retrieved from the pageInfo property.
523
+ * @returns A promise that resolves with the notifications replay details.
524
+ * @throws {@link SessionNotConnectedError} If the session is not connected.
525
+ * @throws {@link NotificationRetrievalError} If an error occurs during retrieval.
526
+ */
527
+ async replayNotifications(pageItemLimit, pageStartCursor) {
528
+ if (!this.#sessionDetails || !this.#connectionParams) {
529
+ this.#logger('error', 'Invalid Session');
530
+ throw new SessionNotConnectedError();
531
+ }
532
+ try {
533
+ let replayUrl = `${this.#cloudNotificationSettings.url}/api/publications/replay`;
534
+ const parameters = new URLSearchParams();
535
+ if (pageItemLimit) {
536
+ parameters.set('pageItemLimit', pageItemLimit.toString());
537
+ }
538
+ if (pageStartCursor) {
539
+ parameters.set('pageStart', pageStartCursor);
540
+ }
541
+ if ([...parameters].length > 0) {
542
+ replayUrl += `?${parameters.toString()}`;
543
+ }
544
+ const replayResponse = await fetch(replayUrl, {
545
+ method: 'POST',
546
+ headers: getRequestHeaders(this.#connectionParams),
547
+ body: JSON.stringify({
548
+ sessionId: this.#sessionDetails.sessionId,
549
+ }),
550
+ });
551
+ await checkResponse(this.#logger, replayResponse, 'Error replaying notifications', 'ERR_REPLAY_NOTIFICATIONS');
552
+ const body = (await replayResponse.json());
553
+ return body;
554
+ }
555
+ catch (error) {
556
+ handleAPIException(this.#logger, error, 'Error replaying notifications', NotificationRetrievalError);
557
+ }
558
+ }
559
+ /**
560
+ * Adds an event listener for a specific event type.
561
+ *
562
+ * @param type - The event type.
563
+ * @param callback - The callback function to invoke when the event occurs.
564
+ */
424
565
  addEventListener(type, callback) {
425
566
  this.#events.addEventListener(type, callback);
426
567
  }
568
+ /**
569
+ * Removes an event listener for a specific event type.
570
+ *
571
+ * @param type - The event type.
572
+ * @param callback - The callback function to remove.
573
+ */
427
574
  removeEventListener(type, callback) {
428
575
  this.#events.removeEventListener(type, callback);
429
576
  }
577
+ /**
578
+ * Adds a one-time event listener for a specific event type.
579
+ *
580
+ * @param type - The event type.
581
+ * @param callback - The callback function to invoke once when the event occurs.
582
+ */
430
583
  once(type, callback) {
431
584
  this.#events.once(type, callback);
432
585
  }
433
586
  async #connectToMQTT() {
434
- if (!this.#sessionDetails) {
587
+ if (!this.#sessionDetails || !this.#sessionDetails.mqtt) {
435
588
  this.#logger('error', 'Invalid Session');
436
589
  throw new SessionNotConnectedError();
437
590
  }
@@ -442,14 +595,14 @@ class CloudNotificationAPI {
442
595
  protocolVersion: 5,
443
596
  // The "will" message will automatically be published on an unexpected disconnection allowing the server to know that this client is no longer connected and to clean up its session
444
597
  will: {
445
- topic: this.#sessionDetails.lastWillTopic,
598
+ topic: this.#sessionDetails.mqtt.lastWillTopic,
446
599
  payload: buffer.Buffer.from(JSON.stringify(this.#sessionDetails)),
447
600
  qos: 2,
448
601
  retain: false,
449
602
  },
450
- username: this.#sessionDetails.token,
603
+ username: this.#sessionDetails.mqtt.token,
451
604
  };
452
- this.#mqttClient = await mqtt.connectAsync(this.#sessionDetails.url, clientOptions);
605
+ this.#mqttClient = await mqtt.connectAsync(this.#sessionDetails.mqtt.url, clientOptions);
453
606
  this.#logger('debug', `Cloud Notifications successfully connected to notification backbone`);
454
607
  this.#mqttClient.on('error', async (error) => this.#mqttErrorHandler(error));
455
608
  this.#mqttClient.on('reconnect', () => this.#mqttReconnectionHandler());
@@ -457,11 +610,10 @@ class CloudNotificationAPI {
457
610
  this.#mqttClient.on('connect', () => this.#mqttConnectionHandler());
458
611
  this.#mqttClient.on('message', (topic, message) => this.#mqttMessageHandler(topic, message));
459
612
  // Subscribe any session specific topics
460
- this.#mqttClient.subscribe(`${this.#sessionDetails.sessionRootTopic}/#`);
613
+ this.#mqttClient.subscribe(`${this.#sessionDetails.mqtt.sessionRootTopic}/#`);
461
614
  // Subscribe to the user notification delivery topics for groups and users
462
615
  await this.#subscribeToNotificationTopics();
463
616
  }
464
- // async #connect(parameters: ConnectParameters): Promise<ConnectionResult> {}
465
617
  async #mqttConnectionHandler() {
466
618
  this.#logger('debug', `Cloud Notifications successfully reconnected after ${this.#reconnectRetries} attempts`);
467
619
  this.#reconnectRetries = 0;
@@ -492,7 +644,7 @@ class CloudNotificationAPI {
492
644
  this.#logger('debug', `Session expired`);
493
645
  this.#events.emitEvent('session-expired');
494
646
  // TODO: Request new JWT if using JWT authentication
495
- await this.#refreshSession();
647
+ await this.#extendSession();
496
648
  this.#logger('debug', `Session extended`);
497
649
  this.#events.emitEvent('session-extended');
498
650
  return;
@@ -516,33 +668,45 @@ class CloudNotificationAPI {
516
668
  }
517
669
  }
518
670
  async #sendNotificationDeliveredStatus(notificationId) {
519
- return this.postNotificationEvent({ notificationId, category: 'delivery', type: 'ack' });
671
+ return this.postNotificationEvent(notificationId, { category: 'delivery', type: 'ack' });
520
672
  }
521
673
  async #subscribeToNotificationTopics() {
522
- if (!this.#sessionDetails) {
674
+ if (!this.#sessionDetails || !this.#sessionDetails.mqtt) {
523
675
  this.#logger('error', 'Invalid Session');
524
676
  throw new SessionNotConnectedError();
525
677
  }
526
- // Group target notifications
678
+ // Group targeted notifications
527
679
  const subscribePromises = this.#sessionDetails.groups.map((group) => {
528
- if (group.topic) {
529
- return this.#mqttClient?.subscribeAsync(group.topic, this.#defaultSubscriptionOptions);
680
+ if (group.notificationTopic) {
681
+ return this.#mqttClient?.subscribeAsync(group.notificationTopic, this.#defaultSubscriptionOptions);
530
682
  }
531
683
  else {
532
- this.#logger('warn', `Group ${group.uuid} does not have a topic to subscribe to`);
684
+ this.#logger('warn', `Group ${group.uuid} does not have a notification topic to subscribe to`);
533
685
  return Promise.resolve();
534
686
  }
535
687
  });
536
688
  subscribePromises.push(
689
+ // Group targeted events
690
+ ...this.#sessionDetails.groups.map((group) => {
691
+ if (group.eventTopic) {
692
+ return this.#mqttClient?.subscribeAsync(group.eventTopic, this.#defaultSubscriptionOptions);
693
+ }
694
+ else {
695
+ this.#logger('warn', `Group ${group.uuid} does not have an event topic to subscribe to`);
696
+ return Promise.resolve();
697
+ }
698
+ }),
537
699
  // Notification directly to the user
538
- this.#mqttClient?.subscribeAsync(this.#sessionDetails.userNotificationTopic, this.#defaultSubscriptionOptions),
700
+ this.#mqttClient?.subscribeAsync(this.#sessionDetails.mqtt.userNotificationTopic, this.#defaultSubscriptionOptions),
539
701
  // The users notifications status updates
540
- this.#mqttClient?.subscribeAsync(this.#sessionDetails.userNotificationEventsTopic, this.#defaultSubscriptionOptions),
541
- // All notification events for the user
542
- this.#mqttClient?.subscribeAsync(this.#sessionDetails.allNotificationEventsTopic, this.#defaultSubscriptionOptions));
702
+ this.#mqttClient?.subscribeAsync(this.#sessionDetails.mqtt.userNotificationEventsTopic, this.#defaultSubscriptionOptions));
703
+ // Global notification events
704
+ if (this.#sessionDetails.mqtt.allNotificationEventsTopic) {
705
+ subscribePromises.push(this.#mqttClient?.subscribeAsync(this.#sessionDetails.mqtt.allNotificationEventsTopic, this.#defaultSubscriptionOptions));
706
+ }
543
707
  await Promise.all(subscribePromises);
544
708
  }
545
- async #refreshSession() {
709
+ async #extendSession() {
546
710
  if (!this.#sessionDetails) {
547
711
  return;
548
712
  }
@@ -586,16 +750,21 @@ class CloudNotificationAPI {
586
750
  method: 'DELETE',
587
751
  headers: getRequestHeaders(this.#connectionParams),
588
752
  });
589
- if (disconnectResponse.status !== 200) {
590
- throw new CloudNotificationAPIError('Error during session tear down - unexpected status', 'ERR_DISCONNECT', new Error(disconnectResponse.statusText));
753
+ if (disconnectResponse.status !== 204) {
754
+ throw new CloudNotificationAPIError(`Error during session tear down - unexpected status ${disconnectResponse.status}`, 'ERR_DISCONNECT', new Error(disconnectResponse.statusText));
591
755
  }
592
756
  }
593
757
  catch (error) {
594
758
  throw new CloudNotificationAPIError('Error during disconnection', 'ERR_DISCONNECT', error);
595
759
  }
596
760
  finally {
597
- this.#mqttClient?.removeAllListeners();
598
- await this.#mqttClient?.endAsync(true);
761
+ try {
762
+ this.#mqttClient?.removeAllListeners();
763
+ await this.#mqttClient?.endAsync(true);
764
+ }
765
+ catch (cleanupError) {
766
+ this.#logger('warn', `Error during MQTT client cleanup - ${cleanupError instanceof Error ? cleanupError.message : cleanupError}`);
767
+ }
599
768
  this.#sessionDetails = undefined;
600
769
  this.#mqttClient = undefined;
601
770
  this.#reconnectRetries = 0;
@@ -606,19 +775,20 @@ class CloudNotificationAPI {
606
775
  }
607
776
  }
608
777
  #handleMessage(topic, message, sessionDetails) {
609
- if (message.length === 0 || !sessionDetails) {
778
+ if (message.length === 0 || !sessionDetails || !sessionDetails.mqtt) {
610
779
  // Ignore clean up messages
611
780
  return;
612
781
  }
613
782
  try {
614
783
  const messagePayload = JSON.parse(message.toString());
615
- if (topic.startsWith(sessionDetails.channelsRootTopic)) {
784
+ if (topic.startsWith(sessionDetails.mqtt.notificationsRootTopic)) {
616
785
  this.#handleNotificationMessage(messagePayload);
786
+ // The following line allows for both group and user targeted events as well as event for self published notifications. The payload is the same for both scenarios.
617
787
  }
618
- else if (topic === sessionDetails.userNotificationEventsTopic) {
788
+ else if (topic === sessionDetails.mqtt.userNotificationEventsTopic || topic.startsWith(sessionDetails.mqtt.eventsRootTopic)) {
619
789
  this.#handleUserNotificationEventMessage(messagePayload);
620
790
  }
621
- else if (topic === sessionDetails.allNotificationEventsTopic) {
791
+ else if (topic === sessionDetails.mqtt.allNotificationEventsTopic) {
622
792
  this.#handleAllNotificationEventMessage(messagePayload);
623
793
  }
624
794
  else {
@@ -632,37 +802,44 @@ class CloudNotificationAPI {
632
802
  }
633
803
  }
634
804
  #handleNotificationMessage(messagePayload) {
635
- const parseResult = forwardedMessageSchema.safeParse(messagePayload);
805
+ const parseResult = f.safeParse(messagePayload);
636
806
  if (!parseResult.success) {
637
807
  this.#logger('warn', `Received invalid notification message payload format ${parseResult.error?.toString()}`);
638
808
  throw new InvalidMessageFormatError(parseResult);
639
809
  }
640
- const { action, notificationId, originatingSessionId, correlationId, target, targetType, payload } = parseResult.data;
810
+ const { action, notificationId, originatingSessionId, correlationId, target, targetType, payload, txInstanceId } = parseResult.data;
641
811
  // Ignore if its one we sent ourselves
642
812
  if (originatingSessionId === this.#sessionDetails?.sessionId) {
643
813
  return;
644
814
  }
645
- // Ignore if this a multi-receive of a new notification across multiple groups
646
- if (action === 'new') {
647
- if (this.#newNotificationsDeDuplicator.has(notificationId)) {
648
- return;
649
- }
650
- this.#newNotificationsDeDuplicator.add(notificationId);
815
+ // We might have received this update from a different group or user topic so de-dupe
816
+ if (this.#deDuplicator.has(txInstanceId)) {
817
+ return;
651
818
  }
819
+ this.#deDuplicator.add(txInstanceId);
652
820
  this.#sendNotificationDeliveredStatus(notificationId);
653
821
  let targetName = target;
654
822
  if (targetType === 'group') {
655
823
  targetName = this.#lookupGroupNameByUuid(target);
656
824
  }
657
- if (action === 'new') {
658
- this.#events.emitEvent('new-notification', { action, notificationId, correlationId, target, targetName, targetType, payload });
659
- }
660
- else if (action === 'update') {
661
- this.#events.emitEvent('update-notification', { action, notificationId, correlationId, target, targetName, targetType, payload });
825
+ switch (action) {
826
+ case 'new': {
827
+ this.#events.emitEvent('new-notification', { action: 'new', notificationId, correlationId, target, targetName, targetType, payload });
828
+ break;
829
+ }
830
+ case 'update': {
831
+ this.#events.emitEvent('update-notification', { action: 'update', notificationId, correlationId, target, targetName, targetType, payload });
832
+ break;
833
+ }
834
+ case 'delete': {
835
+ this.#events.emitEvent('delete-notification', { action: 'delete', notificationId, correlationId, target, targetName, targetType, payload });
836
+ break;
837
+ }
838
+ // No default - Schema validation will prevent this
662
839
  }
663
840
  }
664
841
  #handleUserNotificationEventMessage(messagePayload) {
665
- const parseResult = forwardedNotificationEventSchema.safeParse(messagePayload);
842
+ const parseResult = l.safeParse(messagePayload);
666
843
  if (!parseResult.success) {
667
844
  this.#logger('warn', `Received invalid notification event message payload format ${parseResult.error?.toString()}`);
668
845
  throw new InvalidMessageFormatError(parseResult);
@@ -670,45 +847,12 @@ class CloudNotificationAPI {
670
847
  this.#events.emitEvent('notification-event', parseResult.data);
671
848
  }
672
849
  #handleAllNotificationEventMessage(messagePayload) {
673
- const parseResult = forwardedNotificationEventSchema.safeParse(messagePayload);
850
+ const parseResult = l.safeParse(messagePayload);
674
851
  if (!parseResult.success) {
675
852
  this.#logger('warn', `Received invalid notification event message payload format ${parseResult.error?.toString()}`);
676
853
  throw new InvalidMessageFormatError(parseResult);
677
854
  }
678
- this.#events.emitEvent('notification-event-all', parseResult.data);
679
- }
680
- #validateConnectParams = (parameters) => {
681
- if (!parameters) {
682
- throw new Error('Connect parameters must be provided');
683
- }
684
- if (!parameters.platformId) {
685
- throw new Error('platformId must be provided');
686
- }
687
- if (parameters.authenticationType === 'jwt' &&
688
- (!parameters.jwtAuthenticationParameters?.jwtRequestCallback || !parameters.jwtAuthenticationParameters?.authenticationId)) {
689
- throw new Error('jwtAuthenticationParameters must be provided when using jwt authentication');
690
- }
691
- if (parameters.authenticationType === 'basic' &&
692
- (!parameters.basicAuthenticationParameters?.username || !parameters.basicAuthenticationParameters?.password)) {
693
- throw new Error('basicAuthenticationParameters must be provided when using basic authentication');
694
- }
695
- };
696
- #handleAPIException(error, message, exceptionConstructor) {
697
- if (error instanceof Error) {
698
- this.#logger('error', `${message} - ${error.message}`);
699
- }
700
- else {
701
- this.#logger('error', `${message} - ${error}`);
702
- }
703
- throw new exceptionConstructor(undefined, undefined, error);
704
- }
705
- #validateResponse(response) {
706
- if (!response.ok) {
707
- if (response.status === 401 || response.status === 403) {
708
- throw new AuthorizationError();
709
- }
710
- throw new CloudNotificationAPIError();
711
- }
855
+ this.#events.emitEvent('global-notification-event', parseResult.data);
712
856
  }
713
857
  #lookupGroupNameByUuid(uuid) {
714
858
  if (!this.#sessionDetails) {
@@ -721,8 +865,9 @@ class CloudNotificationAPI {
721
865
  exports.AuthorizationError = AuthorizationError;
722
866
  exports.CloudNotificationAPI = CloudNotificationAPI;
723
867
  exports.CloudNotificationAPIError = CloudNotificationAPIError;
868
+ exports.EventPublishError = EventPublishError;
724
869
  exports.EventRetrievalError = EventRetrievalError;
725
870
  exports.InvalidMessageFormatError = InvalidMessageFormatError;
871
+ exports.NotificationRetrievalError = NotificationRetrievalError;
726
872
  exports.PublishError = PublishError;
727
873
  exports.SessionNotConnectedError = SessionNotConnectedError;
728
- exports.notificationEventDetailSchema = notificationEventDetailSchema;