typeferry 0.12.0 → 0.13.0
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/README.md +5 -0
- package/dist/application/config.d.ts +47 -39
- package/dist/application/config.js +29 -16
- package/dist/application/config.js.map +1 -1
- package/dist/application/native-simulator-settings.js +1 -1
- package/dist/application/native-simulator-settings.js.map +1 -1
- package/dist/application/proxy.d.ts +5 -1
- package/dist/application/proxy.js +25 -4
- package/dist/application/proxy.js.map +1 -1
- package/dist/application/run-tests.js +1 -1
- package/dist/application/run-tests.js.map +1 -1
- package/dist/auth/client/native-session.js +4 -2
- package/dist/auth/client/native-session.js.map +1 -1
- package/dist/auth/client/oauth/use-google-login.js +2 -0
- package/dist/auth/client/oauth/use-google-login.js.map +1 -1
- package/dist/auth/server/cookie-utils.js +4 -3
- package/dist/auth/server/cookie-utils.js.map +1 -1
- package/dist/auth/server/device-info.js +8 -8
- package/dist/auth/server/device-info.js.map +1 -1
- package/dist/auth/server/oauth/google.js +11 -7
- package/dist/auth/server/oauth/google.js.map +1 -1
- package/dist/auth/server/session-manager.js +2 -2
- package/dist/auth/server/session-manager.js.map +1 -1
- package/dist/client/client-channel.d.ts +3 -11
- package/dist/client/client-channel.js +11 -4
- package/dist/client/client-channel.js.map +1 -1
- package/dist/client/client-http.d.ts +2 -2
- package/dist/client/client-http.js.map +1 -1
- package/dist/client/client.d.ts +13 -13
- package/dist/client/client.js +24 -11
- package/dist/client/client.js.map +1 -1
- package/dist/client/context-manager.d.ts +1 -1
- package/dist/client/logger.d.ts +1 -0
- package/dist/client/logger.js +12 -15
- package/dist/client/logger.js.map +1 -1
- package/dist/ejson/adjust-types-from-json-value.d.ts +1 -1
- package/dist/ejson/adjust-types-from-json-value.js +4 -2
- package/dist/ejson/adjust-types-from-json-value.js.map +1 -1
- package/dist/ejson/base64.d.ts +1 -1
- package/dist/ejson/base64.js +1 -1
- package/dist/ejson/base64.js.map +1 -1
- package/dist/ejson/built-in-converters.d.ts +59 -1
- package/dist/ejson/built-in-converters.js +109 -125
- package/dist/ejson/built-in-converters.js.map +1 -1
- package/dist/ejson/clone.js +1 -1
- package/dist/ejson/clone.js.map +1 -1
- package/dist/ejson/custom-models.d.ts +10 -10
- package/dist/ejson/custom-models.js +22 -2
- package/dist/ejson/custom-models.js.map +1 -1
- package/dist/ejson/custom-types.d.ts +2 -1
- package/dist/ejson/custom-types.js.map +1 -1
- package/dist/ejson/equals.d.ts +4 -1
- package/dist/ejson/equals.js +6 -3
- package/dist/ejson/equals.js.map +1 -1
- package/dist/ejson/from-json-value.d.ts +1 -1
- package/dist/ejson/from-json-value.js +1 -1
- package/dist/ejson/from-json-value.js.map +1 -1
- package/dist/ejson/helpers/adjust-types-to-json-value.d.ts +1 -1
- package/dist/ejson/helpers/adjust-types-to-json-value.js +4 -2
- package/dist/ejson/helpers/adjust-types-to-json-value.js.map +1 -1
- package/dist/ejson/helpers/from-json-value-helper.d.ts +1 -1
- package/dist/ejson/helpers/from-json-value-helper.js +5 -3
- package/dist/ejson/helpers/from-json-value-helper.js.map +1 -1
- package/dist/ejson/helpers/to-json-value-helper.d.ts +1 -1
- package/dist/ejson/helpers/to-json-value-helper.js +3 -1
- package/dist/ejson/helpers/to-json-value-helper.js.map +1 -1
- package/dist/ejson/index.d.ts +14 -12
- package/dist/ejson/index.js +3 -3
- package/dist/ejson/index.js.map +1 -1
- package/dist/ejson/is-binary.d.ts +1 -1
- package/dist/ejson/is-binary.js +1 -1
- package/dist/ejson/is-binary.js.map +1 -1
- package/dist/ejson/parse.d.ts +1 -1
- package/dist/ejson/parse.js +1 -1
- package/dist/ejson/parse.js.map +1 -1
- package/dist/ejson/stable-stringify.d.ts +1 -6
- package/dist/ejson/stable-stringify.js +3 -1
- package/dist/ejson/stable-stringify.js.map +1 -1
- package/dist/ejson/to-json-value.d.ts +1 -1
- package/dist/ejson/to-json-value.js +1 -1
- package/dist/ejson/to-json-value.js.map +1 -1
- package/dist/ejson/utils.d.ts +15 -13
- package/dist/ejson/utils.js +39 -37
- package/dist/ejson/utils.js.map +1 -1
- package/dist/minimongo/NOTICE.md +30 -0
- package/dist/minimongo/README.md +329 -0
- package/dist/minimongo/components.d.ts +31 -0
- package/dist/minimongo/components.js +53 -0
- package/dist/minimongo/components.js.map +1 -0
- package/dist/minimongo/contracts.type-test.d.ts +1 -0
- package/dist/minimongo/contracts.type-test.js +21 -0
- package/dist/minimongo/contracts.type-test.js.map +1 -0
- package/dist/minimongo/cursor.d.ts +67 -0
- package/dist/minimongo/cursor.js +157 -0
- package/dist/minimongo/cursor.js.map +1 -0
- package/dist/minimongo/document-store.d.ts +31 -0
- package/dist/minimongo/document-store.js +48 -0
- package/dist/minimongo/document-store.js.map +1 -0
- package/dist/minimongo/errors.d.ts +14 -0
- package/dist/minimongo/errors.js +16 -0
- package/dist/minimongo/errors.js.map +1 -0
- package/dist/minimongo/events.d.ts +20 -0
- package/dist/minimongo/events.js +80 -0
- package/dist/minimongo/events.js.map +1 -0
- package/dist/minimongo/identity.d.ts +8 -0
- package/dist/minimongo/identity.js +15 -0
- package/dist/minimongo/identity.js.map +1 -0
- package/dist/minimongo/immutable.d.ts +6 -0
- package/dist/minimongo/immutable.js +17 -0
- package/dist/minimongo/immutable.js.map +1 -0
- package/dist/minimongo/index.d.ts +7 -0
- package/dist/minimongo/index.js +6 -0
- package/dist/minimongo/index.js.map +1 -0
- package/dist/minimongo/local-collection.d.ts +48 -0
- package/dist/minimongo/local-collection.js +129 -0
- package/dist/minimongo/local-collection.js.map +1 -0
- package/dist/minimongo/matcher.d.ts +27 -0
- package/dist/minimongo/matcher.js +457 -0
- package/dist/minimongo/matcher.js.map +1 -0
- package/dist/minimongo/modifier.d.ts +12 -0
- package/dist/minimongo/modifier.js +323 -0
- package/dist/minimongo/modifier.js.map +1 -0
- package/dist/minimongo/path.d.ts +17 -0
- package/dist/minimongo/path.js +126 -0
- package/dist/minimongo/path.js.map +1 -0
- package/dist/minimongo/projection.d.ts +5 -0
- package/dist/minimongo/projection.js +100 -0
- package/dist/minimongo/projection.js.map +1 -0
- package/dist/minimongo/sorter.d.ts +16 -0
- package/dist/minimongo/sorter.js +140 -0
- package/dist/minimongo/sorter.js.map +1 -0
- package/dist/minimongo/transform.d.ts +4 -0
- package/dist/minimongo/transform.js +30 -0
- package/dist/minimongo/transform.js.map +1 -0
- package/dist/minimongo/types.d.ts +169 -0
- package/dist/minimongo/types.js +2 -0
- package/dist/minimongo/types.js.map +1 -0
- package/dist/minimongo/value-semantics.d.ts +8 -0
- package/dist/minimongo/value-semantics.js +156 -0
- package/dist/minimongo/value-semantics.js.map +1 -0
- package/dist/mongodb/change-streams.js +14 -8
- package/dist/mongodb/change-streams.js.map +1 -1
- package/dist/mongodb/decorators/collection.js +4 -1
- package/dist/mongodb/decorators/collection.js.map +1 -1
- package/dist/mongodb/decorators/metadata.js +1 -1
- package/dist/mongodb/decorators/metadata.js.map +1 -1
- package/dist/mongodb/find-one-or-create.d.ts +2 -2
- package/dist/mongodb/find-one-or-create.js +1 -1
- package/dist/mongodb/find-one-or-create.js.map +1 -1
- package/dist/mongodb/live/engine.js.map +1 -1
- package/dist/mongodb/live/source.js +11 -5
- package/dist/mongodb/live/source.js.map +1 -1
- package/dist/mongodb/live/types.d.ts +1 -1
- package/dist/react/components/client-provider.d.ts +3 -2
- package/dist/react/components/client-provider.js +1 -1
- package/dist/react/components/client-provider.js.map +1 -1
- package/dist/react/contracts.type-test.d.ts +1 -0
- package/dist/react/contracts.type-test.js +21 -0
- package/dist/react/contracts.type-test.js.map +1 -0
- package/dist/react/hooks/use-auth.d.ts +5 -1
- package/dist/react/hooks/use-auth.js +4 -2
- package/dist/react/hooks/use-auth.js.map +1 -1
- package/dist/react/hooks/use-caller.d.ts +10 -5
- package/dist/react/hooks/use-caller.js +12 -8
- package/dist/react/hooks/use-caller.js.map +1 -1
- package/dist/react/hooks/use-channel.d.ts +1 -1
- package/dist/react/hooks/use-channel.js +1 -1
- package/dist/react/hooks/use-channel.js.map +1 -1
- package/dist/react/hooks/use-circuit-breaker.d.ts +14 -6
- package/dist/react/hooks/use-circuit-breaker.js +5 -2
- package/dist/react/hooks/use-circuit-breaker.js.map +1 -1
- package/dist/react/hooks/use-client.d.ts +1 -1
- package/dist/react/hooks/use-client.js +2 -0
- package/dist/react/hooks/use-client.js.map +1 -1
- package/dist/react/hooks/use-connection-state.d.ts +4 -4
- package/dist/react/hooks/use-connection-state.js +2 -0
- package/dist/react/hooks/use-connection-state.js.map +1 -1
- package/dist/react/hooks/use-deps-change.d.ts +1 -1
- package/dist/react/hooks/use-deps-change.js.map +1 -1
- package/dist/react/hooks/use-local-event.d.ts +2 -2
- package/dist/react/hooks/use-local-event.js +2 -2
- package/dist/react/hooks/use-local-event.js.map +1 -1
- package/dist/react/hooks/use-method-refresh.d.ts +24 -15
- package/dist/react/hooks/use-method-refresh.js +18 -22
- package/dist/react/hooks/use-method-refresh.js.map +1 -1
- package/dist/react/hooks/use-method.d.ts +12 -11
- package/dist/react/hooks/use-method.js +9 -5
- package/dist/react/hooks/use-method.js.map +1 -1
- package/dist/react/hooks/use-mongodb-live-publication.js +2 -0
- package/dist/react/hooks/use-mongodb-live-publication.js.map +1 -1
- package/dist/react/hooks/use-object.d.ts +2 -2
- package/dist/react/hooks/use-object.js.map +1 -1
- package/dist/react/hooks/use-subscribe.d.ts +1 -2
- package/dist/react/hooks/use-subscribe.js +11 -9
- package/dist/react/hooks/use-subscribe.js.map +1 -1
- package/dist/react/hooks/use-throttled-events.d.ts +1 -1
- package/dist/react/hooks/use-throttled-events.js +2 -0
- package/dist/react/hooks/use-throttled-events.js.map +1 -1
- package/dist/react/hooks/use-token-refresh.js +1 -1
- package/dist/react/hooks/use-token-refresh.js.map +1 -1
- package/dist/server/client-node.d.ts +17 -10
- package/dist/server/client-node.js +16 -13
- package/dist/server/client-node.js.map +1 -1
- package/dist/server/decorators/register.js +10 -6
- package/dist/server/decorators/register.js.map +1 -1
- package/dist/server/method.d.ts +1 -1
- package/dist/server/method.js +9 -6
- package/dist/server/method.js.map +1 -1
- package/dist/server/methods.js +2 -1
- package/dist/server/methods.js.map +1 -1
- package/dist/server/server-channel.d.ts +4 -2
- package/dist/server/server-channel.js +33 -20
- package/dist/server/server-channel.js.map +1 -1
- package/dist/server/server.d.ts +25 -12
- package/dist/server/server.js +18 -17
- package/dist/server/server.js.map +1 -1
- package/dist/server/transports/node-hono-transport.d.ts +4 -4
- package/dist/server/transports/node-hono-transport.js +66 -14
- package/dist/server/transports/node-hono-transport.js.map +1 -1
- package/dist/server/transports/redis-transport.d.ts +5 -4
- package/dist/server/transports/redis-transport.js +9 -4
- package/dist/server/transports/redis-transport.js.map +1 -1
- package/dist/server/transports/websocket-transport.d.ts +1 -1
- package/dist/server/transports/websocket-transport.js +6 -1
- package/dist/server/transports/websocket-transport.js.map +1 -1
- package/dist/server/transports/ws-shared.d.ts +2 -1
- package/dist/server/transports/ws-shared.js +4 -1
- package/dist/server/transports/ws-shared.js.map +1 -1
- package/dist/utils/errors.d.ts +1 -1
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/event-emitter.d.ts +1 -1
- package/dist/utils/event-emitter.js.map +1 -1
- package/dist/utils/events.d.ts +4 -4
- package/dist/utils/events.js.map +1 -1
- package/dist/utils/helpers.d.ts +4 -4
- package/dist/utils/helpers.js +4 -3
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/intercept.d.ts +1 -2
- package/dist/utils/intercept.js.map +1 -1
- package/dist/utils/iterator.d.ts +6 -8
- package/dist/utils/iterator.js +3 -3
- package/dist/utils/iterator.js.map +1 -1
- package/dist/utils/presentation.d.ts +1 -1
- package/dist/utils/presentation.js +2 -0
- package/dist/utils/presentation.js.map +1 -1
- package/dist/utils/promise.d.ts +5 -5
- package/dist/utils/promise.js +2 -2
- package/dist/utils/promise.js.map +1 -1
- package/package.json +9 -2
package/dist/server/methods.js
CHANGED
|
@@ -12,6 +12,7 @@ export function getRoomName(channel, eventName) {
|
|
|
12
12
|
export const rpcOff = (server, method) => new Method(server, method, function ({ events, channel = NO_CHANNEL }) {
|
|
13
13
|
if (!this.socket)
|
|
14
14
|
return {};
|
|
15
|
+
const socket = this.socket;
|
|
15
16
|
const rooms = server.webSocketTransport?.rooms;
|
|
16
17
|
if (!rooms)
|
|
17
18
|
return {};
|
|
@@ -22,7 +23,7 @@ export const rpcOff = (server, method) => new Method(server, method, function ({
|
|
|
22
23
|
return { ...acc, [eventName]: false };
|
|
23
24
|
}
|
|
24
25
|
const roomName = getRoomName(channel, eventName);
|
|
25
|
-
rooms.leave(
|
|
26
|
+
rooms.leave(socket, roomName);
|
|
26
27
|
return { ...acc, [eventName]: true };
|
|
27
28
|
}, {});
|
|
28
29
|
}, { protected: false });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"methods.js","sourceRoot":"","sources":["../../src/server/methods.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAEzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"methods.js","sourceRoot":"","sources":["../../src/server/methods.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,11 @@ import { Event } from './event.js';
|
|
|
5
5
|
import type { Server } from './server.js';
|
|
6
6
|
export declare class ServerChannel extends EventEmitter2 {
|
|
7
7
|
channelName: string;
|
|
8
|
-
|
|
8
|
+
private attachedServer;
|
|
9
9
|
constructor(channelName: string);
|
|
10
10
|
setServer(server: Server): void;
|
|
11
|
+
get server(): Server;
|
|
12
|
+
private requireServer;
|
|
11
13
|
/**
|
|
12
14
|
* Broadcasts a pre-encoded event payload to all subscribed clients.
|
|
13
15
|
* The payload already contains the wire protocol `t` field (set by
|
|
@@ -22,7 +24,7 @@ export declare class ServerChannel extends EventEmitter2 {
|
|
|
22
24
|
addEvent(name: string, opts?: EventOptions): void;
|
|
23
25
|
get list(): string[];
|
|
24
26
|
get length(): number;
|
|
25
|
-
get(event: string): Event;
|
|
27
|
+
get(event: string): Event | undefined;
|
|
26
28
|
has(event: string): boolean;
|
|
27
29
|
delete(event: string): boolean;
|
|
28
30
|
/**
|
|
@@ -10,25 +10,35 @@ const SystemEvents = [
|
|
|
10
10
|
];
|
|
11
11
|
export class ServerChannel extends EventEmitter2 {
|
|
12
12
|
channelName;
|
|
13
|
-
|
|
13
|
+
attachedServer;
|
|
14
14
|
constructor(channelName) {
|
|
15
15
|
super({
|
|
16
16
|
maxListeners: 1024,
|
|
17
17
|
});
|
|
18
18
|
this.channelName = channelName;
|
|
19
19
|
this.onAny((event, value) => {
|
|
20
|
-
if (
|
|
20
|
+
if (this.attachedServer &&
|
|
21
|
+
!this.attachedServer.events.has(event) &&
|
|
21
22
|
!SystemEvents.includes(event)) {
|
|
22
23
|
console.warn('Event Not Registered:', event);
|
|
23
24
|
}
|
|
24
|
-
if (this.
|
|
25
|
-
const eventObject = this.
|
|
26
|
-
eventObject
|
|
25
|
+
if (this.attachedServer?.events.has(event)) {
|
|
26
|
+
const eventObject = this.attachedServer.events.get(event);
|
|
27
|
+
eventObject?.handler(this, value);
|
|
27
28
|
}
|
|
28
29
|
});
|
|
29
30
|
}
|
|
30
31
|
setServer(server) {
|
|
31
|
-
this.
|
|
32
|
+
this.attachedServer = server;
|
|
33
|
+
}
|
|
34
|
+
get server() {
|
|
35
|
+
return this.requireServer();
|
|
36
|
+
}
|
|
37
|
+
requireServer() {
|
|
38
|
+
if (!this.attachedServer) {
|
|
39
|
+
throw new Error('Server channel is not attached to a server');
|
|
40
|
+
}
|
|
41
|
+
return this.attachedServer;
|
|
32
42
|
}
|
|
33
43
|
/**
|
|
34
44
|
* Broadcasts a pre-encoded event payload to all subscribed clients.
|
|
@@ -37,20 +47,21 @@ export class ServerChannel extends EventEmitter2 {
|
|
|
37
47
|
* @param excludeUuid - Optional client uuid to exclude from receiving the event
|
|
38
48
|
*/
|
|
39
49
|
propagate(event, payload, excludeUuid) {
|
|
40
|
-
const
|
|
50
|
+
const server = this.requireServer();
|
|
51
|
+
const eventObject = server.events.get(event);
|
|
41
52
|
if (!eventObject) {
|
|
42
53
|
console.log('Event Not Registered:', event);
|
|
43
54
|
return;
|
|
44
55
|
}
|
|
45
|
-
const transport =
|
|
56
|
+
const transport = server.webSocketTransport;
|
|
46
57
|
if (!transport) {
|
|
47
58
|
console.warn('[TypeFerry] WebSocket transport not available for propagate');
|
|
48
59
|
return;
|
|
49
60
|
}
|
|
50
61
|
const roomName = getRoomName(this.channelName, event);
|
|
51
62
|
if (excludeUuid) {
|
|
52
|
-
const excludeClient =
|
|
53
|
-
transport.rooms.broadcast(roomName, payload, excludeClient?.socket);
|
|
63
|
+
const excludeClient = server.allClients.get(excludeUuid);
|
|
64
|
+
transport.rooms.broadcast(roomName, payload, excludeClient?.socket ?? undefined);
|
|
54
65
|
}
|
|
55
66
|
else {
|
|
56
67
|
transport.rooms.broadcast(roomName, payload);
|
|
@@ -67,26 +78,27 @@ export class ServerChannel extends EventEmitter2 {
|
|
|
67
78
|
}
|
|
68
79
|
/** Declares a new event. */
|
|
69
80
|
addEvent(name, opts) {
|
|
70
|
-
|
|
71
|
-
|
|
81
|
+
const server = this.requireServer();
|
|
82
|
+
if (server.events.has(name)) {
|
|
83
|
+
server.events.delete(name);
|
|
72
84
|
}
|
|
73
|
-
const event = new Event(name,
|
|
74
|
-
|
|
85
|
+
const event = new Event(name, server, this, opts);
|
|
86
|
+
server.events.set(name, event);
|
|
75
87
|
}
|
|
76
88
|
get list() {
|
|
77
|
-
return Array.from(this.
|
|
89
|
+
return Array.from(this.requireServer().events.keys());
|
|
78
90
|
}
|
|
79
91
|
get length() {
|
|
80
|
-
return this.
|
|
92
|
+
return this.requireServer().events.size;
|
|
81
93
|
}
|
|
82
94
|
get(event) {
|
|
83
|
-
return this.
|
|
95
|
+
return this.requireServer().events.get(event);
|
|
84
96
|
}
|
|
85
97
|
has(event) {
|
|
86
|
-
return this.
|
|
98
|
+
return this.requireServer().events.has(event);
|
|
87
99
|
}
|
|
88
100
|
delete(event) {
|
|
89
|
-
return this.
|
|
101
|
+
return this.requireServer().events.delete(event);
|
|
90
102
|
}
|
|
91
103
|
/**
|
|
92
104
|
* Checks if a client is subscribed to an event via the RoomRegistry.
|
|
@@ -94,7 +106,8 @@ export class ServerChannel extends EventEmitter2 {
|
|
|
94
106
|
isSubscribed(client, event) {
|
|
95
107
|
if (!client.socket)
|
|
96
108
|
return false;
|
|
97
|
-
const
|
|
109
|
+
const server = this.requireServer();
|
|
110
|
+
const rooms = server.webSocketTransport?.rooms;
|
|
98
111
|
if (!rooms)
|
|
99
112
|
return false;
|
|
100
113
|
const roomName = getRoomName(this.channelName, event.name);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-channel.js","sourceRoot":"","sources":["../../src/server/server-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACxD,OAAO,aAAa,MAAM,wBAAwB,CAAA;AAGlD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAEvC,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AAE5E,MAAM,YAAY,GAAa;IAC7B,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC;IACrC,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;IAC9B,GAAG,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC;CAC3C,CAAA;AAED,MAAM,OAAO,aAAc,SAAQ,aAAa;IAC9C,WAAW,CAAQ;
|
|
1
|
+
{"version":3,"file":"server-channel.js","sourceRoot":"","sources":["../../src/server/server-channel.ts"],"names":[],"mappings":"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"}
|
package/dist/server/server.d.ts
CHANGED
|
@@ -4,24 +4,25 @@ import type { RedisClientOptions } from 'redis';
|
|
|
4
4
|
import type { z } from 'zod';
|
|
5
5
|
import type { MethodParams as MethodParameters, ServerMethods } from '../utils/index.js';
|
|
6
6
|
import { ClientNode } from './client-node.js';
|
|
7
|
+
import type { ClientNodeContext } from './client-node.js';
|
|
7
8
|
import type { Event } from './event.js';
|
|
8
9
|
import type { MethodFunction, MethodOptions } from './method.js';
|
|
9
10
|
import { Method } from './method.js';
|
|
10
11
|
import { ServerChannel } from './server-channel.js';
|
|
11
12
|
import { NodeHonoTransport, RedisTransport, WebSocketTransport } from './transports/index.js';
|
|
12
13
|
declare global {
|
|
13
|
-
var TypeFerry: Server;
|
|
14
|
+
var TypeFerry: Server | undefined;
|
|
14
15
|
}
|
|
15
16
|
export type ChannelChecker = (node: ClientNode, channel: string) => Promise<boolean>;
|
|
16
|
-
export type AuthFunction = (this: ClientNode, context:
|
|
17
|
+
export type AuthFunction = (this: ClientNode, context: ClientNodeContext) => ClientNodeContext | false | null | undefined | Promise<ClientNodeContext | false | null | undefined>;
|
|
17
18
|
/**
|
|
18
19
|
* Configuration for server authentication.
|
|
19
20
|
*/
|
|
20
|
-
export type AuthSetup = {
|
|
21
|
+
export type AuthSetup<TParameters = unknown, TResult = unknown> = {
|
|
21
22
|
/** Authentication function called to validate tokens */
|
|
22
23
|
auth: AuthFunction;
|
|
23
24
|
/** Login method handler */
|
|
24
|
-
logIn: MethodFunction
|
|
25
|
+
logIn: MethodFunction<TParameters, TResult>;
|
|
25
26
|
};
|
|
26
27
|
export type RateLimit = boolean | {
|
|
27
28
|
max: number;
|
|
@@ -29,6 +30,14 @@ export type RateLimit = boolean | {
|
|
|
29
30
|
};
|
|
30
31
|
/** Default request-body ceiling retained across the runtime migration. */
|
|
31
32
|
export declare const DEFAULT_MAX_REQUEST_BODY_SIZE_BYTES: number;
|
|
33
|
+
/**
|
|
34
|
+
* A segment-scoped HTTP body ceiling selected before any body buffering.
|
|
35
|
+
* Matching rules only lower the global ceiling; overlapping rules use the minimum.
|
|
36
|
+
*/
|
|
37
|
+
export interface RequestBodySizeLimit {
|
|
38
|
+
readonly pathPrefix: string;
|
|
39
|
+
readonly maxSize: number;
|
|
40
|
+
}
|
|
32
41
|
export type ServerOptions = {
|
|
33
42
|
host?: string;
|
|
34
43
|
port?: number;
|
|
@@ -47,6 +56,11 @@ export type ServerOptions = {
|
|
|
47
56
|
rateLimit?: RateLimit;
|
|
48
57
|
/** Maximum request body accepted by the HTTP listener. */
|
|
49
58
|
maxRequestBodySize?: number;
|
|
59
|
+
/**
|
|
60
|
+
* Additional route ceilings evaluated by the first HTTP middleware, including
|
|
61
|
+
* requests without Content-Length. Prefixes match complete path segments.
|
|
62
|
+
*/
|
|
63
|
+
requestBodySizeLimits?: readonly RequestBodySizeLimit[];
|
|
50
64
|
shouldAllowChannelSubscribe?: ChannelChecker;
|
|
51
65
|
};
|
|
52
66
|
export type ProxyMethodCreation = {
|
|
@@ -56,17 +70,17 @@ export declare class Server<Methods extends ServerMethods = ServerMethods> exten
|
|
|
56
70
|
uuid: string;
|
|
57
71
|
httpTransport: NodeHonoTransport;
|
|
58
72
|
webSocketTransport: WebSocketTransport;
|
|
59
|
-
redisTransport: RedisTransport;
|
|
73
|
+
redisTransport: RedisTransport | null;
|
|
60
74
|
host: string;
|
|
61
75
|
port: number;
|
|
62
|
-
requestListener: RequestListener;
|
|
76
|
+
requestListener: RequestListener | undefined;
|
|
63
77
|
allowedContextKeys: string[];
|
|
64
78
|
isAuthEnabled: boolean;
|
|
65
|
-
auth: AuthFunction;
|
|
79
|
+
auth: AuthFunction | undefined;
|
|
66
80
|
debug: boolean;
|
|
67
81
|
rateLimit: RateLimit;
|
|
68
82
|
maxRequestBodySize: number;
|
|
69
|
-
methods: Map<string, Method<
|
|
83
|
+
methods: Map<string, Method<z.ZodType, unknown>>;
|
|
70
84
|
allClients: Map<string, ClientNode>;
|
|
71
85
|
/** Reverse index: userId → connected client nodes for efficient user-level operations */
|
|
72
86
|
private clientsByUserId;
|
|
@@ -80,9 +94,8 @@ export declare class Server<Methods extends ServerMethods = ServerMethods> exten
|
|
|
80
94
|
handlers: Methods;
|
|
81
95
|
private closePromise?;
|
|
82
96
|
private initializeGlobalInstance;
|
|
83
|
-
private initializeTransports;
|
|
84
97
|
private setupHttpListening;
|
|
85
|
-
constructor({ host, port, debug, origins, ws, redis, requestListener, globalInstance, allowedContextKeys, rateLimit, maxRequestBodySize, }?: ServerOptions);
|
|
98
|
+
constructor({ host, port, debug, origins, ws, redis, requestListener, globalInstance, allowedContextKeys, rateLimit, maxRequestBodySize, requestBodySizeLimits, }?: ServerOptions);
|
|
86
99
|
/**
|
|
87
100
|
* Resolves when startup transports have emitted their readiness signals.
|
|
88
101
|
*
|
|
@@ -94,7 +107,7 @@ export declare class Server<Methods extends ServerMethods = ServerMethods> exten
|
|
|
94
107
|
* Returns the authoritative Hono application for route registration.
|
|
95
108
|
*/
|
|
96
109
|
get app(): Hono;
|
|
97
|
-
setAuth({ auth, logIn }: AuthSetup): void;
|
|
110
|
+
setAuth<TParameters, TResult>({ auth, logIn }: AuthSetup<TParameters, TResult>): void;
|
|
98
111
|
setChannelAuthorization(checker: ChannelChecker): void;
|
|
99
112
|
close(): Promise<boolean>;
|
|
100
113
|
private closeTransports;
|
|
@@ -102,7 +115,7 @@ export declare class Server<Methods extends ServerMethods = ServerMethods> exten
|
|
|
102
115
|
debugger(...args: any[]): void;
|
|
103
116
|
call<T = Record<string, unknown>>(method: string, parameters?: MethodParameters<T>): Promise<unknown>;
|
|
104
117
|
createDefaultMethods(): void;
|
|
105
|
-
getMethod(method: string): Method<
|
|
118
|
+
getMethod(method: string): Method<z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>, unknown> | undefined;
|
|
106
119
|
addClient(node: ClientNode): void;
|
|
107
120
|
deleteClient(node: ClientNode): void;
|
|
108
121
|
/** Registers a client node in the userId reverse index */
|
package/dist/server/server.js
CHANGED
|
@@ -43,20 +43,15 @@ export class Server extends ServerChannel {
|
|
|
43
43
|
global.TypeFerry = this;
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
-
initializeTransports(origins, ws, redis) {
|
|
47
|
-
this.httpTransport = new NodeHonoTransport(this, origins, this.rateLimit, this.maxRequestBodySize);
|
|
48
|
-
this.webSocketTransport = new WebSocketTransport(this, origins, ws);
|
|
49
|
-
this.redisTransport = redis ? new RedisTransport(this, redis) : null;
|
|
50
|
-
}
|
|
51
46
|
setupHttpListening() {
|
|
52
47
|
this.httpTransport.http?.on('error', error => {
|
|
53
48
|
this.emit(Server.ERROR_EVENT, error);
|
|
54
49
|
});
|
|
55
50
|
this.httpTransport.listen(() => {
|
|
56
|
-
setTimeout(() => this.
|
|
51
|
+
setTimeout(() => this.emit(ServerEvents.HTTP_LISTENING), 0);
|
|
57
52
|
});
|
|
58
53
|
}
|
|
59
|
-
constructor({ host = 'localhost', port = 80, debug = false, origins, ws, redis, requestListener, globalInstance = true, allowedContextKeys = [], rateLimit = false, maxRequestBodySize = DEFAULT_MAX_REQUEST_BODY_SIZE_BYTES, } = {}) {
|
|
54
|
+
constructor({ host = 'localhost', port = 80, debug = false, origins, ws, redis, requestListener, globalInstance = true, allowedContextKeys = [], rateLimit = false, maxRequestBodySize = DEFAULT_MAX_REQUEST_BODY_SIZE_BYTES, requestBodySizeLimits = [], } = {}) {
|
|
60
55
|
super(NO_CHANNEL);
|
|
61
56
|
this.m = createMethodProxy(this);
|
|
62
57
|
this.setServer(this);
|
|
@@ -72,14 +67,16 @@ export class Server extends ServerChannel {
|
|
|
72
67
|
this.rateLimit = rateLimit;
|
|
73
68
|
this.maxRequestBodySize = maxRequestBodySize;
|
|
74
69
|
this.allowedContextKeys = allowedContextKeys;
|
|
75
|
-
this.
|
|
70
|
+
this.httpTransport = new NodeHonoTransport(this, origins, this.rateLimit, this.maxRequestBodySize, requestBodySizeLimits);
|
|
71
|
+
this.webSocketTransport = new WebSocketTransport(this, origins, ws);
|
|
72
|
+
this.redisTransport = redis ? new RedisTransport(this, redis) : null;
|
|
76
73
|
this.setupHttpListening();
|
|
77
74
|
this.addEvent(TypeFerryEvents.METHOD_REFRESH);
|
|
78
75
|
this.channels.set(NO_CHANNEL, this);
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
76
|
+
const readinessEvents = [ServerEvents.HTTP_LISTENING];
|
|
77
|
+
if (this.redisTransport)
|
|
78
|
+
readinessEvents.push(ServerEvents.REDIS_CONNECT);
|
|
79
|
+
waitForAll(this, readinessEvents)
|
|
83
80
|
.then(() => {
|
|
84
81
|
this.ready = true;
|
|
85
82
|
this.emit(ServerEvents.READY, true);
|
|
@@ -130,7 +127,7 @@ export class Server extends ServerChannel {
|
|
|
130
127
|
await this.redisTransport?.close();
|
|
131
128
|
await this.webSocketTransport?.close();
|
|
132
129
|
await this.httpTransport?.close();
|
|
133
|
-
|
|
130
|
+
Reflect.deleteProperty(global, 'TypeFerry');
|
|
134
131
|
this.emit(ServerEvents.CLOSED);
|
|
135
132
|
return true;
|
|
136
133
|
}
|
|
@@ -144,6 +141,9 @@ export class Server extends ServerChannel {
|
|
|
144
141
|
async call(method, parameters) {
|
|
145
142
|
this.debugger(`[server] Calling ${method}`, parameters);
|
|
146
143
|
const methodInstance = this.methods.get(method);
|
|
144
|
+
if (!methodInstance) {
|
|
145
|
+
throw new Error(`Method not found: ${method}`);
|
|
146
|
+
}
|
|
147
147
|
const node = new ClientNode(this);
|
|
148
148
|
node.isServer = true;
|
|
149
149
|
return await methodInstance.exec(parameters, node);
|
|
@@ -214,7 +214,7 @@ export class Server extends ServerChannel {
|
|
|
214
214
|
this.emit(ServerEvents.USER_DISCONNECTED, { userId, count });
|
|
215
215
|
return count;
|
|
216
216
|
}
|
|
217
|
-
addMethod(method, fn, opts) {
|
|
217
|
+
addMethod(method, fn, opts = {}) {
|
|
218
218
|
this.methods.set(method, new Method(this, method, fn, opts));
|
|
219
219
|
}
|
|
220
220
|
channel(name = NO_CHANNEL) {
|
|
@@ -229,10 +229,11 @@ export class Server extends ServerChannel {
|
|
|
229
229
|
if (name === NO_CHANNEL)
|
|
230
230
|
return this;
|
|
231
231
|
const channelName = name;
|
|
232
|
-
|
|
233
|
-
|
|
232
|
+
const existingChannel = this.channels.get(channelName);
|
|
233
|
+
if (existingChannel)
|
|
234
|
+
return existingChannel;
|
|
234
235
|
const channel = new ServerChannel(channelName);
|
|
235
|
-
channel.setServer(this
|
|
236
|
+
channel.setServer(this);
|
|
236
237
|
this.channels.set(channelName, channel);
|
|
237
238
|
return channel;
|
|
238
239
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAQhC,OAAO,EACL,eAAe,EACf,OAAO,EACP,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,GACX,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAQhC,OAAO,EACL,eAAe,EACf,OAAO,EACP,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,GACX,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAGlD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,kBAAkB,GACnB,MAAM,cAAc,CAAA;AAsCrB,0EAA0E;AAC1E,MAAM,CAAC,MAAM,mCAAmC,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAA;AAyCpE,MAAM,OAAO,MAEX,SAAQ,aAAa;IACrB,IAAI,CAAQ;IACZ,aAAa,CAAmB;IAChC,kBAAkB,CAAoB;IACtC,cAAc,CAAuB;IACrC,IAAI,GAAG,WAAW,CAAA;IAClB,IAAI,CAAQ;IACZ,eAAe,CAA6B;IAC5C,kBAAkB,CAAU;IAC5B,aAAa,GAAG,KAAK,CAAA;IACrB,IAAI,CAA0B;IAC9B,KAAK,GAAG,KAAK,CAAA;IACb,SAAS,CAAW;IACpB,kBAAkB,CAAQ;IAE1B,OAAO,GAA4C,IAAI,GAAG,EAAE,CAAA;IAC5D,UAAU,GAA4B,IAAI,GAAG,EAAE,CAAA;IAC/C,yFAAyF;IACjF,eAAe,GAAiC,IAAI,GAAG,EAAE,CAAA;IACjE,QAAQ,GAA+B,IAAI,GAAG,EAAE,CAAA;IAChD,MAAM,GAAuB,IAAI,GAAG,EAAE,CAAA;IAEtC,CAAC,CAAqB;IAEtB,iBAAiB,GAAG,IAAI,CAAA;IAExB,KAAK,GAAG,KAAK,CAAA;IAEb,2BAA2B,GAAmB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAA;IAE9D,MAAM,CAAC,WAAW,GAAG,OAAO,CAAA;IAErB,QAAQ,GAAY,EAAa,CAAA;IAEhC,YAAY,CAAmB;IAE/B,wBAAwB,CAAC,cAAuB;QACtD,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;YACjE,CAAC;YACD,MAAM,CAAC,SAAS,GAAG,IAAI,CAAA;QACzB,CAAC;IACH,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;YAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;QACtC,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE;YAC7B,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAA;QAC7D,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,YAAY,EACV,IAAI,GAAG,WAAW,EAClB,IAAI,GAAG,EAAE,EACT,KAAK,GAAG,KAAK,EACb,OAAO,EACP,EAAE,EACF,KAAK,EACL,eAAe,EACf,cAAc,GAAG,IAAI,EACrB,kBAAkB,GAAG,EAAE,EACvB,SAAS,GAAG,KAAK,EACjB,kBAAkB,GAAG,mCAAmC,EACxD,qBAAqB,GAAG,EAAE,MACT,EAAE;QACnB,KAAK,CAAC,UAAU,CAAC,CAAA;QAEjB,IAAI,CAAC,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;QAChC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACpB,IAAI,CAAC,oBAAoB,EAAE,CAAA;QAE3B,IAAI,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAA;QAE7C,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;QAC/B,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,EAAE,cAAc,CAAC,CAAA;QAE9D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QACxB,IAAI,CAAC,eAAe,GAAG,eAAe,CAAA;QACtC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,CAAA;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAA;QAC5C,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAA;QAE5C,IAAI,CAAC,aAAa,GAAG,IAAI,iBAAiB,CACxC,IAAI,EACJ,OAAO,EACP,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,kBAAkB,EACvB,qBAAqB,CACtB,CAAA;QACD,IAAI,CAAC,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;QACnE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACpE,IAAI,CAAC,kBAAkB,EAAE,CAAA;QAEzB,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,CAAC,CAAA;QAC7C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QAEnC,MAAM,eAAe,GAAG,CAAC,YAAY,CAAC,cAAc,CAAC,CAAA;QACrD,IAAI,IAAI,CAAC,cAAc;YAAE,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;QAEzE,UAAU,CAAC,IAAI,EAAE,eAAe,CAAC;aAC9B,IAAI,CAAC,GAAG,EAAE;YACT,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;YACjB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QACrC,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAY,EAAE,EAAE;YACtB,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;QACvE,CAAC,CAAC,CAAA;IACN,CAAC;IAED;;;;;OAKG;IACH,OAAO;QACL,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAC3B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,CAAA;gBACb,OAAM;YACR,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAA;IAC/B,CAAC;IAED,OAAO,CAAuB,EAAE,IAAI,EAAE,KAAK,EAAmC;QAC5E,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAC1C,CAAC;IAED,uBAAuB,CAAC,OAAuB;QAC7C,IAAI,CAAC,2BAA2B,GAAG,OAAO,CAAA;IAC5C,CAAC;IAED,KAAK;QACH,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,eAAe,EAAE,CAAA;QAC5C,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;QAC7C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;QACvB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAA;QAC5B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QACpB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;QAErB,MAAM,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,CAAA;QAClC,MAAM,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,CAAA;QACtC,MAAM,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,CAAA;QAEjC,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QAE3C,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QAE9B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,QAAiB;QACpC,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAClD,CAAC;IAED,QAAQ,CAAC,GAAG,IAAW;QACrB,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,IAAI,CACR,MAAc,EACd,UAAgC;QAEhC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,MAAM,EAAE,EAAE,UAAU,CAAC,CAAA;QAEvD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAE/C,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAA;QAChD,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAA;QAEjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QAEpB,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IACpD,CAAC;IAED,oBAAoB;QAClB,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CACtD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CACxC,CAAA;IACH,CAAC;IAED,SAAS,CAAC,MAAc;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC;IAED,SAAS,CAAC,IAAgB;QACxB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACtC,CAAC;IAED,YAAY,CAAC,IAAgB;QAC3B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAA;QAEpC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,kBAAkB,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,mBAAmB,CAAC,IAAgB;QAClC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAM;QAExB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAClC,IAAI,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAE5C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,IAAI,GAAG,EAAE,CAAA;YACjB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QACzC,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACjB,CAAC;IAED,0DAA0D;IAC1D,yBAAyB,CAAC,IAAgB;QACxC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAM;QAExB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAE9C,IAAI,CAAC,KAAK;YAAE,OAAM;QAElB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAElB,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACrC,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,kBAAkB,CAAC,MAAc;QAC/B,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAc,CAAA;IAClE,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,MAAc,EAAE,cAAuB;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC9C,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,CAAA;QAEpB,iFAAiF;QACjF,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,CAAA;QAC3B,IAAI,KAAK,GAAG,CAAC,CAAA;QAEb,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc;gBAAE,SAAQ;YAC1C,IAAI,CAAC,KAAK,EAAE,CAAA;YACZ,KAAK,EAAE,CAAA;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;QAC5D,OAAO,KAAK,CAAA;IACd,CAAC;IAED,SAAS,CACP,MAAc,EACd,EAAwB,EACxB,OAA8B,EAAE;QAEhC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAA;IAC9D,CAAC;IAED,OAAO,CAAC,OAAwB,UAAU;QACxC,IACE,IAAI,IAAI,IAAI;YACZ,OAAO,IAAI,KAAK,QAAQ;YACxB,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,UAAU;YACpC,OAAO,IAAI,CAAC,QAAQ,KAAK,UAAU,EACnC,CAAC;YACD,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QACxB,CAAC;QAED,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAA;QAClD,IAAI,IAAI,KAAK,UAAU;YAAE,OAAO,IAAI,CAAA;QAEpC,MAAM,WAAW,GAAG,IAAc,CAAA;QAElC,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACtD,IAAI,eAAe;YAAE,OAAO,eAAe,CAAA;QAE3C,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,CAAA;QAC9C,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QACvC,OAAO,OAAO,CAAA;IAChB,CAAC;;AAKH,MAAM,UAAU,YAAY,CAAC,OAAuB;IAClD,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,CAAA;AAC5B,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { MiddlewareHandler } from 'hono';
|
|
2
2
|
import { Hono } from 'hono';
|
|
3
3
|
import { type Server as NodeHttpServer } from 'node:http';
|
|
4
|
-
import type { RateLimit, Server } from '../server.js';
|
|
4
|
+
import type { RateLimit, RequestBodySizeLimit, Server } from '../server.js';
|
|
5
5
|
/**
|
|
6
6
|
* Node.js HTTP transport backed by a Hono application.
|
|
7
7
|
*
|
|
@@ -11,9 +11,9 @@ import type { RateLimit, Server } from '../server.js';
|
|
|
11
11
|
export declare class NodeHonoTransport {
|
|
12
12
|
server: Server;
|
|
13
13
|
app: Hono;
|
|
14
|
-
http
|
|
15
|
-
private httpRateLimiter
|
|
16
|
-
constructor(server: Server, origins: string[] | undefined, limit: RateLimit, maxRequestBodySize: number);
|
|
14
|
+
http: NodeHttpServer | undefined;
|
|
15
|
+
private httpRateLimiter;
|
|
16
|
+
constructor(server: Server, origins: string[] | undefined, limit: RateLimit, maxRequestBodySize: number, requestBodySizeLimits?: readonly RequestBodySizeLimit[]);
|
|
17
17
|
/**
|
|
18
18
|
* Tees a request without allowing an optional observer to control Hono's
|
|
19
19
|
* backpressure. Header-only observers receive metadata and completion without
|
|
@@ -23,10 +23,10 @@ export class NodeHonoTransport {
|
|
|
23
23
|
app;
|
|
24
24
|
http;
|
|
25
25
|
httpRateLimiter;
|
|
26
|
-
constructor(server, origins, limit, maxRequestBodySize) {
|
|
26
|
+
constructor(server, origins, limit, maxRequestBodySize, requestBodySizeLimits = []) {
|
|
27
27
|
this.server = server;
|
|
28
28
|
this.app = new Hono();
|
|
29
|
-
this.setupMiddleware(origins, limit, maxRequestBodySize);
|
|
29
|
+
this.setupMiddleware(origins, limit, maxRequestBodySize, requestBodySizeLimits);
|
|
30
30
|
const honoListener = getRequestListener((request, env) => this.handleFetch(request, env));
|
|
31
31
|
this.http = createServer((request, response) => {
|
|
32
32
|
if (!this.server.requestListener) {
|
|
@@ -45,7 +45,10 @@ export class NodeHonoTransport {
|
|
|
45
45
|
const honoRequest = this.createRequestMirror(request);
|
|
46
46
|
const observerRequest = this.createRequestMirror(request);
|
|
47
47
|
void honoListener(honoRequest, response);
|
|
48
|
-
this.server.requestListener
|
|
48
|
+
const requestListener = this.server.requestListener;
|
|
49
|
+
if (!requestListener)
|
|
50
|
+
return;
|
|
51
|
+
requestListener(observerRequest, response);
|
|
49
52
|
request.on('data', (chunk) => {
|
|
50
53
|
if (!honoRequest.write(chunk))
|
|
51
54
|
request.pause();
|
|
@@ -84,11 +87,12 @@ export class NodeHonoTransport {
|
|
|
84
87
|
// ---------------------------------------------------------------------------
|
|
85
88
|
// Middleware setup
|
|
86
89
|
// ---------------------------------------------------------------------------
|
|
87
|
-
setupMiddleware(origins, limit, maxRequestBodySize) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
setupMiddleware(origins, limit, maxRequestBodySize, requestBodySizeLimits) {
|
|
91
|
+
validateRequestBodyLimits(maxRequestBodySize, requestBodySizeLimits);
|
|
92
|
+
this.app.use('*', (c, next) => bodyLimit({
|
|
93
|
+
maxSize: getRequestBodyLimit(c.req.path, maxRequestBodySize, requestBodySizeLimits),
|
|
94
|
+
onError: context => context.text('Request Entity Too Large', 413),
|
|
95
|
+
})(c, next));
|
|
92
96
|
if (origins?.length) {
|
|
93
97
|
this.app.use('*', cors({
|
|
94
98
|
origin: (origin) => origins.includes(origin) ? origin : null,
|
|
@@ -189,9 +193,10 @@ export class NodeHonoTransport {
|
|
|
189
193
|
// Helpers
|
|
190
194
|
// ---------------------------------------------------------------------------
|
|
191
195
|
buildTypeFerryRequest(c) {
|
|
196
|
+
const ip = c.req.header('x-forwarded-for') ?? getConnInfo(c).remote.address;
|
|
192
197
|
return {
|
|
193
198
|
headers: Object.fromEntries(c.req.raw.headers.entries()),
|
|
194
|
-
ip:
|
|
199
|
+
...(ip === undefined ? {} : { ip }),
|
|
195
200
|
path: c.req.path,
|
|
196
201
|
get: (name) => c.req.header(name),
|
|
197
202
|
};
|
|
@@ -216,8 +221,8 @@ export class NodeHonoTransport {
|
|
|
216
221
|
const node = this.buildClientNodeFromContext(c);
|
|
217
222
|
node.uuid = c.req.header(CLIENT_ID_HEADER_KEY) ?? '';
|
|
218
223
|
const serverContext = await this.getServerContext(node, (context ?? {}));
|
|
219
|
-
node.authenticated =
|
|
220
|
-
node.setContext(serverContext);
|
|
224
|
+
node.authenticated = serverContext !== false;
|
|
225
|
+
node.setContext(serverContext === false ? null : serverContext);
|
|
221
226
|
return node;
|
|
222
227
|
}
|
|
223
228
|
async getServerContext(clientNode, context = {}) {
|
|
@@ -226,9 +231,9 @@ export class NodeHonoTransport {
|
|
|
226
231
|
context.token = token.replace('Bearer ', '');
|
|
227
232
|
}
|
|
228
233
|
if (this.server.auth instanceof Function) {
|
|
229
|
-
let result = this.server.auth.call(clientNode, context
|
|
234
|
+
let result = this.server.auth.call(clientNode, context);
|
|
230
235
|
result = result instanceof Promise ? await result : result;
|
|
231
|
-
return result;
|
|
236
|
+
return result || false;
|
|
232
237
|
}
|
|
233
238
|
return false;
|
|
234
239
|
}
|
|
@@ -236,7 +241,17 @@ export class NodeHonoTransport {
|
|
|
236
241
|
if (!body)
|
|
237
242
|
return { context: null };
|
|
238
243
|
try {
|
|
239
|
-
|
|
244
|
+
const decoded = EJSON.parse(body);
|
|
245
|
+
if (!decoded || typeof decoded !== 'object')
|
|
246
|
+
return { context: null };
|
|
247
|
+
const transport = decoded;
|
|
248
|
+
const payload = transport.payload;
|
|
249
|
+
return {
|
|
250
|
+
...(payload && typeof payload === 'object'
|
|
251
|
+
? { payload: payload }
|
|
252
|
+
: {}),
|
|
253
|
+
context: transport.context,
|
|
254
|
+
};
|
|
240
255
|
}
|
|
241
256
|
catch {
|
|
242
257
|
return { context: null };
|
|
@@ -324,4 +339,41 @@ export class NodeHonoTransport {
|
|
|
324
339
|
this.server.emit(HttpTransportEvents.HTTP_SERVER_CLOSED);
|
|
325
340
|
}
|
|
326
341
|
}
|
|
342
|
+
/**
|
|
343
|
+
* Rejects invalid limits before the listener starts accepting requests.
|
|
344
|
+
*/
|
|
345
|
+
function validateRequestBodyLimits(globalLimit, limits) {
|
|
346
|
+
for (const limit of [globalLimit, ...limits.map(rule => rule.maxSize)]) {
|
|
347
|
+
if (!Number.isSafeInteger(limit) || limit < 1) {
|
|
348
|
+
throw new Error('Request body limits must be positive safe integers');
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
for (const { pathPrefix } of limits) {
|
|
352
|
+
if (!pathPrefix.startsWith('/') ||
|
|
353
|
+
pathPrefix === '/' ||
|
|
354
|
+
pathPrefix.endsWith('/') ||
|
|
355
|
+
pathPrefix.includes('\0') ||
|
|
356
|
+
/[?#%\\\s]/u.test(pathPrefix)) {
|
|
357
|
+
throw new Error('Request body limit prefixes must be non-root paths without query, fragment, encoding or trailing slash');
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Decode once because Hono route parameters decode encoded input. Otherwise
|
|
363
|
+
* percent-encoded equivalents could bypass a more restrictive prefix ceiling.
|
|
364
|
+
*/
|
|
365
|
+
function getRequestBodyLimit(path, globalLimit, limits) {
|
|
366
|
+
let decodedPath;
|
|
367
|
+
try {
|
|
368
|
+
decodedPath = decodeURIComponent(path);
|
|
369
|
+
}
|
|
370
|
+
catch {
|
|
371
|
+
// Malformed encodings should not receive a more permissive buffering limit.
|
|
372
|
+
return Math.min(globalLimit, ...limits.map(rule => rule.maxSize));
|
|
373
|
+
}
|
|
374
|
+
return limits.reduce((limit, rule) => decodedPath === rule.pathPrefix ||
|
|
375
|
+
decodedPath.startsWith(`${rule.pathPrefix}/`)
|
|
376
|
+
? Math.min(limit, rule.maxSize)
|
|
377
|
+
: limit, globalLimit);
|
|
378
|
+
}
|
|
327
379
|
//# sourceMappingURL=node-hono-transport.js.map
|