diff --git a/dist/index.cjs b/dist/index.cjs index 80bd81e..2110ea4 100644 --- a/dist/index.cjs +++ b/dist/index.cjs @@ -39,6 +39,7 @@ __export(src_exports, { createAsyncQueue: () => createAsyncQueue, createAsyncQueues: () => createAsyncQueues, dept: () => dept, + limit: () => limit, permission: () => permission, role: () => role, router: () => router, @@ -531,6 +532,19 @@ function dept(depts) { } }; } +function limit(opt) { + return (target, name, value) => { + const key = target[name]; + let limitObj = { limit: opt || true }; + if (RouterMap.decoratedRouters.has(key)) { + let objCurrent = RouterMap.decoratedRouters.get(key); + Object.assign(objCurrent, limitObj); + RouterMap.decoratedRouters.set(target[name], objCurrent); + } else { + RouterMap.decoratedRouters.set(target[name], limitObj); + } + }; +} // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { BaseController, @@ -544,6 +558,7 @@ function dept(depts) { createAsyncQueue, createAsyncQueues, dept, + limit, permission, role, router, diff --git a/dist/index.cjs.map b/dist/index.cjs.map index e3a30db..14656c6 100644 --- a/dist/index.cjs.map +++ b/dist/index.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.ts","../src/common/ZError.ts","../src/decorators/singleton.ts","../src/common/SyncLocker.ts","../src/common/base.controller.ts","../src/common/AsyncQueue.ts","../src/redis/ZRedisClient.ts","../src/decorators/router.ts"],"sourcesContent":["export * from './common/ZError'\nexport * from './common/SyncLocker'\nexport * from './common/base.controller'\nexport * from './common/AsyncQueue'\n\nexport * from './redis/ZRedisClient'\n\nexport * from './decorators/router'\nexport * from './decorators/singleton'\n","export class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n","/**\n * Singletonize a class\n * Usage:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * It can also be used without a decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() // returns `true`\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton, argumentsList, newTarget) {\n // Skip proxy for children\n if (target.prototype !== newTarget.prototype) {\n return Reflect.construct(target, argumentsList, newTarget)\n }\n if (!target[SINGLETON_KEY]) {\n target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget)\n }\n return target[SINGLETON_KEY]\n },\n })\n","import { singleton } from 'decorators/singleton'\nimport { ZError } from './ZError'\n\ninterface IRequest {\n method: string\n url: string\n user?: {\n id: string\n }\n}\n\n@singleton\nexport class SyncLocker {\n map: Map = new Map()\n\n public lock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n return false\n }\n this.map.set(key, true)\n return true\n }\n\n public unlock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n this.map.delete(key)\n }\n\n public checkLock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n throw new ZError(100, 'request too fast')\n }\n this.lock(req)\n return true\n }\n\n public isLocked(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n return this.map.has(key)\n }\n}\n","export const ROLE_ANON = 'anon'\nexport class BaseController {}\n","type Callback = () => Promise\n\nexport type AsyncQueue = {\n push: (task: Callback) => Promise\n flush: () => Promise\n size: number\n}\n\n/**\n * Ensures that each callback pushed onto the queue is executed in series.\n * Such a quetie 😻\n * @param opts.dedupeConcurrent If dedupeConcurrent is `true` it ensures that if multiple\n * tasks are pushed onto the queue while there is an active task, only the\n * last one will be executed, once the active task has completed.\n * e.g. in the below example, only 0 and 3 will be executed.\n * ```\n * const queue = createAsyncQueue({ dedupeConcurrent: true })\n * queue.push(async () => console.log(0)) // returns 0\n * queue.push(async () => console.log(1)) // returns 3\n * queue.push(async () => console.log(2)) // returns 3\n * queue.push(async () => console.log(3)) // returns 3\n * ```\n * */\nexport function createAsyncQueue(opts = { dedupeConcurrent: false }): AsyncQueue {\n const { dedupeConcurrent } = opts\n let queue: Callback[] = []\n let running: Promise | undefined\n let nextPromise = new DeferredPromise()\n const push = (task: Callback) => {\n let taskPromise = new DeferredPromise()\n if (dedupeConcurrent) {\n queue = []\n if (nextPromise.started) nextPromise = new DeferredPromise()\n taskPromise = nextPromise\n }\n queue.push(() => {\n taskPromise.started = true\n task().then(taskPromise.resolve).catch(taskPromise.reject)\n return taskPromise.promise\n })\n if (!running) running = start()\n return taskPromise.promise\n }\n const start = async () => {\n while (queue.length) {\n const task = queue.shift()!\n await task().catch(() => {})\n }\n running = undefined\n }\n return {\n push,\n flush: () => running || Promise.resolve(),\n get size() {\n return queue.length\n },\n }\n}\n\nexport const createAsyncQueues = (opts = { dedupeConcurrent: false }) => {\n const queues: { [queueId: string]: AsyncQueue } = {}\n const push = (queueId: string, task: Callback) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].push(task)\n }\n const flush = (queueId: string) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].flush()\n }\n return { push, flush }\n}\n\nclass DeferredPromise {\n started = false\n resolve: (x: T | PromiseLike) => void = () => {}\n reject: (x: E) => void = () => {}\n promise: Promise\n\n constructor() {\n this.promise = new Promise((res, rej) => {\n this.resolve = res\n this.reject = rej\n })\n }\n}\n","import { singleton } from 'decorators/singleton'\nimport { ClientOpts, RedisClient, createClient } from 'redis'\nimport { promisify } from 'util'\n\ntype Callback = (...args: any[]) => void\n\n@singleton\nexport class ZRedisClient {\n public pub: RedisClient\n public sub: RedisClient\n\n protected subscribeAsync: any\n protected unsubscribeAsync: any\n protected publishAsync: any\n\n protected subscriptions: { [channel: string]: Callback[] } = {}\n\n protected smembersAsync: any\n protected sismemberAsync: any\n protected hgetAsync: any\n protected hlenAsync: any\n protected pubsubAsync: any\n protected incrAsync: any\n protected decrAsync: any\n\n constructor(opts?: ClientOpts) {\n this.sub = createClient(opts)\n this.pub = createClient(opts)\n\n // no listener limit\n this.sub.setMaxListeners(0)\n\n // create promisified pub/sub methods.\n this.subscribeAsync = promisify(this.sub.subscribe).bind(this.sub)\n this.unsubscribeAsync = promisify(this.sub.unsubscribe).bind(this.sub)\n\n this.publishAsync = promisify(this.pub.publish).bind(this.pub)\n\n // create promisified redis methods.\n this.smembersAsync = promisify(this.pub.smembers).bind(this.pub)\n this.sismemberAsync = promisify(this.pub.sismember).bind(this.pub)\n this.hlenAsync = promisify(this.pub.hlen).bind(this.pub)\n this.hgetAsync = promisify(this.pub.hget).bind(this.pub)\n this.pubsubAsync = promisify(this.pub.pubsub).bind(this.pub)\n this.decrAsync = promisify(this.pub.decr).bind(this.pub)\n this.incrAsync = promisify(this.pub.incr).bind(this.pub)\n }\n\n public async subscribe(topic: string, callback: Callback) {\n if (!this.subscriptions[topic]) {\n this.subscriptions[topic] = []\n }\n\n this.subscriptions[topic].push(callback)\n\n if (this.sub.listeners('message').length === 0) {\n this.sub.addListener('message', this.handleSubscription)\n }\n\n await this.subscribeAsync(topic)\n\n return this\n }\n\n public async unsubscribe(topic: string, callback?: Callback) {\n if (callback) {\n const index = this.subscriptions[topic].indexOf(callback)\n this.subscriptions[topic].splice(index, 1)\n } else {\n this.subscriptions[topic] = []\n }\n\n if (this.subscriptions[topic].length === 0) {\n await this.unsubscribeAsync(topic)\n }\n\n return this\n }\n\n public async publish(topic: string, data: any) {\n if (data === undefined) {\n data = false\n }\n\n await this.publishAsync(topic, JSON.stringify(data))\n }\n\n public async exists(roomId: string): Promise {\n return (await this.pubsubAsync('channels', roomId)).length > 0\n }\n\n public async setex(key: string, value: string, seconds: number) {\n return new Promise(resolve => this.pub.setex(key, seconds, value, resolve))\n }\n\n public async expire(key: string, seconds: number) {\n return new Promise(resolve => this.pub.expire(key, seconds, resolve))\n }\n\n public async get(key: string): Promise {\n return new Promise((resolve, reject) => {\n this.pub.get(key, (err, data: string | null) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async set(key: string, val: string) {\n return new Promise(resolve => {\n this.pub.set(key, val, () => {\n resolve && resolve('')\n })\n })\n }\n\n public async del(roomId: string) {\n return new Promise(resolve => {\n this.pub.del(roomId, resolve)\n })\n }\n\n public async sadd(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.sadd(key, value, resolve)\n })\n }\n\n public async smembers(key: string): Promise {\n return await this.smembersAsync(key)\n }\n\n public async sismember(key: string, field: string): Promise {\n return await this.sismemberAsync(key, field)\n }\n\n public async srem(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.srem(key, value, resolve)\n })\n }\n\n public async scard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.scard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n public async srandmember(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.srandmember(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async sinter(...keys: string[]) {\n return new Promise((resolve, reject) => {\n this.pub.sinter(...keys, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zadd(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zadd(key, value, member, resolve)\n })\n }\n\n public async zincrby(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zincrby(key, value, member, resolve)\n })\n }\n\n public async zrangebyscore(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zrangebyscore(key, min, max, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.zcard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcount(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zcount(key, min, max, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrank(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zrevrank(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zscore(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zscore(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrange(key: string, start: number, end: number): Promise {\n return new Promise((resolve, reject) => {\n this.pub.zrevrange(key, start, end, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async hset(key: string, field: string, value: string) {\n return new Promise(resolve => {\n this.pub.hset(key, field, value, resolve)\n })\n }\n\n public async hincrby(key: string, field: string, value: number) {\n return new Promise(resolve => {\n this.pub.hincrby(key, field, value, resolve)\n })\n }\n\n public async hget(key: string, field: string) {\n return await this.hgetAsync(key, field)\n }\n\n public async hgetall(key: string) {\n return new Promise<{ [key: string]: string }>((resolve, reject) => {\n this.pub.hgetall(key, (err, values) => {\n if (err) {\n return reject(err)\n }\n resolve(values)\n })\n })\n }\n\n public async hdel(key: string, field: string) {\n return new Promise((resolve, reject) => {\n this.pub.hdel(key, field, (err, ok) => {\n if (err) {\n return reject(err)\n }\n resolve(ok)\n })\n })\n }\n\n public async hlen(key: string): Promise {\n return await this.hlenAsync(key)\n }\n\n public async incr(key: string): Promise {\n return await this.incrAsync(key)\n }\n\n public async decr(key: string): Promise {\n return await this.decrAsync(key)\n }\n\n protected handleSubscription = (channel: string, message: string) => {\n if (this.subscriptions[channel]) {\n for (let i = 0, l = this.subscriptions[channel].length; i < l; i++) {\n this.subscriptions[channel][i](JSON.parse(message))\n }\n }\n }\n}\n","import { BaseController } from '../common/base.controller'\n\nexport class RouterData {\n target?: any\n method?: string\n path?: string\n fun?: Function\n}\n\nexport class RouterMap {\n static decoratedRouters: Map<\n Function,\n {\n roles?: string[]\n permissions?: string[][]\n data?: RouterData[]\n depts?: string[]\n }\n > = new Map()\n}\n\nexport function router(route?: string) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n if (!route) {\n const controller = target.constructor.name\n const controllerName = controller.toLowerCase().replace('.controller', '')\n route = 'all ' + ['', controllerName, name].join('/')\n }\n const split = route.split(' ')\n if (split.length > 2) {\n throw new Error('Only one space is allowed in @router()')\n }\n const [method, path] = split\n // @ts-ignore\n const key = target[name]\n let routerData = new RouterData()\n routerData.target = target\n routerData.method = method\n routerData.path = path\n // @ts-ignore\n routerData.fun = target[name]\n\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n if (!objCurrent.data) {\n objCurrent.data = [routerData]\n } else {\n objCurrent.data.push(routerData)\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n let routerObj = {\n data: [routerData],\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], routerObj)\n }\n }\n}\n\nexport function role(roles?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let roleList: string[] = []\n if (roles) {\n if (Array.isArray(roles)) {\n roleList = roles\n } else {\n roleList = [roles]\n }\n }\n // @ts-ignore\n const key = target[name]\n let roleObj = { roles: roleList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, roleObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], roleObj)\n }\n }\n}\n\nexport function permission(permissions?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let permissionList: string[][] = [[]]\n if (permissions) {\n if (Array.isArray(permissions)) {\n let arr = []\n for (let sub of permissions) {\n arr.push(sub.split(':'))\n }\n permissionList = arr\n } else {\n permissionList = [permissions.split(':')]\n }\n }\n // @ts-ignore\n const key = target[name]\n let permissionObj = { permissions: permissionList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, permissionObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], permissionObj)\n }\n }\n}\n\n/**\n * If there is a dept modifier, you need to verify whether the department id exists.\n */\nexport function dept(depts?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let deptList: string[] = []\n if (depts) {\n if (Array.isArray(depts)) {\n deptList = depts\n } else {\n deptList = [depts]\n }\n }\n // @ts-ignore\n const key = target[name]\n let deptObj = { depts: deptList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, deptObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], deptObj)\n }\n }\n}\n"],"mappings":"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","names":[]} \ No newline at end of file +{"version":3,"sources":["../src/index.ts","../src/common/ZError.ts","../src/decorators/singleton.ts","../src/common/SyncLocker.ts","../src/common/base.controller.ts","../src/common/AsyncQueue.ts","../src/redis/ZRedisClient.ts","../src/decorators/router.ts"],"sourcesContent":["export * from './common/ZError'\nexport * from './common/SyncLocker'\nexport * from './common/base.controller'\nexport * from './common/AsyncQueue'\n\nexport * from './redis/ZRedisClient'\n\nexport * from './decorators/router'\nexport * from './decorators/singleton'\n","export class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n","/**\n * Singletonize a class\n * Usage:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * It can also be used without a decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() // returns `true`\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton, argumentsList, newTarget) {\n // Skip proxy for children\n if (target.prototype !== newTarget.prototype) {\n return Reflect.construct(target, argumentsList, newTarget)\n }\n if (!target[SINGLETON_KEY]) {\n target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget)\n }\n return target[SINGLETON_KEY]\n },\n })\n","import { singleton } from 'decorators/singleton'\nimport { ZError } from './ZError'\n\ninterface IRequest {\n method: string\n url: string\n user?: {\n id: string\n }\n}\n\n@singleton\nexport class SyncLocker {\n map: Map = new Map()\n\n public lock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n return false\n }\n this.map.set(key, true)\n return true\n }\n\n public unlock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n this.map.delete(key)\n }\n\n public checkLock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n throw new ZError(100, 'request too fast')\n }\n this.lock(req)\n return true\n }\n\n public isLocked(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n return this.map.has(key)\n }\n}\n","export const ROLE_ANON = 'anon'\nexport class BaseController {}\n","type Callback = () => Promise\n\nexport type AsyncQueue = {\n push: (task: Callback) => Promise\n flush: () => Promise\n size: number\n}\n\n/**\n * Ensures that each callback pushed onto the queue is executed in series.\n * Such a quetie 😻\n * @param opts.dedupeConcurrent If dedupeConcurrent is `true` it ensures that if multiple\n * tasks are pushed onto the queue while there is an active task, only the\n * last one will be executed, once the active task has completed.\n * e.g. in the below example, only 0 and 3 will be executed.\n * ```\n * const queue = createAsyncQueue({ dedupeConcurrent: true })\n * queue.push(async () => console.log(0)) // returns 0\n * queue.push(async () => console.log(1)) // returns 3\n * queue.push(async () => console.log(2)) // returns 3\n * queue.push(async () => console.log(3)) // returns 3\n * ```\n * */\nexport function createAsyncQueue(opts = { dedupeConcurrent: false }): AsyncQueue {\n const { dedupeConcurrent } = opts\n let queue: Callback[] = []\n let running: Promise | undefined\n let nextPromise = new DeferredPromise()\n const push = (task: Callback) => {\n let taskPromise = new DeferredPromise()\n if (dedupeConcurrent) {\n queue = []\n if (nextPromise.started) nextPromise = new DeferredPromise()\n taskPromise = nextPromise\n }\n queue.push(() => {\n taskPromise.started = true\n task().then(taskPromise.resolve).catch(taskPromise.reject)\n return taskPromise.promise\n })\n if (!running) running = start()\n return taskPromise.promise\n }\n const start = async () => {\n while (queue.length) {\n const task = queue.shift()!\n await task().catch(() => {})\n }\n running = undefined\n }\n return {\n push,\n flush: () => running || Promise.resolve(),\n get size() {\n return queue.length\n },\n }\n}\n\nexport const createAsyncQueues = (opts = { dedupeConcurrent: false }) => {\n const queues: { [queueId: string]: AsyncQueue } = {}\n const push = (queueId: string, task: Callback) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].push(task)\n }\n const flush = (queueId: string) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].flush()\n }\n return { push, flush }\n}\n\nclass DeferredPromise {\n started = false\n resolve: (x: T | PromiseLike) => void = () => {}\n reject: (x: E) => void = () => {}\n promise: Promise\n\n constructor() {\n this.promise = new Promise((res, rej) => {\n this.resolve = res\n this.reject = rej\n })\n }\n}\n","import { singleton } from 'decorators/singleton'\nimport { ClientOpts, RedisClient, createClient } from 'redis'\nimport { promisify } from 'util'\n\ntype Callback = (...args: any[]) => void\n\n@singleton\nexport class ZRedisClient {\n public pub: RedisClient\n public sub: RedisClient\n\n protected subscribeAsync: any\n protected unsubscribeAsync: any\n protected publishAsync: any\n\n protected subscriptions: { [channel: string]: Callback[] } = {}\n\n protected smembersAsync: any\n protected sismemberAsync: any\n protected hgetAsync: any\n protected hlenAsync: any\n protected pubsubAsync: any\n protected incrAsync: any\n protected decrAsync: any\n\n constructor(opts?: ClientOpts) {\n this.sub = createClient(opts)\n this.pub = createClient(opts)\n\n // no listener limit\n this.sub.setMaxListeners(0)\n\n // create promisified pub/sub methods.\n this.subscribeAsync = promisify(this.sub.subscribe).bind(this.sub)\n this.unsubscribeAsync = promisify(this.sub.unsubscribe).bind(this.sub)\n\n this.publishAsync = promisify(this.pub.publish).bind(this.pub)\n\n // create promisified redis methods.\n this.smembersAsync = promisify(this.pub.smembers).bind(this.pub)\n this.sismemberAsync = promisify(this.pub.sismember).bind(this.pub)\n this.hlenAsync = promisify(this.pub.hlen).bind(this.pub)\n this.hgetAsync = promisify(this.pub.hget).bind(this.pub)\n this.pubsubAsync = promisify(this.pub.pubsub).bind(this.pub)\n this.decrAsync = promisify(this.pub.decr).bind(this.pub)\n this.incrAsync = promisify(this.pub.incr).bind(this.pub)\n }\n\n public async subscribe(topic: string, callback: Callback) {\n if (!this.subscriptions[topic]) {\n this.subscriptions[topic] = []\n }\n\n this.subscriptions[topic].push(callback)\n\n if (this.sub.listeners('message').length === 0) {\n this.sub.addListener('message', this.handleSubscription)\n }\n\n await this.subscribeAsync(topic)\n\n return this\n }\n\n public async unsubscribe(topic: string, callback?: Callback) {\n if (callback) {\n const index = this.subscriptions[topic].indexOf(callback)\n this.subscriptions[topic].splice(index, 1)\n } else {\n this.subscriptions[topic] = []\n }\n\n if (this.subscriptions[topic].length === 0) {\n await this.unsubscribeAsync(topic)\n }\n\n return this\n }\n\n public async publish(topic: string, data: any) {\n if (data === undefined) {\n data = false\n }\n\n await this.publishAsync(topic, JSON.stringify(data))\n }\n\n public async exists(roomId: string): Promise {\n return (await this.pubsubAsync('channels', roomId)).length > 0\n }\n\n public async setex(key: string, value: string, seconds: number) {\n return new Promise(resolve => this.pub.setex(key, seconds, value, resolve))\n }\n\n public async expire(key: string, seconds: number) {\n return new Promise(resolve => this.pub.expire(key, seconds, resolve))\n }\n\n public async get(key: string): Promise {\n return new Promise((resolve, reject) => {\n this.pub.get(key, (err, data: string | null) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async set(key: string, val: string) {\n return new Promise(resolve => {\n this.pub.set(key, val, () => {\n resolve && resolve('')\n })\n })\n }\n\n public async del(roomId: string) {\n return new Promise(resolve => {\n this.pub.del(roomId, resolve)\n })\n }\n\n public async sadd(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.sadd(key, value, resolve)\n })\n }\n\n public async smembers(key: string): Promise {\n return await this.smembersAsync(key)\n }\n\n public async sismember(key: string, field: string): Promise {\n return await this.sismemberAsync(key, field)\n }\n\n public async srem(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.srem(key, value, resolve)\n })\n }\n\n public async scard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.scard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n public async srandmember(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.srandmember(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async sinter(...keys: string[]) {\n return new Promise((resolve, reject) => {\n this.pub.sinter(...keys, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zadd(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zadd(key, value, member, resolve)\n })\n }\n\n public async zincrby(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zincrby(key, value, member, resolve)\n })\n }\n\n public async zrangebyscore(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zrangebyscore(key, min, max, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.zcard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcount(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zcount(key, min, max, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrank(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zrevrank(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zscore(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zscore(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrange(key: string, start: number, end: number): Promise {\n return new Promise((resolve, reject) => {\n this.pub.zrevrange(key, start, end, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async hset(key: string, field: string, value: string) {\n return new Promise(resolve => {\n this.pub.hset(key, field, value, resolve)\n })\n }\n\n public async hincrby(key: string, field: string, value: number) {\n return new Promise(resolve => {\n this.pub.hincrby(key, field, value, resolve)\n })\n }\n\n public async hget(key: string, field: string) {\n return await this.hgetAsync(key, field)\n }\n\n public async hgetall(key: string) {\n return new Promise<{ [key: string]: string }>((resolve, reject) => {\n this.pub.hgetall(key, (err, values) => {\n if (err) {\n return reject(err)\n }\n resolve(values)\n })\n })\n }\n\n public async hdel(key: string, field: string) {\n return new Promise((resolve, reject) => {\n this.pub.hdel(key, field, (err, ok) => {\n if (err) {\n return reject(err)\n }\n resolve(ok)\n })\n })\n }\n\n public async hlen(key: string): Promise {\n return await this.hlenAsync(key)\n }\n\n public async incr(key: string): Promise {\n return await this.incrAsync(key)\n }\n\n public async decr(key: string): Promise {\n return await this.decrAsync(key)\n }\n\n protected handleSubscription = (channel: string, message: string) => {\n if (this.subscriptions[channel]) {\n for (let i = 0, l = this.subscriptions[channel].length; i < l; i++) {\n this.subscriptions[channel][i](JSON.parse(message))\n }\n }\n }\n}\n","import { BaseController } from '../common/base.controller'\n\nexport class RouterData {\n target?: any\n method?: string\n path?: string\n fun?: Function\n}\n\nexport class RouterMap {\n static decoratedRouters: Map<\n Function,\n {\n roles?: string[]\n permissions?: string[][]\n data?: RouterData[]\n depts?: string[]\n limit?: any\n limitMethod?: Function\n }\n > = new Map()\n}\n\nexport function router(route?: string) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n if (!route) {\n const controller = target.constructor.name\n const controllerName = controller.toLowerCase().replace('.controller', '')\n route = 'all ' + ['', controllerName, name].join('/')\n }\n const split = route.split(' ')\n if (split.length > 2) {\n throw new Error('Only one space is allowed in @router()')\n }\n const [method, path] = split\n // @ts-ignore\n const key = target[name]\n let routerData = new RouterData()\n routerData.target = target\n routerData.method = method\n routerData.path = path\n // @ts-ignore\n routerData.fun = target[name]\n\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n if (!objCurrent.data) {\n objCurrent.data = [routerData]\n } else {\n objCurrent.data.push(routerData)\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n let routerObj = {\n data: [routerData],\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], routerObj)\n }\n }\n}\n\nexport function role(roles?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let roleList: string[] = []\n if (roles) {\n if (Array.isArray(roles)) {\n roleList = roles\n } else {\n roleList = [roles]\n }\n }\n // @ts-ignore\n const key = target[name]\n let roleObj = { roles: roleList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, roleObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], roleObj)\n }\n }\n}\n\nexport function permission(permissions?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let permissionList: string[][] = [[]]\n if (permissions) {\n if (Array.isArray(permissions)) {\n let arr = []\n for (let sub of permissions) {\n arr.push(sub.split(':'))\n }\n permissionList = arr\n } else {\n permissionList = [permissions.split(':')]\n }\n }\n // @ts-ignore\n const key = target[name]\n let permissionObj = { permissions: permissionList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, permissionObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], permissionObj)\n }\n }\n}\n\n/**\n * If there is a dept modifier, you need to verify whether the department id exists.\n */\nexport function dept(depts?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let deptList: string[] = []\n if (depts) {\n if (Array.isArray(depts)) {\n deptList = depts\n } else {\n deptList = [depts]\n }\n }\n // @ts-ignore\n const key = target[name]\n let deptObj = { depts: deptList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, deptObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], deptObj)\n }\n }\n}\n\n/**\n * 是否需要限流\n * 使用 @fastify/rate-limit\n */\nexport function limit(opt?: any) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n // @ts-ignore\n const key = target[name]\n let limitObj = { limit: opt || true }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, limitObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], limitObj)\n }\n }\n}\n\n"],"mappings":"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","names":[]} \ No newline at end of file diff --git a/dist/index.d.cts b/dist/index.d.cts index ce6099d..c719ec2 100644 --- a/dist/index.d.cts +++ b/dist/index.d.cts @@ -72,6 +72,8 @@ declare class RouterMap { permissions?: string[][]; data?: RouterData[]; depts?: string[]; + limit?: any; + limitMethod?: Function; }>; } declare function router(route?: string): (target: BaseController, name: string, value: PropertyDescriptor) => void; @@ -81,6 +83,11 @@ declare function permission(permissions?: string | string[]): (target: BaseContr * If there is a dept modifier, you need to verify whether the department id exists. */ declare function dept(depts?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void; +/** + * 是否需要限流 + * 使用 @fastify/rate-limit + */ +declare function limit(opt?: any): (target: BaseController, name: string, value: PropertyDescriptor) => void; /** * Singletonize a class @@ -98,4 +105,4 @@ type Singleton any> = T & { }; declare const singleton: any>(classTarget: T) => T; -export { BaseController, RouterData, RouterMap, SINGLETON_KEY, type Singleton, ZRedisClient, dept, permission, role, router, singleton }; +export { BaseController, RouterData, RouterMap, SINGLETON_KEY, type Singleton, ZRedisClient, dept, limit, permission, role, router, singleton }; diff --git a/dist/index.d.ts b/dist/index.d.ts index fafc06b..3ea59fb 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -72,6 +72,8 @@ declare class RouterMap { permissions?: string[][]; data?: RouterData[]; depts?: string[]; + limit?: any; + limitMethod?: Function; }>; } declare function router(route?: string): (target: BaseController, name: string, value: PropertyDescriptor) => void; @@ -81,6 +83,11 @@ declare function permission(permissions?: string | string[]): (target: BaseContr * If there is a dept modifier, you need to verify whether the department id exists. */ declare function dept(depts?: string | string[]): (target: BaseController, name: string, value: PropertyDescriptor) => void; +/** + * 是否需要限流 + * 使用 @fastify/rate-limit + */ +declare function limit(opt?: any): (target: BaseController, name: string, value: PropertyDescriptor) => void; /** * Singletonize a class @@ -98,4 +105,4 @@ type Singleton any> = T & { }; declare const singleton: any>(classTarget: T) => T; -export { BaseController, RouterData, RouterMap, SINGLETON_KEY, type Singleton, ZRedisClient, dept, permission, role, router, singleton }; +export { BaseController, RouterData, RouterMap, SINGLETON_KEY, type Singleton, ZRedisClient, dept, limit, permission, role, router, singleton }; diff --git a/dist/index.js b/dist/index.js index f71ffc0..1e4fae1 100644 --- a/dist/index.js +++ b/dist/index.js @@ -495,6 +495,19 @@ function dept(depts) { } }; } +function limit(opt) { + return (target, name, value) => { + const key = target[name]; + let limitObj = { limit: opt || true }; + if (RouterMap.decoratedRouters.has(key)) { + let objCurrent = RouterMap.decoratedRouters.get(key); + Object.assign(objCurrent, limitObj); + RouterMap.decoratedRouters.set(target[name], objCurrent); + } else { + RouterMap.decoratedRouters.set(target[name], limitObj); + } + }; +} export { BaseController, ROLE_ANON, @@ -507,6 +520,7 @@ export { createAsyncQueue, createAsyncQueues, dept, + limit, permission, role, router, diff --git a/dist/index.js.map b/dist/index.js.map index 43b882e..0cd5062 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/common/ZError.ts","../src/decorators/singleton.ts","../src/common/SyncLocker.ts","../src/common/base.controller.ts","../src/common/AsyncQueue.ts","../src/redis/ZRedisClient.ts","../src/decorators/router.ts"],"sourcesContent":["export class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n","/**\n * Singletonize a class\n * Usage:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * It can also be used without a decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() // returns `true`\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton, argumentsList, newTarget) {\n // Skip proxy for children\n if (target.prototype !== newTarget.prototype) {\n return Reflect.construct(target, argumentsList, newTarget)\n }\n if (!target[SINGLETON_KEY]) {\n target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget)\n }\n return target[SINGLETON_KEY]\n },\n })\n","import { singleton } from 'decorators/singleton'\nimport { ZError } from './ZError'\n\ninterface IRequest {\n method: string\n url: string\n user?: {\n id: string\n }\n}\n\n@singleton\nexport class SyncLocker {\n map: Map = new Map()\n\n public lock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n return false\n }\n this.map.set(key, true)\n return true\n }\n\n public unlock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n this.map.delete(key)\n }\n\n public checkLock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n throw new ZError(100, 'request too fast')\n }\n this.lock(req)\n return true\n }\n\n public isLocked(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n return this.map.has(key)\n }\n}\n","export const ROLE_ANON = 'anon'\nexport class BaseController {}\n","type Callback = () => Promise\n\nexport type AsyncQueue = {\n push: (task: Callback) => Promise\n flush: () => Promise\n size: number\n}\n\n/**\n * Ensures that each callback pushed onto the queue is executed in series.\n * Such a quetie 😻\n * @param opts.dedupeConcurrent If dedupeConcurrent is `true` it ensures that if multiple\n * tasks are pushed onto the queue while there is an active task, only the\n * last one will be executed, once the active task has completed.\n * e.g. in the below example, only 0 and 3 will be executed.\n * ```\n * const queue = createAsyncQueue({ dedupeConcurrent: true })\n * queue.push(async () => console.log(0)) // returns 0\n * queue.push(async () => console.log(1)) // returns 3\n * queue.push(async () => console.log(2)) // returns 3\n * queue.push(async () => console.log(3)) // returns 3\n * ```\n * */\nexport function createAsyncQueue(opts = { dedupeConcurrent: false }): AsyncQueue {\n const { dedupeConcurrent } = opts\n let queue: Callback[] = []\n let running: Promise | undefined\n let nextPromise = new DeferredPromise()\n const push = (task: Callback) => {\n let taskPromise = new DeferredPromise()\n if (dedupeConcurrent) {\n queue = []\n if (nextPromise.started) nextPromise = new DeferredPromise()\n taskPromise = nextPromise\n }\n queue.push(() => {\n taskPromise.started = true\n task().then(taskPromise.resolve).catch(taskPromise.reject)\n return taskPromise.promise\n })\n if (!running) running = start()\n return taskPromise.promise\n }\n const start = async () => {\n while (queue.length) {\n const task = queue.shift()!\n await task().catch(() => {})\n }\n running = undefined\n }\n return {\n push,\n flush: () => running || Promise.resolve(),\n get size() {\n return queue.length\n },\n }\n}\n\nexport const createAsyncQueues = (opts = { dedupeConcurrent: false }) => {\n const queues: { [queueId: string]: AsyncQueue } = {}\n const push = (queueId: string, task: Callback) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].push(task)\n }\n const flush = (queueId: string) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].flush()\n }\n return { push, flush }\n}\n\nclass DeferredPromise {\n started = false\n resolve: (x: T | PromiseLike) => void = () => {}\n reject: (x: E) => void = () => {}\n promise: Promise\n\n constructor() {\n this.promise = new Promise((res, rej) => {\n this.resolve = res\n this.reject = rej\n })\n }\n}\n","import { singleton } from 'decorators/singleton'\nimport { ClientOpts, RedisClient, createClient } from 'redis'\nimport { promisify } from 'util'\n\ntype Callback = (...args: any[]) => void\n\n@singleton\nexport class ZRedisClient {\n public pub: RedisClient\n public sub: RedisClient\n\n protected subscribeAsync: any\n protected unsubscribeAsync: any\n protected publishAsync: any\n\n protected subscriptions: { [channel: string]: Callback[] } = {}\n\n protected smembersAsync: any\n protected sismemberAsync: any\n protected hgetAsync: any\n protected hlenAsync: any\n protected pubsubAsync: any\n protected incrAsync: any\n protected decrAsync: any\n\n constructor(opts?: ClientOpts) {\n this.sub = createClient(opts)\n this.pub = createClient(opts)\n\n // no listener limit\n this.sub.setMaxListeners(0)\n\n // create promisified pub/sub methods.\n this.subscribeAsync = promisify(this.sub.subscribe).bind(this.sub)\n this.unsubscribeAsync = promisify(this.sub.unsubscribe).bind(this.sub)\n\n this.publishAsync = promisify(this.pub.publish).bind(this.pub)\n\n // create promisified redis methods.\n this.smembersAsync = promisify(this.pub.smembers).bind(this.pub)\n this.sismemberAsync = promisify(this.pub.sismember).bind(this.pub)\n this.hlenAsync = promisify(this.pub.hlen).bind(this.pub)\n this.hgetAsync = promisify(this.pub.hget).bind(this.pub)\n this.pubsubAsync = promisify(this.pub.pubsub).bind(this.pub)\n this.decrAsync = promisify(this.pub.decr).bind(this.pub)\n this.incrAsync = promisify(this.pub.incr).bind(this.pub)\n }\n\n public async subscribe(topic: string, callback: Callback) {\n if (!this.subscriptions[topic]) {\n this.subscriptions[topic] = []\n }\n\n this.subscriptions[topic].push(callback)\n\n if (this.sub.listeners('message').length === 0) {\n this.sub.addListener('message', this.handleSubscription)\n }\n\n await this.subscribeAsync(topic)\n\n return this\n }\n\n public async unsubscribe(topic: string, callback?: Callback) {\n if (callback) {\n const index = this.subscriptions[topic].indexOf(callback)\n this.subscriptions[topic].splice(index, 1)\n } else {\n this.subscriptions[topic] = []\n }\n\n if (this.subscriptions[topic].length === 0) {\n await this.unsubscribeAsync(topic)\n }\n\n return this\n }\n\n public async publish(topic: string, data: any) {\n if (data === undefined) {\n data = false\n }\n\n await this.publishAsync(topic, JSON.stringify(data))\n }\n\n public async exists(roomId: string): Promise {\n return (await this.pubsubAsync('channels', roomId)).length > 0\n }\n\n public async setex(key: string, value: string, seconds: number) {\n return new Promise(resolve => this.pub.setex(key, seconds, value, resolve))\n }\n\n public async expire(key: string, seconds: number) {\n return new Promise(resolve => this.pub.expire(key, seconds, resolve))\n }\n\n public async get(key: string): Promise {\n return new Promise((resolve, reject) => {\n this.pub.get(key, (err, data: string | null) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async set(key: string, val: string) {\n return new Promise(resolve => {\n this.pub.set(key, val, () => {\n resolve && resolve('')\n })\n })\n }\n\n public async del(roomId: string) {\n return new Promise(resolve => {\n this.pub.del(roomId, resolve)\n })\n }\n\n public async sadd(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.sadd(key, value, resolve)\n })\n }\n\n public async smembers(key: string): Promise {\n return await this.smembersAsync(key)\n }\n\n public async sismember(key: string, field: string): Promise {\n return await this.sismemberAsync(key, field)\n }\n\n public async srem(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.srem(key, value, resolve)\n })\n }\n\n public async scard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.scard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n public async srandmember(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.srandmember(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async sinter(...keys: string[]) {\n return new Promise((resolve, reject) => {\n this.pub.sinter(...keys, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zadd(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zadd(key, value, member, resolve)\n })\n }\n\n public async zincrby(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zincrby(key, value, member, resolve)\n })\n }\n\n public async zrangebyscore(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zrangebyscore(key, min, max, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.zcard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcount(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zcount(key, min, max, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrank(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zrevrank(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zscore(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zscore(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrange(key: string, start: number, end: number): Promise {\n return new Promise((resolve, reject) => {\n this.pub.zrevrange(key, start, end, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async hset(key: string, field: string, value: string) {\n return new Promise(resolve => {\n this.pub.hset(key, field, value, resolve)\n })\n }\n\n public async hincrby(key: string, field: string, value: number) {\n return new Promise(resolve => {\n this.pub.hincrby(key, field, value, resolve)\n })\n }\n\n public async hget(key: string, field: string) {\n return await this.hgetAsync(key, field)\n }\n\n public async hgetall(key: string) {\n return new Promise<{ [key: string]: string }>((resolve, reject) => {\n this.pub.hgetall(key, (err, values) => {\n if (err) {\n return reject(err)\n }\n resolve(values)\n })\n })\n }\n\n public async hdel(key: string, field: string) {\n return new Promise((resolve, reject) => {\n this.pub.hdel(key, field, (err, ok) => {\n if (err) {\n return reject(err)\n }\n resolve(ok)\n })\n })\n }\n\n public async hlen(key: string): Promise {\n return await this.hlenAsync(key)\n }\n\n public async incr(key: string): Promise {\n return await this.incrAsync(key)\n }\n\n public async decr(key: string): Promise {\n return await this.decrAsync(key)\n }\n\n protected handleSubscription = (channel: string, message: string) => {\n if (this.subscriptions[channel]) {\n for (let i = 0, l = this.subscriptions[channel].length; i < l; i++) {\n this.subscriptions[channel][i](JSON.parse(message))\n }\n }\n }\n}\n","import { BaseController } from '../common/base.controller'\n\nexport class RouterData {\n target?: any\n method?: string\n path?: string\n fun?: Function\n}\n\nexport class RouterMap {\n static decoratedRouters: Map<\n Function,\n {\n roles?: string[]\n permissions?: string[][]\n data?: RouterData[]\n depts?: string[]\n }\n > = new Map()\n}\n\nexport function router(route?: string) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n if (!route) {\n const controller = target.constructor.name\n const controllerName = controller.toLowerCase().replace('.controller', '')\n route = 'all ' + ['', controllerName, name].join('/')\n }\n const split = route.split(' ')\n if (split.length > 2) {\n throw new Error('Only one space is allowed in @router()')\n }\n const [method, path] = split\n // @ts-ignore\n const key = target[name]\n let routerData = new RouterData()\n routerData.target = target\n routerData.method = method\n routerData.path = path\n // @ts-ignore\n routerData.fun = target[name]\n\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n if (!objCurrent.data) {\n objCurrent.data = [routerData]\n } else {\n objCurrent.data.push(routerData)\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n let routerObj = {\n data: [routerData],\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], routerObj)\n }\n }\n}\n\nexport function role(roles?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let roleList: string[] = []\n if (roles) {\n if (Array.isArray(roles)) {\n roleList = roles\n } else {\n roleList = [roles]\n }\n }\n // @ts-ignore\n const key = target[name]\n let roleObj = { roles: roleList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, roleObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], roleObj)\n }\n }\n}\n\nexport function permission(permissions?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let permissionList: string[][] = [[]]\n if (permissions) {\n if (Array.isArray(permissions)) {\n let arr = []\n for (let sub of permissions) {\n arr.push(sub.split(':'))\n }\n permissionList = arr\n } else {\n permissionList = [permissions.split(':')]\n }\n }\n // @ts-ignore\n const key = target[name]\n let permissionObj = { permissions: permissionList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, permissionObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], permissionObj)\n }\n }\n}\n\n/**\n * If there is a dept modifier, you need to verify whether the department id exists.\n */\nexport function dept(depts?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let deptList: string[] = []\n if (depts) {\n if (Array.isArray(depts)) {\n deptList = depts\n } else {\n deptList = [depts]\n }\n }\n // @ts-ignore\n const key = target[name]\n let deptObj = { depts: deptList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, deptObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], deptObj)\n }\n }\n}\n"],"mappings":"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","names":[]} \ No newline at end of file +{"version":3,"sources":["../src/common/ZError.ts","../src/decorators/singleton.ts","../src/common/SyncLocker.ts","../src/common/base.controller.ts","../src/common/AsyncQueue.ts","../src/redis/ZRedisClient.ts","../src/decorators/router.ts"],"sourcesContent":["export class ZError implements Error {\n code: string\n statusCode?: number\n message: string\n name: string\n\n constructor(statusCode: number, message: string) {\n this.statusCode = statusCode\n this.message = message\n }\n}\n","/**\n * Singletonize a class\n * Usage:\n * @singleton\n * class Test {}\n * new Test() === new Test() // returns `true`\n * It can also be used without a decorator\n * const TestSingleton = singleton(Test)\n * new TestSingleton() === new TestSingleton() // returns `true`\n */\n\nexport const SINGLETON_KEY = Symbol()\n\nexport type Singleton any> = T & {\n [SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never\n}\nexport const singleton = any>(classTarget: T) =>\n new Proxy(classTarget, {\n construct(target: Singleton, argumentsList, newTarget) {\n // Skip proxy for children\n if (target.prototype !== newTarget.prototype) {\n return Reflect.construct(target, argumentsList, newTarget)\n }\n if (!target[SINGLETON_KEY]) {\n target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget)\n }\n return target[SINGLETON_KEY]\n },\n })\n","import { singleton } from 'decorators/singleton'\nimport { ZError } from './ZError'\n\ninterface IRequest {\n method: string\n url: string\n user?: {\n id: string\n }\n}\n\n@singleton\nexport class SyncLocker {\n map: Map = new Map()\n\n public lock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n return false\n }\n this.map.set(key, true)\n return true\n }\n\n public unlock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n this.map.delete(key)\n }\n\n public checkLock(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n if (this.map.has(key)) {\n throw new ZError(100, 'request too fast')\n }\n this.lock(req)\n return true\n }\n\n public isLocked(req: IRequest) {\n const key = `${req.method}:${req.url}:${req.user?.id || ''}`\n return this.map.has(key)\n }\n}\n","export const ROLE_ANON = 'anon'\nexport class BaseController {}\n","type Callback = () => Promise\n\nexport type AsyncQueue = {\n push: (task: Callback) => Promise\n flush: () => Promise\n size: number\n}\n\n/**\n * Ensures that each callback pushed onto the queue is executed in series.\n * Such a quetie 😻\n * @param opts.dedupeConcurrent If dedupeConcurrent is `true` it ensures that if multiple\n * tasks are pushed onto the queue while there is an active task, only the\n * last one will be executed, once the active task has completed.\n * e.g. in the below example, only 0 and 3 will be executed.\n * ```\n * const queue = createAsyncQueue({ dedupeConcurrent: true })\n * queue.push(async () => console.log(0)) // returns 0\n * queue.push(async () => console.log(1)) // returns 3\n * queue.push(async () => console.log(2)) // returns 3\n * queue.push(async () => console.log(3)) // returns 3\n * ```\n * */\nexport function createAsyncQueue(opts = { dedupeConcurrent: false }): AsyncQueue {\n const { dedupeConcurrent } = opts\n let queue: Callback[] = []\n let running: Promise | undefined\n let nextPromise = new DeferredPromise()\n const push = (task: Callback) => {\n let taskPromise = new DeferredPromise()\n if (dedupeConcurrent) {\n queue = []\n if (nextPromise.started) nextPromise = new DeferredPromise()\n taskPromise = nextPromise\n }\n queue.push(() => {\n taskPromise.started = true\n task().then(taskPromise.resolve).catch(taskPromise.reject)\n return taskPromise.promise\n })\n if (!running) running = start()\n return taskPromise.promise\n }\n const start = async () => {\n while (queue.length) {\n const task = queue.shift()!\n await task().catch(() => {})\n }\n running = undefined\n }\n return {\n push,\n flush: () => running || Promise.resolve(),\n get size() {\n return queue.length\n },\n }\n}\n\nexport const createAsyncQueues = (opts = { dedupeConcurrent: false }) => {\n const queues: { [queueId: string]: AsyncQueue } = {}\n const push = (queueId: string, task: Callback) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].push(task)\n }\n const flush = (queueId: string) => {\n if (!queues[queueId]) queues[queueId] = createAsyncQueue(opts)\n return queues[queueId].flush()\n }\n return { push, flush }\n}\n\nclass DeferredPromise {\n started = false\n resolve: (x: T | PromiseLike) => void = () => {}\n reject: (x: E) => void = () => {}\n promise: Promise\n\n constructor() {\n this.promise = new Promise((res, rej) => {\n this.resolve = res\n this.reject = rej\n })\n }\n}\n","import { singleton } from 'decorators/singleton'\nimport { ClientOpts, RedisClient, createClient } from 'redis'\nimport { promisify } from 'util'\n\ntype Callback = (...args: any[]) => void\n\n@singleton\nexport class ZRedisClient {\n public pub: RedisClient\n public sub: RedisClient\n\n protected subscribeAsync: any\n protected unsubscribeAsync: any\n protected publishAsync: any\n\n protected subscriptions: { [channel: string]: Callback[] } = {}\n\n protected smembersAsync: any\n protected sismemberAsync: any\n protected hgetAsync: any\n protected hlenAsync: any\n protected pubsubAsync: any\n protected incrAsync: any\n protected decrAsync: any\n\n constructor(opts?: ClientOpts) {\n this.sub = createClient(opts)\n this.pub = createClient(opts)\n\n // no listener limit\n this.sub.setMaxListeners(0)\n\n // create promisified pub/sub methods.\n this.subscribeAsync = promisify(this.sub.subscribe).bind(this.sub)\n this.unsubscribeAsync = promisify(this.sub.unsubscribe).bind(this.sub)\n\n this.publishAsync = promisify(this.pub.publish).bind(this.pub)\n\n // create promisified redis methods.\n this.smembersAsync = promisify(this.pub.smembers).bind(this.pub)\n this.sismemberAsync = promisify(this.pub.sismember).bind(this.pub)\n this.hlenAsync = promisify(this.pub.hlen).bind(this.pub)\n this.hgetAsync = promisify(this.pub.hget).bind(this.pub)\n this.pubsubAsync = promisify(this.pub.pubsub).bind(this.pub)\n this.decrAsync = promisify(this.pub.decr).bind(this.pub)\n this.incrAsync = promisify(this.pub.incr).bind(this.pub)\n }\n\n public async subscribe(topic: string, callback: Callback) {\n if (!this.subscriptions[topic]) {\n this.subscriptions[topic] = []\n }\n\n this.subscriptions[topic].push(callback)\n\n if (this.sub.listeners('message').length === 0) {\n this.sub.addListener('message', this.handleSubscription)\n }\n\n await this.subscribeAsync(topic)\n\n return this\n }\n\n public async unsubscribe(topic: string, callback?: Callback) {\n if (callback) {\n const index = this.subscriptions[topic].indexOf(callback)\n this.subscriptions[topic].splice(index, 1)\n } else {\n this.subscriptions[topic] = []\n }\n\n if (this.subscriptions[topic].length === 0) {\n await this.unsubscribeAsync(topic)\n }\n\n return this\n }\n\n public async publish(topic: string, data: any) {\n if (data === undefined) {\n data = false\n }\n\n await this.publishAsync(topic, JSON.stringify(data))\n }\n\n public async exists(roomId: string): Promise {\n return (await this.pubsubAsync('channels', roomId)).length > 0\n }\n\n public async setex(key: string, value: string, seconds: number) {\n return new Promise(resolve => this.pub.setex(key, seconds, value, resolve))\n }\n\n public async expire(key: string, seconds: number) {\n return new Promise(resolve => this.pub.expire(key, seconds, resolve))\n }\n\n public async get(key: string): Promise {\n return new Promise((resolve, reject) => {\n this.pub.get(key, (err, data: string | null) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async set(key: string, val: string) {\n return new Promise(resolve => {\n this.pub.set(key, val, () => {\n resolve && resolve('')\n })\n })\n }\n\n public async del(roomId: string) {\n return new Promise(resolve => {\n this.pub.del(roomId, resolve)\n })\n }\n\n public async sadd(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.sadd(key, value, resolve)\n })\n }\n\n public async smembers(key: string): Promise {\n return await this.smembersAsync(key)\n }\n\n public async sismember(key: string, field: string): Promise {\n return await this.sismemberAsync(key, field)\n }\n\n public async srem(key: string, value: any) {\n return new Promise(resolve => {\n this.pub.srem(key, value, resolve)\n })\n }\n\n public async scard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.scard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n public async srandmember(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.srandmember(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async sinter(...keys: string[]) {\n return new Promise((resolve, reject) => {\n this.pub.sinter(...keys, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zadd(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zadd(key, value, member, resolve)\n })\n }\n\n public async zincrby(key: string, value: any, member: string) {\n return new Promise(resolve => {\n this.pub.zincrby(key, value, member, resolve)\n })\n }\n\n public async zrangebyscore(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zrangebyscore(key, min, max, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcard(key: string) {\n return new Promise((resolve, reject) => {\n this.pub.zcard(key, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zcount(key: string, min: number, max: number) {\n return new Promise((resolve, reject) => {\n this.pub.zcount(key, min, max, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrank(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zrevrank(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zscore(key: string, member: string) {\n return new Promise((resolve, reject) => {\n this.pub.zscore(key, member, (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async zrevrange(key: string, start: number, end: number): Promise {\n return new Promise((resolve, reject) => {\n this.pub.zrevrange(key, start, end, 'withscores', (err, data) => {\n if (err) {\n return reject(err)\n }\n resolve(data)\n })\n })\n }\n\n public async hset(key: string, field: string, value: string) {\n return new Promise(resolve => {\n this.pub.hset(key, field, value, resolve)\n })\n }\n\n public async hincrby(key: string, field: string, value: number) {\n return new Promise(resolve => {\n this.pub.hincrby(key, field, value, resolve)\n })\n }\n\n public async hget(key: string, field: string) {\n return await this.hgetAsync(key, field)\n }\n\n public async hgetall(key: string) {\n return new Promise<{ [key: string]: string }>((resolve, reject) => {\n this.pub.hgetall(key, (err, values) => {\n if (err) {\n return reject(err)\n }\n resolve(values)\n })\n })\n }\n\n public async hdel(key: string, field: string) {\n return new Promise((resolve, reject) => {\n this.pub.hdel(key, field, (err, ok) => {\n if (err) {\n return reject(err)\n }\n resolve(ok)\n })\n })\n }\n\n public async hlen(key: string): Promise {\n return await this.hlenAsync(key)\n }\n\n public async incr(key: string): Promise {\n return await this.incrAsync(key)\n }\n\n public async decr(key: string): Promise {\n return await this.decrAsync(key)\n }\n\n protected handleSubscription = (channel: string, message: string) => {\n if (this.subscriptions[channel]) {\n for (let i = 0, l = this.subscriptions[channel].length; i < l; i++) {\n this.subscriptions[channel][i](JSON.parse(message))\n }\n }\n }\n}\n","import { BaseController } from '../common/base.controller'\n\nexport class RouterData {\n target?: any\n method?: string\n path?: string\n fun?: Function\n}\n\nexport class RouterMap {\n static decoratedRouters: Map<\n Function,\n {\n roles?: string[]\n permissions?: string[][]\n data?: RouterData[]\n depts?: string[]\n limit?: any\n limitMethod?: Function\n }\n > = new Map()\n}\n\nexport function router(route?: string) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n if (!route) {\n const controller = target.constructor.name\n const controllerName = controller.toLowerCase().replace('.controller', '')\n route = 'all ' + ['', controllerName, name].join('/')\n }\n const split = route.split(' ')\n if (split.length > 2) {\n throw new Error('Only one space is allowed in @router()')\n }\n const [method, path] = split\n // @ts-ignore\n const key = target[name]\n let routerData = new RouterData()\n routerData.target = target\n routerData.method = method\n routerData.path = path\n // @ts-ignore\n routerData.fun = target[name]\n\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n if (!objCurrent.data) {\n objCurrent.data = [routerData]\n } else {\n objCurrent.data.push(routerData)\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n let routerObj = {\n data: [routerData],\n }\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], routerObj)\n }\n }\n}\n\nexport function role(roles?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let roleList: string[] = []\n if (roles) {\n if (Array.isArray(roles)) {\n roleList = roles\n } else {\n roleList = [roles]\n }\n }\n // @ts-ignore\n const key = target[name]\n let roleObj = { roles: roleList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, roleObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], roleObj)\n }\n }\n}\n\nexport function permission(permissions?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let permissionList: string[][] = [[]]\n if (permissions) {\n if (Array.isArray(permissions)) {\n let arr = []\n for (let sub of permissions) {\n arr.push(sub.split(':'))\n }\n permissionList = arr\n } else {\n permissionList = [permissions.split(':')]\n }\n }\n // @ts-ignore\n const key = target[name]\n let permissionObj = { permissions: permissionList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, permissionObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], permissionObj)\n }\n }\n}\n\n/**\n * If there is a dept modifier, you need to verify whether the department id exists.\n */\nexport function dept(depts?: string | string[]) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n let deptList: string[] = []\n if (depts) {\n if (Array.isArray(depts)) {\n deptList = depts\n } else {\n deptList = [depts]\n }\n }\n // @ts-ignore\n const key = target[name]\n let deptObj = { depts: deptList }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, deptObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], deptObj)\n }\n }\n}\n\n/**\n * 是否需要限流\n * 使用 @fastify/rate-limit\n */\nexport function limit(opt?: any) {\n return (target: BaseController, name: string, value: PropertyDescriptor) => {\n // @ts-ignore\n const key = target[name]\n let limitObj = { limit: opt || true }\n if (RouterMap.decoratedRouters.has(key)) {\n let objCurrent = RouterMap.decoratedRouters.get(key)\n Object.assign(objCurrent, limitObj)\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], objCurrent)\n } else {\n // @ts-ignore\n RouterMap.decoratedRouters.set(target[name], limitObj)\n }\n }\n}\n\n"],"mappings":"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","names":[]} \ No newline at end of file