UNPKG

fastify-dynamodm

Version:

Fastify plugin to share DynamoDM handles to Dynamo DB table(s) across routes.

60 lines (52 loc) 2.33 kB
const fp = require('fastify-plugin') const DynamoDM = require('dynamodm') // The fastify-dynamodm plugin: decorate fastify with a .table() function which // returns either the default, or a named, DynamoDM Table handle. async function fastifyDynamoDM (fastify, options = {}) { const { tableName, assumeReady, waitForIndexes, ...otherOptions } = options const dynamoDM = DynamoDM({ logger: fastify.log, ...otherOptions }) const knownTables = new Map() const defaultTableName = tableName let locked = false const getTable = function (name) { if (!name) { if (!defaultTableName) { throw new Error('No default table was set up, so a table name must be specified. Pass options.tableName when registering this plugin to set up a default table.') } name = defaultTableName } if (!knownTables.has(name)) { if (locked) { throw new Error(`Request for unknown table "${name}" after server was set up: all tables and models must be set up before server.listen.`) } knownTables.set(name, dynamoDM.Table(name)) } return knownTables.get(name) } if (defaultTableName) { knownTables.set(defaultTableName, dynamoDM.Table(defaultTableName)) // if we have a default table, set it up as soon as possible getTable(defaultTableName) } fastify.decorate('table', getTable) fastify.addHook('onReady', async () => { locked = true if (assumeReady) { [...knownTables.values()].forEach(table => table.assumeReady()) fastify.log.info('tables assumed ready') } else { // if we haven't been told to assume tables are ready, wait for the // completion of all checks (indexes, all schemas in the table have // the same id field, createdAt, updatedAt fields, all sub-schemas // for the same property in different schemas are identical, etc.) await Promise.all([...knownTables.values()].map(table => table.ready({ waitForIndexes }))) fastify.log.info('tables ready') } }) fastify.addHook('onClose', async () => { await Promise.all([...knownTables.values()].map(table => table.destroyConnection())) }) } module.exports = fp(fastifyDynamoDM, { fastify: '4.x || 5.x', name: 'dynamodm' }) module.exports.default = fastifyDynamoDM module.exports.fastifyDynamoDM = fastifyDynamoDM