Constructor
new Server(config)
- Source:
Parameters:
| Name | Type | Description |
|---|---|---|
config |
ServerConfig | Configuration object for the server. |
Throws:
- If
config.app.clientsis empty. - If a
nodeclient is defined butconfig.env.serverAddressis not defined. - if
config.env.useHttpsistrueandconfig.env.httpsInfosis notnull(which generates self signed certificated),config.env.httpsInfos.certandconfig.env.httpsInfos.keyshould point to valid cert files.
Members
config :ServerConfig
- Description:
Given config object merged with the following defaults:
- Source:
Given config object merged with the following defaults:
Type:
Example
{
env: {
type: 'development',
port: 8000,
serverAddress: null,
baseUrl: '',
useHttps: false,
httpsInfos: null,
crossOriginIsolated: true,
verbose: true,
},
app: {
name: 'soundworks',
clients: {},
}
}
contextManager :ServerContextManager
- Description:
Instance of the ServerContextManager class.
- Source:
Instance of the ServerContextManager class.
Type:
db
- Description:
Simple key / value filesystem database with Promise based Map API.
Basically a tiny wrapper around the https://github.com/lukechilds/keyv package.
- Source:
Simple key / value filesystem database with Promise based Map API.
Basically a tiny wrapper around the https://github.com/lukechilds/keyv package.
httpServer
- Description:
Instance of the Node.js
http.Serverorhttps.Server
- Source:
- See:
Instance of the Node.js http.Server or https.Server
(readonly) id :number
- Description:
Id of the server, a constant set to
-1
- Source:
Id of the server, a constant set to -1
Type:
- number
pluginManager :ServerPluginManager
- Description:
Instance of the ServerPluginManager class.
- Source:
Instance of the ServerPluginManager class.
Type:
router
- Description:
Instance of the router if any.
The router can be used to open new route, for example to expose a directory of static assets (in default soundworks applications only the
publicis exposed).
- Source:
Instance of the router if any.
The router can be used to open new route, for example to expose a directory
of static assets (in default soundworks applications only the public is exposed).
Example
import { Server } from '@soundworks/core/server.js';
import { loadConfig, configureHttpRouter } from '@soundworks/helpers/server.js';
// create the server instance
const server = new Server(loadConfig());
// configure the express router provided by the helpers
configureHttpRouter(server);
// expose assets located in the `soundfiles` directory on the network
server.router.use('/soundfiles', express.static('soundfiles')));
sockets :ServerSockets
- Description:
Instance of the ServerSockets class.
- Source:
Instance of the ServerSockets class.
Type:
stateManager :ServerStateManager
- Description:
Instance of the ServerStateManager class.
- Source:
Instance of the ServerStateManager class.
Type:
status :'idle'|'inited'|'started'|'errored'
- Description:
Status of the server.
- Source:
Status of the server.
Type:
- 'idle' | 'inited' | 'started' | 'errored'
version :string
- Description:
Package version.
- Source:
Package version.
Type:
- string
Methods
generateAuthToken()
- Description:
Generate a token to secure client connection.
The token should be passed to the client-side
Clientconfig object, it will be internally used to check the WebSocket connection and reject it if the token is invalid.
- Source:
(async) getAuditState() → {Promise.<SharedState>}
- Description:
Attach and retrieve the global audit state of the application.
The audit state is a SharedState instance that keeps track of global information about the application such as, the number of connected clients, network latency estimation, etc.
The audit state is created by the server on start up.
- Source:
Example
const auditState = await server.getAuditState();
auditState.onUpdate(() => console.log(auditState.getValues()), true);
Throws:
Will throw if called before server.init()
Returns:
- Type
- Promise.<SharedState>
(async) init()
- Description:
The
initmethod is part of the initialization lifecycle of thesoundworksserver. Most of the time, theinitmethod will be implicitly called by the Server#start method.In some situations you might want to call this method manually, in such cases the method should be called before the Server#start method.
What it does:
- Create the audit state
- Create the HTTP(s) server
- Initialize registered plugins
Between steps 2 and 3, the 'http-server-ready' event status is dispatched so that consumer code can register its router before plugin initialization:
server.onStatusChange(status => { if (status === 'http-server-ready') { server.httpServer.on('request', router); } });After
await server.init()is fulfilled, the Server#stateManager and all registered plugins can be safely used.
- Source:
Example
const server = new Server(config);
await server.init();
await server.start();
// or implicitly called by start
const server = new Server(config);
await server.start(); // init is called implicitly
isTrustedClient(client) → {boolean}
- Description:
Check if the given client is trusted, i.e. config.env.type == 'production' and the client is protected behind a password.
- Source:
Parameters:
| Name | Type | Description |
|---|---|---|
client |
ServerClient | Client to be tested |
Returns:
- Type
- boolean
isTrustedToken(clientId, clientIp, token) → {boolean}
- Description:
Check if the token from a client is trusted, i.e. config.env.type == 'production' and the client is protected behind a password.
- Source:
Parameters:
| Name | Type | Description |
|---|---|---|
clientId |
number | Id of the client |
clientIp |
string | Ip of the client |
token |
string | Token to be tested |
Returns:
- Type
- boolean
onStatusChange(callback)
- Description:
Register a callback to execute when status change.
Status are dispatched in the following order:
- 'http-server-ready'
- 'inited'
- 'started'
- 'stopped' during the lifecycle of the server. If an error occurs the 'errored' status is propagated.
- Source:
Parameters:
| Name | Type | Description |
|---|---|---|
callback |
function |
(async) start()
- Description:
The
startmethod is part of the initialization lifecycle of thesoundworksserver. Thestartmethod will implicitly call the Server#init method if it has not been called manually.What it does:
- implicitly call Server#init if not done manually
- launch the HTTP and WebSocket servers
- start all created contexts. To this end, you will have to call
server.initmanually and instantiate the contexts betweenserver.init()andserver.start()
After
await server.start()the server is ready to accept incoming connections
- Source:
Example
import { Server } from '@soundworks/core/server.js'
const server = new Server(config);
await server.start();
(async) stop()
- Description:
Stops all started contexts, plugins, close all the socket connections and the http(s) server.
In most situations, you might not need to call this method. However, it can be useful for unit testing or similar situations where you want to create and delete several servers in the same process.
- Source:
Example
import { Server } from '@soundworks/core/server.js'
const server = new Server(config);
await server.start();
await new Promise(resolve => setTimeout(resolve, 1000));
await server.stop();
useDefaultApplicationTemplate()
- Source:
- Deprecated:
- Yes