@kerebron/extension-server-hono 0.4.27 → 0.4.29

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 (97) hide show
  1. package/esm/HonoYjsMemAdapter.d.ts +41 -0
  2. package/esm/HonoYjsMemAdapter.d.ts.map +1 -0
  3. package/esm/HonoYjsMemAdapter.js +204 -0
  4. package/esm/HonoYjsMemAdapter.js.map +1 -0
  5. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/compose.d.ts +15 -0
  6. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/compose.d.ts.map +1 -0
  7. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/compose.js +65 -0
  8. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/compose.js.map +1 -0
  9. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/context.d.ts +452 -0
  10. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/context.d.ts.map +1 -0
  11. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/context.js +411 -0
  12. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/context.js.map +1 -0
  13. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.d.ts +70 -0
  14. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.d.ts.map +1 -0
  15. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.js +63 -0
  16. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.js.map +1 -0
  17. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.d.ts +221 -0
  18. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.d.ts.map +1 -0
  19. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.js +392 -0
  20. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.js.map +1 -0
  21. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.d.ts +60 -0
  22. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.d.ts.map +1 -0
  23. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.js +62 -0
  24. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.js.map +1 -0
  25. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.d.ts +2 -0
  26. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.d.ts.map +1 -0
  27. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.js +2 -0
  28. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.js.map +1 -0
  29. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request.d.ts +314 -0
  30. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request.d.ts.map +1 -0
  31. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request.js +328 -0
  32. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request.js.map +1 -0
  33. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/router.d.ts +98 -0
  34. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/router.d.ts.map +1 -0
  35. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/router.js +26 -0
  36. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/router.js.map +1 -0
  37. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/types.d.ts +574 -0
  38. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/types.d.ts.map +1 -0
  39. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/types.js +12 -0
  40. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/types.js.map +1 -0
  41. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.d.ts +80 -0
  42. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.d.ts.map +1 -0
  43. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.js +112 -0
  44. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.js.map +1 -0
  45. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.d.ts +5 -0
  46. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.d.ts.map +1 -0
  47. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.js +5 -0
  48. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.js.map +1 -0
  49. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.d.ts +9 -0
  50. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.d.ts.map +1 -0
  51. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.js +6 -0
  52. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.js.map +1 -0
  53. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.d.ts +45 -0
  54. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.d.ts.map +1 -0
  55. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.js +123 -0
  56. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.js.map +1 -0
  57. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.d.ts +33 -0
  58. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.d.ts.map +1 -0
  59. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.js +6 -0
  60. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.js.map +1 -0
  61. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.d.ts +71 -0
  62. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.d.ts.map +1 -0
  63. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.js +84 -0
  64. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.js.map +1 -0
  65. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.d.ts +75 -0
  66. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.d.ts.map +1 -0
  67. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.js +6 -0
  68. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.js.map +1 -0
  69. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.d.ts +30 -0
  70. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.d.ts.map +1 -0
  71. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.js +256 -0
  72. package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.js.map +1 -0
  73. package/esm/mod.d.ts +5 -0
  74. package/esm/mod.d.ts.map +1 -0
  75. package/esm/mod.js +2 -0
  76. package/esm/mod.js.map +1 -0
  77. package/esm/package.json +3 -0
  78. package/package.json +5 -2
  79. package/src/HonoYjsMemAdapter.ts +264 -0
  80. package/src/deps/jsr.io/@hono/hono/4.11.3/src/compose.ts +73 -0
  81. package/src/deps/jsr.io/@hono/hono/4.11.3/src/context.ts +770 -0
  82. package/src/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.ts +140 -0
  83. package/src/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.ts +539 -0
  84. package/src/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.ts +78 -0
  85. package/src/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.ts +1 -0
  86. package/src/deps/jsr.io/@hono/hono/4.11.3/src/request.ts +487 -0
  87. package/src/deps/jsr.io/@hono/hono/4.11.3/src/router.ts +103 -0
  88. package/src/deps/jsr.io/@hono/hono/4.11.3/src/types.ts +2489 -0
  89. package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.ts +229 -0
  90. package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.ts +4 -0
  91. package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.ts +333 -0
  92. package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.ts +182 -0
  93. package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.ts +72 -0
  94. package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.ts +96 -0
  95. package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.ts +116 -0
  96. package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.ts +310 -0
  97. package/src/mod.ts +5 -0
@@ -0,0 +1,256 @@
1
+ /**
2
+ * @module
3
+ * URL utility.
4
+ */
5
+ export const splitPath = (path) => {
6
+ const paths = path.split('/');
7
+ if (paths[0] === '') {
8
+ paths.shift();
9
+ }
10
+ return paths;
11
+ };
12
+ export const splitRoutingPath = (routePath) => {
13
+ const { groups, path } = extractGroupsFromPath(routePath);
14
+ const paths = splitPath(path);
15
+ return replaceGroupMarks(paths, groups);
16
+ };
17
+ const extractGroupsFromPath = (path) => {
18
+ const groups = [];
19
+ path = path.replace(/\{[^}]+\}/g, (match, index) => {
20
+ const mark = `@${index}`;
21
+ groups.push([mark, match]);
22
+ return mark;
23
+ });
24
+ return { groups, path };
25
+ };
26
+ const replaceGroupMarks = (paths, groups) => {
27
+ for (let i = groups.length - 1; i >= 0; i--) {
28
+ const [mark] = groups[i];
29
+ for (let j = paths.length - 1; j >= 0; j--) {
30
+ if (paths[j].includes(mark)) {
31
+ paths[j] = paths[j].replace(mark, groups[i][1]);
32
+ break;
33
+ }
34
+ }
35
+ }
36
+ return paths;
37
+ };
38
+ const patternCache = {};
39
+ export const getPattern = (label, next) => {
40
+ // * => wildcard
41
+ // :id{[0-9]+} => ([0-9]+)
42
+ // :id => (.+)
43
+ if (label === '*') {
44
+ return '*';
45
+ }
46
+ const match = label.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);
47
+ if (match) {
48
+ const cacheKey = `${label}#${next}`;
49
+ if (!patternCache[cacheKey]) {
50
+ if (match[2]) {
51
+ patternCache[cacheKey] =
52
+ next && next[0] !== ':' && next[0] !== '*'
53
+ ? [cacheKey, match[1], new RegExp(`^${match[2]}(?=/${next})`)]
54
+ : [label, match[1], new RegExp(`^${match[2]}$`)];
55
+ }
56
+ else {
57
+ patternCache[cacheKey] = [label, match[1], true];
58
+ }
59
+ }
60
+ return patternCache[cacheKey];
61
+ }
62
+ return null;
63
+ };
64
+ export const tryDecode = (str, decoder) => {
65
+ try {
66
+ return decoder(str);
67
+ }
68
+ catch {
69
+ return str.replace(/(?:%[0-9A-Fa-f]{2})+/g, (match) => {
70
+ try {
71
+ return decoder(match);
72
+ }
73
+ catch {
74
+ return match;
75
+ }
76
+ });
77
+ }
78
+ };
79
+ /**
80
+ * Try to apply decodeURI() to given string.
81
+ * If it fails, skip invalid percent encoding or invalid UTF-8 sequences, and apply decodeURI() to the rest as much as possible.
82
+ * @param str The string to decode.
83
+ * @returns The decoded string that sometimes contains undecodable percent encoding.
84
+ * @example
85
+ * tryDecodeURI('Hello%20World') // 'Hello World'
86
+ * tryDecodeURI('Hello%20World/%A4%A2') // 'Hello World/%A4%A2'
87
+ */
88
+ const tryDecodeURI = (str) => tryDecode(str, decodeURI);
89
+ export const getPath = (request) => {
90
+ const url = request.url;
91
+ const start = url.indexOf('/', url.indexOf(':') + 4);
92
+ let i = start;
93
+ for (; i < url.length; i++) {
94
+ const charCode = url.charCodeAt(i);
95
+ if (charCode === 37) {
96
+ // '%'
97
+ // If the path contains percent encoding, use `indexOf()` to find '?' and return the result immediately.
98
+ // Although this is a performance disadvantage, it is acceptable since we prefer cases that do not include percent encoding.
99
+ const queryIndex = url.indexOf('?', i);
100
+ const path = url.slice(start, queryIndex === -1 ? undefined : queryIndex);
101
+ return tryDecodeURI(path.includes('%25') ? path.replace(/%25/g, '%2525') : path);
102
+ }
103
+ else if (charCode === 63) {
104
+ // '?'
105
+ break;
106
+ }
107
+ }
108
+ return url.slice(start, i);
109
+ };
110
+ export const getQueryStrings = (url) => {
111
+ const queryIndex = url.indexOf('?', 8);
112
+ return queryIndex === -1 ? '' : '?' + url.slice(queryIndex + 1);
113
+ };
114
+ export const getPathNoStrict = (request) => {
115
+ const result = getPath(request);
116
+ // if strict routing is false => `/hello/hey/` and `/hello/hey` are treated the same
117
+ return result.length > 1 && result.at(-1) === '/' ? result.slice(0, -1) : result;
118
+ };
119
+ /**
120
+ * Merge paths.
121
+ * @param {string[]} ...paths - The paths to merge.
122
+ * @returns {string} The merged path.
123
+ * @example
124
+ * mergePath('/api', '/users') // '/api/users'
125
+ * mergePath('/api/', '/users') // '/api/users'
126
+ * mergePath('/api', '/') // '/api'
127
+ * mergePath('/api/', '/') // '/api/'
128
+ */
129
+ export const mergePath = (base, sub, ...rest) => {
130
+ if (rest.length) {
131
+ sub = mergePath(sub, ...rest);
132
+ }
133
+ return `${base?.[0] === '/' ? '' : '/'}${base}${sub === '/' ? '' : `${base?.at(-1) === '/' ? '' : '/'}${sub?.[0] === '/' ? sub.slice(1) : sub}`}`;
134
+ };
135
+ export const checkOptionalParameter = (path) => {
136
+ /*
137
+ If path is `/api/animals/:type?` it will return:
138
+ [`/api/animals`, `/api/animals/:type`]
139
+ in other cases it will return null
140
+ */
141
+ if (path.charCodeAt(path.length - 1) !== 63 || !path.includes(':')) {
142
+ return null;
143
+ }
144
+ const segments = path.split('/');
145
+ const results = [];
146
+ let basePath = '';
147
+ segments.forEach((segment) => {
148
+ if (segment !== '' && !/\:/.test(segment)) {
149
+ basePath += '/' + segment;
150
+ }
151
+ else if (/\:/.test(segment)) {
152
+ if (/\?/.test(segment)) {
153
+ if (results.length === 0 && basePath === '') {
154
+ results.push('/');
155
+ }
156
+ else {
157
+ results.push(basePath);
158
+ }
159
+ const optionalSegment = segment.replace('?', '');
160
+ basePath += '/' + optionalSegment;
161
+ results.push(basePath);
162
+ }
163
+ else {
164
+ basePath += '/' + segment;
165
+ }
166
+ }
167
+ });
168
+ return results.filter((v, i, a) => a.indexOf(v) === i);
169
+ };
170
+ // Optimized
171
+ const _decodeURI = (value) => {
172
+ if (!/[%+]/.test(value)) {
173
+ return value;
174
+ }
175
+ if (value.indexOf('+') !== -1) {
176
+ value = value.replace(/\+/g, ' ');
177
+ }
178
+ return value.indexOf('%') !== -1 ? tryDecode(value, decodeURIComponent_) : value;
179
+ };
180
+ const _getQueryParam = (url, key, multiple) => {
181
+ let encoded;
182
+ if (!multiple && key && !/[%+]/.test(key)) {
183
+ // optimized for unencoded key
184
+ let keyIndex = url.indexOf('?', 8);
185
+ if (keyIndex === -1) {
186
+ return undefined;
187
+ }
188
+ if (!url.startsWith(key, keyIndex + 1)) {
189
+ keyIndex = url.indexOf(`&${key}`, keyIndex + 1);
190
+ }
191
+ while (keyIndex !== -1) {
192
+ const trailingKeyCode = url.charCodeAt(keyIndex + key.length + 1);
193
+ if (trailingKeyCode === 61) {
194
+ const valueIndex = keyIndex + key.length + 2;
195
+ const endIndex = url.indexOf('&', valueIndex);
196
+ return _decodeURI(url.slice(valueIndex, endIndex === -1 ? undefined : endIndex));
197
+ }
198
+ else if (trailingKeyCode == 38 || isNaN(trailingKeyCode)) {
199
+ return '';
200
+ }
201
+ keyIndex = url.indexOf(`&${key}`, keyIndex + 1);
202
+ }
203
+ encoded = /[%+]/.test(url);
204
+ if (!encoded) {
205
+ return undefined;
206
+ }
207
+ // fallback to default routine
208
+ }
209
+ const results = {};
210
+ encoded ??= /[%+]/.test(url);
211
+ let keyIndex = url.indexOf('?', 8);
212
+ while (keyIndex !== -1) {
213
+ const nextKeyIndex = url.indexOf('&', keyIndex + 1);
214
+ let valueIndex = url.indexOf('=', keyIndex);
215
+ if (valueIndex > nextKeyIndex && nextKeyIndex !== -1) {
216
+ valueIndex = -1;
217
+ }
218
+ let name = url.slice(keyIndex + 1, valueIndex === -1 ? (nextKeyIndex === -1 ? undefined : nextKeyIndex) : valueIndex);
219
+ if (encoded) {
220
+ name = _decodeURI(name);
221
+ }
222
+ keyIndex = nextKeyIndex;
223
+ if (name === '') {
224
+ continue;
225
+ }
226
+ let value;
227
+ if (valueIndex === -1) {
228
+ value = '';
229
+ }
230
+ else {
231
+ value = url.slice(valueIndex + 1, nextKeyIndex === -1 ? undefined : nextKeyIndex);
232
+ if (encoded) {
233
+ value = _decodeURI(value);
234
+ }
235
+ }
236
+ if (multiple) {
237
+ if (!(results[name] && Array.isArray(results[name]))) {
238
+ results[name] = [];
239
+ }
240
+ ;
241
+ results[name].push(value);
242
+ }
243
+ else {
244
+ results[name] ??= value;
245
+ }
246
+ }
247
+ return key ? results[key] : results;
248
+ };
249
+ export const getQueryParam = _getQueryParam;
250
+ export const getQueryParams = (url, key) => {
251
+ return _getQueryParam(url, key, true);
252
+ };
253
+ // `decodeURIComponent` is a long name.
254
+ // By making it a function, we can use it commonly when minified, reducing the amount of code.
255
+ export const decodeURIComponent_ = decodeURIComponent;
256
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../../../../../../../src/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.ts"],"names":[],"mappings":"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"}
package/esm/mod.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import { WSEvents } from './deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.js';
2
+ export interface HonoWsAdapter {
3
+ upgradeWebSocket(roomName: string): WSEvents<WebSocket>;
4
+ }
5
+ //# sourceMappingURL=mod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,+DAA+D,CAAC;AAEzF,MAAM,WAAW,aAAa;IAC5B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;CACzD"}
package/esm/mod.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mod.js.map
package/esm/mod.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kerebron/extension-server-hono",
3
- "version": "0.4.27",
3
+ "version": "0.4.29",
4
4
  "license": "MIT",
5
5
  "module": "./esm/mod.js",
6
6
  "exports": {
@@ -12,7 +12,10 @@
12
12
  }
13
13
  },
14
14
  "scripts": {},
15
- "files": [],
15
+ "files": [
16
+ "esm",
17
+ "src"
18
+ ],
16
19
  "dependencies": {
17
20
  "lib0": "0.2.109",
18
21
  "y-protocols": "1.0.6",
@@ -0,0 +1,264 @@
1
+ import { WSContext, WSEvents } from './deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.js';
2
+
3
+ import * as Y from 'yjs';
4
+ import * as syncProtocol from 'y-protocols/sync';
5
+ import * as awarenessProtocol from 'y-protocols/awareness';
6
+
7
+ import * as encoding from 'lib0/encoding';
8
+ import * as decoding from 'lib0/decoding';
9
+ import { HonoWsAdapter } from './mod.js';
10
+
11
+ export const messageType = {
12
+ sync: 0,
13
+ awareness: 1,
14
+ };
15
+
16
+ export const docs: Map<string, Y.Doc> = new Map();
17
+
18
+ const gcEnabled = false;
19
+
20
+ /**
21
+ * Gets a Y.Doc by name, whether in memory or on disk
22
+ *
23
+ * @param {string} docname - the name of the Y.Doc to find or create
24
+ * @param {boolean} gc - whether to allow gc on the doc (applies only when created)
25
+ * @return {WSSharedDoc}
26
+ */
27
+ export const getYDoc = (docname: string, gc = true): Y.Doc => {
28
+ if (docs.has(docname)) {
29
+ return docs.get(docname);
30
+ }
31
+ const ydoc = new Y.Doc({ gc: gcEnabled });
32
+ ydoc.gc = gc;
33
+ // if (persistence !== null) {
34
+ // persistence.bindState(docname, doc)
35
+ // }
36
+ docs.set(docname, ydoc);
37
+ return ydoc;
38
+ };
39
+
40
+ export class SocketContext {
41
+ public readonly controlledIds: Set<number> = new Set();
42
+
43
+ constructor(public readonly room: Room, public readonly socket: WebSocket) {
44
+ }
45
+ }
46
+
47
+ export class Room {
48
+ public readonly socketContexts: Map<WebSocket, SocketContext> = new Map();
49
+ awareness: awarenessProtocol.Awareness;
50
+
51
+ constructor(public readonly roomName: string, public readonly doc: Y.Doc) {
52
+ this.awareness = new awarenessProtocol.Awareness(doc);
53
+ this.awareness.setLocalState(null);
54
+ this.awareness.on(
55
+ 'update',
56
+ (
57
+ { added, updated, removed }: {
58
+ added: number[];
59
+ updated: number[];
60
+ removed: number[];
61
+ },
62
+ conn: WebSocket,
63
+ ) => {
64
+ const changedClients = added.concat(updated, removed);
65
+ if (conn !== null) {
66
+ const socketContext = this.socketContexts.get(conn);
67
+ if (socketContext) {
68
+ added.forEach((clientID) => {
69
+ socketContext.controlledIds.add(clientID);
70
+ });
71
+ removed.forEach((clientID) => {
72
+ socketContext.controlledIds.delete(clientID);
73
+ });
74
+ }
75
+ }
76
+ // broadcast awareness update
77
+ const encoder = encoding.createEncoder();
78
+ encoding.writeVarUint(encoder, messageType.awareness);
79
+ encoding.writeVarUint8Array(
80
+ encoder,
81
+ awarenessProtocol.encodeAwarenessUpdate(
82
+ this.awareness,
83
+ changedClients,
84
+ ),
85
+ );
86
+ const buff = encoding.toUint8Array(encoder);
87
+ for (const socket of this.socketContexts.keys()) {
88
+ socket.send(buff);
89
+ }
90
+ },
91
+ );
92
+
93
+ doc.on(
94
+ 'update',
95
+ (update) => {
96
+ const encoder = encoding.createEncoder();
97
+ encoding.writeVarUint(encoder, messageType.sync);
98
+ syncProtocol.writeUpdate(encoder, update);
99
+ const message = encoding.toUint8Array(encoder);
100
+ for (const socket of this.socketContexts.keys()) {
101
+ socket.send(message);
102
+ }
103
+ },
104
+ );
105
+ }
106
+ }
107
+
108
+ const rooms: Map<string, Room> = new Map();
109
+
110
+ export class HonoYjsMemAdapter implements HonoWsAdapter {
111
+ readonly sockets: Map<WebSocket, SocketContext> = new Map();
112
+ readonly rooms: Map<string, Room>;
113
+
114
+ constructor() {
115
+ this.rooms = rooms;
116
+ }
117
+
118
+ getRoomNames() {
119
+ return Array.from(rooms.keys());
120
+ }
121
+
122
+ upgradeWebSocket(roomName: string): WSEvents<WebSocket> {
123
+ const doc = getYDoc(roomName, gcEnabled);
124
+
125
+ return {
126
+ onOpen: (evt: Event, wsContext: WSContext<WebSocket>) => {
127
+ if (!wsContext.raw) {
128
+ return;
129
+ }
130
+
131
+ if (!this.rooms.has(roomName)) {
132
+ this.rooms.set(roomName, new Room(roomName, doc));
133
+ }
134
+ const room = this.rooms.get(roomName)!;
135
+
136
+ const socketContext = new SocketContext(room, wsContext.raw);
137
+ this.sockets.set(wsContext.raw, socketContext);
138
+ room.socketContexts.set(wsContext.raw, socketContext);
139
+
140
+ const encoder = encoding.createEncoder();
141
+ encoding.writeVarUint(encoder, messageType.sync);
142
+ syncProtocol.writeSyncStep1(encoder, doc);
143
+ this.send(wsContext.raw, encoding.toUint8Array(encoder));
144
+ const awarenessStates = room.awareness.getStates();
145
+ if (awarenessStates.size > 0) {
146
+ const encoder = encoding.createEncoder();
147
+ encoding.writeVarUint(encoder, messageType.awareness);
148
+ encoding.writeVarUint8Array(
149
+ encoder,
150
+ awarenessProtocol.encodeAwarenessUpdate(
151
+ room.awareness,
152
+ Array.from(awarenessStates.keys()),
153
+ ),
154
+ );
155
+ this.send(wsContext.raw, encoding.toUint8Array(encoder));
156
+ }
157
+ // this.#forceReady();
158
+ },
159
+ onError: (evt: Event, wsContext: WSContext<WebSocket>) => {
160
+ if (evt instanceof ErrorEvent) {
161
+ if (evt.message.indexOf('Connection reset by peer') > -1) {
162
+ return;
163
+ }
164
+ if (evt.message.indexOf('No response from ping frame.') > -1) {
165
+ return;
166
+ }
167
+ console.warn(
168
+ new Error('HonoYjsMemAdapter.onError: ' + evt.message, {
169
+ cause: evt.error,
170
+ }),
171
+ );
172
+ }
173
+ },
174
+ onMessage: (message, wsContext: WSContext<WebSocket>) => {
175
+ if (!wsContext.raw) {
176
+ return;
177
+ }
178
+ this.receiveMessage(
179
+ new Uint8Array(message.data as ArrayBuffer),
180
+ wsContext.raw,
181
+ );
182
+ },
183
+ onClose: (event, wsContext: WSContext<WebSocket>) => {
184
+ if (!wsContext.raw) {
185
+ return;
186
+ }
187
+ this.#removeSocket(wsContext.raw);
188
+ },
189
+ };
190
+ }
191
+
192
+ send(conn: WebSocket, m: Uint8Array) {
193
+ if (
194
+ conn.readyState !== WebSocket.CONNECTING &&
195
+ conn.readyState !== WebSocket.OPEN
196
+ ) {
197
+ this.#terminate(conn);
198
+ }
199
+ conn.send(m);
200
+ }
201
+
202
+ receiveMessage(messageBytes: Uint8Array, conn: WebSocket) {
203
+ try {
204
+ const socketContext = this.sockets.get(conn);
205
+ if (!socketContext) {
206
+ return;
207
+ }
208
+
209
+ const room = socketContext.room;
210
+
211
+ const encoder = encoding.createEncoder();
212
+ const decoder = decoding.createDecoder(messageBytes);
213
+ const type = decoding.readVarUint(decoder);
214
+ switch (type) {
215
+ case messageType.sync:
216
+ encoding.writeVarUint(encoder, messageType.sync);
217
+ syncProtocol.readSyncMessage(decoder, encoder, room.doc, conn);
218
+
219
+ // If the `encoder` only contains the type of reply message and no
220
+ // message, there is no need to send the message. When `encoder` only
221
+ // contains the type of reply, its length is 1.
222
+ if (encoding.length(encoder) > 1) {
223
+ this.send(conn, encoding.toUint8Array(encoder));
224
+ }
225
+ break;
226
+ case messageType.awareness: {
227
+ awarenessProtocol.applyAwarenessUpdate(
228
+ room.awareness,
229
+ decoding.readVarUint8Array(decoder),
230
+ conn,
231
+ );
232
+ break;
233
+ }
234
+ }
235
+ } catch (err) {
236
+ console.error(err);
237
+ // room.doc.emit('error', [err]);
238
+ }
239
+ }
240
+
241
+ #terminate(socket: WebSocket) {
242
+ this.#removeSocket(socket);
243
+ socket.close();
244
+ }
245
+
246
+ #removeSocket(conn: WebSocket) {
247
+ const socketContext = this.sockets.get(conn);
248
+ if (socketContext) {
249
+ const room = socketContext.room;
250
+ room.socketContexts.delete(socketContext.socket);
251
+ awarenessProtocol.removeAwarenessStates(
252
+ room.awareness,
253
+ Array.from(socketContext.controlledIds),
254
+ null,
255
+ );
256
+
257
+ if (room.socketContexts.size === 0) {
258
+ // TODO save to persistence
259
+ // TODO Destroy room
260
+ }
261
+ this.sockets.delete(conn);
262
+ }
263
+ }
264
+ }
@@ -0,0 +1,73 @@
1
+ import type { Context } from './context.js'
2
+ import type { Env, ErrorHandler, Next, NotFoundHandler } from './types.js'
3
+
4
+ /**
5
+ * Compose middleware functions into a single function based on `koa-compose` package.
6
+ *
7
+ * @template E - The environment type.
8
+ *
9
+ * @param {[[Function, unknown], unknown][] | [[Function]][]} middleware - An array of middleware functions and their corresponding parameters.
10
+ * @param {ErrorHandler<E>} [onError] - An optional error handler function.
11
+ * @param {NotFoundHandler<E>} [onNotFound] - An optional not-found handler function.
12
+ *
13
+ * @returns {(context: Context, next?: Next) => Promise<Context>} - A composed middleware function.
14
+ */
15
+ export const compose = <E extends Env = Env>(
16
+ middleware: [[Function, unknown], unknown][] | [[Function]][],
17
+ onError?: ErrorHandler<E>,
18
+ onNotFound?: NotFoundHandler<E>
19
+ ): ((context: Context, next?: Next) => Promise<Context>) => {
20
+ return (context, next) => {
21
+ let index = -1
22
+
23
+ return dispatch(0)
24
+
25
+ /**
26
+ * Dispatch the middleware functions.
27
+ *
28
+ * @param {number} i - The current index in the middleware array.
29
+ *
30
+ * @returns {Promise<Context>} - A promise that resolves to the context.
31
+ */
32
+ async function dispatch(i: number): Promise<Context> {
33
+ if (i <= index) {
34
+ throw new Error('next() called multiple times')
35
+ }
36
+ index = i
37
+
38
+ let res
39
+ let isError = false
40
+ let handler
41
+
42
+ if (middleware[i]) {
43
+ handler = middleware[i][0][0]
44
+ context.req.routeIndex = i
45
+ } else {
46
+ handler = (i === middleware.length && next) || undefined
47
+ }
48
+
49
+ if (handler) {
50
+ try {
51
+ res = await handler(context, () => dispatch(i + 1))
52
+ } catch (err) {
53
+ if (err instanceof Error && onError) {
54
+ context.error = err
55
+ res = await onError(err, context)
56
+ isError = true
57
+ } else {
58
+ throw err
59
+ }
60
+ }
61
+ } else {
62
+ if (context.finalized === false && onNotFound) {
63
+ res = await onNotFound(context)
64
+ }
65
+ }
66
+
67
+ if (res && (context.finalized === false || isError)) {
68
+ context.res = res
69
+ }
70
+ return context
71
+ }
72
+ }
73
+ }