Files
2025-07-24 18:46:24 +02:00

69 lines
1.9 KiB
JavaScript

import { M as Message, P as Peer, t as toBufferLike } from '../shared/crossws.DfCzGthR.mjs';
import { a as adapterUtils, A as AdapterHookable } from '../shared/crossws.D9ehKjSh.mjs';
import { W as WSError } from '../shared/crossws.By9qWDAI.mjs';
import 'uncrypto';
const cloudflareAdapter = (options = {}) => {
const hooks = new AdapterHookable(options);
const peers = /* @__PURE__ */ new Set();
return {
...adapterUtils(peers),
handleUpgrade: async (request, env, cfCtx) => {
const { upgradeHeaders, endResponse, context } = await hooks.upgrade(
request
);
if (endResponse) {
return endResponse;
}
const pair = new WebSocketPair();
const client = pair[0];
const server = pair[1];
const peer = new CloudflarePeer({
ws: client,
peers,
wsServer: server,
request,
cfEnv: env,
cfCtx,
context
});
peers.add(peer);
server.accept();
hooks.callHook("open", peer);
server.addEventListener("message", (event) => {
hooks.callHook(
"message",
peer,
new Message(event.data, peer, event)
);
});
server.addEventListener("error", (event) => {
peers.delete(peer);
hooks.callHook("error", peer, new WSError(event.error));
});
server.addEventListener("close", (event) => {
peers.delete(peer);
hooks.callHook("close", peer, event);
});
return new Response(null, {
status: 101,
webSocket: client,
headers: upgradeHeaders
});
}
};
};
class CloudflarePeer extends Peer {
send(data) {
this._internal.wsServer.send(toBufferLike(data));
return 0;
}
publish(_topic, _message) {
}
close(code, reason) {
this._internal.ws.close(code, reason);
}
}
export { cloudflareAdapter as default };