UNPKG

@shockpkg/core

Version:
1 lines 5.51 kB
{"version":3,"sources":["lock.ts"],"names":["properLockfile","property","Dispatcher","Lock","Object","constructor","path","stale","update","retries","realpath","eventCompromised","_path","held","_release","compromised","_compromised","check","r","err","code","aquire","Error","lock","onCompromised","triggerOrThrowAsync","release"],"mappings":";;;;;;AAAA,OAAOA,cAAP,MAA2B,iBAA3B;AAEA,SAAQC,QAAR,QAAuB,kBAAvB;AACA,SAAQC,UAAR,QAAyB,kBAAzB;AAEA;;;;;;AAKA,WAAaC,IAAb,WA+BEF,QAAQ,CAAC,KAAD,CA/BV,UAqCEA,QAAQ,CAAC,KAAD,CArCV,UA2CEA,QAAQ,CAAC,KAAD,CA3CV,qBAAO,MAAME,IAAN,SAAmBC,MAAnB,CAA0B;AAChC;;;;;AAMA;;;;AAKA;;;;AAKA;;;;AAKA;;;AAGA;;AAGA;;;;AAMA;;;;AAMA;;;AAMAC,EAAAA,WAAW,CAACC,IAAD,EAAe;AACzB;AADyB,SAzCnBC,KAyCmB,GAzCX,KAyCW;AAAA,SApCnBC,MAoCmB,GApCV,IAoCU;AAAA,SA/BnBC,OA+BmB,GA/BT,CA+BS;AAAA,SA1BnBC,QA0BmB,GA1BR,KA0BQ;AAAA,SApBVC,gBAoBU,GApBS,IAAIT,UAAJ,CAAsB,IAAtB,CAoBT;;AAAA;;AAAA;;AAAA;;AAGzB,SAAKU,KAAL,GAAaN,IAAb;AACA;AAED;;;;;;;AAKA,MAAWA,IAAX,GAAkB;AACjB,WAAO,KAAKM,KAAZ;AACA;AAED;;;;;;;;AAMA,MAAWC,IAAX,GAAkB;AACjB,WAAO,CAAC,CAAC,KAAKC,QAAd;AACA;AAED;;;;;;;;AAMA,MAAWC,WAAX,GAAyB;AACxB,WAAO,KAAKC,YAAZ;AACA;AAED;;;;;;;;AAMA,QAAaC,KAAb,GAAqB;AACpB;AACA,QAAIC,CAAJ;;AACA,QAAI;AACHA,MAAAA,CAAC,GAAG,MAAMlB,cAAc,CAACiB,KAAf,CAAqB,KAAKX,IAA1B,CAAV;AACA,KAFD,CAGA,OAAOa,GAAP,EAAY;AACX,UAAIA,GAAG,CAACC,IAAJ,KAAa,QAAjB,EAA2B;AAC1BF,QAAAA,CAAC,GAAG,KAAJ;AACA,OAFD,MAGK;AACJ,cAAMC,GAAN;AACA;AACD;;AACD,QAAI,CAACD,CAAL,EAAQ;AACP,WAAKJ,QAAL,GAAgB,IAAhB;AACA;;AACD,WAAOI,CAAP;AACA;AAED;;;;;AAGA,QAAaG,MAAb,GAAsB;AACrB,QAAI,KAAKP,QAAT,EAAmB;AAClB,YAAM,IAAIQ,KAAJ,CAAU,sBAAV,CAAN;AACA;;AAED,SAAKN,YAAL,GAAoB,KAApB;AAEA,SAAKF,QAAL,GAAgB,MAAMd,cAAc,CAACuB,IAAf,CAAoB,KAAKjB,IAAzB,EAA+B;AACpDC,MAAAA,KAAK,EAAE,KAAKA,KADwC;AAEpDC,MAAAA,MAAM,EAAE,KAAKA,MAFuC;AAGpDC,MAAAA,OAAO,EAAE,KAAKA,OAHsC;AAIpDC,MAAAA,QAAQ,EAAE,KAAKA,QAJqC;AAKpDc,MAAAA,aAAa,EAAE,MAAML,GAAN,IAAa;AAC3B,aAAKH,YAAL,GAAoB,IAApB;AACA,aAAKF,QAAL,GAAgB,IAAhB;AAEA,cAAM,KAAKH,gBAAL,CAAsBc,mBAAtB,CAA0CN,GAA1C,CAAN;AACA;AAVmD,KAA/B,CAAtB;AAYA;AAED;;;;;AAGA,QAAaO,OAAb,GAAuB;AACtB,QAAI,CAAC,KAAKZ,QAAV,EAAoB;AACnB,YAAM,IAAIQ,KAAJ,CAAU,kBAAV,CAAN;AACA;;AAED,UAAM,KAAKR,QAAL,EAAN;AAEA,SAAKA,QAAL,GAAgB,IAAhB;AACA;;AA9I+B,CAAjC;AAAA;AAAA;AAAA;AAAA;AAAA,WAgC0B,KAhC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WA4CoD,IA5CpD;AAAA;AAAA","sourcesContent":["import properLockfile from 'proper-lockfile';\n\nimport {property} from './decorators';\nimport {Dispatcher} from './dispatcher';\n\n/**\n * Lock constructor.\n *\n * @param path The path to lock.\n */\nexport class Lock extends Object {\n\t/**\n\t * Duration at which the lock is considered stale in milliseconds.\n\t * Minimum value of 2000.\n\t */\n\tpublic stale = 10000;\n\n\t/**\n\t * Update interval in milliseconds.\n\t */\n\tpublic update = 5000;\n\n\t/**\n\t * The number of retries to attempt to aquire the lock.\n\t */\n\tpublic retries = 0;\n\n\t/**\n\t * Resolve symlinks using realpath.\n\t */\n\tpublic realpath = false;\n\n\t/**\n\t * Compromised lock events.\n\t */\n\t// eslint-disable-next-line no-invalid-this\n\tpublic readonly eventCompromised = new Dispatcher<Error>(this);\n\n\t/**\n\t * Lock has been compromised since aquire.\n\t */\n\t@property(false)\n\tprotected _compromised = false;\n\n\t/**\n\t * The path to lock.\n\t */\n\t@property(false)\n\tprotected _path: string;\n\n\t/**\n\t * The lock release function.\n\t */\n\t@property(false)\n\tprotected _release: (() => Promise<void>) | null = null;\n\n\tconstructor(path: string) {\n\t\tsuper();\n\n\t\tthis._path = path;\n\t}\n\n\t/**\n\t * The path to lock.\n\t *\n\t * @returns The path.\n\t */\n\tpublic get path() {\n\t\treturn this._path;\n\t}\n\n\t/**\n\t * Boolean for if lock is held.\n\t * The lock could be compromised and not yet detected however.\n\t *\n\t * @returns Is held.\n\t */\n\tpublic get held() {\n\t\treturn !!this._release;\n\t}\n\n\t/**\n\t * Boolean for if the lock hase been compromised since aquire.\n\t * The lock could be compromised and not yet detected however.\n\t *\n\t * @returns Is compromised.\n\t */\n\tpublic get compromised() {\n\t\treturn this._compromised;\n\t}\n\n\t/**\n\t * Check if path is already locked by any instance including this one.\n\t * Does not verify the lock file belongs to this instance.\n\t *\n\t * @returns True if locked, false if not.\n\t */\n\tpublic async check() {\n\t\t// Will throw if not exist when using realpath, so catch.\n\t\tlet r: boolean;\n\t\ttry {\n\t\t\tr = await properLockfile.check(this.path);\n\t\t}\n\t\tcatch (err) {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\tr = false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\t\tif (!r) {\n\t\t\tthis._release = null;\n\t\t}\n\t\treturn r;\n\t}\n\n\t/**\n\t * Aquire lock or fail.\n\t */\n\tpublic async aquire() {\n\t\tif (this._release) {\n\t\t\tthrow new Error('Lock already aquired');\n\t\t}\n\n\t\tthis._compromised = false;\n\n\t\tthis._release = await properLockfile.lock(this.path, {\n\t\t\tstale: this.stale,\n\t\t\tupdate: this.update,\n\t\t\tretries: this.retries,\n\t\t\trealpath: this.realpath,\n\t\t\tonCompromised: async err => {\n\t\t\t\tthis._compromised = true;\n\t\t\t\tthis._release = null;\n\n\t\t\t\tawait this.eventCompromised.triggerOrThrowAsync(err);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Release lock or fail.\n\t */\n\tpublic async release() {\n\t\tif (!this._release) {\n\t\t\tthrow new Error('Lock not aquired');\n\t\t}\n\n\t\tawait this._release();\n\n\t\tthis._release = null;\n\t}\n}\n"],"file":"lock.mjs","sourceRoot":"../src"}