UNPKG

@randajan/revert

Version:

A minimalist utility for running sequential steps with automatic rollback on failure.

8 lines (7 loc) 4.33 kB
{ "version": 3, "sources": ["../../../src/async/index.js"], "sourcesContent": ["\r\nimport { defaultLogFormat, verifyFn, verifyPassMode } from \"../uni\";\r\nimport { revertable, sleep, attempt } from \"./utils\";\r\n\r\nexport { revertable, sleep, attempt }\r\n\r\nconst wrapWithLogMsg = (passMode, msg, fn)=>{\r\n if (!fn) { return; }\r\n return async (a1, a2, ...a)=>{\r\n await (passMode === \"omit\" ? a1 : a2)(msg);\r\n return fn(a1, a2, ...a);\r\n }\r\n}\r\n\r\nexport class Revertable extends Array {\r\n\r\n constructor({logger, logFormat, pass=\"omit\"}) {\r\n super();\r\n\r\n Object.defineProperty(this, \"passMode\", { value:verifyPassMode(pass) });\r\n\r\n logger = verifyFn(\"Option logger\", logger);\r\n\r\n if (logger) {\r\n logFormat = verifyFn(\"Option logFormat\", logFormat) || defaultLogFormat;\r\n Object.defineProperty(this, \"logger\", {\r\n value:(data, kind, dir, s, c)=>logger(logFormat(kind, data, dir, s, c), kind, data, dir, s, c)\r\n });\r\n }\r\n }\r\n \r\n push(fwd, rwd) {\r\n super.push(Object.freeze({\r\n fwd:verifyFn(\"fwd\", fwd, true),\r\n rwd:verifyFn(\"rwd\", rwd)\r\n }));\r\n return this;\r\n }\r\n\r\n pushNamed(fwdName, fwd, rwdName, rwd) {\r\n const { logger, passMode } = this;\r\n if (!logger) { throw new Error(\"pushNamed(...) requires opt.logger to be provided\"); }\r\n return this.push(\r\n wrapWithLogMsg(passMode, fwdName, verifyFn(\"fwd\", fwd, true)),\r\n wrapWithLogMsg(passMode, rwdName, verifyFn(\"rwd\", rwd))\r\n )\r\n }\r\n\r\n async run(value) {\r\n const { logger, passMode, length } = this;\r\n const onError = logger ? (err, dir, s, c)=>logger(err, \"error\", dir, s, c) : undefined;\r\n const omit = passMode == \"omit\";\r\n\r\n return revertable(!omit ? value : undefined, length, async (value, dir, s, c)=>{\r\n const { fwd, rwd } = this[s-1];\r\n const wd = dir ? fwd : rwd;\r\n if (!wd) { return !omit ? value : undefined; }\r\n const a = [];\r\n if (!omit) { a.push(value); }\r\n if (logger) { a.push((msg, kind=\"info\")=>logger(msg, kind, dir, s, c)); }\r\n const r = await wd(...a, s, c);\r\n if (!omit) { return passMode == \"keep\" ? value : r; }\r\n }, onError);\r\n }\r\n\r\n}\r\n\r\nexport default (opt)=>new Revertable(opt);\r\n"], "mappings": ";;;;;;;;;;;;AAMA,IAAM,iBAAiB,CAAC,UAAU,KAAK,OAAK;AACxC,MAAI,CAAC,IAAI;AAAE;AAAA,EAAQ;AACnB,SAAO,OAAO,IAAI,OAAO,MAAI;AACzB,WAAO,aAAa,SAAS,KAAK,IAAI,GAAG;AACzC,WAAO,GAAG,IAAI,IAAI,GAAG,CAAC;AAAA,EAC1B;AACJ;AAEO,IAAM,aAAN,cAAyB,MAAM;AAAA,EAElC,YAAY,EAAC,QAAQ,WAAW,OAAK,OAAM,GAAG;AAC1C,UAAM;AAEN,WAAO,eAAe,MAAM,YAAY,EAAE,OAAM,eAAe,IAAI,EAAE,CAAC;AAEtE,aAAS,SAAS,iBAAiB,MAAM;AAEzC,QAAI,QAAQ;AACR,kBAAY,SAAS,oBAAoB,SAAS,KAAK;AACvD,aAAO,eAAe,MAAM,UAAU;AAAA,QAClC,OAAM,CAAC,MAAM,MAAM,KAAK,GAAG,MAAI,OAAO,UAAU,MAAM,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,MAAM,KAAK,GAAG,CAAC;AAAA,MACjG,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAEA,KAAK,KAAK,KAAK;AACX,UAAM,KAAK,OAAO,OAAO;AAAA,MACrB,KAAI,SAAS,OAAO,KAAK,IAAI;AAAA,MAC7B,KAAI,SAAS,OAAO,GAAG;AAAA,IAC3B,CAAC,CAAC;AACF,WAAO;AAAA,EACX;AAAA,EAEA,UAAU,SAAS,KAAK,SAAS,KAAK;AAClC,UAAM,EAAE,QAAQ,SAAS,IAAI;AAC7B,QAAI,CAAC,QAAQ;AAAE,YAAM,IAAI,MAAM,mDAAmD;AAAA,IAAG;AACrF,WAAO,KAAK;AAAA,MACR,eAAe,UAAU,SAAS,SAAS,OAAO,KAAK,IAAI,CAAC;AAAA,MAC5D,eAAe,UAAU,SAAS,SAAS,OAAO,GAAG,CAAC;AAAA,IAC1D;AAAA,EACJ;AAAA,EAEA,MAAM,IAAI,OAAO;AACb,UAAM,EAAE,QAAQ,UAAU,OAAO,IAAI;AACrC,UAAM,UAAU,SAAS,CAAC,KAAK,KAAK,GAAG,MAAI,OAAO,KAAK,SAAS,KAAK,GAAG,CAAC,IAAI;AAC7E,UAAM,OAAO,YAAY;AAEzB,WAAO,WAAW,CAAC,OAAO,QAAQ,QAAW,QAAQ,OAAOA,QAAO,KAAK,GAAG,MAAI;AAC3E,YAAM,EAAE,KAAK,IAAI,IAAI,KAAK,IAAE,CAAC;AAC7B,YAAM,KAAK,MAAM,MAAM;AACvB,UAAI,CAAC,IAAI;AAAE,eAAO,CAAC,OAAOA,SAAQ;AAAA,MAAW;AAC7C,YAAM,IAAI,CAAC;AACX,UAAI,CAAC,MAAM;AAAE,UAAE,KAAKA,MAAK;AAAA,MAAG;AAC5B,UAAI,QAAQ;AAAE,UAAE,KAAK,CAAC,KAAK,OAAK,WAAS,OAAO,KAAK,MAAM,KAAK,GAAG,CAAC,CAAC;AAAA,MAAG;AACxE,YAAM,IAAI,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC;AAC7B,UAAI,CAAC,MAAM;AAAE,eAAO,YAAY,SAASA,SAAQ;AAAA,MAAG;AAAA,IACxD,GAAG,OAAO;AAAA,EACd;AAEJ;AAEA,IAAO,gBAAQ,CAAC,QAAM,IAAI,WAAW,GAAG;", "names": ["value"] }