dialogue-ts 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -24,14 +24,162 @@ __export(src_exports, {
24
24
  createDialogue: () => createDialogue,
25
25
  createHistoryManager: () => createHistoryManager,
26
26
  createRateLimiter: () => createRateLimiter,
27
+ createRuntimeAdapter: () => createRuntimeAdapter,
27
28
  createSilentLogger: () => createSilentLogger,
28
29
  defineEvent: () => defineEvent,
30
+ detectRuntime: () => detectRuntime,
29
31
  getEventByName: () => getEventByName,
30
32
  isEventAllowed: () => isEventAllowed,
31
33
  validateEventData: () => validateEventData
32
34
  });
33
35
  module.exports = __toCommonJS(src_exports);
34
36
 
37
+ // src/adapters/bun-adapter.ts
38
+ var import_bun_engine = require("@socket.io/bun-engine");
39
+ function addCorsHeaders(response, request, corsConfig) {
40
+ const origin = request.headers.get("Origin");
41
+ if (!origin) {
42
+ return response;
43
+ }
44
+ const headers = new Headers(response.headers);
45
+ if (corsConfig === void 0 || corsConfig === true) {
46
+ headers.set("Access-Control-Allow-Origin", origin);
47
+ headers.set("Access-Control-Allow-Credentials", "true");
48
+ } else if (corsConfig === false) {
49
+ return response;
50
+ } else {
51
+ const allowedOrigin = corsConfig.origin;
52
+ if (allowedOrigin === true) {
53
+ headers.set("Access-Control-Allow-Origin", origin);
54
+ } else if (typeof allowedOrigin === "string" && allowedOrigin === origin) {
55
+ headers.set("Access-Control-Allow-Origin", origin);
56
+ } else if (Array.isArray(allowedOrigin) && allowedOrigin.includes(origin)) {
57
+ headers.set("Access-Control-Allow-Origin", origin);
58
+ }
59
+ if (corsConfig.credentials !== false) {
60
+ headers.set("Access-Control-Allow-Credentials", "true");
61
+ }
62
+ }
63
+ headers.set("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
64
+ headers.set("Access-Control-Allow-Headers", "Content-Type");
65
+ return new Response(response.body, {
66
+ status: response.status,
67
+ statusText: response.statusText,
68
+ headers
69
+ });
70
+ }
71
+ function createBunAdapter() {
72
+ const engine = new import_bun_engine.Server();
73
+ let bunServer = null;
74
+ return {
75
+ runtime: "bun",
76
+ bind(io) {
77
+ io.bind(engine);
78
+ },
79
+ start({
80
+ port,
81
+ app,
82
+ corsConfig,
83
+ logger
84
+ }) {
85
+ const { websocket } = engine.handler();
86
+ bunServer = Bun.serve({
87
+ port,
88
+ idleTimeout: 30,
89
+ async fetch(req, server) {
90
+ const url = new URL(req.url);
91
+ if (url.pathname.startsWith("/socket.io")) {
92
+ if (req.method === "OPTIONS") {
93
+ return addCorsHeaders(
94
+ new Response(null, { status: 204 }),
95
+ req,
96
+ corsConfig
97
+ );
98
+ }
99
+ const response = await engine.handleRequest(req, server);
100
+ return addCorsHeaders(response, req, corsConfig);
101
+ }
102
+ return app.fetch(req);
103
+ },
104
+ websocket
105
+ });
106
+ logger.info({
107
+ message: `Server running on http://localhost:${port} (bun)`,
108
+ atFunction: "bunAdapter.start",
109
+ data: { port, runtime: "bun" }
110
+ });
111
+ return Promise.resolve();
112
+ },
113
+ stop() {
114
+ if (bunServer) {
115
+ bunServer.stop();
116
+ bunServer = null;
117
+ }
118
+ return Promise.resolve();
119
+ }
120
+ };
121
+ }
122
+
123
+ // src/adapters/node-adapter.ts
124
+ var import_node_http = require("http");
125
+ var import_node_server = require("@hono/node-server");
126
+ function createNodeAdapter() {
127
+ let httpServer = null;
128
+ let socketIoServer = null;
129
+ return {
130
+ runtime: "node",
131
+ bind(io) {
132
+ socketIoServer = io;
133
+ },
134
+ start({ port, app, io, logger }) {
135
+ const requestListener = (0, import_node_server.getRequestListener)(app.fetch);
136
+ httpServer = (0, import_node_http.createServer)(requestListener);
137
+ io.attach(httpServer);
138
+ return new Promise((resolve) => {
139
+ httpServer?.listen(port, () => {
140
+ logger.info({
141
+ message: `Server running on http://localhost:${port} (node)`,
142
+ atFunction: "nodeAdapter.start",
143
+ data: { port, runtime: "node" }
144
+ });
145
+ resolve();
146
+ });
147
+ });
148
+ },
149
+ stop() {
150
+ return new Promise((resolve) => {
151
+ if (socketIoServer) {
152
+ socketIoServer = null;
153
+ }
154
+ if (httpServer) {
155
+ httpServer.close(() => {
156
+ httpServer = null;
157
+ resolve();
158
+ });
159
+ } else {
160
+ resolve();
161
+ }
162
+ });
163
+ }
164
+ };
165
+ }
166
+
167
+ // src/adapters/index.ts
168
+ function detectRuntime() {
169
+ if (typeof globalThis.Bun !== "undefined") {
170
+ return "bun";
171
+ }
172
+ return "node";
173
+ }
174
+ function createRuntimeAdapter(runtime) {
175
+ const resolved = runtime ?? detectRuntime();
176
+ const adapters = {
177
+ bun: createBunAdapter,
178
+ node: createNodeAdapter
179
+ };
180
+ return adapters[resolved]();
181
+ }
182
+
35
183
  // src/create-dialogue.ts
36
184
  var import_hono = require("hono");
37
185
  var import_slang_ts3 = require("slang-ts");
@@ -159,7 +307,6 @@ function createSilentLogger() {
159
307
  }
160
308
 
161
309
  // src/server.ts
162
- var import_bun_engine = require("@socket.io/bun-engine");
163
310
  var import_cors = require("hono/cors");
164
311
  var import_socket = require("socket.io");
165
312
 
@@ -751,38 +898,6 @@ function buildHonoCorsOptions(cors) {
751
898
  credentials: cors.credentials ?? true
752
899
  };
753
900
  }
754
- function addCorsHeaders(response, request, corsConfig) {
755
- const origin = request.headers.get("Origin");
756
- if (!origin) {
757
- return response;
758
- }
759
- const headers = new Headers(response.headers);
760
- if (corsConfig === void 0 || corsConfig === true) {
761
- headers.set("Access-Control-Allow-Origin", origin);
762
- headers.set("Access-Control-Allow-Credentials", "true");
763
- } else if (corsConfig === false) {
764
- return response;
765
- } else {
766
- const allowedOrigin = corsConfig.origin;
767
- if (allowedOrigin === true) {
768
- headers.set("Access-Control-Allow-Origin", origin);
769
- } else if (typeof allowedOrigin === "string" && allowedOrigin === origin) {
770
- headers.set("Access-Control-Allow-Origin", origin);
771
- } else if (Array.isArray(allowedOrigin) && allowedOrigin.includes(origin)) {
772
- headers.set("Access-Control-Allow-Origin", origin);
773
- }
774
- if (corsConfig.credentials !== false) {
775
- headers.set("Access-Control-Allow-Credentials", "true");
776
- }
777
- }
778
- headers.set("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
779
- headers.set("Access-Control-Allow-Headers", "Content-Type");
780
- return new Response(response.body, {
781
- status: response.status,
782
- statusText: response.statusText,
783
- headers
784
- });
785
- }
786
901
  function sendHistoryOnJoin(socket, roomId, roomConfig, historyManager) {
787
902
  if (!(roomConfig?.syncHistoryOnJoin && historyManager)) {
788
903
  return;
@@ -811,7 +926,7 @@ function createDialogueContext(io, connectedClients, roomManager) {
811
926
  rooms: roomsRecord
812
927
  };
813
928
  }
814
- function setupServer(app, config, historyManager) {
929
+ function setupServer(app, config, adapter, historyManager) {
815
930
  const logger = config.logger ?? createDefaultLogger();
816
931
  const hooks = config.hooks;
817
932
  const connectedClients = /* @__PURE__ */ new Map();
@@ -820,8 +935,7 @@ function setupServer(app, config, historyManager) {
820
935
  const honoCorsOptions = buildHonoCorsOptions(config.cors);
821
936
  app.use("*", (0, import_cors.cors)(honoCorsOptions));
822
937
  const io = new import_socket.Server({ cors: corsOptions });
823
- const engine = new import_bun_engine.Server();
824
- io.bind(engine);
938
+ adapter.bind(io);
825
939
  const getContextForHooks = () => {
826
940
  return createDialogueContext(io, connectedClients, roomManager);
827
941
  };
@@ -1202,46 +1316,20 @@ function setupServer(app, config, historyManager) {
1202
1316
  }
1203
1317
  });
1204
1318
  });
1205
- const { websocket } = engine.handler();
1206
1319
  const port = config.port ?? 3e3;
1207
- let bunServer = null;
1208
1320
  return {
1209
1321
  io,
1210
- engine,
1211
1322
  roomManager,
1212
1323
  start() {
1213
- bunServer = Bun.serve({
1324
+ return adapter.start({
1214
1325
  port,
1215
- idleTimeout: 30,
1216
- async fetch(req, server) {
1217
- const url = new URL(req.url);
1218
- if (url.pathname.startsWith("/socket.io")) {
1219
- if (req.method === "OPTIONS") {
1220
- return addCorsHeaders(
1221
- new Response(null, { status: 204 }),
1222
- req,
1223
- config.cors
1224
- );
1225
- }
1226
- const response = await engine.handleRequest(req, server);
1227
- return addCorsHeaders(response, req, config.cors);
1228
- }
1229
- return app.fetch(req);
1230
- },
1231
- websocket
1232
- });
1233
- logger.info({
1234
- message: `Server running on http://localhost:${port}`,
1235
- atFunction: "setupServer.start",
1236
- data: { port }
1326
+ app,
1327
+ io,
1328
+ corsConfig: config.cors,
1329
+ logger
1237
1330
  });
1238
- return Promise.resolve();
1239
1331
  },
1240
1332
  stop() {
1241
- if (bunServer) {
1242
- bunServer.stop();
1243
- bunServer = null;
1244
- }
1245
1333
  for (const client of connectedClients.values()) {
1246
1334
  client.disconnect();
1247
1335
  }
@@ -1253,7 +1341,7 @@ function setupServer(app, config, historyManager) {
1253
1341
  atFunction: "setupServer.stop",
1254
1342
  data: null
1255
1343
  });
1256
- return Promise.resolve();
1344
+ return adapter.stop();
1257
1345
  },
1258
1346
  /**
1259
1347
  * Gets a connected client by socket ID
@@ -1317,6 +1405,7 @@ function createDialogue(config) {
1317
1405
  onCleanup: config.hooks?.events?.onCleanup,
1318
1406
  onLoad: config.hooks?.events?.onLoad
1319
1407
  });
1408
+ const adapter = createRuntimeAdapter(config.runtime);
1320
1409
  const {
1321
1410
  io,
1322
1411
  roomManager,
@@ -1327,7 +1416,7 @@ function createDialogue(config) {
1327
1416
  getClientsByUserId,
1328
1417
  getClientRooms: getClientRoomIds,
1329
1418
  isUserInRoom
1330
- } = setupServer(app, config, historyManager);
1419
+ } = setupServer(app, config, adapter, historyManager);
1331
1420
  const dialogue = {
1332
1421
  app,
1333
1422
  io,
@@ -1437,8 +1526,10 @@ function createDialogue(config) {
1437
1526
  createDialogue,
1438
1527
  createHistoryManager,
1439
1528
  createRateLimiter,
1529
+ createRuntimeAdapter,
1440
1530
  createSilentLogger,
1441
1531
  defineEvent,
1532
+ detectRuntime,
1442
1533
  getEventByName,
1443
1534
  isEventAllowed,
1444
1535
  validateEventData