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