diff --git a/lib/db.js b/lib/db.js index a1fe32c..99d722a 100644 --- a/lib/db.js +++ b/lib/db.js @@ -1,12 +1,44 @@ -const Tapable = require('tapable') +const { AsyncSeriesWaterfallHook } = require('tapable'); -class DB extends Tapable { - constructor() { +class DB { + constructor(options) { // TODO + this.options = + Object.prototype.toString.call(options) === '[object Object]' + ? options + : {}; + this.hooks = { + pluginHook: new AsyncSeriesWaterfallHook(['name']), + }; + } + + plugin(name, cb) { + const { pluginHook } = this.hooks; + pluginHook.tapPromise(name, (options) => { + return new Promise(async (resolve, reject) => { + const isJudge = name === 'judge'; + const cbBack = cb(options); + if (cbBack instanceof Promise) cbBack.catch((err) => reject(err)); + let res = await cbBack; + let isErr = false; + if (res === true && isJudge) isErr = true; + if (res === true || isJudge) res = options; + if (isErr) reject(res); + else resolve(res); + }); + }); } - request() { + request(options) { // TODO + return new Promise((resolve, reject) => { + const { pluginHook } = this.hooks; + const optionsAssigned = Object.assign({}, this.options, options); + pluginHook + .promise(optionsAssigned) + .then((res) => resolve(res)) + .catch((err) => reject(err)); + }); } } diff --git a/package.json b/package.json index aad5780..c0e6d62 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "webpack": "^3.5.3" }, "dependencies": { - "puppeteer": "^16.2.0" + "puppeteer": "^16.2.0", + "tapable": "^2.2.1" } }