@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.
- package/esm/HonoYjsMemAdapter.d.ts +41 -0
- package/esm/HonoYjsMemAdapter.d.ts.map +1 -0
- package/esm/HonoYjsMemAdapter.js +204 -0
- package/esm/HonoYjsMemAdapter.js.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/compose.d.ts +15 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/compose.d.ts.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/compose.js +65 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/compose.js.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/context.d.ts +452 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/context.d.ts.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/context.js +411 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/context.js.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.d.ts +70 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.d.ts.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.js +63 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.js.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.d.ts +221 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.d.ts.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.js +392 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.js.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.d.ts +60 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.d.ts.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.js +62 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.js.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.d.ts +2 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.d.ts.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.js +2 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.js.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request.d.ts +314 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request.d.ts.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request.js +328 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/request.js.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/router.d.ts +98 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/router.d.ts.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/router.js +26 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/router.js.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/types.d.ts +574 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/types.d.ts.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/types.js +12 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/types.js.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.d.ts +80 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.d.ts.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.js +112 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.js.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.d.ts +5 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.d.ts.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.js +5 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.js.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.d.ts +9 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.d.ts.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.js +6 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.js.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.d.ts +45 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.d.ts.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.js +123 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.js.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.d.ts +33 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.d.ts.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.js +6 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.js.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.d.ts +71 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.d.ts.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.js +84 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.js.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.d.ts +75 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.d.ts.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.js +6 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.js.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.d.ts +30 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.d.ts.map +1 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.js +256 -0
- package/esm/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.js.map +1 -0
- package/esm/mod.d.ts +5 -0
- package/esm/mod.d.ts.map +1 -0
- package/esm/mod.js +2 -0
- package/esm/mod.js.map +1 -0
- package/esm/package.json +3 -0
- package/package.json +5 -2
- package/src/HonoYjsMemAdapter.ts +264 -0
- package/src/deps/jsr.io/@hono/hono/4.11.3/src/compose.ts +73 -0
- package/src/deps/jsr.io/@hono/hono/4.11.3/src/context.ts +770 -0
- package/src/deps/jsr.io/@hono/hono/4.11.3/src/helper/websocket/index.ts +140 -0
- package/src/deps/jsr.io/@hono/hono/4.11.3/src/hono-base.ts +539 -0
- package/src/deps/jsr.io/@hono/hono/4.11.3/src/http-exception.ts +78 -0
- package/src/deps/jsr.io/@hono/hono/4.11.3/src/request/constants.ts +1 -0
- package/src/deps/jsr.io/@hono/hono/4.11.3/src/request.ts +487 -0
- package/src/deps/jsr.io/@hono/hono/4.11.3/src/router.ts +103 -0
- package/src/deps/jsr.io/@hono/hono/4.11.3/src/types.ts +2489 -0
- package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/body.ts +229 -0
- package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/constants.ts +4 -0
- package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/headers.ts +333 -0
- package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/html.ts +182 -0
- package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/http-status.ts +72 -0
- package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/mime.ts +96 -0
- package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/types.ts +116 -0
- package/src/deps/jsr.io/@hono/hono/4.11.3/src/utils/url.ts +310 -0
- 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
package/esm/mod.d.ts.map
ADDED
|
@@ -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
package/esm/mod.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":""}
|
package/esm/package.json
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kerebron/extension-server-hono",
|
|
3
|
-
"version": "0.4.
|
|
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
|
+
}
|