@enkaku/server 0.6.4 → 0.8.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.
@@ -1,12 +1,12 @@
1
1
  import type { SignedToken } from '@enkaku/token';
2
- export type CommandAccessRecord = Record<string, boolean | Array<string>>;
3
- export type CommandAccessPayload = {
2
+ export type ProcedureAccessRecord = Record<string, boolean | Array<string>>;
3
+ export type ProcedureAccessPayload = {
4
4
  iss: string;
5
5
  sub?: string;
6
6
  aud?: string;
7
- cmd?: string;
7
+ prc?: string;
8
8
  exp?: number;
9
9
  };
10
- export declare function checkCommandAccess(serverID: string, record: CommandAccessRecord, token: SignedToken<CommandAccessPayload>, atTime?: number): Promise<void>;
11
- export declare function checkClientToken(serverID: string, record: CommandAccessRecord, token: SignedToken, atTime?: number): Promise<void>;
10
+ export declare function checkProcedureAccess(serverID: string, record: ProcedureAccessRecord, token: SignedToken<ProcedureAccessPayload>, atTime?: number): Promise<void>;
11
+ export declare function checkClientToken(serverID: string, record: ProcedureAccessRecord, token: SignedToken, atTime?: number): Promise<void>;
12
12
  //# sourceMappingURL=access-control.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"access-control.d.ts","sourceRoot":"","sources":["../src/access-control.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAEhD,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;AAEzE,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,WAAW,CAAC,oBAAoB,CAAC,EACxC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,WAAW,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
1
+ {"version":3,"file":"access-control.d.ts","sourceRoot":"","sources":["../src/access-control.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAEhD,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;AAE3E,MAAM,MAAM,sBAAsB,GAAG;IACnC,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,qBAAqB,EAC7B,KAAK,EAAE,WAAW,CAAC,sBAAsB,CAAC,EAC1C,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,qBAAqB,EAC7B,KAAK,EAAE,WAAW,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
@@ -1,13 +1,13 @@
1
1
  import { assertNonExpired, checkCapability, hasPartsMatch } from '@enkaku/capability';
2
- export async function checkCommandAccess(serverID, record, token, atTime) {
2
+ export async function checkProcedureAccess(serverID, record, token, atTime) {
3
3
  const payload = token.payload;
4
- if (payload.cmd == null) {
5
- throw new Error('No command to check');
4
+ if (payload.prc == null) {
5
+ throw new Error('No procedure to check');
6
6
  }
7
- for (const [command, access] of Object.entries(record)){
8
- if (hasPartsMatch(payload.cmd, command)) {
7
+ for (const [procedure, access] of Object.entries(record)){
8
+ if (hasPartsMatch(payload.prc, procedure)) {
9
9
  if (access === true) {
10
- // Command can be publicly accessed
10
+ // Procedure can be publicly accessed
11
11
  return;
12
12
  }
13
13
  if (access === false) {
@@ -23,7 +23,7 @@ export async function checkCommandAccess(serverID, record, token, atTime) {
23
23
  try {
24
24
  // Check delegation from subject
25
25
  await checkCapability({
26
- act: payload.cmd,
26
+ act: payload.prc,
27
27
  res: serverID
28
28
  }, payload, atTime);
29
29
  return;
@@ -34,9 +34,9 @@ export async function checkCommandAccess(serverID, record, token, atTime) {
34
34
  }
35
35
  export async function checkClientToken(serverID, record, token, atTime) {
36
36
  const payload = token.payload;
37
- const command = payload.cmd;
38
- if (command == null) {
39
- throw new Error('No command to check');
37
+ const procedure = payload.prc;
38
+ if (procedure == null) {
39
+ throw new Error('No procedure to check');
40
40
  }
41
41
  if (payload.iss === serverID) {
42
42
  // If issuer uses the server's signer, only check audience and expiration if provided
@@ -51,7 +51,7 @@ export async function checkClientToken(serverID, record, token, atTime) {
51
51
  if (payload.sub === serverID) {
52
52
  // If subject is the server, check capability directly
53
53
  await checkCapability({
54
- act: command,
54
+ act: procedure,
55
55
  res: serverID
56
56
  }, payload, atTime);
57
57
  return;
@@ -59,5 +59,5 @@ export async function checkClientToken(serverID, record, token, atTime) {
59
59
  if (payload.aud !== serverID) {
60
60
  throw new Error('Invalid audience');
61
61
  }
62
- await checkCommandAccess(serverID, record, token, atTime);
62
+ await checkProcedureAccess(serverID, record, token, atTime);
63
63
  }
@@ -1,6 +1,6 @@
1
- import type { AnyDefinitions, ChannelPayloadOf, ClientMessage } from '@enkaku/protocol';
1
+ import type { ChannelPayloadOf, ClientMessage, ProtocolDefinition } from '@enkaku/protocol';
2
2
  import { ErrorRejection } from '../rejections.js';
3
3
  import type { HandlerContext } from '../types.js';
4
- export type ChannelMessageOf<Definitions extends AnyDefinitions, Command extends keyof Definitions & string = keyof Definitions & string> = ClientMessage<ChannelPayloadOf<Command, Definitions[Command]>>;
5
- export declare function handleChannel<Definitions extends AnyDefinitions, Command extends keyof Definitions & string>(ctx: HandlerContext<Definitions>, msg: ChannelMessageOf<Definitions, Command>): ErrorRejection | Promise<void>;
4
+ 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>): ErrorRejection | Promise<void>;
6
6
  //# 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,EACV,cAAc,EAEd,gBAAgB,EAChB,aAAa,EACd,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAGV,cAAc,EAKf,MAAM,aAAa,CAAA;AAGpB,MAAM,MAAM,gBAAgB,CAC1B,WAAW,SAAS,cAAc,EAClC,OAAO,SAAS,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,WAAW,GAAG,MAAM,IACrE,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAElE,wBAAgB,aAAa,CAC3B,WAAW,SAAS,cAAc,EAClC,OAAO,SAAS,MAAM,WAAW,GAAG,MAAM,EAE1C,GAAG,EAAE,cAAc,CAAC,WAAW,CAAC,EAChC,GAAG,EAAE,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,GAC1C,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA2ChC"}
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,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,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,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAwChC"}
@@ -2,9 +2,9 @@ import { createPipe } from '@enkaku/stream';
2
2
  import { ErrorRejection } from '../rejections.js';
3
3
  import { consumeReader, executeHandler } from '../utils.js';
4
4
  export function handleChannel(ctx, msg) {
5
- const handler = ctx.handlers[msg.payload.cmd];
5
+ const handler = ctx.handlers[msg.payload.prc];
6
6
  if (handler == null) {
7
- return new ErrorRejection(`No handler for command: ${msg.payload.cmd}`, {
7
+ return new ErrorRejection(`No handler for procedure: ${msg.payload.prc}`, {
8
8
  info: msg.payload
9
9
  });
10
10
  }
@@ -17,7 +17,9 @@ export function handleChannel(ctx, msg) {
17
17
  });
18
18
  ctx.controllers[msg.payload.rid] = controller;
19
19
  const receiveStream = createPipe();
20
+ // @ts-ignore type instantiation too deep
20
21
  consumeReader({
22
+ // @ts-ignore type instantiation too deep
21
23
  onValue: async (val)=>{
22
24
  await ctx.send({
23
25
  typ: 'receive',
@@ -35,5 +37,6 @@ export function handleChannel(ctx, msg) {
35
37
  signal: controller.signal,
36
38
  writable: receiveStream.writable
37
39
  };
40
+ // @ts-ignore context and handler types
38
41
  return executeHandler(ctx, msg.payload, ()=>handler(handlerContext));
39
42
  }
@@ -1,6 +1,6 @@
1
- import type { AnyDefinitions, ClientMessage, EventPayloadOf } from '@enkaku/protocol';
1
+ import type { ClientMessage, EventPayloadOf, ProtocolDefinition } from '@enkaku/protocol';
2
2
  import { ErrorRejection } from '../rejections.js';
3
3
  import type { HandlerContext } from '../types.js';
4
- export type EventMessageOf<Definitions extends AnyDefinitions, Command extends keyof Definitions & string = keyof Definitions & string> = ClientMessage<EventPayloadOf<Command, Definitions[Command]>>;
5
- export declare function handleEvent<Definitions extends AnyDefinitions, Command extends keyof Definitions & string>(ctx: HandlerContext<Definitions>, msg: EventMessageOf<Definitions, Command>): ErrorRejection | Promise<void>;
4
+ 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>): ErrorRejection | Promise<void>;
6
6
  //# sourceMappingURL=event.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/handlers/event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAGrF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAoD,cAAc,EAAE,MAAM,aAAa,CAAA;AAEnG,MAAM,MAAM,cAAc,CACxB,WAAW,SAAS,cAAc,EAClC,OAAO,SAAS,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,WAAW,GAAG,MAAM,IACrE,aAAa,CAAC,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAEhE,wBAAgB,WAAW,CACzB,WAAW,SAAS,cAAc,EAClC,OAAO,SAAS,MAAM,WAAW,GAAG,MAAM,EAE1C,GAAG,EAAE,cAAc,CAAC,WAAW,CAAC,EAChC,GAAG,EAAE,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC,GACxC,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBhC"}
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/handlers/event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAGzF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,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,EAEzC,GAAG,EAAE,cAAc,CAAC,QAAQ,CAAC,EAC7B,GAAG,EAAE,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,GACvC,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBhC"}
@@ -1,9 +1,9 @@
1
1
  import { toPromise } from '@enkaku/util';
2
2
  import { ErrorRejection } from '../rejections.js';
3
3
  export function handleEvent(ctx, msg) {
4
- const handler = ctx.handlers[msg.payload.cmd];
4
+ const handler = ctx.handlers[msg.payload.prc];
5
5
  if (handler == null) {
6
- return new ErrorRejection(`No handler for command: ${msg.payload.cmd}`, {
6
+ return new ErrorRejection(`No handler for procedure: ${msg.payload.prc}`, {
7
7
  info: msg.payload
8
8
  });
9
9
  }
@@ -12,7 +12,7 @@ export function handleEvent(ctx, msg) {
12
12
  data: msg.payload.data
13
13
  };
14
14
  return toPromise(()=>handler(handlerContext)).catch((cause)=>{
15
- const err = new ErrorRejection(`Error handling command: ${msg.payload.cmd}`, {
15
+ const err = new ErrorRejection(`Error handling procedure: ${msg.payload.prc}`, {
16
16
  info: msg.payload,
17
17
  cause
18
18
  });
@@ -1,6 +1,6 @@
1
- import type { AnyDefinitions, ClientMessage, RequestPayloadOf } from '@enkaku/protocol';
1
+ import type { ClientMessage, ProtocolDefinition, RequestPayloadOf } from '@enkaku/protocol';
2
2
  import { ErrorRejection } from '../rejections.js';
3
3
  import type { HandlerContext } from '../types.js';
4
- export type RequestMessageOf<Definitions extends AnyDefinitions, Command extends keyof Definitions & string = keyof Definitions & string> = ClientMessage<RequestPayloadOf<Command, Definitions[Command]>>;
5
- export declare function handleRequest<Definitions extends AnyDefinitions, Command extends keyof Definitions & string>(ctx: HandlerContext<Definitions>, msg: RequestMessageOf<Definitions, Command>): ErrorRejection | Promise<void>;
4
+ 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>): ErrorRejection | Promise<void>;
6
6
  //# 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,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEvF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,cAAc,EAA0C,MAAM,aAAa,CAAA;AAGzF,MAAM,MAAM,gBAAgB,CAC1B,WAAW,SAAS,cAAc,EAClC,OAAO,SAAS,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,WAAW,GAAG,MAAM,IACrE,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAElE,wBAAgB,aAAa,CAC3B,WAAW,SAAS,cAAc,EAClC,OAAO,SAAS,MAAM,WAAW,GAAG,MAAM,EAE1C,GAAG,EAAE,cAAc,CAAC,WAAW,CAAC,EAChC,GAAG,EAAE,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,GAC1C,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBhC"}
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,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,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,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBhC"}
@@ -1,9 +1,9 @@
1
1
  import { ErrorRejection } from '../rejections.js';
2
2
  import { executeHandler } from '../utils.js';
3
3
  export function handleRequest(ctx, msg) {
4
- const handler = ctx.handlers[msg.payload.cmd];
4
+ const handler = ctx.handlers[msg.payload.prc];
5
5
  if (handler == null) {
6
- return new ErrorRejection(`No handler for command: ${msg.payload.cmd}`, {
6
+ return new ErrorRejection(`No handler for procedure: ${msg.payload.prc}`, {
7
7
  info: msg.payload
8
8
  });
9
9
  }
@@ -14,5 +14,6 @@ export function handleRequest(ctx, msg) {
14
14
  params: msg.payload.prm,
15
15
  signal: controller.signal
16
16
  };
17
+ // @ts-ignore context and handler types
17
18
  return executeHandler(ctx, msg.payload, ()=>handler(handlerContext));
18
19
  }
@@ -1,6 +1,6 @@
1
- import type { AnyDefinitions, ClientMessage, StreamPayloadOf } from '@enkaku/protocol';
1
+ import type { ClientMessage, ProtocolDefinition, StreamPayloadOf } from '@enkaku/protocol';
2
2
  import { ErrorRejection } from '../rejections.js';
3
3
  import type { HandlerContext } from '../types.js';
4
- export type StreamMessageOf<Definitions extends AnyDefinitions, Command extends keyof Definitions & string = keyof Definitions & string> = ClientMessage<StreamPayloadOf<Command, Definitions[Command]>>;
5
- export declare function handleStream<Definitions extends AnyDefinitions, Command extends keyof Definitions & string>(ctx: HandlerContext<Definitions>, msg: StreamMessageOf<Definitions, Command>): ErrorRejection | Promise<void>;
4
+ 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>): ErrorRejection | Promise<void>;
6
6
  //# 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,EACV,cAAc,EAEd,aAAa,EACb,eAAe,EAChB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EACV,cAAc,EAKf,MAAM,aAAa,CAAA;AAGpB,MAAM,MAAM,eAAe,CACzB,WAAW,SAAS,cAAc,EAClC,OAAO,SAAS,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,WAAW,GAAG,MAAM,IACrE,aAAa,CAAC,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAEjE,wBAAgB,YAAY,CAC1B,WAAW,SAAS,cAAc,EAClC,OAAO,SAAS,MAAM,WAAW,GAAG,MAAM,EAE1C,GAAG,EAAE,cAAc,CAAC,WAAW,CAAC,EAChC,GAAG,EAAE,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,GACzC,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAkChC"}
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,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,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,EAEzC,GAAG,EAAE,cAAc,CAAC,QAAQ,CAAC,EAC7B,GAAG,EAAE,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,GACxC,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAgChC"}
@@ -2,16 +2,18 @@ import { createPipe } from '@enkaku/stream';
2
2
  import { ErrorRejection } from '../rejections.js';
3
3
  import { consumeReader, executeHandler } from '../utils.js';
4
4
  export function handleStream(ctx, msg) {
5
- const handler = ctx.handlers[msg.payload.cmd];
5
+ const handler = ctx.handlers[msg.payload.prc];
6
6
  if (handler == null) {
7
- return new ErrorRejection(`No handler for command: ${msg.payload.cmd}`, {
7
+ return new ErrorRejection(`No handler for procedure: ${msg.payload.prc}`, {
8
8
  info: msg.payload
9
9
  });
10
10
  }
11
11
  const controller = new AbortController();
12
12
  ctx.controllers[msg.payload.rid] = controller;
13
13
  const receiveStream = createPipe();
14
+ // @ts-ignore type instantiation too deep
14
15
  consumeReader({
16
+ // @ts-ignore type instantiation too deep
15
17
  onValue: async (val)=>{
16
18
  await ctx.send({
17
19
  typ: 'receive',
@@ -28,5 +30,6 @@ export function handleStream(ctx, msg) {
28
30
  signal: controller.signal,
29
31
  writable: receiveStream.writable
30
32
  };
33
+ // @ts-ignore context and handler types
31
34
  return executeHandler(ctx, msg.payload, ()=>handler(handlerContext));
32
35
  }
package/lib/index.d.ts CHANGED
@@ -9,8 +9,8 @@
9
9
  *
10
10
  * @module server
11
11
  */
12
- export type { CommandAccessRecord } from './access-control.js';
13
- export type { RejectionType } from './rejections.js';
14
- export { type ServeParams, type Server, serve } from './server.js';
15
- export type { ChannelHandler, ChannelHandlerContext, CommandHandlers, EventHandler, EventHandlerContext, HandlerReturn, RequestHandler, RequestHandlerContext, StreamHandler, StreamHandlerContext, } from './types.js';
12
+ export type { ProcedureAccessRecord } from './access-control.js';
13
+ export { AbortRejection, ErrorRejection, type RejectionType } from './rejections.js';
14
+ 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';
16
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAC9D,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAClE,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,oBAAoB,GACrB,MAAM,YAAY,CAAA"}
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,cAAc,EAAE,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpF,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,oBAAoB,GACrB,MAAM,YAAY,CAAA"}
package/lib/index.js CHANGED
@@ -8,4 +8,5 @@
8
8
  * ```
9
9
  *
10
10
  * @module server
11
- */ export { serve } from './server.js';
11
+ */ export { AbortRejection, ErrorRejection } from './rejections.js';
12
+ export { Server, serve } from './server.js';
package/lib/server.d.ts CHANGED
@@ -1,34 +1,48 @@
1
- import type { AnyDefinitions, ServerTransportOf } from '@enkaku/protocol';
1
+ import { type AnyClientMessageOf, type ProtocolDefinition, type ServerTransportOf } from '@enkaku/protocol';
2
+ import { type Validator } from '@enkaku/schema';
2
3
  import { type Disposer } from '@enkaku/util';
3
- import { type CommandAccessRecord } from './access-control.js';
4
+ import { type ProcedureAccessRecord } from './access-control.js';
4
5
  import { type RejectionType } from './rejections.js';
5
- import type { CommandHandlers, HandlerController } from './types.js';
6
- export type HandleMessagesParams<Definitions extends AnyDefinitions> = {
7
- controllers: Record<string, HandlerController>;
8
- handlers: CommandHandlers<Definitions>;
9
- reject: (rejection: RejectionType) => void;
10
- signal: AbortSignal;
11
- transport: ServerTransportOf<Definitions>;
12
- } & ({
13
- insecure: true;
6
+ import type { ProcedureHandlers } from './types.js';
7
+ export type AccessControlParams = {
8
+ public: true;
9
+ serverID?: string;
10
+ access?: ProcedureAccessRecord;
14
11
  } | {
15
- insecure: false;
12
+ public: false;
16
13
  serverID: string;
17
- access: CommandAccessRecord;
18
- });
19
- export type ServeParams<Definitions extends AnyDefinitions> = {
20
- handlers: CommandHandlers<Definitions>;
14
+ access: ProcedureAccessRecord;
15
+ };
16
+ export type HandleMessagesParams<Protocol extends ProtocolDefinition> = AccessControlParams & {
17
+ handlers: ProcedureHandlers<Protocol>;
18
+ reject: (rejection: RejectionType) => void;
19
+ signal: AbortSignal;
20
+ transport: ServerTransportOf<Protocol>;
21
+ validator?: Validator<AnyClientMessageOf<Protocol>>;
22
+ };
23
+ export type ServerParams<Protocol extends ProtocolDefinition> = {
24
+ access?: ProcedureAccessRecord;
25
+ handlers: ProcedureHandlers<Protocol>;
26
+ id?: string;
27
+ protocol?: Protocol;
28
+ public?: boolean;
21
29
  signal?: AbortSignal;
22
- transport: ServerTransportOf<Definitions>;
23
- } & ({
24
- insecure: true;
25
- } | {
26
- insecure?: false;
27
- id: string;
28
- access?: CommandAccessRecord;
29
- });
30
- export type Server = Disposer & {
31
- rejections: ReadableStream<RejectionType>;
30
+ transports?: Array<ServerTransportOf<Protocol>>;
31
+ };
32
+ export type HandleOptions = {
33
+ public?: boolean;
34
+ access?: ProcedureAccessRecord;
35
+ };
36
+ export declare class Server<Protocol extends ProtocolDefinition> implements Disposer {
37
+ #private;
38
+ constructor(params: ServerParams<Protocol>);
39
+ get disposed(): Promise<void>;
40
+ get rejections(): ReadableStream<RejectionType>;
41
+ dispose(): Promise<void>;
42
+ handle(transport: ServerTransportOf<Protocol>, options?: HandleOptions): Promise<void>;
43
+ }
44
+ export type ServeParams<Protocol extends ProtocolDefinition> = Omit<ServerParams<Protocol>, 'transports'> & {
45
+ transport: ServerTransportOf<Protocol>;
32
46
  };
33
- export declare function serve<Definitions extends AnyDefinitions>(params: ServeParams<Definitions>): Server;
47
+ export declare function serve<Protocol extends ProtocolDefinition>(params: ServeParams<Protocol>): Server<Protocol>;
34
48
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAsB,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAG7F,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,cAAc,CAAA;AAE5D,OAAO,EAAE,KAAK,mBAAmB,EAAoB,MAAM,qBAAqB,CAAA;AAKhF,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpE,OAAO,KAAK,EAEV,eAAe,EAEf,iBAAiB,EAClB,MAAM,YAAY,CAAA;AAQnB,MAAM,MAAM,oBAAoB,CAAC,WAAW,SAAS,cAAc,IAAI;IACrE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;IAC9C,QAAQ,EAAE,eAAe,CAAC,WAAW,CAAC,CAAA;IACtC,MAAM,EAAE,CAAC,SAAS,EAAE,aAAa,KAAK,IAAI,CAAA;IAC1C,MAAM,EAAE,WAAW,CAAA;IACnB,SAAS,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAA;CAC1C,GAAG,CAAC;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAAA;AAwH7F,MAAM,MAAM,WAAW,CAAC,WAAW,SAAS,cAAc,IAAI;IAC5D,QAAQ,EAAE,eAAe,CAAC,WAAW,CAAC,CAAA;IACtC,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,SAAS,EAAE,iBAAiB,CAAC,WAAW,CAAC,CAAA;CAC1C,GAAG,CAAC;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAAA;AAEzF,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG;IAC9B,UAAU,EAAE,cAAc,CAAC,aAAa,CAAC,CAAA;CAC1C,CAAA;AAED,wBAAgB,KAAK,CAAC,WAAW,SAAS,cAAc,EACtD,MAAM,EAAE,WAAW,CAAC,WAAW,CAAC,GAC/B,MAAM,CAiCR"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAEvB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAEvB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,KAAK,SAAS,EAAmB,MAAM,gBAAgB,CAAA;AAGhE,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,cAAc,CAAA;AAE5D,OAAO,EAAE,KAAK,qBAAqB,EAAoB,MAAM,qBAAqB,CAAA;AAKlF,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpE,OAAO,KAAK,EAIV,iBAAiB,EAClB,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,QAAQ,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IACrC,MAAM,EAAE,CAAC,SAAS,EAAE,aAAa,KAAK,IAAI,CAAA;IAC1C,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;AA8ID,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,YAAW,QAAQ;;gBAU9D,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC;IAqD1C,IAAI,QAAQ,kBAEX;IAED,IAAI,UAAU,kCAEb;IAEK,OAAO;IAIb,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,3 +1,5 @@
1
+ import { createClientMessageSchema } from '@enkaku/protocol';
2
+ import { createValidator } from '@enkaku/schema';
1
3
  import { createPipe } from '@enkaku/stream';
2
4
  import { createUnsignedToken, isSignedToken } from '@enkaku/token';
3
5
  import { createDisposer } from '@enkaku/util';
@@ -8,7 +10,8 @@ import { handleRequest } from './handlers/request.js';
8
10
  import { handleStream } from './handlers/stream.js';
9
11
  import { ErrorRejection } from './rejections.js';
10
12
  async function handleMessages(params) {
11
- const { controllers, handlers, reject, signal, transport } = params;
13
+ const { handlers, reject, signal, transport, validator } = params;
14
+ const controllers = Object.create(null);
12
15
  const context = {
13
16
  controllers,
14
17
  handlers,
@@ -24,6 +27,18 @@ async function handleMessages(params) {
24
27
  // Wait until all running handlers are done
25
28
  await Promise.all(Object.values(running));
26
29
  }, signal);
30
+ const processMessage = validator ? (message)=>{
31
+ const result = validator(message);
32
+ if (result.isError()) {
33
+ reject(new ErrorRejection('Invalid protocol message', {
34
+ cause: result.error,
35
+ info: {
36
+ message
37
+ }
38
+ }));
39
+ }
40
+ return result.value;
41
+ } : (message)=>message;
27
42
  function processHandler(message, handle) {
28
43
  const returned = handle();
29
44
  if (returned instanceof ErrorRejection) {
@@ -36,9 +51,9 @@ async function handleMessages(params) {
36
51
  });
37
52
  }
38
53
  }
39
- const process = params.insecure ? processHandler : async (message, handle)=>{
54
+ const process = params.public ? processHandler : async (message, handle)=>{
40
55
  try {
41
- if (!params.insecure) {
56
+ if (!params.public) {
42
57
  if (!isSignedToken(message)) {
43
58
  throw new Error('Message is not signed');
44
59
  }
@@ -69,81 +84,155 @@ async function handleMessages(params) {
69
84
  await disposer.dispose();
70
85
  return;
71
86
  }
72
- const msg = next.value;
73
- switch(msg.payload.typ){
74
- case 'abort':
75
- controllers[msg.payload.rid]?.abort();
76
- break;
77
- case 'channel':
78
- {
79
- const message = msg;
80
- process(message, ()=>handleChannel(context, message));
81
- break;
82
- }
83
- case 'event':
84
- {
85
- const message = msg;
86
- process(message, ()=>handleEvent(context, message));
87
- break;
88
- }
89
- case 'request':
90
- {
91
- const message = msg;
92
- process(message, ()=>handleRequest(context, message));
93
- break;
94
- }
95
- case 'send':
96
- {
97
- const controller = controllers[msg.payload.rid];
98
- controller?.writer.write(msg.payload.val);
87
+ const msg = processMessage(next.value);
88
+ if (msg != null) {
89
+ switch(msg.payload.typ){
90
+ case 'abort':
91
+ controllers[msg.payload.rid]?.abort();
99
92
  break;
100
- }
101
- case 'stream':
102
- {
103
- const message = msg;
104
- process(message, ()=>handleStream(context, message));
105
- break;
106
- }
93
+ case 'channel':
94
+ {
95
+ const message = msg;
96
+ // @ts-ignore type instantiation too deep
97
+ process(message, ()=>handleChannel(context, message));
98
+ break;
99
+ }
100
+ case 'event':
101
+ {
102
+ const message = msg;
103
+ process(message, ()=>handleEvent(context, message));
104
+ break;
105
+ }
106
+ case 'request':
107
+ {
108
+ const message = msg;
109
+ process(message, ()=>handleRequest(context, message));
110
+ break;
111
+ }
112
+ case 'send':
113
+ {
114
+ const controller = controllers[msg.payload.rid];
115
+ controller?.writer.write(msg.payload.val);
116
+ break;
117
+ }
118
+ case 'stream':
119
+ {
120
+ const message = msg;
121
+ process(message, ()=>handleStream(context, message));
122
+ break;
123
+ }
124
+ }
107
125
  }
108
126
  handleNext();
109
127
  }
110
128
  handleNext();
111
129
  return disposer.disposed;
112
130
  }
113
- export function serve(params) {
114
- const abortController = new AbortController();
115
- const controllers = Object.create(null);
116
- const rejections = createPipe();
117
- const rejectionsWriter = rejections.writable.getWriter();
118
- function reject(rejection) {
119
- void rejectionsWriter.write(rejection);
131
+ export class Server {
132
+ #abortController;
133
+ #accessControl;
134
+ #disposer;
135
+ #handlers;
136
+ #handling = [];
137
+ #reject;
138
+ #rejections;
139
+ #validator;
140
+ constructor(params){
141
+ this.#abortController = new AbortController();
142
+ this.#handlers = params.handlers;
143
+ if (params.id == null) {
144
+ if (params.public) {
145
+ this.#accessControl = {
146
+ public: true,
147
+ access: params.access
148
+ };
149
+ } else {
150
+ throw new Error('Invalid server parameters: either the server "id" must be provided or the "public" parameter must be set to true');
151
+ }
152
+ } else {
153
+ this.#accessControl = {
154
+ public: !!params.public,
155
+ serverID: params.id,
156
+ access: params.access ?? {}
157
+ };
158
+ }
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
+ if (params.protocol != null) {
180
+ this.#validator = createValidator(createClientMessageSchema(params.protocol));
181
+ }
182
+ for (const transport of params.transports ?? []){
183
+ this.handle(transport);
184
+ }
120
185
  }
121
- const handlersDone = handleMessages({
122
- controllers,
123
- handlers: params.handlers,
124
- reject,
125
- signal: abortController.signal,
126
- transport: params.transport,
127
- ...params.insecure ? {
128
- insecure: true
129
- } : {
130
- insecure: false,
131
- serverID: params.id,
132
- access: params.access ?? {}
186
+ get disposed() {
187
+ return this.#disposer.disposed;
188
+ }
189
+ get rejections() {
190
+ return this.#rejections;
191
+ }
192
+ async dispose() {
193
+ return await this.#disposer.dispose();
194
+ }
195
+ handle(transport, options = {}) {
196
+ const publicAccess = options.public ?? this.#accessControl.public;
197
+ const access = options.access ?? this.#accessControl.access ?? {};
198
+ let accessControl;
199
+ if (publicAccess) {
200
+ accessControl = {
201
+ public: true,
202
+ access
203
+ };
204
+ } else {
205
+ const serverID = this.#accessControl.serverID;
206
+ if (serverID == null) {
207
+ return Promise.reject(new Error('Server ID is required to enable access control'));
208
+ }
209
+ accessControl = {
210
+ public: false,
211
+ serverID,
212
+ access
213
+ };
133
214
  }
215
+ const done = handleMessages({
216
+ handlers: this.#handlers,
217
+ reject: this.#reject,
218
+ signal: this.#abortController.signal,
219
+ transport,
220
+ validator: this.#validator,
221
+ ...accessControl
222
+ });
223
+ this.#handling.push({
224
+ done,
225
+ transport
226
+ });
227
+ return done;
228
+ }
229
+ }
230
+ export function serve(params) {
231
+ const { transport, ...rest } = params;
232
+ return new Server({
233
+ ...rest,
234
+ transports: [
235
+ transport
236
+ ]
134
237
  });
135
- const disposer = createDisposer(async ()=>{
136
- // Signal messages handler to stop execution and run cleanup logic
137
- abortController.abort();
138
- // Wait until all handlers are done - they might still need to flush messages to the transport
139
- await handlersDone;
140
- // Dispose transport
141
- await params.transport.dispose();
142
- // Cleanup rejections writer
143
- await rejectionsWriter.close();
144
- }, params.signal);
145
- return {
146
- ...disposer,
147
- rejections: rejections.readable
148
- };
149
238
  }
package/lib/types.d.ts CHANGED
@@ -1,42 +1,42 @@
1
- import type { AnyDefinitions, AnyServerPayloadOf, ChannelDefinition, EventCallPayload, EventDefinition, Message, RequestCallPayload, RequestDefinition, RequestType, StreamDefinition } from '@enkaku/protocol';
1
+ import type { AnyRequestProcedureDefinition, AnyServerPayloadOf, ChannelProcedureDefinition, DataOf, EventCallPayload, EventProcedureDefinition, Message, ProtocolDefinition, RequestCallPayload, RequestProcedureDefinition, StreamProcedureDefinition } from '@enkaku/protocol';
2
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>;
6
6
  };
7
7
  export type HandlerController<Send = unknown> = RequestController | ChannelController<Send>;
8
- export type EventHandlerContext<Command extends string, Data extends Record<string, unknown> | undefined> = {
9
- message: Message<EventCallPayload<Command, Data>>;
10
- data: Data;
11
- };
12
- export type EventHandler<Command extends string, Data extends Record<string, unknown> | undefined> = (context: EventHandlerContext<Command, Data>) => void | Promise<void>;
13
- export type RequestHandlerContext<Type extends RequestType, Command extends string, Params> = {
14
- message: Message<RequestCallPayload<Type, Command, Params>>;
15
- params: Params;
8
+ export type EventHandlerContext<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string> = Protocol[Procedure] extends EventProcedureDefinition ? {
9
+ message: Message<EventCallPayload<Procedure, DataOf<Protocol[Procedure]['data']>>>;
10
+ data: DataOf<Protocol[Procedure]['data']>;
11
+ } : never;
12
+ export type EventHandler<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string> = (context: EventHandlerContext<Protocol, Procedure>) => void | Promise<void>;
13
+ export type RequestHandlerContext<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string> = Protocol[Procedure] extends AnyRequestProcedureDefinition ? {
14
+ message: Message<RequestCallPayload<Protocol[Procedure]['type'], Procedure, DataOf<Protocol[Procedure]['params']>>>;
15
+ params: DataOf<Protocol[Procedure]['params']>;
16
16
  signal: AbortSignal;
17
+ } : never;
18
+ export type HandlerReturn<ResultSchema, Data = DataOf<ResultSchema>> = Data | Promise<Data>;
19
+ export type RequestHandler<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string> = Protocol[Procedure] extends AnyRequestProcedureDefinition ? (context: RequestHandlerContext<Protocol, Procedure>) => HandlerReturn<Protocol[Procedure]['result']> : never;
20
+ export type StreamHandlerContext<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string> = Protocol[Procedure] extends StreamProcedureDefinition | ChannelProcedureDefinition ? RequestHandlerContext<Protocol, Procedure> & {
21
+ writable: WritableStream<DataOf<Protocol[Procedure]['receive']>>;
22
+ } : never;
23
+ export type StreamHandler<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string> = Protocol[Procedure] extends StreamProcedureDefinition | ChannelProcedureDefinition ? (context: StreamHandlerContext<Protocol, Procedure>) => HandlerReturn<Protocol[Procedure]['result']> : never;
24
+ export type ChannelHandlerContext<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string> = Protocol[Procedure] extends ChannelProcedureDefinition ? StreamHandlerContext<Protocol, Procedure> & {
25
+ readable: ReadableStream<DataOf<Protocol[Procedure]['send']>>;
26
+ } : never;
27
+ export type ChannelHandler<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string> = Protocol[Procedure] extends ChannelProcedureDefinition ? (context: ChannelHandlerContext<Protocol, Procedure>) => HandlerReturn<Protocol[Procedure]['result']> : never;
28
+ export type ProcedureHandlers<Protocol extends ProtocolDefinition> = {
29
+ [Procedure in keyof Protocol & string]: Protocol[Procedure] extends EventProcedureDefinition ? (context: EventHandlerContext<Protocol, Procedure>) => void : Protocol[Procedure] extends RequestProcedureDefinition ? (context: RequestHandlerContext<Protocol, Procedure>) => HandlerReturn<Protocol[Procedure]['result']> : Protocol[Procedure] extends StreamProcedureDefinition ? (context: StreamHandlerContext<Protocol, Procedure>) => HandlerReturn<Protocol[Procedure]['result']> : Protocol[Procedure] extends ChannelProcedureDefinition ? (context: ChannelHandlerContext<Protocol, Procedure>) => HandlerReturn<Protocol[Procedure]['result']> : never;
17
30
  };
18
- export type HandlerReturn<Result> = Result | Promise<Result>;
19
- export type RequestHandler<Command extends string, Params, Result> = (context: RequestHandlerContext<'request', Command, Params>) => HandlerReturn<Result>;
20
- export type StreamHandlerContext<Type extends Exclude<RequestType, 'request'>, Command extends string, Params, Receive> = RequestHandlerContext<Type, Command, Params> & {
21
- writable: WritableStream<Receive>;
22
- };
23
- export type StreamHandler<Command extends string, Params, Receive, Result> = (context: StreamHandlerContext<'stream', Command, Params, Receive>) => HandlerReturn<Result>;
24
- export type ChannelHandlerContext<Command extends string, Params, Sent, Receive> = StreamHandlerContext<'channel', Command, Params, Receive> & {
25
- readable: ReadableStream<Sent>;
26
- };
27
- export type ChannelHandler<Command extends string, Params, Sent, Receive, Result> = (context: ChannelHandlerContext<Command, Params, Sent, Receive>) => HandlerReturn<Result>;
28
- export type CommandHandlers<Definitions extends AnyDefinitions> = {
29
- [Command in keyof Definitions & string]: Definitions[Command] extends EventDefinition<infer Data> ? (context: EventHandlerContext<Command, Data>) => void : Definitions[Command] extends RequestDefinition<infer Params, infer Result> ? (context: RequestHandlerContext<'request', Command, Params>) => HandlerReturn<Result> : Definitions[Command] extends StreamDefinition<infer Params, infer Receive, infer Result> ? (context: StreamHandlerContext<'stream', Command, Params, Receive>) => HandlerReturn<Result> : Definitions[Command] extends ChannelDefinition<infer Params, infer Send, infer Receive, infer Result> ? (context: ChannelHandlerContext<Command, Params, Send, Receive>) => HandlerReturn<Result> : never;
30
- };
31
- export type EventDataType<Definitions extends AnyDefinitions, Command extends keyof Definitions & string> = Definitions[Command] extends EventDefinition<infer Data> ? Data : never;
32
- export type ParamsType<Definitions extends AnyDefinitions, Command extends keyof Definitions & string> = Definitions[Command] extends RequestDefinition<infer Params> ? Params : Definitions[Command] extends StreamDefinition<infer Params> ? Params : Definitions[Command] extends ChannelDefinition<infer Params> ? Params : never;
33
- export type ReceiveType<Definitions extends AnyDefinitions, Command extends keyof Definitions & string> = Definitions[Command] extends StreamDefinition<infer Params, infer Receive> ? Receive : Definitions[Command] extends ChannelDefinition<infer Params, infer Send, infer Receive> ? Receive : never;
34
- export type ResultType<Definitions extends AnyDefinitions, Command extends keyof Definitions & string> = Definitions[Command] extends RequestDefinition<infer Params, infer Result> ? Result : Definitions[Command] extends StreamDefinition<infer Params, infer Receive, infer Result> ? Result : Definitions[Command] extends ChannelDefinition<infer Params, infer Send, infer Receive, infer Result> ? Result : never;
35
- export type SendType<Definitions extends AnyDefinitions, Command extends keyof Definitions & string> = Definitions[Command] extends ChannelDefinition<infer Params, infer Send> ? Send : never;
36
- export type HandlerContext<Definitions extends AnyDefinitions> = {
31
+ export type EventDataType<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string> = Protocol[Procedure] extends EventProcedureDefinition ? DataOf<Protocol[Procedure]['data']> : never;
32
+ export type ParamsType<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string> = Protocol[Procedure] extends AnyRequestProcedureDefinition ? DataOf<Protocol[Procedure]['params']> : never;
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
+ export type ResultType<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string> = Protocol[Procedure] extends AnyRequestProcedureDefinition ? DataOf<Protocol[Procedure]['result']> : never;
35
+ export type SendType<Protocol extends ProtocolDefinition, Procedure extends keyof Protocol & string> = Protocol[Procedure] extends ChannelProcedureDefinition ? DataOf<Protocol[Procedure]['send']> : never;
36
+ export type HandlerContext<Protocol extends ProtocolDefinition> = {
37
37
  controllers: Record<string, HandlerController>;
38
- handlers: CommandHandlers<Definitions>;
38
+ handlers: ProcedureHandlers<Protocol>;
39
39
  reject: (rejection: RejectionType) => void;
40
- send: (payload: AnyServerPayloadOf<Definitions>) => Promise<void>;
40
+ send: (payload: AnyServerPayloadOf<Protocol>) => Promise<void>;
41
41
  };
42
42
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
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,5 +1,5 @@
1
- import type { AnyDefinitions, RequestCallPayload, RequestType } from '@enkaku/protocol';
2
- import type { HandlerContext, ParamsType, ResultType } from './types.js';
1
+ import type { ProtocolDefinition, RequestPayloadOf } from '@enkaku/protocol';
2
+ import type { HandlerContext, ResultType } from './types.js';
3
3
  export type ConsumeReaderParams<T> = {
4
4
  onDone?: () => void;
5
5
  onValue: (value: T) => Promise<void>;
@@ -7,5 +7,5 @@ export type ConsumeReaderParams<T> = {
7
7
  signal: AbortSignal;
8
8
  };
9
9
  export declare function consumeReader<T>(params: ConsumeReaderParams<T>): Promise<void>;
10
- export declare function executeHandler<Definitions extends AnyDefinitions, Command extends keyof Definitions & string, Result extends ResultType<Definitions, Command> = ResultType<Definitions, Command>>(context: HandlerContext<Definitions>, payload: RequestCallPayload<RequestType, Command, ParamsType<Definitions, Command>>, execute: () => Result | Promise<Result>): Promise<void>;
10
+ 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
11
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEd,kBAAkB,EAClB,WAAW,EACZ,MAAM,kBAAkB,CAAA;AAKzB,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAExE,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI;IACnC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,MAAM,EAAE,2BAA2B,CAAC,CAAC,CAAC,CAAA;IACtC,MAAM,EAAE,WAAW,CAAA;CACpB,CAAA;AAED,wBAAsB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBpF;AAED,wBAAsB,cAAc,CAClC,WAAW,SAAS,cAAc,EAClC,OAAO,SAAS,MAAM,WAAW,GAAG,MAAM,EAC1C,MAAM,SAAS,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,EAElF,OAAO,EAAE,cAAc,CAAC,WAAW,CAAC,EACpC,OAAO,EAAE,kBAAkB,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,EACnF,OAAO,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC,CA2Bf"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAsB,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAKhG,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5D,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI;IACnC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,MAAM,EAAE,2BAA2B,CAAC,CAAC,CAAC,CAAA;IACtC,MAAM,EAAE,WAAW,CAAA;CACpB,CAAA;AAED,wBAAsB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBpF;AAGD,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,CA2Bf"}
package/lib/utils.js CHANGED
@@ -19,6 +19,7 @@ export async function consumeReader(params) {
19
19
  }
20
20
  handle();
21
21
  }
22
+ // @ts-ignore type instantiation too deep
22
23
  export async function executeHandler(context, payload, execute) {
23
24
  const controller = context.controllers[payload.rid];
24
25
  try {
@@ -37,7 +38,7 @@ export async function executeHandler(context, payload, execute) {
37
38
  message: cause.message ?? 'Handler execution failed'
38
39
  }).toPayload(payload.rid));
39
40
  }
40
- context.reject(new ErrorRejection(`Error handling command: ${payload.cmd}`, {
41
+ context.reject(new ErrorRejection(`Error handling procedure: ${payload.prc}`, {
41
42
  info: payload,
42
43
  cause
43
44
  }));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@enkaku/server",
3
- "version": "0.6.4",
3
+ "version": "0.8.0",
4
4
  "license": "MIT",
5
5
  "homepage": "https://enkaku.dev",
6
6
  "description": "Server logic for Enkaku RPC",
@@ -25,20 +25,21 @@
25
25
  ],
26
26
  "sideEffects": false,
27
27
  "dependencies": {
28
- "@enkaku/token": "^0.6.4",
29
- "@enkaku/capability": "^0.6.1",
30
- "@enkaku/util": "^0.6.1",
31
- "@enkaku/stream": "^0.6.1"
28
+ "@enkaku/capability": "^0.8.0",
29
+ "@enkaku/schema": "^0.8.0",
30
+ "@enkaku/stream": "^0.8.0",
31
+ "@enkaku/token": "^0.8.0",
32
+ "@enkaku/util": "^0.8.0",
33
+ "@enkaku/protocol": "^0.8.0"
32
34
  },
33
35
  "devDependencies": {
34
- "@enkaku/transport": "^0.6.1",
35
- "@enkaku/protocol": "^0.6.4"
36
+ "@enkaku/transport": "^0.8.0"
36
37
  },
37
38
  "scripts": {
38
39
  "build:clean": "del lib",
39
40
  "build:js": "swc src -d ./lib --config-file ../../swc.json --strip-leading-paths",
40
41
  "build:types": "tsc --emitDeclarationOnly --skipLibCheck",
41
- "build:types:ci": "tsc --emitDeclarationOnly --declarationMap false",
42
+ "build:types:ci": "tsc --emitDeclarationOnly --skipLibCheck --declarationMap false",
42
43
  "build": "pnpm run build:clean && pnpm run build:js && pnpm run build:types",
43
44
  "test:types": "tsc --noEmit --skipLibCheck",
44
45
  "test:unit": "node --experimental-vm-modules ../../node_modules/jest/bin/jest.js",