UNPKG

@bitblit/ratchet-epsilon-common

Version:

Tiny adapter to simplify building API gateway Lambda APIS

145 lines 7.86 kB
import { ErrorRatchet } from '@bitblit/ratchet-common/lang/error-ratchet'; import { StringRatchet } from '@bitblit/ratchet-common/lang/string-ratchet'; import { LoggerLevelName } from '@bitblit/ratchet-common/logger/logger-level-name'; import { NumberRatchet } from '@bitblit/ratchet-common/lang/number-ratchet'; import { BooleanRatchet } from '@bitblit/ratchet-common/lang/boolean-ratchet'; import { EpsilonGlobalHandler } from '../epsilon-global-handler.js'; import { BuiltInHandlers } from '../built-in/http/built-in-handlers.js'; import { LocalWebTokenManipulator } from '../http/auth/local-web-token-manipulator.js'; import { EchoProcessor } from '../built-in/background/echo-processor.js'; import { NoOpProcessor } from '../built-in/background/no-op-processor.js'; import { SampleDelayProcessor } from '../built-in/background/sample-delay-processor.js'; import { LogAndEnqueueEchoProcessor } from '../built-in/background/log-and-enqueue-echo-processor.js'; import { EpsilonConfigParser } from '../util/epsilon-config-parser.js'; import { RouterUtil } from '../http/route/router-util.js'; import { SampleInputValidatedProcessor } from '../built-in/background/sample-input-validated-processor.js'; import { BuiltInAuthorizers } from '../built-in/http/built-in-authorizers.js'; import { BuiltInFilters } from '../built-in/http/built-in-filters.js'; import { LogMessageBackgroundErrorProcessor } from '../built-in/background/log-message-background-error-processor.js'; import { SingleThreadLocalBackgroundManager } from '../background/manager/single-thread-local-background-manager.js'; import { SampleServerStaticFiles } from './sample-server-static-files.js'; export class SampleServerComponents { constructor() { } static createSampleTokenManipulator() { const tokenManipulator = new LocalWebTokenManipulator(['abcd1234'], 'sample.erigir.com') .withParseFailureLogLevel(LoggerLevelName.debug) .withExtraDecryptionKeys(['abcdefabcdef']) .withOldKeyUseLogLevel(LoggerLevelName.info); return tokenManipulator; } static async createSampleEpsilonConfig(label) { const yamlString = SampleServerStaticFiles.SAMPLE_OPEN_API_DOC; const authorizers = new Map(); authorizers.set('SampleAuthorizer', (token, evt) => BuiltInAuthorizers.simpleLoggedInAuth(token, evt)); authorizers.set('LogAuthorizer', (token, evt) => BuiltInAuthorizers.simpleNoAuthenticationLogAccess(token, evt)); const handlers = new Map(); handlers.set('get /', (event, context) => BuiltInHandlers.sample(event, null, context)); handlers.set('get /meta/server', (event) => BuiltInHandlers.sample(event)); handlers.set('get /meta/user', (event) => BuiltInHandlers.sample(event)); handlers.set('get /meta/item/{itemId}', (event) => BuiltInHandlers.sample(event)); handlers.set('post /secure/access-token', (event) => BuiltInHandlers.sample(event)); handlers.set('get /multi/fixed', (event) => BuiltInHandlers.sample(event, 'fixed')); handlers.set('get /multi/{v}', (event) => BuiltInHandlers.sample(event, 'variable')); handlers.set('get /event', (event) => { return Promise.resolve({ statusCode: 200, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(event, null, 2), }); }); handlers.set('get /err/{code}', (event) => { const err = ErrorRatchet.fErr('Fake Err : %j', event); err['statusCode'] = NumberRatchet.safeNumber(event.pathParameters['code']); throw err; }); handlers.set('get /meta/sample-item', async (event) => { const numberToUse = NumberRatchet.safeNumber(event.queryStringParameters['num']) || 5; const rval = { numberParam: numberToUse, nameParam: 'Test-String', }; return rval; }); handlers.set('post /meta/sample-item', async (event) => { const parsed = event.parsedBody; const forceFail = BooleanRatchet.parseBool(StringRatchet.trimToNull(event.queryStringParameters['forceFail'])) === true; if (forceFail) { parsed['numberParam'] = 'test'; } return parsed; }); const meta = RouterUtil.defaultHttpMetaProcessingConfigWithAuthenticationHeaderParsing(SampleServerComponents.createSampleTokenManipulator()); meta.timeoutMS = 10_000; meta.errorFilters.push((fCtx) => BuiltInFilters.secureOutboundServerErrorForProduction(fCtx, 'Clean Internal Server Error', 500)); const preFiltersAllowingNull = Object.assign({}, meta); preFiltersAllowingNull.preFilters = Object.assign([], preFiltersAllowingNull.preFilters); preFiltersAllowingNull.preFilters.splice(8, 1); const cfg = { defaultMetaHandling: meta, handlers: handlers, authorizers: authorizers, overrideMetaHandling: [ { pathRegex: '/background', methods: null, config: Object.assign({}, meta, { overrideAuthorizerName: 'LogAuthorizer' }), }, { pathRegex: '/meta/server', methods: ['GET'], config: preFiltersAllowingNull, }, ], prefixesToStripBeforeRouteMatch: ['v0'], filterHandledRouteMatches: ['options .*'], }; const background = { httpMetaEndpoint: '/background/meta', httpSubmissionPath: '/background', implyTypeFromPathSuffix: false, processors: [ new EchoProcessor(), new NoOpProcessor(), new SampleDelayProcessor(), new SampleInputValidatedProcessor(), new LogAndEnqueueEchoProcessor(), ], errorProcessor: new LogMessageBackgroundErrorProcessor(), }; const epsilonConfig = { label: label, openApiYamlString: yamlString, httpConfig: cfg, backgroundConfig: background, }; return epsilonConfig; } static async createSampleEpsilonGlobalHandler(label) { const epsilonConfig = await SampleServerComponents.createSampleEpsilonConfig(label); const backgroundManager = new SingleThreadLocalBackgroundManager(); const epsilonInstance = EpsilonConfigParser.epsilonConfigToEpsilonInstance(epsilonConfig, backgroundManager); const rval = new EpsilonGlobalHandler(epsilonInstance); return rval; } static async createSampleBatchOnlyEpsilonGlobalHandler(label) { const epsilonConfig = await SampleServerComponents.createSampleEpsilonConfig(label); epsilonConfig.httpConfig.handlers = new Map(); const byPassCfg = Object.assign({}, epsilonConfig.httpConfig.defaultMetaHandling); byPassCfg.preFilters = byPassCfg.preFilters.concat([ (fCtx) => BuiltInFilters.autoRespond(fCtx, { message: 'Background Processing Only' }), ]); epsilonConfig.httpConfig.overrideMetaHandling = [ { pathRegex: '.*background.*', invertPathMatching: true, config: byPassCfg, }, ]; epsilonConfig.httpConfig.filterHandledRouteMatches = ['.*']; const backgroundManager = new SingleThreadLocalBackgroundManager(); const epsilonInstance = EpsilonConfigParser.epsilonConfigToEpsilonInstance(epsilonConfig, backgroundManager); const rval = new EpsilonGlobalHandler(epsilonInstance); return rval; } } //# sourceMappingURL=sample-server-components.js.map