insite-db 2.4.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # insite-db
2
2
 
3
+ [![npm](https://img.shields.io/npm/v/insite-db)](https://www.npmjs.com/package/insite-db)
4
+
3
5
  MongoDB layer for inSite — connection, collection management, Change Streams, JSON Schema validation, and indexes.
4
6
 
5
7
  Part of [inSite](../../README.md) — used by [insite-server](../server/README.md), [insite-config](../config/README.md), [insite-users-server](../users-server/README.md), [insite-subscriptions-server](../subscriptions-server/README.md).
@@ -65,7 +67,7 @@ function connect(options: Options): Promise<{ client: MongoClient; db: DB; colle
65
67
  | `onConnect` | `(collections, db) => Promise<void>` | Optional callback after connect |
66
68
  | `...mongoClientOptions` | `MongoClientOptions` | Passed to MongoClient |
67
69
 
68
- Note: `localhost` in URL is replaced with `127.0.0.1`.
70
+ Note: `localhost` in URL is replaced with `127.0.0.1`. A failed `client.connect()` is logged and thrown, and `onConnect` is not called. A successful call still returns `{ client, db, collections }`.
69
71
 
70
72
  ### Collections
71
73
 
@@ -1 +1 @@
1
- {"version":3,"file":"Collections.d.ts","sourceRoot":"","sources":["../src/Collections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAGxE,qBAAa,WAAY,SAAQ,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;;gBAC3C,EAAE,EAAE,EAAE;IAOlB,EAAE,EAAE,EAAE,CAAC;IAOP,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAEjB,MAAM,CAAC,GAAG,SAAS,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG;QAAE,KAAK,EAAE,KAAK,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACnH,MAAM,CAAC,GAAG,SAAS,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;CAiF9G"}
1
+ {"version":3,"file":"Collections.d.ts","sourceRoot":"","sources":["../src/Collections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAGxE,qBAAa,WAAY,SAAQ,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;;gBAC3C,EAAE,EAAE,EAAE;IAOlB,EAAE,EAAE,EAAE,CAAC;IAOP,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAEjB,MAAM,CAAC,GAAG,SAAS,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG;QAAE,KAAK,EAAE,KAAK,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACnH,MAAM,CAAC,GAAG,SAAS,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;CAqF9G"}
@@ -1 +1 @@
1
- {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGvC,wBAAsB,OAAO,CAAC,EAC7B,GAAG,EACH,IAAI,EACJ,SAAS,EACT,GAAG,kBAAkB,EACrB,EAAE,OAAO;;;;GAmCT"}
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../src/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGvC,wBAAsB,OAAO,CAAC,EAC7B,GAAG,EACH,IAAI,EACJ,SAAS,EACT,GAAG,kBAAkB,EACrB,EAAE,OAAO;;;;GAsCT"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import{MongoClient as L}from"mongodb";import{captureStackTrace as m}from"@nesvet/n";import{ObjectId as b}from"mongodb";var D=["password","secret","token","key","auth","session","hash","salt","fingerprint"],w=["mail","phone","name","address","card","ssn","passport"],k=process.env.LOGS_MASK_SENSITIVE?.split(",").map(e=>e.trim().toLowerCase())??[],x=process.env.LOGS_MASK_PII?.split(",").map(e=>e.trim().toLowerCase())??[],T=process.env.LOGS_MASK_SKIP?.split(",").map(e=>e.trim().toLowerCase())??["_id","id","timestamp","created","updated"],I=Object.freeze(new Set([...D,...k])),E=Object.freeze(new Set([...w,...x])),O=Object.freeze(new Set(T)),l=new Map,_=2048,h={email:e=>{let t=e.indexOf("@");return t>1?`${e[0]}***@${e.slice(t+1)}`:"***@***"},phone:e=>{let t="";for(let n=0;n<e.length;n++){let o=e.codePointAt(n);o&&o>=48&&o<=57&&(t+=e[n])}return t.length>6?`${t.slice(0,3)}***${t.slice(-2)}`:"***"},card:e=>{let t="";for(let n=0;n<e.length;n++){let o=e.codePointAt(n);o&&o>=48&&o<=57&&(t+=e[n])}return t.length>=13?`****-****-****-${t.slice(-4)}`:"****"},generic:e=>{let{length:t}=e;return t<4?"***":t<9?`${e[0]}***`:`${e[0]+e[1]}***${e.slice(-2)}`}},u=()=>{if(l.size>=_){let e=l.keys().next().value;e&&l.delete(e)}};function M(e){let t=l.get(e);if(t!==void 0)return t;let n=e.toLowerCase().replaceAll(/[_-]/g,"");if(O.has(n))return u(),l.set(e,0),0;for(let o of I)if(n.includes(o))return u(),l.set(e,1),1;for(let o of E)if(n.includes(o))return u(),l.set(e,2),2;return-1}function P(e){let t=e.toLowerCase();return t.includes("mail")?h.email:t.includes("phone")||t.includes("tel")?h.phone:t.includes("card")||t.includes("credit")?h.card:h.generic}function g(e,t){let n=t?.depth??50;function o(r,c){if(c>n||r===null||r===void 0||typeof r!="object"||r instanceof Date)return r;if(Array.isArray(r))return r.map(i=>o(i,c+1));if(r.constructor!==Object)return r;let s={};for(let i in r){if(!Object.hasOwn(r,i))continue;let a=r[i];if(typeof a=="string"&&a.length>0)switch(M(i)){case 0:case-1:s[i]=a;break;case 1:s[i]="[MASKED]";break;case 2:s[i]=P(i)(a)}else a!=null&&typeof a=="object"?s[i]=o(a,c+1):s[i]=a}return s}return o(e,0)}function f(e,t){switch(e.operationType){case"delete":case"drop":case"dropDatabase":case"invalidate":return e}let n={...e};return"fullDocument"in n&&(n.fullDocument=g(n.fullDocument,t)),"updateDescription"in n&&n.updateDescription?.updatedFields&&(n.updateDescription={...n.updateDescription,updatedFields:g(n.updateDescription.updatedFields,t)}),n}function F(){return new b().toString()}function S(e){e=f(e);let t=[];switch(e.operationType){case"insert":case"replace":t.push("fullDocument:",e.fullDocument);break;case"update":t.push("_id:",e.documentKey._id,`
1
+ import{MongoClient as L}from"mongodb";import{captureStackTrace as m}from"@nesvet/n";import{ObjectId as b}from"mongodb";var w=["password","secret","token","key","auth","session","hash","salt","fingerprint"],D=["mail","phone","name","address","card","ssn","passport"],k=process.env.LOGS_MASK_SENSITIVE?.split(",").map(e=>e.trim().toLowerCase())??[],x=process.env.LOGS_MASK_PII?.split(",").map(e=>e.trim().toLowerCase())??[],T=process.env.LOGS_MASK_SKIP?.split(",").map(e=>e.trim().toLowerCase())??["_id","id","timestamp","created","updated"],I=Object.freeze(new Set([...w,...k])),E=Object.freeze(new Set([...D,...x])),O=Object.freeze(new Set(T)),l=new Map,_=2048,h={email:e=>{let t=e.indexOf("@");return t>1?`${e[0]}***@${e.slice(t+1)}`:"***@***"},phone:e=>{let t="";for(let n=0;n<e.length;n++){let o=e.codePointAt(n);o&&o>=48&&o<=57&&(t+=e[n])}return t.length>6?`${t.slice(0,3)}***${t.slice(-2)}`:"***"},card:e=>{let t="";for(let n=0;n<e.length;n++){let o=e.codePointAt(n);o&&o>=48&&o<=57&&(t+=e[n])}return t.length>=13?`****-****-****-${t.slice(-4)}`:"****"},generic:e=>{let{length:t}=e;return t<4?"***":t<9?`${e[0]}***`:`${e[0]+e[1]}***${e.slice(-2)}`}},u=()=>{if(l.size>=_){let e=l.keys().next().value;e&&l.delete(e)}};function M(e){let t=l.get(e);if(t!==void 0)return t;let n=e.toLowerCase().replaceAll(/[_-]/g,"");if(O.has(n))return u(),l.set(e,0),0;for(let o of I)if(n.includes(o))return u(),l.set(e,1),1;for(let o of E)if(n.includes(o))return u(),l.set(e,2),2;return-1}function P(e){let t=e.toLowerCase();return t.includes("mail")?h.email:t.includes("phone")||t.includes("tel")?h.phone:t.includes("card")||t.includes("credit")?h.card:h.generic}function g(e,t){let n=t?.depth??50;function o(r,a){if(a>n||r===null||r===void 0||typeof r!="object"||r instanceof Date)return r;if(Array.isArray(r))return r.map(i=>o(i,a+1));if(r.constructor!==Object)return r;let s={};for(let i in r){if(!Object.hasOwn(r,i))continue;let c=r[i];if(typeof c=="string"&&c.length>0)switch(M(i)){case 0:case-1:s[i]=c;break;case 1:s[i]="[MASKED]";break;case 2:s[i]=P(i)(c)}else c!=null&&typeof c=="object"?s[i]=o(c,a+1):s[i]=c}return s}return o(e,0)}function f(e,t){switch(e.operationType){case"delete":case"drop":case"dropDatabase":case"invalidate":return e}let n={...e};return"fullDocument"in n&&(n.fullDocument=g(n.fullDocument,t)),"updateDescription"in n&&n.updateDescription?.updatedFields&&(n.updateDescription={...n.updateDescription,updatedFields:g(n.updateDescription.updatedFields,t)}),n}function F(){return new b().toString()}function S(e){e=f(e);let t=[];switch(e.operationType){case"insert":case"replace":t.push("fullDocument:",e.fullDocument);break;case"update":t.push("_id:",e.documentKey._id,`
2
2
  `,"updateDescription:",e.updateDescription);break;case"delete":t.push("_id:",e.documentKey._id);break;default:t.push(e)}console.info("\u{1F33F}\u{1F38F}",`\x1B[1m${this.parent.collectionName}\x1B[0m`,`\x1B[3m${e.operationType}\x1B[0m`,...t)}function C(e){console.error(`\u{1F33F}\u2757\uFE0F MongoDB ${this.parent.collectionName} Change Stream:
3
- `,e.stack)}var d=class extends Map{constructor(t){super(),this.db=t}db;#e=new Map;#t=new Map;#n=new Map;async ensure(t,n={}){let{db:o}=this,r=this.get(t)??await this.#e.get(t);if(!r){let{promise:c,resolve:s}=Promise.withResolvers();this.#e.set(t,c);try{if((await o.listCollections({name:t},{nameOnly:!0}).toArray()).length?r=o.collection(t):(r=await o.createCollection(t,{...n.schema&&{validator:{$jsonSchema:n.schema}},...n.blockCompressor&&{storageEngine:{wiredTiger:{configString:`block_compressor=${n.blockCompressor}`}}}}),delete n.schema,delete n.blockCompressor),n.watch!==!1){let i=r.watch(void 0,{fullDocument:n.fullDocument===!1?void 0:"updateLookup"});(process.env.NODE_ENV==="development"?n.quiet!==!0:!n.quiet)&&i.on("change",S),i.on("error",C),r.changeStream=i}this.set(t,r),this[t]=r,s(r)}finally{this.#e.delete(t)}}return n.schema&&(this.#t.has(t)?console.warn(`\u{1F33F}\u26A0\uFE0F Attempt to set schema for the \x1B[1m${t}\x1B[22m collection at
3
+ `,e.stack)}var d=class extends Map{constructor(t){super(),this.db=t}db;#e=new Map;#t=new Map;#n=new Map;async ensure(t,n={}){let{db:o}=this,r=this.get(t)??await this.#e.get(t);if(!r){let{promise:a,resolve:s,reject:i}=Promise.withResolvers();this.#e.set(t,a);try{if((await o.listCollections({name:t},{nameOnly:!0}).toArray()).length?r=o.collection(t):(r=await o.createCollection(t,{...n.schema&&{validator:{$jsonSchema:n.schema}},...n.blockCompressor&&{storageEngine:{wiredTiger:{configString:`block_compressor=${n.blockCompressor}`}}}}),delete n.schema,delete n.blockCompressor),n.watch!==!1){let c=r.watch(void 0,{fullDocument:n.fullDocument===!1?void 0:"updateLookup"});(process.env.NODE_ENV==="development"?n.quiet!==!0:!n.quiet)&&c.on("change",S),c.on("error",C),r.changeStream=c}this.set(t,r),this[t]=r,s(r)}catch(c){throw i(c),c}finally{this.#e.delete(t)}}return n.schema&&(this.#t.has(t)?console.warn(`\u{1F33F}\u26A0\uFE0F Attempt to set schema for the \x1B[1m${t}\x1B[22m collection at
4
4
  ${m()}
5
5
 
6
6
  Which has already been set at
@@ -12,5 +12,5 @@ ${m()}
12
12
  Which have already been set at
13
13
  ${this.#n.get(t)}
14
14
 
15
- Skipping`):(this.#n.set(t,m()),await r.ensureIndexes(n.indexes))),r}};async function G({url:e,name:t,onConnect:n,...o}){/localhost/.test(e)&&(e=e.replace(/localhost/,"127.0.0.1"));let r=new L(e,{maxPoolSize:100,...o});try{await r.connect(),console.info("\u{1F33F} MongoDB Client connected to",e.replace(/(?<=\/\/)[^:]+?:[^@]+@/,"").replace(/[/?][^/]*$/,""))}catch(i){console.error("\u{1F33F}\u2757\uFE0F MongoDB Client connection: ",i)}r.on("close",()=>console.error("\u{1F33F}\u2757\uFE0F MongoDB socket closed")).on("error",i=>console.error("\u{1F33F}\u2757\uFE0F MongoDB:",i)).on("parseError",i=>console.error("\u{1F33F}\u2757\uFE0F MongoDB parse:",i)).on("reconnect",()=>console.info("\u{1F33F} MongoDB reconnected")).on("timeout",()=>console.error("\u{1F33F}\u2757\uFE0F MongoDB timeout"));let c=r.db(t),s=new d(c);return await n?.(s,c),{client:r,db:c,collections:s}}import{isDeepStrictEqual as y}from"node:util";import{Collection as p}from"mongodb";import{omit as $}from"@nesvet/n";var B=2;p.prototype.ensureIndexes=async function(e,t=!1){if(t){let n=await this.indexes();for(let o=0;o<e.length;o++){let[r,c={}]=e[o];for(let s=0;s<n.length;s++){let i=n[s];if(y(r,i.key)&&y(c,$(i,["v","key","name"]))){e.splice(o--,1),n.splice(s,1);break}}}await Promise.all([...e.map(o=>this.createIndex(...o)),...n.filter(({name:o,v:r})=>o&&o!=="_id_"&&(!r||r<=B)).map(({name:o})=>this.dropIndex(o))])}else await Promise.all(e.map(n=>this.createIndex(...n)))};p.prototype.onChange=function(e){return this.changeStream.on("change",e),this};p.prototype.prependChange=function(e){return this.changeStream.prependListener("change",e),this};p.prototype.onceChange=function(e){return this.changeStream.once("change",e),this};p.prototype.prependOnceChange=function(e){return this.changeStream.prependOnceListener("change",e),this};p.prototype.removeChangeListener=function(e){return this.changeStream.removeListener("change",e),this};export*from"mongodb";export{G as connect,F as newObjectIdString,S as printChangeStreamChangeDetails,C as printChangeStreamError};
15
+ Skipping`):(this.#n.set(t,m()),await r.ensureIndexes(n.indexes))),r}};async function G({url:e,name:t,onConnect:n,...o}){/localhost/.test(e)&&(e=e.replace(/localhost/,"127.0.0.1"));let r=new L(e,{maxPoolSize:100,...o});try{await r.connect()}catch(i){throw console.error("\u{1F33F}\u2757\uFE0F MongoDB Client connection: ",i),i}console.info("\u{1F33F} MongoDB Client connected to",e.replace(/(?<=\/\/)[^:]+?:[^@]+@/,"").replace(/[/?][^/]*$/,"")),r.on("close",()=>console.error("\u{1F33F}\u2757\uFE0F MongoDB socket closed")).on("error",i=>console.error("\u{1F33F}\u2757\uFE0F MongoDB:",i)).on("parseError",i=>console.error("\u{1F33F}\u2757\uFE0F MongoDB parse:",i)).on("reconnect",()=>console.info("\u{1F33F} MongoDB reconnected")).on("timeout",()=>console.error("\u{1F33F}\u2757\uFE0F MongoDB timeout"));let a=r.db(t),s=new d(a);return await n?.(s,a),{client:r,db:a,collections:s}}import{isDeepStrictEqual as y}from"node:util";import{Collection as p}from"mongodb";import{omit as $}from"@nesvet/n";var B=2;p.prototype.ensureIndexes=async function(e,t=!1){if(t){let n=await this.indexes();for(let o=0;o<e.length;o++){let[r,a={}]=e[o];for(let s=0;s<n.length;s++){let i=n[s];if(y(r,i.key)&&y(a,$(i,["v","key","name"]))){e.splice(o--,1),n.splice(s,1);break}}}await Promise.all([...e.map(o=>this.createIndex(...o)),...n.filter(({name:o,v:r})=>o&&o!=="_id_"&&(!r||r<=B)).map(({name:o})=>this.dropIndex(o))])}else await Promise.all(e.map(n=>this.createIndex(...n)))};p.prototype.onChange=function(e){return this.changeStream.on("change",e),this};p.prototype.prependChange=function(e){return this.changeStream.prependListener("change",e),this};p.prototype.onceChange=function(e){return this.changeStream.once("change",e),this};p.prototype.prependOnceChange=function(e){return this.changeStream.prependOnceListener("change",e),this};p.prototype.removeChangeListener=function(e){return this.changeStream.removeListener("change",e),this};export*from"mongodb";export{G as connect,F as newObjectIdString,S as printChangeStreamChangeDetails,C as printChangeStreamError};
16
16
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/connect.ts", "../src/Collections.ts", "../src/utils.ts", "../src/masker.ts", "../src/extensions/Collection.ts", "../src/index.ts"],
4
- "sourcesContent": ["import { MongoClient } from \"mongodb\";\nimport { Collections } from \"./Collections\";\nimport type { Options } from \"./types\";\n\n\nexport async function connect({\n\turl,\n\tname,\n\tonConnect,\n\t...mongoClientOptions\n}: Options) {\n\t\n\tif (/localhost/.test(url))\n\t\turl = url.replace(/localhost/, \"127.0.0.1\");\n\t\n\tconst client = new MongoClient(url, {\n\t\tmaxPoolSize: 100,\n\t\t...mongoClientOptions\n\t});\n\t\n\ttry {\n\t\tawait client.connect();\n\t\tconsole.info(\"\uD83C\uDF3F MongoDB Client connected to\", url.replace(/(?<=\\/\\/)[^:]+?:[^@]+@/, \"\").replace(/[/?][^/]*$/, \"\"));\n\t} catch (error) {\n\t\tconsole.error(\"\uD83C\uDF3F\u2757\uFE0F MongoDB Client connection: \", error);\n\t}\n\t\n\tclient\n\t\t.on(\"close\", () => console.error(\"\uD83C\uDF3F\u2757\uFE0F MongoDB socket closed\"))\n\t\t.on(\"error\", error => console.error(\"\uD83C\uDF3F\u2757\uFE0F MongoDB:\", error))\n\t\t.on(\"parseError\", error => console.error(\"\uD83C\uDF3F\u2757\uFE0F MongoDB parse:\", error))\n\t\t.on(\"reconnect\", () => console.info(\"\uD83C\uDF3F MongoDB reconnected\"))\n\t\t.on(\"timeout\", () => console.error(\"\uD83C\uDF3F\u2757\uFE0F MongoDB timeout\"));\n\t\n\tconst db = client.db(name);\n\t\n\tconst collections = new Collections(db);\n\t\n\tawait onConnect?.(collections, db);\n\t\n\treturn {\n\t\tclient,\n\t\tdb,\n\t\tcollections\n\t};\n}\n", "import type { Collection, Document } from \"mongodb\";\nimport { captureStackTrace } from \"@nesvet/n\";\nimport { printChangeStreamChangeDetails, printChangeStreamError } from \"./utils\";\nimport type { CollectionOptions, DB, WatchedCollection } from \"./types\";\n\n\nexport class Collections extends Map<string, Collection> {\n\tconstructor(db: DB) {\n\t\tsuper();\n\t\t\n\t\tthis.db = db;\n\t\t\n\t}\n\t\n\tdb: DB;\n\t\n\t#awaiting = new Map<string, Promise<Collection>>();\n\t\n\t#schemaSet = new Map<string, string>();\n\t#indexesSet = new Map<string, string>();\n\t\n\t[key: string]: unknown;\n\t\n\tasync ensure<Doc extends Document>(name: string, options: CollectionOptions & { watch: false }): Promise<Collection<Doc>>;\n\tasync ensure<Doc extends Document>(name: string, options?: CollectionOptions): Promise<WatchedCollection<Doc>>;\n\tasync ensure(name: string, options: CollectionOptions = {}) {\n\t\t\n\t\tconst { db } = this;\n\t\t\n\t\tlet collection = this.get(name) ?? await this.#awaiting.get(name);\n\t\t\n\t\tif (!collection) {\n\t\t\tconst { promise, resolve } = Promise.withResolvers<Collection>();\n\t\t\tthis.#awaiting.set(name, promise);\n\t\t\t\n\t\t\ttry {\n\t\t\t\tif ((await db.listCollections({ name }, { nameOnly: true }).toArray()).length)\n\t\t\t\t\tcollection = db.collection(name);\n\t\t\t\telse {\n\t\t\t\t\tcollection = await db.createCollection(name, {\n\t\t\t\t\t\t...options.schema && { validator: { $jsonSchema: options.schema } },\n\t\t\t\t\t\t...options.blockCompressor && { storageEngine: { wiredTiger: { configString: `block_compressor=${options.blockCompressor}` } } }\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tdelete options.schema;\n\t\t\t\t\tdelete options.blockCompressor;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (options.watch !== false) {\n\t\t\t\t\tconst changeStream = collection.watch(undefined, { fullDocument: options.fullDocument === false ? undefined : \"updateLookup\" });\n\t\t\t\t\t\n\t\t\t\t\tif (process.env.NODE_ENV === \"development\" ? options.quiet !== true : !options.quiet)\n\t\t\t\t\t\tchangeStream.on(\"change\", printChangeStreamChangeDetails);\n\t\t\t\t\t\n\t\t\t\t\tchangeStream.on(\"error\", printChangeStreamError);\n\t\t\t\t\t\n\t\t\t\t\tcollection.changeStream = changeStream;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.set(name, collection);\n\t\t\t\tthis[name] = collection;\n\t\t\t\t\n\t\t\t\tresolve(collection);\n\t\t\t} finally {\n\t\t\t\tthis.#awaiting.delete(name);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (options.schema)\n\t\t\tif (this.#schemaSet.has(name))\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`\uD83C\uDF3F\u26A0\uFE0F Attempt to set schema for the \\x1B[1m${name}\\x1B[22m collection at\\n` +\n\t\t\t\t\t`${captureStackTrace()}\\n` +\n\t\t\t\t\t\"\\n\" +\n\t\t\t\t\t\" Which has already been set at\\n\" +\n\t\t\t\t\t`${this.#schemaSet.get(name)}\\n` +\n\t\t\t\t\t\"\\n\" +\n\t\t\t\t\t\" Skipping\"\n\t\t\t\t);\n\t\t\telse {\n\t\t\t\tthis.#schemaSet.set(name, captureStackTrace());\n\t\t\t\t\n\t\t\t\tawait db.command({ collMod: name, validator: { $jsonSchema: options.schema } });\n\t\t\t}\n\t\t\n\t\tif (options.indexes)\n\t\t\tif (this.#indexesSet.has(name))\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`\uD83C\uDF3F\u26A0\uFE0F Attempt to set indexes for the \\x1B[1m${name}\\x1B[22m collection at\\n` +\n\t\t\t\t\t`${captureStackTrace()}\\n` +\n\t\t\t\t\t\"\\n\" +\n\t\t\t\t\t\" Which have already been set at\\n\" +\n\t\t\t\t\t`${this.#indexesSet.get(name)}\\n` +\n\t\t\t\t\t\"\\n\" +\n\t\t\t\t\t\" Skipping\"\n\t\t\t\t);\n\t\t\telse {\n\t\t\t\tthis.#indexesSet.set(name, captureStackTrace());\n\t\t\t\t\n\t\t\t\tawait collection.ensureIndexes(options.indexes);\n\t\t\t}\n\t\t\n\t\treturn collection;\n\t}\n\t\n}\n", "import { ObjectId, type ChangeStream, type ChangeStreamDocument } from \"mongodb\";\nimport { maskChangeStreamDocument } from \"./masker\";\nimport type { WatchedCollection } from \"./types\";\n\n\nexport function newObjectIdString() {\n\treturn (new ObjectId()).toString();\n}\n\n/** @this ChangeStream */\nexport function printChangeStreamChangeDetails(this: ChangeStream, next: ChangeStreamDocument) {\n\tnext = maskChangeStreamDocument(next);\n\t\n\tconst messages = [];\n\t\n\tswitch (next.operationType) {\n\t\tcase \"insert\":\n\t\tcase \"replace\":\n\t\t\tmessages.push(\"fullDocument:\", next.fullDocument);\n\t\t\tbreak;\n\t\t\n\t\tcase \"update\":\n\t\t\tmessages.push(\"_id:\", next.documentKey._id, \"\\n\", \"updateDescription:\", next.updateDescription);\n\t\t\tbreak;\n\t\t\n\t\tcase \"delete\":\n\t\t\tmessages.push(\"_id:\", next.documentKey._id);\n\t\t\tbreak;\n\t\t\n\t\tdefault:\n\t\t\tmessages.push(next);\n\t}\n\t\n\tconsole.info(\"\uD83C\uDF3F\uD83C\uDF8F\", `\\x1B[1m${(this.parent as WatchedCollection).collectionName}\\x1B[0m`, `\\x1B[3m${next.operationType}\\x1B[0m`, ...messages);\n\t\n}\n\n/** @this ChangeStream */\nexport function printChangeStreamError(this: ChangeStream, error: Error) {\n\tconsole.error(`\uD83C\uDF3F\u2757\uFE0F MongoDB ${(this.parent as WatchedCollection).collectionName} Change Stream:\\n`, error.stack);\n\t\n}\n", "import type { ChangeStreamDocument } from \"mongodb\";\n\n\ntype MaskConfig = {\n\treadonly sensitive?: ReadonlySet<string>;\n\treadonly pii?: ReadonlySet<string>;\n\treadonly skip?: ReadonlySet<string>;\n\treadonly depth?: number;\n};\n\nconst enum FieldType {\n\tUnknown = -1,\n\tSkip = 0,\n\tSensitive = 1,\n\tPii = 2\n}\n\n\nconst SENSITIVE = [ \"password\", \"secret\", \"token\", \"key\", \"auth\", \"session\", \"hash\", \"salt\", \"fingerprint\" ];\nconst PII = [ \"mail\", \"phone\", \"name\", \"address\", \"card\", \"ssn\", \"passport\" ];\n\nconst ENV_SENSITIVE = process.env.LOGS_MASK_SENSITIVE?.split(\",\").map(s => s.trim().toLowerCase()) ?? [];\nconst ENV_PII = process.env.LOGS_MASK_PII?.split(\",\").map(s => s.trim().toLowerCase()) ?? [];\nconst ENV_SKIP = process.env.LOGS_MASK_SKIP?.split(\",\").map(s => s.trim().toLowerCase()) ?? [ \"_id\", \"id\", \"timestamp\", \"created\", \"updated\" ];\n\nconst SENSITIVE_SET = Object.freeze(new Set([ ...SENSITIVE, ...ENV_SENSITIVE ]));\nconst PII_SET = Object.freeze(new Set([ ...PII, ...ENV_PII ]));\nconst SKIP_SET = Object.freeze(new Set(ENV_SKIP));\n\nconst cache = new Map<string, FieldType.Pii | FieldType.Sensitive | FieldType.Skip>();\nconst CACHE_SIZE = 2048;\n\nconst mask = {\n\t\n\temail: (v: string): string => {\n\t\tconst i = v.indexOf(\"@\");\n\t\t\n\t\treturn i > 1 ? `${v[0]}***@${v.slice(i + 1)}` : \"***@***\";\n\t},\n\t\n\tphone: (v: string): string => {\n\t\t\n\t\tlet digits = \"\";\n\t\t\n\t\tfor (let i = 0; i < v.length; i++) {\n\t\t\tconst c = v.codePointAt(i);\n\t\t\t\n\t\t\tif (c && c >= 48 && c <= 57)\n\t\t\t\tdigits += v[i];\n\t\t}\n\t\t\n\t\treturn digits.length > 6 ? `${digits.slice(0, 3)}***${digits.slice(-2)}` : \"***\";\n\t},\n\t\n\tcard: (v: string): string => {\n\t\t\n\t\tlet digits = \"\";\n\t\t\n\t\tfor (let i = 0; i < v.length; i++) {\n\t\t\tconst c = v.codePointAt(i);\n\t\t\t\n\t\t\tif (c && c >= 48 && c <= 57)\n\t\t\t\tdigits += v[i];\n\t\t}\n\t\t\n\t\treturn digits.length >= 13 ? `****-****-****-${digits.slice(-4)}` : \"****\";\n\t},\n\t\n\tgeneric: (v: string): string => {\n\t\tconst { length } = v;\n\t\t\n\t\treturn length < 4 ? \"***\" : length < 9 ? `${v[0]}***` : `${v[0] + v[1]}***${v.slice(-2)}`;\n\t}\n};\n\nconst ensureCacheCapacity = (): void => {\n\t\n\tif (cache.size >= CACHE_SIZE) {\n\t\tconst keyToDelete = cache.keys().next().value;\n\t\t\n\t\tif (keyToDelete)\n\t\t\tcache.delete(keyToDelete);\n\t}\n\t\n};\n\nfunction checkField(key: string): FieldType {\n\tconst cached = cache.get(key);\n\t\n\tif (cached !== undefined)\n\t\treturn cached;\n\t\n\tconst normalized = key.toLowerCase().replaceAll(/[_-]/g, \"\");\n\t\n\tif (SKIP_SET.has(normalized)) {\n\t\tensureCacheCapacity();\n\t\t\n\t\tcache.set(key, FieldType.Skip);\n\t\t\n\t\treturn FieldType.Skip;\n\t}\n\t\n\tfor (const pattern of SENSITIVE_SET)\n\t\tif (normalized.includes(pattern)) {\n\t\t\t\n\t\t\tensureCacheCapacity();\n\t\t\t\n\t\t\tcache.set(key, FieldType.Sensitive);\n\t\t\t\n\t\t\treturn FieldType.Sensitive;\n\t\t}\n\t\n\tfor (const pattern of PII_SET)\n\t\tif (normalized.includes(pattern)) {\n\t\t\t\n\t\t\tensureCacheCapacity();\n\t\t\t\n\t\t\tcache.set(key, FieldType.Pii);\n\t\t\t\n\t\t\treturn FieldType.Pii;\n\t\t}\n\t\n\treturn FieldType.Unknown;\n}\n\nfunction getMasker(key: string): (v: string) => string {\n\tconst normalized = key.toLowerCase();\n\t\n\tif (normalized.includes(\"mail\"))\n\t\treturn mask.email;\n\t\n\tif (normalized.includes(\"phone\") || normalized.includes(\"tel\"))\n\t\treturn mask.phone;\n\t\n\tif (normalized.includes(\"card\") || normalized.includes(\"credit\"))\n\t\treturn mask.card;\n\t\n\treturn mask.generic;\n}\n\n\n/**\n * Recursively traverses an object or array and masks sensitive data.\n * The function is immutable and returns a new, masked object.\n * @param data The data to mask.\n * @param config Optional configuration to override default behavior.\n * @returns A deep copy of the data with sensitive fields masked.\n */\nexport function maskData<T>(data: T, config?: MaskConfig): T {\n\tconst maxDepth = config?.depth ?? 50;\n\t\n\tfunction process(obj: unknown, depth: number): unknown {\n\t\tif (depth > maxDepth || obj === null || obj === undefined || typeof obj !== \"object\")\n\t\t\treturn obj;\n\t\t\n\t\tif (obj instanceof Date)\n\t\t\treturn obj;\n\t\t\n\t\tif (Array.isArray(obj))\n\t\t\treturn obj.map(item => process(item, depth + 1));\n\t\t\n\t\tif (obj.constructor !== Object)\n\t\t\treturn obj;\n\t\t\n\t\tconst result: Record<string, unknown> = {};\n\t\t\n\t\tfor (const key in obj) {\n\t\t\tif (!Object.hasOwn(obj, key))\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tconst value = (obj as Record<string, unknown>)[key];\n\t\t\t\n\t\t\tif (typeof value === \"string\" && value.length > 0) {\n\t\t\t\tconst fieldType = checkField(key);\n\t\t\t\t\n\t\t\t\tswitch (fieldType) {\n\t\t\t\t\tcase FieldType.Skip:\n\t\t\t\t\tcase FieldType.Unknown:\n\t\t\t\t\t\tresult[key] = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase FieldType.Sensitive:\n\t\t\t\t\t\tresult[key] = \"[MASKED]\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase FieldType.Pii:\n\t\t\t\t\t\tresult[key] = getMasker(key)(value);\n\t\t\t\t}\n\t\t\t} else if (value !== null && value !== undefined && typeof value === \"object\")\n\t\t\t\tresult[key] = process(value, depth + 1);\n\t\t\telse\n\t\t\t\tresult[key] = value;\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\t\n\treturn process(data, 0) as T;\n}\n\n/**\n * A specific wrapper for masking MongoDB Change Stream documents.\n * It intelligently applies masking only to fields that can contain user data.\n * @param doc The Change Stream document.\n * @param config Optional masking configuration.\n * @returns A new Change Stream document with relevant fields masked.\n */\nexport function maskChangeStreamDocument<T extends Partial<ChangeStreamDocument>>(doc: T, config?: MaskConfig): T {\n\tswitch (doc.operationType) {\n\t\tcase \"delete\":\n\t\tcase \"drop\":\n\t\tcase \"dropDatabase\":\n\t\tcase \"invalidate\":\n\t\t\treturn doc;\n\t}\n\t\n\tconst result = { ...doc };\n\t\n\tif (\"fullDocument\" in result)\n\t\tresult.fullDocument = maskData(result.fullDocument, config);\n\t\n\tif (\"updateDescription\" in result && result.updateDescription?.updatedFields)\n\t\tresult.updateDescription = {\n\t\t\t...result.updateDescription,\n\t\t\tupdatedFields: maskData(result.updateDescription.updatedFields, config)\n\t\t};\n\t\n\treturn result;\n}\n\n/**\n * Provides utilities for monitoring and managing the masker's internal state.\n */\nexport const stats = {\n\tcacheSize: (): number => cache.size,\n\tclearCache: (): void => cache.clear(),\n\tpatterns: () => ({\n\t\tsensitive: Array.from(SENSITIVE_SET),\n\t\tpii: Array.from(PII_SET),\n\t\tskip: Array.from(SKIP_SET)\n\t})\n};\n", "import { isDeepStrictEqual } from \"node:util\";\nimport { Collection, type ChangeStream } from \"mongodb\";\nimport { omit } from \"@nesvet/n\";\nimport type { ChangeStreamListener, CollectionIndexes, WatchedCollection } from \"../types\";\n\n\nconst ACTUAL_INDEX_VERSION = 2;\n\n\ndeclare module \"mongodb\" {\n\texport interface Collection<TSchema> { // eslint-disable-line no-shadow\n\t\t\n\t\t/** Ensures the presence of `indexes`. */\n\t\tensureIndexes(indexes: CollectionIndexes): Promise<void>;\n\t\t\n\t\t/** Change Stream, watching for new changes in this collection. */\n\t\tchangeStream?: ChangeStream<TSchema>;\n\t\t\n\t\t/** Adds the `listener` function to the end of the listeners array for the event `change`. */\n\t\tonChange?(listener: ChangeStreamListener<TSchema>): this;\n\t\t\n\t\t/** Adds the `listener` function to the *beginning* of the listeners array for the event `change`. */\n\t\tprependChange?(listener: ChangeStreamListener<TSchema>): this;\n\t\t\n\t\t/** Adds the **one-time** `listener` function to the end of the listeners array for the event `change`. */\n\t\tonceChange?(listener: ChangeStreamListener<TSchema>): this;\n\t\t\n\t\t/** Adds the **one-time** function to the *beginning* of the listeners array for the event `change`. */\n\t\tprependOnceChange?(listener: ChangeStreamListener<TSchema>): this;\n\t\t\n\t\t/** Removes the `listener` from the listener array for the event `change`. */\n\t\tremoveChangeListener?(listener: ChangeStreamListener<TSchema>): this;\n\t\t\n\t}\n}\n\n\nCollection.prototype.ensureIndexes = async function (indexes, dropOther = false) {\n\tif (dropOther) {\n\t\tconst existingIndexes = await this.indexes();\n\t\t\n\t\tfor (let i = 0; i < indexes.length; i++) {\n\t\t\tconst [ specification, options = {} ] = indexes[i];\n\t\t\t\n\t\t\tfor (let j = 0; j < existingIndexes.length; j++) {\n\t\t\t\tconst existingIndex = existingIndexes[j];\n\t\t\t\t\n\t\t\t\tif (\n\t\t\t\t\tisDeepStrictEqual(specification, existingIndex.key) &&\n\t\t\t\t\tisDeepStrictEqual(options, omit(existingIndex, [ \"v\", \"key\", \"name\" ]))\n\t\t\t\t) {\n\t\t\t\t\tindexes.splice(i--, 1);\n\t\t\t\t\texistingIndexes.splice(j, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tawait Promise.all([\n\t\t\t...indexes.map(index => this.createIndex(...index)),\n\t\t\t...existingIndexes.filter(({ name, v }) => name && name !== \"_id_\" && (!v || v <= ACTUAL_INDEX_VERSION)).map(({ name }) => this.dropIndex(name!))\n\t\t]);\n\t} else\n\t\tawait Promise.all(indexes.map(index => this.createIndex(...index)));\n\t\n};\n\nCollection.prototype.onChange = function (this: WatchedCollection, listener) {\n\tthis.changeStream.on(\"change\", listener);\n\t\n\treturn this;\n};\n\nCollection.prototype.prependChange = function (this: WatchedCollection, listener) {\n\tthis.changeStream.prependListener(\"change\", listener);\n\t\n\treturn this;\n};\n\nCollection.prototype.onceChange = function (this: WatchedCollection, listener) {\n\tthis.changeStream.once(\"change\", listener);\n\t\n\treturn this;\n};\n\nCollection.prototype.prependOnceChange = function (this: WatchedCollection, listener) {\n\tthis.changeStream.prependOnceListener(\"change\", listener);\n\t\n\treturn this;\n};\n\nCollection.prototype.removeChangeListener = function (this: WatchedCollection, listener) {\n\tthis.changeStream.removeListener(\"change\", listener);\n\t\n\treturn this;\n};\n", "export type { Collections } from \"./Collections\";\nexport * from \"./connect\";\nexport * from \"./extensions\";\nexport * from \"./types\";\nexport { CollectionOptions } from \"./types\";\nexport * from \"./utils\";\nexport * from \"mongodb\";\n"],
5
- "mappings": "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",
6
- "names": ["MongoClient", "captureStackTrace", "ObjectId", "SENSITIVE", "PII", "ENV_SENSITIVE", "s", "ENV_PII", "ENV_SKIP", "SENSITIVE_SET", "PII_SET", "SKIP_SET", "cache", "CACHE_SIZE", "mask", "v", "i", "digits", "c", "length", "ensureCacheCapacity", "keyToDelete", "checkField", "key", "cached", "normalized", "pattern", "getMasker", "maskData", "data", "config", "maxDepth", "process", "obj", "depth", "item", "result", "value", "maskChangeStreamDocument", "doc", "newObjectIdString", "ObjectId", "printChangeStreamChangeDetails", "next", "maskChangeStreamDocument", "messages", "printChangeStreamError", "error", "Collections", "db", "#awaiting", "#schemaSet", "#indexesSet", "name", "options", "collection", "promise", "resolve", "changeStream", "printChangeStreamChangeDetails", "printChangeStreamError", "captureStackTrace", "connect", "url", "name", "onConnect", "mongoClientOptions", "client", "MongoClient", "error", "db", "collections", "Collections", "isDeepStrictEqual", "Collection", "omit", "ACTUAL_INDEX_VERSION", "indexes", "dropOther", "existingIndexes", "i", "specification", "options", "j", "existingIndex", "index", "name", "v", "listener"]
4
+ "sourcesContent": ["import { MongoClient } from \"mongodb\";\nimport { Collections } from \"./Collections\";\nimport type { Options } from \"./types\";\n\n\nexport async function connect({\n\turl,\n\tname,\n\tonConnect,\n\t...mongoClientOptions\n}: Options) {\n\t\n\tif (/localhost/.test(url))\n\t\turl = url.replace(/localhost/, \"127.0.0.1\");\n\t\n\tconst client = new MongoClient(url, {\n\t\tmaxPoolSize: 100,\n\t\t...mongoClientOptions\n\t});\n\t\n\ttry {\n\t\tawait client.connect();\n\t} catch (error) {\n\t\tconsole.error(\"\uD83C\uDF3F\u2757\uFE0F MongoDB Client connection: \", error);\n\t\t\n\t\tthrow error;\n\t}\n\t\n\tconsole.info(\"\uD83C\uDF3F MongoDB Client connected to\", url.replace(/(?<=\\/\\/)[^:]+?:[^@]+@/, \"\").replace(/[/?][^/]*$/, \"\"));\n\t\n\tclient\n\t\t.on(\"close\", () => console.error(\"\uD83C\uDF3F\u2757\uFE0F MongoDB socket closed\"))\n\t\t.on(\"error\", error => console.error(\"\uD83C\uDF3F\u2757\uFE0F MongoDB:\", error))\n\t\t.on(\"parseError\", error => console.error(\"\uD83C\uDF3F\u2757\uFE0F MongoDB parse:\", error))\n\t\t.on(\"reconnect\", () => console.info(\"\uD83C\uDF3F MongoDB reconnected\"))\n\t\t.on(\"timeout\", () => console.error(\"\uD83C\uDF3F\u2757\uFE0F MongoDB timeout\"));\n\t\n\tconst db = client.db(name);\n\t\n\tconst collections = new Collections(db);\n\t\n\tawait onConnect?.(collections, db);\n\t\n\treturn {\n\t\tclient,\n\t\tdb,\n\t\tcollections\n\t};\n}\n", "import type { Collection, Document } from \"mongodb\";\nimport { captureStackTrace } from \"@nesvet/n\";\nimport { printChangeStreamChangeDetails, printChangeStreamError } from \"./utils\";\nimport type { CollectionOptions, DB, WatchedCollection } from \"./types\";\n\n\nexport class Collections extends Map<string, Collection> {\n\tconstructor(db: DB) {\n\t\tsuper();\n\t\t\n\t\tthis.db = db;\n\t\t\n\t}\n\t\n\tdb: DB;\n\t\n\t#awaiting = new Map<string, Promise<Collection>>();\n\t\n\t#schemaSet = new Map<string, string>();\n\t#indexesSet = new Map<string, string>();\n\t\n\t[key: string]: unknown;\n\t\n\tasync ensure<Doc extends Document>(name: string, options: CollectionOptions & { watch: false }): Promise<Collection<Doc>>;\n\tasync ensure<Doc extends Document>(name: string, options?: CollectionOptions): Promise<WatchedCollection<Doc>>;\n\tasync ensure(name: string, options: CollectionOptions = {}) {\n\t\t\n\t\tconst { db } = this;\n\t\t\n\t\tlet collection = this.get(name) ?? await this.#awaiting.get(name);\n\t\t\n\t\tif (!collection) {\n\t\t\tconst { promise, resolve, reject } = Promise.withResolvers<Collection>();\n\t\t\tthis.#awaiting.set(name, promise);\n\t\t\t\n\t\t\ttry {\n\t\t\t\tif ((await db.listCollections({ name }, { nameOnly: true }).toArray()).length)\n\t\t\t\t\tcollection = db.collection(name);\n\t\t\t\telse {\n\t\t\t\t\tcollection = await db.createCollection(name, {\n\t\t\t\t\t\t...options.schema && { validator: { $jsonSchema: options.schema } },\n\t\t\t\t\t\t...options.blockCompressor && { storageEngine: { wiredTiger: { configString: `block_compressor=${options.blockCompressor}` } } }\n\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tdelete options.schema;\n\t\t\t\t\tdelete options.blockCompressor;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (options.watch !== false) {\n\t\t\t\t\tconst changeStream = collection.watch(undefined, { fullDocument: options.fullDocument === false ? undefined : \"updateLookup\" });\n\t\t\t\t\t\n\t\t\t\t\tif (process.env.NODE_ENV === \"development\" ? options.quiet !== true : !options.quiet)\n\t\t\t\t\t\tchangeStream.on(\"change\", printChangeStreamChangeDetails);\n\t\t\t\t\t\n\t\t\t\t\tchangeStream.on(\"error\", printChangeStreamError);\n\t\t\t\t\t\n\t\t\t\t\tcollection.changeStream = changeStream;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.set(name, collection);\n\t\t\t\tthis[name] = collection;\n\t\t\t\t\n\t\t\t\tresolve(collection);\n\t\t\t} catch (error) {\n\t\t\t\treject(error);\n\t\t\t\t\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\tthis.#awaiting.delete(name);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (options.schema)\n\t\t\tif (this.#schemaSet.has(name))\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`\uD83C\uDF3F\u26A0\uFE0F Attempt to set schema for the \\x1B[1m${name}\\x1B[22m collection at\\n` +\n\t\t\t\t\t`${captureStackTrace()}\\n` +\n\t\t\t\t\t\"\\n\" +\n\t\t\t\t\t\" Which has already been set at\\n\" +\n\t\t\t\t\t`${this.#schemaSet.get(name)}\\n` +\n\t\t\t\t\t\"\\n\" +\n\t\t\t\t\t\" Skipping\"\n\t\t\t\t);\n\t\t\telse {\n\t\t\t\tthis.#schemaSet.set(name, captureStackTrace());\n\t\t\t\t\n\t\t\t\tawait db.command({ collMod: name, validator: { $jsonSchema: options.schema } });\n\t\t\t}\n\t\t\n\t\tif (options.indexes)\n\t\t\tif (this.#indexesSet.has(name))\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`\uD83C\uDF3F\u26A0\uFE0F Attempt to set indexes for the \\x1B[1m${name}\\x1B[22m collection at\\n` +\n\t\t\t\t\t`${captureStackTrace()}\\n` +\n\t\t\t\t\t\"\\n\" +\n\t\t\t\t\t\" Which have already been set at\\n\" +\n\t\t\t\t\t`${this.#indexesSet.get(name)}\\n` +\n\t\t\t\t\t\"\\n\" +\n\t\t\t\t\t\" Skipping\"\n\t\t\t\t);\n\t\t\telse {\n\t\t\t\tthis.#indexesSet.set(name, captureStackTrace());\n\t\t\t\t\n\t\t\t\tawait collection.ensureIndexes(options.indexes);\n\t\t\t}\n\t\t\n\t\treturn collection;\n\t}\n\t\n}\n", "import { ObjectId, type ChangeStream, type ChangeStreamDocument } from \"mongodb\";\nimport { maskChangeStreamDocument } from \"./masker\";\nimport type { WatchedCollection } from \"./types\";\n\n\nexport function newObjectIdString() {\n\treturn (new ObjectId()).toString();\n}\n\n/** @this ChangeStream */\nexport function printChangeStreamChangeDetails(this: ChangeStream, next: ChangeStreamDocument) {\n\tnext = maskChangeStreamDocument(next);\n\t\n\tconst messages = [];\n\t\n\tswitch (next.operationType) {\n\t\tcase \"insert\":\n\t\tcase \"replace\":\n\t\t\tmessages.push(\"fullDocument:\", next.fullDocument);\n\t\t\tbreak;\n\t\t\n\t\tcase \"update\":\n\t\t\tmessages.push(\"_id:\", next.documentKey._id, \"\\n\", \"updateDescription:\", next.updateDescription);\n\t\t\tbreak;\n\t\t\n\t\tcase \"delete\":\n\t\t\tmessages.push(\"_id:\", next.documentKey._id);\n\t\t\tbreak;\n\t\t\n\t\tdefault:\n\t\t\tmessages.push(next);\n\t}\n\t\n\tconsole.info(\"\uD83C\uDF3F\uD83C\uDF8F\", `\\x1B[1m${(this.parent as WatchedCollection).collectionName}\\x1B[0m`, `\\x1B[3m${next.operationType}\\x1B[0m`, ...messages);\n\t\n}\n\n/** @this ChangeStream */\nexport function printChangeStreamError(this: ChangeStream, error: Error) {\n\tconsole.error(`\uD83C\uDF3F\u2757\uFE0F MongoDB ${(this.parent as WatchedCollection).collectionName} Change Stream:\\n`, error.stack);\n\t\n}\n", "import type { ChangeStreamDocument } from \"mongodb\";\n\n\ntype MaskConfig = {\n\treadonly sensitive?: ReadonlySet<string>;\n\treadonly pii?: ReadonlySet<string>;\n\treadonly skip?: ReadonlySet<string>;\n\treadonly depth?: number;\n};\n\nconst enum FieldType {\n\tUnknown = -1,\n\tSkip = 0,\n\tSensitive = 1,\n\tPii = 2\n}\n\n\nconst SENSITIVE = [ \"password\", \"secret\", \"token\", \"key\", \"auth\", \"session\", \"hash\", \"salt\", \"fingerprint\" ];\nconst PII = [ \"mail\", \"phone\", \"name\", \"address\", \"card\", \"ssn\", \"passport\" ];\n\nconst ENV_SENSITIVE = process.env.LOGS_MASK_SENSITIVE?.split(\",\").map(s => s.trim().toLowerCase()) ?? [];\nconst ENV_PII = process.env.LOGS_MASK_PII?.split(\",\").map(s => s.trim().toLowerCase()) ?? [];\nconst ENV_SKIP = process.env.LOGS_MASK_SKIP?.split(\",\").map(s => s.trim().toLowerCase()) ?? [ \"_id\", \"id\", \"timestamp\", \"created\", \"updated\" ];\n\nconst SENSITIVE_SET = Object.freeze(new Set([ ...SENSITIVE, ...ENV_SENSITIVE ]));\nconst PII_SET = Object.freeze(new Set([ ...PII, ...ENV_PII ]));\nconst SKIP_SET = Object.freeze(new Set(ENV_SKIP));\n\nconst cache = new Map<string, FieldType.Pii | FieldType.Sensitive | FieldType.Skip>();\nconst CACHE_SIZE = 2048;\n\nconst mask = {\n\t\n\temail: (v: string): string => {\n\t\tconst i = v.indexOf(\"@\");\n\t\t\n\t\treturn i > 1 ? `${v[0]}***@${v.slice(i + 1)}` : \"***@***\";\n\t},\n\t\n\tphone: (v: string): string => {\n\t\t\n\t\tlet digits = \"\";\n\t\t\n\t\tfor (let i = 0; i < v.length; i++) {\n\t\t\tconst c = v.codePointAt(i);\n\t\t\t\n\t\t\tif (c && c >= 48 && c <= 57)\n\t\t\t\tdigits += v[i];\n\t\t}\n\t\t\n\t\treturn digits.length > 6 ? `${digits.slice(0, 3)}***${digits.slice(-2)}` : \"***\";\n\t},\n\t\n\tcard: (v: string): string => {\n\t\t\n\t\tlet digits = \"\";\n\t\t\n\t\tfor (let i = 0; i < v.length; i++) {\n\t\t\tconst c = v.codePointAt(i);\n\t\t\t\n\t\t\tif (c && c >= 48 && c <= 57)\n\t\t\t\tdigits += v[i];\n\t\t}\n\t\t\n\t\treturn digits.length >= 13 ? `****-****-****-${digits.slice(-4)}` : \"****\";\n\t},\n\t\n\tgeneric: (v: string): string => {\n\t\tconst { length } = v;\n\t\t\n\t\treturn length < 4 ? \"***\" : length < 9 ? `${v[0]}***` : `${v[0] + v[1]}***${v.slice(-2)}`;\n\t}\n};\n\nconst ensureCacheCapacity = (): void => {\n\t\n\tif (cache.size >= CACHE_SIZE) {\n\t\tconst keyToDelete = cache.keys().next().value;\n\t\t\n\t\tif (keyToDelete)\n\t\t\tcache.delete(keyToDelete);\n\t}\n\t\n};\n\nfunction checkField(key: string): FieldType {\n\tconst cached = cache.get(key);\n\t\n\tif (cached !== undefined)\n\t\treturn cached;\n\t\n\tconst normalized = key.toLowerCase().replaceAll(/[_-]/g, \"\");\n\t\n\tif (SKIP_SET.has(normalized)) {\n\t\tensureCacheCapacity();\n\t\t\n\t\tcache.set(key, FieldType.Skip);\n\t\t\n\t\treturn FieldType.Skip;\n\t}\n\t\n\tfor (const pattern of SENSITIVE_SET)\n\t\tif (normalized.includes(pattern)) {\n\t\t\t\n\t\t\tensureCacheCapacity();\n\t\t\t\n\t\t\tcache.set(key, FieldType.Sensitive);\n\t\t\t\n\t\t\treturn FieldType.Sensitive;\n\t\t}\n\t\n\tfor (const pattern of PII_SET)\n\t\tif (normalized.includes(pattern)) {\n\t\t\t\n\t\t\tensureCacheCapacity();\n\t\t\t\n\t\t\tcache.set(key, FieldType.Pii);\n\t\t\t\n\t\t\treturn FieldType.Pii;\n\t\t}\n\t\n\treturn FieldType.Unknown;\n}\n\nfunction getMasker(key: string): (v: string) => string {\n\tconst normalized = key.toLowerCase();\n\t\n\tif (normalized.includes(\"mail\"))\n\t\treturn mask.email;\n\t\n\tif (normalized.includes(\"phone\") || normalized.includes(\"tel\"))\n\t\treturn mask.phone;\n\t\n\tif (normalized.includes(\"card\") || normalized.includes(\"credit\"))\n\t\treturn mask.card;\n\t\n\treturn mask.generic;\n}\n\n\n/**\n * Recursively traverses an object or array and masks sensitive data.\n * The function is immutable and returns a new, masked object.\n * @param data The data to mask.\n * @param config Optional configuration to override default behavior.\n * @returns A deep copy of the data with sensitive fields masked.\n */\nexport function maskData<T>(data: T, config?: MaskConfig): T {\n\tconst maxDepth = config?.depth ?? 50;\n\t\n\tfunction process(obj: unknown, depth: number): unknown {\n\t\tif (depth > maxDepth || obj === null || obj === undefined || typeof obj !== \"object\")\n\t\t\treturn obj;\n\t\t\n\t\tif (obj instanceof Date)\n\t\t\treturn obj;\n\t\t\n\t\tif (Array.isArray(obj))\n\t\t\treturn obj.map(item => process(item, depth + 1));\n\t\t\n\t\tif (obj.constructor !== Object)\n\t\t\treturn obj;\n\t\t\n\t\tconst result: Record<string, unknown> = {};\n\t\t\n\t\tfor (const key in obj) {\n\t\t\tif (!Object.hasOwn(obj, key))\n\t\t\t\tcontinue;\n\t\t\t\n\t\t\tconst value = (obj as Record<string, unknown>)[key];\n\t\t\t\n\t\t\tif (typeof value === \"string\" && value.length > 0) {\n\t\t\t\tconst fieldType = checkField(key);\n\t\t\t\t\n\t\t\t\tswitch (fieldType) {\n\t\t\t\t\tcase FieldType.Skip:\n\t\t\t\t\tcase FieldType.Unknown:\n\t\t\t\t\t\tresult[key] = value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase FieldType.Sensitive:\n\t\t\t\t\t\tresult[key] = \"[MASKED]\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase FieldType.Pii:\n\t\t\t\t\t\tresult[key] = getMasker(key)(value);\n\t\t\t\t}\n\t\t\t} else if (value !== null && value !== undefined && typeof value === \"object\")\n\t\t\t\tresult[key] = process(value, depth + 1);\n\t\t\telse\n\t\t\t\tresult[key] = value;\n\t\t}\n\t\t\n\t\treturn result;\n\t}\n\t\n\treturn process(data, 0) as T;\n}\n\n/**\n * A specific wrapper for masking MongoDB Change Stream documents.\n * It intelligently applies masking only to fields that can contain user data.\n * @param doc The Change Stream document.\n * @param config Optional masking configuration.\n * @returns A new Change Stream document with relevant fields masked.\n */\nexport function maskChangeStreamDocument<T extends Partial<ChangeStreamDocument>>(doc: T, config?: MaskConfig): T {\n\tswitch (doc.operationType) {\n\t\tcase \"delete\":\n\t\tcase \"drop\":\n\t\tcase \"dropDatabase\":\n\t\tcase \"invalidate\":\n\t\t\treturn doc;\n\t}\n\t\n\tconst result = { ...doc };\n\t\n\tif (\"fullDocument\" in result)\n\t\tresult.fullDocument = maskData(result.fullDocument, config);\n\t\n\tif (\"updateDescription\" in result && result.updateDescription?.updatedFields)\n\t\tresult.updateDescription = {\n\t\t\t...result.updateDescription,\n\t\t\tupdatedFields: maskData(result.updateDescription.updatedFields, config)\n\t\t};\n\t\n\treturn result;\n}\n\n/**\n * Provides utilities for monitoring and managing the masker's internal state.\n */\nexport const stats = {\n\tcacheSize: (): number => cache.size,\n\tclearCache: (): void => cache.clear(),\n\tpatterns: () => ({\n\t\tsensitive: Array.from(SENSITIVE_SET),\n\t\tpii: Array.from(PII_SET),\n\t\tskip: Array.from(SKIP_SET)\n\t})\n};\n", "import { isDeepStrictEqual } from \"node:util\";\nimport { Collection, type ChangeStream } from \"mongodb\";\nimport { omit } from \"@nesvet/n\";\nimport type { ChangeStreamListener, CollectionIndexes, WatchedCollection } from \"../types\";\n\n\nconst ACTUAL_INDEX_VERSION = 2;\n\n\ndeclare module \"mongodb\" {\n\texport interface Collection<TSchema> { // eslint-disable-line no-shadow\n\t\t\n\t\t/** Ensures the presence of `indexes`. */\n\t\tensureIndexes(indexes: CollectionIndexes): Promise<void>;\n\t\t\n\t\t/** Change Stream, watching for new changes in this collection. */\n\t\tchangeStream?: ChangeStream<TSchema>;\n\t\t\n\t\t/** Adds the `listener` function to the end of the listeners array for the event `change`. */\n\t\tonChange?(listener: ChangeStreamListener<TSchema>): this;\n\t\t\n\t\t/** Adds the `listener` function to the *beginning* of the listeners array for the event `change`. */\n\t\tprependChange?(listener: ChangeStreamListener<TSchema>): this;\n\t\t\n\t\t/** Adds the **one-time** `listener` function to the end of the listeners array for the event `change`. */\n\t\tonceChange?(listener: ChangeStreamListener<TSchema>): this;\n\t\t\n\t\t/** Adds the **one-time** function to the *beginning* of the listeners array for the event `change`. */\n\t\tprependOnceChange?(listener: ChangeStreamListener<TSchema>): this;\n\t\t\n\t\t/** Removes the `listener` from the listener array for the event `change`. */\n\t\tremoveChangeListener?(listener: ChangeStreamListener<TSchema>): this;\n\t\t\n\t}\n}\n\n\nCollection.prototype.ensureIndexes = async function (indexes, dropOther = false) {\n\tif (dropOther) {\n\t\tconst existingIndexes = await this.indexes();\n\t\t\n\t\tfor (let i = 0; i < indexes.length; i++) {\n\t\t\tconst [ specification, options = {} ] = indexes[i];\n\t\t\t\n\t\t\tfor (let j = 0; j < existingIndexes.length; j++) {\n\t\t\t\tconst existingIndex = existingIndexes[j];\n\t\t\t\t\n\t\t\t\tif (\n\t\t\t\t\tisDeepStrictEqual(specification, existingIndex.key) &&\n\t\t\t\t\tisDeepStrictEqual(options, omit(existingIndex, [ \"v\", \"key\", \"name\" ]))\n\t\t\t\t) {\n\t\t\t\t\tindexes.splice(i--, 1);\n\t\t\t\t\texistingIndexes.splice(j, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tawait Promise.all([\n\t\t\t...indexes.map(index => this.createIndex(...index)),\n\t\t\t...existingIndexes.filter(({ name, v }) => name && name !== \"_id_\" && (!v || v <= ACTUAL_INDEX_VERSION)).map(({ name }) => this.dropIndex(name!))\n\t\t]);\n\t} else\n\t\tawait Promise.all(indexes.map(index => this.createIndex(...index)));\n\t\n};\n\nCollection.prototype.onChange = function (this: WatchedCollection, listener) {\n\tthis.changeStream.on(\"change\", listener);\n\t\n\treturn this;\n};\n\nCollection.prototype.prependChange = function (this: WatchedCollection, listener) {\n\tthis.changeStream.prependListener(\"change\", listener);\n\t\n\treturn this;\n};\n\nCollection.prototype.onceChange = function (this: WatchedCollection, listener) {\n\tthis.changeStream.once(\"change\", listener);\n\t\n\treturn this;\n};\n\nCollection.prototype.prependOnceChange = function (this: WatchedCollection, listener) {\n\tthis.changeStream.prependOnceListener(\"change\", listener);\n\t\n\treturn this;\n};\n\nCollection.prototype.removeChangeListener = function (this: WatchedCollection, listener) {\n\tthis.changeStream.removeListener(\"change\", listener);\n\t\n\treturn this;\n};\n", "export type { Collections } from \"./Collections\";\nexport * from \"./connect\";\nexport * from \"./extensions\";\nexport * from \"./types\";\nexport { CollectionOptions } from \"./types\";\nexport * from \"./utils\";\nexport * from \"mongodb\";\n"],
5
+ "mappings": "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",
6
+ "names": ["MongoClient", "captureStackTrace", "ObjectId", "SENSITIVE", "PII", "ENV_SENSITIVE", "s", "ENV_PII", "ENV_SKIP", "SENSITIVE_SET", "PII_SET", "SKIP_SET", "cache", "CACHE_SIZE", "mask", "v", "i", "digits", "c", "length", "ensureCacheCapacity", "keyToDelete", "checkField", "key", "cached", "normalized", "pattern", "getMasker", "maskData", "data", "config", "maxDepth", "process", "obj", "depth", "item", "result", "value", "maskChangeStreamDocument", "doc", "newObjectIdString", "ObjectId", "printChangeStreamChangeDetails", "next", "maskChangeStreamDocument", "messages", "printChangeStreamError", "error", "Collections", "db", "#awaiting", "#schemaSet", "#indexesSet", "name", "options", "collection", "promise", "resolve", "reject", "changeStream", "printChangeStreamChangeDetails", "printChangeStreamError", "error", "captureStackTrace", "connect", "url", "name", "onConnect", "mongoClientOptions", "client", "MongoClient", "error", "db", "collections", "Collections", "isDeepStrictEqual", "Collection", "omit", "ACTUAL_INDEX_VERSION", "indexes", "dropOther", "existingIndexes", "i", "specification", "options", "j", "existingIndex", "index", "name", "v", "listener"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "insite-db",
3
- "version": "2.4.0",
3
+ "version": "2.6.0",
4
4
  "description": "MongoDB adapter for inSite",
5
5
  "keywords": [
6
6
  "insite",
@@ -44,8 +44,8 @@
44
44
  "devDependencies": {
45
45
  "@types/json-schema": "^7.0.15"
46
46
  },
47
- "packageManager": "bun@1.3.9",
48
47
  "engines": {
49
- "node": ">=20.0.0"
48
+ "bun": ">=1.4.4",
49
+ "node": ">=22.0.0"
50
50
  }
51
51
  }