insite-server 2.0.6 → 2.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,6 +1,2 @@
1
- var lt=Object.create;var he=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var ut=Object.getOwnPropertyNames;var ct=Object.getPrototypeOf,dt=Object.prototype.hasOwnProperty;var y=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,s)=>(typeof require<"u"?require:t)[s]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var M=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var pt=(e,t,s,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ut(t))!dt.call(e,r)&&r!==s&&he(e,r,{get:()=>t[r],enumerable:!(i=at(t,r))||i.enumerable});return e};var fe=(e,t,s)=>(s=e!=null?lt(ct(e)):{},pt(t||!e||!e.__esModule?he(s,"default",{value:e,enumerable:!0}):s,e));var we=M((as,ge)=>{var z=/^[a-z0-9-]{1,32}$/,N=/^[a-z0-9-]{1,32}$/,K=/^[a-zA-Z0-9/+.-]+$/,me=/^([a-zA-Z0-9/+.-]+|)$/,ht=/^((-)?[1-9]\d*|0)$/,Z=/^v=(\d+)$/;function ft(e){return q(e).map(t=>[t,e[t]].join("=")).join(",")}function mt(e){let t={};return e.split(",").forEach(s=>{let i=s.split("=");if(i.length<2)throw new TypeError("params must be in the format name=value");t[i.shift()]=i.join("=")}),t}function q(e){return Object.keys(e)}function ve(e){return typeof Object.values=="function"?Object.values(e):q(e).map(t=>e[t])}function vt(e){let t=[""];if(typeof e!="object"||e===null)throw new TypeError("opts must be an object");if(typeof e.id!="string")throw new TypeError("id must be a string");if(!z.test(e.id))throw new TypeError(`id must satisfy ${z}`);if(t.push(e.id),typeof e.version<"u"){if(typeof e.version!="number"||e.version<0||!Number.isInteger(e.version))throw new TypeError("version must be a positive integer number");t.push(`v=${e.version}`)}if(typeof e.params<"u"){if(typeof e.params!="object"||e.params===null)throw new TypeError("params must be an object");let i=q(e.params);if(!i.every(o=>N.test(o)))throw new TypeError(`params names must satisfy ${N}`);i.forEach(o=>{typeof e.params[o]=="number"?e.params[o]=e.params[o].toString():Buffer.isBuffer(e.params[o])&&(e.params[o]=e.params[o].toString("base64").split("=")[0])});let r=ve(e.params);if(!r.every(o=>typeof o=="string"))throw new TypeError("params values must be strings");if(!r.every(o=>K.test(o)))throw new TypeError(`params values must satisfy ${K}`);let n=ft(e.params);t.push(n)}if(typeof e.salt<"u"){if(!Buffer.isBuffer(e.salt))throw new TypeError("salt must be a Buffer");if(t.push(e.salt.toString("base64").split("=")[0]),typeof e.hash<"u"){if(!Buffer.isBuffer(e.hash))throw new TypeError("hash must be a Buffer");t.push(e.hash.toString("base64").split("=")[0])}}return t.join("$")}function gt(e){if(typeof e!="string"||e==="")throw new TypeError("pchstr must be a non-empty string");if(e[0]!=="$")throw new TypeError("pchstr must contain a $ as first char");let t=e.split("$");t.shift();let s=5;if(Z.test(t[1])||s--,t.length>s)throw new TypeError(`pchstr contains too many fileds: ${t.length}/${s}`);let i=t.shift();if(!z.test(i))throw new TypeError(`id must satisfy ${z}`);let r;Z.test(t[0])&&(r=parseInt(t.shift().match(Z)[1],10));let n,o;me.test(t[t.length-1])&&(t.length>1&&me.test(t[t.length-2])&&(n=Buffer.from(t.pop(),"base64")),o=Buffer.from(t.pop(),"base64"));let a;if(t.length>0){let c=t.pop();if(a=mt(c),!q(a).every(d=>N.test(d)))throw new TypeError(`params names must satisfy ${N}`);if(!ve(a).every(d=>K.test(d)))throw new TypeError(`params values must satisfy ${K}`);q(a).forEach(d=>{a[d]=ht.test(a[d])?parseInt(a[d],10):a[d]})}if(t.length>0)throw new TypeError(`pchstr contains unrecognized fileds: ${t}`);let l={id:i};return r&&(l.version=r),a&&(l.params=a),o&&(l.salt=o),n&&(l.hash=n),l}ge.exports={serialize:vt,deserialize:gt}});var Le=M((us,qe)=>{var xe=y("fs"),O=y("path"),Oe=y("os"),Se=typeof __webpack_require__=="function"?__non_webpack_require__:y,wt=process.config&&process.config.variables||{},bt=!!process.env.PREBUILDS_ONLY,be=process.versions.modules,G=xt()?"electron":_t()?"node-webkit":"node",X=process.env.npm_config_arch||Oe.arch(),Y=process.env.npm_config_platform||Oe.platform(),Te=process.env.LIBC||(Ot(Y)?"musl":"glibc"),Q=process.env.ARM_VERSION||(X==="arm64"?"8":wt.arm_version)||"",Ie=(process.versions.uv||"").split(".")[0];qe.exports=_;function _(e){return Se(_.resolve(e))}_.resolve=_.path=function(e){e=O.resolve(e||".");try{var t=Se(O.join(e,"package.json")).name.toUpperCase().replace(/-/g,"_");process.env[t+"_PREBUILD"]&&(e=process.env[t+"_PREBUILD"])}catch{}if(!bt){var s=ye(O.join(e,"build/Release"),_e);if(s)return s;var i=ye(O.join(e,"build/Debug"),_e);if(i)return i}var r=a(e);if(r)return r;var n=a(O.dirname(process.execPath));if(n)return n;var o=["platform="+Y,"arch="+X,"runtime="+G,"abi="+be,"uv="+Ie,Q?"armv="+Q:"","libc="+Te,"node="+process.versions.node,process.versions.electron?"electron="+process.versions.electron:"",typeof __webpack_require__=="function"?"webpack=true":""].filter(Boolean).join(" ");throw new Error("No native build was found for "+o+`
2
- loaded from: `+e+`
3
- `);function a(l){var c=ee(O.join(l,"prebuilds")).map(Ae),p=c.filter(je(Y,X)).sort($e)[0];if(p){var u=O.join(l,"prebuilds",p.name),d=ee(u).map(Ee),m=d.filter(Re(G,be)),S=m.sort(Me(G))[0];if(S)return O.join(u,S.file)}}};function ee(e){try{return xe.readdirSync(e)}catch{return[]}}function ye(e,t){var s=ee(e).filter(t);return s[0]&&O.join(e,s[0])}function _e(e){return/\.node$/.test(e)}function Ae(e){var t=e.split("-");if(t.length===2){var s=t[0],i=t[1].split("+");if(s&&i.length&&i.every(Boolean))return{name:e,platform:s,architectures:i}}}function je(e,t){return function(s){return s==null||s.platform!==e?!1:s.architectures.includes(t)}}function $e(e,t){return e.architectures.length-t.architectures.length}function Ee(e){var t=e.split("."),s=t.pop(),i={file:e,specificity:0};if(s==="node"){for(var r=0;r<t.length;r++){var n=t[r];if(n==="node"||n==="electron"||n==="node-webkit")i.runtime=n;else if(n==="napi")i.napi=!0;else if(n.slice(0,3)==="abi")i.abi=n.slice(3);else if(n.slice(0,2)==="uv")i.uv=n.slice(2);else if(n.slice(0,4)==="armv")i.armv=n.slice(4);else if(n==="glibc"||n==="musl")i.libc=n;else continue;i.specificity++}return i}}function Re(e,t){return function(s){return!(s==null||s.runtime&&s.runtime!==e&&!yt(s)||s.abi&&s.abi!==t&&!s.napi||s.uv&&s.uv!==Ie||s.armv&&s.armv!==Q||s.libc&&s.libc!==Te)}}function yt(e){return e.runtime==="node"&&e.napi}function Me(e){return function(t,s){return t.runtime!==s.runtime?t.runtime===e?-1:1:t.abi!==s.abi?t.abi?-1:1:t.specificity!==s.specificity?t.specificity>s.specificity?-1:1:0}}function _t(){return!!(process.versions&&process.versions.nw)}function xt(){return process.versions&&process.versions.electron||process.env.ELECTRON_RUN_AS_NODE?!0:typeof window<"u"&&window.process&&window.process.type==="renderer"}function Ot(e){return e==="linux"&&xe.existsSync("/etc/alpine-release")}_.parseTags=Ee;_.matchTags=Re;_.compareTags=Me;_.parseTuple=Ae;_.matchTuple=je;_.compareTuples=$e});var De=M((ds,se)=>{var te=typeof __webpack_require__=="function"?__non_webpack_require__:y;typeof te.addon=="function"?se.exports=te.addon.bind(te):se.exports=Le()});var ze=M((hs,T)=>{var St=y("node:assert"),{randomBytes:Tt,timingSafeEqual:It}=y("node:crypto"),{promisify:At}=y("node:util"),{deserialize:Pe,serialize:jt}=we(),$t=De(),{hash:ke}=$t(__dirname),Et=At(Tt),Be=0,Ce=1,ie=2;T.exports.argon2d=Be;T.exports.argon2i=Ce;T.exports.argon2id=ie;var L=Object.freeze({argon2d:Be,argon2i:Ce,argon2id:ie}),Rt=Object.freeze({[L.argon2d]:"argon2d",[L.argon2i]:"argon2i",[L.argon2id]:"argon2id"}),Ue=Object.freeze({hashLength:32,timeCost:3,memoryCost:65536,parallelism:4,type:ie,version:19}),We=Object.freeze({hashLength:{min:4,max:2**32-1},memoryCost:{min:1024,max:2**32-1},timeCost:{min:2,max:2**32-1},parallelism:{min:1,max:2**24-1}});T.exports.limits=We;async function Mt(e,t){let{raw:s,salt:i,...r}={...Ue,...t};for(let[S,{min:A,max:b}]of Object.entries(We)){let g=r[S];St(A<=g&&g<=b,`Invalid ${S}, must be between ${A} and ${b}.`)}i=i??await Et(16);let{hashLength:n,secret:o=Buffer.alloc(0),type:a,version:l,memoryCost:c,timeCost:p,parallelism:u,associatedData:d=Buffer.alloc(0)}=r,m=await ke({password:Buffer.from(e),salt:i,secret:o,data:d,hashLength:n,m:c,t:p,p:u,version:l,type:a});return s?m:jt({id:Rt[a],version:l,params:{m:c,t:p,p:u,...d.byteLength>0?{data:d}:{}},salt:i,hash:m})}T.exports.hash=Mt;function qt(e,t={}){let{memoryCost:s,timeCost:i,version:r}={...Ue,...t},{version:n,params:{m:o,t:a}}=Pe(e);return+n!=+r||+o!=+s||+a!=+i}T.exports.needsRehash=qt;async function Lt(e,t,s={}){let{id:i,...r}=Pe(e);if(!(i in L))return!1;let{version:n=16,params:{m:o,t:a,p:l,data:c=""},salt:p,hash:u}=r,{secret:d=Buffer.alloc(0)}=s;return It(await ke({password:Buffer.from(t),salt:p,secret:d,data:Buffer.from(c,"base64"),hashLength:u.byteLength,m:+o,t:+a,p:+l,version:+n,type:L[i]}),u)}T.exports.verify=Lt});var Ke=M((fs,re)=>{"use strict";var Dt=Object.prototype.hasOwnProperty,f="~";function D(){}Object.create&&(D.prototype=Object.create(null),new D().__proto__||(f=!1));function Pt(e,t,s){this.fn=e,this.context=t,this.once=s||!1}function Ne(e,t,s,i,r){if(typeof s!="function")throw new TypeError("The listener must be a function");var n=new Pt(s,i||e,r),o=f?f+t:t;return e._events[o]?e._events[o].fn?e._events[o]=[e._events[o],n]:e._events[o].push(n):(e._events[o]=n,e._eventsCount++),e}function F(e,t){--e._eventsCount===0?e._events=new D:delete e._events[t]}function h(){this._events=new D,this._eventsCount=0}h.prototype.eventNames=function(){var t=[],s,i;if(this._eventsCount===0)return t;for(i in s=this._events)Dt.call(s,i)&&t.push(f?i.slice(1):i);return Object.getOwnPropertySymbols?t.concat(Object.getOwnPropertySymbols(s)):t};h.prototype.listeners=function(t){var s=f?f+t:t,i=this._events[s];if(!i)return[];if(i.fn)return[i.fn];for(var r=0,n=i.length,o=new Array(n);r<n;r++)o[r]=i[r].fn;return o};h.prototype.listenerCount=function(t){var s=f?f+t:t,i=this._events[s];return i?i.fn?1:i.length:0};h.prototype.emit=function(t,s,i,r,n,o){var a=f?f+t:t;if(!this._events[a])return!1;var l=this._events[a],c=arguments.length,p,u;if(l.fn){switch(l.once&&this.removeListener(t,l.fn,void 0,!0),c){case 1:return l.fn.call(l.context),!0;case 2:return l.fn.call(l.context,s),!0;case 3:return l.fn.call(l.context,s,i),!0;case 4:return l.fn.call(l.context,s,i,r),!0;case 5:return l.fn.call(l.context,s,i,r,n),!0;case 6:return l.fn.call(l.context,s,i,r,n,o),!0}for(u=1,p=new Array(c-1);u<c;u++)p[u-1]=arguments[u];l.fn.apply(l.context,p)}else{var d=l.length,m;for(u=0;u<d;u++)switch(l[u].once&&this.removeListener(t,l[u].fn,void 0,!0),c){case 1:l[u].fn.call(l[u].context);break;case 2:l[u].fn.call(l[u].context,s);break;case 3:l[u].fn.call(l[u].context,s,i);break;case 4:l[u].fn.call(l[u].context,s,i,r);break;default:if(!p)for(m=1,p=new Array(c-1);m<c;m++)p[m-1]=arguments[m];l[u].fn.apply(l[u].context,p)}}return!0};h.prototype.on=function(t,s,i){return Ne(this,t,s,i,!1)};h.prototype.once=function(t,s,i){return Ne(this,t,s,i,!0)};h.prototype.removeListener=function(t,s,i,r){var n=f?f+t:t;if(!this._events[n])return this;if(!s)return F(this,n),this;var o=this._events[n];if(o.fn)o.fn===s&&(!r||o.once)&&(!i||o.context===i)&&F(this,n);else{for(var a=0,l=[],c=o.length;a<c;a++)(o[a].fn!==s||r&&!o[a].once||i&&o[a].context!==i)&&l.push(o[a]);l.length?this._events[n]=l.length===1?l[0]:l:F(this,n)}return this};h.prototype.removeAllListeners=function(t){var s;return t?(s=f?f+t:t,this._events[s]&&F(this,s)):(this._events=new D,this._eventsCount=0),this};h.prototype.off=h.prototype.removeListener;h.prototype.addListener=h.prototype.on;h.prefixed=f;h.EventEmitter=h;typeof re<"u"&&(re.exports=h)});import{CookieSetter as Gt,InSiteCookieMiddleware as Xt}from"insite-cookie/server";import{SubscriptionHandler as Yt}from"insite-subscriptions-server/ws";import{InSiteWebSocketServer as Qt}from"insite-ws/server";import{IncomingTransport as es,OutgoingTransport as ts}from"insite-ws-transfers/node";import{connect as ss}from"insite-db";import{InSiteHTTPServer as is,InSiteStaticMiddleware as rs,InSiteTemplateMiddleware as ns}from"insite-http";var W=fe(ze(),1);var Fe=fe(Ke(),1);var He=Fe.default;function P(e){if(e instanceof Set){let t=[];for(let s of e)t.push(s._id);return t}return e.map(t=>t._id)}function $(){}function x(e,t=0,s={}){let{leading:i=!1,trailing:r=!0}=s,{maxWait:n=1/0}=s,o,a,l,c,p,u,d,m,S=async()=>{let j=Date.now();j>=l?(o=void 0,l=void 0,clearTimeout(a),typeof d=="function"&&await d(),g.resolve(m),g.promise.isResolved=!0,u=i):(clearTimeout(o),o=setTimeout(S,l-j))},A=Number.isFinite(n)?()=>{d===b&&(d=!1),b(),a=setTimeout(A,n)}:null;async function b(){return m=await e.apply(c,p)}i&&typeof i=="boolean"&&(i=b),u=i,r&&typeof r=="boolean"&&(r=b),d=r;let g=Object.assign(function(...j){return p=j,c=this,l=Date.now()+t,d=r,g.promise.isResolved&&(g.promise=Object.assign(new Promise(ot=>{g.resolve=ot,typeof u=="function"&&(u(),u=!1,d===b&&(d=!1)),o||(o=setTimeout(S,t),A&&(a=setTimeout(A,n)))}),{isResolved:!1})),g.promise},{callback:e,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:$,run:b,clear:async j=>{clearTimeout(o),o=void 0,clearTimeout(a),g.promise.isResolved=!0,g.resolve(j?await b():m)}});return g}x.noop=Object.assign(()=>{},{callback:$,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:$,run:$,clear:$});function w(e,t){if(e){for(let s of t)delete e[s];return e}return null}function Ve(e){for(let t in e)delete e[t];return e}var H=class extends Array{constructor(){super(),Object.freeze(this)}push(){return 0}unshift(){return 0}splice(){return[]}};var E=class extends Set{constructor(){super()}add(){return this}};function ne(e,t,s=!1){return s&&(t=t.filter(i=>e.has(i))),t.map(i=>e.get(i))}function Je(e,t){for(let s of t)if(e.has(s))return!0;return!1}function Ze(e,t,s,i,r=!0){return Array.isArray(e)&&(e=e.length),typeof i!="string"&&(r=i??!0,i=s),(r?`${e}\xA0`:"")+Ze.raw(e,t,s,i)}Ze.raw=(e,t,s,i=s)=>{e=Math.abs(e);let r=e%10,n=e%100;return r===1&&n!==11?t:r>=2&&r<=4&&!(n>=12&&n<=15)?s:i};function Ge(e,...t){let s=[];e:for(let i of e){for(let r of t)if(r instanceof Set?!r.has(i):!r.includes(i))continue e;s.push(i)}return s}function V(e,t){return Math.floor(Math.random()*(t-e+1)+e)}function Xe(e,t){return e.delete(t),e.add(t),e}function I(e,t){let s,i=0;for(let r of t)for(;(s=e.indexOf(r))>-1;)e.splice(s,1),i++;return i}function Ye(e,t){let s=e.indexOf(t);return s>-1?(e.splice(s,1),!0):!1}function Qe(e,t){for(let s of[...e].sort(t))e.delete(s),e.add(s);return e}import{newObjectIdString as kt}from"insite-db";import{newObjectIdString as Ct}from"insite-db";import st from"node:crypto";var Bt=class extends Map{constructor(e){super(),this.schema=e,this.parse(this.schema)}schema;parse(e){for(let t of e)this.set(t._id,t),t.subAbilities&&this.parse(t.subAbilities)}merge(e,t){for(let[s,i]of Object.entries(t)){let r=this.get(s);if(r){if(r.isInheritable!==!1&&i){if(!(s in e))e[s]=structuredClone(i);else if(r.params){let n=e[s],o=i;for(let a of r.params)if(a.isInheritable!==!1&&a._id in o){if(!(a._id in n))n[a._id]=structuredClone(o[a._id]);else if(a.type==="number")n[a._id]<o[a._id]&&(n[a._id]=o[a._id]);else if(a.type==="items"){let l=n[a._id];for(let c of o[a._id])l.includes(c)||l.push(c)}}}}}else delete t[s]}return e}getMinimumOf(e){let t=this.get(e);if(t?.params){let s={};for(let i of t.params)i.type==="number"?s[i._id]=i.min??0:i.type==="items"&&(s[i._id]=[]);return s}return!0}getMaximum(){return[...this.values()].reduce((e,t)=>{if(t.params){let s={};for(let i of t.params)i.type==="number"?s[i._id]=i.max??0:i.type==="items"&&(s[i._id]=i.items.map(r=>r._id));e[t._id]=s}else e[t._id]=!0;return e},{})}getSchemeFor(e){return function t(s){for(let i=0;i<s.length;i++){let r=s[i],n=e.abilities[r._id];if(n){if(r.params)for(let o of r.params){let a=n[o._id];if(o.type==="number")"max"in o&&(o.max=a);else if(o.type==="items")for(let l=0;l<o.items.length;l++)a.includes(o.items[l]._id)||o.items.splice(l--,1)}r.subAbilities&&t(r.subAbilities)}else s.splice(i--,1)}return s}(structuredClone(this.schema))}},oe=new Map,R=class{constructor(e,t){this.orgs=e,this._id=t._id,e.set(this._id,this),this.update(t)}_id;title="";initials="";displayLabel="";_o=0;orgs;isOrg=!0;ownerOrgs=new Set;ownerUsers=new Set;users=new Set;slaveOrgs=new Set;ownerIds=[];update({_id:e,title:t,owners:s,...i},r){if(Object.assign(this,i),t!==void 0&&(this.title=t,this.initials=t?.[0]?.toUpperCase()??"",this.displayLabel=t),s){this.ownerIds=s;let n=this.ownerIds.join(",");n!==oe.get(this._id)&&(oe.set(this._id,n),this.orgs.users.isInited&&this.orgs.updateDebounced(),this.orgs.users.emit("orgs-org-update",this,r))}}delete(){this.orgs.delete(this._id),oe.delete(this._id),this.orgs.replace(this._id),this.orgs.updateDebounced()}},v={_id:/^[\dA-Fa-f]{24}$/,email:/^[^\s@]{1,63}@[^\s@]{1,63}\.[^\s@]{1,63}$/,argon2:/^\$argon2(?:i|d|id)\$v=\d+\$m=\d+,t=\d+,p=\d+(?:\$[\d+/A-Za-z]+){2}$/,sessionId:/^[\dA-Fa-f]{16,32}\$[\dA-Fa-f]{16,32}$/,role:/^[\d_a-z-]{1,64}$/,ip:/^(?:\d{1,3}\.){3}\d{1,3}$/},k={required:["_id","title","note","owners","createdAt"],properties:{_id:{bsonType:"string",pattern:v._id.source},title:{bsonType:"string",maxLength:512},note:{bsonType:"string",maxLength:131072},owners:{bsonType:"array",uniqueItems:!0,items:{bsonType:"string",pattern:v._id.source},additionalItems:!1},createdAt:{bsonType:"number"}},additionalProperties:!1},Ut=[[{owners:1}]];function et(){throw new Error("Direct usage of orgs collection.deleteOne or .deleteMany is forbidden. Use orgs.collectionDelete instead.")}var Wt=class extends Map{constructor(e,t={}){super(),this.users=e,this.collections=e.collections,this.preinitOptions=t}users;collections;preinitOptions;collection;null;load(e){new R(this,e)}resolve(e,t){t=[e,...t];for(let s of e.ownerOrgs){this.resolve(s,t);for(let i of t)s.slaveOrgs.add(i)}}sorted=[];update(){let e=[...this.values()],t=[];for(let s of e){s.ownerOrgs.clear(),s.ownerUsers.clear(),s.slaveOrgs.clear();for(let i of s.ownerIds){let r=this.get(i);if(r)s.ownerOrgs.add(r);else{let n=this.users.get(i);n&&s.ownerUsers.add(n)}}!s.ownerOrgs.size&&s._id&&t.push(s)}for(let s of e)e.some(i=>i.ownerOrgs.has(s))||this.resolve(s,[]);t.sort(this.sortOrgs);for(let s of e)Qe(s.slaveOrgs,this.sortOrgs);for(let s=0;s<t.length;s++){let i=t[s];for(let r of[...i.slaveOrgs].reverse())if(r.ownerOrgs.has(i)){let n=t.indexOf(r);~n&&(t.splice(n,1),s--),t.splice(s+1,0,r)}}for(let{length:s}=t,i=0;i<s;)t[i]._o=i++;this.sorted=t,this.users.emit("orgs-update"),this.users.isInited&&(this.users.updateDebounced.clear(),this.users.update())}sortOrgs(e,t){return t.slaveOrgs.size-e.slaveOrgs.size||(e.title>t.title?1:e.title<t.title?-1:0)}updateDebounced=x(this.update,250);preinit=async()=>{let{schema:e,indexes:t,null:s}=this.preinitOptions;e&&(e.required&&I(e.required,k.required),e.properties&&w(e,Object.keys(k.properties)));let i={...k,...e,required:[...k.required,...e?.required??[]],properties:{...k.properties,...e?.properties}};this.collection=Object.assign(await this.collections.ensure("orgs",{jsonSchema:i}),{deleteOne:et,deleteMany:et}),this.collection.ensureIndexes([...Ut,...t??[]]),this.null=Object.assign(new R(this,{...s,_id:"",title:"",note:"",owners:[],createdAt:Date.now()}),{_id:null,ownerIds:new H,ownerOrgs:new E,ownerUsers:new E,slaveOrgs:new E});for(let r of await this.collection.find().toArray())this.load(r);delete this.preinitOptions,delete this.preinit};init=async()=>{await this.update(),this.collection.changeListeners.add(e=>{switch(e.operationType){case"insert":{let t=new R(this,e.fullDocument);this.users.emit("orgs-org-update",t,e);break}case"replace":this.get(e.documentKey._id)?.update(e.fullDocument,e);break;case"update":this.get(e.documentKey._id)?.update(e.updateDescription.updatedFields,e);break;case"delete":this.get(e.documentKey._id)?.delete(),this.users.emit("orgs-org-update",null,e)}}),delete this.init};new({title:e,note:t,...s},i){return this.collection.insertOne({_id:Ct(),title:e??"",note:t??"",owners:i?[i]:[],...w(s,["_id","owners"]),createdAt:Date.now()})}collectionDelete(e){let t=typeof e=="string"?e:e._id;return this.collection.bulkWrite([{updateMany:{filter:{owners:t},update:{$pullAll:{owners:[t]}}}},{deleteOne:{filter:{_id:t}}}])}replaceMap=new Map;replaceHandlers=new Set;async replace(e){let t=this.replaceMap.get(e)??null;t&&this.replaceMap.delete(e);for(let s of this.replaceHandlers)await s(e,t)}},le=new Map,ae=class{constructor(e,t){this.roles=e,this._id=t._id,e.set(this._id,this),this.update(t)}roles;_id;ownInvolveIds;ownAbilities;title="";displayTitle="";_o=0;ownInvolves=[];involves=new Set;abilities={};inheritedAbilities={};update({_id:e,involves:t,abilities:s,title:i,...r},n){if(Object.assign(this,r),t&&(this.ownInvolveIds=t),s&&(this.ownAbilities=s),i!==void 0&&(this.title=i,this.displayTitle=i||this._id),t||s){let o=[this.ownInvolveIds.join(","),JSON.stringify(this.ownAbilities)].join(`
4
- `);o!==le.get(this._id)&&(le.set(this._id,o),this.roles.users.isInited&&this.roles.updateDebounced(),this.roles.users.emit("roles-role-update",this,n))}}delete(){this.roles.delete(this._id),le.delete(this._id),this.roles.updateDebounced()}},B={required:["_id","involves","abilities","title","description","createdAt"],properties:{_id:{bsonType:"string",pattern:v.role.source,not:{enum:["root"]}},involves:{bsonType:"array",uniqueItems:!0,items:{bsonType:"string",pattern:v.role.source,not:{enum:["root"]}},additionalItems:!1},abilities:{bsonType:"object"},title:{bsonType:"string",maxLength:256},description:{bsonType:"string",maxLength:10240},createdAt:{bsonType:"number"}},additionalProperties:!1},zt=[[{involves:1}]];function tt(){throw new Error("Direct usage of roles collection.deleteOne or .deleteMany is forbidden. Use roles.collectionDelete instead.")}var Nt=class extends Map{constructor(e,t={}){super();let{root:s,...i}=t;this.users=e,this.collections=e.collections,this.abilitiesMap=e.abilitiesMap,this.root=new ae(this,{...s,_id:"root",involves:[],abilities:this.abilitiesMap.getMaximum(),title:"Root",description:"Root",createdAt:Date.now()}),this.initOptions=i}users;collections;collection;abilitiesMap;root;initOptions;load(e){new ae(this,e)}resolve(e,t){t=[e,...t];for(let s of e.ownInvolveIds){let i=this.get(s);if(i){for(let r of t)Xe(r.involves,i),this.abilitiesMap.merge(r.inheritedAbilities,i.abilities);i!==e&&this.resolve(i,t)}}}sorted=[];sortRoles(e,t){return t.involves.size-e.involves.size||(e.title&&t.title?e.title>t.title?1:e.title<t.title?-1:0:e.title?-1:t.title||e._id>t._id?1:e._id<t._id?-1:0)}update(){let e=[...this.values()];this.root.ownInvolveIds=[];for(let i of e)i!==this.root&&!e.some(r=>r.ownInvolveIds.includes(i._id))&&this.root.ownInvolveIds.push(i._id),i.involves.clear(),i.abilities=structuredClone(i.ownAbilities),i.inheritedAbilities={};this.root.involves.add(this.root),this.resolve(this.root,[]);for(let i of e)i.ownInvolves=ne(this,i.ownInvolveIds,!0).sort(this.sortRoles).reverse();let t=[this.root];for(let i=0;i<t.length;i++){let r=t[i];for(let n of r.ownInvolves){let o=t.indexOf(n);~o&&(t.splice(o,1),i--),t.splice(i+1,0,n)}}let s=0;for(let i of t)this.abilitiesMap.merge(i.abilities,i.inheritedAbilities),i._o=s++;this.sorted=t,this.users.emit("roles-update"),this.users.isInited&&(this.users.updateDebounced.clear(),this.users.update(!0))}updateDebounced=x(this.update,250);init=async()=>{let{schema:e,indexes:t}=this.initOptions;e&&(e.required&&I(e.required,B.required),e.properties&&w(e,Object.keys(B.properties)));let s={...B,...e,required:[...B.required,...e?.required??[]],properties:{...B.properties,...e?.properties}};this.collection=Object.assign(await this.collections.ensure("roles",{jsonSchema:s}),{deleteOne:tt,deleteMany:tt}),this.collection.ensureIndexes([...zt,...t??[]]);for(let i of await this.collection.find().toArray())this.load(i);await this.update(),this.collection.changeListeners.add(i=>{switch(i.operationType){case"insert":{let r=new ae(this,i.fullDocument);this.users.emit("roles-role-update",r,i);break}case"replace":this.get(i.documentKey._id)?.update(i.fullDocument,i);break;case"update":this.get(i.documentKey._id)?.update(i.updateDescription.updatedFields,i);break;case"delete":this.get(i.documentKey._id)?.delete(),this.users.emit("roles-role-update",null,i)}}),delete this.initOptions,delete this.init};new({_id:e,involves:t,title:s,description:i,...r}){return this.collection.insertOne({_id:e,involves:t||[],abilities:{},title:s??"",description:i??"",...w(r,["abilities"]),createdAt:Date.now()})}collectionDelete(e){let t=typeof e=="string"?e:e._id;return this.collection.bulkWrite([{updateMany:{filter:{involves:t},update:{$pullAll:{involves:[t]}}}},{deleteOne:{filter:{_id:t}}}])}cleanUpIds(e){let t=Ge(this.sorted,ne(this,e,!0)),s=[];for(let i of t)t.every(r=>r===i||!r.involves.has(i))&&s.push(i._id);return s}},C={required:["_id","user","remoteAddress","isOnline","createdAt","prolongedAt","expiresAt"],properties:{_id:{bsonType:"string",pattern:v.sessionId.source},user:{bsonType:"string",pattern:v._id.source},userAgent:{bsonType:"string",maxLength:4096},remoteAddress:{bsonType:"string",pattern:v.ip.source},isOnline:{bsonType:"bool"},createdAt:{bsonType:"number"},prolongedAt:{bsonType:"number"},expiresAt:{bsonType:"date"}},additionalProperties:!1},ue=class{constructor(e,t){let s=e.users.get(t.user);s?(this.sessions=e,this._id=t._id,this.sessions.set(this._id,this),this.user=s,this.user.sessions.add(this),this.sessions.users.bySessionId.set(this._id,this.user),this.update(t)):e.collection.deleteOne({_id:t._id})}_id;user;isOnline=!1;userAgent;remoteAddress;createdAt;prolongedAt;expiresAt;sessions;update({_id:e,user:t,isOnline:s,...i}){s!==void 0&&this.isOnline!==s&&(this.isOnline=s,this.sessions.isInited&&this.user.isOnline!==this.isOnline&&this.user.updateIsOnline()),Object.assign(this,i)}prolong({_id:e,user:t,...s}){let i=Date.now();return s.prolongedAt=i,s.expiresAt=new Date(i+this.sessions.collection.expireAfterSeconds*1e3),this.update(s),this.sessions.collection.updateOne({_id:this._id},{$set:s})}offline(){let e={isOnline:!1};return this.update(e),this.sessions.collection.updateOne({_id:this._id},{$set:e})}delete(){this.sessions.delete(this._id),this.user.sessions.delete(this),this.sessions.users.bySessionId.delete(this._id),this.sessions.users.emit("session-delete",this),this.isOnline&&this.user.updateIsOnline()}},pe=3600*24*7,Kt=[[{user:1}],[{expiresAt:1},{expireAfterSeconds:pe}]],Ft=class extends Map{constructor(e,t={}){super(),this.users=e,this.collections=e.collections,this.initOptions=t}users;collections;initOptions;collection;isInited=!1;uid(){let e;do e=`${st.randomBytes(V(8,16)).toString("hex")}$${st.randomBytes(V(8,16)).toString("hex")}`;while(this.has(e));return e}load(e){new ue(this,e)}init=async()=>{let{schema:e,indexes:t}=this.initOptions;e&&(e.required&&I(e.required,C.required),e.properties&&w(e,Object.keys(C.properties)));let s={...C,...e,required:[...C.required,...e?.required??[]],properties:{...C.properties,...e?.properties}};this.collection=Object.assign(await this.collections.ensure("sessions",{jsonSchema:s}),{expireAfterSeconds:pe}),this.collection.ensureIndexes([...Kt,...t??[]]),await this.collection.updateMany({isOnline:!0},{$set:{isOnline:!1}});for(let i of await this.collection.find().toArray())this.load(i);this.collection.changeListeners.add(i=>{switch(i.operationType){case"insert":this.has(i.documentKey._id)||new ue(this,i.fullDocument),this.users.get(i.fullDocument.user)?.trimSessions();break;case"replace":this.get(i.documentKey._id)?.update(i.fullDocument);break;case"update":this.get(i.documentKey._id)?.update(i.updateDescription.updatedFields);break;case"delete":this.get(i.documentKey._id)?.delete()}}),this.isInited=!0,delete this.initOptions,delete this.init};async new(e,t){let s=Date.now(),i={userAgent:"",remoteAddress:"127.0.0.1",isOnline:!0,...t,_id:this.uid(),user:e._id,createdAt:s,prolongedAt:s,expiresAt:new Date(s+pe*1e3)},r=new ue(this,i);return await this.collection.insertOne(i),r}},Ht={required:["_id","type","size","ts","data"],properties:{_id:{bsonType:"string",pattern:v._id.source},type:{bsonType:"string",maxLength:256},size:{bsonType:"number"},ts:{bsonType:"string",maxLength:10},data:{bsonType:"binData"}},additionalProperties:!1},Vt=class{constructor(e){this.users=e,this.collections=e.collections}users;collections;collection;init=async()=>{this.collection=await this.collections.ensure("users.avatars",{jsonSchema:Ht}),delete this.init}},U={required:["_id","email","password","roles","name","org","job","createdAt"],properties:{_id:{bsonType:"string",pattern:v._id.source},email:{bsonType:"string",pattern:v.email.source},password:{bsonType:"string",pattern:v.argon2.source},roles:{bsonType:"array",uniqueItems:!0,items:{bsonType:"string",pattern:v.role.source},additionalItems:!1},name:{bsonType:"object",required:["first","middle","last"],properties:{first:{bsonType:"string",maxLength:512},middle:{bsonType:"string",maxLength:512},last:{bsonType:"string",maxLength:512}},additionalProperties:!1},org:{oneOf:[{bsonType:"string",pattern:v._id.source},{bsonType:"null"}]},job:{bsonType:"string",maxLength:512},avatar:{oneOf:[{bsonType:"string",maxLength:10},{bsonType:"null"}]},createdAt:{bsonType:"number"}},additionalProperties:!1},ce=new Map,de=new Map,Jt=process.env.INSITE_STATIC_URL??"http://localhost:8080",J=class{constructor(e,t){this.users=e,this._id=t._id,e.set(this._id,this),this.update(t),e.isInited&&e.emit("user-create",this)}_id;email;name={first:"",middle:"",last:""};initials="";displayLabel="";org;job="";avatar=null;avatarUrl=null;users;isUser=!0;isRoot;roles=new Set;ownRoles=[];ownRoleIds=[];slaveRoles=new Set;slaveRoleIds=[];abilities={};slaveOrgs=new Set;slaveUsers=new Set;slaves=new Set;slaveIds=[];permissiveIds=[];sessions=new Set;isOnline=!1;update({_id:e,name:t,email:s,roles:i,org:r,avatar:n,...o}){Object.assign(this,o);let a;s&&this.email!==s&&(this.users.byEmail.delete(this.email),this.email=s,this.users.byEmail.set(s,this),a=!0);let l,c;t&&(this.name.first!==t.first||this.name.middle!==t.middle||this.name.last!==t.last)&&(c=this.name.last!==t.last,this.name={first:t.first??"",middle:t.middle??"",last:t.last??""},this.initials=((t.first?.[0]??"")+(t.last?.[0]??"")||this.email[0]).toUpperCase(),l=!0),(a||l)&&(this.displayLabel=`${this.name.first} ${this.name.last}`.trim()||this.name.middle||this.email);let p;if(i){this.ownRoleIds=i;let d=this.ownRoleIds.join(",");d!==ce.get(this._id)&&(ce.set(this._id,d),this.updateRoles(),p=!0)}let u;r!==void 0&&this.org?._id!==r&&(this.org?.users.delete(this),this.org=r&&this.users.orgs.get(r)||this.users.orgs.null,this.org.users.add(this),u=!0),n!==void 0&&this.avatar!==n&&(this.avatar=n,this.avatarUrl=n&&`${Jt}/avatars/${this._id}-${n}.webp`),p||u?(this.updatePermissions(),c&&(this.users.isSortRequired=!0),this.users.isInited&&this.users.updateDebounced()):c&&this.users.sortDebounced()}updateRoles(){if(this.users.isInited){this.ownRoles=[],this.roles.clear(),this.slaveRoles.clear(),Ve(this.abilities);for(let e of this.ownRoleIds){let t=this.users.roles.get(e);if(t){this.ownRoles.push(t),this.roles.add(t);for(let s of t.involves)this.roles.add(s),this.slaveRoles.add(s);this.slaveRoleIds=P(this.slaveRoles),this.users.abilitiesMap.merge(this.abilities,t.abilities)}}this.roles.has(this.users.roles.root)&&(this.isRoot=!0),this.trimSessions()}}updatePermissions(){if(this.users.isInited){this.slaveOrgs.clear(),this.slaveUsers.clear(),this.slaves.clear();let e=new Set;for(let i of this.users.orgs.sorted)if((i.ownerUsers.has(this)||this.isRoot)&&!this.slaveOrgs.has(i)){this.slaveOrgs.add(i),this.slaves.add(i),e.add(i._id);for(let r of i.slaveOrgs)this.slaveOrgs.add(r),this.slaves.add(r),e.add(r._id)}for(let i of new Set([this.org,...this.slaveOrgs,this.users.orgs.null]))for(let r of i.users)r!==this&&(Je(this.slaveRoles,r.ownRoles)||!r.ownRoles.length)&&(this.slaveUsers.add(r),this.slaves.add(r),e.add(r._id));this.slaveIds=[...e];let t=[];if(this.org._id){t.push(this.org._id);for(let i of this.org.slaveOrgs)this.slaveOrgs.has(i)||t.push(i._id)}this.permissiveIds=[...t,this._id,...e];let s=[this.permissiveIds.join(","),this.ownRoleIds.join(","),JSON.stringify(this.abilities),this.slaveRoleIds.join(",")].join(`
5
- `);s!==de.get(this._id)&&(de.set(this._id,s),this.users.emit("user-permissions-change",this))}}trimSessions(){let e=this.abilities.login?.sessionsLimit??0;return this.sessions.size>e?this.users.sessions.collection.deleteMany({_id:{$in:P([...this.sessions].sort((t,s)=>t.expiresAt.valueOf()-s.expiresAt.valueOf()).slice(0,this.sessions.size-e))}}):null}updateIsOnline=x(()=>{let e=!1;for(let t of this.sessions)if(t.isOnline){e=!0;break}this.isOnline!==e&&(this.isOnline=e,this.users.emit("user-is-online",this))},500);delete(){this.org.users.delete(this),this.users.delete(this._id),this.users.byEmail.delete(this.email),Ye(this.users.sorted,this),ce.delete(this._id),de.delete(this._id),this.users.replace(this._id),this.users.updateDebounced()}},Zt=[[{email:1},{unique:!0}],[{org:1}]],it=class rt extends Map{constructor(t,s){super();let i=new He;this._events=i._events,this._eventsCount=i._eventsCount,this.emit=i.emit,this.on=i.on,this.once=i.once,this.addListener=i.addListener,this.off=i.off,this.removeListener=i.removeListener,this.collections=t,this.abilitiesMap=new Bt(s.abilities),this.initOptions=s,this.initPromise=this.init()}_events;_eventsCount;emit;on;once;addListener;off;removeListener;initOptions;collections;abilitiesMap;collection;roles;sessions;orgs;avatars;isInited=!1;byEmail=new Map;bySessionId=new Map;sorted=[];isSortRequired=!1;load(t){new J(this,t)}sort(){this.isSortRequired=!1,this.sorted=[...this.values()].sort((t,s)=>t.name.last>s.name.last?1:t.name.last<s.name.last?-1:0)}sortDebounced=x(()=>this.sort(),250);update(t){if(t)for(let s of this.values())s.updateRoles();for(let s of this.values())s.updatePermissions();this.isSortRequired&&this.sort()}updateDebounced=x(()=>this.update(),250);preinit=async()=>{let{indexes:t,schema:s,initialRoot:i}=this.initOptions;s&&(s.required&&I(s.required,U.required),s.properties&&w(s,Object.keys(U.properties)));let r={...U,...s,required:[...U.required,...s?.required??[]],properties:{...U.properties,...s?.properties}};this.collection=await this.collections.ensure("users",{jsonSchema:r}),this.collection.ensureIndexes([...Zt,...t??[]]),await this.collection.countDocuments({roles:"root"})||await this.new({email:process.env.INSITE_ROOT_EMAIL??"insite@root.email",password:process.env.INSITE_ROOT_PASSWORD??"inSiteRootPassword",roles:["root"],name:{first:"Root"},org:null,job:"Root",...i&&w(i,["roles","org"])});for(let n of await this.collection.find().toArray())this.load(n);delete this.preinit};initPromise;init=async()=>{this.isInited=!0;let{roles:t,orgs:s,sessions:i}=this.initOptions;return this.roles=new Nt(this,t),this.orgs=new Wt(this,s),this.sessions=new Ft(this,i),this.avatars=new Vt(this),await this.roles.init(),await this.orgs.preinit(),await this.preinit(),await this.orgs.init(),await this.avatars.init(),this.update(!0),this.collection.changeListeners.add(r=>{switch(r.operationType){case"insert":new J(this,r.fullDocument);break;case"replace":this.get(r.documentKey._id)?.update(r.fullDocument);break;case"update":this.get(r.documentKey._id)?.update(r.updateDescription.updatedFields);break;case"delete":this.get(r.documentKey._id)?.delete()}}),await this.sessions.init(),delete this.initOptions,delete this.init,this};whenReady(){return this.initPromise}async new({email:t,password:s,roles:i,name:r,org:n,job:o,...a}){if(this.byEmail.has(t))throw new Error("User exists");return await this.collection.insertOne({_id:kt(),email:t,password:await W.hash(s),roles:this.isInited?this.roles.cleanUpIds(i):i,name:{first:r.first??"",middle:r.middle??"",last:r.last??""},org:n??null,job:o??"",...w(a,["_id"]),createdAt:Date.now()}),!0}async changePassword(t,s){if(!this.has(t))throw new Error("usernotfound");if(!s)throw new Error("emptypasswordisnotallowed");await Promise.all([this.collection.updateOne({_id:t},{$set:{password:await W.hash(s)}}),this.sessions.collection.deleteMany({user:t})])}async login(t,s,i){let r=this.byEmail.get(t);if(!r)throw new Error("usernotfound");if(!await W.verify(r.password,s))throw new Error("incorrectpassword");if(!r.abilities.login)throw new Error("userisnotabletologin");return this.sessions.new(r,i)}logout(t){return t.delete(),this.sessions.collection.deleteOne({_id:t._id})}sortUsersAndOrgs(t,s){return t instanceof J&&s instanceof J?t.name.last&&s.name.last?t.name.last>s.name.last?1:t.name.last<s.name.last?-1:0:!t.name.last&&!s.name.last?t.displayLabel>s.displayLabel?1:t.displayLabel<s.displayLabel?-1:0:t.name.last?-1:1:t instanceof R&&s instanceof R?t.title>s.title?1:t.title<s.title?-1:0:t instanceof R?-1:1}sortIds(t){return P(t.map(s=>this.get(s)||this.orgs.get(s)).filter(Boolean).sort(this.sortUsersAndOrgs))}replaceMap=new Map;replaceHandlers=new Set;async replace(t){let s=this.replaceMap.get(t)??null;s&&this.replaceMap.delete(t);for(let i of this.replaceHandlers)await i(t,s)}static init(t,s){return new rt(t,s).whenReady()}};import{UsersServer as os}from"insite-users-server-ws";var nt=class e{constructor(t){this.initPromise=this.init(t)}mongoClient;db;collections;wss;incomingTransport;outgoingTransport;subscriptionHandler;usersServer;users;cookie;http;init=async t=>{let{db:s,wss:i,users:r,cookie:n,http:o}=t;if(s&&({client:this.mongoClient,db:this.db,collections:this.collections}=await ss(s)),i){let{subscriptions:a,incomingTransport:l,outgoingTransport:c,...p}=i;this.wss=new Qt(p),a!==null&&(this.subscriptionHandler=new Yt(this.wss,!!this.collections)),l!==null&&(l||this.collections&&r)&&(this.incomingTransport=new es(this.wss,l)),c&&(this.outgoingTransport=new ts(this.wss)),process.env.NODE_ENV==="development"&&this.wss.on("client-connect",u=>console.info(`\u{1F50C} WebSocket connected with ${u.session?.user.email}`)),this.wss.on("error",u=>console.error("\u{1F50C}\u2757\uFE0F WebSocket Server:",u)),this.wss.on("close",()=>console.error("\u{1F50C}\u2757\uFE0F WebSocket Server closed"))}if(r&&this.collections){let{server:a,...l}=r;this.wss&&this.subscriptionHandler?(this.usersServer=await os.init({...a,users:l,wss:this.wss,collections:this.collections,incomingTransport:this.incomingTransport}),this.users=this.usersServer.users):this.users=await it.init(this.collections,l)}if(o){let{static:a=void 0,template:l=void 0,middlewares:c=void 0,...p}=typeof o=="object"?o:{};this.http=new is(p,[a!==null&&new rs(a??{}),n!==null&&new Xt(n?.middleware??{}),l!==null&&new ns(l??{}),...c??[]].filter(Boolean))}if(n!==null&&this.usersServer&&this.http){let{middleware:a,...l}=n??{};this.cookie=new Gt({...l,usersServer:this.usersServer})}return delete this.init,this};initPromise;whenReady(){return this.initPromise}static init(t){return new e(t).whenReady()}};export{nt as InSite};
1
+ import{CookieSetter as d,InSiteCookieMiddleware as m}from"insite-cookie/server";import{SubscriptionHandler as w}from"insite-subscriptions-server/ws";import{InSiteWebSocketServer as u}from"insite-ws/server";import{IncomingTransport as O,OutgoingTransport as f}from"insite-ws-transfers/node";import{connect as I}from"insite-db";import{InSiteHTTPServer as v,InSiteStaticMiddleware as g,InSiteTemplateMiddleware as b}from"insite-http";import{Users as A}from"insite-users-server";import{UsersServer as T}from"insite-users-server-ws";var a=class h{constructor(t){this.initPromise=this.init(t)}mongoClient;db;collections;wss;incomingTransport;outgoingTransport;subscriptionHandler;usersServer;users;cookie;http;init=async t=>{let{db:p,wss:S,users:n,cookie:s,http:o}=t;if(p&&({client:this.mongoClient,db:this.db,collections:this.collections}=await I(p)),S){let{subscriptions:i,incomingTransport:e,outgoingTransport:r,...l}=S;this.wss=new u(l),i!==null&&(this.subscriptionHandler=new w(this.wss,!!this.collections)),e!==null&&(e||this.collections&&n)&&(this.incomingTransport=new O(this.wss,e)),r&&(this.outgoingTransport=new f(this.wss)),process.env.NODE_ENV==="development"&&this.wss.on("client-connect",c=>console.info(`\u{1F50C} WebSocket connected with ${c.session?.user.email}`)),this.wss.on("error",c=>console.error("\u{1F50C}\u2757\uFE0F WebSocket Server:",c)),this.wss.on("close",()=>console.error("\u{1F50C}\u2757\uFE0F WebSocket Server closed"))}if(n&&this.collections){let{server:i,...e}=n;this.wss&&this.subscriptionHandler?(this.usersServer=await T.init({...i,users:e,wss:this.wss,collections:this.collections,incomingTransport:this.incomingTransport}),this.users=this.usersServer.users):this.users=await A.init(this.collections,e)}if(o){let{static:i=void 0,template:e=void 0,middlewares:r=void 0,...l}=typeof o=="object"?o:{};this.http=new v(l,[i!==null&&new g(i??{}),s!==null&&new m(s?.middleware??{}),e!==null&&new b(e??{}),...r??[]].filter(Boolean))}if(s!==null&&this.usersServer&&this.http){let{middleware:i,...e}=s??{};this.cookie=new d({...e,usersServer:this.usersServer})}return delete this.init,this};initPromise;whenReady(){return this.initPromise}static init(t){return new h(t).whenReady()}};export{a as InSite};
6
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../node_modules/@phc/format/index.js", "../node_modules/node-gyp-build/node-gyp-build.js", "../node_modules/node-gyp-build/index.js", "../node_modules/argon2/argon2.cjs", "../node_modules/eventemitter3/index.js", "../src/InSite.ts", "../node_modules/insite-users-server/src/users/Users.ts", "../node_modules/insite-users-server/src/abilities/Map.ts", "../node_modules/insite-users-server/src/orgs/Orgs.ts", "../node_modules/insite-users-server/src/orgs/Org.ts", "../node_modules/insite-users-server/src/lib/regexps.ts", "../node_modules/insite-users-server/src/orgs/schema.ts", "../node_modules/insite-users-server/src/roles/Roles.ts", "../node_modules/insite-users-server/src/roles/Role.ts", "../node_modules/insite-users-server/src/roles/schema.ts", "../node_modules/insite-users-server/src/sessions/Sessions.ts", "../node_modules/insite-users-server/src/sessions/schema.ts", "../node_modules/insite-users-server/src/sessions/Session.ts", "../node_modules/insite-users-server/src/users/avatars/schema.ts", "../node_modules/insite-users-server/src/users/avatars/Avatars.ts", "../node_modules/insite-users-server/src/users/schema.ts", "../node_modules/insite-users-server/src/users/User.ts", "../node_modules/eventemitter3/index.mjs", "../node_modules/insite-users-server/node_modules/@nesvet/n/src/_ids.ts", "../node_modules/insite-users-server/node_modules/@nesvet/n/src/noop.ts", "../node_modules/insite-users-server/node_modules/@nesvet/n/src/debounce.ts", "../node_modules/insite-users-server/node_modules/@nesvet/n/src/deleteProps.ts", "../node_modules/insite-users-server/node_modules/@nesvet/n/src/empty.ts", "../node_modules/insite-users-server/node_modules/@nesvet/n/src/EmptyArray.ts", "../node_modules/insite-users-server/node_modules/@nesvet/n/src/EmptySet.ts", "../node_modules/insite-users-server/node_modules/@nesvet/n/src/getAll.ts", "../node_modules/insite-users-server/node_modules/@nesvet/n/src/hasAny.ts", "../node_modules/insite-users-server/node_modules/@nesvet/n/src/howmuch.ts", "../node_modules/insite-users-server/node_modules/@nesvet/n/src/intersection.ts", "../node_modules/insite-users-server/node_modules/@nesvet/n/src/random.ts", "../node_modules/insite-users-server/node_modules/@nesvet/n/src/reAdd.ts", "../node_modules/insite-users-server/node_modules/@nesvet/n/src/removeAll.ts", "../node_modules/insite-users-server/node_modules/@nesvet/n/src/removeOne.ts", "../node_modules/insite-users-server/node_modules/@nesvet/n/src/sort.ts"],
4
- "sourcesContent": ["const idRegex = /^[a-z0-9-]{1,32}$/;\nconst nameRegex = /^[a-z0-9-]{1,32}$/;\nconst valueRegex = /^[a-zA-Z0-9/+.-]+$/;\nconst b64Regex = /^([a-zA-Z0-9/+.-]+|)$/;\nconst decimalRegex = /^((-)?[1-9]\\d*|0)$/;\nconst versionRegex = /^v=(\\d+)$/;\n\nfunction objToKeyVal(obj) {\n return objectKeys(obj)\n .map(k => [k, obj[k]].join('='))\n .join(',');\n}\n\nfunction keyValtoObj(str) {\n const obj = {};\n str.split(',').forEach(ps => {\n const pss = ps.split('=');\n if (pss.length < 2) {\n throw new TypeError(`params must be in the format name=value`);\n }\n\n obj[pss.shift()] = pss.join('=');\n });\n return obj;\n}\n\nfunction objectKeys(object) {\n /* istanbul ignore next */\n return Object.keys(object);\n}\n\nfunction objectValues(object) {\n /* istanbul ignore next */\n if (typeof Object.values === 'function') return Object.values(object);\n /* istanbul ignore next */\n return objectKeys(object).map(k => object[k]);\n}\n\n/**\n * Generates a PHC string using the data provided.\n * @param {Object} opts Object that holds the data needed to generate the PHC\n * string.\n * @param {string} opts.id Symbolic name for the function.\n * @param {Number} [opts.version] The version of the function.\n * @param {Object} [opts.params] Parameters of the function.\n * @param {Buffer} [opts.salt] The salt as a binary buffer.\n * @param {Buffer} [opts.hash] The hash as a binary buffer.\n * @return {string} The hash string adhering to the PHC format.\n */\nfunction serialize(opts) {\n const fields = [''];\n\n if (typeof opts !== 'object' || opts === null) {\n throw new TypeError('opts must be an object');\n }\n\n // Identifier Validation\n if (typeof opts.id !== 'string') {\n throw new TypeError('id must be a string');\n }\n\n if (!idRegex.test(opts.id)) {\n throw new TypeError(`id must satisfy ${idRegex}`);\n }\n\n fields.push(opts.id);\n\n if (typeof opts.version !== 'undefined') {\n if (\n typeof opts.version !== 'number' ||\n opts.version < 0 ||\n !Number.isInteger(opts.version)\n ) {\n throw new TypeError('version must be a positive integer number');\n }\n\n fields.push(`v=${opts.version}`);\n }\n\n // Parameters Validation\n if (typeof opts.params !== 'undefined') {\n if (typeof opts.params !== 'object' || opts.params === null) {\n throw new TypeError('params must be an object');\n }\n\n const pk = objectKeys(opts.params);\n if (!pk.every(p => nameRegex.test(p))) {\n throw new TypeError(`params names must satisfy ${nameRegex}`);\n }\n\n // Convert Numbers into Numeric Strings and Buffers into B64 encoded strings.\n pk.forEach(k => {\n if (typeof opts.params[k] === 'number') {\n opts.params[k] = opts.params[k].toString();\n } else if (Buffer.isBuffer(opts.params[k])) {\n opts.params[k] = opts.params[k].toString('base64').split('=')[0];\n }\n });\n const pv = objectValues(opts.params);\n if (!pv.every(v => typeof v === 'string')) {\n throw new TypeError('params values must be strings');\n }\n\n if (!pv.every(v => valueRegex.test(v))) {\n throw new TypeError(`params values must satisfy ${valueRegex}`);\n }\n\n const strpar = objToKeyVal(opts.params);\n fields.push(strpar);\n }\n\n if (typeof opts.salt !== 'undefined') {\n // Salt Validation\n if (!Buffer.isBuffer(opts.salt)) {\n throw new TypeError('salt must be a Buffer');\n }\n\n fields.push(opts.salt.toString('base64').split('=')[0]);\n\n if (typeof opts.hash !== 'undefined') {\n // Hash Validation\n if (!Buffer.isBuffer(opts.hash)) {\n throw new TypeError('hash must be a Buffer');\n }\n\n fields.push(opts.hash.toString('base64').split('=')[0]);\n }\n }\n\n // Create the PHC formatted string\n const phcstr = fields.join('$');\n\n return phcstr;\n}\n\n/**\n * Parses data from a PHC string.\n * @param {string} phcstr A PHC string to parse.\n * @return {Object} The object containing the data parsed from the PHC string.\n */\nfunction deserialize(phcstr) {\n if (typeof phcstr !== 'string' || phcstr === '') {\n throw new TypeError('pchstr must be a non-empty string');\n }\n\n if (phcstr[0] !== '$') {\n throw new TypeError('pchstr must contain a $ as first char');\n }\n\n const fields = phcstr.split('$');\n // Remove first empty $\n fields.shift();\n\n // Parse Fields\n let maxf = 5;\n if (!versionRegex.test(fields[1])) maxf--;\n if (fields.length > maxf) {\n throw new TypeError(\n `pchstr contains too many fileds: ${fields.length}/${maxf}`\n );\n }\n\n // Parse Identifier\n const id = fields.shift();\n if (!idRegex.test(id)) {\n throw new TypeError(`id must satisfy ${idRegex}`);\n }\n\n let version;\n // Parse Version\n if (versionRegex.test(fields[0])) {\n version = parseInt(fields.shift().match(versionRegex)[1], 10);\n }\n\n let hash;\n let salt;\n if (b64Regex.test(fields[fields.length - 1])) {\n if (fields.length > 1 && b64Regex.test(fields[fields.length - 2])) {\n // Parse Hash\n hash = Buffer.from(fields.pop(), 'base64');\n // Parse Salt\n salt = Buffer.from(fields.pop(), 'base64');\n } else {\n // Parse Salt\n salt = Buffer.from(fields.pop(), 'base64');\n }\n }\n\n // Parse Parameters\n let params;\n if (fields.length > 0) {\n const parstr = fields.pop();\n params = keyValtoObj(parstr);\n if (!objectKeys(params).every(p => nameRegex.test(p))) {\n throw new TypeError(`params names must satisfy ${nameRegex}`);\n }\n\n const pv = objectValues(params);\n if (!pv.every(v => valueRegex.test(v))) {\n throw new TypeError(`params values must satisfy ${valueRegex}`);\n }\n\n const pk = objectKeys(params);\n // Convert Decimal Strings into Numbers\n pk.forEach(k => {\n params[k] = decimalRegex.test(params[k])\n ? parseInt(params[k], 10)\n : params[k];\n });\n }\n\n if (fields.length > 0) {\n throw new TypeError(`pchstr contains unrecognized fileds: ${fields}`);\n }\n\n // Build the output object\n const phcobj = {id};\n if (version) phcobj.version = version;\n if (params) phcobj.params = params;\n if (salt) phcobj.salt = salt;\n if (hash) phcobj.hash = hash;\n\n return phcobj;\n}\n\nmodule.exports = {\n serialize,\n deserialize\n};\n", "var fs = require('fs')\nvar path = require('path')\nvar os = require('os')\n\n// Workaround to fix webpack's build warnings: 'the request of a dependency is an expression'\nvar runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line\n\nvar vars = (process.config && process.config.variables) || {}\nvar prebuildsOnly = !!process.env.PREBUILDS_ONLY\nvar abi = process.versions.modules // TODO: support old node where this is undef\nvar runtime = isElectron() ? 'electron' : (isNwjs() ? 'node-webkit' : 'node')\n\nvar arch = process.env.npm_config_arch || os.arch()\nvar platform = process.env.npm_config_platform || os.platform()\nvar libc = process.env.LIBC || (isAlpine(platform) ? 'musl' : 'glibc')\nvar armv = process.env.ARM_VERSION || (arch === 'arm64' ? '8' : vars.arm_version) || ''\nvar uv = (process.versions.uv || '').split('.')[0]\n\nmodule.exports = load\n\nfunction load (dir) {\n return runtimeRequire(load.resolve(dir))\n}\n\nload.resolve = load.path = function (dir) {\n dir = path.resolve(dir || '.')\n\n try {\n var name = runtimeRequire(path.join(dir, 'package.json')).name.toUpperCase().replace(/-/g, '_')\n if (process.env[name + '_PREBUILD']) dir = process.env[name + '_PREBUILD']\n } catch (err) {}\n\n if (!prebuildsOnly) {\n var release = getFirst(path.join(dir, 'build/Release'), matchBuild)\n if (release) return release\n\n var debug = getFirst(path.join(dir, 'build/Debug'), matchBuild)\n if (debug) return debug\n }\n\n var prebuild = resolve(dir)\n if (prebuild) return prebuild\n\n var nearby = resolve(path.dirname(process.execPath))\n if (nearby) return nearby\n\n var target = [\n 'platform=' + platform,\n 'arch=' + arch,\n 'runtime=' + runtime,\n 'abi=' + abi,\n 'uv=' + uv,\n armv ? 'armv=' + armv : '',\n 'libc=' + libc,\n 'node=' + process.versions.node,\n process.versions.electron ? 'electron=' + process.versions.electron : '',\n typeof __webpack_require__ === 'function' ? 'webpack=true' : '' // eslint-disable-line\n ].filter(Boolean).join(' ')\n\n throw new Error('No native build was found for ' + target + '\\n loaded from: ' + dir + '\\n')\n\n function resolve (dir) {\n // Find matching \"prebuilds/<platform>-<arch>\" directory\n var tuples = readdirSync(path.join(dir, 'prebuilds')).map(parseTuple)\n var tuple = tuples.filter(matchTuple(platform, arch)).sort(compareTuples)[0]\n if (!tuple) return\n\n // Find most specific flavor first\n var prebuilds = path.join(dir, 'prebuilds', tuple.name)\n var parsed = readdirSync(prebuilds).map(parseTags)\n var candidates = parsed.filter(matchTags(runtime, abi))\n var winner = candidates.sort(compareTags(runtime))[0]\n if (winner) return path.join(prebuilds, winner.file)\n }\n}\n\nfunction readdirSync (dir) {\n try {\n return fs.readdirSync(dir)\n } catch (err) {\n return []\n }\n}\n\nfunction getFirst (dir, filter) {\n var files = readdirSync(dir).filter(filter)\n return files[0] && path.join(dir, files[0])\n}\n\nfunction matchBuild (name) {\n return /\\.node$/.test(name)\n}\n\nfunction parseTuple (name) {\n // Example: darwin-x64+arm64\n var arr = name.split('-')\n if (arr.length !== 2) return\n\n var platform = arr[0]\n var architectures = arr[1].split('+')\n\n if (!platform) return\n if (!architectures.length) return\n if (!architectures.every(Boolean)) return\n\n return { name, platform, architectures }\n}\n\nfunction matchTuple (platform, arch) {\n return function (tuple) {\n if (tuple == null) return false\n if (tuple.platform !== platform) return false\n return tuple.architectures.includes(arch)\n }\n}\n\nfunction compareTuples (a, b) {\n // Prefer single-arch prebuilds over multi-arch\n return a.architectures.length - b.architectures.length\n}\n\nfunction parseTags (file) {\n var arr = file.split('.')\n var extension = arr.pop()\n var tags = { file: file, specificity: 0 }\n\n if (extension !== 'node') return\n\n for (var i = 0; i < arr.length; i++) {\n var tag = arr[i]\n\n if (tag === 'node' || tag === 'electron' || tag === 'node-webkit') {\n tags.runtime = tag\n } else if (tag === 'napi') {\n tags.napi = true\n } else if (tag.slice(0, 3) === 'abi') {\n tags.abi = tag.slice(3)\n } else if (tag.slice(0, 2) === 'uv') {\n tags.uv = tag.slice(2)\n } else if (tag.slice(0, 4) === 'armv') {\n tags.armv = tag.slice(4)\n } else if (tag === 'glibc' || tag === 'musl') {\n tags.libc = tag\n } else {\n continue\n }\n\n tags.specificity++\n }\n\n return tags\n}\n\nfunction matchTags (runtime, abi) {\n return function (tags) {\n if (tags == null) return false\n if (tags.runtime && tags.runtime !== runtime && !runtimeAgnostic(tags)) return false\n if (tags.abi && tags.abi !== abi && !tags.napi) return false\n if (tags.uv && tags.uv !== uv) return false\n if (tags.armv && tags.armv !== armv) return false\n if (tags.libc && tags.libc !== libc) return false\n\n return true\n }\n}\n\nfunction runtimeAgnostic (tags) {\n return tags.runtime === 'node' && tags.napi\n}\n\nfunction compareTags (runtime) {\n // Precedence: non-agnostic runtime, abi over napi, then by specificity.\n return function (a, b) {\n if (a.runtime !== b.runtime) {\n return a.runtime === runtime ? -1 : 1\n } else if (a.abi !== b.abi) {\n return a.abi ? -1 : 1\n } else if (a.specificity !== b.specificity) {\n return a.specificity > b.specificity ? -1 : 1\n } else {\n return 0\n }\n }\n}\n\nfunction isNwjs () {\n return !!(process.versions && process.versions.nw)\n}\n\nfunction isElectron () {\n if (process.versions && process.versions.electron) return true\n if (process.env.ELECTRON_RUN_AS_NODE) return true\n return typeof window !== 'undefined' && window.process && window.process.type === 'renderer'\n}\n\nfunction isAlpine (platform) {\n return platform === 'linux' && fs.existsSync('/etc/alpine-release')\n}\n\n// Exposed for unit tests\n// TODO: move to lib\nload.parseTags = parseTags\nload.matchTags = matchTags\nload.compareTags = compareTags\nload.parseTuple = parseTuple\nload.matchTuple = matchTuple\nload.compareTuples = compareTuples\n", "const runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line\nif (typeof runtimeRequire.addon === 'function') { // if the platform supports native resolving prefer that\n module.exports = runtimeRequire.addon.bind(runtimeRequire)\n} else { // else use the runtime version here\n module.exports = require('./node-gyp-build.js')\n}\n", "const assert = require(\"node:assert\");\nconst { randomBytes, timingSafeEqual } = require(\"node:crypto\");\nconst { promisify } = require(\"node:util\");\nconst { deserialize, serialize } = require(\"@phc/format\");\nconst gypBuild = require(\"node-gyp-build\");\n\nconst { hash: bindingsHash } = gypBuild(__dirname);\n\n/** @type {(size: number) => Promise<Buffer>} */\nconst generateSalt = promisify(randomBytes);\n\nconst argon2d = 0;\nconst argon2i = 1;\nconst argon2id = 2;\n\nmodule.exports.argon2d = argon2d;\nmodule.exports.argon2i = argon2i;\nmodule.exports.argon2id = argon2id;\n\n/** @enum {argon2i | argon2d | argon2id} */\nconst types = Object.freeze({ argon2d, argon2i, argon2id });\n\n/** @enum {'argon2d' | 'argon2i' | 'argon2id'} */\nconst names = Object.freeze({\n [types.argon2d]: \"argon2d\",\n [types.argon2i]: \"argon2i\",\n [types.argon2id]: \"argon2id\",\n});\n\nconst defaults = Object.freeze({\n hashLength: 32,\n timeCost: 3,\n memoryCost: 1 << 16,\n parallelism: 4,\n type: argon2id,\n version: 0x13,\n});\n\nconst limits = Object.freeze({\n hashLength: { min: 4, max: 2 ** 32 - 1 },\n memoryCost: { min: 1 << 10, max: 2 ** 32 - 1 },\n timeCost: { min: 2, max: 2 ** 32 - 1 },\n parallelism: { min: 1, max: 2 ** 24 - 1 },\n});\nmodule.exports.limits = limits;\n\n/**\n * @typedef {Object} Options\n * @property {number} [hashLength=32]\n * @property {number} [timeCost=3]\n * @property {number} [memoryCost=65536]\n * @property {number} [parallelism=4]\n * @property {keyof typeof names} [type=argon2id]\n * @property {number} [version=19]\n * @property {Buffer} [salt]\n * @property {Buffer} [associatedData]\n * @property {Buffer} [secret]\n */\n\n/**\n * Hashes a password with Argon2, producing a raw hash\n *\n * @overload\n * @param {Buffer | string} password The plaintext password to be hashed\n * @param {Options & { raw: true }} options The parameters for Argon2\n * @returns {Promise<Buffer>} The raw hash generated from `plain`\n */\n/**\n * Hashes a password with Argon2, producing an encoded hash\n *\n * @overload\n * @param {Buffer | string} password The plaintext password to be hashed\n * @param {Options & { raw?: boolean }} [options] The parameters for Argon2\n * @returns {Promise<string>} The encoded hash generated from `plain`\n */\n/**\n * @param {Buffer | string} password The plaintext password to be hashed\n * @param {Options & { raw?: boolean }} [options] The parameters for Argon2\n */\nasync function hash(password, options) {\n let { raw, salt, ...rest } = { ...defaults, ...options };\n\n for (const [key, { min, max }] of Object.entries(limits)) {\n const value = rest[key];\n assert(\n min <= value && value <= max,\n `Invalid ${key}, must be between ${min} and ${max}.`,\n );\n }\n\n salt = salt ?? (await generateSalt(16));\n\n const {\n hashLength,\n secret = Buffer.alloc(0),\n type,\n version,\n memoryCost: m,\n timeCost: t,\n parallelism: p,\n associatedData: data = Buffer.alloc(0),\n } = rest;\n\n const hash = await bindingsHash({\n password: Buffer.from(password),\n salt,\n secret,\n data,\n hashLength,\n m,\n t,\n p,\n version,\n type,\n });\n if (raw) {\n return hash;\n }\n\n return serialize({\n id: names[type],\n version,\n params: { m, t, p, ...(data.byteLength > 0 ? { data } : {}) },\n salt,\n hash,\n });\n}\nmodule.exports.hash = hash;\n\n/**\n * @param {string} digest The digest to be checked\n * @param {Object} [options] The current parameters for Argon2\n * @param {number} [options.timeCost=3]\n * @param {number} [options.memoryCost=65536]\n * @param {number} [options.parallelism=4]\n * @returns {boolean} `true` if the digest parameters do not match the parameters in `options`, otherwise `false`\n */\nfunction needsRehash(digest, options = {}) {\n const { memoryCost, timeCost, version } = { ...defaults, ...options };\n\n const {\n version: v,\n params: { m, t },\n } = deserialize(digest);\n\n return +v !== +version || +m !== +memoryCost || +t !== +timeCost;\n}\nmodule.exports.needsRehash = needsRehash;\n\n/**\n * @param {string} digest The digest to be checked\n * @param {Buffer | string} password The plaintext password to be verified\n * @param {Object} [options] The current parameters for Argon2\n * @param {Buffer} [options.secret]\n * @returns {Promise<boolean>} `true` if the digest parameters matches the hash generated from `plain`, otherwise `false`\n */\nasync function verify(digest, password, options = {}) {\n const { id, ...rest } = deserialize(digest);\n if (!(id in types)) {\n return false;\n }\n\n const {\n version = 0x10,\n params: { m, t, p, data = \"\" },\n salt,\n hash,\n } = rest;\n\n const { secret = Buffer.alloc(0) } = options;\n\n return timingSafeEqual(\n await bindingsHash({\n password: Buffer.from(password),\n salt,\n secret,\n data: Buffer.from(data, \"base64\"),\n hashLength: hash.byteLength,\n m: +m,\n t: +t,\n p: +p,\n version: +version,\n type: types[id],\n }),\n hash,\n );\n}\nmodule.exports.verify = verify;\n", "'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n", "import { CookieSetter, InSiteCookieMiddleware } from \"insite-cookie/server\";\nimport { SubscriptionHandler } from \"insite-subscriptions-server/ws\";\nimport { InSiteWebSocketServer } from \"insite-ws/server\";\nimport { IncomingTransport, OutgoingTransport } from \"insite-ws-transfers/node\";\nimport {\n\tconnect,\n\ttype InSiteCollections,\n\ttype InSiteDB,\n\ttype MongoClient\n} from \"insite-db\";\nimport {\n\tInSiteHTTPServer,\n\tInSiteServerMiddleware,\n\tInSiteStaticMiddleware,\n\tInSiteTemplateMiddleware\n} from \"insite-http\";\nimport { type AbilitiesSchema, Users } from \"insite-users-server\";\nimport { UsersServer, type WSSCWithUser } from \"insite-users-server-ws\";\nimport type { Optional, Options, WSS } from \"./types\";\n\n\nexport class InSite<AS extends AbilitiesSchema, O extends Options<AS>> {\n\tconstructor(options: O) {\n\t\tthis.initPromise = this.init!(options);\n\t\t\n\t}\n\t\n\tmongoClient!: MongoClient;\n\tdb!: InSiteDB;\n\tcollections!: InSiteCollections;\n\twss!: WSS<AS, O>;\n\tincomingTransport!: IncomingTransport;\n\toutgoingTransport!: OutgoingTransport;\n\tsubscriptionHandler!: SubscriptionHandler<AS>;\n\tusersServer!: UsersServer<AS>;\n\tusers!: Users<AS>;\n\tcookie!: CookieSetter<AS>;\n\thttp!: InSiteHTTPServer;\n\t\n\tprivate init? = async (options: Options<AS>) => {\n\t\t\n\t\tconst {\n\t\t\tdb: dbOptions,\n\t\t\twss: wssWithOtherOptions,\n\t\t\tusers: usersWithServerOptions,\n\t\t\tcookie: cookieWithMiddlewareOptions,\n\t\t\thttp: httpWithMiddlewareOptions\n\t\t} = options;\n\t\t\n\t\tif (dbOptions)\n\t\t\t({\n\t\t\t\tclient: this.mongoClient,\n\t\t\t\tdb: this.db,\n\t\t\t\tcollections: this.collections\n\t\t\t} = await connect(dbOptions));\n\t\t\n\t\tif (wssWithOtherOptions) {\n\t\t\tconst {\n\t\t\t\tsubscriptions,\n\t\t\t\tincomingTransport: incomingTransportOptions,\n\t\t\t\toutgoingTransport,\n\t\t\t\t...wssOptions\n\t\t\t} = wssWithOtherOptions;\n\t\t\t\n\t\t\tthis.wss = new InSiteWebSocketServer<WSSCWithUser<AS>>(wssOptions) as WSS<AS, O>;\n\t\t\t\n\t\t\tif (subscriptions !== null)\n\t\t\t\tthis.subscriptionHandler = new SubscriptionHandler(this.wss, !!this.collections);\n\t\t\t\n\t\t\tif (incomingTransportOptions !== null && (incomingTransportOptions || (this.collections && usersWithServerOptions)))\n\t\t\t\tthis.incomingTransport = new IncomingTransport(this.wss, incomingTransportOptions);\n\t\t\t\n\t\t\tif (outgoingTransport)\n\t\t\t\tthis.outgoingTransport = new OutgoingTransport(this.wss);\n\t\t\t\n\t\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\t\tthis.wss.on(\"client-connect\", wssc => console.info(`\uD83D\uDD0C WebSocket connected with ${wssc.session?.user.email}`));\n\t\t\t\n\t\t\tthis.wss.on(\"error\", (error: Error) => console.error(\"\uD83D\uDD0C\u2757\uFE0F WebSocket Server:\", error));\n\t\t\tthis.wss.on(\"close\", () => console.error(\"\uD83D\uDD0C\u2757\uFE0F WebSocket Server closed\"));\n\t\t}\n\t\t\n\t\tif (usersWithServerOptions && this.collections) {\n\t\t\tconst { server: usersServerOptions, ...usersOptions } = usersWithServerOptions;\n\t\t\t\n\t\t\tif (this.wss && this.subscriptionHandler) {\n\t\t\t\tthis.usersServer = await UsersServer.init({\n\t\t\t\t\t...usersServerOptions,\n\t\t\t\t\tusers: usersOptions,\n\t\t\t\t\twss: this.wss,\n\t\t\t\t\tcollections: this.collections,\n\t\t\t\t\tincomingTransport: this.incomingTransport\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tthis.users = this.usersServer.users;\n\t\t\t} else\n\t\t\t\tthis.users = await Users.init(this.collections, usersOptions);\n\t\t}\n\t\t\n\t\tif (httpWithMiddlewareOptions) {\n\t\t\tconst {\n\t\t\t\tstatic: staticMiddlewareOptions = undefined, // eslint-disable-line unicorn/no-useless-undefined\n\t\t\t\ttemplate: templateMiddlewareOptions = undefined, // eslint-disable-line unicorn/no-useless-undefined\n\t\t\t\tmiddlewares = undefined, // eslint-disable-line unicorn/no-useless-undefined\n\t\t\t\t...httpOptions\n\t\t\t} = typeof httpWithMiddlewareOptions == \"object\" ? httpWithMiddlewareOptions : {};\n\t\t\t\n\t\t\tthis.http = new InSiteHTTPServer(httpOptions, [\n\t\t\t\tstaticMiddlewareOptions !== null && new InSiteStaticMiddleware(staticMiddlewareOptions ?? {}),\n\t\t\t\tcookieWithMiddlewareOptions !== null && new InSiteCookieMiddleware(cookieWithMiddlewareOptions?.middleware ?? {}),\n\t\t\t\ttemplateMiddlewareOptions !== null && new InSiteTemplateMiddleware(templateMiddlewareOptions ?? {}),\n\t\t\t\t...middlewares ?? []\n\t\t\t].filter(Boolean) as InSiteServerMiddleware[]);\n\t\t}\n\t\t\n\t\tif (cookieWithMiddlewareOptions !== null && this.usersServer && this.http) {\n\t\t\tconst {\n\t\t\t\tmiddleware: _,\n\t\t\t\t...cookieOptions\n\t\t\t} = cookieWithMiddlewareOptions ?? {};\n\t\t\t\n\t\t\tthis.cookie = new CookieSetter<AS>({\n\t\t\t\t...cookieOptions,\n\t\t\t\tusersServer: this.usersServer\n\t\t\t});\n\t\t}\n\t\t\n\t\tdelete this.init;\n\t\t\n\t\treturn this;\n\t};\n\t\n\tprivate initPromise;\n\t\n\twhenReady() {\n\t\treturn this.initPromise;\n\t}\n\t\n\t\n\tstatic init<IO extends Options<any>>(options: IO) { // eslint-disable-line @typescript-eslint/no-explicit-any\n\t\ttype IAS = IO extends Options<infer EIAS> ? EIAS : never;\n\t\t\n\t\treturn (new InSite(options)).whenReady() as Promise<Optional<InSite<IAS, IO>, IO, IAS>>;\n\t}\n\t\n}\n", "import * as argon2 from \"argon2\";\nimport EventEmitter from \"eventemitter3\";\nimport {\n\t_ids,\n\tdebounce,\n\tdeleteProps,\n\tremoveAll\n} from \"@nesvet/n\";\nimport {\n\tInSiteCollectionIndexes,\n\tInSiteCollections,\n\tInSiteCollectionSchema,\n\tInSiteWatchedCollection,\n\tnewObjectIdString\n} from \"insite-db\";\nimport { AbilitiesMap } from \"../abilities\";\nimport { Orgs } from \"../orgs\";\nimport { Org } from \"../orgs/Org\";\nimport { Roles } from \"../roles\";\nimport { Sessions } from \"../sessions\";\nimport { Session } from \"../sessions/Session\";\nimport type { AbilitiesSchema } from \"../abilities/types\";\nimport type { OrgsOptions } from \"../orgs/types\";\nimport type { RolesOptions } from \"../roles/types\";\nimport type { SessionDoc, SessionsOptions } from \"../sessions/types\";\nimport { Avatars/* , AvatarsOptions */ } from \"./avatars\";\nimport { basisSchema } from \"./schema\";\nimport { User } from \"./User\";\nimport type { UserDoc } from \"./types\";\n\n\nconst indexes: InSiteCollectionIndexes = [\n\t[ { email: 1 }, { unique: true } ],\n\t[ { org: 1 } ]\n];\n\n\nexport type Options<AS> = {\n\tabilities: AS;\n\tindexes?: InSiteCollectionIndexes;\n\tschema?: InSiteCollectionSchema;\n\tinitialRoot?: Partial<UserDoc>;\n\troles?: RolesOptions;\n\torgs?: OrgsOptions;\n\tsessions?: SessionsOptions;\n\t// avatars?: AvatarsOptions;\n};\n\n\nexport class Users<AS extends AbilitiesSchema = AbilitiesSchema> extends Map<string, User<AS>> {\n\tconstructor(collections: InSiteCollections, options: Options<AS>) {\n\t\tsuper();\n\t\t\n\t\tconst eventEmitter = new EventEmitter() as {\n\t\t\t_events: Record<string, object>;\n\t\t\t_eventsCount: number;\n\t\t} & EventEmitter;\n\t\tthis._events = eventEmitter._events;\n\t\tthis._eventsCount = eventEmitter._eventsCount;\n\t\tthis.emit = eventEmitter.emit;\n\t\tthis.on = eventEmitter.on;\n\t\tthis.once = eventEmitter.once;\n\t\tthis.addListener = eventEmitter.addListener;\n\t\tthis.off = eventEmitter.off;\n\t\tthis.removeListener = eventEmitter.removeListener;\n\t\t\n\t\tthis.collections = collections;\n\t\t\n\t\tthis.abilitiesMap = new AbilitiesMap<AS>(options.abilities);\n\t\t\n\t\tthis.initOptions = options;\n\t\t\n\t\tthis.initPromise = this.init!();\n\t\t\n\t}\n\t\n\t_events;\n\t_eventsCount;\n\temit;\n\ton;\n\tonce;\n\taddListener;\n\toff;\n\tremoveListener;\n\t\n\tprivate initOptions?;\n\t\n\tcollections;\n\tabilitiesMap;\n\t\n\tcollection!: InSiteWatchedCollection<UserDoc>;\n\troles!: Roles<AS>;\n\tsessions!: Sessions<AS>;\n\torgs!: Orgs<AS>;\n\tavatars!: Avatars<AS>;\n\t\n\tisInited = false;\n\t\n\tbyEmail = new Map();\n\tbySessionId = new Map();\n\tsorted: User<AS>[] = [];\n\t\n\tisSortRequired = false;\n\t\n\tload(userDoc: UserDoc) {\n\t\tnew User<AS>(this, userDoc);\n\t\t\n\t}\n\t\n\tsort() {\n\t\t\n\t\tthis.isSortRequired = false;\n\t\t\n\t\tthis.sorted = [ ...this.values() ].sort((a, b) => a.name.last > b.name.last ? 1 : a.name.last < b.name.last ? -1 : 0);\n\t\t\n\t}\n\t\n\tsortDebounced = debounce(() => this.sort(), 250);\n\t\n\tupdate(shouldUpdateRoles?: boolean) {\n\t\tif (shouldUpdateRoles)\n\t\t\tfor (const user of this.values())\n\t\t\t\tuser.updateRoles();\n\t\t\n\t\tfor (const user of this.values())\n\t\t\tuser.updatePermissions();\n\t\t\n\t\tif (this.isSortRequired)\n\t\t\tthis.sort();\n\t\t\n\t}\n\t\n\tupdateDebounced = debounce(() => this.update(), 250);\n\t\n\tpreinit? = async () => {\n\t\t\n\t\tconst {\n\t\t\tindexes: customIndexes,\n\t\t\tschema: customSchema,\n\t\t\tinitialRoot: initialRootProps\n\t\t\t// avatars: avatarsOptions\n\t\t} = this.initOptions!;\n\t\t\n\t\tif (customSchema) {\n\t\t\tif (customSchema.required)\n\t\t\t\tremoveAll(customSchema.required as string[], basisSchema.required as string[]);\n\t\t\tif (customSchema.properties)\n\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t}\n\t\t\n\t\tconst jsonSchema = {\n\t\t\t...basisSchema,\n\t\t\t...customSchema,\n\t\t\trequired: [ ...basisSchema.required as string [], ...customSchema?.required as string[] ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\tthis.collection = await this.collections.ensure<UserDoc>(\"users\", { jsonSchema });\n\t\t\n\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\n\t\tif (!await this.collection.countDocuments({ roles: \"root\" }))\n\t\t\tawait this.new({\n\t\t\t\temail: process.env.INSITE_ROOT_EMAIL ?? \"insite@root.email\",\n\t\t\t\tpassword: process.env.INSITE_ROOT_PASSWORD ?? \"inSiteRootPassword\",\n\t\t\t\troles: [ \"root\" ],\n\t\t\t\tname: { first: \"Root\" },\n\t\t\t\torg: null,\n\t\t\t\tjob: \"Root\",\n\t\t\t\t...initialRootProps && deleteProps(initialRootProps, [ \"roles\", \"org\" ])\n\t\t\t});\n\t\t\n\t\t\n\t\tfor (const userDoc of await this.collection.find().toArray())\n\t\t\tthis.load(userDoc);\n\t\t\n\t\tdelete this.preinit;\n\t\t\n\t};\n\t\n\tprivate initPromise;\n\t\n\tprivate init? = async () => {\n\t\t\n\t\tthis.isInited = true;\n\t\t\n\t\tconst {\n\t\t\troles: rolesOptions,\n\t\t\torgs: orgsOptions,\n\t\t\tsessions: sessionsOptions\n\t\t// avatars: avatarsOptions\n\t\t} = this.initOptions!;\n\t\t\n\t\tthis.roles = new Roles<AS>(this, rolesOptions);\n\t\tthis.orgs = new Orgs<AS>(this, orgsOptions);\n\t\tthis.sessions = new Sessions<AS>(this, sessionsOptions);\n\t\tthis.avatars = new Avatars<AS>(this/* , avatarsOptions */);\n\t\t\n\t\tawait this.roles.init!();\n\t\tawait this.orgs.preinit!();\n\t\tawait this.preinit!();\n\t\tawait this.orgs.init!();\n\t\tawait this.avatars.init!();\n\t\t\n\t\tthis.update(true);\n\t\t\n\t\tthis.collection.changeListeners.add(next => {\n\t\t\tswitch (next.operationType) {\n\t\t\t\tcase \"insert\":\n\t\t\t\t\tnew User<AS>(this, next.fullDocument);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"update\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tawait this.sessions.init!();\n\t\t\n\t\tdelete this.initOptions;\n\t\tdelete this.init;\n\t\t\n\t\treturn this;\n\t};\n\t\n\twhenReady() {\n\t\treturn this.initPromise;\n\t}\n\t\n\tasync new({ email, password, roles, name, org, job, ...restProps }: Omit<UserDoc, \"_id\" | \"createdAt\">) {\n\t\tif (this.byEmail.has(email))\n\t\t\tthrow new Error(\"User exists\");\n\t\t\n\t\tawait this.collection.insertOne({\n\t\t\t_id: newObjectIdString(),\n\t\t\temail,\n\t\t\tpassword: await argon2.hash(password),\n\t\t\troles: this.isInited ? this.roles.cleanUpIds(roles) : roles,\n\t\t\tname: {\n\t\t\t\tfirst: name.first ?? \"\",\n\t\t\t\tmiddle: name.middle ?? \"\",\n\t\t\t\tlast: name.last ?? \"\"\n\t\t\t},\n\t\t\torg: org ?? null,\n\t\t\tjob: job ?? \"\",\n\t\t\t...deleteProps(restProps, [ \"_id\" ]),\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t\t\n\t\treturn true;\n\t}\n\t\n\tasync changePassword(_id: string, newPassword: string) {\n\t\tif (!this.has(_id))\n\t\t\tthrow new Error(\"usernotfound\");\n\t\t\n\t\tif (!newPassword)\n\t\t\tthrow new Error(\"emptypasswordisnotallowed\");\n\t\t\n\t\tawait Promise.all([\n\t\t\tthis.collection.updateOne({ _id }, { $set: { password: await argon2.hash(newPassword) } }),\n\t\t\tthis.sessions.collection.deleteMany({ user: _id })\n\t\t]);\n\t\t\n\t}\n\t\n\tasync login(email: string, password: string, sessionProps: Partial<SessionDoc>) {\n\t\tconst user = this.byEmail.get(email);\n\t\t\n\t\tif (!user)\n\t\t\tthrow new Error(\"usernotfound\");\n\t\t\n\t\tif (!await argon2.verify(user.password, password))\n\t\t\tthrow new Error(\"incorrectpassword\");\n\t\t\n\t\tif (!user.abilities.login)\n\t\t\tthrow new Error(\"userisnotabletologin\");\n\t\t\n\t\treturn this.sessions.new(user, sessionProps);\n\t}\n\t\n\tlogout(session: Session<AS>) {\n\t\tsession.delete();\n\t\t\n\t\treturn this.sessions.collection.deleteOne({ _id: session._id });\n\t}\n\t\n\tprivate sortUsersAndOrgs(a: Org<AS> | User<AS>, b: Org<AS> | User<AS>) {\n\t\treturn (\n\t\t\t(a instanceof User && b instanceof User) ?\n\t\t\t\t(a.name.last && b.name.last) ?\n\t\t\t\t\ta.name.last > b.name.last ?\n\t\t\t\t\t\t1 :\n\t\t\t\t\t\ta.name.last < b.name.last ? -1 : 0 :\n\t\t\t\t\t(!a.name.last && !b.name.last) ?\n\t\t\t\t\t\ta.displayLabel > b.displayLabel ?\n\t\t\t\t\t\t\t1 :\n\t\t\t\t\t\t\ta.displayLabel < b.displayLabel ? -1 : 0 :\n\t\t\t\t\t\ta.name.last ? -1 : 1 :\n\t\t\t\t(a instanceof Org && b instanceof Org) ?\n\t\t\t\t\ta.title > b.title ?\n\t\t\t\t\t\t1 :\n\t\t\t\t\t\ta.title < b.title ? -1 : 0 :\n\t\t\t\t\ta instanceof Org ? -1 : 1\n\t\t);\n\t}\n\t\n\tsortIds(ids: string[]) {\n\t\treturn _ids((\n\t\t\tids\n\t\t\t\t.map(_id => this.get(_id) || this.orgs.get(_id))\n\t\t\t\t.filter(Boolean) as (Org<AS> | User<AS>)[]\n\t\t).sort(this.sortUsersAndOrgs));\n\t}\n\t\n\treplaceMap = new Map<string, string>();\n\t\n\treplaceHandlers = new Set<(fromId: string, toId: null | string) => Promise<void> | void>();\n\t\n\tasync replace(fromId: string) {\n\t\tconst toId = this.replaceMap.get(fromId) ?? null;\n\t\tif (toId)\n\t\t\tthis.replaceMap.delete(fromId);\n\t\t\n\t\tfor (const handler of this.replaceHandlers)\n\t\t\tawait handler(fromId, toId);\n\t\t\n\t}\n\t\n\t\n\tstatic init<IAS extends AbilitiesSchema>(collections: InSiteCollections, options: Options<IAS>) {\n\t\tconst users = new Users(collections, options);\n\t\t\n\t\treturn users.whenReady();\n\t}\n\t\n}\n", "import type { User } from \"../users/User\";\nimport type {\n\tAbilitiesSchema,\n\tAbility,\n\tAbilityParamItems,\n\tAbilityParamItemSchema,\n\tAbilityParamNumber,\n\tAbilitySchema,\n\tAbilityWithParams,\n\tGenericAbilities\n} from \"./types\";\n\n\nexport class AbilitiesMap<AS extends AbilitiesSchema = AbilitiesSchema> extends Map<string, AbilitySchema> {\n\tconstructor(schema: AbilitiesSchema) {\n\t\tsuper();\n\t\t\n\t\tthis.schema = schema;\n\t\t\n\t\tthis.parse(this.schema);\n\t\t\n\t}\n\t\n\tschema;\n\t\n\tprivate parse(list: AbilitiesSchema) {\n\t\tfor (const ability of list) {\n\t\t\tthis.set(ability._id, ability);\n\t\t\tif (ability.subAbilities)\n\t\t\t\tthis.parse(ability.subAbilities);\n\t\t}\n\t\t\n\t}\n\t\n\tmerge(target: GenericAbilities, source: GenericAbilities) {\n\t\tfor (const [ abilityId, ability ] of Object.entries(source)) {\n\t\t\tconst schema = this.get(abilityId);\n\t\t\tif (schema) {\n\t\t\t\tif (schema.isInheritable !== false && ability)\n\t\t\t\t\tif (!(abilityId in target))\n\t\t\t\t\t\ttarget[abilityId] = structuredClone(ability);\n\t\t\t\t\telse if (schema.params) {\n\t\t\t\t\t\tconst targetAbility = target[abilityId] as AbilityWithParams;\n\t\t\t\t\t\tconst sourceAbility = ability as AbilityWithParams;\n\t\t\t\t\t\tfor (const param of schema.params)\n\t\t\t\t\t\t\tif (param.isInheritable !== false && param._id in sourceAbility)\n\t\t\t\t\t\t\t\tif (!(param._id in targetAbility))\n\t\t\t\t\t\t\t\t\ttargetAbility[param._id] = structuredClone(sourceAbility[param._id]);\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (param.type === \"number\") {\n\t\t\t\t\t\t\t\t\t\tif ((targetAbility[param._id] as AbilityParamNumber) < (sourceAbility[param._id] as AbilityParamNumber))\n\t\t\t\t\t\t\t\t\t\t\ttargetAbility[param._id] = sourceAbility[param._id];\n\t\t\t\t\t\t\t\t\t} else if (param.type === \"items\") {\n\t\t\t\t\t\t\t\t\t\tconst targetItems = targetAbility[param._id] as AbilityParamItems;\n\t\t\t\t\t\t\t\t\t\tfor (const itemId of sourceAbility[param._id] as AbilityParamItems)\n\t\t\t\t\t\t\t\t\t\t\tif (!targetItems.includes(itemId))\n\t\t\t\t\t\t\t\t\t\t\t\ttargetItems.push(itemId);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t} else\n\t\t\t\tdelete source[abilityId];\n\t\t}\n\t\t\n\t\treturn target;\n\t}\n\t\n\tgetMinimumOf(_id: string) {\n\t\tconst schema = this.get(_id);\n\t\tif (schema?.params) {\n\t\t\tconst ability: Ability = {};\n\t\t\tfor (const param of schema.params)\n\t\t\t\tif (param.type === \"number\")\n\t\t\t\t\tability[param._id] = param.min ?? 0;\n\t\t\t\telse if (param.type === \"items\")\n\t\t\t\t\tability[param._id] = [];\n\t\t\t\n\t\t\treturn ability;\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tgetMaximum() {\n\t\treturn [ ...this.values() ].reduce((abilities: GenericAbilities, schema: AbilitySchema) => {\n\t\t\tif (schema.params) {\n\t\t\t\tconst ability: Ability = {};\n\t\t\t\tfor (const param of schema.params)\n\t\t\t\t\tif (param.type === \"number\")\n\t\t\t\t\t\tability[param._id] = param.max ?? 0;\n\t\t\t\t\telse if (param.type === \"items\")\n\t\t\t\t\t\tability[param._id] = param.items.map(item => item._id);\n\t\t\t\t\n\t\t\t\tabilities[schema._id] = ability;\n\t\t\t} else\n\t\t\t\tabilities[schema._id as keyof typeof abilities] = true;\n\t\t\t\n\t\t\treturn abilities;\n\t\t}, {});\n\t}\n\t\n\tgetSchemeFor(user: User<AS>) {\n\t\treturn (function resolve(abilitiesSchema: AbilitySchema[]) {\n\t\t\tfor (let i = 0; i < abilitiesSchema.length; i++) {\n\t\t\t\tconst schema = abilitiesSchema[i];\n\t\t\t\tconst userAbility = user.abilities[schema._id as keyof typeof user.abilities];\n\t\t\t\tif (userAbility) {\n\t\t\t\t\tif (schema.params)\n\t\t\t\t\t\tfor (const param of schema.params) {\n\t\t\t\t\t\t\tconst userParam = (userAbility as AbilityWithParams)[param._id];\n\t\t\t\t\t\t\tif (param.type === \"number\") {\n\t\t\t\t\t\t\t\tif (\"max\" in param)\n\t\t\t\t\t\t\t\t\tparam.max = userParam as number;\n\t\t\t\t\t\t\t} else if (param.type === \"items\")\n\t\t\t\t\t\t\t\tfor (let j = 0; j < param.items.length; j++)\n\t\t\t\t\t\t\t\t\tif (!(userParam as AbilityParamItems).includes(param.items[j]._id))\n\t\t\t\t\t\t\t\t\t\t(param.items as AbilityParamItemSchema[]).splice(j--, 1);\n\t\t\t\t\t\t}\n\t\t\t\t\tif (schema.subAbilities)\n\t\t\t\t\t\tresolve(schema.subAbilities as AbilitySchema[]);\n\t\t\t\t} else\n\t\t\t\t\tabilitiesSchema.splice(i--, 1);\n\t\t\t}\n\t\t\t\n\t\t\treturn abilitiesSchema;\n\t\t})(structuredClone(this.schema) as AbilitySchema[]);\n\t}\n\t\n}\n", "import {\n\tdebounce,\n\tdeleteProps,\n\tEmptyArray,\n\tEmptySet,\n\tremoveAll,\n\tsort\n} from \"@nesvet/n\";\nimport { InSiteCollectionIndexes, InSiteWatchedCollection, newObjectIdString } from \"insite-db\";\nimport { Users } from \"../users\";\nimport type { AbilitiesSchema } from \"../abilities/types\";\nimport { Org } from \"./Org\";\nimport { basisSchema } from \"./schema\";\nimport { OrgDoc, OrgsOptions } from \"./types\";\n\n\nconst indexes: InSiteCollectionIndexes = [\n\t[ { owners: 1 } ]\n];\n\nfunction preventDirectDelete() {\n\tthrow new Error(\"Direct usage of orgs collection.deleteOne or .deleteMany is forbidden. Use orgs.collectionDelete instead.\");\n}\n\n\nexport class Orgs<AS extends AbilitiesSchema = AbilitiesSchema> extends Map<string, Org<AS>> {\n\tconstructor(users: Users<AS>, options: OrgsOptions = {}) {\n\t\tsuper();\n\t\t\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\t\n\t\tthis.preinitOptions = options;\n\t\t\n\t}\n\t\n\tusers;\n\tcollections;\n\tpreinitOptions?;\n\t\n\tcollection!: {\n\t\t/** @deprecated Direct usage of roles collection.deleteOne is forbidden. Use orgs.collectionDelete instead. */\n\t\tdeleteOne: typeof preventDirectDelete;\n\t\t\n\t\t/** @deprecated Direct usage of roles collection.deleteMany is forbidden. Use orgs.collectionDelete instead. */\n\t\tdeleteMany: typeof preventDirectDelete;\n\t} & InSiteWatchedCollection<OrgDoc>;\n\t\n\tnull!: { _id: null } & Org<AS>;\n\t\n\tload(orgDoc: OrgDoc) {\n\t\tnew Org<AS>(this, orgDoc);\n\t\t\n\t}\n\t\n\tprivate resolve(org: Org<AS>, slaveOrgs: Org<AS>[]) {\n\t\tslaveOrgs = [ org, ...slaveOrgs ];\n\t\t\n\t\tfor (const ownerOrg of org.ownerOrgs) {\n\t\t\tthis.resolve(ownerOrg, slaveOrgs);\n\t\t\tfor (const slaveOrg of slaveOrgs)\n\t\t\t\townerOrg.slaveOrgs.add(slaveOrg);\n\t\t}\n\t\t\n\t}\n\t\n\tsorted: Org<AS>[] = [];\n\t\n\tupdate() {\n\t\t\n\t\tconst array = [ ...this.values() ];\n\t\tconst sorted = [];\n\t\t\n\t\tfor (const org of array) {\n\t\t\torg.ownerOrgs.clear();\n\t\t\torg.ownerUsers.clear();\n\t\t\torg.slaveOrgs.clear();\n\t\t\t\n\t\t\tfor (const ownerId of org.ownerIds) {\n\t\t\t\tconst ownerOrg = this.get(ownerId);\n\t\t\t\tif (ownerOrg)\n\t\t\t\t\torg.ownerOrgs.add(ownerOrg);\n\t\t\t\telse {\n\t\t\t\t\tconst ownerUser = this.users.get(ownerId);\n\t\t\t\t\tif (ownerUser)\n\t\t\t\t\t\torg.ownerUsers.add(ownerUser);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (!org.ownerOrgs.size && org._id)\n\t\t\t\tsorted.push(org);\n\t\t}\n\t\t\n\t\tfor (const org of array)\n\t\t\tif (!array.some(anotherOrg => anotherOrg.ownerOrgs.has(org)))\n\t\t\t\tthis.resolve(org, []);\n\t\t\n\t\tsorted.sort(this.sortOrgs);\n\t\tfor (const org of array)\n\t\t\tsort(org.slaveOrgs, this.sortOrgs);\n\t\t\n\t\tfor (let i = 0; i < sorted.length; i++) {\n\t\t\tconst org = sorted[i];\n\t\t\tfor (const slaveOrg of [ ...org.slaveOrgs ].reverse())\n\t\t\t\tif (slaveOrg.ownerOrgs.has(org)) {\n\t\t\t\t\tconst slaveOrgIndex = sorted.indexOf(slaveOrg);\n\t\t\t\t\tif (~slaveOrgIndex) {\n\t\t\t\t\t\tsorted.splice(slaveOrgIndex, 1);\n\t\t\t\t\t\ti--;\n\t\t\t\t\t}\n\t\t\t\t\tsorted.splice(i + 1, 0, slaveOrg);\n\t\t\t\t}\n\t\t}\n\t\tfor (let { length } = sorted, o = 0; o < length;)\n\t\t\tsorted[o]._o = o++;\n\t\t\n\t\tthis.sorted = sorted;\n\t\t\n\t\tthis.users.emit(\"orgs-update\");\n\t\t\n\t\tif (this.users.isInited) {\n\t\t\tthis.users.updateDebounced.clear();\n\t\t\tthis.users.update();\n\t\t}\n\t\t\n\t}\n\t\n\tprivate sortOrgs(a: Org<AS>, b: Org<AS>) {\n\t\treturn (\n\t\t\t(b.slaveOrgs.size - a.slaveOrgs.size) || (\n\t\t\t\ta.title > b.title ?\n\t\t\t\t\t1 :\n\t\t\t\t\ta.title < b.title ?\n\t\t\t\t\t\t-1 :\n\t\t\t\t\t\t0\n\t\t\t)\n\t\t);\n\t}\n\t\n\tupdateDebounced = debounce(this.update, 250);\n\t\n\tpreinit? = async () => {\n\t\t\n\t\tconst {\n\t\t\tschema: customSchema,\n\t\t\tindexes: customIndexes,\n\t\t\tnull: nullProps\n\t\t} = this.preinitOptions!;\n\t\t\n\t\tif (customSchema) {\n\t\t\tif (customSchema.required)\n\t\t\t\tremoveAll(customSchema.required as string [], basisSchema.required as string[]);\n\t\t\tif (customSchema.properties)\n\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t}\n\t\t\n\t\tconst jsonSchema = {\n\t\t\t...basisSchema,\n\t\t\t...customSchema,\n\t\t\trequired: [ ...basisSchema.required as string[], ...customSchema?.required as string[] ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\tthis.collection = Object.assign(\n\t\t\tawait this.collections.ensure<OrgDoc>(\"orgs\", { jsonSchema }),\n\t\t\t{\n\t\t\t\tdeleteOne: preventDirectDelete,\n\t\t\t\tdeleteMany: preventDirectDelete\n\t\t\t}\n\t\t);\n\t\t\n\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\n\t\tthis.null = Object.assign(\n\t\t\tnew Org<AS>(this, {\n\t\t\t\t...nullProps,\n\t\t\t\t_id: \"\",\n\t\t\t\ttitle: \"\",\n\t\t\t\tnote: \"\",\n\t\t\t\towners: [],\n\t\t\t\tcreatedAt: Date.now()\n\t\t\t}),\n\t\t\t{\n\t\t\t\t_id: null,\n\t\t\t\townerIds: new EmptyArray(),\n\t\t\t\townerOrgs: new EmptySet(),\n\t\t\t\townerUsers: new EmptySet(),\n\t\t\t\tslaveOrgs: new EmptySet()\n\t\t\t}\n\t\t);\n\t\t\n\t\tfor (const orgDoc of await this.collection.find().toArray())\n\t\t\tthis.load(orgDoc);\n\t\t\n\t\tdelete this.preinitOptions;\n\t\tdelete this.preinit;\n\t\t\n\t};\n\t\n\tinit? = async () => {\n\t\t\n\t\tawait this.update();\n\t\t\n\t\tthis.collection.changeListeners.add(next => {\n\t\t\tswitch (next.operationType) {\n\t\t\t\tcase \"insert\": {\n\t\t\t\t\tconst org = new Org<AS>(this, next.fullDocument);\n\t\t\t\t\tthis.users.emit(\"orgs-org-update\", org, next);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument, next);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"update\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!, next);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t\t\tthis.users.emit(\"orgs-org-update\", null, next);\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tdelete this.init;\n\t\t\n\t};\n\t\n\tnew({ title, note, ...restProps }: Omit<OrgDoc, \"_id\" | \"createdAt\" | \"owners\">, ownerId: string) {\n\t\treturn this.collection.insertOne({\n\t\t\t_id: newObjectIdString(),\n\t\t\ttitle: title ?? \"\",\n\t\t\tnote: note ?? \"\",\n\t\t\towners: ownerId ? [ ownerId ] : [],\n\t\t\t...deleteProps(restProps, [ \"_id\", \"owners\" ]),\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t}\n\t\n\tcollectionDelete(org: Org<AS> | string) {\n\t\tconst _id = typeof org == \"string\" ? org : org._id;\n\t\t\n\t\treturn this.collection.bulkWrite([\n\t\t\t{ updateMany: { filter: { owners: _id }, update: { $pullAll: { owners: [ _id ] } } } },\n\t\t\t{ deleteOne: { filter: { _id } } }\n\t\t]);\n\t}\n\t\n\treplaceMap = new Map<string, string>();\n\t\n\treplaceHandlers = new Set<(fromId: string, toId: null | string) => Promise<void> | void>();\n\t\n\tasync replace(fromId: string) {\n\t\tconst toId = this.replaceMap.get(fromId) ?? null;\n\t\tif (toId)\n\t\t\tthis.replaceMap.delete(fromId);\n\t\t\n\t\tfor (const handler of this.replaceHandlers)\n\t\t\tawait handler(fromId, toId);\n\t\t\n\t}\n\t\n}\n", "import type { ChangeStreamDocument } from \"insite-db\";\nimport { User } from \"../users/User\";\nimport type { AbilitiesSchema } from \"../abilities/types\";\nimport type { Orgs } from \"./Orgs\";\nimport type { OrgDoc } from \"./types\";\n\nconst snapshots = new Map();\n\n\nexport class Org<AS extends AbilitiesSchema = AbilitiesSchema> {\n\tconstructor(orgs: Orgs<AS>, orgDoc: OrgDoc) {\n\t\tthis.orgs = orgs;\n\t\t\n\t\tthis._id = orgDoc._id;\n\t\torgs.set(this._id, this);\n\t\t\n\t\tthis.update(orgDoc);\n\t\t\n\t}\n\t\n\t_id;\n\ttitle = \"\";\n\tinitials = \"\";\n\tdisplayLabel = \"\";\n\t\n\t_o = 0;\n\t\n\torgs;\n\t\n\tisOrg = true;\n\t\n\townerOrgs = new Set<Org<AS>>();\n\townerUsers = new Set<User<AS>>();\n\t\n\tusers = new Set<User<AS>>();\n\t\n\tslaveOrgs = new Set<Org<AS>>();\n\t\n\townerIds: string[] = [];\n\t\n\tupdate({ _id, title, owners: ownerIds, ...restProps }: Partial<OrgDoc>, next?: ChangeStreamDocument<OrgDoc>) {\n\t\t\n\t\tObject.assign(this, restProps);\n\t\t\n\t\tif (title !== undefined) {\n\t\t\tthis.title = title;\n\t\t\tthis.initials = title?.[0]?.toUpperCase() ?? \"\";\n\t\t\tthis.displayLabel = title;\n\t\t}\n\t\t\n\t\tif (ownerIds) {\n\t\t\tthis.ownerIds = ownerIds;\n\t\t\t\n\t\t\t\n\t\t\tconst snapshot = this.ownerIds.join(\",\");\n\t\t\t\n\t\t\tif (snapshot !== snapshots.get(this._id)) {\n\t\t\t\tsnapshots.set(this._id, snapshot);\n\t\t\t\t\n\t\t\t\tif (this.orgs.users.isInited)\n\t\t\t\t\tthis.orgs.updateDebounced();\n\t\t\t\t\n\t\t\t\tthis.orgs.users.emit(\"orgs-org-update\", this, next);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tdelete() {\n\t\t\n\t\tthis.orgs.delete(this._id);\n\t\t\n\t\tsnapshots.delete(this._id);\n\t\t\n\t\tthis.orgs.replace(this._id);\n\t\t\n\t\tthis.orgs.updateDebounced();\n\t\t\n\t}\n\t\n}\n", "export const regexps = {\n\t_id: /^[\\dA-Fa-f]{24}$/,\n\temail: /^[^\\s@]{1,63}@[^\\s@]{1,63}\\.[^\\s@]{1,63}$/,\n\targon2: /^\\$argon2(?:i|d|id)\\$v=\\d+\\$m=\\d+,t=\\d+,p=\\d+(?:\\$[\\d+/A-Za-z]+){2}$/,\n\tsessionId: /^[\\dA-Fa-f]{16,32}\\$[\\dA-Fa-f]{16,32}$/,\n\trole: /^[\\d_a-z-]{1,64}$/,\n\tip: /^(?:\\d{1,3}\\.){3}\\d{1,3}$/\n};\n", "import { InSiteCollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: InSiteCollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"title\",\n\t\t\"note\",\n\t\t\"owners\",\n\t\t\"createdAt\"\n\t],\n\tproperties: {\n\t\t_id: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps._id.source\n\t\t},\n\t\ttitle: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 512\n\t\t},\n\t\tnote: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 131072\n\t\t},\n\t\towners: {\n\t\t\tbsonType: \"array\",\n\t\t\tuniqueItems: true,\n\t\t\titems: {\n\t\t\t\tbsonType: \"string\",\n\t\t\t\tpattern: regexps._id.source\n\t\t\t},\n\t\t\tadditionalItems: false\n\t\t},\n\t\tcreatedAt: {\n\t\t\tbsonType: \"number\"\n\t\t}\n\t},\n\tadditionalProperties: false\n};\n", "import {\n\tdebounce,\n\tdeleteProps,\n\tgetAll,\n\tintersection,\n\treAdd,\n\tremoveAll\n} from \"@nesvet/n\";\nimport type { InSiteCollectionIndexes, InSiteWatchedCollection } from \"insite-db\";\nimport type { AbilitiesSchema, GenericAbilities } from \"../abilities/types\";\nimport type { Users } from \"../users\";\nimport { Role } from \"./Role\";\nimport { basisSchema } from \"./schema\";\nimport type { RoleDoc, RolesOptions } from \"./types\";\n\n\nconst indexes: InSiteCollectionIndexes = [\n\t[ { involves: 1 } ]\n];\n\nfunction preventDirectDelete() {\n\tthrow new Error(\"Direct usage of roles collection.deleteOne or .deleteMany is forbidden. Use roles.collectionDelete instead.\");\n}\n\n\nexport class Roles<AS extends AbilitiesSchema = AbilitiesSchema> extends Map<string, Role<AS>> {\n\tconstructor(users: Users<AS>, options: RolesOptions = {}) {\n\t\tsuper();\n\t\t\n\t\tconst {\n\t\t\troot: rootProps,\n\t\t\t...initOptions\n\t\t} = options;\n\t\t\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\tthis.abilitiesMap = users.abilitiesMap;\n\t\t\n\t\tthis.root = new Role<AS>(this, {\n\t\t\t...rootProps,\n\t\t\t_id: \"root\",\n\t\t\tinvolves: [],\n\t\t\tabilities: this.abilitiesMap.getMaximum(),\n\t\t\ttitle: \"Root\",\n\t\t\tdescription: \"Root\",\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t\t\n\t\tthis.initOptions = initOptions;\n\t\t\n\t}\n\t\n\tusers;\n\tcollections;\n\tcollection!: {\n\t\t/** @deprecated Direct usage of roles collection.deleteOne is forbidden. Use roles.collectionDelete instead. */\n\t\tdeleteOne: typeof preventDirectDelete;\n\t\t\n\t\t/** @deprecated Direct usage of roles collection.deleteMany is forbidden. Use roles.collectionDelete instead. */\n\t\tdeleteMany: typeof preventDirectDelete;\n\t} & InSiteWatchedCollection<RoleDoc>;\n\t\n\tabilitiesMap;\n\troot;\n\tinitOptions?;\n\t\n\tload(roleDoc: RoleDoc) {\n\t\tnew Role<AS>(this, roleDoc);\n\t\t\n\t}\n\t\n\tresolve(role: Role<AS>, involvedBy: Role<AS>[]) {\n\t\tinvolvedBy = [ role, ...involvedBy ];\n\t\t\n\t\tfor (const involvedRoleId of role.ownInvolveIds) {\n\t\t\tconst involvedRole = this.get(involvedRoleId);\n\t\t\tif (involvedRole) {\n\t\t\t\tfor (const involvedByRole of involvedBy) {\n\t\t\t\t\treAdd(involvedByRole.involves, involvedRole);\n\t\t\t\t\tthis.abilitiesMap.merge(involvedByRole.inheritedAbilities as GenericAbilities, involvedRole.abilities as GenericAbilities);\n\t\t\t\t}\n\t\t\t\tif (involvedRole !== role)\n\t\t\t\t\tthis.resolve(involvedRole, involvedBy);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tsorted: Role<AS>[] = [];\n\t\n\tprivate sortRoles(a: Role<AS>, b: Role<AS>) {\n\t\treturn (\n\t\t\t(b.involves.size - a.involves.size) || (\n\t\t\t\t(a.title && b.title) ?\n\t\t\t\t\ta.title > b.title ? 1 : a.title < b.title ? -1 : 0 :\n\t\t\t\t\ta.title ?\n\t\t\t\t\t\t-1 :\n\t\t\t\t\t\tb.title ?\n\t\t\t\t\t\t\t1 :\n\t\t\t\t\t\t\ta._id > b._id ?\n\t\t\t\t\t\t\t\t1 :\n\t\t\t\t\t\t\t\ta._id < b._id ?\n\t\t\t\t\t\t\t\t\t-1 :\n\t\t\t\t\t\t\t\t\t0\n\t\t\t\t\n\t\t\t)\n\t\t);\n\t}\n\t\n\tupdate() {\n\t\t\n\t\tconst array = [ ...this.values() ];\n\t\t\n\t\tthis.root.ownInvolveIds = [];\n\t\tfor (const role of array) {\n\t\t\tif (role !== this.root && !array.some(anotherRole => anotherRole.ownInvolveIds.includes(role._id)))\n\t\t\t\tthis.root.ownInvolveIds.push(role._id);\n\t\t\trole.involves.clear();\n\t\t\trole.abilities = structuredClone(role.ownAbilities);\n\t\t\trole.inheritedAbilities = {};\n\t\t}\n\t\t\n\t\tthis.root.involves.add(this.root);\n\t\tthis.resolve(this.root, []);\n\t\t\n\t\tfor (const role of array)\n\t\t\trole.ownInvolves = getAll(this, role.ownInvolveIds, true).sort(this.sortRoles).reverse();\n\t\t\n\t\tconst sorted = [ this.root ];\n\t\t\n\t\tfor (let i = 0; i < sorted.length; i++) {\n\t\t\tconst role = sorted[i];\n\t\t\tfor (const involvedRole of role.ownInvolves) {\n\t\t\t\tconst involvedRoleIndex = sorted.indexOf(involvedRole);\n\t\t\t\tif (~involvedRoleIndex) {\n\t\t\t\t\tsorted.splice(involvedRoleIndex, 1);\n\t\t\t\t\ti--;\n\t\t\t\t}\n\t\t\t\tsorted.splice(i + 1, 0, involvedRole);\n\t\t\t}\n\t\t}\n\t\t\n\t\tlet _o = 0;\n\t\tfor (const role of sorted) {\n\t\t\tthis.abilitiesMap.merge(role.abilities as GenericAbilities, role.inheritedAbilities as GenericAbilities);\n\t\t\trole._o = _o++;\n\t\t}\n\t\t\n\t\tthis.sorted = sorted;\n\t\t\n\t\tthis.users.emit(\"roles-update\");\n\t\t\n\t\tif (this.users.isInited) {\n\t\t\tthis.users.updateDebounced.clear();\n\t\t\tthis.users.update(true);\n\t\t}\n\t\t\n\t}\n\t\n\tupdateDebounced = debounce(this.update, 250);\n\t\n\tinit? = async () => {\n\t\t\n\t\tconst {\n\t\t\tschema: customSchema,\n\t\t\tindexes: customIndexes\n\t\t} = this.initOptions!;\n\t\t\n\t\tif (customSchema) {\n\t\t\tif (customSchema.required)\n\t\t\t\tremoveAll(customSchema.required as string[], basisSchema.required as string[]);\n\t\t\tif (customSchema.properties)\n\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t}\n\t\t\n\t\tconst jsonSchema = {\n\t\t\t...basisSchema,\n\t\t\t...customSchema,\n\t\t\trequired: [ ...basisSchema.required as string[], ...customSchema?.required as string[] ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\tthis.collection = Object.assign(\n\t\t\tawait this.collections.ensure<RoleDoc>(\"roles\", { jsonSchema }),\n\t\t\t{\n\t\t\t\tdeleteOne: preventDirectDelete,\n\t\t\t\tdeleteMany: preventDirectDelete\n\t\t\t}\n\t\t);\n\t\t\n\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\n\t\tfor (const roleDoc of await this.collection.find().toArray())\n\t\t\tthis.load(roleDoc);\n\t\t\n\t\tawait this.update();\n\t\t\n\t\tthis.collection.changeListeners.add(next => {\n\t\t\tswitch (next.operationType) {\n\t\t\t\tcase \"insert\": {\n\t\t\t\t\tconst role = new Role<AS>(this, next.fullDocument);\n\t\t\t\t\tthis.users.emit(\"roles-role-update\", role, next);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument, next);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"update\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!, next);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t\t\tthis.users.emit(\"roles-role-update\", null, next);\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tdelete this.initOptions;\n\t\tdelete this.init;\n\t\t\n\t};\n\t\n\tnew({ _id, involves, title, description, ...restProps }: Omit<RoleDoc, \"abilities\" | \"createdAt\">) {\n\t\treturn this.collection.insertOne({\n\t\t\t_id,\n\t\t\tinvolves: involves || [],\n\t\t\tabilities: {},\n\t\t\ttitle: title ?? \"\",\n\t\t\tdescription: description ?? \"\",\n\t\t\t...deleteProps(restProps, [ \"abilities\" ]),\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t}\n\t\n\tcollectionDelete(role: Role<AS> | string) {\n\t\tconst _id = typeof role == \"string\" ? role : role._id;\n\t\t\n\t\treturn this.collection.bulkWrite([\n\t\t\t{ updateMany: { filter: { involves: _id }, update: { $pullAll: { involves: [ _id ] } } } },\n\t\t\t{ deleteOne: { filter: { _id } } }\n\t\t]);\n\t}\n\t\n\tcleanUpIds(ids: string[]) {\n\t\tconst roles = intersection(this.sorted, getAll(this, ids, true));\n\t\t\n\t\tconst cleanedUpIds = [];\n\t\t\n\t\tfor (const role of roles)\n\t\t\tif (roles.every(anotherRole => anotherRole === role || !anotherRole.involves.has(role)))\n\t\t\t\tcleanedUpIds.push(role._id);\n\t\t\n\t\treturn cleanedUpIds;\n\t}\n\t\n}\n", "import type { ChangeStreamDocument } from \"insite-db\";\nimport type { Abilities, AbilitiesSchema } from \"../abilities/types\";\nimport { Roles } from \"./Roles\";\nimport { RoleDoc } from \"./types\";\n\nconst snapshots = new Map();\n\n\nexport class Role<AS extends AbilitiesSchema = AbilitiesSchema> {\n\tconstructor(roles: Roles<AS>, roleDoc: RoleDoc) {\n\t\tthis.roles = roles;\n\t\t\n\t\tthis._id = roleDoc._id;\n\t\troles.set(this._id, this);\n\t\t\n\t\tthis.update(roleDoc);\n\t\t\n\t}\n\t\n\tprivate roles;\n\t\n\t_id;\n\townInvolveIds!: string[];\n\townAbilities!: Abilities<AS>;\n\ttitle = \"\";\n\tdisplayTitle = \"\";\n\t_o = 0;\n\t\n\townInvolves: Role<AS>[] = [];\n\tinvolves = new Set<Role<AS>>();\n\tabilities: Abilities<AS> = {};\n\tinheritedAbilities: Abilities<AS> = {};\n\t\n\tupdate({ _id, involves: ownInvolveIds, abilities: ownAbilities, title, ...restProps }: Partial<RoleDoc>, next?: ChangeStreamDocument<RoleDoc>) {\n\t\t\n\t\tObject.assign(this, restProps);\n\t\t\n\t\tif (ownInvolveIds)\n\t\t\tthis.ownInvolveIds = ownInvolveIds;\n\t\t\n\t\tif (ownAbilities)\n\t\t\tthis.ownAbilities = ownAbilities as Abilities<AS>;\n\t\t\n\t\tif (title !== undefined) {\n\t\t\tthis.title = title;\n\t\t\tthis.displayTitle = title || this._id;\n\t\t}\n\t\t\n\t\t\n\t\tif (ownInvolveIds || ownAbilities) {\n\t\t\tconst snapshot = [\n\t\t\t\tthis.ownInvolveIds.join(\",\"),\n\t\t\t\tJSON.stringify(this.ownAbilities)\n\t\t\t].join(\"\\n\");\n\t\t\t\n\t\t\tif (snapshot !== snapshots.get(this._id)) {\n\t\t\t\tsnapshots.set(this._id, snapshot);\n\t\t\t\t\n\t\t\t\tif (this.roles.users.isInited)\n\t\t\t\t\tthis.roles.updateDebounced();\n\t\t\t\t\n\t\t\t\tthis.roles.users.emit(\"roles-role-update\", this, next);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tdelete() {\n\t\t\n\t\tthis.roles.delete(this._id);\n\t\t\n\t\tsnapshots.delete(this._id);\n\t\t\n\t\tthis.roles.updateDebounced();\n\t\t\n\t}\n\t\n}\n", "import { InSiteCollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: InSiteCollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"involves\",\n\t\t\"abilities\",\n\t\t\"title\",\n\t\t\"description\",\n\t\t\"createdAt\"\n\t],\n\tproperties: {\n\t\t_id: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.role.source,\n\t\t\tnot: { enum: [ \"root\" ] }\n\t\t},\n\t\tinvolves: {\n\t\t\tbsonType: \"array\",\n\t\t\tuniqueItems: true,\n\t\t\titems: {\n\t\t\t\tbsonType: \"string\",\n\t\t\t\tpattern: regexps.role.source,\n\t\t\t\tnot: { enum: [ \"root\" ] }\n\t\t\t},\n\t\t\tadditionalItems: false\n\t\t},\n\t\tabilities: {\n\t\t\tbsonType: \"object\"\n\t\t},\n\t\ttitle: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 256\n\t\t},\n\t\tdescription: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 10240\n\t\t},\n\t\tcreatedAt: {\n\t\t\tbsonType: \"number\"\n\t\t}\n\t},\n\tadditionalProperties: false\n};\n", "import crypto from \"node:crypto\";\nimport { deleteProps, random, removeAll } from \"@nesvet/n\";\nimport { InSiteCollectionIndexes, InSiteWatchedCollection } from \"insite-db\";\nimport { User } from \"../users/User\";\nimport type { AbilitiesSchema } from \"../abilities/types\";\nimport type { Users } from \"../users\";\nimport { basisSchema } from \"./schema\";\nimport { Session } from \"./Session\";\nimport { SessionDoc, SessionsOptions } from \"./types\";\n\n\nconst expireAfterSeconds = 3600 * 24 * 7;\n\nconst indexes: InSiteCollectionIndexes = [\n\t[ { user: 1 } ],\n\t[ { expiresAt: 1 }, { expireAfterSeconds } ]\n];\n\n\nexport class Sessions<AS extends AbilitiesSchema = AbilitiesSchema> extends Map<string, Session<AS>> {\n\tconstructor(users: Users<AS>, options: SessionsOptions = {}) {\n\t\tsuper();\n\t\t\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\t\n\t\tthis.initOptions = options;\n\t}\n\t\n\tusers;\n\tcollections;\n\t\n\tinitOptions?;\n\t\n\tcollection!: {\n\t\texpireAfterSeconds: number;\n\t} & InSiteWatchedCollection<SessionDoc>;\n\t\n\tisInited = false;\n\t\n\tuid() {\n\t\t\n\t\tlet _id;\n\t\tdo\n\t\t\t_id = `${crypto.randomBytes(random(8, 16)).toString(\"hex\")}$${crypto.randomBytes(random(8, 16)).toString(\"hex\")}`;\n\t\twhile (this.has(_id));\n\t\t\n\t\treturn _id;\n\t}\n\t\n\tload(sessionDoc: SessionDoc) {\n\t\tnew Session<AS>(this, sessionDoc);\n\t\t\n\t}\n\t\n\tinit? = async () => {\n\t\t\n\t\tconst {\n\t\t\tschema: customSchema,\n\t\t\tindexes: customIndexes\n\t\t} = this.initOptions!;\n\t\t\n\t\tif (customSchema) {\n\t\t\tif (customSchema.required)\n\t\t\t\tremoveAll(customSchema.required as string[], basisSchema.required as string[]);\n\t\t\tif (customSchema.properties)\n\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t}\n\t\t\n\t\tconst jsonSchema = {\n\t\t\t...basisSchema,\n\t\t\t...customSchema,\n\t\t\trequired: [ ...basisSchema.required as string[], ...customSchema?.required as string[] ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\tthis.collection = Object.assign(\n\t\t\tawait this.collections.ensure<SessionDoc>(\"sessions\", { jsonSchema }),\n\t\t\t{\n\t\t\t\texpireAfterSeconds\n\t\t\t}\n\t\t);\n\t\t\n\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\n\t\tawait this.collection.updateMany({ isOnline: true }, { $set: { isOnline: false } });\n\t\t\n\t\tfor (const sessionDoc of await this.collection.find().toArray())\n\t\t\tthis.load(sessionDoc);\n\t\t\n\t\tthis.collection.changeListeners.add(next => {\n\t\t\tswitch (next.operationType) {\n\t\t\t\tcase \"insert\":\n\t\t\t\t\tif (!this.has(next.documentKey._id))\n\t\t\t\t\t\tnew Session<AS>(this, next.fullDocument);\n\t\t\t\t\t\n\t\t\t\t\tthis.users.get(next.fullDocument.user)?.trimSessions();\n\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"update\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.isInited = true;\n\t\t\n\t\tdelete this.initOptions;\n\t\tdelete this.init;\n\t\t\n\t};\n\t\n\tasync new(user: User<AS>, props: Partial<SessionDoc>) {\n\t\t\n\t\tconst ts = Date.now();\n\t\t\n\t\tconst sessionDoc: SessionDoc = {\n\t\t\tuserAgent: \"\",\n\t\t\tremoteAddress: \"127.0.0.1\",\n\t\t\tisOnline: true,\n\t\t\t...props,\n\t\t\t_id: this.uid(),\n\t\t\tuser: user._id,\n\t\t\tcreatedAt: ts,\n\t\t\tprolongedAt: ts,\n\t\t\texpiresAt: new Date(ts + (expireAfterSeconds * 1000))\n\t\t};\n\t\t\n\t\t/* new Session(\u2026) before await insertOne(\u2026) for avoid changeStream insert event to come earlier and create the session duplicate */\n\t\tconst session = new Session<AS>(this, sessionDoc);\n\t\t\n\t\tawait this.collection.insertOne(sessionDoc);\n\t\t\n\t\treturn session;\n\t}\n\t\n}\n", "import { InSiteCollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: InSiteCollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"user\",\n\t\t\"remoteAddress\",\n\t\t\"isOnline\",\n\t\t\"createdAt\",\n\t\t\"prolongedAt\",\n\t\t\"expiresAt\"\n\t],\n\tproperties: {\n\t\t_id: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.sessionId.source\n\t\t},\n\t\tuser: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps._id.source\n\t\t},\n\t\tuserAgent: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 4096\n\t\t},\n\t\tremoteAddress: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.ip.source\n\t\t},\n\t\tisOnline: {\n\t\t\tbsonType: \"bool\"\n\t\t},\n\t\tcreatedAt: {\n\t\t\tbsonType: \"number\"\n\t\t},\n\t\tprolongedAt: {\n\t\t\tbsonType: \"number\"\n\t\t},\n\t\texpiresAt: {\n\t\t\tbsonType: \"date\"\n\t\t}\n\t},\n\tadditionalProperties: false\n};\n", "import type { AbilitiesSchema } from \"../abilities/types\";\nimport type { User } from \"../users/User\";\nimport type { Sessions } from \"./Sessions\";\nimport type { SessionDoc } from \"./types\";\n\n\nexport class Session<AS extends AbilitiesSchema = AbilitiesSchema> {\n\tconstructor(sessions: Sessions<AS>, sessionDoc: SessionDoc) {\n\t\tconst user = sessions.users.get(sessionDoc.user);\n\t\t\n\t\tif (user) {\n\t\t\tthis.sessions = sessions;\n\t\t\t\n\t\t\tthis._id = sessionDoc._id;\n\t\t\tthis.sessions.set(this._id, this);\n\t\t\t\n\t\t\tthis.user = user;\n\t\t\tthis.user.sessions.add(this);\n\t\t\t\n\t\t\tthis.sessions.users.bySessionId.set(this._id, this.user);\n\t\t\t\n\t\t\tthis.update(sessionDoc);\n\t\t} else\n\t\t\tsessions.collection.deleteOne({ _id: sessionDoc._id });\n\t\t\n\t}\n\t\n\t_id!: string;\n\tuser!: User<AS>;\n\tisOnline = false;\n\t\n\tuserAgent!: string;\n\tremoteAddress!: string;\n\tcreatedAt!: number;\n\tprolongedAt!: number;\n\texpiresAt!: Date;\n\t\n\tprivate sessions!: Sessions<AS>;\n\t\n\tupdate({ _id, user, isOnline, ...restProps }: Partial<SessionDoc>) {\n\t\t\n\t\tif (isOnline !== undefined && this.isOnline !== isOnline) {\n\t\t\tthis.isOnline = isOnline;\n\t\t\t\n\t\t\tif (this.sessions.isInited && this.user.isOnline !== this.isOnline)\n\t\t\t\tthis.user.updateIsOnline();\n\t\t}\n\t\t\n\t\tObject.assign(this, restProps);\n\t\t\n\t}\n\t\n\tprolong({ _id, user, ...updates }: Partial<SessionDoc>) {\n\t\t\n\t\tconst ts = Date.now();\n\t\t\n\t\tupdates.prolongedAt = ts;\n\t\tupdates.expiresAt = new Date(ts + (this.sessions.collection.expireAfterSeconds * 1000));\n\t\t\n\t\tthis.update(updates);\n\t\t\n\t\treturn this.sessions.collection.updateOne({ _id: this._id }, { $set: updates });\n\t}\n\t\n\toffline() {\n\t\t\n\t\tconst updates = { isOnline: false };\n\t\t\n\t\tthis.update(updates);\n\t\t\n\t\treturn this.sessions.collection.updateOne({ _id: this._id }, { $set: updates });\n\t}\n\t\n\tdelete() {\n\t\t\n\t\tthis.sessions.delete(this._id);\n\t\tthis.user.sessions.delete(this);\n\t\tthis.sessions.users.bySessionId.delete(this._id);\n\t\t\n\t\tthis.sessions.users.emit(\"session-delete\", this);\n\t\t\n\t\tif (this.isOnline)\n\t\t\tthis.user.updateIsOnline();\n\t\t\n\t}\n\t\n}\n", "import { InSiteCollectionSchema } from \"insite-db\";\nimport { regexps } from \"../../lib\";\n\n\nexport const schema: InSiteCollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"type\",\n\t\t\"size\",\n\t\t\"ts\",\n\t\t\"data\"\n\t],\n\tproperties: {\n\t\t_id: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps._id.source\n\t\t},\n\t\ttype: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 256\n\t\t},\n\t\tsize: {\n\t\t\tbsonType: \"number\"\n\t\t},\n\t\tts: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 10\n\t\t},\n\t\tdata: {\n\t\t\tbsonType: \"binData\"\n\t\t}\n\t},\n\tadditionalProperties: false\n};\n", "import { InSiteWatchedCollection } from \"insite-db\";\nimport type { AbilitiesSchema } from \"../../abilities/types\";\nimport type { Users } from \"../Users\";\nimport { schema as jsonSchema } from \"./schema\";\nimport type { AvatarDoc } from \"./types\";\n// import { AvatarsOptions } from \"./types\";\n\n\nexport class Avatars<AS extends AbilitiesSchema = AbilitiesSchema> {\n\tconstructor(users: Users<AS>/* , options: AvatarsOptions = {} */) {\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\t\n\t}\n\t\n\tusers;\n\tcollections;\n\t\n\tcollection!: InSiteWatchedCollection<AvatarDoc>;\n\t\n\tinit? = async () => {\n\t\t\n\t\tthis.collection = await this.collections.ensure<AvatarDoc>(\"users.avatars\", { jsonSchema });\n\t\t\n\t\tdelete this.init;\n\t\t\n\t};\n\t\n}\n", "import { InSiteCollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: InSiteCollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"email\",\n\t\t\"password\",\n\t\t\"roles\",\n\t\t\"name\",\n\t\t\"org\",\n\t\t\"job\",\n\t\t\"createdAt\"\n\t],\n\tproperties: {\n\t\t_id: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps._id.source\n\t\t},\n\t\temail: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.email.source\n\t\t},\n\t\tpassword: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.argon2.source\n\t\t},\n\t\troles: {\n\t\t\tbsonType: \"array\",\n\t\t\tuniqueItems: true,\n\t\t\titems: {\n\t\t\t\tbsonType: \"string\",\n\t\t\t\tpattern: regexps.role.source\n\t\t\t},\n\t\t\tadditionalItems: false\n\t\t},\n\t\tname: {\n\t\t\tbsonType: \"object\",\n\t\t\trequired: [\n\t\t\t\t\"first\",\n\t\t\t\t\"middle\",\n\t\t\t\t\"last\"\n\t\t\t],\n\t\t\tproperties: {\n\t\t\t\tfirst: {\n\t\t\t\t\tbsonType: \"string\",\n\t\t\t\t\tmaxLength: 512\n\t\t\t\t},\n\t\t\t\tmiddle: {\n\t\t\t\t\tbsonType: \"string\",\n\t\t\t\t\tmaxLength: 512\n\t\t\t\t},\n\t\t\t\tlast: {\n\t\t\t\t\tbsonType: \"string\",\n\t\t\t\t\tmaxLength: 512\n\t\t\t\t}\n\t\t\t},\n\t\t\tadditionalProperties: false\n\t\t},\n\t\torg: {\n\t\t\toneOf: [\n\t\t\t\t{\n\t\t\t\t\tbsonType: \"string\",\n\t\t\t\t\tpattern: regexps._id.source\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbsonType: \"null\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tjob: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 512\n\t\t},\n\t\tavatar: {\n\t\t\toneOf: [\n\t\t\t\t{\n\t\t\t\t\tbsonType: \"string\",\n\t\t\t\t\tmaxLength: 10\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbsonType: \"null\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tcreatedAt: {\n\t\t\tbsonType: \"number\"\n\t\t}\n\t},\n\tadditionalProperties: false\n};\n", "import {\n\t_ids,\n\tdebounce,\n\tempty,\n\thasAny,\n\tremoveOne\n} from \"@nesvet/n\";\nimport type { Abilities, AbilitiesSchema, GenericAbilities } from \"../abilities/types\";\nimport type { Org } from \"../orgs/Org\";\nimport type { Role } from \"../roles/Role\";\nimport type { Session } from \"../sessions/Session\";\nimport type { UserDoc } from \"./types\";\nimport type { Users } from \"./Users\";\n\n\nconst rolesSnapshots = new Map();\nconst permissionsSnapshots = new Map();\n\nconst staticUrl = process.env.INSITE_STATIC_URL ?? \"http://localhost:8080\";\n\n\nexport class User<AS extends AbilitiesSchema = AbilitiesSchema> {\n\tconstructor(users: Users<AS>, userDoc: UserDoc) {\n\t\tthis.users = users;\n\t\t\n\t\tthis._id = userDoc._id;\n\t\tusers.set(this._id, this);\n\t\t\n\t\tthis.update(userDoc);\n\t\t\n\t\tif (users.isInited)\n\t\t\tusers.emit(\"user-create\", this);\n\t\t\n\t}\n\t\n\t_id;\n\temail!: string;\n\tname = {\n\t\tfirst: \"\",\n\t\tmiddle: \"\",\n\t\tlast: \"\"\n\t};\n\t\n\tinitials = \"\";\n\tdisplayLabel = \"\";\n\torg!: Org<AS>;\n\tjob: string = \"\";\n\tavatar: null | string = null;\n\tavatarUrl: null | string = null;\n\t\n\tprivate users;\n\t\n\tisUser = true;\n\tisRoot?: boolean;\n\t\n\troles = new Set<Role<AS>>();\n\townRoles: Role<AS>[] = [];\n\townRoleIds: string[] = [];\n\tslaveRoles = new Set<Role<AS>>();\n\tslaveRoleIds: string[] = [];\n\tabilities: Abilities<AS> = {};\n\t\n\tslaveOrgs = new Set<Org<AS>>();\n\tslaveUsers = new Set<User<AS>>();\n\tslaves = new Set<Org<AS> | User<AS>>();\n\t\n\tslaveIds: string[] = [];\n\tpermissiveIds: string[] = [];\n\t\n\tsessions = new Set<Session<AS>>();\n\t\n\tisOnline = false;\n\t\n\tupdate({ _id, name, email, roles: ownRoleIds, org: orgId, avatar, ...restProps }: Partial<UserDoc>) {\n\t\t\n\t\tObject.assign(this, restProps);\n\t\t\n\t\tlet isEmailUpdated;\n\t\tif (email && this.email !== email) {\n\t\t\tthis.users.byEmail.delete(this.email);\n\t\t\tthis.email = email;\n\t\t\tthis.users.byEmail.set(email, this);\n\t\t\tisEmailUpdated = true;\n\t\t}\n\t\t\n\t\tlet isNameUpdated;\n\t\tlet isLastNameUpdated;\n\t\tif (name && (this.name.first !== name.first || this.name.middle !== name.middle || this.name.last !== name.last)) {\n\t\t\tisLastNameUpdated = this.name.last !== name.last;\n\t\t\tthis.name = {\n\t\t\t\tfirst: name.first ?? \"\",\n\t\t\t\tmiddle: name.middle ?? \"\",\n\t\t\t\tlast: name.last ?? \"\"\n\t\t\t};\n\t\t\tthis.initials = (((name.first?.[0] ?? \"\") + (name.last?.[0] ?? \"\")) || this.email[0]).toUpperCase();\n\t\t\tisNameUpdated = true;\n\t\t}\n\t\t\n\t\tif (isEmailUpdated || isNameUpdated)\n\t\t\tthis.displayLabel = `${this.name.first} ${this.name.last}`.trim() || this.name.middle || this.email;\n\t\t\n\t\tlet isRolesUpdated;\n\t\tif (ownRoleIds) {\n\t\t\tthis.ownRoleIds = ownRoleIds;\n\t\t\t\n\t\t\tconst snapshot = this.ownRoleIds.join(\",\");\n\t\t\t\n\t\t\tif (snapshot !== rolesSnapshots.get(this._id)) {\n\t\t\t\trolesSnapshots.set(this._id, snapshot);\n\t\t\t\tthis.updateRoles();\n\t\t\t\tisRolesUpdated = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tlet isOrgUpdated;\n\t\tif (orgId !== undefined && this.org?._id !== orgId) {\n\t\t\tthis.org?.users.delete(this);\n\t\t\tthis.org = orgId && this.users.orgs.get(orgId) || this.users.orgs.null;\n\t\t\tthis.org.users.add(this);\n\t\t\tisOrgUpdated = true;\n\t\t}\n\t\t\n\t\tif (avatar !== undefined && this.avatar !== avatar) {\n\t\t\tthis.avatar = avatar;\n\t\t\tthis.avatarUrl = avatar && `${staticUrl}/avatars/${this._id}-${avatar}.webp`;\n\t\t}\n\t\t\n\t\tif (isRolesUpdated || isOrgUpdated) {\n\t\t\tthis.updatePermissions();\n\t\t\t\n\t\t\tif (isLastNameUpdated)\n\t\t\t\tthis.users.isSortRequired = true;\n\t\t\t\n\t\t\tif (this.users.isInited)\n\t\t\t\tthis.users.updateDebounced();\n\t\t\t\n\t\t} else if (isLastNameUpdated)\n\t\t\tthis.users.sortDebounced();\n\t\t\n\t}\n\t\n\tupdateRoles() {\n\t\t\n\t\tif (this.users.isInited) {\n\t\t\tthis.ownRoles = [];\n\t\t\tthis.roles.clear();\n\t\t\tthis.slaveRoles.clear();\n\t\t\tempty(this.abilities);\n\t\t\t\n\t\t\tfor (const roleId of this.ownRoleIds) {\n\t\t\t\tconst role = this.users.roles.get(roleId);\n\t\t\t\tif (role) {\n\t\t\t\t\t\n\t\t\t\t\tthis.ownRoles.push(role);\n\t\t\t\t\tthis.roles.add(role);\n\t\t\t\t\tfor (const involvedRole of role.involves) {\n\t\t\t\t\t\tthis.roles.add(involvedRole);\n\t\t\t\t\t\tthis.slaveRoles.add(involvedRole);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tthis.slaveRoleIds = _ids(this.slaveRoles);\n\t\t\t\t\t\n\t\t\t\t\tthis.users.abilitiesMap.merge(this.abilities as GenericAbilities, role.abilities as GenericAbilities);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (this.roles.has(this.users.roles.root))\n\t\t\t\tthis.isRoot = true;\n\t\t\t\n\t\t\tthis.trimSessions();\n\t\t}\n\t\t\n\t}\n\t\n\tupdatePermissions() {\n\t\t\n\t\tif (this.users.isInited) {\n\t\t\tthis.slaveOrgs.clear();\n\t\t\tthis.slaveUsers.clear();\n\t\t\tthis.slaves.clear();\n\t\t\tconst slaveIds = new Set<string>();\n\t\t\t\n\t\t\tfor (const org of this.users.orgs.sorted)\n\t\t\t\tif ((org.ownerUsers.has(this) || this.isRoot) && !this.slaveOrgs.has(org)) {\n\t\t\t\t\tthis.slaveOrgs.add(org);\n\t\t\t\t\tthis.slaves.add(org);\n\t\t\t\t\tslaveIds.add(org._id);\n\t\t\t\t\tfor (const slaveOrg of org.slaveOrgs) {\n\t\t\t\t\t\tthis.slaveOrgs.add(slaveOrg);\n\t\t\t\t\t\tthis.slaves.add(slaveOrg);\n\t\t\t\t\t\tslaveIds.add(slaveOrg._id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\tfor (const org of new Set([ this.org, ...this.slaveOrgs, this.users.orgs.null ]))\n\t\t\t\tfor (const user of org.users)\n\t\t\t\t\tif (user !== this && (hasAny(this.slaveRoles, user.ownRoles) || !user.ownRoles.length)) {\n\t\t\t\t\t\tthis.slaveUsers.add(user);\n\t\t\t\t\t\tthis.slaves.add(user);\n\t\t\t\t\t\tslaveIds.add(user._id);\n\t\t\t\t\t}\n\t\t\t\n\t\t\tthis.slaveIds = [ ...slaveIds ];\n\t\t\t\n\t\t\tconst permissiveOrgIds = [];\n\t\t\tif (this.org._id) {\n\t\t\t\tpermissiveOrgIds.push(this.org._id);\n\t\t\t\tfor (const slaveOrg of this.org.slaveOrgs)\n\t\t\t\t\tif (!this.slaveOrgs.has(slaveOrg))\n\t\t\t\t\t\tpermissiveOrgIds.push(slaveOrg._id);\n\t\t\t}\n\t\t\t\n\t\t\tthis.permissiveIds = [ ...permissiveOrgIds, this._id, ...slaveIds ];\n\t\t\t\n\t\t\t\n\t\t\tconst snapshot = [\n\t\t\t\tthis.permissiveIds.join(\",\"),\n\t\t\t\tthis.ownRoleIds.join(\",\"),\n\t\t\t\tJSON.stringify(this.abilities),\n\t\t\t\tthis.slaveRoleIds.join(\",\")\n\t\t\t].join(\"\\n\");\n\t\t\t\n\t\t\tif (snapshot !== permissionsSnapshots.get(this._id)) {\n\t\t\t\tpermissionsSnapshots.set(this._id, snapshot);\n\t\t\t\t\n\t\t\t\tthis.users.emit(\"user-permissions-change\", this);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\ttrimSessions() {\n\t\t\n\t\tconst sessionsLimit = ((this.abilities as { login?: { sessionsLimit: number } }).login)?.sessionsLimit ?? 0;\n\t\t\n\t\tif (this.sessions.size > sessionsLimit)\n\t\t\treturn this.users.sessions.collection.deleteMany({\n\t\t\t\t_id: {\n\t\t\t\t\t$in: _ids(\n\t\t\t\t\t\t[ ...this.sessions ]\n\t\t\t\t\t\t\t.sort((a, b) => a.expiresAt.valueOf() - b.expiresAt.valueOf())\n\t\t\t\t\t\t\t.slice(0, this.sessions.size - sessionsLimit)\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t});\n\t\t\n\t\treturn null;\n\t}\n\t\n\tupdateIsOnline = debounce(() => {\n\t\t\n\t\tlet isOnline = false;\n\t\t\n\t\tfor (const session of this.sessions)\n\t\t\tif (session.isOnline) {\n\t\t\t\tisOnline = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\tif (this.isOnline !== isOnline) {\n\t\t\tthis.isOnline = isOnline;\n\t\t\tthis.users.emit(\"user-is-online\", this);\n\t\t}\n\t\t\n\t}, 500);\n\t\n\tdelete() {\n\t\t\n\t\tthis.org.users.delete(this);\n\t\t\n\t\tthis.users.delete(this._id);\n\t\tthis.users.byEmail.delete(this.email);\n\t\tremoveOne(this.users.sorted, this);\n\t\t\n\t\trolesSnapshots.delete(this._id);\n\t\tpermissionsSnapshots.delete(this._id);\n\t\t\n\t\tthis.users.replace(this._id);\n\t\t\n\t\tthis.users.updateDebounced();\n\t\t\n\t}\n\t\n}\n", "import EventEmitter from './index.js'\n\nexport { EventEmitter }\nexport default EventEmitter\n", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null],
5
- "mappings": "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",
6
- "names": ["require_format", "__commonJSMin", "exports", "module", "idRegex", "nameRegex", "valueRegex", "b64Regex", "decimalRegex", "versionRegex", "objToKeyVal", "obj", "objectKeys", "k", "keyValtoObj", "str", "ps", "pss", "object", "objectValues", "serialize", "opts", "fields", "pk", "p", "pv", "v", "strpar", "deserialize", "phcstr", "maxf", "id", "version", "hash", "salt", "params", "parstr", "phcobj", "require_node_gyp_build", "__commonJSMin", "exports", "module", "fs", "path", "os", "runtimeRequire", "__require", "vars", "prebuildsOnly", "abi", "runtime", "isElectron", "isNwjs", "arch", "platform", "libc", "isAlpine", "armv", "uv", "load", "dir", "name", "release", "getFirst", "matchBuild", "debug", "prebuild", "resolve", "nearby", "target", "tuples", "readdirSync", "parseTuple", "tuple", "matchTuple", "compareTuples", "prebuilds", "parsed", "parseTags", "candidates", "matchTags", "winner", "compareTags", "filter", "files", "arr", "architectures", "a", "b", "file", "extension", "tags", "i", "tag", "runtimeAgnostic", "require_node_gyp_build", "__commonJSMin", "exports", "module", "runtimeRequire", "__require", "require_argon2", "__commonJSMin", "exports", "module", "assert", "randomBytes", "timingSafeEqual", "promisify", "deserialize", "serialize", "gypBuild", "bindingsHash", "generateSalt", "argon2d", "argon2i", "argon2id", "types", "names", "defaults", "limits", "hash", "password", "options", "raw", "salt", "rest", "key", "min", "max", "value", "hashLength", "secret", "type", "version", "m", "t", "p", "data", "needsRehash", "digest", "memoryCost", "timeCost", "v", "verify", "id", "require_eventemitter3", "__commonJSMin", "exports", "module", "has", "prefix", "Events", "EE", "fn", "context", "once", "addListener", "emitter", "event", "listener", "evt", "clearEvent", "EventEmitter", "names", "events", "name", "handlers", "i", "l", "ee", "listeners", "a1", "a2", "a3", "a4", "a5", "len", "args", "length", "j", "CookieSetter", "InSiteCookieMiddleware", "SubscriptionHandler", "InSiteWebSocketServer", "IncomingTransport", "OutgoingTransport", "connect", "InSiteHTTPServer", "InSiteStaticMiddleware", "InSiteTemplateMiddleware", "O", "import_index", "eventemitter3_default", "EventEmitter", "_ids", "iterable", "ids", "object", "noop", "debounce", "callback", "limit", "options", "leading", "trailing", "maxWait", "timeout", "maxWaitTimeout", "end", "context", "args", "initial", "final", "result", "expired", "n", "debounced", "maxWaitExpired", "run", "_args", "resolve", "noop", "shouldRun", "deleteProps", "object", "keys", "key", "empty", "object", "key", "EmptyArray", "EmptySet", "getAll", "map", "keys", "onlyExisting", "key", "hasAny", "mapOrSet", "items", "item", "howmuch", "number", "one", "two", "five", "shouldPrintNumber", "u", "d", "intersection", "firstIterable", "otherIterables", "intersectionArray", "mainLoop", "item", "otherIterable", "random", "from", "to", "reAdd", "set", "item", "removeAll", "array", "items", "i", "removed", "item", "removeOne", "array", "item", "i", "sort", "set", "compareFn", "item", "newObjectIdString", "newObjectIdString", "crypto", "AbilitiesMap", "schema", "list", "ability", "target", "source", "abilityId", "targetAbility", "sourceAbility", "param", "targetItems", "itemId", "_id", "abilities", "item", "user", "resolve", "abilitiesSchema", "userAbility", "userParam", "j", "snapshots", "Org", "orgs", "orgDoc", "title", "ownerIds", "restProps", "next", "snapshot", "regexps", "basisSchema", "indexes", "preventDirectDelete", "Orgs", "users", "options", "org", "slaveOrgs", "ownerOrg", "slaveOrg", "array", "sorted", "ownerId", "ownerUser", "anotherOrg", "sort", "i", "slaveOrgIndex", "length", "o", "a", "b", "debounce", "customSchema", "customIndexes", "nullProps", "removeAll", "deleteProps", "jsonSchema", "EmptyArray", "EmptySet", "note", "newObjectIdString", "fromId", "toId", "handler", "Role", "roles", "roleDoc", "ownInvolveIds", "ownAbilities", "Roles", "rootProps", "initOptions", "role", "involvedBy", "involvedRoleId", "involvedRole", "involvedByRole", "reAdd", "anotherRole", "getAll", "involvedRoleIndex", "_o", "involves", "description", "ids", "intersection", "cleanedUpIds", "Session", "sessions", "sessionDoc", "isOnline", "updates", "ts", "expireAfterSeconds", "Sessions", "crypto", "random", "props", "session", "Avatars", "rolesSnapshots", "permissionsSnapshots", "staticUrl", "User", "userDoc", "name", "email", "ownRoleIds", "orgId", "avatar", "isEmailUpdated", "isNameUpdated", "isLastNameUpdated", "isRolesUpdated", "isOrgUpdated", "empty", "roleId", "_ids", "slaveIds", "hasAny", "permissiveOrgIds", "sessionsLimit", "removeOne", "Users", "_Users", "collections", "eventEmitter", "EventEmitter", "shouldUpdateRoles", "initialRootProps", "rolesOptions", "orgsOptions", "sessionsOptions", "password", "job", "newPassword", "sessionProps", "UsersServer", "InSite", "_InSite", "options", "dbOptions", "wssWithOtherOptions", "usersWithServerOptions", "cookieWithMiddlewareOptions", "httpWithMiddlewareOptions", "connect", "subscriptions", "incomingTransportOptions", "outgoingTransport", "wssOptions", "InSiteWebSocketServer", "SubscriptionHandler", "IncomingTransport", "OutgoingTransport", "wssc", "error", "usersServerOptions", "usersOptions", "M", "staticMiddlewareOptions", "templateMiddlewareOptions", "middlewares", "httpOptions", "InSiteHTTPServer", "InSiteStaticMiddleware", "InSiteCookieMiddleware", "InSiteTemplateMiddleware", "_", "cookieOptions", "CookieSetter"]
3
+ "sources": ["../src/InSite.ts"],
4
+ "sourcesContent": ["import { CookieSetter, InSiteCookieMiddleware } from \"insite-cookie/server\";\nimport { SubscriptionHandler } from \"insite-subscriptions-server/ws\";\nimport { InSiteWebSocketServer } from \"insite-ws/server\";\nimport { IncomingTransport, OutgoingTransport } from \"insite-ws-transfers/node\";\nimport {\n\tconnect,\n\ttype InSiteCollections,\n\ttype InSiteDB,\n\ttype MongoClient\n} from \"insite-db\";\nimport {\n\tInSiteHTTPServer,\n\tInSiteServerMiddleware,\n\tInSiteStaticMiddleware,\n\tInSiteTemplateMiddleware\n} from \"insite-http\";\nimport { type AbilitiesSchema, Users } from \"insite-users-server\";\nimport { UsersServer, type WSSCWithUser } from \"insite-users-server-ws\";\nimport type { Optional, Options, WSS } from \"./types\";\n\n\nexport class InSite<AS extends AbilitiesSchema, O extends Options<AS>> {\n\tconstructor(options: O) {\n\t\tthis.initPromise = this.init!(options);\n\t\t\n\t}\n\t\n\tmongoClient!: MongoClient;\n\tdb!: InSiteDB;\n\tcollections!: InSiteCollections;\n\twss!: WSS<AS, O>;\n\tincomingTransport!: IncomingTransport;\n\toutgoingTransport!: OutgoingTransport;\n\tsubscriptionHandler!: SubscriptionHandler<AS>;\n\tusersServer!: UsersServer<AS>;\n\tusers!: Users<AS>;\n\tcookie!: CookieSetter<AS>;\n\thttp!: InSiteHTTPServer;\n\t\n\tprivate init? = async (options: Options<AS>) => {\n\t\t\n\t\tconst {\n\t\t\tdb: dbOptions,\n\t\t\twss: wssWithOtherOptions,\n\t\t\tusers: usersWithServerOptions,\n\t\t\tcookie: cookieWithMiddlewareOptions,\n\t\t\thttp: httpWithMiddlewareOptions\n\t\t} = options;\n\t\t\n\t\tif (dbOptions)\n\t\t\t({\n\t\t\t\tclient: this.mongoClient,\n\t\t\t\tdb: this.db,\n\t\t\t\tcollections: this.collections\n\t\t\t} = await connect(dbOptions));\n\t\t\n\t\tif (wssWithOtherOptions) {\n\t\t\tconst {\n\t\t\t\tsubscriptions,\n\t\t\t\tincomingTransport: incomingTransportOptions,\n\t\t\t\toutgoingTransport,\n\t\t\t\t...wssOptions\n\t\t\t} = wssWithOtherOptions;\n\t\t\t\n\t\t\tthis.wss = new InSiteWebSocketServer<WSSCWithUser<AS>>(wssOptions) as WSS<AS, O>;\n\t\t\t\n\t\t\tif (subscriptions !== null)\n\t\t\t\tthis.subscriptionHandler = new SubscriptionHandler(this.wss, !!this.collections);\n\t\t\t\n\t\t\tif (incomingTransportOptions !== null && (incomingTransportOptions || (this.collections && usersWithServerOptions)))\n\t\t\t\tthis.incomingTransport = new IncomingTransport(this.wss, incomingTransportOptions);\n\t\t\t\n\t\t\tif (outgoingTransport)\n\t\t\t\tthis.outgoingTransport = new OutgoingTransport(this.wss);\n\t\t\t\n\t\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\t\tthis.wss.on(\"client-connect\", wssc => console.info(`\uD83D\uDD0C WebSocket connected with ${wssc.session?.user.email}`));\n\t\t\t\n\t\t\tthis.wss.on(\"error\", (error: Error) => console.error(\"\uD83D\uDD0C\u2757\uFE0F WebSocket Server:\", error));\n\t\t\tthis.wss.on(\"close\", () => console.error(\"\uD83D\uDD0C\u2757\uFE0F WebSocket Server closed\"));\n\t\t}\n\t\t\n\t\tif (usersWithServerOptions && this.collections) {\n\t\t\tconst { server: usersServerOptions, ...usersOptions } = usersWithServerOptions;\n\t\t\t\n\t\t\tif (this.wss && this.subscriptionHandler) {\n\t\t\t\tthis.usersServer = await UsersServer.init({\n\t\t\t\t\t...usersServerOptions,\n\t\t\t\t\tusers: usersOptions,\n\t\t\t\t\twss: this.wss,\n\t\t\t\t\tcollections: this.collections,\n\t\t\t\t\tincomingTransport: this.incomingTransport\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tthis.users = this.usersServer.users;\n\t\t\t} else\n\t\t\t\tthis.users = await Users.init(this.collections, usersOptions);\n\t\t}\n\t\t\n\t\tif (httpWithMiddlewareOptions) {\n\t\t\tconst {\n\t\t\t\tstatic: staticMiddlewareOptions = undefined, // eslint-disable-line unicorn/no-useless-undefined\n\t\t\t\ttemplate: templateMiddlewareOptions = undefined, // eslint-disable-line unicorn/no-useless-undefined\n\t\t\t\tmiddlewares = undefined, // eslint-disable-line unicorn/no-useless-undefined\n\t\t\t\t...httpOptions\n\t\t\t} = typeof httpWithMiddlewareOptions == \"object\" ? httpWithMiddlewareOptions : {};\n\t\t\t\n\t\t\tthis.http = new InSiteHTTPServer(httpOptions, [\n\t\t\t\tstaticMiddlewareOptions !== null && new InSiteStaticMiddleware(staticMiddlewareOptions ?? {}),\n\t\t\t\tcookieWithMiddlewareOptions !== null && new InSiteCookieMiddleware(cookieWithMiddlewareOptions?.middleware ?? {}),\n\t\t\t\ttemplateMiddlewareOptions !== null && new InSiteTemplateMiddleware(templateMiddlewareOptions ?? {}),\n\t\t\t\t...middlewares ?? []\n\t\t\t].filter(Boolean) as InSiteServerMiddleware[]);\n\t\t}\n\t\t\n\t\tif (cookieWithMiddlewareOptions !== null && this.usersServer && this.http) {\n\t\t\tconst {\n\t\t\t\tmiddleware: _,\n\t\t\t\t...cookieOptions\n\t\t\t} = cookieWithMiddlewareOptions ?? {};\n\t\t\t\n\t\t\tthis.cookie = new CookieSetter<AS>({\n\t\t\t\t...cookieOptions,\n\t\t\t\tusersServer: this.usersServer\n\t\t\t});\n\t\t}\n\t\t\n\t\tdelete this.init;\n\t\t\n\t\treturn this;\n\t};\n\t\n\tprivate initPromise;\n\t\n\twhenReady() {\n\t\treturn this.initPromise;\n\t}\n\t\n\t\n\tstatic init<IO extends Options<any>>(options: IO) { // eslint-disable-line @typescript-eslint/no-explicit-any\n\t\ttype IAS = IO extends Options<infer EIAS> ? EIAS : never;\n\t\t\n\t\treturn (new InSite(options)).whenReady() as Promise<Optional<InSite<IAS, IO>, IO, IAS>>;\n\t}\n\t\n}\n"],
5
+ "mappings": "AAAA,OAAS,gBAAAA,EAAc,0BAAAC,MAA8B,uBACrD,OAAS,uBAAAC,MAA2B,iCACpC,OAAS,yBAAAC,MAA6B,mBACtC,OAAS,qBAAAC,EAAmB,qBAAAC,MAAyB,2BACrD,OACC,WAAAC,MAIM,YACP,OACC,oBAAAC,EAEA,0BAAAC,EACA,4BAAAC,MACM,cACP,OAA+B,SAAAC,MAAa,sBAC5C,OAAS,eAAAC,MAAsC,yBAIxC,IAAMC,EAAN,MAAMC,CAA0D,CACtE,YAAYC,EAAY,CACvB,KAAK,YAAc,KAAK,KAAMA,CAAO,CAEtC,CAEA,YACA,GACA,YACA,IACA,kBACA,kBACA,oBACA,YACA,MACA,OACA,KAEQ,KAAQ,MAAOA,GAAyB,CAE/C,GAAM,CACL,GAAIC,EACJ,IAAKC,EACL,MAAOC,EACP,OAAQC,EACR,KAAMC,CACP,EAAIL,EASJ,GAPIC,IACF,CACA,OAAQ,KAAK,YACb,GAAI,KAAK,GACT,YAAa,KAAK,WACnB,EAAI,MAAMT,EAAQS,CAAS,GAExBC,EAAqB,CACxB,GAAM,CACL,cAAAI,EACA,kBAAmBC,EACnB,kBAAAC,EACA,GAAGC,CACJ,EAAIP,EAEJ,KAAK,IAAM,IAAIb,EAAwCoB,CAAU,EAE7DH,IAAkB,OACrB,KAAK,oBAAsB,IAAIlB,EAAoB,KAAK,IAAK,CAAC,CAAC,KAAK,WAAW,GAE5EmB,IAA6B,OAASA,GAA6B,KAAK,aAAeJ,KAC1F,KAAK,kBAAoB,IAAIb,EAAkB,KAAK,IAAKiB,CAAwB,GAE9EC,IACH,KAAK,kBAAoB,IAAIjB,EAAkB,KAAK,GAAG,GAEpD,QAAQ,IAAI,WAAa,eAC5B,KAAK,IAAI,GAAG,iBAAkBmB,GAAQ,QAAQ,KAAK,sCAA+BA,EAAK,SAAS,KAAK,KAAK,EAAE,CAAC,EAE9G,KAAK,IAAI,GAAG,QAAUC,GAAiB,QAAQ,MAAM,0CAA0BA,CAAK,CAAC,EACrF,KAAK,IAAI,GAAG,QAAS,IAAM,QAAQ,MAAM,+CAA8B,CAAC,CACzE,CAEA,GAAIR,GAA0B,KAAK,YAAa,CAC/C,GAAM,CAAE,OAAQS,EAAoB,GAAGC,CAAa,EAAIV,EAEpD,KAAK,KAAO,KAAK,qBACpB,KAAK,YAAc,MAAMN,EAAY,KAAK,CACzC,GAAGe,EACH,MAAOC,EACP,IAAK,KAAK,IACV,YAAa,KAAK,YAClB,kBAAmB,KAAK,iBACzB,CAAC,EAED,KAAK,MAAQ,KAAK,YAAY,OAE9B,KAAK,MAAQ,MAAMjB,EAAM,KAAK,KAAK,YAAaiB,CAAY,CAC9D,CAEA,GAAIR,EAA2B,CAC9B,GAAM,CACL,OAAQS,EAA0B,OAClC,SAAUC,EAA4B,OACtC,YAAAC,EAAc,OACd,GAAGC,CACJ,EAAI,OAAOZ,GAA6B,SAAWA,EAA4B,CAAC,EAEhF,KAAK,KAAO,IAAIZ,EAAiBwB,EAAa,CAC7CH,IAA4B,MAAQ,IAAIpB,EAAuBoB,GAA2B,CAAC,CAAC,EAC5FV,IAAgC,MAAQ,IAAIjB,EAAuBiB,GAA6B,YAAc,CAAC,CAAC,EAChHW,IAA8B,MAAQ,IAAIpB,EAAyBoB,GAA6B,CAAC,CAAC,EAClG,GAAGC,GAAe,CAAC,CACpB,EAAE,OAAO,OAAO,CAA6B,CAC9C,CAEA,GAAIZ,IAAgC,MAAQ,KAAK,aAAe,KAAK,KAAM,CAC1E,GAAM,CACL,WAAYc,EACZ,GAAGC,CACJ,EAAIf,GAA+B,CAAC,EAEpC,KAAK,OAAS,IAAIlB,EAAiB,CAClC,GAAGiC,EACH,YAAa,KAAK,WACnB,CAAC,CACF,CAEA,cAAO,KAAK,KAEL,IACR,EAEQ,YAER,WAAY,CACX,OAAO,KAAK,WACb,CAGA,OAAO,KAA8BnB,EAAa,CAGjD,OAAQ,IAAID,EAAOC,CAAO,EAAG,UAAU,CACxC,CAED",
6
+ "names": ["CookieSetter", "InSiteCookieMiddleware", "SubscriptionHandler", "InSiteWebSocketServer", "IncomingTransport", "OutgoingTransport", "connect", "InSiteHTTPServer", "InSiteStaticMiddleware", "InSiteTemplateMiddleware", "Users", "UsersServer", "InSite", "_InSite", "options", "dbOptions", "wssWithOtherOptions", "usersWithServerOptions", "cookieWithMiddlewareOptions", "httpWithMiddlewareOptions", "subscriptions", "incomingTransportOptions", "outgoingTransport", "wssOptions", "wssc", "error", "usersServerOptions", "usersOptions", "staticMiddlewareOptions", "templateMiddlewareOptions", "middlewares", "httpOptions", "_", "cookieOptions"]
7
7
  }
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "insite-server",
3
- "version": "2.0.6",
3
+ "version": "2.0.8",
4
4
  "description": "inSite server",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.js",
8
- "packageManager": "bun@1.1.21",
8
+ "packageManager": "bun@1.1.24",
9
9
  "scripts": {
10
10
  "test": "echo \"Error: no test specified\" && exit 1",
11
11
  "build": "bun .conveyer.js",
@@ -22,18 +22,18 @@
22
22
  "author": "Eugene Nesvetaev <dev@nesvet.dev> (https://nesvet.dev/)",
23
23
  "license": "MIT",
24
24
  "dependencies": {
25
- "insite-cookie": "^2.0.4",
26
- "insite-db": "^2.0.1",
27
- "insite-http": "^2.0.4",
28
- "insite-subscriptions-server": "^2.0.4",
29
- "insite-users-server-ws": "^2.0.4",
30
- "insite-ws": "^2.0.13",
31
- "insite-ws-transfers": "^2.0.8"
25
+ "insite-cookie": "^2",
26
+ "insite-db": "^2",
27
+ "insite-http": "^2",
28
+ "insite-subscriptions-server": "^2",
29
+ "insite-users-server-ws": "^2",
30
+ "insite-ws": "^2",
31
+ "insite-ws-transfers": "^2"
32
32
  },
33
33
  "devDependencies": {
34
- "@nesvet/conveyer": "^2.2.1",
34
+ "@nesvet/conveyer": "^2.2.4",
35
35
  "@nesvet/eslint-config": "^2.0.24",
36
- "@types/node": "^22.1.0",
36
+ "@types/node": "^22.3.0",
37
37
  "@types/ws": "^8.5.12",
38
38
  "typescript": "^5.5.4"
39
39
  }
package/bun.lockb DELETED
Binary file