87 lines
2.2 KiB
JavaScript
87 lines
2.2 KiB
JavaScript
class AdapterHookable {
|
|
options;
|
|
constructor(options) {
|
|
this.options = options || {};
|
|
}
|
|
callHook(name, arg1, arg2) {
|
|
const globalHook = this.options.hooks?.[name];
|
|
const globalPromise = globalHook?.(arg1, arg2);
|
|
const resolveHooksPromise = this.options.resolve?.(arg1);
|
|
if (!resolveHooksPromise) {
|
|
return globalPromise;
|
|
}
|
|
const resolvePromise = resolveHooksPromise instanceof Promise ? resolveHooksPromise.then((hooks) => hooks?.[name]) : resolveHooksPromise?.[name];
|
|
return Promise.all([globalPromise, resolvePromise]).then(
|
|
([globalRes, hook]) => {
|
|
const hookResPromise = hook?.(arg1, arg2);
|
|
return hookResPromise instanceof Promise ? hookResPromise.then((hookRes) => hookRes || globalRes) : hookResPromise || globalRes;
|
|
}
|
|
);
|
|
}
|
|
async upgrade(request) {
|
|
let context = request.context;
|
|
if (!context) {
|
|
context = {};
|
|
Object.defineProperty(request, "context", {
|
|
enumerable: true,
|
|
value: context
|
|
});
|
|
}
|
|
try {
|
|
const res = await this.callHook(
|
|
"upgrade",
|
|
request
|
|
);
|
|
if (!res) {
|
|
return { context };
|
|
}
|
|
if (res.ok === false) {
|
|
return { context, endResponse: res };
|
|
}
|
|
if (res.headers) {
|
|
return {
|
|
context,
|
|
upgradeHeaders: res.headers
|
|
};
|
|
}
|
|
} catch (error) {
|
|
const errResponse = error.response || error;
|
|
if (errResponse instanceof Response) {
|
|
return {
|
|
context,
|
|
endResponse: errResponse
|
|
};
|
|
}
|
|
throw error;
|
|
}
|
|
return { context };
|
|
}
|
|
}
|
|
function defineHooks(hooks) {
|
|
return hooks;
|
|
}
|
|
|
|
function adapterUtils(peers) {
|
|
return {
|
|
peers,
|
|
publish(topic, message, options) {
|
|
let firstPeerWithTopic;
|
|
for (const peer of peers) {
|
|
if (peer.topics.has(topic)) {
|
|
firstPeerWithTopic = peer;
|
|
break;
|
|
}
|
|
}
|
|
if (firstPeerWithTopic) {
|
|
firstPeerWithTopic.send(message, options);
|
|
firstPeerWithTopic.publish(topic, message, options);
|
|
}
|
|
}
|
|
};
|
|
}
|
|
function defineWebSocketAdapter(factory) {
|
|
return factory;
|
|
}
|
|
|
|
export { AdapterHookable as A, adapterUtils as a, defineWebSocketAdapter as b, defineHooks as d };
|