nmtjs 0.16.0-beta.9 → 0.16.1

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 (161) hide show
  1. package/dist/cli.js +2 -1
  2. package/dist/cli.js.map +1 -1
  3. package/dist/entrypoints/worker.js +9 -9
  4. package/dist/entrypoints/worker.js.map +1 -1
  5. package/dist/index.d.ts +58 -15
  6. package/dist/index.js +5 -2
  7. package/dist/index.js.map +1 -1
  8. package/dist/runtime/application/index.d.ts +1 -5
  9. package/dist/runtime/application/index.js +1 -5
  10. package/dist/runtime/application/index.js.map +1 -1
  11. package/dist/runtime/enums.d.ts +1 -12
  12. package/dist/runtime/enums.js +1 -14
  13. package/dist/runtime/enums.js.map +1 -1
  14. package/dist/runtime/hooks.d.ts +1 -4
  15. package/dist/runtime/hooks.js +1 -3
  16. package/dist/runtime/hooks.js.map +1 -1
  17. package/dist/runtime/index.d.ts +1 -3
  18. package/dist/runtime/index.js +1 -3
  19. package/dist/runtime/index.js.map +1 -1
  20. package/dist/runtime/injectables.d.ts +48 -7
  21. package/dist/runtime/injectables.js +19 -3
  22. package/dist/runtime/injectables.js.map +1 -1
  23. package/dist/runtime/jobs/job.d.ts +1 -2
  24. package/dist/runtime/jobs/job.js.map +1 -1
  25. package/dist/runtime/jobs/router.d.ts +2 -5
  26. package/dist/runtime/jobs/router.js +2 -3
  27. package/dist/runtime/jobs/router.js.map +1 -1
  28. package/dist/runtime/jobs/runner.d.ts +1 -1
  29. package/dist/runtime/jobs/runner.js +1 -1
  30. package/dist/runtime/jobs/runner.js.map +1 -1
  31. package/dist/runtime/jobs/types.d.ts +1 -1
  32. package/dist/runtime/metrics/metric.d.ts +2 -2
  33. package/dist/runtime/metrics/metric.js +1 -1
  34. package/dist/runtime/metrics/metric.js.map +1 -1
  35. package/dist/runtime/metrics/registry.d.ts +3 -3
  36. package/dist/runtime/metrics/registry.js +1 -1
  37. package/dist/runtime/metrics/registry.js.map +1 -1
  38. package/dist/runtime/metrics/server.js +1 -1
  39. package/dist/runtime/metrics/server.js.map +1 -1
  40. package/dist/runtime/plugin.d.ts +2 -8
  41. package/dist/runtime/plugin.js +1 -3
  42. package/dist/runtime/plugin.js.map +1 -1
  43. package/dist/runtime/runtime.d.ts +2 -2
  44. package/dist/runtime/runtime.js +1 -2
  45. package/dist/runtime/runtime.js.map +1 -1
  46. package/dist/runtime/server/applications.js +3 -0
  47. package/dist/runtime/server/applications.js.map +1 -1
  48. package/dist/runtime/server/config.d.ts +15 -12
  49. package/dist/runtime/server/config.js.map +1 -1
  50. package/dist/runtime/server/jobs.d.ts +6 -7
  51. package/dist/runtime/server/jobs.js +44 -30
  52. package/dist/runtime/server/jobs.js.map +1 -1
  53. package/dist/runtime/subscription/manager.d.ts +3 -3
  54. package/dist/runtime/subscription/manager.js +8 -8
  55. package/dist/runtime/subscription/manager.js.map +1 -1
  56. package/dist/runtime/subscription/redis.d.ts +1 -1
  57. package/dist/runtime/subscription/redis.js +16 -17
  58. package/dist/runtime/subscription/redis.js.map +1 -1
  59. package/dist/runtime/types.d.ts +3 -11
  60. package/dist/runtime/workers/application.d.ts +15 -33
  61. package/dist/runtime/workers/application.js +46 -139
  62. package/dist/runtime/workers/application.js.map +1 -1
  63. package/dist/runtime/workers/base.d.ts +0 -2
  64. package/dist/runtime/workers/base.js +3 -8
  65. package/dist/runtime/workers/base.js.map +1 -1
  66. package/dist/runtime/workers/job.js +2 -1
  67. package/dist/runtime/workers/job.js.map +1 -1
  68. package/dist/vite/server.js +1 -1
  69. package/dist/vite/server.js.map +1 -1
  70. package/package.json +19 -14
  71. package/src/cli.ts +2 -3
  72. package/src/entrypoints/worker.ts +11 -9
  73. package/src/index.ts +12 -5
  74. package/src/runtime/application/index.ts +1 -5
  75. package/src/runtime/enums.ts +2 -14
  76. package/src/runtime/hooks.ts +1 -5
  77. package/src/runtime/index.ts +2 -3
  78. package/src/runtime/injectables.ts +35 -6
  79. package/src/runtime/jobs/job.ts +1 -2
  80. package/src/runtime/jobs/router.ts +12 -15
  81. package/src/runtime/jobs/runner.ts +2 -2
  82. package/src/runtime/jobs/types.ts +1 -1
  83. package/src/runtime/metrics/metric.ts +2 -2
  84. package/src/runtime/metrics/registry.ts +5 -1
  85. package/src/runtime/metrics/server.ts +1 -1
  86. package/src/runtime/plugin.ts +2 -13
  87. package/src/runtime/runtime.ts +2 -4
  88. package/src/runtime/server/applications.ts +6 -0
  89. package/src/runtime/server/config.ts +27 -21
  90. package/src/runtime/server/jobs.ts +58 -34
  91. package/src/runtime/subscription/manager.ts +11 -14
  92. package/src/runtime/subscription/redis.ts +25 -23
  93. package/src/runtime/types.ts +3 -12
  94. package/src/runtime/workers/application.ts +76 -160
  95. package/src/runtime/workers/base.ts +9 -15
  96. package/src/runtime/workers/job.ts +3 -6
  97. package/src/vite/server.ts +1 -1
  98. package/dist/runtime/application/api/api.d.ts +0 -55
  99. package/dist/runtime/application/api/api.js +0 -252
  100. package/dist/runtime/application/api/api.js.map +0 -1
  101. package/dist/runtime/application/api/config.d.ts +0 -14
  102. package/dist/runtime/application/api/config.js +0 -6
  103. package/dist/runtime/application/api/config.js.map +0 -1
  104. package/dist/runtime/application/api/constants.d.ts +0 -14
  105. package/dist/runtime/application/api/constants.js +0 -8
  106. package/dist/runtime/application/api/constants.js.map +0 -1
  107. package/dist/runtime/application/api/filters.d.ts +0 -14
  108. package/dist/runtime/application/api/filters.js +0 -11
  109. package/dist/runtime/application/api/filters.js.map +0 -1
  110. package/dist/runtime/application/api/guards.d.ts +0 -15
  111. package/dist/runtime/application/api/guards.js +0 -8
  112. package/dist/runtime/application/api/guards.js.map +0 -1
  113. package/dist/runtime/application/api/index.d.ts +0 -23
  114. package/dist/runtime/application/api/index.js +0 -17
  115. package/dist/runtime/application/api/index.js.map +0 -1
  116. package/dist/runtime/application/api/logging.d.ts +0 -14
  117. package/dist/runtime/application/api/logging.js +0 -77
  118. package/dist/runtime/application/api/logging.js.map +0 -1
  119. package/dist/runtime/application/api/meta.d.ts +0 -21
  120. package/dist/runtime/application/api/meta.js +0 -2
  121. package/dist/runtime/application/api/meta.js.map +0 -1
  122. package/dist/runtime/application/api/middlewares.d.ts +0 -14
  123. package/dist/runtime/application/api/middlewares.js +0 -12
  124. package/dist/runtime/application/api/middlewares.js.map +0 -1
  125. package/dist/runtime/application/api/procedure.d.ts +0 -71
  126. package/dist/runtime/application/api/procedure.js +0 -41
  127. package/dist/runtime/application/api/procedure.js.map +0 -1
  128. package/dist/runtime/application/api/router.d.ts +0 -93
  129. package/dist/runtime/application/api/router.js +0 -55
  130. package/dist/runtime/application/api/router.js.map +0 -1
  131. package/dist/runtime/application/api/types.d.ts +0 -38
  132. package/dist/runtime/application/api/types.js +0 -2
  133. package/dist/runtime/application/api/types.js.map +0 -1
  134. package/dist/runtime/application/config.d.ts +0 -28
  135. package/dist/runtime/application/config.js +0 -25
  136. package/dist/runtime/application/config.js.map +0 -1
  137. package/dist/runtime/application/constants.d.ts +0 -2
  138. package/dist/runtime/application/constants.js +0 -2
  139. package/dist/runtime/application/constants.js.map +0 -1
  140. package/dist/runtime/application/hook.d.ts +0 -19
  141. package/dist/runtime/application/hook.js +0 -11
  142. package/dist/runtime/application/hook.js.map +0 -1
  143. package/dist/runtime/application/hooks.d.ts +0 -3
  144. package/dist/runtime/application/hooks.js +0 -4
  145. package/dist/runtime/application/hooks.js.map +0 -1
  146. package/src/runtime/application/api/api.ts +0 -406
  147. package/src/runtime/application/api/config.ts +0 -18
  148. package/src/runtime/application/api/constants.ts +0 -22
  149. package/src/runtime/application/api/filters.ts +0 -39
  150. package/src/runtime/application/api/guards.ts +0 -33
  151. package/src/runtime/application/api/index.ts +0 -69
  152. package/src/runtime/application/api/logging.ts +0 -110
  153. package/src/runtime/application/api/meta.ts +0 -37
  154. package/src/runtime/application/api/middlewares.ts +0 -37
  155. package/src/runtime/application/api/procedure.ts +0 -224
  156. package/src/runtime/application/api/router.ts +0 -247
  157. package/src/runtime/application/api/types.ts +0 -138
  158. package/src/runtime/application/config.ts +0 -82
  159. package/src/runtime/application/constants.ts +0 -4
  160. package/src/runtime/application/hook.ts +0 -51
  161. package/src/runtime/application/hooks.ts +0 -3
@@ -1,37 +0,0 @@
1
- import type { TAnyProcedureContract, TAnyRouterContract } from '@nmtjs/contract'
2
- import type {
3
- AfterDecodeMetaBinding,
4
- AnyMeta,
5
- BeforeDecodeMetaBinding,
6
- Container,
7
- StaticMetaBinding,
8
- } from '@nmtjs/core'
9
- import type { GatewayConnection } from '@nmtjs/gateway'
10
-
11
- export type ApiMetaRouteContext = Readonly<{
12
- contract: TAnyRouterContract
13
- timeout?: number
14
- }>
15
-
16
- export type ApiMetaProcedureContext = Readonly<{
17
- contract: TAnyProcedureContract
18
- streamTimeout?: number
19
- }>
20
-
21
- export type ApiMetaContext = Readonly<{
22
- callId: string
23
- connection: GatewayConnection
24
- container: Container
25
- path: readonly ApiMetaRouteContext[]
26
- procedure: ApiMetaProcedureContext
27
- }>
28
-
29
- export type StaticOrBeforeDecodeMetaBinding =
30
- | StaticMetaBinding
31
- | BeforeDecodeMetaBinding<AnyMeta, any, ApiMetaContext>
32
-
33
- export type CompatibleMetaBinding<Input> =
34
- | StaticOrBeforeDecodeMetaBinding
35
- | AfterDecodeMetaBinding<AnyMeta, any, ApiMetaContext, Input>
36
-
37
- export type AnyCompatibleMetaBinding = CompatibleMetaBinding<any>
@@ -1,37 +0,0 @@
1
- import type { MaybePromise } from '@nmtjs/common'
2
- import type { Dependant, Dependencies, DependencyContext } from '@nmtjs/core'
3
-
4
- import type { ApiCallContext } from './types.ts'
5
- import { kMiddleware } from './constants.ts'
6
-
7
- export type MiddlewareNext = (payload?: any) => any
8
-
9
- export interface Middleware<Deps extends Dependencies = Dependencies>
10
- extends Dependant<Deps> {
11
- [kMiddleware]: true
12
- handle: (
13
- ctx: DependencyContext<Deps>,
14
- call: ApiCallContext,
15
- next: MiddlewareNext,
16
- payload: any,
17
- ) => MaybePromise<any>
18
- }
19
-
20
- export type AnyMiddleware = Middleware<any>
21
-
22
- export function createMiddleware<Deps extends Dependencies = {}>(
23
- paramsOrHandler:
24
- | { dependencies?: Deps; handle: Middleware<Deps>['handle'] }
25
- | Middleware<Deps>['handle'],
26
- ): Middleware<Deps> {
27
- const { dependencies = {} as Deps, handle } =
28
- typeof paramsOrHandler === 'function'
29
- ? { handle: paramsOrHandler }
30
- : paramsOrHandler
31
-
32
- return Object.freeze({
33
- dependencies,
34
- handle,
35
- [kMiddleware]: true,
36
- }) as Middleware<Deps>
37
- }
@@ -1,224 +0,0 @@
1
- import type { MaybePromise } from '@nmtjs/common'
2
- import type { TAnyProcedureContract, TProcedureContract } from '@nmtjs/contract'
3
- import type { Dependant, Dependencies, DependencyContext } from '@nmtjs/core'
4
- import type { BaseType } from '@nmtjs/type'
5
- import type * as zod from 'zod/mini'
6
- import { c } from '@nmtjs/contract'
7
- import { assertUniqueMetaBindings } from '@nmtjs/core'
8
- import { t } from '@nmtjs/type'
9
-
10
- import type { AnyGuard } from './guards.ts'
11
- import type { AnyCompatibleMetaBinding, CompatibleMetaBinding } from './meta.ts'
12
- import type { AnyMiddleware } from './middlewares.ts'
13
- import type { JsonPrimitive } from './types.ts'
14
- import { kProcedure } from './constants.ts'
15
-
16
- export type {
17
- AnyCompatibleMetaBinding,
18
- CompatibleMetaBinding,
19
- StaticOrBeforeDecodeMetaBinding,
20
- } from './meta.ts'
21
- export type ProcedureMetaBinding<Input> = CompatibleMetaBinding<Input>
22
- export type AnyProcedureMetaBinding = AnyCompatibleMetaBinding
23
-
24
- export type ProcedureDecodedInput<Input extends BaseType | undefined> =
25
- Input extends BaseType ? t.infer.decode.output<Input> : never
26
-
27
- export type ProcedureContractDecodedInput<
28
- ProcedureContract extends TAnyProcedureContract,
29
- > = t.infer.decode.output<ProcedureContract['input']>
30
-
31
- export interface BaseProcedure<
32
- ProcedureContract extends TAnyProcedureContract,
33
- ProcedureDeps extends Dependencies,
34
- > extends Dependant<ProcedureDeps> {
35
- contract: ProcedureContract
36
- handler: (...args: any[]) => any
37
- meta: readonly AnyProcedureMetaBinding[]
38
- dependencies: ProcedureDeps
39
- guards: Set<AnyGuard>
40
- middlewares: Set<AnyMiddleware>
41
- streamTimeout?: number
42
- [kProcedure]: any
43
- }
44
-
45
- export type ProcedureHandlerType<Input, Output, Deps extends Dependencies> = (
46
- ctx: DependencyContext<Deps>,
47
- data: Input,
48
- ) => MaybePromise<Output>
49
-
50
- export interface Procedure<
51
- ProcedureContract extends TAnyProcedureContract,
52
- ProcedureDeps extends Dependencies,
53
- > extends BaseProcedure<ProcedureContract, ProcedureDeps> {
54
- handler: ProcedureHandlerType<
55
- ProcedureContractDecodedInput<ProcedureContract>,
56
- ProcedureContract['stream'] extends true
57
- ? AsyncIterable<t.infer.encode.input<ProcedureContract['output']>>
58
- : t.infer.encode.input<ProcedureContract['output']>,
59
- ProcedureDeps
60
- >
61
- }
62
-
63
- export type AnyProcedure<
64
- Contract extends TAnyProcedureContract = TAnyProcedureContract,
65
- > = BaseProcedure<Contract, Dependencies>
66
-
67
- export type CreateProcedureParams<
68
- ProcedureContract extends TAnyProcedureContract,
69
- ProcedureDeps extends Dependencies,
70
- > =
71
- | {
72
- dependencies?: ProcedureDeps
73
- guards?: AnyGuard[]
74
- middlewares?: AnyMiddleware[]
75
- meta?: ProcedureMetaBinding<
76
- ProcedureContractDecodedInput<ProcedureContract>
77
- >[]
78
- streamTimeout?: number
79
- handler: ProcedureHandlerType<
80
- ProcedureContractDecodedInput<ProcedureContract>,
81
- ProcedureContract['stream'] extends undefined
82
- ? t.infer.encode.input<ProcedureContract['output']>
83
- : AsyncIterable<
84
- Exclude<ProcedureContract['stream'], undefined | boolean>
85
- >,
86
- ProcedureDeps
87
- >
88
- }
89
- | ProcedureHandlerType<
90
- ProcedureContractDecodedInput<ProcedureContract>,
91
- ProcedureContract['stream'] extends undefined
92
- ? t.infer.decode.input<ProcedureContract['output']>
93
- : AsyncIterable<
94
- Exclude<ProcedureContract['stream'], undefined | boolean>
95
- >,
96
- ProcedureDeps
97
- >
98
-
99
- export function _createBaseProcedure<
100
- ProcedureContract extends TAnyProcedureContract,
101
- ProcedureDeps extends Dependencies,
102
- >(
103
- contract: ProcedureContract,
104
- params: {
105
- dependencies?: ProcedureDeps
106
- middlewares?: AnyMiddleware[]
107
- guards?: AnyGuard[]
108
- meta?: AnyProcedureMetaBinding[]
109
- streamTimeout?: number
110
- },
111
- ) {
112
- const dependencies = params.dependencies ?? ({} as ProcedureDeps)
113
- const middlewares = new Set(params.middlewares ?? [])
114
- const guards = new Set(params.guards ?? [])
115
- const meta = Object.freeze([...(params.meta ?? [])])
116
- const streamTimeout = params.streamTimeout
117
-
118
- if (typeof streamTimeout !== 'undefined' && streamTimeout <= 0) {
119
- throw new Error('Stream timeout must be a positive integer')
120
- }
121
-
122
- assertUniqueMetaBindings(meta, 'procedure config')
123
-
124
- return { contract, dependencies, middlewares, guards, meta, streamTimeout }
125
- }
126
-
127
- export function createContractProcedure<
128
- ProcedureContract extends TAnyProcedureContract,
129
- ProcedureDeps extends Dependencies,
130
- >(
131
- contract: ProcedureContract,
132
- paramsOrHandler: CreateProcedureParams<ProcedureContract, ProcedureDeps>,
133
- ): Procedure<ProcedureContract, ProcedureDeps> {
134
- const { handler, ...params } =
135
- typeof paramsOrHandler === 'function'
136
- ? { handler: paramsOrHandler }
137
- : paramsOrHandler
138
-
139
- return Object.assign(_createBaseProcedure(contract, params), {
140
- handler,
141
- [kProcedure]: true,
142
- }) as any
143
- }
144
-
145
- export function createProcedure<
146
- Return,
147
- TInput extends BaseType | undefined = undefined,
148
- TOutput extends BaseType | undefined = undefined,
149
- TStream extends true | number | undefined = undefined,
150
- Deps extends Dependencies = {},
151
- >(
152
- paramsOrHandler:
153
- | {
154
- input?: TInput
155
- output?: TOutput
156
- /**
157
- * Whether the procedure is a stream procedure.
158
- * If set to `true`, the procedure handler should return an `AsyncIterable` of output items.
159
- * If set to a number, it specifies an explicit stream timeout in milliseconds.
160
- */
161
- stream?: TStream
162
- dependencies?: Deps
163
- guards?: AnyGuard[]
164
- middlewares?: AnyMiddleware[]
165
- meta?: ProcedureMetaBinding<ProcedureDecodedInput<TInput>>[]
166
- timeout?: number
167
- handler: ProcedureHandlerType<
168
- ProcedureDecodedInput<TInput>,
169
- TStream extends true | number
170
- ? AsyncIterable<
171
- TOutput extends BaseType
172
- ? t.infer.encode.input<TOutput>
173
- : Return
174
- >
175
- : TOutput extends BaseType
176
- ? t.infer.encode.input<TOutput>
177
- : Return,
178
- Deps
179
- >
180
- }
181
- | ProcedureHandlerType<ProcedureDecodedInput<TInput>, Return, Deps>,
182
- ): Procedure<
183
- TProcedureContract<
184
- TInput extends undefined ? t.NeverType : TInput,
185
- TOutput extends undefined
186
- ? t.CustomType<
187
- JsonPrimitive<Return>,
188
- zod.ZodMiniCustom<JsonPrimitive<Return>, JsonPrimitive<Return>>
189
- >
190
- : TOutput,
191
- TStream extends true | number ? true : undefined
192
- >,
193
- Deps
194
- > {
195
- const {
196
- input = t.never() as any,
197
- output = t.any() as any,
198
- stream = undefined as any,
199
- dependencies = {} as Deps,
200
- guards = [],
201
- middlewares = [],
202
- meta = [],
203
- handler,
204
- timeout,
205
- } = typeof paramsOrHandler === 'function'
206
- ? { handler: paramsOrHandler }
207
- : paramsOrHandler
208
-
209
- // @ts-expect-error
210
- return createContractProcedure(
211
- c.procedure({ input, output, stream, timeout }),
212
- {
213
- dependencies,
214
- handler: handler as any,
215
- guards,
216
- middlewares,
217
- meta,
218
- streamTimeout: typeof stream === 'number' ? stream : undefined,
219
- },
220
- )
221
- }
222
-
223
- export const isProcedure = (value: any): value is AnyProcedure =>
224
- Boolean(value?.[kProcedure])
@@ -1,247 +0,0 @@
1
- import type { Callback } from '@nmtjs/common'
2
- import type {
3
- TAnyProcedureContract,
4
- TAnyRouterContract,
5
- TProcedureContract,
6
- TRouteContract,
7
- TRouterContract,
8
- } from '@nmtjs/contract'
9
- import type { BaseTypeAny, t } from '@nmtjs/type'
10
- import type { AnyType } from '@nmtjs/type/any'
11
- import { c, IsRouterContract } from '@nmtjs/contract'
12
- import { assertUniqueMetaBindings } from '@nmtjs/core'
13
-
14
- import type { AnyGuard } from './guards.ts'
15
- import type { AnyCompatibleMetaBinding, CompatibleMetaBinding } from './meta.ts'
16
- import type { AnyMiddleware } from './middlewares.ts'
17
- import type { AnyProcedure } from './procedure.ts'
18
- import { kRootRouter, kRouter } from './constants.ts'
19
-
20
- export type RouterMetaBinding<Input> = CompatibleMetaBinding<Input>
21
- export type AnyRouterMetaBinding = AnyCompatibleMetaBinding
22
-
23
- export type AnyRouterRoutes = Record<string, AnyProcedure<any> | AnyRouter>
24
- export type AnyRouterContractRoutes = Record<
25
- string,
26
- TAnyProcedureContract | TAnyRouterContract
27
- >
28
-
29
- export interface AnyRouter {
30
- contract: TAnyRouterContract
31
- routes: AnyRouterRoutes
32
- guards: Set<AnyGuard>
33
- middlewares: Set<AnyMiddleware>
34
- meta: readonly AnyRouterMetaBinding[]
35
- timeout?: number
36
- [kRouter]: any
37
- }
38
-
39
- export interface AnyRootRouter extends AnyRouter {
40
- [kRootRouter]: any
41
- contract: TAnyRouterContract<Record<string, TRouteContract>, undefined>
42
- default?: AnyProcedure<any>
43
- }
44
-
45
- export interface Router<Contract extends TAnyRouterContract> extends AnyRouter {
46
- contract: Contract
47
- routes: {
48
- [K in keyof Contract['routes']]: Contract['routes'][K] extends TAnyRouterContract
49
- ? Router<Contract['routes'][K]>
50
- : Contract['routes'][K] extends TAnyProcedureContract
51
- ? AnyProcedure<
52
- TProcedureContract<
53
- Contract['routes'][K]['input'],
54
- Contract['routes'][K]['output'],
55
- Contract['routes'][K]['stream'],
56
- Contract['routes'][K]['name']
57
- >
58
- >
59
- : never
60
- }
61
- guards: Set<AnyGuard>
62
- middlewares: Set<AnyMiddleware>
63
- meta: readonly AnyRouterMetaBinding[]
64
- timeout?: number
65
- [kRouter]: any
66
- }
67
-
68
- export interface RootRouter<
69
- Contract extends TAnyRouterContract<
70
- Record<string, TRouteContract>,
71
- undefined
72
- >,
73
- > extends Router<Contract> {
74
- [kRootRouter]: any
75
- default?: AnyProcedure<any>
76
- }
77
-
78
- export type MergeRoutersRoutesContracts<
79
- Routers extends readonly TAnyRouterContract[],
80
- > = Routers extends [
81
- infer First extends TAnyRouterContract,
82
- ...infer Rest extends TAnyRouterContract[],
83
- ]
84
- ? {
85
- [K in keyof First['routes']]: First['routes'][K]
86
- } & MergeRoutersRoutesContracts<Rest>
87
- : Routers extends [infer First extends TAnyRouterContract]
88
- ? {
89
- [K in keyof First['routes']]: First['routes'][K]
90
- }
91
- : {}
92
-
93
- export type ExtractRouterContracts<
94
- Routers extends readonly { contract: TAnyRouterContract }[],
95
- > = Routers extends [
96
- infer First extends { contract: TAnyRouterContract },
97
- ...infer Rest extends { contract: TAnyRouterContract }[],
98
- ]
99
- ? [First['contract'], ...ExtractRouterContracts<Rest>]
100
- : []
101
-
102
- export type RouterContractsFromRoutes<Routes extends AnyRouterRoutes> = {
103
- [K in keyof Routes]: Routes[K] extends AnyRouter
104
- ? Routes[K]['contract']
105
- : Routes[K] extends AnyProcedure<any>
106
- ? Routes[K]['contract']
107
- : never
108
- }
109
-
110
- export type RouterContractFromRoutes<
111
- Routes extends AnyRouterRoutes,
112
- Name extends string | undefined = undefined,
113
- > = TRouterContract<RouterContractsFromRoutes<Routes>, Name>
114
-
115
- export function createRootRouter<Routers extends readonly AnyRouter[]>(
116
- routers: Routers,
117
- defaultProcedure?: AnyProcedure<
118
- TProcedureContract<AnyType, AnyType, true | undefined, string | undefined>
119
- >,
120
- ): RootRouter<
121
- TRouterContract<
122
- MergeRoutersRoutesContracts<ExtractRouterContracts<[...Routers]>>,
123
- undefined
124
- >
125
- > {
126
- const routes: Record<string, any> = {}
127
- for (const router of routers) Object.assign(routes, router.routes)
128
- const router = createRouter({ routes, name: undefined })
129
- return Object.freeze({
130
- ...router,
131
- default: defaultProcedure,
132
- [kRootRouter]: true,
133
- }) as any
134
- }
135
-
136
- export type FlattenRouterContractInput<Routes extends AnyRouterContractRoutes> =
137
- {
138
- [K in keyof Routes]: Routes[K] extends TAnyRouterContract
139
- ? FlattenRouterContractInput<Routes[K]['routes']>
140
- : Routes[K] extends TAnyProcedureContract
141
- ? Routes[K]['input']
142
- : never
143
- }[keyof Routes]
144
-
145
- export type FlattenRouterDecodedInput<Routes extends AnyRouterContractRoutes> =
146
- t.infer.decode.output<
147
- Extract<FlattenRouterContractInput<Routes>, BaseTypeAny>
148
- >
149
-
150
- export type RouterDecodedInput<Routes extends AnyRouterRoutes> =
151
- FlattenRouterDecodedInput<RouterContractsFromRoutes<Routes>>
152
-
153
- export type RouterContractDecodedInput<Contract extends TAnyRouterContract> =
154
- FlattenRouterDecodedInput<Contract['routes']>
155
-
156
- export interface CreateRouterParams<
157
- Routes extends AnyRouterRoutes,
158
- Name extends string | undefined = undefined,
159
- > {
160
- routes: Routes
161
- name?: Name
162
- guards?: AnyGuard[]
163
- middlewares?: AnyMiddleware[]
164
- meta?: RouterMetaBinding<RouterDecodedInput<Routes>>[]
165
- hooks?: Record<string, Callback[]>
166
- timeout?: number
167
- }
168
-
169
- export interface CreateContractRouterParams<
170
- Contract extends TAnyRouterContract,
171
- > {
172
- routes: {
173
- [K in keyof Contract['routes']]: Contract['routes'][K] extends TAnyRouterContract
174
- ? Router<Contract['routes'][K]>
175
- : Contract['routes'][K] extends TAnyProcedureContract
176
- ? AnyProcedure<Contract['routes'][K]>
177
- : never
178
- }
179
- guards?: AnyGuard[]
180
- middlewares?: AnyMiddleware[]
181
- meta?: RouterMetaBinding<RouterContractDecodedInput<Contract>>[]
182
- timeout?: number
183
- }
184
-
185
- export function createRouter<
186
- const Routes extends AnyRouterRoutes,
187
- const Name extends string | undefined = undefined,
188
- >(
189
- params: CreateRouterParams<Routes, Name>,
190
- ): Router<RouterContractFromRoutes<Routes, Name>> {
191
- const { routes, name, guards, middlewares, meta, timeout } = params
192
-
193
- const routesContracts: any = {}
194
- for (const [name, route] of Object.entries(routes)) {
195
- routesContracts[name] = route.contract
196
- }
197
-
198
- const contract = c.router({ routes: routesContracts, timeout, name })
199
-
200
- assignRouteContracts(routes, contract)
201
-
202
- return createContractRouter(contract, {
203
- routes: routes as any,
204
- guards,
205
- middlewares,
206
- meta,
207
- timeout,
208
- }) as any
209
- }
210
-
211
- export function createContractRouter<Contract extends TAnyRouterContract>(
212
- contract: Contract,
213
- params: CreateContractRouterParams<Contract>,
214
- ): Router<Contract> {
215
- const guards = new Set(params.guards ?? [])
216
- const middlewares = new Set(params.middlewares ?? [])
217
- const meta = Object.freeze([...(params.meta ?? [])])
218
-
219
- assertUniqueMetaBindings(meta, 'router config')
220
-
221
- return {
222
- contract,
223
- routes: params.routes,
224
- guards,
225
- middlewares,
226
- meta,
227
- timeout: params.timeout,
228
- [kRouter]: true,
229
- }
230
- }
231
-
232
- export const isRouter = (value: any): value is AnyRouter =>
233
- Boolean(value?.[kRouter])
234
-
235
- export const isRootRouter = (value: any): value is AnyRootRouter =>
236
- Boolean(value?.[kRootRouter])
237
-
238
- function assignRouteContracts(
239
- routes: Record<string, any>,
240
- contract: TAnyRouterContract,
241
- ) {
242
- for (const [key, routeContract] of Object.entries(contract.routes)) {
243
- routes[key] = { ...routes[key], contract: routeContract }
244
- if (IsRouterContract(routeContract))
245
- assignRouteContracts(routes[key].routes, routeContract)
246
- }
247
- }
@@ -1,138 +0,0 @@
1
- import type { TProcedureContract } from '@nmtjs/contract'
2
- import type { Container } from '@nmtjs/core'
3
- import type { GatewayConnection } from '@nmtjs/gateway'
4
- import type { AnyCompatibleType, BaseTypeAny } from '@nmtjs/type'
5
-
6
- import type { Procedure } from './procedure.ts'
7
- import type { AnyRouter } from './router.ts'
8
-
9
- export type ApiCallContext<Payload = unknown> = Readonly<{
10
- callId: string
11
- connection: GatewayConnection
12
- container: Container
13
- path: AnyRouter[]
14
- procedure: Procedure<
15
- TProcedureContract<
16
- AnyCompatibleType<any, Payload>,
17
- BaseTypeAny,
18
- true | undefined,
19
- string | undefined
20
- >,
21
- any
22
- >
23
- }>
24
-
25
- export type ApiGuardContext<Payload = unknown> = ApiCallContext<Payload> &
26
- Readonly<{ payload: Payload }>
27
-
28
- export type JsonPrimitive<T> =
29
- Equal<T, JsonPrimitiveMain<T>> extends true ? T : JsonPrimitiveMain<T>
30
-
31
- type Equal<X, Y> = X extends Y ? (Y extends X ? true : false) : false
32
-
33
- type JsonPrimitiveMain<
34
- Instance,
35
- InArray extends boolean = false,
36
- > = Instance extends [never]
37
- ? never
38
- : ValueOf<Instance> extends bigint
39
- ? never
40
- : ValueOf<Instance> extends boolean | number | string
41
- ? ValueOf<Instance>
42
- : Instance extends Function
43
- ? InArray extends true
44
- ? null
45
- : never
46
- : ValueOf<Instance> extends object
47
- ? Instance extends object
48
- ? Instance extends NativeClass
49
- ? {}
50
- : Instance extends IJsonable<infer Raw>
51
- ? ValueOf<Raw> extends object
52
- ? Raw extends object
53
- ? PrimitiveObject<Raw>
54
- : never
55
- : ValueOf<Raw>
56
- : PrimitiveObject<Instance>
57
- : never
58
- : ValueOf<Instance>
59
-
60
- type PrimitiveObject<Instance extends object> =
61
- Instance extends Array<infer T>
62
- ? IsTuple<Instance> extends true
63
- ? PrimitiveTuple<Instance>
64
- : JsonPrimitiveMain<T, true>[]
65
- : {
66
- -readonly [P in keyof Instance as JsonPrimitiveMain<
67
- Instance[P]
68
- > extends never
69
- ? never
70
- : P]: JsonPrimitiveMain<Instance[P]>
71
- }
72
-
73
- type PrimitiveTuple<T extends readonly any[]> = T extends []
74
- ? []
75
- : T extends [infer F]
76
- ? [JsonPrimitiveMain<F, true>]
77
- : T extends [infer F, ...infer Rest extends readonly any[]]
78
- ? [JsonPrimitiveMain<F, true>, ...PrimitiveTuple<Rest>]
79
- : T extends [(infer F)?]
80
- ? [JsonPrimitiveMain<F, true>?]
81
- : T extends [(infer F)?, ...infer Rest extends readonly any[]]
82
- ? [JsonPrimitiveMain<F, true>?, ...PrimitiveTuple<Rest>]
83
- : []
84
-
85
- type ValueOf<Instance> =
86
- IsValueOf<Instance, boolean> extends true
87
- ? boolean
88
- : IsValueOf<Instance, number> extends true
89
- ? number
90
- : IsValueOf<Instance, string> extends true
91
- ? string
92
- : Instance
93
-
94
- type NativeClass =
95
- | Set<any>
96
- | Map<any, any>
97
- | WeakSet<any>
98
- | WeakMap<any, any>
99
- | Uint8Array
100
- | Uint8ClampedArray
101
- | Uint16Array
102
- | Uint32Array
103
- | BigUint64Array
104
- | Int8Array
105
- | Int16Array
106
- | Int32Array
107
- | BigInt64Array
108
- | Float32Array
109
- | Float64Array
110
- | ArrayBuffer
111
- | SharedArrayBuffer
112
- | DataView
113
-
114
- type IsTuple<T extends readonly any[] | { length: number }> = [T] extends [
115
- never,
116
- ]
117
- ? false
118
- : T extends readonly any[]
119
- ? number extends T['length']
120
- ? false
121
- : true
122
- : false
123
-
124
- type IsValueOf<Instance, Object extends IValueOf<any>> = Instance extends Object
125
- ? Object extends IValueOf<infer U>
126
- ? Instance extends U
127
- ? false
128
- : true
129
- : false
130
- : false
131
-
132
- interface IValueOf<T> {
133
- valueOf(): T
134
- }
135
-
136
- interface IJsonable<T> {
137
- toJSON(): T
138
- }