diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9f34832d..07303f91 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: build: strategy: matrix: - os: [ubuntu-latest, macOS-latest, windows-latest] + os: [ubuntu-latest, macOS-latest] node-version: [18, 20] runs-on: ${{ matrix.os }} diff --git a/.npmrc b/.npmrc index 43c97e71..0ca8d2a0 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ package-lock=false +save-exact=true diff --git a/README.md b/README.md index 7aa4fec2..6e9df770 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,67 @@ -# service -Eik REST API - As a standalone running HTTP service +# Eik HTTP Service + +As a standalone running HTTP service exposing the Eik Service. + +## Installation + +``` +npm install @eik/service +``` + +## Usage + +This server can either be run as a Node executable, or as a Fastify plugin. + +### CLI + +This spins up the built-in Fastify server using configuration from your `config/` folder, or from environment variables. + +```sh +npx @eik/service +``` + +### Fastify plugin + +For a production setup, the Fastify plugin method is recommended. + +```js +import fastify from 'fastify'; +import Service from '@eik/service'; +import SinkGoogleCloudStorage from '@eik/sink-gcs'; + +// Set up the Google Cloud Storage sink +// https://github.com/eik-lib/sink-gcs?tab=readme-ov-file#example +const sink = new SinkGoogleCloudStorage({ + credentials: { + client_email: 'a@email.address', + private_key: '[ ...snip... ]', + projectId: 'myProject', + }, +}); + +// Set up the Eik service as a plugin +const service = new Service({ sink }); + +// Set up Fastify +const app = fastify({ + ignoreTrailingSlash: true, + modifyCoreObjects: false, + trustProxy: true, +}); + +// Register the Eik service in Fastify +app.register(service.api()); + +// Start the server +const run = async () => { + await service.health(); + await app.listen( + service.config.get('http.port'), + service.config.get('http.address'), + ); +}; + +run(); +``` + +The example above shows the Google Cloud Storage sink. You can also use the [file system sink](https://github.com/eik-lib/sink-file-system), or implement the [sink interface](https://github.com/eik-lib/sink) for your own custom storage backend. diff --git a/lib/main.js b/lib/main.js index 3c4734e1..fde5d9b5 100644 --- a/lib/main.js +++ b/lib/main.js @@ -5,32 +5,48 @@ import pino from 'pino'; import cors from '@fastify/cors'; import jwt from '@fastify/jwt'; import eik from '@eik/core'; +import SinkMemory from '@eik/sink-memory'; +import SinkFileSystem from '@eik/sink-file-system'; import config from './config.js'; import * as utils from './utils.js'; +/** + * @typedef {object} EikServiceOptions + * @property {import('@eik/sink').default} [sink] + * @property {import('@eik/sink').default} [customSink] [Deprecated] Use sink instead + * @property {string} [aliasCacheControl] + * @property {string} [notFoundCacheControl="public, max-age=5"] + */ + const EikService = class EikService { - constructor({ - customSink, - notFoundCacheControl, - aliasCacheControl, - } = {}) { + /** + * @param {EikServiceOptions} [options={}] + */ + constructor(options = {}) { + let { sink } = options; + const { + customSink, + notFoundCacheControl, + aliasCacheControl, + } = options; this._notFoundCacheControl = notFoundCacheControl || 'public, max-age=5'; const logger = pino({ + // @ts-ignore level: config.get('log.level'), name: config.get('name'), }); - let sink; if (customSink) { + logger.warn('The `customSink` option is deprecated and will be removed at a later stage. Use `sink` to remove this warning.'); sink = customSink; } else if (config.get('sink.type') === 'mem') { logger.info(`Server is running with a in memory sink. Uploaded files will be lost on restart!`); - sink = new eik.sink.MEM(); + sink = new SinkMemory(); } else { logger.info(`Server is running with the file system sink. Uploaded files will be stored under "${config.get('sink.path')}"`); - sink = new eik.sink.FS({ sinkFsRootPath: config.get('sink.path') }); + sink = new SinkFileSystem({ sinkFsRootPath: config.get('sink.path') }); } // Transform organization config diff --git a/package.json b/package.json index dc697e87..f30a7eb0 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,10 @@ }, "homepage": "https://github.com/eik-lib/service#readme", "dependencies": { - "@eik/core": "1.3.47", + "@eik/core": "1.3.48", + "@eik/sink": "1.2.5", + "@eik/sink-file-system": "1.0.1", + "@eik/sink-memory": "1.1.1", "@fastify/compress": "6.5.0", "@fastify/cors": "8.5.0", "@fastify/jwt": "7.2.4",