diff --git a/package-lock.json b/package-lock.json index 1af88ff..503164d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -98,10 +98,9 @@ } }, "@pushrocks/lik": { - "version": "3.0.10", - "resolved": "https://verdaccio.lossless.one/@pushrocks%2flik/-/lik-3.0.10.tgz", - "integrity": "sha512-iWG06QsrL6AAnjPRWMVz4bRaRE0jJt/HgEK0YeLqaSBLY8ju4ps1j4lEN8VrUlXGZyPB6UGQfcreesO24buYhQ==", - "dev": true, + "version": "3.0.11", + "resolved": "https://verdaccio.lossless.one/@pushrocks%2flik/-/lik-3.0.11.tgz", + "integrity": "sha512-SDKRPj9+xBTqozlDPcA7O6BcccM1Tw/sXPVP+OnhNxCubDZ/L2kGNpPpqm43NJUoNxSSo5wdBw4N7MAFYCGdVg==", "requires": { "@pushrocks/smartdelay": "^2.0.3", "@pushrocks/smartpromise": "^3.0.2", @@ -139,7 +138,6 @@ "version": "2.0.3", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartdelay/-/smartdelay-2.0.3.tgz", "integrity": "sha512-TXKDDqsc7sBTLl+oiYNaF6IdNk1n70i8ur8QfwcUU6tegTnrEkvMWy9h5Zdty/fq1ioCNpKLvuXoA+fgYVwKGQ==", - "dev": true, "requires": { "@pushrocks/smartpromise": "^3.0.2" } @@ -148,7 +146,6 @@ "version": "2.0.3", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartevent/-/smartevent-2.0.3.tgz", "integrity": "sha512-x4B1mzzE6LrMATXsRLNuZpMTlB2JodL44MA4bF4FucU3SBBiWhFv3CFJRlO9B23SKZ1fwdJQrk2lT7YTUHXXJQ==", - "dev": true, "requires": { "@pushrocks/smartpromise": "^2.0.5" }, @@ -156,8 +153,7 @@ "@pushrocks/smartpromise": { "version": "2.0.5", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartpromise/-/smartpromise-2.0.5.tgz", - "integrity": "sha512-9j/chLtIiNkR0MDw7Mpxg9slxAVvAQwUZuiaPYX5KpHdKxQaHLI1VZ8IN0vPhwlfgNO4i4vGXV0wB8BvSDj03g==", - "dev": true + "integrity": "sha512-9j/chLtIiNkR0MDw7Mpxg9slxAVvAQwUZuiaPYX5KpHdKxQaHLI1VZ8IN0vPhwlfgNO4i4vGXV0wB8BvSDj03g==" } } }, @@ -189,6 +185,16 @@ "vinyl-file": "^3.0.0" } }, + "@pushrocks/smartjson": { + "version": "3.0.8", + "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartjson/-/smartjson-3.0.8.tgz", + "integrity": "sha512-EjC3611RSZaZmK+nXxXrYDBxdxYWtrxjOrZtQzbYn0yM33KSCH0sLIAG8B2wYZVAOj4A2pC8mVxFSJ1w3iRFHg==", + "requires": { + "@types/fast-json-stable-stringify": "^2.0.0", + "fast-json-stable-stringify": "^2.0.0", + "lodash.clonedeep": "^4.5.0" + } + }, "@pushrocks/smartlog": { "version": "2.0.19", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartlog/-/smartlog-2.0.19.tgz", @@ -258,7 +264,6 @@ "version": "2.0.3", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartrx/-/smartrx-2.0.3.tgz", "integrity": "sha512-OWxagu+CBdPaq76AIg91hJyrNhDTlEpesj01ooWCeVIaLY3G7yvFkqHsEKNOwPUG1LzCWmjq1l1dHQx9p2vJ9A==", - "dev": true, "requires": { "@pushrocks/lik": "^3.0.2", "@pushrocks/smartevent": "^2.0.3", @@ -269,8 +274,7 @@ "@pushrocks/smartpromise": { "version": "2.0.5", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartpromise/-/smartpromise-2.0.5.tgz", - "integrity": "sha512-9j/chLtIiNkR0MDw7Mpxg9slxAVvAQwUZuiaPYX5KpHdKxQaHLI1VZ8IN0vPhwlfgNO4i4vGXV0wB8BvSDj03g==", - "dev": true + "integrity": "sha512-9j/chLtIiNkR0MDw7Mpxg9slxAVvAQwUZuiaPYX5KpHdKxQaHLI1VZ8IN0vPhwlfgNO4i4vGXV0wB8BvSDj03g==" } } }, @@ -291,7 +295,6 @@ "version": "3.0.12", "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmarttime/-/smarttime-3.0.12.tgz", "integrity": "sha512-NoMt1NUhNqcF5y7fCTHoC3d/+MobzgNUg6yHbSGxFRaentQzCrMPNahQIVLbrAStf03LUUBePUjSRdPYucP1gw==", - "dev": true, "requires": { "@pushrocks/smartpromise": "^3.0.2", "@types/cron": "^1.7.1", @@ -340,12 +343,16 @@ "version": "1.7.1", "resolved": "https://verdaccio.lossless.one/@types%2fcron/-/cron-1.7.1.tgz", "integrity": "sha512-48brwgU18DqA0mQX1As5OcJEo1yNjaXMM6Mk4r8K1dOzLJRQ37FE/kCivKx7ClKEHfhX2FdcxKzJ1B744a+V3A==", - "dev": true, "requires": { "@types/node": "*", "moment": ">=2.14.0" } }, + "@types/fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://verdaccio.lossless.one/@types%2ffast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha512-mky/O83TXmGY39P1H9YbUpjV6l6voRYlufqfFCvel8l1phuy8HRjdWc1rrPuN53ITBJlbyMSV6z3niOySO5pgQ==" + }, "@types/figures": { "version": "3.0.1", "resolved": "https://verdaccio.lossless.one/@types%2ffigures/-/figures-3.0.1.tgz", @@ -375,20 +382,17 @@ "@types/luxon": { "version": "1.15.2", "resolved": "https://verdaccio.lossless.one/@types%2fluxon/-/luxon-1.15.2.tgz", - "integrity": "sha512-zHPoyVrLvNaiMRYdhmh88Rn489ZgAgbc6iLxR5Yi0VCNfeNYHcszbhJV2vDHLNrVGy35BPtWBRn4OP2F9BBvFw==", - "dev": true + "integrity": "sha512-zHPoyVrLvNaiMRYdhmh88Rn489ZgAgbc6iLxR5Yi0VCNfeNYHcszbhJV2vDHLNrVGy35BPtWBRn4OP2F9BBvFw==" }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://verdaccio.lossless.one/@types%2fminimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { "version": "12.7.2", "resolved": "https://verdaccio.lossless.one/@types%2fnode/-/node-12.7.2.tgz", - "integrity": "sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==", - "dev": true + "integrity": "sha512-dyYO+f6ihZEtNPDcWNR1fkoTDf3zAK3lAABDze3mz6POyIercH0lEUawUFXlG8xaQZmm1yEBON/4TsYv/laDYg==" }, "@types/vinyl": { "version": "2.0.3", @@ -461,14 +465,12 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://verdaccio.lossless.one/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "brace-expansion": { "version": "1.1.11", "resolved": "https://verdaccio.lossless.one/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -631,8 +633,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://verdaccio.lossless.one/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "core-util-is": { "version": "1.0.2", @@ -644,7 +645,6 @@ "version": "1.7.1", "resolved": "https://verdaccio.lossless.one/cron/-/cron-1.7.1.tgz", "integrity": "sha512-gmMB/pJcqUVs/NklR1sCGlNYM7TizEw+1gebz20BMc/8bTm/r7QUp3ZPSPlG8Z5XRlvb7qhjEjq/+bdIfUCL2A==", - "dev": true, "requires": { "moment-timezone": "^0.5.x" } @@ -747,6 +747,11 @@ "strip-eof": "^1.0.0" } }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://verdaccio.lossless.one/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, "figures": { "version": "3.0.0", "resolved": "https://verdaccio.lossless.one/figures/-/figures-3.0.0.tgz", @@ -950,6 +955,11 @@ "path-exists": "^3.0.0" } }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://verdaccio.lossless.one/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, "log-symbols": { "version": "2.2.0", "resolved": "https://verdaccio.lossless.one/log-symbols/-/log-symbols-2.2.0.tgz", @@ -962,8 +972,7 @@ "luxon": { "version": "1.17.2", "resolved": "https://verdaccio.lossless.one/luxon/-/luxon-1.17.2.tgz", - "integrity": "sha512-qELKtIj3HD41N+MvgoxArk8DZGUb4Gpiijs91oi+ZmKJzRlxY6CoyTwNoUwnogCVs4p8HuxVJDik9JbnYgrCng==", - "dev": true + "integrity": "sha512-qELKtIj3HD41N+MvgoxArk8DZGUb4Gpiijs91oi+ZmKJzRlxY6CoyTwNoUwnogCVs4p8HuxVJDik9JbnYgrCng==" }, "make-error": { "version": "1.3.5", @@ -1014,7 +1023,6 @@ "version": "3.0.4", "resolved": "https://verdaccio.lossless.one/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1037,14 +1045,12 @@ "moment": { "version": "2.24.0", "resolved": "https://verdaccio.lossless.one/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", - "dev": true + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, "moment-timezone": { "version": "0.5.26", "resolved": "https://verdaccio.lossless.one/moment-timezone/-/moment-timezone-0.5.26.tgz", "integrity": "sha512-sFP4cgEKTCymBBKgoxZjYzlSovC20Y6J7y3nanDc5RoBIXKlZhoYwBoZGe3flwU6A372AcRwScH8KiwV6zjy1g==", - "dev": true, "requires": { "moment": ">= 2.9.0" } @@ -1294,7 +1300,6 @@ "version": "6.5.2", "resolved": "https://verdaccio.lossless.one/rxjs/-/rxjs-6.5.2.tgz", "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", - "dev": true, "requires": { "tslib": "^1.9.0" } @@ -1448,8 +1453,7 @@ "symbol-tree": { "version": "3.2.4", "resolved": "https://verdaccio.lossless.one/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "ts-node": { "version": "8.3.0", @@ -1467,8 +1471,7 @@ "tslib": { "version": "1.10.0", "resolved": "https://verdaccio.lossless.one/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", - "dev": true + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" }, "tslint": { "version": "5.19.0", diff --git a/package.json b/package.json index f0261ca..1e0fcb4 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,8 @@ }, "dependencies": { "@apiglobal/typedrequest-interfaces": "^1.0.7", + "@pushrocks/lik": "^3.0.11", + "@pushrocks/smartjson": "^3.0.8", "@pushrocks/smartrequest": "^1.1.23" }, "files": [ diff --git a/ts/index.ts b/ts/index.ts index b65b845..8e035ca 100644 --- a/ts/index.ts +++ b/ts/index.ts @@ -1,2 +1,3 @@ export * from './typedrequest.classes.typedrequest'; export * from './typedrequest.classes.typedhandler'; +export * from './typedrequest.classes.typedrouter'; diff --git a/ts/typedrequest.classes.typedhandler.ts b/ts/typedrequest.classes.typedhandler.ts index effab8e..3bfd64f 100644 --- a/ts/typedrequest.classes.typedhandler.ts +++ b/ts/typedrequest.classes.typedhandler.ts @@ -1 +1,29 @@ -export class TypedHandler {} +import * as plugins from './typedrequest.plugins'; + +type THandlerFunction = (requestArg: T['request']) => Promise; + +/** + * typed handler for dealing with typed requests + */ +export class TypedHandler { + public method: string; + private handlerFunction: THandlerFunction; + + constructor(methodArg: T['method'], handlerFunctionArg: THandlerFunction) { + this.method = methodArg; + this.handlerFunction = handlerFunctionArg; + } + + /** + * adds a response to the typedRequest + * @param typedRequestArg + */ + public async addResponse(typedRequestArg: T) { + if (typedRequestArg.method !== this.method) { + throw new Error('this handler has been given a wrong method to answer to. Please use a TypedRouter to filter requests'); + } + const response = await this.handlerFunction(typedRequestArg.request); + typedRequestArg.response = response; + return typedRequestArg; + } +} diff --git a/ts/typedrequest.classes.typedrouter.ts b/ts/typedrequest.classes.typedrouter.ts new file mode 100644 index 0000000..23a3a14 --- /dev/null +++ b/ts/typedrequest.classes.typedrouter.ts @@ -0,0 +1,31 @@ +import * as plugins from './typedrequest.plugins'; + +import { TypedHandler } from './typedrequest.classes.typedhandler'; + +/** + * A typed router decides on which typed handler to call based on the method + * specified in the typed request + * This is thought for reusing the same url endpoint for different methods + */ +export class TypedRouter { + public handlerMap = new plugins.lik.Objectmap< + TypedHandler + >(); + + /** + * adds the handler to the routing map + * @param handlerArg + */ + public addTypedHandler(handlerArg: TypedHandler) { + this.handlerMap.add(handlerArg); + } + + public async addResponse(typedRequest: plugins.typedRequestInterfaces.ITypedRequest) { + const typedHandler = this.handlerMap.find(handler => { + return handler.method === typedRequest.method; + }); + + typedRequest = await typedHandler.addResponse(typedRequest); + return typedRequest; + } +} diff --git a/ts/typedrequest.plugins.ts b/ts/typedrequest.plugins.ts index 1ab37f3..ca4e3eb 100644 --- a/ts/typedrequest.plugins.ts +++ b/ts/typedrequest.plugins.ts @@ -4,6 +4,8 @@ import * as typedRequestInterfaces from '@apiglobal/typedrequest-interfaces'; export { typedRequestInterfaces }; // pushrocks scope +import * as lik from '@pushrocks/lik'; import * as smartrequest from '@pushrocks/smartrequest'; +import * as smartjson from '@pushrocks/smartjson'; -export { smartrequest }; +export { lik, smartrequest, smartjson };