@riddance/service
Version:
98 lines • 14.1 kB
JavaScript
import { clientFromHeaders, executeRequest } from '@riddance/host/http';
import { getHandlers, pathToRegExp } from '@riddance/host/registry';
import jwt from 'jsonwebtoken';
import { getEnvironment } from './context.js';
import { createMockContext, setup } from './setup.js';
export * from './context.js';
setup();
export async function request(options) {
const handlers = getHandlers('http').map(withPathRegExp);
const matchingHandlers = handlers.filter(h => h[pathRegExp].test(options.uri) && h.method === (options.method ?? 'GET'));
const [handler] = matchingHandlers;
const { log, context, success, flush } = createMockContext(clientFromHeaders(options.headers), handler?.config, handler?.meta);
if (!handler) {
log.error('Request END', undefined, {
handlers: handlers.map(h => ({
pathPattern: h.pathPattern,
pathRegExp: h[pathRegExp].toString(),
method: h.method,
})),
response: {
status: 404,
},
});
return {
headers: {},
status: 404,
};
}
if (matchingHandlers.length !== 1) {
log.error('Multiple matching handlers.', undefined, { matchingHandlers });
log.error('Request END', undefined, {
handlers: handlers.map(h => ({
pathPattern: h.pathPattern,
pathRegExp: h[pathRegExp].toString(),
method: h.method,
})),
response: {
status: 500,
},
});
return {
headers: {},
status: 500,
};
}
log.trace('Found handler', undefined, {
handler: {
pathPattern: handler.pathPattern,
pathRegExp: handler[pathRegExp].toString(),
method: handler.method,
},
});
const response = await executeRequest(log, context, handler, {
...options,
uri: 'http://localhost/' + options.uri,
}, success);
await flush();
return {
headers: response.headers,
status: response.status,
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
body: response.body ? JSON.parse(response.body.toString()) : undefined,
};
}
const pathRegExp = Symbol();
function withPathRegExp(handler) {
if (pathRegExp in handler) {
return handler;
}
handler[pathRegExp] = pathToRegExp(handler.pathPattern);
return handler;
}
export function withBearer(payload, requestOptions) {
const token = createBearerToken(getEnvironment(), payload, {
issuer: 'https://riddance.example.com/oauth/',
audience: 'https://riddance.example.com/',
expiresIn: 60, // seconds
});
return {
...requestOptions,
headers: {
...requestOptions.headers,
authorization: `Bearer ${token}`,
},
};
}
export function createBearerToken(env, payload, options) {
const key = env.BEARER_PRIVATE_KEY;
if (!key) {
throw new Error('Please set the BEARER_PRIVATE_KEY environment variable to be able to create bearer tokens.');
}
const certificate = '-----BEGIN EC PRIVATE KEY-----\n' + key + '\n-----END EC PRIVATE KEY-----';
return jwt.sign(payload, certificate, {
algorithm: 'ES384',
...options,
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImh0dHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQ3ZFLE9BQU8sRUFBVSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDM0UsT0FBTyxHQUFHLE1BQU0sY0FBYyxDQUFBO0FBRTlCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDN0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVyRCxjQUFjLGNBQWMsQ0FBQTtBQUU1QixLQUFLLEVBQUUsQ0FBQTtBQTBCUCxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FBQyxPQUF1QjtJQUNqRCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ3hELE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FDcEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FDakYsQ0FBQTtJQUNELE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQTtJQUNsQyxNQUFNLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsaUJBQWlCLENBQ3RELGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFDbEMsT0FBTyxFQUFFLE1BQU0sRUFDZixPQUFPLEVBQUUsSUFBSSxDQUNoQixDQUFBO0lBQ0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FB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QUFRLEVBQUUsK0JBQStCO1FBQ3pDLFNBQVMsRUFBRSxFQUFFLEVBQUUsVUFBVTtLQUM1QixDQUFDLENBQUE7SUFDRixPQUFPO1FBQ0gsR0FBRyxjQUFjO1FBQ2pCLE9BQU8sRUFBRTtZQUNMLEdBQUcsY0FBYyxDQUFDLE9BQU87WUFDekIsYUFBYSxFQUFFLFVBQVUsS0FBSyxFQUFFO1NBQ25DO0tBQ0osQ0FBQTtBQUNMLENBQUM7QUFTRCxNQUFNLFVBQVUsaUJBQWlCLENBQzdCLEdBQWdCLEVBQ2hCLE9BQWUsRUFDZixPQUEyQjtJQUUzQixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsa0JBQWtCLENBQUE7SUFDbEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1AsTUFBTSxJQUFJLEtBQUssQ0FDWCw0RkFBNEYsQ0FDL0YsQ0FBQTtJQUNMLENBQUM7SUFDRCxNQUFNLFdBQVcsR0FBRyxrQ0FBa0MsR0FBRyxHQUFHLEdBQUcsZ0NBQWdDLENBQUE7SUFDL0YsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUU7UUFDbEMsU0FBUyxFQUFFLE9BQU87UUFDbEIsR0FBRyxPQUFPO0tBQ2IsQ0FBQyxDQUFBO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNsaWVudEZyb21IZWFkZXJzLCBleGVjdXRlUmVxdWVzdCB9IGZyb20gJ0ByaWRkYW5jZS9ob3N0L2h0dHAnXG5pbXBvcnQgeyBNZXRob2QsIGdldEhhbmRsZXJzLCBwYXRoVG9SZWdFeHAgfSBmcm9tICdAcmlkZGFuY2UvaG9zdC9yZWdpc3RyeSdcbmltcG9ydCBqd3QgZnJvbSAnanNvbndlYnRva2VuJ1xuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuLi9odHRwLmpzJ1xuaW1wb3J0IHsgZ2V0RW52aXJvbm1lbnQgfSBmcm9tICcuL2NvbnRleHQuanMnXG5pbXBvcnQgeyBjcmVhdGVNb2NrQ29udGV4dCwgc2V0dXAgfSBmcm9tICcuL3NldHVwLmpzJ1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnRleHQuanMnXG5cbnNldHVwKClcblxuZXhwb3J0IHR5cGUgUmVzcG9uc2UgPSB7XG4gICAgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVxuICAgIHN0YXR1czogbnVtYmVyXG4gICAgLy8gVXNlZCB0byBhc3NlcnQgb24gaW4gdGVzdHMsIHNvIG5vIG5lZWQgZm9yIHRoZSB0eXBlIHN5c3RlbSB0byBnZXQgaW4gdGhlIHdheVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgYm9keT86IGFueVxufVxuXG50eXBlIFJlcXVlc3RPcHRpb25zID0gQm9keWxlc3NSZXF1ZXN0T3B0aW9ucyB8IFN0cmluZ1JlcXVlc3RPcHRpb25zIHwgSnNvblJlcXVlc3RPcHRpb25zXG5cbnR5cGUgQm9keWxlc3NSZXF1ZXN0T3B0aW9ucyA9IHtcbiAgICBtZXRob2Q/OiBNZXRob2RcbiAgICB1cmk6IHN0cmluZ1xuICAgIGhlYWRlcnM/OiB7IHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IHN0cmluZyB9XG59XG5cbnR5cGUgU3RyaW5nUmVxdWVzdE9wdGlvbnMgPSBCb2R5bGVzc1JlcXVlc3RPcHRpb25zICYge1xuICAgIGJvZHk6IHN0cmluZ1xufVxuXG50eXBlIEpzb25SZXF1ZXN0T3B0aW9ucyA9IEJvZHlsZXNzUmVxdWVzdE9wdGlvbnMgJiB7XG4gICAganNvbjogb2JqZWN0XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXF1ZXN0KG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gZ2V0SGFuZGxlcnMoJ2h0dHAnKS5tYXAod2l0aFBhdGhSZWdFeHApXG4gICAgY29uc3QgbWF0Y2hpbmdIYW5kbGVycyA9IGhhbmRsZXJzLmZpbHRlcihcbiAgICAgICAgaCA9PiBoW3BhdGhSZWdFeHBdLnRlc3Qob3B0aW9ucy51cmkpICYmIGgubWV0aG9kID09PSAob3B0aW9ucy5tZXRob2QgPz8gJ0dFVCcpLFxuICAgIClcbiAgICBjb25zdCBbaGFuZGxlcl0gPSBtYXRjaGluZ0hhbmRsZXJzXG4gICAgY29uc3QgeyBsb2csIGNvbnRleHQsIHN1Y2Nlc3MsIGZsdXNoIH0gPSBjcmVhdGVNb2NrQ29udGV4dChcbiAgICAgICAgY2xpZW50RnJvbUhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKSxcbiAgICAgICAgaGFuZGxlcj8uY29uZmlnLFxuICAgICAgICBoYW5kbGVyPy5tZXRhLFxuICAgIClcbiAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgbG9nLmVycm9yKCdSZXF1ZXN0IEVORCcsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgaGFuZGxlcnM6IGhhbmRsZXJzLm1hcChoID0+ICh7XG4gICAgICAgICAgICAgICAgcGF0aFBhdHRlcm46IGgucGF0aFBhdHRlcm4sXG4gICAgICAgICAgICAgICAgcGF0aFJlZ0V4cDogaFtwYXRoUmVnRXhwXS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogaC5tZXRob2QsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgICAgICAgIHN0YXR1czogNDA0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgc3RhdHVzOiA0MDQsXG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1hdGNoaW5nSGFuZGxlcnMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIGxvZy5lcnJvcignTXVsdGlwbGUgbWF0Y2hpbmcgaGFuZGxlcnMuJywgdW5kZWZpbmVkLCB7IG1hdGNoaW5nSGFuZGxlcnMgfSlcbiAgICAgICAgbG9nLmVycm9yKCdSZXF1ZXN0IEVORCcsIHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgaGFuZGxlcnM6IGhhbmRsZXJzLm1hcChoID0+ICh7XG4gICAgICAgICAgICAgICAgcGF0aFBhdHRlcm46IGgucGF0aFBhdHRlcm4sXG4gICAgICAgICAgICAgICAgcGF0aFJlZ0V4cDogaFtwYXRoUmVnRXhwXS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogaC5tZXRob2QsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgICByZXNwb25zZToge1xuICAgICAgICAgICAgICAgIHN0YXR1czogNTAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgICAgc3RhdHVzOiA1MDAsXG4gICAgICAgIH1cbiAgICB9XG4gICAgbG9nLnRyYWNlKCdGb3VuZCBoYW5kbGVyJywgdW5kZWZpbmVkLCB7XG4gICAgICAgIGhhbmRsZXI6IHtcbiAgICAgICAgICAgIHBhdGhQYXR0ZXJuOiBoYW5kbGVyLnBhdGhQYXR0ZXJuLFxuICAgICAgICAgICAgcGF0aFJlZ0V4cDogaGFuZGxlcltwYXRoUmVnRXhwXS50b1N0cmluZygpLFxuICAgICAgICAgICAgbWV0aG9kOiBoYW5kbGVyLm1ldGhvZCxcbiAgICAgICAgfSxcbiAgICB9KVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBleGVjdXRlUmVxdWVzdChcbiAgICAgICAgbG9nLFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgdXJpOiAnaHR0cDovL2xvY2FsaG9zdC8nICsgb3B0aW9ucy51cmksXG4gICAgICAgIH0sXG4gICAgICAgIHN1Y2Nlc3MsXG4gICAgKVxuICAgIGF3YWl0IGZsdXNoKClcblxuICAgIHJldHVybiB7XG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG4gICAgICAgIGJvZHk6IHJlc3BvbnNlLmJvZHkgPyBKU09OLnBhcnNlKHJlc3BvbnNlLmJvZHkudG9TdHJpbmcoKSkgOiB1bmRlZmluZWQsXG4gICAgfVxufVxuXG5jb25zdCBwYXRoUmVnRXhwID0gU3ltYm9sKClcblxuZnVuY3Rpb24gd2l0aFBhdGhSZWdFeHA8VCBleHRlbmRzIHsgcGF0aFBhdHRlcm46IHN0cmluZzsgW3BhdGhSZWdFeHBdPzogUmVnRXhwIH0+KFxuICAgIGhhbmRsZXI6IFQsXG4pOiBUICYgeyBbcGF0aFJlZ0V4cF06IFJlZ0V4cCB9IHtcbiAgICBpZiAocGF0aFJlZ0V4cCBpbiBoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVyIGFzIFQgJiB7IFtwYXRoUmVnRXhwXTogUmVnRXhwIH1cbiAgICB9XG4gICAgaGFuZGxlcltwYXRoUmVnRXhwXSA9IHBhdGhUb1JlZ0V4cChoYW5kbGVyLnBhdGhQYXR0ZXJuKVxuICAgIHJldHVybiBoYW5kbGVyIGFzIFQgJiB7IFtwYXRoUmVnRXhwXTogUmVnRXhwIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhCZWFyZXIocGF5bG9hZDogb2JqZWN0LCByZXF1ZXN0T3B0aW9uczogUmVxdWVzdE9wdGlvbnMpOiBSZXF1ZXN0T3B0aW9ucyB7XG4gICAgY29uc3QgdG9rZW4gPSBjcmVhdGVCZWFyZXJUb2tlbihnZXRFbnZpcm9ubWVudCgpLCBwYXlsb2FkLCB7XG4gICAgICAgIGlzc3VlcjogJ2h0dHBzOi8vcmlkZGFuY2UuZXhhbXBsZS5jb20vb2F1dGgvJyxcbiAgICAgICAgYXVkaWVuY2U6ICdodHRwczovL3JpZGRhbmNlLmV4YW1wbGUuY29tLycsXG4gICAgICAgIGV4cGlyZXNJbjogNjAsIC8vIHNlY29uZHNcbiAgICB9KVxuICAgIHJldHVybiB7XG4gICAgICAgIC4uLnJlcXVlc3RPcHRpb25zLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAuLi5yZXF1ZXN0T3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgIH0sXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBCZWFyZXJUb2tlbk9wdGlvbnMgPSB7XG4gICAgaXNzdWVyPzogc3RyaW5nXG4gICAgYXVkaWVuY2U/OiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgIHN1YmplY3Q/OiBzdHJpbmdcbiAgICBleHBpcmVzSW46IG51bWJlclxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQmVhcmVyVG9rZW4oXG4gICAgZW52OiBFbnZpcm9ubWVudCxcbiAgICBwYXlsb2FkOiBvYmplY3QsXG4gICAgb3B0aW9uczogQmVhcmVyVG9rZW5PcHRpb25zLFxuKTogc3RyaW5nIHtcbiAgICBjb25zdCBrZXkgPSBlbnYuQkVBUkVSX1BSSVZBVEVfS0VZXG4gICAgaWYgKCFrZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ1BsZWFzZSBzZXQgdGhlIEJFQVJFUl9QUklWQVRFX0tFWSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBiZSBhYmxlIHRvIGNyZWF0ZSBiZWFyZXIgdG9rZW5zLicsXG4gICAgICAgIClcbiAgICB9XG4gICAgY29uc3QgY2VydGlmaWNhdGUgPSAnLS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tXFxuJyArIGtleSArICdcXG4tLS0tLUVORCBFQyBQUklWQVRFIEtFWS0tLS0tJ1xuICAgIHJldHVybiBqd3Quc2lnbihwYXlsb2FkLCBjZXJ0aWZpY2F0ZSwge1xuICAgICAgICBhbGdvcml0aG06ICdFUzM4NCcsXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSlcbn1cbiJdfQ==