@kerebron/extension-server-hono 0.4.27 → 0.4.28

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.
Files changed (59) hide show
  1. package/esm/HonoYjsMemAdapter.d.ts +41 -0
  2. package/esm/HonoYjsMemAdapter.d.ts.map +1 -0
  3. package/esm/HonoYjsMemAdapter.js +203 -0
  4. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/compose.d.ts +15 -0
  5. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/compose.d.ts.map +1 -0
  6. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/compose.js +64 -0
  7. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/context.d.ts +452 -0
  8. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/context.d.ts.map +1 -0
  9. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/context.js +410 -0
  10. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.d.ts +70 -0
  11. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.d.ts.map +1 -0
  12. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.js +62 -0
  13. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.d.ts +221 -0
  14. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.d.ts.map +1 -0
  15. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.js +391 -0
  16. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.d.ts +60 -0
  17. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.d.ts.map +1 -0
  18. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.js +61 -0
  19. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.d.ts +2 -0
  20. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.d.ts.map +1 -0
  21. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.js +1 -0
  22. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request.d.ts +314 -0
  23. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request.d.ts.map +1 -0
  24. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request.js +327 -0
  25. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/router.d.ts +98 -0
  26. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/router.d.ts.map +1 -0
  27. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/router.js +25 -0
  28. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/types.d.ts +574 -0
  29. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/types.d.ts.map +1 -0
  30. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/types.js +11 -0
  31. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.d.ts +80 -0
  32. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.d.ts.map +1 -0
  33. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.js +111 -0
  34. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.d.ts +5 -0
  35. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.d.ts.map +1 -0
  36. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.js +4 -0
  37. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.d.ts +9 -0
  38. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.d.ts.map +1 -0
  39. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.js +5 -0
  40. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.d.ts +45 -0
  41. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.d.ts.map +1 -0
  42. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.js +122 -0
  43. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.d.ts +33 -0
  44. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.d.ts.map +1 -0
  45. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.js +5 -0
  46. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.d.ts +71 -0
  47. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.d.ts.map +1 -0
  48. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.js +83 -0
  49. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.d.ts +75 -0
  50. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.d.ts.map +1 -0
  51. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.js +5 -0
  52. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.d.ts +30 -0
  53. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.d.ts.map +1 -0
  54. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.js +255 -0
  55. package/esm/mod.d.ts +5 -0
  56. package/esm/mod.d.ts.map +1 -0
  57. package/esm/mod.js +1 -0
  58. package/esm/package.json +3 -0
  59. package/package.json +1 -2
@@ -0,0 +1,41 @@
1
+ import { WSEvents } from './deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.js';
2
+ import * as Y from 'yjs';
3
+ import * as awarenessProtocol from 'y-protocols/awareness';
4
+ import { HonoWsAdapter } from './mod.js';
5
+ export declare const messageType: {
6
+ sync: number;
7
+ awareness: number;
8
+ };
9
+ export declare const docs: Map<string, Y.Doc>;
10
+ /**
11
+ * Gets a Y.Doc by name, whether in memory or on disk
12
+ *
13
+ * @param {string} docname - the name of the Y.Doc to find or create
14
+ * @param {boolean} gc - whether to allow gc on the doc (applies only when created)
15
+ * @return {WSSharedDoc}
16
+ */
17
+ export declare const getYDoc: (docname: string, gc?: boolean) => Y.Doc;
18
+ export declare class SocketContext {
19
+ readonly room: Room;
20
+ readonly socket: WebSocket;
21
+ readonly controlledIds: Set<number>;
22
+ constructor(room: Room, socket: WebSocket);
23
+ }
24
+ export declare class Room {
25
+ readonly roomName: string;
26
+ readonly doc: Y.Doc;
27
+ readonly socketContexts: Map<WebSocket, SocketContext>;
28
+ awareness: awarenessProtocol.Awareness;
29
+ constructor(roomName: string, doc: Y.Doc);
30
+ }
31
+ export declare class HonoYjsMemAdapter implements HonoWsAdapter {
32
+ #private;
33
+ readonly sockets: Map<WebSocket, SocketContext>;
34
+ readonly rooms: Map<string, Room>;
35
+ constructor();
36
+ getRoomNames(): string[];
37
+ upgradeWebSocket(roomName: string): WSEvents<WebSocket>;
38
+ send(conn: WebSocket, m: Uint8Array): void;
39
+ receiveMessage(messageBytes: Uint8Array, conn: WebSocket): void;
40
+ }
41
+ //# sourceMappingURL=HonoYjsMemAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HonoYjsMemAdapter.d.ts","sourceRoot":"","sources":["../src/HonoYjsMemAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,QAAQ,EAAE,MAAM,+DAA+D,CAAC;AAEpG,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,KAAK,iBAAiB,MAAM,uBAAuB,CAAC;AAI3D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,WAAW;;;CAGvB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAa,CAAC;AAIlD;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,SAAS,MAAM,EAAE,YAAS,KAAG,CAAC,CAAC,GAWtD,CAAC;AAEF,qBAAa,aAAa;aAGI,IAAI,EAAE,IAAI;aAAkB,MAAM,EAAE,SAAS;IAFzE,SAAgB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;gBAE3B,IAAI,EAAE,IAAI,EAAkB,MAAM,EAAE,SAAS;CAE1E;AAED,qBAAa,IAAI;aAIa,QAAQ,EAAE,MAAM;aAAkB,GAAG,EAAE,CAAC,CAAC,GAAG;IAHxE,SAAgB,cAAc,EAAE,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAa;IAC1E,SAAS,EAAE,iBAAiB,CAAC,SAAS,CAAC;gBAEX,QAAQ,EAAE,MAAM,EAAkB,GAAG,EAAE,CAAC,CAAC,GAAG;CAuDzE;AAID,qBAAa,iBAAkB,YAAW,aAAa;;IACrD,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAa;IAC5D,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;;IAMlC,YAAY;IAIZ,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC;IAsEvD,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU;IAUnC,cAAc,CAAC,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS;CA8DzD"}
@@ -0,0 +1,203 @@
1
+ import * as Y from 'yjs';
2
+ import * as syncProtocol from 'y-protocols/sync';
3
+ import * as awarenessProtocol from 'y-protocols/awareness';
4
+ import * as encoding from 'lib0/encoding';
5
+ import * as decoding from 'lib0/decoding';
6
+ export const messageType = {
7
+ sync: 0,
8
+ awareness: 1,
9
+ };
10
+ export const docs = new Map();
11
+ const gcEnabled = false;
12
+ /**
13
+ * Gets a Y.Doc by name, whether in memory or on disk
14
+ *
15
+ * @param {string} docname - the name of the Y.Doc to find or create
16
+ * @param {boolean} gc - whether to allow gc on the doc (applies only when created)
17
+ * @return {WSSharedDoc}
18
+ */
19
+ export const getYDoc = (docname, gc = true) => {
20
+ if (docs.has(docname)) {
21
+ return docs.get(docname);
22
+ }
23
+ const ydoc = new Y.Doc({ gc: gcEnabled });
24
+ ydoc.gc = gc;
25
+ // if (persistence !== null) {
26
+ // persistence.bindState(docname, doc)
27
+ // }
28
+ docs.set(docname, ydoc);
29
+ return ydoc;
30
+ };
31
+ export class SocketContext {
32
+ room;
33
+ socket;
34
+ controlledIds = new Set();
35
+ constructor(room, socket) {
36
+ this.room = room;
37
+ this.socket = socket;
38
+ }
39
+ }
40
+ export class Room {
41
+ roomName;
42
+ doc;
43
+ socketContexts = new Map();
44
+ awareness;
45
+ constructor(roomName, doc) {
46
+ this.roomName = roomName;
47
+ this.doc = doc;
48
+ this.awareness = new awarenessProtocol.Awareness(doc);
49
+ this.awareness.setLocalState(null);
50
+ this.awareness.on('update', ({ added, updated, removed }, conn) => {
51
+ const changedClients = added.concat(updated, removed);
52
+ if (conn !== null) {
53
+ const socketContext = this.socketContexts.get(conn);
54
+ if (socketContext) {
55
+ added.forEach((clientID) => {
56
+ socketContext.controlledIds.add(clientID);
57
+ });
58
+ removed.forEach((clientID) => {
59
+ socketContext.controlledIds.delete(clientID);
60
+ });
61
+ }
62
+ }
63
+ // broadcast awareness update
64
+ const encoder = encoding.createEncoder();
65
+ encoding.writeVarUint(encoder, messageType.awareness);
66
+ encoding.writeVarUint8Array(encoder, awarenessProtocol.encodeAwarenessUpdate(this.awareness, changedClients));
67
+ const buff = encoding.toUint8Array(encoder);
68
+ for (const socket of this.socketContexts.keys()) {
69
+ socket.send(buff);
70
+ }
71
+ });
72
+ doc.on('update', (update) => {
73
+ const encoder = encoding.createEncoder();
74
+ encoding.writeVarUint(encoder, messageType.sync);
75
+ syncProtocol.writeUpdate(encoder, update);
76
+ const message = encoding.toUint8Array(encoder);
77
+ for (const socket of this.socketContexts.keys()) {
78
+ socket.send(message);
79
+ }
80
+ });
81
+ }
82
+ }
83
+ const rooms = new Map();
84
+ export class HonoYjsMemAdapter {
85
+ sockets = new Map();
86
+ rooms;
87
+ constructor() {
88
+ this.rooms = rooms;
89
+ }
90
+ getRoomNames() {
91
+ return Array.from(rooms.keys());
92
+ }
93
+ upgradeWebSocket(roomName) {
94
+ const doc = getYDoc(roomName, gcEnabled);
95
+ return {
96
+ onOpen: (evt, wsContext) => {
97
+ if (!wsContext.raw) {
98
+ return;
99
+ }
100
+ if (!this.rooms.has(roomName)) {
101
+ this.rooms.set(roomName, new Room(roomName, doc));
102
+ }
103
+ const room = this.rooms.get(roomName);
104
+ const socketContext = new SocketContext(room, wsContext.raw);
105
+ this.sockets.set(wsContext.raw, socketContext);
106
+ room.socketContexts.set(wsContext.raw, socketContext);
107
+ const encoder = encoding.createEncoder();
108
+ encoding.writeVarUint(encoder, messageType.sync);
109
+ syncProtocol.writeSyncStep1(encoder, doc);
110
+ this.send(wsContext.raw, encoding.toUint8Array(encoder));
111
+ const awarenessStates = room.awareness.getStates();
112
+ if (awarenessStates.size > 0) {
113
+ const encoder = encoding.createEncoder();
114
+ encoding.writeVarUint(encoder, messageType.awareness);
115
+ encoding.writeVarUint8Array(encoder, awarenessProtocol.encodeAwarenessUpdate(room.awareness, Array.from(awarenessStates.keys())));
116
+ this.send(wsContext.raw, encoding.toUint8Array(encoder));
117
+ }
118
+ // this.#forceReady();
119
+ },
120
+ onError: (evt, wsContext) => {
121
+ if (evt instanceof ErrorEvent) {
122
+ if (evt.message.indexOf('Connection reset by peer') > -1) {
123
+ return;
124
+ }
125
+ if (evt.message.indexOf('No response from ping frame.') > -1) {
126
+ return;
127
+ }
128
+ console.warn(new Error('HonoYjsMemAdapter.onError: ' + evt.message, {
129
+ cause: evt.error,
130
+ }));
131
+ }
132
+ },
133
+ onMessage: (message, wsContext) => {
134
+ if (!wsContext.raw) {
135
+ return;
136
+ }
137
+ this.receiveMessage(new Uint8Array(message.data), wsContext.raw);
138
+ },
139
+ onClose: (event, wsContext) => {
140
+ if (!wsContext.raw) {
141
+ return;
142
+ }
143
+ this.#removeSocket(wsContext.raw);
144
+ },
145
+ };
146
+ }
147
+ send(conn, m) {
148
+ if (conn.readyState !== WebSocket.CONNECTING &&
149
+ conn.readyState !== WebSocket.OPEN) {
150
+ this.#terminate(conn);
151
+ }
152
+ conn.send(m);
153
+ }
154
+ receiveMessage(messageBytes, conn) {
155
+ try {
156
+ const socketContext = this.sockets.get(conn);
157
+ if (!socketContext) {
158
+ return;
159
+ }
160
+ const room = socketContext.room;
161
+ const encoder = encoding.createEncoder();
162
+ const decoder = decoding.createDecoder(messageBytes);
163
+ const type = decoding.readVarUint(decoder);
164
+ switch (type) {
165
+ case messageType.sync:
166
+ encoding.writeVarUint(encoder, messageType.sync);
167
+ syncProtocol.readSyncMessage(decoder, encoder, room.doc, conn);
168
+ // If the `encoder` only contains the type of reply message and no
169
+ // message, there is no need to send the message. When `encoder` only
170
+ // contains the type of reply, its length is 1.
171
+ if (encoding.length(encoder) > 1) {
172
+ this.send(conn, encoding.toUint8Array(encoder));
173
+ }
174
+ break;
175
+ case messageType.awareness: {
176
+ awarenessProtocol.applyAwarenessUpdate(room.awareness, decoding.readVarUint8Array(decoder), conn);
177
+ break;
178
+ }
179
+ }
180
+ }
181
+ catch (err) {
182
+ console.error(err);
183
+ // room.doc.emit('error', [err]);
184
+ }
185
+ }
186
+ #terminate(socket) {
187
+ this.#removeSocket(socket);
188
+ socket.close();
189
+ }
190
+ #removeSocket(conn) {
191
+ const socketContext = this.sockets.get(conn);
192
+ if (socketContext) {
193
+ const room = socketContext.room;
194
+ room.socketContexts.delete(socketContext.socket);
195
+ awarenessProtocol.removeAwarenessStates(room.awareness, Array.from(socketContext.controlledIds), null);
196
+ if (room.socketContexts.size === 0) {
197
+ // TODO save to persistence
198
+ // TODO Destroy room
199
+ }
200
+ this.sockets.delete(conn);
201
+ }
202
+ }
203
+ }
@@ -0,0 +1,15 @@
1
+ import type { Context } from './context.js';
2
+ import type { Env, ErrorHandler, Next, NotFoundHandler } from './types.js';
3
+ /**
4
+ * Compose middleware functions into a single function based on `koa-compose` package.
5
+ *
6
+ * @template E - The environment type.
7
+ *
8
+ * @param {[[Function, unknown], unknown][] | [[Function]][]} middleware - An array of middleware functions and their corresponding parameters.
9
+ * @param {ErrorHandler<E>} [onError] - An optional error handler function.
10
+ * @param {NotFoundHandler<E>} [onNotFound] - An optional not-found handler function.
11
+ *
12
+ * @returns {(context: Context, next?: Next) => Promise<Context>} - A composed middleware function.
13
+ */
14
+ export declare const compose: <E extends Env = Env>(middleware: [[Function, unknown], unknown][] | [[Function]][], onError?: ErrorHandler<E>, onNotFound?: NotFoundHandler<E>) => ((context: Context, next?: Next) => Promise<Context>);
15
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../../../../../../src/deps/jsr.io/@hono/hono/4.11.3/src/compose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE1E;;;;;;;;;;GAUG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,GAAG,GAAG,GAAG,EACzC,YAAY,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,EAC7D,UAAU,YAAY,CAAC,CAAC,CAAC,EACzB,aAAa,eAAe,CAAC,CAAC,CAAC,KAC9B,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO,CAAC,OAAO,CAAC,CAsDtD,CAAA"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Compose middleware functions into a single function based on `koa-compose` package.
3
+ *
4
+ * @template E - The environment type.
5
+ *
6
+ * @param {[[Function, unknown], unknown][] | [[Function]][]} middleware - An array of middleware functions and their corresponding parameters.
7
+ * @param {ErrorHandler<E>} [onError] - An optional error handler function.
8
+ * @param {NotFoundHandler<E>} [onNotFound] - An optional not-found handler function.
9
+ *
10
+ * @returns {(context: Context, next?: Next) => Promise<Context>} - A composed middleware function.
11
+ */
12
+ export const compose = (middleware, onError, onNotFound) => {
13
+ return (context, next) => {
14
+ let index = -1;
15
+ return dispatch(0);
16
+ /**
17
+ * Dispatch the middleware functions.
18
+ *
19
+ * @param {number} i - The current index in the middleware array.
20
+ *
21
+ * @returns {Promise<Context>} - A promise that resolves to the context.
22
+ */
23
+ async function dispatch(i) {
24
+ if (i <= index) {
25
+ throw new Error('next() called multiple times');
26
+ }
27
+ index = i;
28
+ let res;
29
+ let isError = false;
30
+ let handler;
31
+ if (middleware[i]) {
32
+ handler = middleware[i][0][0];
33
+ context.req.routeIndex = i;
34
+ }
35
+ else {
36
+ handler = (i === middleware.length && next) || undefined;
37
+ }
38
+ if (handler) {
39
+ try {
40
+ res = await handler(context, () => dispatch(i + 1));
41
+ }
42
+ catch (err) {
43
+ if (err instanceof Error && onError) {
44
+ context.error = err;
45
+ res = await onError(err, context);
46
+ isError = true;
47
+ }
48
+ else {
49
+ throw err;
50
+ }
51
+ }
52
+ }
53
+ else {
54
+ if (context.finalized === false && onNotFound) {
55
+ res = await onNotFound(context);
56
+ }
57
+ }
58
+ if (res && (context.finalized === false || isError)) {
59
+ context.res = res;
60
+ }
61
+ return context;
62
+ }
63
+ };
64
+ };