@tslock/mongo 2.1.0 → 2.2.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/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/mongo-accessor.ts","../src/mongo-lock.ts","../src/mongo-lock-provider.ts"],"sourcesContent":["export type { MongoLockDocument } from './mongo-lock-document.js';\nexport type { MongoLockProviderOptions } from './mongo-lock-provider.js';\nexport { createMongoLockProvider, MongoLockProvider } from './mongo-lock-provider.js';\n","import { ClockProvider, type LockConfiguration,
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/mongo-accessor.ts","../src/mongo-lock.ts","../src/mongo-lock-provider.ts"],"sourcesContent":["export type { MongoLockDocument } from './mongo-lock-document.js';\nexport type { MongoLockProviderOptions } from './mongo-lock-provider.js';\nexport { createMongoLockProvider, MongoLockProvider } from './mongo-lock-provider.js';\n","import { ClockProvider, type LockConfiguration, lockAtMostUntil, Utils, unlockTime } from '@tslock/core';\nimport type { Collection, Document, Filter, FindOneAndUpdateOptions } from 'mongodb';\nimport { MongoServerError } from 'mongodb';\nimport { MongoLock } from './mongo-lock.js';\nimport type { MongoLockDocument } from './mongo-lock-document.js';\n\nexport class MongoAccessor {\n constructor(private readonly collection: Collection<MongoLockDocument>) {}\n\n async lock(config: LockConfiguration): Promise<MongoLock | undefined> {\n const now = ClockProvider.now();\n const hostname = Utils.getHostname();\n try {\n const result = await this.collection.findOneAndUpdate(\n { _id: config.name, lockUntil: { $lte: new Date(now) } } as Filter<MongoLockDocument>,\n {\n $set: {\n lockUntil: new Date(lockAtMostUntil(config)),\n lockedAt: new Date(now),\n lockedBy: hostname,\n } as unknown as Document,\n },\n { upsert: true, returnDocument: 'after' } as FindOneAndUpdateOptions,\n );\n if (!result) return undefined;\n return new MongoLock(config, this);\n } catch (e) {\n if (e instanceof MongoServerError && e.code === 11000) {\n return undefined;\n }\n throw e;\n }\n }\n\n async extend(config: LockConfiguration): Promise<MongoLock | undefined> {\n const now = ClockProvider.now();\n const hostname = Utils.getHostname();\n const result = await this.collection.findOneAndUpdate(\n {\n _id: config.name,\n lockUntil: { $gt: new Date(now) },\n lockedBy: hostname,\n } as Filter<MongoLockDocument>,\n { $set: { lockUntil: new Date(lockAtMostUntil(config)) } } as unknown as Document,\n { returnDocument: 'after' } as FindOneAndUpdateOptions,\n );\n if (!result) return undefined;\n return new MongoLock(config, this);\n }\n\n async unlock(config: LockConfiguration): Promise<void> {\n await this.collection.findOneAndUpdate(\n { _id: config.name } as Filter<MongoLockDocument>,\n { $set: { lockUntil: new Date(unlockTime(config)) } } as unknown as Document,\n );\n }\n}\n","import { AbstractSimpleLock, type LockConfiguration, type SimpleLock } from '@tslock/core';\nimport type { MongoAccessor } from './mongo-accessor.js';\n\nexport class MongoLock extends AbstractSimpleLock {\n constructor(\n config: LockConfiguration,\n private readonly accessor: MongoAccessor,\n ) {\n super(config);\n }\n\n protected override async doUnlock(): Promise<void> {\n await this.accessor.unlock(this.config);\n }\n\n protected override async doExtend(newConfig: LockConfiguration): Promise<SimpleLock | undefined> {\n return await this.accessor.extend(newConfig);\n }\n}\n","import type { ExtensibleLockProvider, LockConfiguration, SimpleLock } from '@tslock/core';\nimport type { Collection, Db } from 'mongodb';\nimport { MongoAccessor } from './mongo-accessor.js';\nimport type { MongoLockDocument } from './mongo-lock-document.js';\n\nexport interface MongoLockProviderOptions {\n collection?: string;\n collectionOptions?: {\n writeConcern?: { w?: 'majority' | number; j?: boolean; wtimeoutMS?: number };\n readConcern?: { level?: 'local' | 'majority' | 'linearizable' | 'available' | 'snapshot' };\n };\n}\n\nexport class MongoLockProvider implements ExtensibleLockProvider {\n private readonly accessor: MongoAccessor;\n\n constructor(collection: Collection<MongoLockDocument>) {\n this.accessor = new MongoAccessor(collection);\n }\n\n async lock(config: LockConfiguration): Promise<SimpleLock | undefined> {\n return this.accessor.lock(config);\n }\n}\n\nexport function createMongoLockProvider(db: Db, options?: MongoLockProviderOptions): MongoLockProvider {\n const collectionName = options?.collection ?? 'shedLock';\n const writeConcern = { w: 'majority' as const, ...options?.collectionOptions?.writeConcern };\n const readConcern = { level: 'majority' as const, ...options?.collectionOptions?.readConcern };\n const collection = db.collection<MongoLockDocument>(collectionName, { writeConcern, readConcern });\n return new MongoLockProvider(collection);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,eAA0F;AAE1F,qBAAiC;;;ACFjC,kBAA4E;AAGrE,IAAM,YAAN,cAAwB,+BAAmB;AAAA,EAChD,YACE,QACiB,UACjB;AACA,UAAM,MAAM;AAFK;AAAA,EAGnB;AAAA,EAHmB;AAAA,EAKnB,MAAyB,WAA0B;AACjD,UAAM,KAAK,SAAS,OAAO,KAAK,MAAM;AAAA,EACxC;AAAA,EAEA,MAAyB,SAAS,WAA+D;AAC/F,WAAO,MAAM,KAAK,SAAS,OAAO,SAAS;AAAA,EAC7C;AACF;;;ADZO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,YAA2C;AAA3C;AAAA,EAA4C;AAAA,EAA5C;AAAA,EAE7B,MAAM,KAAK,QAA2D;AACpE,UAAM,MAAM,2BAAc,IAAI;AAC9B,UAAM,WAAW,mBAAM,YAAY;AACnC,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,WAAW;AAAA,QACnC,EAAE,KAAK,OAAO,MAAM,WAAW,EAAE,MAAM,IAAI,KAAK,GAAG,EAAE,EAAE;AAAA,QACvD;AAAA,UACE,MAAM;AAAA,YACJ,WAAW,IAAI,SAAK,8BAAgB,MAAM,CAAC;AAAA,YAC3C,UAAU,IAAI,KAAK,GAAG;AAAA,YACtB,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,QACA,EAAE,QAAQ,MAAM,gBAAgB,QAAQ;AAAA,MAC1C;AACA,UAAI,CAAC,OAAQ,QAAO;AACpB,aAAO,IAAI,UAAU,QAAQ,IAAI;AAAA,IACnC,SAAS,GAAG;AACV,UAAI,aAAa,mCAAoB,EAAE,SAAS,MAAO;AACrD,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,QAA2D;AACtE,UAAM,MAAM,2BAAc,IAAI;AAC9B,UAAM,WAAW,mBAAM,YAAY;AACnC,UAAM,SAAS,MAAM,KAAK,WAAW;AAAA,MACnC;AAAA,QACE,KAAK,OAAO;AAAA,QACZ,WAAW,EAAE,KAAK,IAAI,KAAK,GAAG,EAAE;AAAA,QAChC,UAAU;AAAA,MACZ;AAAA,MACA,EAAE,MAAM,EAAE,WAAW,IAAI,SAAK,8BAAgB,MAAM,CAAC,EAAE,EAAE;AAAA,MACzD,EAAE,gBAAgB,QAAQ;AAAA,IAC5B;AACA,QAAI,CAAC,OAAQ,QAAO;AACpB,WAAO,IAAI,UAAU,QAAQ,IAAI;AAAA,EACnC;AAAA,EAEA,MAAM,OAAO,QAA0C;AACrD,UAAM,KAAK,WAAW;AAAA,MACpB,EAAE,KAAK,OAAO,KAAK;AAAA,MACnB,EAAE,MAAM,EAAE,WAAW,IAAI,SAAK,yBAAW,MAAM,CAAC,EAAE,EAAE;AAAA,IACtD;AAAA,EACF;AACF;;;AE3CO,IAAM,oBAAN,MAA0D;AAAA,EAC9C;AAAA,EAEjB,YAAY,YAA2C;AACrD,SAAK,WAAW,IAAI,cAAc,UAAU;AAAA,EAC9C;AAAA,EAEA,MAAM,KAAK,QAA4D;AACrE,WAAO,KAAK,SAAS,KAAK,MAAM;AAAA,EAClC;AACF;AAEO,SAAS,wBAAwB,IAAQ,SAAuD;AACrG,QAAM,iBAAiB,SAAS,cAAc;AAC9C,QAAM,eAAe,EAAE,GAAG,YAAqB,GAAG,SAAS,mBAAmB,aAAa;AAC3F,QAAM,cAAc,EAAE,OAAO,YAAqB,GAAG,SAAS,mBAAmB,YAAY;AAC7F,QAAM,aAAa,GAAG,WAA8B,gBAAgB,EAAE,cAAc,YAAY,CAAC;AACjG,SAAO,IAAI,kBAAkB,UAAU;AACzC;","names":["import_core"]}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mongo-accessor.ts","../src/mongo-lock.ts","../src/mongo-lock-provider.ts"],"sourcesContent":["import { ClockProvider, type LockConfiguration,
|
|
1
|
+
{"version":3,"sources":["../src/mongo-accessor.ts","../src/mongo-lock.ts","../src/mongo-lock-provider.ts"],"sourcesContent":["import { ClockProvider, type LockConfiguration, lockAtMostUntil, Utils, unlockTime } from '@tslock/core';\nimport type { Collection, Document, Filter, FindOneAndUpdateOptions } from 'mongodb';\nimport { MongoServerError } from 'mongodb';\nimport { MongoLock } from './mongo-lock.js';\nimport type { MongoLockDocument } from './mongo-lock-document.js';\n\nexport class MongoAccessor {\n constructor(private readonly collection: Collection<MongoLockDocument>) {}\n\n async lock(config: LockConfiguration): Promise<MongoLock | undefined> {\n const now = ClockProvider.now();\n const hostname = Utils.getHostname();\n try {\n const result = await this.collection.findOneAndUpdate(\n { _id: config.name, lockUntil: { $lte: new Date(now) } } as Filter<MongoLockDocument>,\n {\n $set: {\n lockUntil: new Date(lockAtMostUntil(config)),\n lockedAt: new Date(now),\n lockedBy: hostname,\n } as unknown as Document,\n },\n { upsert: true, returnDocument: 'after' } as FindOneAndUpdateOptions,\n );\n if (!result) return undefined;\n return new MongoLock(config, this);\n } catch (e) {\n if (e instanceof MongoServerError && e.code === 11000) {\n return undefined;\n }\n throw e;\n }\n }\n\n async extend(config: LockConfiguration): Promise<MongoLock | undefined> {\n const now = ClockProvider.now();\n const hostname = Utils.getHostname();\n const result = await this.collection.findOneAndUpdate(\n {\n _id: config.name,\n lockUntil: { $gt: new Date(now) },\n lockedBy: hostname,\n } as Filter<MongoLockDocument>,\n { $set: { lockUntil: new Date(lockAtMostUntil(config)) } } as unknown as Document,\n { returnDocument: 'after' } as FindOneAndUpdateOptions,\n );\n if (!result) return undefined;\n return new MongoLock(config, this);\n }\n\n async unlock(config: LockConfiguration): Promise<void> {\n await this.collection.findOneAndUpdate(\n { _id: config.name } as Filter<MongoLockDocument>,\n { $set: { lockUntil: new Date(unlockTime(config)) } } as unknown as Document,\n );\n }\n}\n","import { AbstractSimpleLock, type LockConfiguration, type SimpleLock } from '@tslock/core';\nimport type { MongoAccessor } from './mongo-accessor.js';\n\nexport class MongoLock extends AbstractSimpleLock {\n constructor(\n config: LockConfiguration,\n private readonly accessor: MongoAccessor,\n ) {\n super(config);\n }\n\n protected override async doUnlock(): Promise<void> {\n await this.accessor.unlock(this.config);\n }\n\n protected override async doExtend(newConfig: LockConfiguration): Promise<SimpleLock | undefined> {\n return await this.accessor.extend(newConfig);\n }\n}\n","import type { ExtensibleLockProvider, LockConfiguration, SimpleLock } from '@tslock/core';\nimport type { Collection, Db } from 'mongodb';\nimport { MongoAccessor } from './mongo-accessor.js';\nimport type { MongoLockDocument } from './mongo-lock-document.js';\n\nexport interface MongoLockProviderOptions {\n collection?: string;\n collectionOptions?: {\n writeConcern?: { w?: 'majority' | number; j?: boolean; wtimeoutMS?: number };\n readConcern?: { level?: 'local' | 'majority' | 'linearizable' | 'available' | 'snapshot' };\n };\n}\n\nexport class MongoLockProvider implements ExtensibleLockProvider {\n private readonly accessor: MongoAccessor;\n\n constructor(collection: Collection<MongoLockDocument>) {\n this.accessor = new MongoAccessor(collection);\n }\n\n async lock(config: LockConfiguration): Promise<SimpleLock | undefined> {\n return this.accessor.lock(config);\n }\n}\n\nexport function createMongoLockProvider(db: Db, options?: MongoLockProviderOptions): MongoLockProvider {\n const collectionName = options?.collection ?? 'shedLock';\n const writeConcern = { w: 'majority' as const, ...options?.collectionOptions?.writeConcern };\n const readConcern = { level: 'majority' as const, ...options?.collectionOptions?.readConcern };\n const collection = db.collection<MongoLockDocument>(collectionName, { writeConcern, readConcern });\n return new MongoLockProvider(collection);\n}\n"],"mappings":";AAAA,SAAS,eAAuC,iBAAiB,OAAO,kBAAkB;AAE1F,SAAS,wBAAwB;;;ACFjC,SAAS,0BAAmE;AAGrE,IAAM,YAAN,cAAwB,mBAAmB;AAAA,EAChD,YACE,QACiB,UACjB;AACA,UAAM,MAAM;AAFK;AAAA,EAGnB;AAAA,EAHmB;AAAA,EAKnB,MAAyB,WAA0B;AACjD,UAAM,KAAK,SAAS,OAAO,KAAK,MAAM;AAAA,EACxC;AAAA,EAEA,MAAyB,SAAS,WAA+D;AAC/F,WAAO,MAAM,KAAK,SAAS,OAAO,SAAS;AAAA,EAC7C;AACF;;;ADZO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,YAA2C;AAA3C;AAAA,EAA4C;AAAA,EAA5C;AAAA,EAE7B,MAAM,KAAK,QAA2D;AACpE,UAAM,MAAM,cAAc,IAAI;AAC9B,UAAM,WAAW,MAAM,YAAY;AACnC,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,WAAW;AAAA,QACnC,EAAE,KAAK,OAAO,MAAM,WAAW,EAAE,MAAM,IAAI,KAAK,GAAG,EAAE,EAAE;AAAA,QACvD;AAAA,UACE,MAAM;AAAA,YACJ,WAAW,IAAI,KAAK,gBAAgB,MAAM,CAAC;AAAA,YAC3C,UAAU,IAAI,KAAK,GAAG;AAAA,YACtB,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,QACA,EAAE,QAAQ,MAAM,gBAAgB,QAAQ;AAAA,MAC1C;AACA,UAAI,CAAC,OAAQ,QAAO;AACpB,aAAO,IAAI,UAAU,QAAQ,IAAI;AAAA,IACnC,SAAS,GAAG;AACV,UAAI,aAAa,oBAAoB,EAAE,SAAS,MAAO;AACrD,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,QAA2D;AACtE,UAAM,MAAM,cAAc,IAAI;AAC9B,UAAM,WAAW,MAAM,YAAY;AACnC,UAAM,SAAS,MAAM,KAAK,WAAW;AAAA,MACnC;AAAA,QACE,KAAK,OAAO;AAAA,QACZ,WAAW,EAAE,KAAK,IAAI,KAAK,GAAG,EAAE;AAAA,QAChC,UAAU;AAAA,MACZ;AAAA,MACA,EAAE,MAAM,EAAE,WAAW,IAAI,KAAK,gBAAgB,MAAM,CAAC,EAAE,EAAE;AAAA,MACzD,EAAE,gBAAgB,QAAQ;AAAA,IAC5B;AACA,QAAI,CAAC,OAAQ,QAAO;AACpB,WAAO,IAAI,UAAU,QAAQ,IAAI;AAAA,EACnC;AAAA,EAEA,MAAM,OAAO,QAA0C;AACrD,UAAM,KAAK,WAAW;AAAA,MACpB,EAAE,KAAK,OAAO,KAAK;AAAA,MACnB,EAAE,MAAM,EAAE,WAAW,IAAI,KAAK,WAAW,MAAM,CAAC,EAAE,EAAE;AAAA,IACtD;AAAA,EACF;AACF;;;AE3CO,IAAM,oBAAN,MAA0D;AAAA,EAC9C;AAAA,EAEjB,YAAY,YAA2C;AACrD,SAAK,WAAW,IAAI,cAAc,UAAU;AAAA,EAC9C;AAAA,EAEA,MAAM,KAAK,QAA4D;AACrE,WAAO,KAAK,SAAS,KAAK,MAAM;AAAA,EAClC;AACF;AAEO,SAAS,wBAAwB,IAAQ,SAAuD;AACrG,QAAM,iBAAiB,SAAS,cAAc;AAC9C,QAAM,eAAe,EAAE,GAAG,YAAqB,GAAG,SAAS,mBAAmB,aAAa;AAC3F,QAAM,cAAc,EAAE,OAAO,YAAqB,GAAG,SAAS,mBAAmB,YAAY;AAC7F,QAAM,aAAa,GAAG,WAA8B,gBAAgB,EAAE,cAAc,YAAY,CAAC;AACjG,SAAO,IAAI,kBAAkB,UAAU;AACzC;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tslock/mongo",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "TSLock provider for MongoDB",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
25
|
"mongodb": "^7.6.0",
|
|
26
|
-
"@tslock/core": "2.
|
|
26
|
+
"@tslock/core": "2.2.0"
|
|
27
27
|
},
|
|
28
28
|
"peerDependenciesMeta": {
|
|
29
29
|
"@tslock/core": {
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
"vitest": "^4.1.11",
|
|
40
40
|
"mongodb": "^7.6.0",
|
|
41
41
|
"@testcontainers/mongodb": "^12.0.4",
|
|
42
|
-
"@tslock/core": "2.
|
|
43
|
-
"@tslock/test-support": "2.
|
|
42
|
+
"@tslock/core": "2.2.0",
|
|
43
|
+
"@tslock/test-support": "2.2.0"
|
|
44
44
|
},
|
|
45
45
|
"publishConfig": {
|
|
46
46
|
"access": "public"
|