Odoo GraphQL Subscription using Node, Express JS for Sample
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

83 lines
3.2 KiB

import { makeServer } from '../server.mjs';
import { DEPRECATED_GRAPHQL_WS_PROTOCOL, CloseCode, } from '../common.mjs';
export { GRAPHQL_TRANSPORT_WS_PROTOCOL } from '../common.mjs';
/**
* Use the server with [Deno](https://deno.com/).
* This is a basic starter, feel free to copy the code over and adjust it to your needs.
*
* The keep-alive is set in `Deno.upgradeWebSocket` during the upgrade.
*
* Additionally, the required WebSocket protocol is also defined during the upgrade,
* the correct example being:
*
* ```ts
* import { serve } from 'https://deno.land/std/http/mod.ts';
* import {
* makeHandler,
* GRAPHQL_TRANSPORT_WS_PROTOCOL,
* } from 'https://esm.sh/graphql-ws/lib/use/deno';
* import { schema } from './my-schema.ts/index.mjs';
*
* const handler = makeHandler({ schema });
*
* serve(
* (req: Request) => {
* const [path, _search] = req.url.split('?');
* if (!path.endsWith('/graphql')) {
* return new Response('Not Found', { status: 404 });
* }
* if (req.headers.get('upgrade') != 'websocket') {
* return new Response('Upgrade Required', { status: 426 });
* }
* const { socket, response } = Deno.upgradeWebSocket(req, {
* protocol: GRAPHQL_TRANSPORT_WS_PROTOCOL,
* idleTimeout: 12_000,
* });
* handler(socket);
* return response;
* },
* { port: 4000 },
* );
* ```
*
* @category Server/deno
*/
export function makeHandler(options) {
const server = makeServer(options);
return function handle(socket) {
socket.onerror = (err) => {
console.error('Internal error emitted on the WebSocket socket. ' +
'Please check your implementation.', err);
socket.close(CloseCode.InternalServerError, 'Internal server error');
};
let closed = () => {
// noop
};
socket.onopen = () => {
closed = server.opened({
protocol: socket.protocol,
send: (msg) => socket.send(msg),
close: (code, reason) => socket.close(code, reason),
onMessage: (cb) => {
socket.onmessage = async (event) => {
try {
await cb(String(event.data));
}
catch (err) {
console.error('Internal error occurred during message handling. ' +
'Please check your implementation.', err);
socket.close(CloseCode.InternalServerError, 'Internal server error');
}
};
},
}, { socket });
};
socket.onclose = (event) => {
if (event.code === CloseCode.SubprotocolNotAcceptable &&
socket.protocol === DEPRECATED_GRAPHQL_WS_PROTOCOL)
console.warn(`Client provided the unsupported and deprecated subprotocol "${socket.protocol}" used by subscriptions-transport-ws.` +
'Please see https://www.apollographql.com/docs/apollo-server/data/subscriptions/#switching-from-subscriptions-transport-ws.');
closed(event.code, event.reason);
};
};
}