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.
- package/dist/src/index.cjs +160 -69
- package/dist/src/index.cjs.map +1 -1
- package/dist/src/index.d.cts +60 -2
- package/dist/src/index.d.ts +60 -2
- package/dist/src/index.js +158 -69
- package/dist/src/index.js.map +1 -1
- package/package.json +4 -2
package/dist/src/index.cjs
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
1324
|
+
return adapter.start({
|
|
1214
1325
|
port,
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
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
|
|
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
|