@graphql-mesh/transport-ws
Version:
105 lines (101 loc) • 3.41 kB
JavaScript
var crossHelpers = require('@graphql-mesh/cross-helpers');
var stringInterpolation = require('@graphql-mesh/string-interpolation');
var utils = require('@graphql-mesh/utils');
var executorGraphqlWs = require('@graphql-tools/executor-graphql-ws');
function switchProtocols(url) {
if (url.startsWith("https://")) {
return url.replace("https://", "wss://");
}
if (url.startsWith("http://")) {
return url.replace("http://", "ws://");
}
return url;
}
var index = {
getSubgraphExecutor({ transportEntry, log: rootLog }, onClient) {
const wsExecutorMap = /* @__PURE__ */ new Map();
if (!transportEntry.location) {
throw new Error(
"WS Transport: location is required in the transport entry"
);
}
const wsUrl = switchProtocols(transportEntry.location);
const connectionParamsFactory = transportEntry.options?.connectionParams ? stringInterpolation.getInterpolatedHeadersFactory(transportEntry.options.connectionParams) : void 0;
const headersFactory = transportEntry.headers ? stringInterpolation.getInterpolatedHeadersFactory(
Object.fromEntries(transportEntry.headers)
) : void 0;
const mergedExecutor = function mergedExecutor2(execReq) {
const connectionParams = connectionParamsFactory?.({
env: crossHelpers.process.env,
root: execReq.rootValue,
context: execReq.context,
info: execReq.info
});
const headers = headersFactory?.({
env: crossHelpers.process.env,
root: execReq.rootValue,
context: execReq.context,
info: execReq.info
});
const hash = JSON.stringify({ wsUrl, connectionParams, headers });
let wsExecutor = wsExecutorMap.get(hash);
if (!wsExecutor) {
const log = rootLog.child({
executor: "GraphQL WS",
wsUrl,
connectionParams,
headers
});
wsExecutor = executorGraphqlWs.buildGraphQLWSExecutor({
headers,
url: wsUrl,
lazy: true,
lazyCloseTimeout: 3e3,
...transportEntry.options,
connectionParams,
on: {
connecting(isRetry) {
log.debug({ isRetry }, "connecting");
},
opened(socket) {
log.debug({ socket }, "opened");
},
connected(socket, payload) {
log.debug({ socket, payload }, "connected");
},
ping(received, payload) {
log.debug({ received, payload }, "ping");
},
pong(received, payload) {
log.debug({ received, payload }, "pong");
},
message(message) {
log.debug({ message }, "message");
},
closed(event) {
log.debug({ event }, "closed");
wsExecutorMap.delete(hash);
},
error(error) {
log.debug({ error }, "error");
}
},
onClient
});
wsExecutorMap.set(hash, wsExecutor);
}
return wsExecutor(execReq);
};
return utils.makeAsyncDisposable(
mergedExecutor,
() => Promise.all(
Array.from(wsExecutorMap.values()).map(
(executor) => utils.isDisposable(executor) && utils.dispose(executor)
)
).then(() => {
})
);
}
};
module.exports = index;
;