@effect-app/infra 2.92.3 → 2.94.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 (57) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/MainFiberSet.d.ts +1 -1
  3. package/dist/Operations.d.ts +1 -1
  4. package/dist/QueueMaker/sbqueue.d.ts +5 -6
  5. package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
  6. package/dist/QueueMaker/sbqueue.js +18 -22
  7. package/dist/RequestFiberSet.d.ts +1 -1
  8. package/dist/Store/service.d.ts +1 -1
  9. package/dist/adapters/ServiceBus.d.ts +57 -17
  10. package/dist/adapters/ServiceBus.d.ts.map +1 -1
  11. package/dist/adapters/ServiceBus.js +75 -61
  12. package/dist/adapters/memQueue.d.ts +1 -1
  13. package/dist/api/ContextProvider.d.ts +3 -3
  14. package/dist/api/ContextProvider.d.ts.map +1 -1
  15. package/dist/api/ContextProvider.js +1 -1
  16. package/dist/api/routing/middleware/middleware-api.d.ts +2 -1
  17. package/dist/api/routing/middleware/middleware-api.d.ts.map +1 -1
  18. package/dist/api/routing/middleware/middleware-api.js +1 -1
  19. package/dist/api/routing/middleware.d.ts +0 -1
  20. package/dist/api/routing/middleware.d.ts.map +1 -1
  21. package/dist/api/routing/middleware.js +1 -2
  22. package/dist/api/routing.d.ts +9 -13
  23. package/dist/api/routing.d.ts.map +1 -1
  24. package/dist/api/routing.js +24 -16
  25. package/package.json +2 -6
  26. package/src/QueueMaker/sbqueue.ts +33 -46
  27. package/src/adapters/ServiceBus.ts +141 -93
  28. package/src/api/ContextProvider.ts +9 -7
  29. package/src/api/routing/middleware/middleware-api.ts +2 -1
  30. package/src/api/routing/middleware.ts +0 -1
  31. package/src/api/routing.ts +53 -246
  32. package/test/contextProvider.test.ts +4 -4
  33. package/test/controller.test.ts +14 -10
  34. package/test/dist/controller/test2.test.d.ts.map +1 -0
  35. package/test/dist/controller.legacy2.test.d.ts.map +1 -0
  36. package/test/dist/controller.legacy3.test.d.ts.map +1 -0
  37. package/test/dist/controller.test copy.js +129 -0
  38. package/test/dist/controller.test.d.ts.map +1 -1
  39. package/test/dist/controller5.test.d.ts.map +1 -0
  40. package/test/dist/controller6.test.d.ts.map +1 -0
  41. package/test/dist/controller7.test.d.ts.map +1 -0
  42. package/test/dist/dynamicContext.test.d.ts.map +1 -0
  43. package/test/dist/filterApi.test.d.ts.map +1 -0
  44. package/test/dist/fixtures.d.ts +3 -3
  45. package/test/dist/fixtures.js +2 -2
  46. package/test/dist/middleware-api.test.d.ts.map +1 -0
  47. package/test/dist/requires.d.ts +21 -0
  48. package/test/dist/requires.d.ts.map +1 -0
  49. package/test/dist/requires.js +27 -0
  50. package/test/fixtures.ts +1 -1
  51. package/vitest.config.ts.timestamp-1711724061890-6ecedb0a07fdd.mjs +0 -0
  52. package/vitest.config.ts.timestamp-1711743489537-da8d9e5f66c9f.mjs +0 -0
  53. package/vitest.config.ts.timestamp-1711744615239-dcf257a844e01.mjs +37 -0
  54. package/dist/api/routing/middleware/dynamic-middleware.d.ts +0 -2
  55. package/dist/api/routing/middleware/dynamic-middleware.d.ts.map +0 -1
  56. package/dist/api/routing/middleware/dynamic-middleware.js +0 -2
  57. /package/{src/api/routing/middleware/dynamic-middleware.ts → vitest.config.ts.timestamp-1711656440838-19c636fe320df.mjs} +0 -0
@@ -2,10 +2,10 @@
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-argument */
3
3
  /* eslint-disable @typescript-eslint/no-empty-object-type */
4
4
  /* eslint-disable @typescript-eslint/no-explicit-any */
5
- import { Rpc, RpcGroup, RpcServer } from "@effect/rpc"
5
+ import { Rpc, RpcGroup, type RpcSerialization, RpcServer } from "@effect/rpc"
6
6
  import { type Array, Effect, Layer, type NonEmptyReadonlyArray, Predicate, S, Schema, type Scope } from "effect-app"
7
7
  import type { GetEffectContext, GetEffectError, RPCContextMap } from "effect-app/client/req"
8
- import { type HttpHeaders, HttpRouter } from "effect-app/http"
8
+ import { type HttpHeaders } from "effect-app/http"
9
9
  import { typedKeysOf, typedValuesOf } from "effect-app/utils"
10
10
  import { type Service } from "effect/Effect"
11
11
  import type { Contravariant } from "effect/Types"
@@ -15,6 +15,14 @@ import { DevMode, type RouterMiddleware } from "./routing/middleware.js"
15
15
 
16
16
  export * from "./routing/middleware.js"
17
17
 
18
+ // Nice way to underline types that are only there for type testing, not for production use
19
+ // sadly with unique symbols we get weird issues in app projects.
20
+ // api/src/X/PackList.Controllers.ts:21:1 - error TS4082: Default export of the module has or is using private name 'TypeTestId'
21
+ // export const TypeTestId: unique symbol = Symbol.for("@effect/infra/type-test")
22
+ // export type TypeTestId = typeof TypeTestId
23
+ export const TypeTestId = "@effect-app/infra/type-test" as const
24
+ export type TypeTestId = typeof TypeTestId
25
+
18
26
  // it's the result of extending S.Req setting success, config
19
27
  // it's a schema plus some metadata
20
28
  export type AnyRequestModule = S.Schema.Any & {
@@ -91,11 +99,6 @@ type FilterRequestModules<T> = {
91
99
  [K in keyof T as T[K] extends AnyRequestModule ? K : never]: T[K]
92
100
  }
93
101
 
94
- export const RouterSymbol = Symbol()
95
- export interface RouterShape<Resource> {
96
- [RouterSymbol]: Resource
97
- }
98
-
99
102
  type RPCRouteR<
100
103
  T extends [any, (req: any, headers: HttpHeaders.Headers) => Effect<any, any, any>]
101
104
  > = T extends [
@@ -155,8 +158,6 @@ export type RouteMatcher<
155
158
  }
156
159
  }
157
160
 
158
- export class Router extends HttpRouter.Tag("@effect-app/Rpc")<Router>() {}
159
-
160
161
  export const makeRouter = <
161
162
  RequestContextMap extends Record<string, RPCContextMap.Any>,
162
163
  MakeMiddlewareE,
@@ -352,7 +353,12 @@ export const makeRouter = <
352
353
  match: any
353
354
  ) => Effect<THandlers, MakeE, MakeR> | Generator<YieldWrap<Effect<any, MakeE, MakeR>>, THandlers, any>
354
355
  ) => {
355
- type Router = RouterShape<Resource>
356
+ const dependenciesL = Layer.mergeAll(...dependencies as any) as Layer.Layer<
357
+ LayerUtils.GetLayersSuccess<MakeDependencies>,
358
+ LayerUtils.GetLayersError<MakeDependencies>,
359
+ LayerUtils.GetLayersContext<MakeDependencies>
360
+ >
361
+
356
362
  const layer = Effect
357
363
  .gen(function*() {
358
364
  const finalMake = ((make as any)[Symbol.toStringTag] === "GeneratorFunction"
@@ -410,58 +416,44 @@ export const makeRouter = <
410
416
  const rpcs = RpcGroup
411
417
  .make(
412
418
  ...typedValuesOf(mapped).map(([resource]) => {
413
- return Rpc.fromTaggedRequest(resource).annotate(middleware.requestContext, resource.config ?? {})
419
+ return Rpc
420
+ .fromTaggedRequest(resource)
421
+ .annotate(middleware.requestContext, resource.config ?? {})
414
422
  })
415
423
  )
416
424
  .prefix(`${meta.moduleName}.`)
417
425
  .middleware(middleware as any)
418
- const rpcLayer = rpcs.toLayer(Effect.gen(function*() {
419
- return typedValuesOf(mapped).reduce((acc, [resource, handler]) => {
420
- acc[`${meta.moduleName}.${resource._tag}`] = handler
421
- return acc
422
- }, {} as Record<string, any>) as any // TODO
423
- })) as unknown as Layer<
424
- { [K in keyof RequestModules]: Rpc.Handler<K> },
425
- | Layer.Error<typeof middleware.Default>
426
- | LayerUtils.GetLayersError<MakeDependencies>,
427
- | RPCRouteR<typeof mapped[keyof typeof mapped]>
428
- | Layer.Context<typeof middleware.Default>
429
- | LayerUtils.GetLayersContext<MakeDependencies>
430
- >
426
+
427
+ const rpc = rpcs
428
+ .toLayer(Effect.gen(function*() {
429
+ return typedValuesOf(mapped).reduce((acc, [resource, handler]) => {
430
+ acc[`${meta.moduleName}.${resource._tag}`] = handler
431
+ return acc
432
+ }, {} as Record<string, any>) as any // TODO
433
+ })) as unknown as Layer<
434
+ { [K in keyof RequestModules]: Rpc.Handler<K> },
435
+ MakeE,
436
+ RPCRouteR<typeof mapped[keyof typeof mapped]>
437
+ >
431
438
 
432
439
  return RpcServer
433
- .layer(rpcs, { spanPrefix: "RpcServer." + meta.moduleName })
434
- .pipe(Layer.provide(rpcLayer))
435
- .pipe(
436
- Layer.provideMerge(
437
- RpcServer.layerProtocolHttp(
438
- { path: ("/" + meta.moduleName) as `/${typeof meta.moduleName}`, routerTag: Router }
439
- )
440
- )
441
- )
440
+ .layerHttpRouter({
441
+ spanPrefix: "RpcServer." + meta.moduleName,
442
+ group: rpcs,
443
+ path: ("/rpc/" + meta.moduleName) as `/${typeof meta.moduleName}`,
444
+ protocol: "http"
445
+ })
446
+ .pipe(Layer.provide(rpc))
442
447
  })
443
448
  .pipe(Layer.unwrapEffect)
444
449
 
445
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
446
- const routes = (
447
- layer.pipe(
448
- Layer.provide([
449
- ...dependencies ?? [],
450
- middleware.Default
451
- ] as any) as any,
452
- Layer.provide(Layer.succeed(DevMode, devMode))
453
- )
454
- ) as (Layer.Layer<
455
- Router,
456
- | LayerUtils.GetLayersError<MakeDependencies>
457
- | MakeE
458
- | Layer.Error<typeof middleware.Default>,
459
- | LayerUtils.GetLayersContext<MakeDependencies>
460
- | Layer.Context<typeof middleware.Default>
461
- | Exclude<MakeR, LayerUtils.GetLayersSuccess<MakeDependencies>>
462
- >)
463
-
464
- // Effect.Effect<HttpRouter.HttpRouter<unknown, HttpRouter.HttpRouter.DefaultServices>, never, UserRouter>
450
+ const routes = layer.pipe(
451
+ Layer.provide([
452
+ dependenciesL,
453
+ middleware.Default
454
+ ]),
455
+ Layer.provide(Layer.succeed(DevMode, devMode))
456
+ )
465
457
 
466
458
  return {
467
459
  moduleName: meta.moduleName,
@@ -494,7 +486,7 @@ export const makeRouter = <
494
486
  moduleName: ModuleName
495
487
 
496
488
  routes: Layer.Layer<
497
- RouterShape<Resource>,
489
+ never,
498
490
  | MakeErrors<Make>
499
491
  | Service.MakeDepsE<Make>
500
492
  | Layer.Error<typeof middleware.Default>,
@@ -504,169 +496,12 @@ export const makeRouter = <
504
496
  MakeContext<Make>,
505
497
  MakeDepsOut<Make>
506
498
  >
499
+ | RpcSerialization.RpcSerialization
507
500
  >
508
501
 
509
502
  // just for type testing purposes
510
- make: Make
503
+ [TypeTestId]: Make
511
504
  }
512
- // <
513
- // const Make extends {
514
- // dependencies?: Array<Layer.Layer.Any>
515
- // effect: (match: typeof router3) => Effect<
516
- // { [K in keyof FilterRequestModules<Resource>]: AnyHandler<Resource[K]> },
517
- // any,
518
- // any
519
- // >
520
- // /** @deprecated */
521
- // readonly ಠ_ಠ: never
522
- // }
523
- // >(
524
- // make: Make
525
- // ): {
526
- // moduleName: ModuleName
527
-
528
- // routes: Layer.Layer<
529
- // RouterShape<Resource>,
530
- // | MakeErrors<Make>
531
- // | Service.MakeDepsE<Make>
532
- // | Layer.Error<typeof middleware.Default>,
533
- // | Service.MakeDepsIn<Make>
534
- // | Layer.Context<typeof middleware.Default>
535
- // | Exclude<
536
- // MakeContext<Make>,
537
- // MakeDepsOut<Make>
538
- // >
539
- // >
540
-
541
- // // just for type testing purposes
542
- // make: Make
543
- // }
544
- // <
545
- // const Make extends {
546
- // dependencies?: Array<Layer.Layer.Any>
547
- // effect: (match: typeof router3) => Effect<
548
- // { [K in keyof FilterRequestModules<Resource>]: AnyHandler<Resource[K]> },
549
- // any,
550
- // any
551
- // >
552
- // /** @deprecated */
553
- // readonly ಠ_ಠ: never
554
- // }
555
- // >(
556
- // make: Make
557
- // ): {
558
- // moduleName: ModuleName
559
-
560
- // routes: Layer.Layer<
561
- // RouterShape<Resource>,
562
- // | MakeErrors<Make>
563
- // | Service.MakeDepsE<Make>
564
- // | Layer.Error<typeof middleware.Default>,
565
- // | Service.MakeDepsIn<Make>
566
- // | Layer.Context<typeof middleware.Default>
567
- // | Exclude<
568
- // MakeContext<Make>,
569
- // MakeDepsOut<Make>
570
- // >
571
- // >
572
-
573
- // // just for type testing purposes
574
- // make: Make
575
- // }
576
- // <
577
- // const Make extends {
578
- // dependencies?: Array<Layer.Layer.Any>
579
- // effect: (match: typeof router3) => Effect<
580
- // { [K in keyof FilterRequestModules<Resource>]: AnyHandler<Resource[K]> },
581
- // any,
582
- // any
583
- // >
584
- // /** @deprecated */
585
- // readonly ಠ_ಠ: never
586
- // }
587
- // >(
588
- // make: Make
589
- // ): {
590
- // moduleName: ModuleName
591
-
592
- // routes: Layer.Layer<
593
- // RouterShape<Resource>,
594
- // | MakeErrors<Make>
595
- // | Service.MakeDepsE<Make>
596
- // | Layer.Error<typeof middleware.Default>,
597
- // | Service.MakeDepsIn<Make>
598
- // | Layer.Context<typeof middleware.Default>
599
- // | Exclude<
600
- // MakeContext<Make>,
601
- // MakeDepsOut<Make>
602
- // >
603
- // >
604
-
605
- // // just for type testing purposes
606
- // make: Make
607
- // }
608
- // <
609
- // const Make extends {
610
- // dependencies?: Array<Layer.Layer.Any>
611
- // effect: (match: typeof router3) => Effect<
612
- // { [K in keyof FilterRequestModules<Resource>]: AnyHandler<Resource[K]> },
613
- // any,
614
- // any
615
- // >
616
- // /** @deprecated */
617
- // readonly ಠ_ಠ: never
618
- // }
619
- // >(
620
- // make: Make
621
- // ): {
622
- // moduleName: ModuleName
623
-
624
- // routes: Layer.Layer<
625
- // RouterShape<Resource>,
626
- // | MakeErrors<Make>
627
- // | Service.MakeDepsE<Make>
628
- // | Layer.Error<typeof middleware.Default>,
629
- // | Service.MakeDepsIn<Make>
630
- // | Layer.Context<typeof middleware.Default>
631
- // | Exclude<
632
- // MakeContext<Make>,
633
- // MakeDepsOut<Make>
634
- // >
635
- // >
636
-
637
- // // just for type testing purposes
638
- // make: Make
639
- // }
640
- // <
641
- // const Make extends {
642
- // dependencies?: Array<Layer.Layer.Any>
643
- // effect: (match: typeof router3) => Effect<
644
- // { [K in keyof FilterRequestModules<Resource>]: AnyHandler<Resource[K]> },
645
- // any,
646
- // any
647
- // >
648
- // }
649
- // >(
650
- // make: Make
651
- // ): {
652
- // moduleName: ModuleName
653
-
654
- // routes: Layer.Layer<
655
- // RouterShape<Resource>,
656
- // | MakeErrors<Make>
657
- // | Service.MakeDepsE<Make>
658
- // | Layer.Error<typeof middleware.Default>,
659
- // | Service.MakeDepsIn<Make>
660
- // | Layer.Context<typeof middleware.Default>
661
- // | Exclude<
662
- // MakeContext<Make>,
663
- // MakeDepsOut<Make>
664
- // >
665
- // >
666
-
667
- // // just for type testing purposes
668
- // make: Make
669
- // }
670
505
  <
671
506
  const Make extends {
672
507
  dependencies?: Array<Layer.Layer.Any>
@@ -688,7 +523,7 @@ export const makeRouter = <
688
523
  moduleName: ModuleName
689
524
 
690
525
  routes: Layer.Layer<
691
- RouterShape<Resource>,
526
+ never,
692
527
  | MakeErrors<Make>
693
528
  | Service.MakeDepsE<Make>
694
529
  | Layer.Error<typeof middleware.Default>,
@@ -698,39 +533,12 @@ export const makeRouter = <
698
533
  MakeContext<Make>,
699
534
  MakeDepsOut<Make>
700
535
  >
536
+ | RpcSerialization.RpcSerialization
701
537
  >
702
538
 
703
539
  // just for type testing purposes
704
- make: Make
540
+ readonly [TypeTestId]: Make
705
541
  }
706
- // <
707
- // const Make extends {
708
- // dependencies: [
709
- // ...Make["dependencies"],
710
- // ...Exclude<Effect.Context<ReturnType<Make["effect"]>>, MakeDepsOut<Make>> extends never ? []
711
- // : [Layer.Layer<Exclude<Effect.Context<ReturnType<Make["effect"]>>, MakeDepsOut<Make>>, never, never>]
712
- // ]
713
- // effect: (match: typeof router3) => Effect<
714
- // { [K in keyof FilterRequestModules<Resource>]: AnyHandler<Resource[K]> },
715
- // any,
716
- // any
717
- // >
718
- // }
719
- // >(
720
- // make: Make
721
- // ): {
722
- // moduleName: ModuleName
723
- // Router: HttpRouter.HttpRouter.TagClass<
724
- // RouterShape<Resource>,
725
- // `${ModuleName}Router`,
726
- // never,
727
- // never
728
- // >
729
- // routes: any
730
-
731
- // // just for type testing purposes
732
- // make: Make
733
- // }
734
542
  } =
735
543
  ((make: { dependencies: any; effect: any }) =>
736
544
  Object.assign(makeRoutes(make.dependencies, make.effect), { make })) as any
@@ -741,8 +549,7 @@ export const makeRouter = <
741
549
  function matchAll<
742
550
  T extends {
743
551
  [key: string]: {
744
- // Router: { router: Effect<HttpRouter.HttpRouter<any, any>, any, any> }
745
- routes: Layer.Layer<any, any, any>
552
+ routes: Layer.Layer<never, any, any>
746
553
  moduleName: string
747
554
  }
748
555
  }
@@ -755,7 +562,7 @@ export const makeRouter = <
755
562
  never,
756
563
  Layer.Layer.Error<typeof handlers[keyof typeof handlers]["routes"]>,
757
564
  Layer.Layer.Context<typeof handlers[keyof typeof handlers]["routes"]>
758
- > // TODO
565
+ >
759
566
  }
760
567
 
761
568
  return {
@@ -12,7 +12,7 @@ class MyContextProvider extends Effect.Service<MyContextProvider>()("MyContextPr
12
12
  if (Math.random() > 0.5) return yield* new CustomError1()
13
13
 
14
14
  return Effect.gen(function*() {
15
- // the only requirements you can have are the one provided by HttpRouter.HttpRouter.Provided
15
+ // the only requirements you can have are the one provided by HttpLayerRouter.Provided
16
16
  yield* Scope.Scope
17
17
 
18
18
  yield* Effect.logInfo("MyContextProviderGen", "this is a generator")
@@ -63,7 +63,7 @@ class MyContextProviderGen extends Effect.Service<MyContextProviderGen>()("MyCon
63
63
  if (Math.random() > 0.5) return yield* new CustomError1()
64
64
 
65
65
  return function*() {
66
- // the only requirements you can have are the one provided by HttpRouter.HttpRouter.Provided
66
+ // the only requirements you can have are the one provided by HttpLayerRouter.Provided
67
67
  yield* Scope.Scope
68
68
 
69
69
  yield* Effect.logInfo("MyContextProviderGen", "this is a generator")
@@ -87,7 +87,7 @@ export const someContextProvider = ContextProvider({
87
87
  if (Math.random() > 0.5) return yield* new CustomError1()
88
88
 
89
89
  return Effect.gen(function*() {
90
- // the only requirements you can have are the one provided by HttpRouter.HttpRouter.Provided
90
+ // the only requirements you can have are the one provided by HttpLayerRouter.Provided
91
91
  yield* Scope.Scope
92
92
 
93
93
  // not allowed
@@ -106,7 +106,7 @@ export const someContextProviderGen = ContextProvider({
106
106
  if (Math.random() > 0.5) return yield* new CustomError1()
107
107
 
108
108
  return function*() {
109
- // the only requirements you can have are the one provided by HttpRouter.HttpRouter.Provided
109
+ // the only requirements you can have are the one provided by HttpLayerRouter.Provided
110
110
  yield* Scope.Scope
111
111
 
112
112
  // not allowed
@@ -1,6 +1,7 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
3
- import { type MakeContext, type MakeErrors, makeRouter } from "@effect-app/infra/api/routing"
3
+ import { type MakeContext, type MakeErrors, makeRouter, TypeTestId } from "@effect-app/infra/api/routing"
4
+ import { type RpcSerialization } from "@effect/rpc"
4
5
  import { expect, expectTypeOf, it } from "@effect/vitest"
5
6
  import { Context, Effect, Layer, S, Scope } from "effect-app"
6
7
  import { InvalidStateError, makeRpcClient, NotLoggedInError, UnauthorizedError } from "effect-app/client"
@@ -19,7 +20,7 @@ class MyContextProvider extends Middleware.Tag<MyContextProvider>()("MyContextPr
19
20
 
20
21
  return Effect.fnUntraced(function*() {
21
22
  yield* SomeElse
22
- // the only requirements you can have are the one provided by HttpRouter.HttpRouter.Provided
23
+ // the only requirements you can have are the one provided by HttpLayerRouter.Provided
23
24
  yield* Scope.Scope
24
25
 
25
26
  yield* Effect.logInfo("MyContextProviderGen", "this is a generator")
@@ -49,7 +50,7 @@ class MyContextProvider3 extends Middleware.Tag<MyContextProvider3>()("MyContext
49
50
 
50
51
  return Effect.fnUntraced(function*() {
51
52
  yield* SomeElse
52
- // the only requirements you can have are the one provided by HttpRouter.HttpRouter.Provided
53
+ // the only requirements you can have are the one provided by HttpLayerRouter.Provided
53
54
  yield* Scope.Scope
54
55
 
55
56
  yield* Effect.logInfo("MyContextProviderGen", "this is a generator")
@@ -132,8 +133,7 @@ const middlewareTrisWip = makeMiddleware<RequestContextMap>(RequestContextMap)
132
133
  MyContextProvider,
133
134
  RequireRoles,
134
135
  Test
135
- )
136
- .missing
136
+ )[TypeTestId]
137
137
 
138
138
  expectTypeOf(middlewareTrisWip).toEqualTypeOf<{
139
139
  missingDynamicMiddlewares: "allowAnonymous"
@@ -312,10 +312,12 @@ it("sorts based on requirements", () => {
312
312
 
313
313
  // eslint-disable-next-line unused-imports/no-unused-vars
314
314
  const matched = matchAll({ router })
315
- expectTypeOf({} as Layer.Context<typeof matched>).toEqualTypeOf<SomeService | "str">()
315
+ expectTypeOf({} as Layer.Context<typeof matched>).toEqualTypeOf<
316
+ RpcSerialization.RpcSerialization | SomeService | "str"
317
+ >()
316
318
 
317
- type makeContext = MakeContext<typeof router.make>
318
- expectTypeOf({} as MakeErrors<typeof router.make>).toEqualTypeOf<InvalidStateError>()
319
+ type makeContext = MakeContext<typeof router[TypeTestId]>
320
+ expectTypeOf({} as MakeErrors<typeof router[TypeTestId]>).toEqualTypeOf<InvalidStateError>()
319
321
  expectTypeOf({} as makeContext).toEqualTypeOf<
320
322
  SomethingService | SomethingRepo | SomethingService2
321
323
  >()
@@ -368,7 +370,9 @@ const router2 = r2.Router(Something)({
368
370
 
369
371
  // eslint-disable-next-line unused-imports/no-unused-vars
370
372
  const matched2 = matchAll({ router: router2 })
371
- expectTypeOf({} as Layer.Context<typeof matched2>).toEqualTypeOf<SomeService | "str">()
373
+ expectTypeOf({} as Layer.Context<typeof matched2>).toEqualTypeOf<
374
+ RpcSerialization.RpcSerialization | SomeService | "str"
375
+ >()
372
376
 
373
- type makeContext2 = MakeContext<typeof router2.make>
377
+ type makeContext2 = MakeContext<typeof router2[TypeTestId]>
374
378
  expectTypeOf({} as makeContext2).toEqualTypeOf<never>()
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test2.test.d.ts","sourceRoot":"","sources":["../../controller/test2.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAA8B,MAAM,+BAA+B,CAAA;AAC7G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAEtE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAY,MAAM,YAAY,CAAA;AAChE,OAAO,EAAE,KAAK,gBAAgB,EAAoC,KAAK,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAClI,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAGxD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;;;;;;;;AAE9C,cAAM,WAAY,SAAQ,gBAIzB;CACA;;;;;;AAED,cAAM,gBAAiB,SAAQ,qBAE7B;CAAG;AAKL,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,cAAc,CAAA;CACxB;;;;;;;;;;;;;;;;;;;;;;;;;AAED,qBAAa,IAAK,SAAQ,SAA2D;CAAG;;;;;AAExF,qBAAa,YAAa,SAAQ,iBAQhC;CAAG;AAEL,MAAM,MAAM,MAAM,GAAG;IACnB,cAAc,EAAE,aAAa,CAAC,QAAQ,CAAC,aAAa,EAAE,WAAW,EAAE,OAAO,gBAAgB,CAAC,CAAA;IAE3F,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,iBAAiB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;CACvF,CAAA;AAsGD,MAAM,MAAM,aAAa,GAAG;IAC1B,yCAAyC;IACzC,cAAc,CAAC,EAAE,IAAI,CAAA;IACrB,iEAAiE;IACjE,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC/B,CAAA;AACD,eAAO,MAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAG/B,CAAA;;;;;;;;;;AAEF,qBAAa,GAAI,SAAQ,QAA0C;CAAG;;;;;;;;;;AACtE,qBAAa,GAAI,SAAQ,QAA0C;CAAG;;;;;;;;;;;;AAEtE,qBAAa,WAAY,SAAQ,gBAEV;CAAG;;;;;;;;;;;;AAE1B,qBAAa,YAAa,SAAQ,iBAET;CAAG;;;;;;;;;;;;AAE5B,qBAAa,aAAc,SAAQ,kBAEA;CAAG;;;;;AAItC,qBAAa,gBAAiB,SAAQ,qBAKpC;CAAG;;;;;AASL,qBAAa,aAAc,SAAQ,kBAOjC;CAAG;;;;;AAEL,qBAAa,iBAAkB,SAAQ,sBAKrC;CAAG;AAEL,eAAO,MAAQ,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAE,QAAQ;;;;;2HAAE,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qFAAiC,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.legacy2.test.d.ts","sourceRoot":"","sources":["../controller.legacy2.test.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AACtE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAEjC,OAAO,EAAW,MAAM,EAAY,KAAK,EAAE,CAAC,EAAY,MAAM,YAAY,CAAA;AAC1E,OAAO,EAAwC,KAAK,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC/G,OAAO,EAAe,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAOhE,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,cAAc,CAAA;CACxB;AAED,MAAM,MAAM,MAAM,GAAG;IAGnB,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,iBAAiB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;CACvF,CAAA;AAmGD,eAAO,MAAQ,QAAQ;;;;;gBAevB,MAAO,KAAK;;;;;;GAfa,QAAQ;;;;;;iDAyD3B,MAAA,KAAK,CAAC,GAAG;;;sBApJkE,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;;;;;;sBADgF,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;sBADgF,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;sBADgF,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;;;iDAsK0yC,MAAM,KAAK,CAAC,GAAG;;;sBAvKzuC,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;;;;;;sBADgF,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;sBADgF,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;sBADgF,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;;;iDAsKmmG,MAAM,KAAK,CAAC,GAAG;;;sBAvKliG,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;;;;;;sBADgF,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;sBADgF,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;sBADgF,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;;;iDAsK45J,MAAM,KAAK,CAAC,GAAG;;;sBAvK31J,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;;;;;;sBADgF,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;sBADgF,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;sBADgF,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;;;iDAsKgrN,MAAM,KAAK,CAAC,GAAG;;;sBAvK/mN,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;;;;;sBADgF,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;sBADgF,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;sBADgF,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;;;;;;sBADgF,EAAG,MAAM,CAAC,GAAG;sBAAe,EAAG,MAAM,CAAC,GACtH;;;;;;;;;;;kBADgF,EAAG,MAAM,CAAC,GAAG;kBAAe,EAAG,MAAM,CAAC,GACtH;;;kBADgF,EAAG,MAAM,CAAC,GAAG;kBAAe,EAAG,MAAM,CAAC,GACtH;;CA0FiE,CAAA;AAElE,MAAM,MAAM,aAAa,GAAG;IAC1B,yCAAyC;IACzC,cAAc,CAAC,EAAE,IAAI,CAAA;IACrB,iEAAiE;IACjE,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC/B,CAAA;AACD,eAAO,MAAuB,GAAG;yCAxEL,EAAG,MAAM,CAAC,MAAM;iBAgClC,EA/BK,MACb,CA8BQ,GA9BJ,GA8BI,EA9BC,MAEV,CA4BS,MA5BF;iBAAuB,EAAE,MAC9B,CA2BO,GA3BH,GA2BG,EA3BG,MAAK,CAAC,MAAM;;;;;;2CASkB,EAAG,MAAM,CAAC,MAAM;iBAkBjD,EAAA,MAjBA,CAAC,GAAG,GAAE,EAAG,MAAM,CAAC,MAAM;;;;;;2CAiBtB,EAPO,MAAC,CAAC,MAAM;iBACA,EAAG,MAAM,CAAC,GAAG,GAAE,EAAG,MAAM,CAAC,MAAM;;;;;;2CAc1C,EAAA,MAAL,CAAK,MAAE;;;;;2CAMqC,EAAG,MAAM,CAAC,MAAM;;;;;CA6BnE,CAAA;;;;;;;;;;AAEF,qBAAa,YAAa,SAAQ,iBAEX;CAAG;;;;;;;;;;AAE1B,qBAAa,gBAAiB,SAAQ,qBAEb;CAAG;;;;;AAI5B,qBAAa,gBAAiB,SAAQ,qBAKpC;CAAG;;;;;AASL,qBAAa,aAAc,SAAQ,kBAOjC;CAAG;;;;;AAEL,qBAAa,iBAAkB,SAAQ,sBAKrC;CAAG"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.legacy3.test.d.ts","sourceRoot":"","sources":["../controller.legacy3.test.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AACtE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAEjC,OAAO,EAAW,MAAM,EAAY,KAAK,EAAE,CAAC,EAAY,MAAM,YAAY,CAAA;AAC1E,OAAO,EAAwC,KAAK,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC/G,OAAO,EAAe,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAOhE,MAAM,WAAW,GAAG;IAClB,OAAO,EAAE,cAAc,CAAA;CACxB;AAED,MAAM,MAAM,MAAM,GAAG;IAGnB,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,iBAAiB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;CACvF,CAAA;AAmGD,eAAO,MAAQ,QAAQ;;;;;gBA0EgwD,MAAO,KAAK;;;;;;GA1E1wD,QAAQ;;;;;;iDA0Eq0F,MAAM,KAAK,CAAC,GAAG;;;;;;;;;;;;iDAAg1D,MAAM,KAAK,CAAC,GAAG;;;;;;;;;;;;iDAAg1D,MAAM,KAAK,CAAC,GAAG;;;;;;;;;;;;iDAAg1D,MAAM,KAAK,CAAC,GAAG;;;;;;;;;;;;iDAA2yD,MAAM,KAAK,CAAC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CA1E1oU,CAAA;AAElE,MAAM,MAAM,aAAa,GAAG;IAC1B,yCAAyC;IACzC,cAAc,CAAC,EAAE,IAAI,CAAA;IACrB,iEAAiE;IACjE,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC/B,CAAA;AACD,eAAO,MAAuB,GAAG;yCAxEL,EAAG,MAAM,CAAC,MAAM;iBAgClC,EA/BK,MACb,CA8BQ,GA9BJ,GA8BI,EA9BC,MAEV,CA4BS,MA5BF;iBAAuB,EAAE,MAC9B,CA2BO,GA3BH,GA2BG,EA3BG,MAAK,CAAC,MAAM;;;;;;2CASkB,EAAG,MAAM,CAAC,MAAM;iBAkBjD,EAAA,MAjBA,CAAC,GAAG,GAAE,EAAG,MAAM,CAAC,MAAM;;;;;;2CAiBtB,EAPO,MAAC,CAAC,MAAM;iBACA,EAAG,MAAM,CAAC,GAAG,GAAE,EAAG,MAAM,CAAC,MAAM;;;;;;2CAc1C,EAAA,MAAL,CAAK,MAAE;;;;;2CAMqC,EAAG,MAAM,CAAC,MAAM;;;;;CA6BnE,CAAA;;;;;;;;;;AAEF,qBAAa,YAAa,SAAQ,iBAEX;CAAG;;;;;;;;;;AAE1B,qBAAa,gBAAiB,SAAQ,qBAEb;CAAG;;;;;AAI5B,qBAAa,gBAAiB,SAAQ,qBAKpC;CAAG;;;;;AASL,qBAAa,aAAc,SAAQ,kBAOjC;CAAG;;;;;AAEL,qBAAa,iBAAkB,SAAQ,sBAKrC;CAAG"}
@@ -0,0 +1,129 @@
1
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
2
+ import { Rpc } from "@effect/rpc";
3
+ import { Context, Effect, FiberRef, Layer, S, Schedule } from "effect-app";
4
+ import { makeRpcClient, UnauthorizedError } from "effect-app/client";
5
+ import { HttpHeaders, HttpServerRequest } from "effect-app/http";
6
+ import { makeMiddleware, makeRouter } from "../src/api/routing5.js";
7
+ const optimisticConcurrencySchedule = Schedule.once
8
+ && Schedule.recurWhile((a) => a?._tag === "OptimisticConcurrencyException");
9
+ const middleware = makeMiddleware({
10
+ contextMap: null,
11
+ // helper to deal with nested generic lmitations
12
+ context: null,
13
+ execute: Effect.gen(function* () {
14
+ return (schema, handler, moduleName) => (req) => Effect
15
+ .gen(function* () {
16
+ const headers = yield* Rpc.currentHeaders;
17
+ const ctx = Context.empty();
18
+ const config = "config" in schema ? schema.config : undefined;
19
+ // Check JWT
20
+ // TODO
21
+ // if (!fakeLogin && !request.allowAnonymous) {
22
+ // yield* Effect.catchAll(
23
+ // checkJWTI({
24
+ // ...authConfig,
25
+ // issuer: authConfig.issuer + "/",
26
+ // jwksUri: `${authConfig.issuer}/.well-known/jwks.json`
27
+ // }),
28
+ // (err) => Effect.fail(new JWTError({ error: err }))
29
+ // )
30
+ // }
31
+ // const fakeLogin = true
32
+ // const r = (fakeLogin
33
+ // ? makeUserProfileFromUserHeader(headers["x-user"])
34
+ // : makeUserProfileFromAuthorizationHeader(
35
+ // headers["authorization"]
36
+ // ))
37
+ // .pipe(Effect.exit, basicRuntime.runSync)
38
+ // if (!Exit.isSuccess(r)) {
39
+ // yield* Effect.logWarning("Parsing userInfo failed").pipe(Effect.annotateLogs("r", r))
40
+ // }
41
+ // const userProfile = Option.fromNullable(Exit.isSuccess(r) ? r.value : undefined)
42
+ // if (Option.isSome(userProfile)) {
43
+ // // yield* rcc.update((_) => ({ ..._, userPorfile: userProfile.value }))
44
+ // ctx = ctx.pipe(Context.add(UserProfile, userProfile.value))
45
+ // } else if (!config?.allowAnonymous) {
46
+ // return yield* new NotLoggedInError({ message: "no auth" })
47
+ // }
48
+ // if (config?.requireRoles) {
49
+ // // TODO
50
+ // if (
51
+ // !userProfile.value
52
+ // || !config.requireRoles.every((role: any) => userProfile.value!.roles.includes(role))
53
+ // ) {
54
+ // return yield* new UnauthorizedError()
55
+ // }
56
+ // }
57
+ return yield* handler(req).pipe(Effect.retry(optimisticConcurrencySchedule), Effect.provide(ctx));
58
+ })
59
+ .pipe(Effect.provide(Effect
60
+ .gen(function* () {
61
+ yield* Effect.annotateCurrentSpan("request.name", moduleName ? `${moduleName}.${req._tag}` : req._tag);
62
+ // yield* RequestContextContainer.update((_) => ({
63
+ // ..._,
64
+ // name: NonEmptyString255(moduleName ? `${moduleName}.${req._tag}` : req._tag)
65
+ // }))
66
+ const httpReq = yield* HttpServerRequest.HttpServerRequest;
67
+ // TODO: only pass Authentication etc, or move headers to actual Rpc Headers
68
+ yield* FiberRef.update(Rpc.currentHeaders, (headers) => HttpHeaders.merge(httpReq.headers, headers));
69
+ })
70
+ .pipe(Layer.effectDiscard)));
71
+ // .pipe(Effect.provide(RequestCacheLayers)) as any
72
+ })
73
+ });
74
+ export const { matchAll, matchFor } = makeRouter(middleware, true);
75
+ export const { TaggedRequest: Req } = makeRpcClient({
76
+ // allowAnonymous: NotLoggedInError,
77
+ requireRoles: UnauthorizedError
78
+ });
79
+ export class GetSomething extends Req()("GetSomething", {
80
+ id: S.String
81
+ }, { success: S.Void }) {
82
+ }
83
+ export class GetSomethingElse extends Req()("GetSomethingElse", {
84
+ id: S.String
85
+ }, { success: S.String }) {
86
+ }
87
+ const Something = { GetSomething, GetSomethingElse, meta: { moduleName: "Something" } };
88
+ export class SomethingService extends Effect.Service()("SomethingService", {
89
+ dependencies: [],
90
+ effect: Effect.gen(function* () {
91
+ return {};
92
+ })
93
+ }) {
94
+ }
95
+ const c = a({ a: 5 });
96
+ export class SomethingRepo extends Effect.Service()("SomethingRepo", {
97
+ dependencies: [SomethingService.Default],
98
+ effect: Effect.gen(function* () {
99
+ const smth = yield* SomethingService;
100
+ return {};
101
+ })
102
+ }) {
103
+ }
104
+ export class SomethingService2 extends Effect.Service()("SomethingService2", {
105
+ dependencies: [],
106
+ effect: Effect.gen(function* () {
107
+ return {};
108
+ })
109
+ }) {
110
+ }
111
+ const { handle, routes } = matchFor(Something);
112
+ const d = handle({
113
+ dependencies: [
114
+ SomethingRepo.Default,
115
+ SomethingService.Default
116
+ // SomethingService2.Default
117
+ ],
118
+ effect: Effect.gen(function* () {
119
+ const repo = yield* SomethingRepo;
120
+ const smth = yield* SomethingService;
121
+ const smth2 = yield* SomethingService2;
122
+ const { GetSomething, GetSomethingElse } = routes;
123
+ return {
124
+ GetSomething: GetSomething(Effect.void),
125
+ GetSomethingElse: GetSomethingElse(Effect.succeed("12"))
126
+ };
127
+ })
128
+ });
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci50ZXN0IGNvcHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9jb250cm9sbGVyLnRlc3QgY29weS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrREFBK0Q7QUFDL0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUVqQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDMUUsT0FBTyxFQUF5QixhQUFhLEVBQXNCLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDL0csT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBRWhFLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFHbkUsTUFBTSw2QkFBNkIsR0FBRyxRQUFRLENBQUMsSUFBSTtPQUM5QyxRQUFRLENBQUMsVUFBVSxDQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxLQUFLLGdDQUFnQyxDQUFDLENBQUE7QUFXbEYsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDO0lBQ2hDLFVBQVUsRUFBRSxJQUF5QjtJQUNyQyxnREFBZ0Q7SUFDaEQsT0FBTyxFQUFFLElBQWtEO0lBQzNELE9BQU8sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUMzQixPQUFPLENBQ0wsTUFBcUMsRUFDckMsT0FBaUgsRUFDakgsVUFBbUIsRUFDbkIsRUFBRSxDQUNKLENBQ0UsR0FBUSxFQU1SLEVBQUUsQ0FDRixNQUFNO2FBQ0gsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUNaLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUE7WUFDekMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtB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