-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Replace built-in sinks with modules #576
Changes from all commits
c4a99a8
96b4839
59fa91c
28a4cb5
0ba4a69
f609ede
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,2 @@ | ||
package-lock=false | ||
save-exact=true |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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. | ||
wkillerud marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
```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: '[email protected]', | ||
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. |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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 = {}) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If we decide to keep the "bin-option", then I assume this would cause issues for what is happening here: https://github.com/eik-lib/service/blob/deprecate-built-in-sinks/bin/eik-server.js#L6 But I guess that is perhaps for the actual deprecation pr 😄 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It's optional now, so you can new up an instance without passing any opts 👍 |
||
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 | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Disable for Windows awaiting eik-lib/common#303