@xylabs/mongo 4.8.9 → 4.9.1
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/browser/index.mjs
CHANGED
|
@@ -53,7 +53,7 @@ var MongoClientWrapper = class _MongoClientWrapper {
|
|
|
53
53
|
}
|
|
54
54
|
async initiateClose() {
|
|
55
55
|
const alreadyStarted = await this.delayedCloseMutex.runExclusive(() => {
|
|
56
|
-
const alreadyStarted2 =
|
|
56
|
+
const alreadyStarted2 = this.delayCount > 0;
|
|
57
57
|
this.delayCount = Math.floor(this.closeDelay / this.checkFrequency);
|
|
58
58
|
return alreadyStarted2;
|
|
59
59
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Base.ts","../../src/Wrapper.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport type {\n BulkWriteOptions,\n Collection,\n DeleteResult,\n Document,\n Filter,\n FindCursor,\n InsertOneOptions,\n MongoClient,\n OptionalUnlessRequiredId,\n UpdateFilter,\n WithId,\n} from 'mongodb'\n\nimport type { BaseMongoSdkConfig } from './Config.js'\nimport { MongoClientWrapper } from './Wrapper.js'\n\nexport class BaseMongoSdk<T extends Document> {\n config: BaseMongoSdkConfig\n\n constructor(config: BaseMongoSdkConfig) {\n this.config = config\n }\n\n get uri() {\n return (\n this.config.dbConnectionString\n // eslint-disable-next-line @stylistic/max-len\n ?? `mongodb+srv://${this.config.dbUserName}:${this.config.dbPassword}@${this.config.dbDomain}.mongodb.net/${this.config.dbName}?retryWrites=true&w=majority`\n )\n }\n\n async deleteOne(filter: Filter<T>) {\n return await this.useCollection<DeleteResult>(async (collection: Collection<T>) => {\n return await collection.deleteOne(filter)\n })\n }\n\n async find(filter: Filter<T>) {\n return await this.useCollection<FindCursor<WithId<T>>>((collection: Collection<T>) => {\n return collection.find(filter)\n })\n }\n\n async findOne(filter: Filter<T>) {\n return await this.useCollection<WithId<T> | null>(async (collection: Collection<T>) => {\n return await collection.findOne(filter)\n })\n }\n\n async insertMany(items: OptionalUnlessRequiredId<T>[], options?: BulkWriteOptions) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.insertMany(items, options)\n })\n }\n\n async insertOne(item: OptionalUnlessRequiredId<T>, options?: InsertOneOptions) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.insertOne(item, options)\n })\n }\n\n async updateOne(filter: Filter<T>, fields: UpdateFilter<T>) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.updateOne(filter, fields, { upsert: false })\n })\n }\n\n async upsertOne(filter: Filter<T>, fields: UpdateFilter<T>) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.updateOne(filter, fields, { upsert: true })\n })\n }\n\n async useCollection<R>(func: (collection: Collection<T>) => Promise<R> | R) {\n return await this.useMongo<R>(async (client: MongoClient) => {\n return await func(client.db(this.config.dbName).collection<T>(this.config.collection))\n })\n }\n\n async useMongo<R>(func: (client: MongoClient) => Promise<R> | R) {\n const wrapper = MongoClientWrapper.get(this.uri, this.config.maxPoolSize, this.config.closeDelay)\n const connection = await wrapper.connect()\n assertEx(connection, () => 'Connection failed')\n try {\n return await func(connection)\n } finally {\n await wrapper.disconnect()\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { delay } from '@xylabs/delay'\nimport { forget } from '@xylabs/forget'\nimport { Mutex } from 'async-mutex'\nimport type { MongoClientOptions } from 'mongodb'\nimport { MongoClient } from 'mongodb'\n\nexport class MongoClientWrapper {\n static readonly clients = new Map<string, MongoClientWrapper>()\n\n private checkFrequency = 100\n private client: MongoClient\n private closeDelay\n private connected = false\n private connectionMutex = new Mutex()\n private connections = 0\n private delayCount = 0\n private delayedCloseMutex = new Mutex()\n\n private uri: string\n\n constructor(uri: string, maxPoolSize?: number, closeDelay?: number) {\n this.uri = uri\n this.client = new MongoClient(uri, { maxPoolSize } as MongoClientOptions)\n this.closeDelay = closeDelay ?? 10 * 1000 /* 10 seconds default */\n }\n\n static get(uri: string, poolSize?: number, closeDelay?: number) {\n let client = this.clients.get(uri)\n if (!client) {\n client = new MongoClientWrapper(uri, poolSize, closeDelay)\n this.clients.set(uri, client)\n }\n return client\n }\n\n async connect() {\n return await this.connectionMutex.runExclusive<MongoClient>(async () => {\n if (this.connections === 0 && !this.connected) {\n await this.client.connect()\n this.connected = true\n }\n this.connections += 1\n return this.client\n })\n }\n\n async disconnect() {\n return await this.connectionMutex.runExclusive(() => {\n assertEx(this.connections > 0, () => 'Unexpected disconnect')\n this.connections -= 1\n if (this.connections === 0) {\n forget(this.initiateClose())\n }\n return this.connections\n })\n }\n\n async initiateClose() {\n const alreadyStarted = await this.delayedCloseMutex.runExclusive(() => {\n const alreadyStarted =
|
|
1
|
+
{"version":3,"sources":["../../src/Base.ts","../../src/Wrapper.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport type {\n BulkWriteOptions,\n Collection,\n DeleteResult,\n Document,\n Filter,\n FindCursor,\n InsertOneOptions,\n MongoClient,\n OptionalUnlessRequiredId,\n UpdateFilter,\n WithId,\n} from 'mongodb'\n\nimport type { BaseMongoSdkConfig } from './Config.js'\nimport { MongoClientWrapper } from './Wrapper.js'\n\nexport class BaseMongoSdk<T extends Document> {\n config: BaseMongoSdkConfig\n\n constructor(config: BaseMongoSdkConfig) {\n this.config = config\n }\n\n get uri() {\n return (\n this.config.dbConnectionString\n // eslint-disable-next-line @stylistic/max-len\n ?? `mongodb+srv://${this.config.dbUserName}:${this.config.dbPassword}@${this.config.dbDomain}.mongodb.net/${this.config.dbName}?retryWrites=true&w=majority`\n )\n }\n\n async deleteOne(filter: Filter<T>) {\n return await this.useCollection<DeleteResult>(async (collection: Collection<T>) => {\n return await collection.deleteOne(filter)\n })\n }\n\n async find(filter: Filter<T>) {\n return await this.useCollection<FindCursor<WithId<T>>>((collection: Collection<T>) => {\n return collection.find(filter)\n })\n }\n\n async findOne(filter: Filter<T>) {\n return await this.useCollection<WithId<T> | null>(async (collection: Collection<T>) => {\n return await collection.findOne(filter)\n })\n }\n\n async insertMany(items: OptionalUnlessRequiredId<T>[], options?: BulkWriteOptions) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.insertMany(items, options)\n })\n }\n\n async insertOne(item: OptionalUnlessRequiredId<T>, options?: InsertOneOptions) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.insertOne(item, options)\n })\n }\n\n async updateOne(filter: Filter<T>, fields: UpdateFilter<T>) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.updateOne(filter, fields, { upsert: false })\n })\n }\n\n async upsertOne(filter: Filter<T>, fields: UpdateFilter<T>) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.updateOne(filter, fields, { upsert: true })\n })\n }\n\n async useCollection<R>(func: (collection: Collection<T>) => Promise<R> | R) {\n return await this.useMongo<R>(async (client: MongoClient) => {\n return await func(client.db(this.config.dbName).collection<T>(this.config.collection))\n })\n }\n\n async useMongo<R>(func: (client: MongoClient) => Promise<R> | R) {\n const wrapper = MongoClientWrapper.get(this.uri, this.config.maxPoolSize, this.config.closeDelay)\n const connection = await wrapper.connect()\n assertEx(connection, () => 'Connection failed')\n try {\n return await func(connection)\n } finally {\n await wrapper.disconnect()\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { delay } from '@xylabs/delay'\nimport { forget } from '@xylabs/forget'\nimport { Mutex } from 'async-mutex'\nimport type { MongoClientOptions } from 'mongodb'\nimport { MongoClient } from 'mongodb'\n\nexport class MongoClientWrapper {\n static readonly clients = new Map<string, MongoClientWrapper>()\n\n private checkFrequency = 100\n private client: MongoClient\n private closeDelay\n private connected = false\n private connectionMutex = new Mutex()\n private connections = 0\n private delayCount = 0\n private delayedCloseMutex = new Mutex()\n\n private uri: string\n\n constructor(uri: string, maxPoolSize?: number, closeDelay?: number) {\n this.uri = uri\n this.client = new MongoClient(uri, { maxPoolSize } as MongoClientOptions)\n this.closeDelay = closeDelay ?? 10 * 1000 /* 10 seconds default */\n }\n\n static get(uri: string, poolSize?: number, closeDelay?: number) {\n let client = this.clients.get(uri)\n if (!client) {\n client = new MongoClientWrapper(uri, poolSize, closeDelay)\n this.clients.set(uri, client)\n }\n return client\n }\n\n async connect() {\n return await this.connectionMutex.runExclusive<MongoClient>(async () => {\n if (this.connections === 0 && !this.connected) {\n await this.client.connect()\n this.connected = true\n }\n this.connections += 1\n return this.client\n })\n }\n\n async disconnect() {\n return await this.connectionMutex.runExclusive(() => {\n assertEx(this.connections > 0, () => 'Unexpected disconnect')\n this.connections -= 1\n if (this.connections === 0) {\n forget(this.initiateClose())\n }\n return this.connections\n })\n }\n\n async initiateClose() {\n const alreadyStarted = await this.delayedCloseMutex.runExclusive(() => {\n const alreadyStarted = this.delayCount > 0\n this.delayCount = Math.floor(this.closeDelay / this.checkFrequency)\n return alreadyStarted\n })\n if (!alreadyStarted) {\n while (this.delayCount > 0) {\n await this.delayedCloseMutex.runExclusive(async () => {\n if (this.connections > 0 || !this.connected) {\n // cancel close\n this.delayCount = 0\n } else if (this.delayCount === 1) {\n // out of delay, close it\n await this.close()\n this.delayCount = 0\n } else {\n this.delayCount -= 1\n }\n await delay(this.checkFrequency)\n })\n }\n }\n }\n\n private async close() {\n return await this.connectionMutex.runExclusive(async () => {\n assertEx(this.connected, () => 'Unexpected close')\n this.connected = false\n await this.client.close(true)\n MongoClientWrapper.clients.delete(this.uri)\n })\n }\n}\n"],"mappings":"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","names":["assertEx","alreadyStarted","assertEx"]}
|
package/dist/neutral/index.mjs
CHANGED
|
@@ -53,7 +53,7 @@ var MongoClientWrapper = class _MongoClientWrapper {
|
|
|
53
53
|
}
|
|
54
54
|
async initiateClose() {
|
|
55
55
|
const alreadyStarted = await this.delayedCloseMutex.runExclusive(() => {
|
|
56
|
-
const alreadyStarted2 =
|
|
56
|
+
const alreadyStarted2 = this.delayCount > 0;
|
|
57
57
|
this.delayCount = Math.floor(this.closeDelay / this.checkFrequency);
|
|
58
58
|
return alreadyStarted2;
|
|
59
59
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Base.ts","../../src/Wrapper.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport type {\n BulkWriteOptions,\n Collection,\n DeleteResult,\n Document,\n Filter,\n FindCursor,\n InsertOneOptions,\n MongoClient,\n OptionalUnlessRequiredId,\n UpdateFilter,\n WithId,\n} from 'mongodb'\n\nimport type { BaseMongoSdkConfig } from './Config.js'\nimport { MongoClientWrapper } from './Wrapper.js'\n\nexport class BaseMongoSdk<T extends Document> {\n config: BaseMongoSdkConfig\n\n constructor(config: BaseMongoSdkConfig) {\n this.config = config\n }\n\n get uri() {\n return (\n this.config.dbConnectionString\n // eslint-disable-next-line @stylistic/max-len\n ?? `mongodb+srv://${this.config.dbUserName}:${this.config.dbPassword}@${this.config.dbDomain}.mongodb.net/${this.config.dbName}?retryWrites=true&w=majority`\n )\n }\n\n async deleteOne(filter: Filter<T>) {\n return await this.useCollection<DeleteResult>(async (collection: Collection<T>) => {\n return await collection.deleteOne(filter)\n })\n }\n\n async find(filter: Filter<T>) {\n return await this.useCollection<FindCursor<WithId<T>>>((collection: Collection<T>) => {\n return collection.find(filter)\n })\n }\n\n async findOne(filter: Filter<T>) {\n return await this.useCollection<WithId<T> | null>(async (collection: Collection<T>) => {\n return await collection.findOne(filter)\n })\n }\n\n async insertMany(items: OptionalUnlessRequiredId<T>[], options?: BulkWriteOptions) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.insertMany(items, options)\n })\n }\n\n async insertOne(item: OptionalUnlessRequiredId<T>, options?: InsertOneOptions) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.insertOne(item, options)\n })\n }\n\n async updateOne(filter: Filter<T>, fields: UpdateFilter<T>) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.updateOne(filter, fields, { upsert: false })\n })\n }\n\n async upsertOne(filter: Filter<T>, fields: UpdateFilter<T>) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.updateOne(filter, fields, { upsert: true })\n })\n }\n\n async useCollection<R>(func: (collection: Collection<T>) => Promise<R> | R) {\n return await this.useMongo<R>(async (client: MongoClient) => {\n return await func(client.db(this.config.dbName).collection<T>(this.config.collection))\n })\n }\n\n async useMongo<R>(func: (client: MongoClient) => Promise<R> | R) {\n const wrapper = MongoClientWrapper.get(this.uri, this.config.maxPoolSize, this.config.closeDelay)\n const connection = await wrapper.connect()\n assertEx(connection, () => 'Connection failed')\n try {\n return await func(connection)\n } finally {\n await wrapper.disconnect()\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { delay } from '@xylabs/delay'\nimport { forget } from '@xylabs/forget'\nimport { Mutex } from 'async-mutex'\nimport type { MongoClientOptions } from 'mongodb'\nimport { MongoClient } from 'mongodb'\n\nexport class MongoClientWrapper {\n static readonly clients = new Map<string, MongoClientWrapper>()\n\n private checkFrequency = 100\n private client: MongoClient\n private closeDelay\n private connected = false\n private connectionMutex = new Mutex()\n private connections = 0\n private delayCount = 0\n private delayedCloseMutex = new Mutex()\n\n private uri: string\n\n constructor(uri: string, maxPoolSize?: number, closeDelay?: number) {\n this.uri = uri\n this.client = new MongoClient(uri, { maxPoolSize } as MongoClientOptions)\n this.closeDelay = closeDelay ?? 10 * 1000 /* 10 seconds default */\n }\n\n static get(uri: string, poolSize?: number, closeDelay?: number) {\n let client = this.clients.get(uri)\n if (!client) {\n client = new MongoClientWrapper(uri, poolSize, closeDelay)\n this.clients.set(uri, client)\n }\n return client\n }\n\n async connect() {\n return await this.connectionMutex.runExclusive<MongoClient>(async () => {\n if (this.connections === 0 && !this.connected) {\n await this.client.connect()\n this.connected = true\n }\n this.connections += 1\n return this.client\n })\n }\n\n async disconnect() {\n return await this.connectionMutex.runExclusive(() => {\n assertEx(this.connections > 0, () => 'Unexpected disconnect')\n this.connections -= 1\n if (this.connections === 0) {\n forget(this.initiateClose())\n }\n return this.connections\n })\n }\n\n async initiateClose() {\n const alreadyStarted = await this.delayedCloseMutex.runExclusive(() => {\n const alreadyStarted =
|
|
1
|
+
{"version":3,"sources":["../../src/Base.ts","../../src/Wrapper.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport type {\n BulkWriteOptions,\n Collection,\n DeleteResult,\n Document,\n Filter,\n FindCursor,\n InsertOneOptions,\n MongoClient,\n OptionalUnlessRequiredId,\n UpdateFilter,\n WithId,\n} from 'mongodb'\n\nimport type { BaseMongoSdkConfig } from './Config.js'\nimport { MongoClientWrapper } from './Wrapper.js'\n\nexport class BaseMongoSdk<T extends Document> {\n config: BaseMongoSdkConfig\n\n constructor(config: BaseMongoSdkConfig) {\n this.config = config\n }\n\n get uri() {\n return (\n this.config.dbConnectionString\n // eslint-disable-next-line @stylistic/max-len\n ?? `mongodb+srv://${this.config.dbUserName}:${this.config.dbPassword}@${this.config.dbDomain}.mongodb.net/${this.config.dbName}?retryWrites=true&w=majority`\n )\n }\n\n async deleteOne(filter: Filter<T>) {\n return await this.useCollection<DeleteResult>(async (collection: Collection<T>) => {\n return await collection.deleteOne(filter)\n })\n }\n\n async find(filter: Filter<T>) {\n return await this.useCollection<FindCursor<WithId<T>>>((collection: Collection<T>) => {\n return collection.find(filter)\n })\n }\n\n async findOne(filter: Filter<T>) {\n return await this.useCollection<WithId<T> | null>(async (collection: Collection<T>) => {\n return await collection.findOne(filter)\n })\n }\n\n async insertMany(items: OptionalUnlessRequiredId<T>[], options?: BulkWriteOptions) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.insertMany(items, options)\n })\n }\n\n async insertOne(item: OptionalUnlessRequiredId<T>, options?: InsertOneOptions) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.insertOne(item, options)\n })\n }\n\n async updateOne(filter: Filter<T>, fields: UpdateFilter<T>) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.updateOne(filter, fields, { upsert: false })\n })\n }\n\n async upsertOne(filter: Filter<T>, fields: UpdateFilter<T>) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.updateOne(filter, fields, { upsert: true })\n })\n }\n\n async useCollection<R>(func: (collection: Collection<T>) => Promise<R> | R) {\n return await this.useMongo<R>(async (client: MongoClient) => {\n return await func(client.db(this.config.dbName).collection<T>(this.config.collection))\n })\n }\n\n async useMongo<R>(func: (client: MongoClient) => Promise<R> | R) {\n const wrapper = MongoClientWrapper.get(this.uri, this.config.maxPoolSize, this.config.closeDelay)\n const connection = await wrapper.connect()\n assertEx(connection, () => 'Connection failed')\n try {\n return await func(connection)\n } finally {\n await wrapper.disconnect()\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { delay } from '@xylabs/delay'\nimport { forget } from '@xylabs/forget'\nimport { Mutex } from 'async-mutex'\nimport type { MongoClientOptions } from 'mongodb'\nimport { MongoClient } from 'mongodb'\n\nexport class MongoClientWrapper {\n static readonly clients = new Map<string, MongoClientWrapper>()\n\n private checkFrequency = 100\n private client: MongoClient\n private closeDelay\n private connected = false\n private connectionMutex = new Mutex()\n private connections = 0\n private delayCount = 0\n private delayedCloseMutex = new Mutex()\n\n private uri: string\n\n constructor(uri: string, maxPoolSize?: number, closeDelay?: number) {\n this.uri = uri\n this.client = new MongoClient(uri, { maxPoolSize } as MongoClientOptions)\n this.closeDelay = closeDelay ?? 10 * 1000 /* 10 seconds default */\n }\n\n static get(uri: string, poolSize?: number, closeDelay?: number) {\n let client = this.clients.get(uri)\n if (!client) {\n client = new MongoClientWrapper(uri, poolSize, closeDelay)\n this.clients.set(uri, client)\n }\n return client\n }\n\n async connect() {\n return await this.connectionMutex.runExclusive<MongoClient>(async () => {\n if (this.connections === 0 && !this.connected) {\n await this.client.connect()\n this.connected = true\n }\n this.connections += 1\n return this.client\n })\n }\n\n async disconnect() {\n return await this.connectionMutex.runExclusive(() => {\n assertEx(this.connections > 0, () => 'Unexpected disconnect')\n this.connections -= 1\n if (this.connections === 0) {\n forget(this.initiateClose())\n }\n return this.connections\n })\n }\n\n async initiateClose() {\n const alreadyStarted = await this.delayedCloseMutex.runExclusive(() => {\n const alreadyStarted = this.delayCount > 0\n this.delayCount = Math.floor(this.closeDelay / this.checkFrequency)\n return alreadyStarted\n })\n if (!alreadyStarted) {\n while (this.delayCount > 0) {\n await this.delayedCloseMutex.runExclusive(async () => {\n if (this.connections > 0 || !this.connected) {\n // cancel close\n this.delayCount = 0\n } else if (this.delayCount === 1) {\n // out of delay, close it\n await this.close()\n this.delayCount = 0\n } else {\n this.delayCount -= 1\n }\n await delay(this.checkFrequency)\n })\n }\n }\n }\n\n private async close() {\n return await this.connectionMutex.runExclusive(async () => {\n assertEx(this.connected, () => 'Unexpected close')\n this.connected = false\n await this.client.close(true)\n MongoClientWrapper.clients.delete(this.uri)\n })\n }\n}\n"],"mappings":"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","names":["assertEx","alreadyStarted","assertEx"]}
|
package/dist/node/index.mjs
CHANGED
|
@@ -53,7 +53,7 @@ var MongoClientWrapper = class _MongoClientWrapper {
|
|
|
53
53
|
}
|
|
54
54
|
async initiateClose() {
|
|
55
55
|
const alreadyStarted = await this.delayedCloseMutex.runExclusive(() => {
|
|
56
|
-
const alreadyStarted2 =
|
|
56
|
+
const alreadyStarted2 = this.delayCount > 0;
|
|
57
57
|
this.delayCount = Math.floor(this.closeDelay / this.checkFrequency);
|
|
58
58
|
return alreadyStarted2;
|
|
59
59
|
});
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Base.ts","../../src/Wrapper.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport type {\n BulkWriteOptions,\n Collection,\n DeleteResult,\n Document,\n Filter,\n FindCursor,\n InsertOneOptions,\n MongoClient,\n OptionalUnlessRequiredId,\n UpdateFilter,\n WithId,\n} from 'mongodb'\n\nimport type { BaseMongoSdkConfig } from './Config.js'\nimport { MongoClientWrapper } from './Wrapper.js'\n\nexport class BaseMongoSdk<T extends Document> {\n config: BaseMongoSdkConfig\n\n constructor(config: BaseMongoSdkConfig) {\n this.config = config\n }\n\n get uri() {\n return (\n this.config.dbConnectionString\n // eslint-disable-next-line @stylistic/max-len\n ?? `mongodb+srv://${this.config.dbUserName}:${this.config.dbPassword}@${this.config.dbDomain}.mongodb.net/${this.config.dbName}?retryWrites=true&w=majority`\n )\n }\n\n async deleteOne(filter: Filter<T>) {\n return await this.useCollection<DeleteResult>(async (collection: Collection<T>) => {\n return await collection.deleteOne(filter)\n })\n }\n\n async find(filter: Filter<T>) {\n return await this.useCollection<FindCursor<WithId<T>>>((collection: Collection<T>) => {\n return collection.find(filter)\n })\n }\n\n async findOne(filter: Filter<T>) {\n return await this.useCollection<WithId<T> | null>(async (collection: Collection<T>) => {\n return await collection.findOne(filter)\n })\n }\n\n async insertMany(items: OptionalUnlessRequiredId<T>[], options?: BulkWriteOptions) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.insertMany(items, options)\n })\n }\n\n async insertOne(item: OptionalUnlessRequiredId<T>, options?: InsertOneOptions) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.insertOne(item, options)\n })\n }\n\n async updateOne(filter: Filter<T>, fields: UpdateFilter<T>) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.updateOne(filter, fields, { upsert: false })\n })\n }\n\n async upsertOne(filter: Filter<T>, fields: UpdateFilter<T>) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.updateOne(filter, fields, { upsert: true })\n })\n }\n\n async useCollection<R>(func: (collection: Collection<T>) => Promise<R> | R) {\n return await this.useMongo<R>(async (client: MongoClient) => {\n return await func(client.db(this.config.dbName).collection<T>(this.config.collection))\n })\n }\n\n async useMongo<R>(func: (client: MongoClient) => Promise<R> | R) {\n const wrapper = MongoClientWrapper.get(this.uri, this.config.maxPoolSize, this.config.closeDelay)\n const connection = await wrapper.connect()\n assertEx(connection, () => 'Connection failed')\n try {\n return await func(connection)\n } finally {\n await wrapper.disconnect()\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { delay } from '@xylabs/delay'\nimport { forget } from '@xylabs/forget'\nimport { Mutex } from 'async-mutex'\nimport type { MongoClientOptions } from 'mongodb'\nimport { MongoClient } from 'mongodb'\n\nexport class MongoClientWrapper {\n static readonly clients = new Map<string, MongoClientWrapper>()\n\n private checkFrequency = 100\n private client: MongoClient\n private closeDelay\n private connected = false\n private connectionMutex = new Mutex()\n private connections = 0\n private delayCount = 0\n private delayedCloseMutex = new Mutex()\n\n private uri: string\n\n constructor(uri: string, maxPoolSize?: number, closeDelay?: number) {\n this.uri = uri\n this.client = new MongoClient(uri, { maxPoolSize } as MongoClientOptions)\n this.closeDelay = closeDelay ?? 10 * 1000 /* 10 seconds default */\n }\n\n static get(uri: string, poolSize?: number, closeDelay?: number) {\n let client = this.clients.get(uri)\n if (!client) {\n client = new MongoClientWrapper(uri, poolSize, closeDelay)\n this.clients.set(uri, client)\n }\n return client\n }\n\n async connect() {\n return await this.connectionMutex.runExclusive<MongoClient>(async () => {\n if (this.connections === 0 && !this.connected) {\n await this.client.connect()\n this.connected = true\n }\n this.connections += 1\n return this.client\n })\n }\n\n async disconnect() {\n return await this.connectionMutex.runExclusive(() => {\n assertEx(this.connections > 0, () => 'Unexpected disconnect')\n this.connections -= 1\n if (this.connections === 0) {\n forget(this.initiateClose())\n }\n return this.connections\n })\n }\n\n async initiateClose() {\n const alreadyStarted = await this.delayedCloseMutex.runExclusive(() => {\n const alreadyStarted =
|
|
1
|
+
{"version":3,"sources":["../../src/Base.ts","../../src/Wrapper.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport type {\n BulkWriteOptions,\n Collection,\n DeleteResult,\n Document,\n Filter,\n FindCursor,\n InsertOneOptions,\n MongoClient,\n OptionalUnlessRequiredId,\n UpdateFilter,\n WithId,\n} from 'mongodb'\n\nimport type { BaseMongoSdkConfig } from './Config.js'\nimport { MongoClientWrapper } from './Wrapper.js'\n\nexport class BaseMongoSdk<T extends Document> {\n config: BaseMongoSdkConfig\n\n constructor(config: BaseMongoSdkConfig) {\n this.config = config\n }\n\n get uri() {\n return (\n this.config.dbConnectionString\n // eslint-disable-next-line @stylistic/max-len\n ?? `mongodb+srv://${this.config.dbUserName}:${this.config.dbPassword}@${this.config.dbDomain}.mongodb.net/${this.config.dbName}?retryWrites=true&w=majority`\n )\n }\n\n async deleteOne(filter: Filter<T>) {\n return await this.useCollection<DeleteResult>(async (collection: Collection<T>) => {\n return await collection.deleteOne(filter)\n })\n }\n\n async find(filter: Filter<T>) {\n return await this.useCollection<FindCursor<WithId<T>>>((collection: Collection<T>) => {\n return collection.find(filter)\n })\n }\n\n async findOne(filter: Filter<T>) {\n return await this.useCollection<WithId<T> | null>(async (collection: Collection<T>) => {\n return await collection.findOne(filter)\n })\n }\n\n async insertMany(items: OptionalUnlessRequiredId<T>[], options?: BulkWriteOptions) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.insertMany(items, options)\n })\n }\n\n async insertOne(item: OptionalUnlessRequiredId<T>, options?: InsertOneOptions) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.insertOne(item, options)\n })\n }\n\n async updateOne(filter: Filter<T>, fields: UpdateFilter<T>) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.updateOne(filter, fields, { upsert: false })\n })\n }\n\n async upsertOne(filter: Filter<T>, fields: UpdateFilter<T>) {\n return await this.useCollection(async (collection: Collection<T>) => {\n return await collection.updateOne(filter, fields, { upsert: true })\n })\n }\n\n async useCollection<R>(func: (collection: Collection<T>) => Promise<R> | R) {\n return await this.useMongo<R>(async (client: MongoClient) => {\n return await func(client.db(this.config.dbName).collection<T>(this.config.collection))\n })\n }\n\n async useMongo<R>(func: (client: MongoClient) => Promise<R> | R) {\n const wrapper = MongoClientWrapper.get(this.uri, this.config.maxPoolSize, this.config.closeDelay)\n const connection = await wrapper.connect()\n assertEx(connection, () => 'Connection failed')\n try {\n return await func(connection)\n } finally {\n await wrapper.disconnect()\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { delay } from '@xylabs/delay'\nimport { forget } from '@xylabs/forget'\nimport { Mutex } from 'async-mutex'\nimport type { MongoClientOptions } from 'mongodb'\nimport { MongoClient } from 'mongodb'\n\nexport class MongoClientWrapper {\n static readonly clients = new Map<string, MongoClientWrapper>()\n\n private checkFrequency = 100\n private client: MongoClient\n private closeDelay\n private connected = false\n private connectionMutex = new Mutex()\n private connections = 0\n private delayCount = 0\n private delayedCloseMutex = new Mutex()\n\n private uri: string\n\n constructor(uri: string, maxPoolSize?: number, closeDelay?: number) {\n this.uri = uri\n this.client = new MongoClient(uri, { maxPoolSize } as MongoClientOptions)\n this.closeDelay = closeDelay ?? 10 * 1000 /* 10 seconds default */\n }\n\n static get(uri: string, poolSize?: number, closeDelay?: number) {\n let client = this.clients.get(uri)\n if (!client) {\n client = new MongoClientWrapper(uri, poolSize, closeDelay)\n this.clients.set(uri, client)\n }\n return client\n }\n\n async connect() {\n return await this.connectionMutex.runExclusive<MongoClient>(async () => {\n if (this.connections === 0 && !this.connected) {\n await this.client.connect()\n this.connected = true\n }\n this.connections += 1\n return this.client\n })\n }\n\n async disconnect() {\n return await this.connectionMutex.runExclusive(() => {\n assertEx(this.connections > 0, () => 'Unexpected disconnect')\n this.connections -= 1\n if (this.connections === 0) {\n forget(this.initiateClose())\n }\n return this.connections\n })\n }\n\n async initiateClose() {\n const alreadyStarted = await this.delayedCloseMutex.runExclusive(() => {\n const alreadyStarted = this.delayCount > 0\n this.delayCount = Math.floor(this.closeDelay / this.checkFrequency)\n return alreadyStarted\n })\n if (!alreadyStarted) {\n while (this.delayCount > 0) {\n await this.delayedCloseMutex.runExclusive(async () => {\n if (this.connections > 0 || !this.connected) {\n // cancel close\n this.delayCount = 0\n } else if (this.delayCount === 1) {\n // out of delay, close it\n await this.close()\n this.delayCount = 0\n } else {\n this.delayCount -= 1\n }\n await delay(this.checkFrequency)\n })\n }\n }\n }\n\n private async close() {\n return await this.connectionMutex.runExclusive(async () => {\n assertEx(this.connected, () => 'Unexpected close')\n this.connected = false\n await this.client.close(true)\n MongoClientWrapper.clients.delete(this.uri)\n })\n }\n}\n"],"mappings":"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","names":["assertEx","alreadyStarted","assertEx"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xylabs/mongo",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.9.1",
|
|
4
4
|
"description": "Base functionality used throughout XYO TypeScript/JavaScript libraries that access Mongo DB",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mongo",
|
|
@@ -40,17 +40,17 @@
|
|
|
40
40
|
"module": "dist/node/index.mjs",
|
|
41
41
|
"types": "dist/types/index.d.ts",
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@xylabs/assert": "^4.
|
|
44
|
-
"@xylabs/delay": "^4.
|
|
45
|
-
"@xylabs/forget": "^4.
|
|
43
|
+
"@xylabs/assert": "^4.9.1",
|
|
44
|
+
"@xylabs/delay": "^4.9.1",
|
|
45
|
+
"@xylabs/forget": "^4.9.1",
|
|
46
46
|
"async-mutex": "^0.5.0",
|
|
47
47
|
"mongodb": "~6.13.1"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@xylabs/ts-scripts-yarn3": "^6.
|
|
51
|
-
"@xylabs/tsconfig": "^6.
|
|
50
|
+
"@xylabs/ts-scripts-yarn3": "^6.5.5",
|
|
51
|
+
"@xylabs/tsconfig": "^6.5.5",
|
|
52
52
|
"typescript": "^5.8.3",
|
|
53
|
-
"vitest": "^3.1.
|
|
53
|
+
"vitest": "^3.1.3"
|
|
54
54
|
},
|
|
55
55
|
"publishConfig": {
|
|
56
56
|
"access": "public"
|
package/src/Wrapper.ts
CHANGED
|
@@ -58,7 +58,7 @@ export class MongoClientWrapper {
|
|
|
58
58
|
|
|
59
59
|
async initiateClose() {
|
|
60
60
|
const alreadyStarted = await this.delayedCloseMutex.runExclusive(() => {
|
|
61
|
-
const alreadyStarted =
|
|
61
|
+
const alreadyStarted = this.delayCount > 0
|
|
62
62
|
this.delayCount = Math.floor(this.closeDelay / this.checkFrequency)
|
|
63
63
|
return alreadyStarted
|
|
64
64
|
})
|