mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
BootProbes: add a websocket probe
This self-test isn't perfect because we're running it from the backend instead of the frontend. Conceivably the backend might have trouble resolving its own url. Eventually we should move this test or something like it to something that executes in the frontend.
This commit is contained in:
parent
088578f541
commit
07b80b1110
@ -163,6 +163,15 @@ It is good practice not to run Grist as the root user.
|
||||
'reachable': {
|
||||
info: `
|
||||
The main page of Grist should be available.
|
||||
`
|
||||
},
|
||||
|
||||
'websockets': {
|
||||
// TODO: add a link to https://support.getgrist.com/self-managed/#how-do-i-run-grist-on-a-server
|
||||
info: `
|
||||
Websocket connections need HTTP 1.1 and the ability to pass a few
|
||||
extra headers in order to work. Sometimes a reverse proxy can
|
||||
interfere with these requirements.
|
||||
`
|
||||
},
|
||||
};
|
||||
|
@ -7,7 +7,8 @@ export type BootProbeIds =
|
||||
'host-header' |
|
||||
'sandboxing' |
|
||||
'system-user' |
|
||||
'authentication'
|
||||
'authentication' |
|
||||
'websockets'
|
||||
;
|
||||
|
||||
export interface BootProbeResult {
|
||||
|
@ -4,6 +4,7 @@ import { removeTrailingSlash } from 'app/common/gutil';
|
||||
import { expressWrap, jsonErrorHandler } from 'app/server/lib/expressWrap';
|
||||
import { GristServer } from 'app/server/lib/GristServer';
|
||||
import * as express from 'express';
|
||||
import WS from 'ws';
|
||||
import fetch from 'node-fetch';
|
||||
|
||||
/**
|
||||
@ -59,6 +60,7 @@ export class BootProbes {
|
||||
this._probes.push(_hostHeaderProbe);
|
||||
this._probes.push(_sandboxingProbe);
|
||||
this._probes.push(_authenticationProbe);
|
||||
this._probes.push(_webSocketsProbe);
|
||||
this._probeById = new Map(this._probes.map(p => [p.id, p]));
|
||||
}
|
||||
}
|
||||
@ -105,6 +107,37 @@ const _homeUrlReachableProbe: Probe = {
|
||||
}
|
||||
};
|
||||
|
||||
const _webSocketsProbe: Probe = {
|
||||
id: 'websockets',
|
||||
name: 'Can we open a websocket with the server',
|
||||
apply: async (server, req) => {
|
||||
return new Promise((resolve) => {
|
||||
const url = new URL(server.getHomeUrl(req));
|
||||
url.protocol = (url.protocol === 'https:') ? 'wss:' : 'ws:';
|
||||
const ws = new WS.WebSocket(url.href);
|
||||
const details: Record<string, any> = {
|
||||
url,
|
||||
};
|
||||
ws.on('open', () => {
|
||||
ws.send('Just nod if you can hear me.');
|
||||
resolve({
|
||||
success: true,
|
||||
details,
|
||||
});
|
||||
ws.close();
|
||||
});
|
||||
ws.on('error', (ev) => {
|
||||
details.error = ev.message;
|
||||
resolve({
|
||||
success: false,
|
||||
details,
|
||||
});
|
||||
ws.close();
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const _statusCheckProbe: Probe = {
|
||||
id: 'health-check',
|
||||
name: 'Is an internal health check passing',
|
||||
|
Loading…
Reference in New Issue
Block a user