@effect/platform 0.48.28 → 0.49.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 (159) hide show
  1. package/README.md +12 -12
  2. package/dist/cjs/Http/App.js +13 -11
  3. package/dist/cjs/Http/App.js.map +1 -1
  4. package/dist/cjs/Http/Client.js +13 -3
  5. package/dist/cjs/Http/Client.js.map +1 -1
  6. package/dist/cjs/Http/ClientResponse.js +9 -9
  7. package/dist/cjs/Http/ClientResponse.js.map +1 -1
  8. package/dist/cjs/Http/Cookies.js +7 -7
  9. package/dist/cjs/Http/Cookies.js.map +1 -1
  10. package/dist/cjs/Http/Headers.js +7 -7
  11. package/dist/cjs/Http/Headers.js.map +1 -1
  12. package/dist/cjs/Http/IncomingMessage.js +7 -7
  13. package/dist/cjs/Http/IncomingMessage.js.map +1 -1
  14. package/dist/cjs/Http/Middleware.js +11 -1
  15. package/dist/cjs/Http/Middleware.js.map +1 -1
  16. package/dist/cjs/Http/Multiplex.js.map +1 -1
  17. package/dist/cjs/Http/Router.js +1 -6
  18. package/dist/cjs/Http/Router.js.map +1 -1
  19. package/dist/cjs/Http/UrlParams.js +13 -13
  20. package/dist/cjs/Http/UrlParams.js.map +1 -1
  21. package/dist/cjs/PlatformConfigProvider.js +2 -2
  22. package/dist/cjs/PlatformConfigProvider.js.map +1 -1
  23. package/dist/cjs/Socket.js +6 -6
  24. package/dist/cjs/Socket.js.map +1 -1
  25. package/dist/cjs/Transferable.js +1 -1
  26. package/dist/cjs/Transferable.js.map +1 -1
  27. package/dist/cjs/WorkerRunner.js.map +1 -1
  28. package/dist/cjs/internal/command.js +1 -1
  29. package/dist/cjs/internal/command.js.map +1 -1
  30. package/dist/cjs/internal/fileSystem.js +2 -2
  31. package/dist/cjs/internal/fileSystem.js.map +1 -1
  32. package/dist/cjs/internal/http/client.js +19 -16
  33. package/dist/cjs/internal/http/client.js.map +1 -1
  34. package/dist/cjs/internal/http/clientResponse.js +5 -5
  35. package/dist/cjs/internal/http/clientResponse.js.map +1 -1
  36. package/dist/cjs/internal/http/middleware.js +8 -3
  37. package/dist/cjs/internal/http/middleware.js.map +1 -1
  38. package/dist/cjs/internal/http/multipart.js +4 -4
  39. package/dist/cjs/internal/http/multipart.js.map +1 -1
  40. package/dist/cjs/internal/http/multiplex.js +2 -2
  41. package/dist/cjs/internal/http/multiplex.js.map +1 -1
  42. package/dist/cjs/internal/http/router.js +11 -11
  43. package/dist/cjs/internal/http/router.js.map +1 -1
  44. package/dist/cjs/internal/worker.js +7 -7
  45. package/dist/cjs/internal/worker.js.map +1 -1
  46. package/dist/cjs/internal/workerRunner.js +14 -13
  47. package/dist/cjs/internal/workerRunner.js.map +1 -1
  48. package/dist/dts/Command.d.ts +3 -3
  49. package/dist/dts/Command.d.ts.map +1 -1
  50. package/dist/dts/Http/App.d.ts +7 -7
  51. package/dist/dts/Http/App.d.ts.map +1 -1
  52. package/dist/dts/Http/Client.d.ts +78 -65
  53. package/dist/dts/Http/Client.d.ts.map +1 -1
  54. package/dist/dts/Http/ClientResponse.d.ts +5 -5
  55. package/dist/dts/Http/Cookies.d.ts +3 -3
  56. package/dist/dts/Http/Cookies.d.ts.map +1 -1
  57. package/dist/dts/Http/Headers.d.ts +4 -4
  58. package/dist/dts/Http/Headers.d.ts.map +1 -1
  59. package/dist/dts/Http/IncomingMessage.d.ts +4 -3
  60. package/dist/dts/Http/IncomingMessage.d.ts.map +1 -1
  61. package/dist/dts/Http/Middleware.d.ts +22 -5
  62. package/dist/dts/Http/Middleware.d.ts.map +1 -1
  63. package/dist/dts/Http/Multiplex.d.ts +22 -22
  64. package/dist/dts/Http/Multiplex.d.ts.map +1 -1
  65. package/dist/dts/Http/Router.d.ts +98 -66
  66. package/dist/dts/Http/Router.d.ts.map +1 -1
  67. package/dist/dts/Http/Server.d.ts +11 -11
  68. package/dist/dts/Http/Server.d.ts.map +1 -1
  69. package/dist/dts/Http/ServerRequest.d.ts +1 -1
  70. package/dist/dts/Http/ServerRequest.d.ts.map +1 -1
  71. package/dist/dts/Http/TraceContext.d.ts.map +1 -1
  72. package/dist/dts/Http/UrlParams.d.ts.map +1 -1
  73. package/dist/dts/PlatformConfigProvider.d.ts.map +1 -1
  74. package/dist/dts/Socket.d.ts +10 -10
  75. package/dist/dts/Socket.d.ts.map +1 -1
  76. package/dist/dts/Transferable.d.ts.map +1 -1
  77. package/dist/dts/Worker.d.ts +6 -6
  78. package/dist/dts/Worker.d.ts.map +1 -1
  79. package/dist/dts/WorkerRunner.d.ts +5 -5
  80. package/dist/dts/WorkerRunner.d.ts.map +1 -1
  81. package/dist/dts/internal/http/router.d.ts +1 -1
  82. package/dist/dts/internal/http/router.d.ts.map +1 -1
  83. package/dist/esm/Http/App.js +13 -11
  84. package/dist/esm/Http/App.js.map +1 -1
  85. package/dist/esm/Http/Client.js +12 -2
  86. package/dist/esm/Http/Client.js.map +1 -1
  87. package/dist/esm/Http/ClientResponse.js +5 -5
  88. package/dist/esm/Http/ClientResponse.js.map +1 -1
  89. package/dist/esm/Http/Cookies.js +7 -7
  90. package/dist/esm/Http/Cookies.js.map +1 -1
  91. package/dist/esm/Http/Headers.js +7 -7
  92. package/dist/esm/Http/Headers.js.map +1 -1
  93. package/dist/esm/Http/IncomingMessage.js +3 -3
  94. package/dist/esm/Http/IncomingMessage.js.map +1 -1
  95. package/dist/esm/Http/Middleware.js +10 -0
  96. package/dist/esm/Http/Middleware.js.map +1 -1
  97. package/dist/esm/Http/Multiplex.js.map +1 -1
  98. package/dist/esm/Http/Router.js +0 -5
  99. package/dist/esm/Http/Router.js.map +1 -1
  100. package/dist/esm/Http/UrlParams.js +13 -13
  101. package/dist/esm/Http/UrlParams.js.map +1 -1
  102. package/dist/esm/PlatformConfigProvider.js +2 -2
  103. package/dist/esm/PlatformConfigProvider.js.map +1 -1
  104. package/dist/esm/Socket.js +6 -6
  105. package/dist/esm/Socket.js.map +1 -1
  106. package/dist/esm/Transferable.js +1 -1
  107. package/dist/esm/Transferable.js.map +1 -1
  108. package/dist/esm/WorkerRunner.js.map +1 -1
  109. package/dist/esm/internal/command.js +1 -1
  110. package/dist/esm/internal/command.js.map +1 -1
  111. package/dist/esm/internal/fileSystem.js +2 -2
  112. package/dist/esm/internal/fileSystem.js.map +1 -1
  113. package/dist/esm/internal/http/client.js +18 -13
  114. package/dist/esm/internal/http/client.js.map +1 -1
  115. package/dist/esm/internal/http/clientResponse.js +2 -2
  116. package/dist/esm/internal/http/clientResponse.js.map +1 -1
  117. package/dist/esm/internal/http/middleware.js +7 -2
  118. package/dist/esm/internal/http/middleware.js.map +1 -1
  119. package/dist/esm/internal/http/multipart.js +4 -4
  120. package/dist/esm/internal/http/multipart.js.map +1 -1
  121. package/dist/esm/internal/http/multiplex.js +2 -2
  122. package/dist/esm/internal/http/multiplex.js.map +1 -1
  123. package/dist/esm/internal/http/router.js +10 -9
  124. package/dist/esm/internal/http/router.js.map +1 -1
  125. package/dist/esm/internal/worker.js +7 -7
  126. package/dist/esm/internal/worker.js.map +1 -1
  127. package/dist/esm/internal/workerRunner.js +14 -13
  128. package/dist/esm/internal/workerRunner.js.map +1 -1
  129. package/package.json +3 -3
  130. package/src/Command.ts +3 -3
  131. package/src/Http/App.ts +44 -41
  132. package/src/Http/Client.ts +105 -90
  133. package/src/Http/ClientResponse.ts +7 -7
  134. package/src/Http/Cookies.ts +9 -9
  135. package/src/Http/Headers.ts +12 -12
  136. package/src/Http/IncomingMessage.ts +16 -6
  137. package/src/Http/Middleware.ts +30 -6
  138. package/src/Http/Multiplex.ts +38 -38
  139. package/src/Http/Router.ts +156 -141
  140. package/src/Http/Server.ts +16 -16
  141. package/src/Http/ServerRequest.ts +1 -1
  142. package/src/Http/UrlParams.ts +15 -15
  143. package/src/PlatformConfigProvider.ts +2 -2
  144. package/src/Socket.ts +6 -6
  145. package/src/Transferable.ts +1 -1
  146. package/src/Worker.ts +9 -9
  147. package/src/WorkerRunner.ts +5 -4
  148. package/src/internal/command.ts +12 -6
  149. package/src/internal/fileSystem.ts +2 -2
  150. package/src/internal/http/client.ts +221 -204
  151. package/src/internal/http/clientResponse.ts +2 -2
  152. package/src/internal/http/middleware.ts +24 -1
  153. package/src/internal/http/multipart.ts +4 -4
  154. package/src/internal/http/multiplex.ts +54 -54
  155. package/src/internal/http/router.ts +146 -116
  156. package/src/internal/http/server.ts +17 -17
  157. package/src/internal/http/serverRequest.ts +1 -1
  158. package/src/internal/worker.ts +14 -14
  159. package/src/internal/workerRunner.ts +20 -16
@@ -32,6 +32,8 @@ export const RouteContextTypeId: Router.RouteContextTypeId = Symbol.for(
32
32
  /** @internal */
33
33
  export const RouteContext = Context.GenericTag<Router.RouteContext>("@effect/platform/Http/Router/RouteContext")
34
34
 
35
+ const isRouter = (u: unknown): u is Router.Router<unknown, unknown> => Predicate.hasProperty(u, TypeId)
36
+
35
37
  /** @internal */
36
38
  export const params = Effect.map(RouteContext, (_) => _.params)
37
39
 
@@ -131,18 +133,18 @@ export const schemaSearchParams = <R, I extends Readonly<Record<string, string>>
131
133
  return Effect.flatMap(RouteContext, (_) => parse(_.searchParams))
132
134
  }
133
135
 
134
- class RouterImpl<R, E> extends Effectable.StructuralClass<
136
+ class RouterImpl<E = never, R = never> extends Effectable.StructuralClass<
135
137
  ServerResponse.ServerResponse,
136
138
  E | Error.RouteNotFound,
137
139
  Exclude<R, Router.RouteContext>
138
- > implements Router.Router<R, E> {
140
+ > implements Router.Router<E, R> {
139
141
  readonly [TypeId]: Router.TypeId
140
142
  constructor(
141
- readonly routes: Chunk.Chunk<Router.Route<R, E>>,
143
+ readonly routes: Chunk.Chunk<Router.Route<E, R>>,
142
144
  readonly mounts: Chunk.Chunk<
143
145
  readonly [
144
146
  prefix: string,
145
- httpApp: App.Default<R, E>,
147
+ httpApp: App.Default<E, R>,
146
148
  options?: { readonly includePrefix?: boolean | undefined } | undefined
147
149
  ]
148
150
  >
@@ -176,9 +178,9 @@ class RouterImpl<R, E> extends Effectable.StructuralClass<
176
178
  }
177
179
 
178
180
  const toHttpApp = <R, E>(
179
- self: Router.Router<R, E>
180
- ): App.Default<R, E | Error.RouteNotFound> => {
181
- const router = FindMyWay.make<Router.Route<R, E>>()
181
+ self: Router.Router<E, R>
182
+ ): App.Default<E | Error.RouteNotFound, R> => {
183
+ const router = FindMyWay.make<Router.Route<E, R>>()
182
184
  const mounts = Chunk.toReadonlyArray(self.mounts).map(([path, app, options]) =>
183
185
  [
184
186
  path,
@@ -187,7 +189,8 @@ const toHttpApp = <R, E>(
187
189
  "*",
188
190
  options?.includePrefix ? `${path}/*` as Router.PathInput : "/*",
189
191
  app,
190
- options?.includePrefix ? Option.none() : Option.some(path)
192
+ options?.includePrefix ? Option.none() : Option.some(path),
193
+ false
191
194
  ),
192
195
  {},
193
196
  {}
@@ -219,7 +222,7 @@ const toHttpApp = <R, E>(
219
222
  context = Context.add(context, ServerRequest.ServerRequest, sliceRequestUrl(request, path))
220
223
  }
221
224
  return Effect.locally(
222
- routeContext.route.handler as App.Default<R, E>,
225
+ routeContext.route.handler as App.Default<E, R>,
223
226
  FiberRef.currentContext,
224
227
  context
225
228
  )
@@ -240,7 +243,13 @@ const toHttpApp = <R, E>(
240
243
  }
241
244
  context = Context.add(context, RouteContext, new RouteContextImpl(route, result.params, result.searchParams))
242
245
  return Effect.locally(
243
- route.handler as Effect.Effect<ServerResponse.ServerResponse, E, Router.Router.ExcludeProvided<R>>,
246
+ (route.uninterruptible ?
247
+ route.handler :
248
+ Effect.interruptible(route.handler)) as Effect.Effect<
249
+ ServerResponse.ServerResponse,
250
+ E,
251
+ Router.Router.ExcludeProvided<R>
252
+ >,
244
253
  FiberRef.currentContext,
245
254
  context
246
255
  )
@@ -252,13 +261,14 @@ function sliceRequestUrl(request: ServerRequest.ServerRequest, prefix: string) {
252
261
  return request.modify({ url: request.url.length <= prefexLen ? "/" : request.url.slice(prefexLen) })
253
262
  }
254
263
 
255
- class RouteImpl<R, E> extends Inspectable.Class implements Router.Route<R, E> {
264
+ class RouteImpl<E = never, R = never> extends Inspectable.Class implements Router.Route<E, R> {
256
265
  readonly [RouteTypeId]: Router.RouteTypeId
257
266
  constructor(
258
267
  readonly method: Method.Method | "*",
259
268
  readonly path: Router.PathInput,
260
- readonly handler: Router.Route.Handler<R, E>,
261
- readonly prefix = Option.none<string>()
269
+ readonly handler: Router.Route.Handler<E, R>,
270
+ readonly prefix = Option.none<string>(),
271
+ readonly uninterruptible = false
262
272
  ) {
263
273
  super()
264
274
  this[RouteTypeId] = RouteTypeId
@@ -285,28 +295,36 @@ class RouteContextImpl implements Router.RouteContext {
285
295
  }
286
296
 
287
297
  /** @internal */
288
- export const empty: Router.Router<never, never> = new RouterImpl(Chunk.empty(), Chunk.empty())
298
+ export const empty: Router.Router<never> = new RouterImpl(Chunk.empty(), Chunk.empty())
289
299
 
290
300
  /** @internal */
291
301
  export const fromIterable = <R extends Router.Route<any, any>>(
292
302
  routes: Iterable<R>
293
303
  ): Router.Router<
294
- R extends Router.Route<infer Env, infer _> ? Env : never,
295
- R extends Router.Route<infer _, infer E> ? E : never
304
+ R extends Router.Route<infer E, infer _> ? E : never,
305
+ R extends Router.Route<infer _, infer Env> ? Env : never
296
306
  > => new RouterImpl(Chunk.fromIterable(routes), Chunk.empty()) as any
297
307
 
298
308
  /** @internal */
299
- export const makeRoute = <R, E>(
309
+ export const makeRoute = <E, R>(
300
310
  method: Method.Method,
301
311
  path: Router.PathInput,
302
- handler: Router.Route.Handler<R, E>,
303
- prefix: Option.Option<string> = Option.none()
304
- ): Router.Route<Router.Router.ExcludeProvided<R>, E> => new RouteImpl(method, path, handler, prefix) as any
312
+ handler: Router.Route.Handler<E, R>,
313
+ prefix: Option.Option<string> = Option.none(),
314
+ uninterruptible = false
315
+ ): Router.Route<E, Router.Router.ExcludeProvided<R>> =>
316
+ new RouteImpl(
317
+ method,
318
+ path,
319
+ handler,
320
+ prefix,
321
+ uninterruptible
322
+ ) as any
305
323
 
306
324
  /** @internal */
307
325
  export const concat = dual<
308
- <R1, E1>(that: Router.Router<R1, E1>) => <R, E>(self: Router.Router<R, E>) => Router.Router<R | R1, E | E1>,
309
- <R, E, R1, E1>(self: Router.Router<R, E>, that: Router.Router<R1, E1>) => Router.Router<R | R1, E | E1>
326
+ <R1, E1>(that: Router.Router<E1, R1>) => <R, E>(self: Router.Router<E, R>) => Router.Router<E | E1, R | R1>,
327
+ <R, E, R1, E1>(self: Router.Router<E, R>, that: Router.Router<E1, R1>) => Router.Router<E | E1, R | R1>
310
328
  >(2, (self, that) => new RouterImpl(Chunk.appendAll(self.routes, that.routes) as any, self.mounts))
311
329
 
312
330
  const removeTrailingSlash = (
@@ -315,8 +333,8 @@ const removeTrailingSlash = (
315
333
 
316
334
  /** @internal */
317
335
  export const prefixAll = dual<
318
- (prefix: Router.PathInput) => <R, E>(self: Router.Router<R, E>) => Router.Router<R, E>,
319
- <R, E>(self: Router.Router<R, E>, prefix: Router.PathInput) => Router.Router<R, E>
336
+ (prefix: Router.PathInput) => <R, E>(self: Router.Router<E, R>) => Router.Router<E, R>,
337
+ <R, E>(self: Router.Router<E, R>, prefix: Router.PathInput) => Router.Router<E, R>
320
338
  >(
321
339
  2,
322
340
  (self, prefix) => {
@@ -330,7 +348,8 @@ export const prefixAll = dual<
330
348
  Option.orElse(
331
349
  Option.map(route.prefix, (_) => prefix + _),
332
350
  () => Option.some(prefix)
333
- )
351
+ ),
352
+ route.uninterruptible
334
353
  )),
335
354
  Chunk.map(self.mounts, ([path, app]) => [path === "/" ? prefix : prefix + path, app])
336
355
  )
@@ -341,13 +360,13 @@ export const prefixAll = dual<
341
360
  export const mount = dual<
342
361
  <R1, E1>(
343
362
  path: `/${string}`,
344
- that: Router.Router<R1, E1>
345
- ) => <R, E>(self: Router.Router<R, E>) => Router.Router<R | R1, E | E1>,
363
+ that: Router.Router<E1, R1>
364
+ ) => <R, E>(self: Router.Router<E, R>) => Router.Router<E | E1, R | R1>,
346
365
  <R, E, R1, E1>(
347
- self: Router.Router<R, E>,
366
+ self: Router.Router<E, R>,
348
367
  path: `/${string}`,
349
- that: Router.Router<R1, E1>
350
- ) => Router.Router<R | R1, E | E1>
368
+ that: Router.Router<E1, R1>
369
+ ) => Router.Router<E | E1, R | R1>
351
370
  >(
352
371
  3,
353
372
  (self, path, that) => concat(self, prefixAll(that, path))
@@ -357,31 +376,31 @@ export const mount = dual<
357
376
  export const mountApp = dual<
358
377
  <R1, E1>(
359
378
  path: `/${string}`,
360
- that: App.Default<R1, E1>,
379
+ that: App.Default<E1, R1>,
361
380
  options?: {
362
381
  readonly includePrefix?: boolean | undefined
363
382
  } | undefined
364
383
  ) => <R, E>(
365
- self: Router.Router<R, E>
366
- ) => Router.Router<R | Router.Router.ExcludeProvided<R1>, E | E1>,
384
+ self: Router.Router<E, R>
385
+ ) => Router.Router<E | E1, R | Router.Router.ExcludeProvided<R1>>,
367
386
  <R, E, R1, E1>(
368
- self: Router.Router<R, E>,
387
+ self: Router.Router<E, R>,
369
388
  path: `/${string}`,
370
- that: App.Default<R1, E1>,
389
+ that: App.Default<E1, R1>,
371
390
  options?: {
372
391
  readonly includePrefix?: boolean | undefined
373
392
  } | undefined
374
- ) => Router.Router<R | Router.Router.ExcludeProvided<R1>, E | E1>
393
+ ) => Router.Router<E | E1, R | Router.Router.ExcludeProvided<R1>>
375
394
  >(
376
395
  (args) => Predicate.hasProperty(args[0], TypeId),
377
396
  <R, E, R1, E1>(
378
- self: Router.Router<R, E>,
397
+ self: Router.Router<E, R>,
379
398
  path: `/${string}`,
380
- that: App.Default<R1, E1>,
399
+ that: App.Default<E1, R1>,
381
400
  options?: {
382
401
  readonly includePrefix?: boolean | undefined
383
402
  } | undefined
384
- ): Router.Router<R | Router.Router.ExcludeProvided<R1>, E | E1> =>
403
+ ): Router.Router<E | E1, R | Router.Router.ExcludeProvided<R1>> =>
385
404
  new RouterImpl<any, any>(self.routes, Chunk.append(self.mounts, [removeTrailingSlash(path), that, options])) as any
386
405
  )
387
406
 
@@ -389,31 +408,49 @@ export const mountApp = dual<
389
408
  export const route = (method: Method.Method | "*"): {
390
409
  <R1, E1>(
391
410
  path: Router.PathInput,
392
- handler: Router.Route.Handler<R1, E1>
411
+ handler: Router.Route.Handler<E1, R1>,
412
+ options?: {
413
+ readonly uninterruptible?: boolean | undefined
414
+ } | undefined
393
415
  ): <R, E>(
394
- self: Router.Router<R, E>
395
- ) => Router.Router<R | Router.Router.ExcludeProvided<R1>, E1 | E>
416
+ self: Router.Router<E, R>
417
+ ) => Router.Router<E1 | E, R | Router.Router.ExcludeProvided<R1>>
396
418
  <R, E, R1, E1>(
397
- self: Router.Router<R, E>,
419
+ self: Router.Router<E, R>,
398
420
  path: Router.PathInput,
399
- handler: Router.Route.Handler<R1, E1>
400
- ): Router.Router<R | Router.Router.ExcludeProvided<R1>, E1 | E>
421
+ handler: Router.Route.Handler<E1, R1>,
422
+ options?: {
423
+ readonly uninterruptible?: boolean | undefined
424
+ } | undefined
425
+ ): Router.Router<E1 | E, R | Router.Router.ExcludeProvided<R1>>
401
426
  } =>
402
427
  dual<
403
428
  <R1, E1>(
404
429
  path: Router.PathInput,
405
430
  handler: Router.Route.Handler<R1, E1>
406
431
  ) => <R, E>(
407
- self: Router.Router<R, E>
408
- ) => Router.Router<R | Router.Router.ExcludeProvided<R1>, E | E1>,
432
+ self: Router.Router<E, R>
433
+ ) => Router.Router<E | E1, R | Router.Router.ExcludeProvided<R1>>,
409
434
  <R, E, R1, E1>(
410
- self: Router.Router<R, E>,
435
+ self: Router.Router<E, R>,
411
436
  path: Router.PathInput,
412
- handler: Router.Route.Handler<R1, E1>
413
- ) => Router.Router<R | Router.Router.ExcludeProvided<R1>, E | E1>
414
- >(3, (self, path, handler) =>
437
+ handler: Router.Route.Handler<E1, R1>,
438
+ options?: {
439
+ readonly uninterruptible?: boolean | undefined
440
+ } | undefined
441
+ ) => Router.Router<E | E1, R | Router.Router.ExcludeProvided<R1>>
442
+ >((args) => isRouter(args[0]), (self, path, handler, options) =>
415
443
  new RouterImpl<any, any>(
416
- Chunk.append(self.routes, new RouteImpl(method, path, handler)),
444
+ Chunk.append(
445
+ self.routes,
446
+ new RouteImpl(
447
+ method,
448
+ path,
449
+ handler,
450
+ Option.none(),
451
+ options?.uninterruptible ?? false
452
+ )
453
+ ),
417
454
  self.mounts
418
455
  ))
419
456
 
@@ -443,18 +480,18 @@ export const options = route("OPTIONS")
443
480
 
444
481
  /** @internal */
445
482
  export const use = dual<
446
- <R, E, R1, E1>(
447
- f: (self: Router.Route.Handler<R, E>) => App.Default<R1, E1>
448
- ) => (self: Router.Router<R, E>) => Router.Router<Router.Router.ExcludeProvided<R1>, E1>,
449
- <R, E, R1, E1>(
450
- self: Router.Router<R, E>,
451
- f: (self: Router.Route.Handler<R, E>) => App.Default<R1, E1>
452
- ) => Router.Router<Router.Router.ExcludeProvided<R1>, E1>
483
+ <E, R, R1, E1>(
484
+ f: (self: Router.Route.Handler<E, R>) => App.Default<E1, R1>
485
+ ) => (self: Router.Router<E, R>) => Router.Router<E1, Router.Router.ExcludeProvided<R1>>,
486
+ <E, R, R1, E1>(
487
+ self: Router.Router<E, R>,
488
+ f: (self: Router.Route.Handler<E, R>) => App.Default<E1, R1>
489
+ ) => Router.Router<E1, Router.Router.ExcludeProvided<R1>>
453
490
  >(2, (self, f) =>
454
491
  new RouterImpl<any, any>(
455
492
  Chunk.map(
456
493
  self.routes,
457
- (route) => new RouteImpl(route.method, route.path, f(route.handler) as any, route.prefix)
494
+ (route) => new RouteImpl(route.method, route.path, f(route.handler) as any, route.prefix, route.uninterruptible)
458
495
  ),
459
496
  Chunk.map(
460
497
  self.mounts,
@@ -464,39 +501,39 @@ export const use = dual<
464
501
 
465
502
  /** @internal */
466
503
  export const catchAll = dual<
467
- <E, R2, E2>(
468
- f: (e: E) => Router.Route.Handler<R2, E2>
469
- ) => <R>(self: Router.Router<R, E>) => Router.Router<R | Router.Router.ExcludeProvided<R2>, E2>,
470
- <R, E, R2, E2>(
471
- self: Router.Router<R, E>,
472
- f: (e: E) => Router.Route.Handler<R2, E2>
473
- ) => Router.Router<R | Router.Router.ExcludeProvided<R2>, E2>
504
+ <E, E2, R2>(
505
+ f: (e: E) => Router.Route.Handler<E2, R2>
506
+ ) => <R>(self: Router.Router<E, R>) => Router.Router<E2, R | Router.Router.ExcludeProvided<R2>>,
507
+ <R, E, E2, R2>(
508
+ self: Router.Router<E, R>,
509
+ f: (e: E) => Router.Route.Handler<E2, R2>
510
+ ) => Router.Router<E2, R | Router.Router.ExcludeProvided<R2>>
474
511
  >(2, (self, f) => use(self, Effect.catchAll(f)))
475
512
 
476
513
  /** @internal */
477
514
  export const catchAllCause = dual<
478
- <E, R2, E2>(
479
- f: (e: Cause.Cause<E>) => Router.Route.Handler<R2, E2>
480
- ) => <R>(self: Router.Router<R, E>) => Router.Router<R | Router.Router.ExcludeProvided<R2>, E2>,
481
- <R, E, R2, E2>(
482
- self: Router.Router<R, E>,
483
- f: (e: Cause.Cause<E>) => Router.Route.Handler<R2, E2>
484
- ) => Router.Router<R | Router.Router.ExcludeProvided<R2>, E2>
515
+ <E, E2, R2>(
516
+ f: (e: Cause.Cause<E>) => Router.Route.Handler<E2, R2>
517
+ ) => <R>(self: Router.Router<E, R>) => Router.Router<E2, R | Router.Router.ExcludeProvided<R2>>,
518
+ <R, E, E2, R2>(
519
+ self: Router.Router<E, R>,
520
+ f: (e: Cause.Cause<E>) => Router.Route.Handler<E2, R2>
521
+ ) => Router.Router<E2, R | Router.Router.ExcludeProvided<R2>>
485
522
  >(2, (self, f) => use(self, Effect.catchAllCause(f)))
486
523
 
487
524
  /** @internal */
488
525
  export const catchTag = dual<
489
- <K extends (E extends { _tag: string } ? E["_tag"] : never), E, R1, E1>(
526
+ <K extends (E extends { _tag: string } ? E["_tag"] : never), E, E1, R1>(
490
527
  k: K,
491
- f: (e: Extract<E, { _tag: K }>) => Router.Route.Handler<R1, E1>
528
+ f: (e: Extract<E, { _tag: K }>) => Router.Route.Handler<E1, R1>
492
529
  ) => <R>(
493
- self: Router.Router<R, E>
494
- ) => Router.Router<R | Router.Router.ExcludeProvided<R1>, Exclude<E, { _tag: K }> | E1>,
495
- <R, E, K extends (E extends { _tag: string } ? E["_tag"] : never), R1, E1>(
496
- self: Router.Router<R, E>,
530
+ self: Router.Router<E, R>
531
+ ) => Router.Router<Exclude<E, { _tag: K }> | E1, R | Router.Router.ExcludeProvided<R1>>,
532
+ <R, E, K extends (E extends { _tag: string } ? E["_tag"] : never), E1, R1>(
533
+ self: Router.Router<E, R>,
497
534
  k: K,
498
- f: (e: Extract<E, { _tag: K }>) => Router.Route.Handler<R1, E1>
499
- ) => Router.Router<R | Router.Router.ExcludeProvided<R1>, Exclude<E, { _tag: K }> | E1>
535
+ f: (e: Extract<E, { _tag: K }>) => Router.Route.Handler<E1, R1>
536
+ ) => Router.Router<Exclude<E, { _tag: K }> | E1, R | Router.Router.ExcludeProvided<R1>>
500
537
  >(3, (self, k, f) => use(self, Effect.catchTag(k, f)))
501
538
 
502
539
  /** @internal */
@@ -509,17 +546,17 @@ export const catchTags: {
509
546
  {})
510
547
  >(
511
548
  cases: Cases
512
- ): <R>(self: Router.Router<R, E>) => Router.Router<
549
+ ): <R>(self: Router.Router<E, R>) => Router.Router<
550
+ | Exclude<E, { _tag: keyof Cases }>
551
+ | {
552
+ [K in keyof Cases]: Cases[K] extends ((...args: Array<any>) => Effect.Effect<any, infer E, any>) ? E : never
553
+ }[keyof Cases],
513
554
  | R
514
555
  | Router.Router.ExcludeProvided<
515
556
  {
516
557
  [K in keyof Cases]: Cases[K] extends ((...args: Array<any>) => Effect.Effect<any, any, infer R>) ? R : never
517
558
  }[keyof Cases]
518
- >,
519
- | Exclude<E, { _tag: keyof Cases }>
520
- | {
521
- [K in keyof Cases]: Cases[K] extends ((...args: Array<any>) => Effect.Effect<any, infer E, any>) ? E : never
522
- }[keyof Cases]
559
+ >
523
560
  >
524
561
  <
525
562
  R,
@@ -529,19 +566,19 @@ export const catchTags: {
529
566
  } :
530
567
  {})
531
568
  >(
532
- self: Router.Router<R, E>,
569
+ self: Router.Router<E, R>,
533
570
  cases: Cases
534
571
  ): Router.Router<
572
+ | Exclude<E, { _tag: keyof Cases }>
573
+ | {
574
+ [K in keyof Cases]: Cases[K] extends ((...args: Array<any>) => Effect.Effect<any, infer E, any>) ? E : never
575
+ }[keyof Cases],
535
576
  | R
536
577
  | Router.Router.ExcludeProvided<
537
578
  {
538
579
  [K in keyof Cases]: Cases[K] extends ((...args: Array<any>) => Effect.Effect<any, any, infer R>) ? R : never
539
580
  }[keyof Cases]
540
- >,
541
- | Exclude<E, { _tag: keyof Cases }>
542
- | {
543
- [K in keyof Cases]: Cases[K] extends ((...args: Array<any>) => Effect.Effect<any, infer E, any>) ? E : never
544
- }[keyof Cases]
581
+ >
545
582
  >
546
583
  } = dual(2, (self: Router.Router<any, any>, cases: {}) => use(self, Effect.catchTags(cases)))
547
584
 
@@ -550,18 +587,18 @@ export const provideService = dual<
550
587
  tag: T,
551
588
  service: Context.Tag.Service<T>
552
589
  ) => <R, E>(
553
- self: Router.Router<R, E>
554
- ) => Router.Router<Exclude<R, Context.Tag.Identifier<T>>, E>,
590
+ self: Router.Router<E, R>
591
+ ) => Router.Router<E, Exclude<R, Context.Tag.Identifier<T>>>,
555
592
  <R, E, T extends Context.Tag<any, any>>(
556
- self: Router.Router<R, E>,
593
+ self: Router.Router<E, R>,
557
594
  tag: T,
558
595
  service: Context.Tag.Service<T>
559
- ) => Router.Router<Exclude<R, Context.Tag.Identifier<T>>, E>
596
+ ) => Router.Router<E, Exclude<R, Context.Tag.Identifier<T>>>
560
597
  >(3, <R, E, T extends Context.Tag<any, any>>(
561
- self: Router.Router<R, E>,
598
+ self: Router.Router<E, R>,
562
599
  tag: T,
563
600
  service: Context.Tag.Service<T>
564
- ): Router.Router<Exclude<R, Context.Tag.Identifier<T>>, E> => use(self, Effect.provideService(tag, service)))
601
+ ): Router.Router<E, Exclude<R, Context.Tag.Identifier<T>>> => use(self, Effect.provideService(tag, service)))
565
602
 
566
603
  /* @internal */
567
604
  export const provideServiceEffect = dual<
@@ -569,40 +606,33 @@ export const provideServiceEffect = dual<
569
606
  tag: T,
570
607
  effect: Effect.Effect<Context.Tag.Service<T>, E1, R1>
571
608
  ) => <R, E>(
572
- self: Router.Router<R, E>
609
+ self: Router.Router<E, R>
573
610
  ) => Router.Router<
611
+ E | E1,
574
612
  Exclude<
575
613
  R | Router.Router.ExcludeProvided<R1>,
576
614
  Context.Tag.Identifier<T>
577
- >,
578
- E | E1
615
+ >
579
616
  >,
580
617
  <R, E, T extends Context.Tag<any, any>, R1, E1>(
581
- self: Router.Router<R, E>,
618
+ self: Router.Router<E, R>,
582
619
  tag: T,
583
620
  effect: Effect.Effect<Context.Tag.Service<T>, E1, R1>
584
621
  ) => Router.Router<
622
+ E | E1,
585
623
  Exclude<
586
624
  R | Router.Router.ExcludeProvided<R1>,
587
625
  Context.Tag.Identifier<T>
588
- >,
589
- E | E1
626
+ >
590
627
  >
591
628
  >(3, <R, E, T extends Context.Tag<any, any>, R1, E1>(
592
- self: Router.Router<R, E>,
629
+ self: Router.Router<E, R>,
593
630
  tag: T,
594
631
  effect: Effect.Effect<Context.Tag.Service<T>, E1, R1>
595
632
  ): Router.Router<
633
+ E | E1,
596
634
  Exclude<
597
635
  R | Router.Router.ExcludeProvided<R1>,
598
636
  Context.Tag.Identifier<T>
599
- >,
600
- E | E1
637
+ >
601
638
  > => use(self, Effect.provideServiceEffect(tag, effect)) as any)
602
-
603
- /* @internal */
604
- export const uninterruptible = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
605
- Effect.uninterruptible(Effect.flatMap(
606
- effect,
607
- Effect.die
608
- ))
@@ -25,7 +25,7 @@ export const isServer = (u: unknown): u is Server.Server => typeof u === "object
25
25
  export const make = (
26
26
  options: {
27
27
  readonly serve: (
28
- httpApp: App.Default<never, unknown>,
28
+ httpApp: App.Default<unknown>,
29
29
  middleware?: Middleware.Middleware
30
30
  ) => Effect.Effect<void, never, Scope.Scope>
31
31
  readonly address: Server.Address
@@ -36,10 +36,10 @@ export const make = (
36
36
  export const serve = dual<
37
37
  {
38
38
  (): <R, E>(
39
- httpApp: App.Default<R, E>
39
+ httpApp: App.Default<E, R>
40
40
  ) => Layer.Layer<never, never, Server.Server | Exclude<R, ServerRequest.ServerRequest | Scope.Scope>>
41
- <R, E, App extends App.Default<any, any>>(middleware: Middleware.Middleware.Applied<R, E, App>): (
42
- httpApp: App.Default<R, E>
41
+ <R, E, App extends App.Default<any, any>>(middleware: Middleware.Middleware.Applied<App, E, R>): (
42
+ httpApp: App.Default<E, R>
43
43
  ) => Layer.Layer<
44
44
  never,
45
45
  never,
@@ -48,11 +48,11 @@ export const serve = dual<
48
48
  },
49
49
  {
50
50
  <R, E>(
51
- httpApp: App.Default<R, E>
51
+ httpApp: App.Default<E, R>
52
52
  ): Layer.Layer<never, never, Server.Server | Exclude<R, ServerRequest.ServerRequest | Scope.Scope>>
53
53
  <R, E, App extends App.Default<any, any>>(
54
- httpApp: App.Default<R, E>,
55
- middleware: Middleware.Middleware.Applied<R, E, App>
54
+ httpApp: App.Default<E, R>,
55
+ middleware: Middleware.Middleware.Applied<App, E, R>
56
56
  ): Layer.Layer<
57
57
  never,
58
58
  never,
@@ -62,8 +62,8 @@ export const serve = dual<
62
62
  >(
63
63
  (args) => Effect.isEffect(args[0]),
64
64
  <R, E, App extends App.Default<any, any>>(
65
- httpApp: App.Default<R, E>,
66
- middleware?: Middleware.Middleware.Applied<R, E, App>
65
+ httpApp: App.Default<E, R>,
66
+ middleware?: Middleware.Middleware.Applied<App, E, R>
67
67
  ): Layer.Layer<
68
68
  never,
69
69
  never,
@@ -81,14 +81,14 @@ export const serve = dual<
81
81
  export const serveEffect = dual<
82
82
  {
83
83
  (): <R, E>(
84
- httpApp: App.Default<R, E>
84
+ httpApp: App.Default<E, R>
85
85
  ) => Effect.Effect<
86
86
  void,
87
87
  never,
88
88
  Server.Server | Scope.Scope | Exclude<R, ServerRequest.ServerRequest>
89
89
  >
90
- <R, E, App extends App.Default<any, any>>(middleware: Middleware.Middleware.Applied<R, E, App>): (
91
- httpApp: App.Default<R, E>
90
+ <R, E, App extends App.Default<any, any>>(middleware: Middleware.Middleware.Applied<App, E, R>): (
91
+ httpApp: App.Default<E, R>
92
92
  ) => Effect.Effect<
93
93
  void,
94
94
  never,
@@ -97,11 +97,11 @@ export const serveEffect = dual<
97
97
  },
98
98
  {
99
99
  <R, E>(
100
- httpApp: App.Default<R, E>
100
+ httpApp: App.Default<E, R>
101
101
  ): Effect.Effect<void, never, Server.Server | Scope.Scope | Exclude<R, ServerRequest.ServerRequest>>
102
102
  <R, E, App extends App.Default<any, any>>(
103
- httpApp: App.Default<R, E>,
104
- middleware: Middleware.Middleware.Applied<R, E, App>
103
+ httpApp: App.Default<E, R>,
104
+ middleware: Middleware.Middleware.Applied<App, E, R>
105
105
  ): Effect.Effect<
106
106
  void,
107
107
  never,
@@ -111,8 +111,8 @@ export const serveEffect = dual<
111
111
  >(
112
112
  (args) => Effect.isEffect(args[0]),
113
113
  (<R, E, App extends App.Default<any, any>>(
114
- httpApp: App.Default<R, E>,
115
- middleware: Middleware.Middleware.Applied<R, E, App>
114
+ httpApp: App.Default<E, R>,
115
+ middleware: Middleware.Middleware.Applied<App, E, R>
116
116
  ): Effect.Effect<
117
117
  void,
118
118
  never,
@@ -6,7 +6,7 @@ import * as Context from "effect/Context"
6
6
  import * as Effect from "effect/Effect"
7
7
  import * as Inspectable from "effect/Inspectable"
8
8
  import * as Option from "effect/Option"
9
- import type { ReadonlyRecord } from "effect/ReadonlyRecord"
9
+ import type { ReadonlyRecord } from "effect/Record"
10
10
  import type * as Scope from "effect/Scope"
11
11
  import * as Stream from "effect/Stream"
12
12
  import type * as FileSystem from "../../FileSystem.js"