@forestadmin/forestadmin-client
Version:
This package contains the logic to use the ForestAdmin API inside an agent.
90 lines • 8.64 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const eventsource_1 = __importDefault(require("eventsource"));
const types_1 = require("./types");
class EventsSubscriptionService {
constructor(options, refreshEventsHandlerService) {
this.options = options;
this.refreshEventsHandlerService = refreshEventsHandlerService;
}
detectBuffering() {
clearTimeout(this.heartBeatTimeout);
this.heartBeatTimeout = setTimeout(() => {
this.options.logger('Error', `Unable to detect ServerSentEvents Heartbeat.
Forest Admin uses ServerSentEvents to ensure that permission cache is up to date.
It seems that your agent does not receive events from our server, this may due to buffering of events from your networking infrastructure (reverse proxy).
https://docs.forestadmin.com/developer-guide-agents-nodejs/getting-started/install/troubleshooting#invalid-permissions
`);
}, 45000);
}
async subscribeEvents() {
if (!this.options.instantCacheRefresh) {
this.options.logger('Debug', 'Event source deactivated.. Use agent option [instantCacheRefresh=true] ' +
'if you want to activate them');
return;
}
const eventSourceConfig = {
// forest-secret-key act as the credential
withCredentials: false,
headers: { 'forest-secret-key': this.options.envSecret },
https: {
rejectUnauthorized: process.env.NODE_TLS_REJECT_UNAUTHORIZED !== '0',
},
};
const url = new URL('/liana/v4/subscribe-to-events', this.options.forestServerUrl).toString();
const eventSource = new eventsource_1.default(url, eventSourceConfig);
// Override reconnect interval to 5 seconds
eventSource.reconnectInterval = 5000;
eventSource.addEventListener('error', this.onEventError.bind(this));
// Only listen after first open
eventSource.addEventListener('open', () => eventSource.addEventListener('open', () => this.onEventOpenAgain()), { once: true });
eventSource.addEventListener('heartbeat', () => {
clearTimeout(this.heartBeatTimeout);
}, { once: true });
this.detectBuffering();
eventSource.addEventListener(types_1.ServerEventType.RefreshUsers, async () => this.refreshEventsHandlerService.refreshUsers());
eventSource.addEventListener(types_1.ServerEventType.RefreshRoles, async () => this.refreshEventsHandlerService.refreshRoles());
eventSource.addEventListener(types_1.ServerEventType.RefreshRenderings, async (event) => this.handleSeverEventRefreshRenderings(event));
eventSource.addEventListener(types_1.ServerEventType.RefreshCustomizations, async () => this.refreshEventsHandlerService.refreshCustomizations());
this.eventSource = eventSource;
}
/**
* Close the current EventSource
*/
close() {
clearTimeout(this.heartBeatTimeout);
this.eventSource?.close();
}
async handleSeverEventRefreshRenderings(event) {
if (!event.data) {
this.options.logger('Debug', 'Server Event - RefreshRenderings missing required data.');
return;
}
const { renderingIds } = JSON.parse(event.data);
await this.refreshEventsHandlerService.refreshRenderings(renderingIds);
}
onEventError(event) {
const { status, message } = event;
if ([502, 503, 504].includes(status)) {
this.options.logger('Debug', 'Server Event - Connection lost trying to reconnect…');
return;
}
if (status === 404) {
throw new Error('Forest Admin server failed to find the environment ' +
'related to the envSecret you configured. ' +
'Can you check that you copied it properly during initialization?');
}
if (message)
this.options.logger('Warn', `Server Event - Error: ${JSON.stringify(event)}`);
}
onEventOpenAgain() {
this.options.logger('Debug', 'Server Event - Open EventSource (SSE) connection with Forest Admin servers');
// Flush all previous data as we could have missed some events
this.refreshEventsHandlerService.refreshEverything();
}
}
exports.default = EventsSubscriptionService;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXZlbnRzLXN1YnNjcmlwdGlvbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDhEQUFzQztBQUV0QyxtQ0FLaUI7QUFHakIsTUFBcUIseUJBQXlCO0lBSTVDLFlBQ21CLE9BQTZDLEVBQzdDLDJCQUF3RDtRQUR4RCxZQUFPLEdBQVAsT0FBTyxDQUFzQztRQUM3QyxnQ0FBMkIsR0FBM0IsMkJBQTJCLENBQTZCO0lBQ3hFLENBQUM7SUFFSSxlQUFlO1FBQ3JCLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUVwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDakIsT0FBTyxFQUNQOzs7O1NBSUMsQ0FDRixDQUFDO1FBQ0osQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFO1lBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUNqQixPQUFPLEVBQ1AseUVBQXlFO2dCQUN2RSw4QkFBOEIsQ0FDakMsQ0FBQztZQUVGLE9BQU87U0FDUjtRQUVELE1BQU0saUJBQWlCLEdBQUc7WUFDeEIsMENBQTBDO1lBQzFDLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLE9BQU8sRUFBRSxFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3hELEtBQUssRUFBRTtnQkFDTCxrQkFBa0IsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixLQUFLLEdBQUc7YUFDckU7U0FDRixDQUFDO1FBQ0YsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsK0JBQStCLEVBQUUsSUFBSSxD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