@nmtjs/protocol 0.15.0-beta.8 → 0.15.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.
Files changed (47) hide show
  1. package/README.md +31 -1
  2. package/dist/client/index.js +5 -5
  3. package/dist/client/protocol.d.ts +11 -2
  4. package/dist/client/protocol.js +1 -1
  5. package/dist/client/protocol.js.map +1 -1
  6. package/dist/client/stream.js +9 -18
  7. package/dist/client/stream.js.map +1 -1
  8. package/dist/client/versions/v1.d.ts +67 -36
  9. package/dist/client/versions/v1.js +18 -6
  10. package/dist/client/versions/v1.js.map +1 -1
  11. package/dist/common/binary.d.ts +3 -5
  12. package/dist/common/binary.js.map +1 -1
  13. package/dist/common/blob.d.ts +3 -3
  14. package/dist/common/blob.js +3 -3
  15. package/dist/common/blob.js.map +1 -1
  16. package/dist/common/enums.d.ts +4 -1
  17. package/dist/common/enums.js +16 -7
  18. package/dist/common/enums.js.map +1 -1
  19. package/dist/common/index.js +6 -6
  20. package/dist/common/utils.js +1 -1
  21. package/dist/common/utils.js.map +1 -1
  22. package/dist/server/format.d.ts +5 -3
  23. package/dist/server/format.js +2 -0
  24. package/dist/server/format.js.map +1 -1
  25. package/dist/server/index.js +7 -7
  26. package/dist/server/protocol.d.ts +12 -3
  27. package/dist/server/protocol.js +1 -1
  28. package/dist/server/protocol.js.map +1 -1
  29. package/dist/server/stream.d.ts +3 -0
  30. package/dist/server/stream.js +20 -1
  31. package/dist/server/stream.js.map +1 -1
  32. package/dist/server/utils.js +4 -4
  33. package/dist/server/utils.js.map +1 -1
  34. package/dist/server/versions/v1.d.ts +45 -28
  35. package/dist/server/versions/v1.js +19 -7
  36. package/dist/server/versions/v1.js.map +1 -1
  37. package/package.json +26 -16
  38. package/src/client/protocol.ts +4 -1
  39. package/src/client/stream.ts +8 -19
  40. package/src/client/versions/v1.ts +20 -5
  41. package/src/common/blob.ts +4 -9
  42. package/src/common/enums.ts +6 -1
  43. package/src/server/format.ts +7 -3
  44. package/src/server/protocol.ts +4 -1
  45. package/src/server/stream.ts +22 -1
  46. package/src/server/utils.ts +5 -5
  47. package/src/server/versions/v1.ts +24 -4
@@ -1,6 +1,7 @@
1
1
  import type { Pattern } from '@nmtjs/common'
2
2
  import { match } from '@nmtjs/common'
3
3
 
4
+ import type { ProtocolBlobMetadata } from '../common/blob.ts'
4
5
  import type {
5
6
  DecodeRPCContext,
6
7
  EncodeRPCStreams,
@@ -21,7 +22,7 @@ export interface BaseServerEncoder {
21
22
  contentType: string
22
23
  encode(data: unknown): ArrayBufferView
23
24
  encodeRPC(data: unknown, streams: EncodeRPCStreams): ArrayBufferView
24
- encodeBlob(streamId: number): unknown
25
+ encodeBlob(streamId: number, metadata: ProtocolBlobMetadata): unknown
25
26
  }
26
27
 
27
28
  export abstract class BaseServerFormat
@@ -32,7 +33,7 @@ export abstract class BaseServerFormat
32
33
 
33
34
  abstract encode(data: unknown): ArrayBufferView
34
35
  abstract encodeRPC(data: unknown, streams: EncodeRPCStreams): ArrayBufferView
35
- abstract encodeBlob(streamId: number): unknown
36
+ abstract encodeBlob(streamId: number, metadata: ProtocolBlobMetadata): unknown
36
37
  abstract decode(buffer: ArrayBufferView): any
37
38
  abstract decodeRPC(
38
39
  buffer: ArrayBufferView,
@@ -74,7 +75,10 @@ export class ProtocolFormats {
74
75
  decoders = new Map<Pattern, BaseServerDecoder>()
75
76
  encoders = new Map<Pattern, BaseServerEncoder>()
76
77
 
77
- constructor(formats: BaseServerFormat[]) {
78
+ default: BaseServerFormat
79
+
80
+ constructor(formats: [BaseServerFormat, ...BaseServerFormat[]]) {
81
+ this.default = formats[0]
78
82
  for (const format of formats) {
79
83
  this.encoders.set(format.contentType, format)
80
84
  for (const acceptType of format.accept) {
@@ -65,6 +65,8 @@ export type ServerMessageTypePayload = {
65
65
  [ServerMessageType.RpcStreamEnd]: { callId: number }
66
66
  [ServerMessageType.RpcStreamChunk]: { callId: number; chunk: ArrayBufferView }
67
67
  [ServerMessageType.RpcStreamResponse]: { callId: number }
68
+ [ServerMessageType.Pong]: { nonce: number }
69
+ [ServerMessageType.Ping]: { nonce: number }
68
70
  [ServerMessageType.ClientStreamAbort]: { streamId: number; reason?: string }
69
71
  [ServerMessageType.ClientStreamPull]: { streamId: number; size: number }
70
72
  [ServerMessageType.ServerStreamAbort]: { streamId: number; reason?: string }
@@ -84,8 +86,9 @@ export type ClientMessageTypePayload = {
84
86
  streams?: EncodeRPCStreams
85
87
  }
86
88
  }
87
- [ClientMessageType.RpcPull]: { callId: number }
88
89
  [ClientMessageType.RpcAbort]: { callId: number; reason?: string }
90
+ [ClientMessageType.Ping]: { nonce: number }
91
+ [ClientMessageType.Pong]: { nonce: number }
89
92
  [ClientMessageType.ClientStreamPush]: {
90
93
  streamId: number
91
94
  chunk: ArrayBufferView
@@ -28,6 +28,8 @@ export class ProtocolClientStream extends PassThrough {
28
28
  export class ProtocolServerStream extends PassThrough {
29
29
  public readonly id: number
30
30
  public readonly metadata: ProtocolBlobMetadata
31
+ readonly #source: Readable
32
+ #piped = false
31
33
 
32
34
  constructor(id: number, blob: ProtocolBlob) {
33
35
  let readable: Readable
@@ -43,9 +45,28 @@ export class ProtocolServerStream extends PassThrough {
43
45
  super()
44
46
 
45
47
  this.pause()
46
- readable.pipe(this)
48
+ this.#source = readable
49
+ this.#source.on('error', (error) => {
50
+ this.destroy(error)
51
+ })
47
52
 
48
53
  this.id = id
49
54
  this.metadata = blob.metadata
50
55
  }
56
+
57
+ override resume(): this {
58
+ if (!this.#piped) {
59
+ this.#piped = true
60
+ this.#source.pipe(this)
61
+ }
62
+ return super.resume()
63
+ }
64
+
65
+ override destroy(error?: Error | null) {
66
+ if (!this.#piped) {
67
+ this.#piped = true
68
+ }
69
+ this.#source.destroy?.(error ?? undefined)
70
+ return super.destroy(error ?? undefined)
71
+ }
51
72
  }
@@ -11,12 +11,12 @@ export const getFormat = (
11
11
  format: ProtocolFormats,
12
12
  { accept, contentType }: ResolveFormatParams,
13
13
  ) => {
14
- const encoder = contentType ? format.supportsEncoder(contentType) : undefined
15
- if (!encoder)
16
- throw new UnsupportedContentTypeError('Unsupported Content type')
14
+ const encoder = accept ? format.supportsEncoder(accept) : undefined
15
+ if (!encoder) throw new UnsupportedAcceptTypeError('Unsupported Accept type')
17
16
 
18
- const decoder = accept ? format.supportsDecoder(accept) : undefined
19
- if (!decoder) throw new UnsupportedAcceptTypeError('Unsupported Accept type')
17
+ const decoder = contentType ? format.supportsDecoder(contentType) : undefined
18
+ if (!decoder)
19
+ throw new UnsupportedContentTypeError('Unsupported Content type')
20
20
 
21
21
  return { encoder, decoder }
22
22
  }
@@ -38,10 +38,6 @@ export class ProtocolVersion1 extends ProtocolVersionInterface {
38
38
 
39
39
  return { type: messageType, rpc: { callId, procedure, payload } }
40
40
  }
41
- case ClientMessageType.RpcPull: {
42
- const callId = messagePayload.readUInt32LE(0)
43
- return { type: messageType, callId }
44
- }
45
41
  case ClientMessageType.RpcAbort: {
46
42
  const callId = messagePayload.readUInt32LE(0)
47
43
  const reasonPayload = messagePayload.subarray(MessageByteLength.CallId)
@@ -49,6 +45,14 @@ export class ProtocolVersion1 extends ProtocolVersionInterface {
49
45
  reasonPayload.byteLength > 0 ? decodeText(reasonPayload) : undefined
50
46
  return { type: messageType, callId, reason }
51
47
  }
48
+ case ClientMessageType.Ping: {
49
+ const nonce = messagePayload.readUInt32LE(0)
50
+ return { type: messageType, nonce }
51
+ }
52
+ case ClientMessageType.Pong: {
53
+ const nonce = messagePayload.readUInt32LE(0)
54
+ return { type: messageType, nonce }
55
+ }
52
56
  case ClientMessageType.ServerStreamAbort: {
53
57
  const streamId = messagePayload.readUInt32LE(0)
54
58
  const reasonPayload = messagePayload.subarray(
@@ -146,6 +150,22 @@ export class ProtocolVersion1 extends ProtocolVersionInterface {
146
150
  reason ? encodeText(reason) : Buffer.alloc(0),
147
151
  )
148
152
  }
153
+ case ServerMessageType.Pong: {
154
+ const { nonce } =
155
+ payload as ServerMessageTypePayload[ServerMessageType.Pong]
156
+ return this.encode(
157
+ encodeNumber(messageType, 'Uint8'),
158
+ encodeNumber(nonce, 'Uint32'),
159
+ )
160
+ }
161
+ case ServerMessageType.Ping: {
162
+ const { nonce } =
163
+ payload as ServerMessageTypePayload[ServerMessageType.Ping]
164
+ return this.encode(
165
+ encodeNumber(messageType, 'Uint8'),
166
+ encodeNumber(nonce, 'Uint32'),
167
+ )
168
+ }
149
169
  case ServerMessageType.ClientStreamPull: {
150
170
  const { size, streamId } =
151
171
  payload as ServerMessageTypePayload[ServerMessageType.ClientStreamPull]