@enkaku/server 0.9.1 → 0.10.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/lib/error.d.ts +5 -5
- package/lib/error.d.ts.map +1 -1
- package/lib/error.js +5 -4
- package/lib/handlers/channel.d.ts +1 -2
- package/lib/handlers/channel.d.ts.map +1 -1
- package/lib/handlers/channel.js +10 -13
- package/lib/handlers/event.d.ts +1 -2
- package/lib/handlers/event.d.ts.map +1 -1
- package/lib/handlers/event.js +7 -8
- package/lib/handlers/request.d.ts +1 -2
- package/lib/handlers/request.d.ts.map +1 -1
- package/lib/handlers/request.js +1 -4
- package/lib/handlers/stream.d.ts +1 -2
- package/lib/handlers/stream.d.ts.map +1 -1
- package/lib/handlers/stream.js +10 -13
- package/lib/index.d.ts +1 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -2
- package/lib/server.d.ts +5 -8
- package/lib/server.d.ts.map +1 -1
- package/lib/server.js +62 -60
- package/lib/types.d.ts +20 -2
- package/lib/types.d.ts.map +1 -1
- package/lib/utils.d.ts +0 -7
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +7 -24
- package/package.json +9 -8
- package/lib/rejections.d.ts +0 -28
- package/lib/rejections.d.ts.map +0 -1
- package/lib/rejections.js +0 -40
package/lib/error.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import type { ErrorReplyPayload } from '@enkaku/protocol';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
export type HandlerErrorParams<Code extends string = string, Data extends Record<string, unknown> = Record<string, unknown>> = {
|
|
3
|
+
cause?: unknown;
|
|
4
4
|
code: Code;
|
|
5
5
|
data?: Data;
|
|
6
6
|
message?: string;
|
|
7
7
|
};
|
|
8
|
-
export declare class HandlerError<Code extends string, Data extends Record<string, unknown> = Record<string, unknown
|
|
8
|
+
export declare class HandlerError<Code extends string, Data extends Record<string, unknown> = Record<string, unknown>> extends Error {
|
|
9
9
|
#private;
|
|
10
|
-
static from<Code extends string, Data extends Record<string, unknown> = Record<string, unknown
|
|
11
|
-
constructor(params: HandlerErrorParams<Code, Data
|
|
10
|
+
static from<Code extends string, Data extends Record<string, unknown> = Record<string, unknown>>(cause: unknown, params: HandlerErrorParams<Code, Data>): HandlerError<Code, Data>;
|
|
11
|
+
constructor(params: HandlerErrorParams<Code, Data>);
|
|
12
12
|
get code(): Code;
|
|
13
13
|
get data(): Data;
|
|
14
14
|
toPayload(rid: string): ErrorReplyPayload<Code, Data>;
|
package/lib/error.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,MAAM,MAAM,kBAAkB,CAC5B,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC5D;IACF,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,qBAAa,YAAY,CACvB,IAAI,SAAS,MAAM,EACnB,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC9D,SAAQ,KAAK;;IACb,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,MAAM,EAAE,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7F,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,GACrC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC;gBAWf,MAAM,EAAE,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC;IAOlD,IAAI,IAAI,IAAI,IAAI,CAEf;IAED,IAAI,IAAI,IAAI,IAAI,CAEf;IAED,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC;CAStD"}
|
package/lib/error.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
export class HandlerError extends ErrorRejection {
|
|
1
|
+
export class HandlerError extends Error {
|
|
3
2
|
static from(cause, params) {
|
|
4
3
|
return cause instanceof HandlerError ? cause : cause instanceof Error ? new HandlerError({
|
|
5
4
|
message: cause.message,
|
|
@@ -14,8 +13,10 @@ export class HandlerError extends ErrorRejection {
|
|
|
14
13
|
#code;
|
|
15
14
|
#data;
|
|
16
15
|
constructor(params){
|
|
17
|
-
const { code, data, message
|
|
18
|
-
super(message ?? `Handler error code: ${code}`,
|
|
16
|
+
const { cause, code, data, message } = params;
|
|
17
|
+
super(message ?? `Handler error code: ${code}`, {
|
|
18
|
+
cause
|
|
19
|
+
});
|
|
19
20
|
this.#code = code;
|
|
20
21
|
this.#data = data ?? {};
|
|
21
22
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { ChannelPayloadOf, ClientMessage, ProtocolDefinition } from '@enkaku/protocol';
|
|
2
|
-
import { ErrorRejection } from '../rejections.js';
|
|
3
2
|
import type { HandlerContext } from '../types.js';
|
|
4
3
|
export type ChannelMessageOf<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string = keyof Protocol & string> = ClientMessage<ChannelPayloadOf<Procedure, Protocol[Procedure]>>;
|
|
5
|
-
export declare function handleChannel<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string>(ctx: HandlerContext<Protocol>, msg: ChannelMessageOf<Protocol, Procedure>):
|
|
4
|
+
export declare function handleChannel<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string>(ctx: HandlerContext<Protocol>, msg: ChannelMessageOf<Protocol, Procedure>): Error | Promise<void>;
|
|
6
5
|
//# sourceMappingURL=channel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/handlers/channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EACnB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/handlers/channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,EAChB,aAAa,EACb,kBAAkB,EACnB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,KAAK,EAGV,cAAc,EAGf,MAAM,aAAa,CAAA;AAGpB,MAAM,MAAM,gBAAgB,CAC1B,QAAQ,SAAS,kBAAkB,EACnC,SAAS,SAAS,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,QAAQ,GAAG,MAAM,IACjE,aAAa,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;AAEnE,wBAAgB,aAAa,CAC3B,QAAQ,SAAS,kBAAkB,EACnC,SAAS,SAAS,MAAM,QAAQ,GAAG,MAAM,EAEzC,GAAG,EAAE,cAAc,CAAC,QAAQ,CAAC,EAC7B,GAAG,EAAE,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,GACzC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CvB"}
|
package/lib/handlers/channel.js
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { createPipe } from '@enkaku/stream';
|
|
2
|
-
import {
|
|
3
|
-
import { consumeReader, executeHandler } from '../utils.js';
|
|
2
|
+
import { executeHandler } from '../utils.js';
|
|
4
3
|
export function handleChannel(ctx, msg) {
|
|
5
4
|
const handler = ctx.handlers[msg.payload.prc];
|
|
6
5
|
if (handler == null) {
|
|
7
|
-
return new
|
|
8
|
-
info: msg.payload
|
|
9
|
-
});
|
|
6
|
+
return new Error(`No handler for procedure: ${msg.payload.prc}`);
|
|
10
7
|
}
|
|
11
8
|
const sendStream = createPipe();
|
|
12
9
|
const controller = Object.assign(new AbortController(), {
|
|
@@ -17,19 +14,19 @@ export function handleChannel(ctx, msg) {
|
|
|
17
14
|
});
|
|
18
15
|
ctx.controllers[msg.payload.rid] = controller;
|
|
19
16
|
const receiveStream = createPipe();
|
|
20
|
-
// @ts-ignore type instantiation too deep
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
receiveStream.readable.pipeTo(// @ts-ignore type instantiation too deep
|
|
18
|
+
new WritableStream({
|
|
19
|
+
async write (val) {
|
|
20
|
+
if (controller.signal.aborted) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
24
23
|
await ctx.send({
|
|
25
24
|
typ: 'receive',
|
|
26
25
|
rid: msg.payload.rid,
|
|
27
26
|
val
|
|
28
27
|
});
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
signal: controller.signal
|
|
32
|
-
});
|
|
28
|
+
}
|
|
29
|
+
}));
|
|
33
30
|
const handlerContext = {
|
|
34
31
|
message: msg,
|
|
35
32
|
param: msg.payload.prm,
|
package/lib/handlers/event.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { ClientMessage, EventPayloadOf, ProtocolDefinition } from '@enkaku/protocol';
|
|
2
|
-
import { ErrorRejection } from '../rejections.js';
|
|
3
2
|
import type { HandlerContext } from '../types.js';
|
|
4
3
|
export type EventMessageOf<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string = keyof Protocol & string> = ClientMessage<EventPayloadOf<Procedure, Protocol[Procedure]>>;
|
|
5
|
-
export declare function handleEvent<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string>(ctx: HandlerContext<Protocol>, msg: EventMessageOf<Protocol, Procedure>):
|
|
4
|
+
export declare function handleEvent<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string>(ctx: HandlerContext<Protocol>, msg: EventMessageOf<Protocol, Procedure>): Error | Promise<void>;
|
|
6
5
|
//# sourceMappingURL=event.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/handlers/event.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAEzF,OAAO,
|
|
1
|
+
{"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/handlers/event.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAEzF,OAAO,KAAK,EAAqC,cAAc,EAAE,MAAM,aAAa,CAAA;AAEpF,MAAM,MAAM,cAAc,CACxB,QAAQ,SAAS,kBAAkB,EACnC,SAAS,SAAS,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,QAAQ,GAAG,MAAM,IACjE,aAAa,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;AAEjE,wBAAgB,WAAW,CACzB,QAAQ,SAAS,kBAAkB,EACnC,SAAS,SAAS,MAAM,QAAQ,GAAG,MAAM,EACzC,GAAG,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBhG"}
|
package/lib/handlers/event.js
CHANGED
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
import { toPromise } from '@enkaku/async';
|
|
2
|
-
import { ErrorRejection } from '../rejections.js';
|
|
3
2
|
export function handleEvent(ctx, msg) {
|
|
4
3
|
const handler = ctx.handlers[msg.payload.prc];
|
|
5
4
|
if (handler == null) {
|
|
6
|
-
return new
|
|
7
|
-
info: msg.payload
|
|
8
|
-
});
|
|
5
|
+
return new Error(`No handler for procedure: ${msg.payload.prc}`);
|
|
9
6
|
}
|
|
10
7
|
const handlerContext = {
|
|
11
8
|
message: msg,
|
|
12
9
|
data: msg.payload.data
|
|
13
10
|
};
|
|
11
|
+
// @ts-ignore type instantiation too deep
|
|
14
12
|
return toPromise(()=>handler(handlerContext)).catch((cause)=>{
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
ctx.events.emit('handlerError', {
|
|
14
|
+
error: new Error(`Error handling procedure: ${msg.payload.prc}`, {
|
|
15
|
+
cause
|
|
16
|
+
}),
|
|
17
|
+
payload: msg.payload
|
|
18
18
|
});
|
|
19
|
-
ctx.reject(err);
|
|
20
19
|
});
|
|
21
20
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { ClientMessage, ProtocolDefinition, RequestPayloadOf } from '@enkaku/protocol';
|
|
2
|
-
import { ErrorRejection } from '../rejections.js';
|
|
3
2
|
import type { HandlerContext } from '../types.js';
|
|
4
3
|
export type RequestMessageOf<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string = keyof Protocol & string> = ClientMessage<RequestPayloadOf<Procedure, Protocol[Procedure]>>;
|
|
5
|
-
export declare function handleRequest<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string>(ctx: HandlerContext<Protocol>, msg: RequestMessageOf<Protocol, Procedure>):
|
|
4
|
+
export declare function handleRequest<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string>(ctx: HandlerContext<Protocol>, msg: RequestMessageOf<Protocol, Procedure>): Error | Promise<void>;
|
|
6
5
|
//# sourceMappingURL=request.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/handlers/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAE3F,OAAO,
|
|
1
|
+
{"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../src/handlers/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAE3F,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,aAAa,CAAA;AAGjE,MAAM,MAAM,gBAAgB,CAC1B,QAAQ,SAAS,kBAAkB,EACnC,SAAS,SAAS,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,QAAQ,GAAG,MAAM,IACjE,aAAa,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;AAEnE,wBAAgB,aAAa,CAC3B,QAAQ,SAAS,kBAAkB,EACnC,SAAS,SAAS,MAAM,QAAQ,GAAG,MAAM,EAEzC,GAAG,EAAE,cAAc,CAAC,QAAQ,CAAC,EAC7B,GAAG,EAAE,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,GACzC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvB"}
|
package/lib/handlers/request.js
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
import { ErrorRejection } from '../rejections.js';
|
|
2
1
|
import { executeHandler } from '../utils.js';
|
|
3
2
|
export function handleRequest(ctx, msg) {
|
|
4
3
|
const handler = ctx.handlers[msg.payload.prc];
|
|
5
4
|
if (handler == null) {
|
|
6
|
-
return new
|
|
7
|
-
info: msg.payload
|
|
8
|
-
});
|
|
5
|
+
return new Error(`No handler for procedure: ${msg.payload.prc}`);
|
|
9
6
|
}
|
|
10
7
|
const controller = new AbortController();
|
|
11
8
|
ctx.controllers[msg.payload.rid] = controller;
|
package/lib/handlers/stream.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { ClientMessage, ProtocolDefinition, StreamPayloadOf } from '@enkaku/protocol';
|
|
2
|
-
import { ErrorRejection } from '../rejections.js';
|
|
3
2
|
import type { HandlerContext } from '../types.js';
|
|
4
3
|
export type StreamMessageOf<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string = keyof Protocol & string> = ClientMessage<StreamPayloadOf<Procedure, Protocol[Procedure]>>;
|
|
5
|
-
export declare function handleStream<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string>(ctx: HandlerContext<Protocol>, msg: StreamMessageOf<Protocol, Procedure>):
|
|
4
|
+
export declare function handleStream<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string>(ctx: HandlerContext<Protocol>, msg: StreamMessageOf<Protocol, Procedure>): Error | Promise<void>;
|
|
6
5
|
//# sourceMappingURL=stream.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/handlers/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,aAAa,EACb,kBAAkB,EAClB,eAAe,EAChB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/handlers/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,aAAa,EACb,kBAAkB,EAClB,eAAe,EAChB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,KAAK,EAAE,cAAc,EAA8B,MAAM,aAAa,CAAA;AAG7E,MAAM,MAAM,eAAe,CACzB,QAAQ,SAAS,kBAAkB,EACnC,SAAS,SAAS,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,QAAQ,GAAG,MAAM,IACjE,aAAa,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;AAElE,wBAAgB,YAAY,CAC1B,QAAQ,SAAS,kBAAkB,EACnC,SAAS,SAAS,MAAM,QAAQ,GAAG,MAAM,EACzC,GAAG,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAkCjG"}
|
package/lib/handlers/stream.js
CHANGED
|
@@ -1,29 +1,26 @@
|
|
|
1
1
|
import { createPipe } from '@enkaku/stream';
|
|
2
|
-
import {
|
|
3
|
-
import { consumeReader, executeHandler } from '../utils.js';
|
|
2
|
+
import { executeHandler } from '../utils.js';
|
|
4
3
|
export function handleStream(ctx, msg) {
|
|
5
4
|
const handler = ctx.handlers[msg.payload.prc];
|
|
6
5
|
if (handler == null) {
|
|
7
|
-
return new
|
|
8
|
-
info: msg.payload
|
|
9
|
-
});
|
|
6
|
+
return new Error(`No handler for procedure: ${msg.payload.prc}`);
|
|
10
7
|
}
|
|
11
8
|
const controller = new AbortController();
|
|
12
9
|
ctx.controllers[msg.payload.rid] = controller;
|
|
13
10
|
const receiveStream = createPipe();
|
|
14
|
-
// @ts-ignore type instantiation too deep
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
receiveStream.readable.pipeTo(// @ts-ignore type instantiation too deep
|
|
12
|
+
new WritableStream({
|
|
13
|
+
async write (val) {
|
|
14
|
+
if (controller.signal.aborted) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
18
17
|
await ctx.send({
|
|
19
18
|
typ: 'receive',
|
|
20
19
|
rid: msg.payload.rid,
|
|
21
20
|
val
|
|
22
21
|
});
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
signal: controller.signal
|
|
26
|
-
});
|
|
22
|
+
}
|
|
23
|
+
}));
|
|
27
24
|
const handlerContext = {
|
|
28
25
|
message: msg,
|
|
29
26
|
param: msg.payload.prm,
|
package/lib/index.d.ts
CHANGED
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
* @module server
|
|
11
11
|
*/
|
|
12
12
|
export type { ProcedureAccessRecord } from './access-control.js';
|
|
13
|
-
export { AbortRejection, ErrorRejection, type RejectionType } from './rejections.js';
|
|
14
13
|
export { type ServeParams, Server, type ServerParams, serve } from './server.js';
|
|
15
|
-
export type { ChannelHandler, ChannelHandlerContext, ProcedureHandlers, EventHandler, EventHandlerContext, HandlerReturn, RequestHandler, RequestHandlerContext, StreamHandler, StreamHandlerContext, } from './types.js';
|
|
14
|
+
export type { ChannelHandler, ChannelHandlerContext, ProcedureHandlers, EventHandler, EventHandlerContext, HandlerReturn, RequestHandler, RequestHandlerContext, ServerEmitter, ServerEvents, StreamHandler, StreamHandlerContext, } from './types.js';
|
|
16
15
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,EAAE,KAAK,YAAY,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAChF,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,aAAa,EACb,oBAAoB,GACrB,MAAM,YAAY,CAAA"}
|
package/lib/index.js
CHANGED
package/lib/server.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Disposer } from '@enkaku/async';
|
|
2
2
|
import { type AnyClientMessageOf, type ProtocolDefinition, type ServerTransportOf } from '@enkaku/protocol';
|
|
3
3
|
import { type Validator } from '@enkaku/schema';
|
|
4
4
|
import { type ProcedureAccessRecord } from './access-control.js';
|
|
5
|
-
import {
|
|
6
|
-
import type { ProcedureHandlers } from './types.js';
|
|
5
|
+
import type { ProcedureHandlers, ServerEmitter } from './types.js';
|
|
7
6
|
export type AccessControlParams = {
|
|
8
7
|
public: true;
|
|
9
8
|
serverID?: string;
|
|
@@ -14,8 +13,8 @@ export type AccessControlParams = {
|
|
|
14
13
|
access: ProcedureAccessRecord;
|
|
15
14
|
};
|
|
16
15
|
export type HandleMessagesParams<Protocol extends ProtocolDefinition> = AccessControlParams & {
|
|
16
|
+
events: ServerEmitter;
|
|
17
17
|
handlers: ProcedureHandlers<Protocol>;
|
|
18
|
-
reject: (rejection: RejectionType) => void;
|
|
19
18
|
signal: AbortSignal;
|
|
20
19
|
transport: ServerTransportOf<Protocol>;
|
|
21
20
|
validator?: Validator<AnyClientMessageOf<Protocol>>;
|
|
@@ -33,12 +32,10 @@ export type HandleOptions = {
|
|
|
33
32
|
public?: boolean;
|
|
34
33
|
access?: ProcedureAccessRecord;
|
|
35
34
|
};
|
|
36
|
-
export declare class Server<Protocol extends ProtocolDefinition>
|
|
35
|
+
export declare class Server<Protocol extends ProtocolDefinition> extends Disposer {
|
|
37
36
|
#private;
|
|
38
37
|
constructor(params: ServerParams<Protocol>);
|
|
39
|
-
get
|
|
40
|
-
get rejections(): ReadableStream<RejectionType>;
|
|
41
|
-
dispose(): Promise<void>;
|
|
38
|
+
get events(): ServerEmitter;
|
|
42
39
|
handle(transport: ServerTransportOf<Protocol>, options?: HandleOptions): Promise<void>;
|
|
43
40
|
}
|
|
44
41
|
export type ServeParams<Protocol extends ProtocolDefinition> = Omit<ServerParams<Protocol>, 'transports'> & {
|
package/lib/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,EACL,KAAK,kBAAkB,EAEvB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAEvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAGL,KAAK,SAAS,EAEf,MAAM,gBAAgB,CAAA;AAGvB,OAAO,EAAE,KAAK,qBAAqB,EAAoB,MAAM,qBAAqB,CAAA;AAKlF,OAAO,KAAK,EAIV,iBAAiB,EACjB,aAAa,EAEd,MAAM,YAAY,CAAA;AAQnB,MAAM,MAAM,mBAAmB,GAC3B;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,qBAAqB,CAAA;CAAE,GACnE;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,qBAAqB,CAAA;CAAE,CAAA;AAEtE,MAAM,MAAM,oBAAoB,CAAC,QAAQ,SAAS,kBAAkB,IAAI,mBAAmB,GAAG;IAC5F,MAAM,EAAE,aAAa,CAAA;IACrB,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACrC,MAAM,EAAE,WAAW,CAAA;IACnB,SAAS,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACtC,SAAS,CAAC,EAAE,SAAS,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAA;CACpD,CAAA;AAyJD,MAAM,MAAM,YAAY,CAAC,QAAQ,SAAS,kBAAkB,IAAI;IAC9D,MAAM,CAAC,EAAE,qBAAqB,CAAA;IAC9B,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACrC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,UAAU,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAA;CAChD,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,qBAAqB,CAAA;CAAE,CAAA;AAEhF,qBAAa,MAAM,CAAC,QAAQ,SAAS,kBAAkB,CAAE,SAAQ,QAAQ;;gBAQ3D,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC;IA+C1C,IAAI,MAAM,IAAI,aAAa,CAE1B;IAED,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;CA0B3F;AAED,MAAM,MAAM,WAAW,CAAC,QAAQ,SAAS,kBAAkB,IAAI,IAAI,CACjE,YAAY,CAAC,QAAQ,CAAC,EACtB,YAAY,CACb,GAAG;IACF,SAAS,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAA;CACvC,CAAA;AAED,wBAAgB,KAAK,CAAC,QAAQ,SAAS,kBAAkB,EACvD,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,GAC5B,MAAM,CAAC,QAAQ,CAAC,CAGlB"}
|
package/lib/server.js
CHANGED
|
@@ -1,48 +1,60 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Disposer } from '@enkaku/async';
|
|
2
|
+
import { EventEmitter } from '@enkaku/event';
|
|
2
3
|
import { createClientMessageSchema } from '@enkaku/protocol';
|
|
3
|
-
import { createValidator } from '@enkaku/schema';
|
|
4
|
-
import { createPipe } from '@enkaku/stream';
|
|
4
|
+
import { ValidationError, createValidator } from '@enkaku/schema';
|
|
5
5
|
import { createUnsignedToken, isSignedToken } from '@enkaku/token';
|
|
6
6
|
import { checkClientToken } from './access-control.js';
|
|
7
7
|
import { handleChannel } from './handlers/channel.js';
|
|
8
8
|
import { handleEvent } from './handlers/event.js';
|
|
9
9
|
import { handleRequest } from './handlers/request.js';
|
|
10
10
|
import { handleStream } from './handlers/stream.js';
|
|
11
|
-
import { ErrorRejection } from './rejections.js';
|
|
12
11
|
async function handleMessages(params) {
|
|
13
|
-
const {
|
|
12
|
+
const { events, handlers, signal, transport, validator } = params;
|
|
14
13
|
const controllers = Object.create(null);
|
|
15
14
|
const context = {
|
|
16
15
|
controllers,
|
|
16
|
+
events,
|
|
17
17
|
handlers,
|
|
18
|
-
reject,
|
|
19
18
|
send: (payload)=>transport.write(createUnsignedToken(payload))
|
|
20
19
|
};
|
|
21
20
|
const running = Object.create(null);
|
|
22
|
-
const disposer =
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
controller.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
21
|
+
const disposer = new Disposer({
|
|
22
|
+
dispose: async ()=>{
|
|
23
|
+
// Abort all currently running handlers
|
|
24
|
+
for (const controller of Object.values(controllers)){
|
|
25
|
+
controller.abort('Dispose');
|
|
26
|
+
}
|
|
27
|
+
// Wait until all running handlers are done
|
|
28
|
+
await Promise.all(Object.values(running));
|
|
29
|
+
},
|
|
30
|
+
signal
|
|
31
|
+
});
|
|
32
|
+
// Abort inflight handlers when the transport fails to write
|
|
33
|
+
transport.events.on('writeFailed', (event)=>{
|
|
34
|
+
controllers[event.rid]?.abort('Transport');
|
|
35
|
+
});
|
|
30
36
|
const processMessage = validator ? (message)=>{
|
|
31
37
|
const result = validator(message);
|
|
32
|
-
if (result
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
})
|
|
38
|
+
if (result instanceof ValidationError) {
|
|
39
|
+
events.emit('invalidMessage', {
|
|
40
|
+
error: new Error('Invalid protocol message', {
|
|
41
|
+
cause: result
|
|
42
|
+
}),
|
|
43
|
+
message
|
|
44
|
+
});
|
|
45
|
+
return null;
|
|
39
46
|
}
|
|
40
47
|
return result.value;
|
|
41
48
|
} : (message)=>message;
|
|
42
49
|
function processHandler(message, handle) {
|
|
43
50
|
const returned = handle();
|
|
44
|
-
if (returned instanceof
|
|
45
|
-
|
|
51
|
+
if (returned instanceof Error) {
|
|
52
|
+
const rid = message.payload.typ === 'event' ? undefined : message.payload.rid;
|
|
53
|
+
events.emit('handlerError', {
|
|
54
|
+
error: returned,
|
|
55
|
+
payload: message.payload,
|
|
56
|
+
rid
|
|
57
|
+
});
|
|
46
58
|
} else {
|
|
47
59
|
const id = message.payload.typ === 'event' ? Math.random().toString(36).slice(2) : message.payload.rid;
|
|
48
60
|
running[id] = returned;
|
|
@@ -62,10 +74,12 @@ async function handleMessages(params) {
|
|
|
62
74
|
} catch (err) {
|
|
63
75
|
const errorMessage = err.message ?? 'Access denied';
|
|
64
76
|
if (message.payload.typ === 'event') {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
77
|
+
events.emit('handlerError', {
|
|
78
|
+
error: new Error(errorMessage, {
|
|
79
|
+
cause: err
|
|
80
|
+
}),
|
|
81
|
+
payload: message.payload
|
|
82
|
+
});
|
|
69
83
|
} else {
|
|
70
84
|
context.send({
|
|
71
85
|
typ: 'error',
|
|
@@ -128,17 +142,31 @@ async function handleMessages(params) {
|
|
|
128
142
|
handleNext();
|
|
129
143
|
return disposer.disposed;
|
|
130
144
|
}
|
|
131
|
-
export class Server {
|
|
145
|
+
export class Server extends Disposer {
|
|
132
146
|
#abortController;
|
|
133
147
|
#accessControl;
|
|
134
|
-
#
|
|
148
|
+
#events;
|
|
135
149
|
#handlers;
|
|
136
150
|
#handling = [];
|
|
137
|
-
#reject;
|
|
138
|
-
#rejections;
|
|
139
151
|
#validator;
|
|
140
152
|
constructor(params){
|
|
153
|
+
super({
|
|
154
|
+
dispose: async ()=>{
|
|
155
|
+
// Signal messages handler to stop execution and run cleanup logic
|
|
156
|
+
this.#abortController.abort();
|
|
157
|
+
// Dispose of all handling transports
|
|
158
|
+
await Promise.all(// @ts-ignore type instantiation too deep
|
|
159
|
+
this.#handling.map(async (handling)=>{
|
|
160
|
+
// Wait until all handlers are done - they might still need to flush messages to the transport
|
|
161
|
+
await handling.done;
|
|
162
|
+
// Dispose transport
|
|
163
|
+
await handling.transport.dispose();
|
|
164
|
+
}));
|
|
165
|
+
},
|
|
166
|
+
signal: params.signal
|
|
167
|
+
});
|
|
141
168
|
this.#abortController = new AbortController();
|
|
169
|
+
this.#events = new EventEmitter();
|
|
142
170
|
this.#handlers = params.handlers;
|
|
143
171
|
if (params.id == null) {
|
|
144
172
|
if (params.public) {
|
|
@@ -156,26 +184,6 @@ export class Server {
|
|
|
156
184
|
access: params.access ?? {}
|
|
157
185
|
};
|
|
158
186
|
}
|
|
159
|
-
this.#disposer = createDisposer(async ()=>{
|
|
160
|
-
// Signal messages handler to stop execution and run cleanup logic
|
|
161
|
-
this.#abortController.abort();
|
|
162
|
-
// Dispose of all handling transports
|
|
163
|
-
await Promise.all(// @ts-ignore type instantiation too deep
|
|
164
|
-
this.#handling.map(async (handling)=>{
|
|
165
|
-
// Wait until all handlers are done - they might still need to flush messages to the transport
|
|
166
|
-
await handling.done;
|
|
167
|
-
// Dispose transport
|
|
168
|
-
await handling.transport.dispose();
|
|
169
|
-
}));
|
|
170
|
-
// Cleanup rejections writer
|
|
171
|
-
await rejectionsWriter.close();
|
|
172
|
-
}, params.signal);
|
|
173
|
-
const rejections = createPipe();
|
|
174
|
-
this.#rejections = rejections.readable;
|
|
175
|
-
const rejectionsWriter = rejections.writable.getWriter();
|
|
176
|
-
this.#reject = (rejection)=>{
|
|
177
|
-
void rejectionsWriter.write(rejection);
|
|
178
|
-
};
|
|
179
187
|
if (params.protocol != null) {
|
|
180
188
|
this.#validator = createValidator(createClientMessageSchema(params.protocol));
|
|
181
189
|
}
|
|
@@ -183,14 +191,8 @@ export class Server {
|
|
|
183
191
|
this.handle(transport);
|
|
184
192
|
}
|
|
185
193
|
}
|
|
186
|
-
get
|
|
187
|
-
return this.#
|
|
188
|
-
}
|
|
189
|
-
get rejections() {
|
|
190
|
-
return this.#rejections;
|
|
191
|
-
}
|
|
192
|
-
async dispose() {
|
|
193
|
-
return await this.#disposer.dispose();
|
|
194
|
+
get events() {
|
|
195
|
+
return this.#events;
|
|
194
196
|
}
|
|
195
197
|
handle(transport, options = {}) {
|
|
196
198
|
const publicAccess = options.public ?? this.#accessControl.public;
|
|
@@ -213,8 +215,8 @@ export class Server {
|
|
|
213
215
|
};
|
|
214
216
|
}
|
|
215
217
|
const done = handleMessages({
|
|
218
|
+
events: this.#events,
|
|
216
219
|
handlers: this.#handlers,
|
|
217
|
-
reject: this.#reject,
|
|
218
220
|
signal: this.#abortController.signal,
|
|
219
221
|
transport,
|
|
220
222
|
validator: this.#validator,
|
package/lib/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import type { EventEmitter } from '@enkaku/event';
|
|
1
2
|
import type { AnyRequestProcedureDefinition, AnyServerPayloadOf, ChannelProcedureDefinition, DataOf, EventCallPayload, EventProcedureDefinition, Message, ProtocolDefinition, RequestCallPayload, RequestProcedureDefinition, ReturnOf, StreamProcedureDefinition } from '@enkaku/protocol';
|
|
2
|
-
import type { RejectionType } from './rejections.js';
|
|
3
3
|
export type RequestController = AbortController;
|
|
4
4
|
export type ChannelController<Send = unknown> = AbortController & {
|
|
5
5
|
writer: WritableStreamDefaultWriter<Send>;
|
|
@@ -33,10 +33,28 @@ export type ParamType<Protocol extends ProtocolDefinition, Procedure extends key
|
|
|
33
33
|
export type ReceiveType<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string> = Protocol[Procedure] extends StreamProcedureDefinition ? DataOf<Protocol[Procedure]['receive']> : Protocol[Procedure] extends ChannelProcedureDefinition ? DataOf<Protocol[Procedure]['receive']> : never;
|
|
34
34
|
export type ResultType<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string> = Protocol[Procedure] extends AnyRequestProcedureDefinition ? DataOf<Protocol[Procedure]['result']> : never;
|
|
35
35
|
export type SendType<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string> = Protocol[Procedure] extends ChannelProcedureDefinition ? DataOf<Protocol[Procedure]['send']> : never;
|
|
36
|
+
export type ServerEvents = {
|
|
37
|
+
handlerAbort: {
|
|
38
|
+
rid: string;
|
|
39
|
+
};
|
|
40
|
+
handlerError: {
|
|
41
|
+
error: Error;
|
|
42
|
+
payload: Record<string, unknown>;
|
|
43
|
+
rid?: string;
|
|
44
|
+
};
|
|
45
|
+
handlerTimeout: {
|
|
46
|
+
rid: string;
|
|
47
|
+
};
|
|
48
|
+
invalidMessage: {
|
|
49
|
+
error: Error;
|
|
50
|
+
message: unknown;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
export type ServerEmitter = EventEmitter<ServerEvents>;
|
|
36
54
|
export type HandlerContext<Protocol extends ProtocolDefinition> = {
|
|
37
55
|
controllers: Record<string, HandlerController>;
|
|
56
|
+
events: ServerEmitter;
|
|
38
57
|
handlers: ProcedureHandlers<Protocol>;
|
|
39
|
-
reject: (rejection: RejectionType) => void;
|
|
40
58
|
send: (payload: AnyServerPayloadOf<Protocol>) => Promise<void>;
|
|
41
59
|
};
|
|
42
60
|
//# sourceMappingURL=types.d.ts.map
|
package/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,6BAA6B,EAC7B,kBAAkB,EAClB,0BAA0B,EAC1B,MAAM,EACN,gBAAgB,EAChB,wBAAwB,EACxB,OAAO,EACP,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,EAC1B,QAAQ,EACR,yBAAyB,EAC1B,MAAM,kBAAkB,CAAA;AAEzB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/lib/utils.d.ts
CHANGED
|
@@ -1,11 +1,4 @@
|
|
|
1
1
|
import type { ProtocolDefinition, RequestPayloadOf } from '@enkaku/protocol';
|
|
2
2
|
import type { HandlerContext, ResultType } from './types.js';
|
|
3
|
-
export type ConsumeReaderParams<T> = {
|
|
4
|
-
onDone?: () => void;
|
|
5
|
-
onValue: (value: T) => Promise<void>;
|
|
6
|
-
reader: ReadableStreamDefaultReader<T>;
|
|
7
|
-
signal: AbortSignal;
|
|
8
|
-
};
|
|
9
|
-
export declare function consumeReader<T>(params: ConsumeReaderParams<T>): Promise<void>;
|
|
10
3
|
export declare function executeHandler<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string, Result extends ResultType<Protocol, Procedure> = ResultType<Protocol, Procedure>>(context: HandlerContext<Protocol>, payload: RequestPayloadOf<Procedure, Protocol[Procedure]>, execute: () => Result | Promise<Result>): Promise<void>;
|
|
11
4
|
//# sourceMappingURL=utils.d.ts.map
|
package/lib/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAsB,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAsB,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAGhG,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAO5D,wBAAsB,cAAc,CAClC,QAAQ,SAAS,kBAAkB,EACnC,SAAS,SAAS,MAAM,QAAQ,GAAG,MAAM,EACzC,MAAM,SAAS,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,EAEhF,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC,EACjC,OAAO,EAAE,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,EACzD,OAAO,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
|
package/lib/utils.js
CHANGED
|
@@ -1,24 +1,5 @@
|
|
|
1
1
|
import { toPromise } from '@enkaku/async';
|
|
2
2
|
import { HandlerError } from './error.js';
|
|
3
|
-
import { ErrorRejection } from './rejections.js';
|
|
4
|
-
export async function consumeReader(params) {
|
|
5
|
-
async function handle() {
|
|
6
|
-
if (params.signal.aborted) {
|
|
7
|
-
return;
|
|
8
|
-
}
|
|
9
|
-
const next = await params.reader.read();
|
|
10
|
-
if (next.done) {
|
|
11
|
-
params.onDone?.();
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
if (params.signal.aborted) {
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
await params.onValue(next.value);
|
|
18
|
-
handle();
|
|
19
|
-
}
|
|
20
|
-
handle();
|
|
21
|
-
}
|
|
22
3
|
function canSend(signal) {
|
|
23
4
|
return !signal.aborted || signal.reason === 'Close';
|
|
24
5
|
}
|
|
@@ -41,11 +22,13 @@ export async function executeHandler(context, payload, execute) {
|
|
|
41
22
|
message: cause.message ?? 'Handler execution failed'
|
|
42
23
|
}).toPayload(payload.rid));
|
|
43
24
|
}
|
|
44
|
-
context.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
25
|
+
context.events.emit('handlerError', {
|
|
26
|
+
error: new Error(`Error handling procedure: ${payload.prc}`, {
|
|
27
|
+
cause
|
|
28
|
+
}),
|
|
29
|
+
rid: payload.rid,
|
|
30
|
+
payload
|
|
31
|
+
});
|
|
49
32
|
} finally{
|
|
50
33
|
delete context.controllers[payload.rid];
|
|
51
34
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enkaku/server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"homepage": "https://enkaku.dev",
|
|
6
6
|
"description": "Server logic for Enkaku RPC",
|
|
@@ -25,15 +25,16 @@
|
|
|
25
25
|
],
|
|
26
26
|
"sideEffects": false,
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@enkaku/
|
|
29
|
-
"@enkaku/
|
|
30
|
-
"@enkaku/
|
|
31
|
-
"@enkaku/
|
|
32
|
-
"@enkaku/
|
|
33
|
-
"@enkaku/
|
|
28
|
+
"@enkaku/async": "^0.10.0",
|
|
29
|
+
"@enkaku/capability": "^0.10.0",
|
|
30
|
+
"@enkaku/event": "^0.10.0",
|
|
31
|
+
"@enkaku/protocol": "^0.10.0",
|
|
32
|
+
"@enkaku/schema": "^0.10.0",
|
|
33
|
+
"@enkaku/stream": "^0.10.0",
|
|
34
|
+
"@enkaku/token": "^0.10.0"
|
|
34
35
|
},
|
|
35
36
|
"devDependencies": {
|
|
36
|
-
"@enkaku/transport": "^0.
|
|
37
|
+
"@enkaku/transport": "^0.10.0"
|
|
37
38
|
},
|
|
38
39
|
"scripts": {
|
|
39
40
|
"build:clean": "del lib",
|
package/lib/rejections.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
export declare enum RejectionReason {
|
|
2
|
-
ABORT = 1,
|
|
3
|
-
ERROR = 2,
|
|
4
|
-
TIMEOUT = 3
|
|
5
|
-
}
|
|
6
|
-
export type RejectionType<Reason extends RejectionReason = RejectionReason, Info extends Record<string, unknown> = Record<string, unknown>> = {
|
|
7
|
-
readonly reason: Reason;
|
|
8
|
-
readonly info: Info;
|
|
9
|
-
};
|
|
10
|
-
export declare class Rejection<Reason extends RejectionReason = RejectionReason, Info extends Record<string, unknown> = Record<string, unknown>> implements RejectionType<Reason, Info> {
|
|
11
|
-
#private;
|
|
12
|
-
constructor(reason: Reason, info: Info);
|
|
13
|
-
get reason(): Reason;
|
|
14
|
-
get info(): Info;
|
|
15
|
-
}
|
|
16
|
-
export declare class AbortRejection<Info extends Record<string, unknown> = Record<string, unknown>> extends Rejection<RejectionReason.ABORT, Info> {
|
|
17
|
-
constructor(info: Info);
|
|
18
|
-
}
|
|
19
|
-
export type ErrorRejectionOptions<Info extends Record<string, unknown> = Record<string, unknown>> = ErrorOptions & {
|
|
20
|
-
info: Info;
|
|
21
|
-
};
|
|
22
|
-
export declare class ErrorRejection<Info extends Record<string, unknown> = Record<string, unknown>> extends Error implements RejectionType<RejectionReason.ERROR, Info> {
|
|
23
|
-
#private;
|
|
24
|
-
constructor(message: string, options?: ErrorRejectionOptions<Info>);
|
|
25
|
-
get reason(): RejectionReason.ERROR;
|
|
26
|
-
get info(): Info;
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=rejections.d.ts.map
|
package/lib/rejections.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rejections.d.ts","sourceRoot":"","sources":["../src/rejections.ts"],"names":[],"mappings":"AAAA,oBAAY,eAAe;IACzB,KAAK,IAAI;IACT,KAAK,IAAI;IACT,OAAO,IAAI;CACZ;AAED,MAAM,MAAM,aAAa,CACvB,MAAM,SAAS,eAAe,GAAG,eAAe,EAChD,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC5D;IACF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CACpB,CAAA;AAED,qBAAa,SAAS,CACpB,MAAM,SAAS,eAAe,GAAG,eAAe,EAChD,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC9D,YAAW,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC;;gBAK1B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI;IAKtC,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,IAAI,IAAI,IAAI,CAEf;CACF;AAED,qBAAa,cAAc,CACzB,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC9D,SAAQ,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC;gBAClC,IAAI,EAAE,IAAI;CAGvB;AAED,MAAM,MAAM,qBAAqB,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC9F,YAAY,GAAG;IACb,IAAI,EAAE,IAAI,CAAA;CACX,CAAA;AAEH,qBAAa,cAAc,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACxF,SAAQ,KACR,YAAW,aAAa,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC;;gBAIzC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAS,qBAAqB,CAAC,IAAI,CAAC;IAKxE,IAAI,MAAM,IAAI,eAAe,CAAC,KAAK,CAElC;IAED,IAAI,IAAI,IAAI,IAAI,CAEf;CACF"}
|
package/lib/rejections.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
export var RejectionReason = /*#__PURE__*/ function(RejectionReason) {
|
|
2
|
-
RejectionReason[RejectionReason["ABORT"] = 1] = "ABORT";
|
|
3
|
-
RejectionReason[RejectionReason["ERROR"] = 2] = "ERROR";
|
|
4
|
-
RejectionReason[RejectionReason["TIMEOUT"] = 3] = "TIMEOUT";
|
|
5
|
-
return RejectionReason;
|
|
6
|
-
}({});
|
|
7
|
-
export class Rejection {
|
|
8
|
-
#reason;
|
|
9
|
-
#info;
|
|
10
|
-
constructor(reason, info){
|
|
11
|
-
this.#reason = reason;
|
|
12
|
-
this.#info = info;
|
|
13
|
-
}
|
|
14
|
-
get reason() {
|
|
15
|
-
return this.#reason;
|
|
16
|
-
}
|
|
17
|
-
get info() {
|
|
18
|
-
return this.#info;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
export class AbortRejection extends Rejection {
|
|
22
|
-
constructor(info){
|
|
23
|
-
super(1, info);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
export class ErrorRejection extends Error {
|
|
27
|
-
#info;
|
|
28
|
-
constructor(message, options = {}){
|
|
29
|
-
super(message, {
|
|
30
|
-
cause: options.cause
|
|
31
|
-
});
|
|
32
|
-
this.#info = options.info ?? {};
|
|
33
|
-
}
|
|
34
|
-
get reason() {
|
|
35
|
-
return 2;
|
|
36
|
-
}
|
|
37
|
-
get info() {
|
|
38
|
-
return this.#info;
|
|
39
|
-
}
|
|
40
|
-
}
|