@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.
- package/CHANGELOG.md +22 -0
- package/dist/MainFiberSet.d.ts +1 -1
- package/dist/Operations.d.ts +1 -1
- package/dist/QueueMaker/sbqueue.d.ts +5 -6
- package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
- package/dist/QueueMaker/sbqueue.js +18 -22
- package/dist/RequestFiberSet.d.ts +1 -1
- package/dist/Store/service.d.ts +1 -1
- package/dist/adapters/ServiceBus.d.ts +57 -17
- package/dist/adapters/ServiceBus.d.ts.map +1 -1
- package/dist/adapters/ServiceBus.js +75 -61
- package/dist/adapters/memQueue.d.ts +1 -1
- package/dist/api/ContextProvider.d.ts +3 -3
- package/dist/api/ContextProvider.d.ts.map +1 -1
- package/dist/api/ContextProvider.js +1 -1
- package/dist/api/routing/middleware/middleware-api.d.ts +2 -1
- package/dist/api/routing/middleware/middleware-api.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware-api.js +1 -1
- package/dist/api/routing/middleware.d.ts +0 -1
- package/dist/api/routing/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware.js +1 -2
- package/dist/api/routing.d.ts +9 -13
- package/dist/api/routing.d.ts.map +1 -1
- package/dist/api/routing.js +24 -16
- package/package.json +2 -6
- package/src/QueueMaker/sbqueue.ts +33 -46
- package/src/adapters/ServiceBus.ts +141 -93
- package/src/api/ContextProvider.ts +9 -7
- package/src/api/routing/middleware/middleware-api.ts +2 -1
- package/src/api/routing/middleware.ts +0 -1
- package/src/api/routing.ts +53 -246
- package/test/contextProvider.test.ts +4 -4
- package/test/controller.test.ts +14 -10
- package/test/dist/controller/test2.test.d.ts.map +1 -0
- package/test/dist/controller.legacy2.test.d.ts.map +1 -0
- package/test/dist/controller.legacy3.test.d.ts.map +1 -0
- package/test/dist/controller.test copy.js +129 -0
- package/test/dist/controller.test.d.ts.map +1 -1
- package/test/dist/controller5.test.d.ts.map +1 -0
- package/test/dist/controller6.test.d.ts.map +1 -0
- package/test/dist/controller7.test.d.ts.map +1 -0
- package/test/dist/dynamicContext.test.d.ts.map +1 -0
- package/test/dist/filterApi.test.d.ts.map +1 -0
- package/test/dist/fixtures.d.ts +3 -3
- package/test/dist/fixtures.js +2 -2
- package/test/dist/middleware-api.test.d.ts.map +1 -0
- package/test/dist/requires.d.ts +21 -0
- package/test/dist/requires.d.ts.map +1 -0
- package/test/dist/requires.js +27 -0
- package/test/fixtures.ts +1 -1
- package/vitest.config.ts.timestamp-1711724061890-6ecedb0a07fdd.mjs +0 -0
- package/vitest.config.ts.timestamp-1711743489537-da8d9e5f66c9f.mjs +0 -0
- package/vitest.config.ts.timestamp-1711744615239-dcf257a844e01.mjs +37 -0
- package/dist/api/routing/middleware/dynamic-middleware.d.ts +0 -2
- package/dist/api/routing/middleware/dynamic-middleware.d.ts.map +0 -1
- package/dist/api/routing/middleware/dynamic-middleware.js +0 -2
- /package/{src/api/routing/middleware/dynamic-middleware.ts → vitest.config.ts.timestamp-1711656440838-19c636fe320df.mjs} +0 -0
package/src/api/routing.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
return acc
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
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
|
-
.
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
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
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
>
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
package/test/controller.test.ts
CHANGED
|
@@ -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
|
|
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
|
|
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<
|
|
315
|
+
expectTypeOf({} as Layer.Context<typeof matched>).toEqualTypeOf<
|
|
316
|
+
RpcSerialization.RpcSerialization | SomeService | "str"
|
|
317
|
+
>()
|
|
316
318
|
|
|
317
|
-
type makeContext = MakeContext<typeof router
|
|
318
|
-
expectTypeOf({} as MakeErrors<typeof router
|
|
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<
|
|
373
|
+
expectTypeOf({} as Layer.Context<typeof matched2>).toEqualTypeOf<
|
|
374
|
+
RpcSerialization.RpcSerialization | SomeService | "str"
|
|
375
|
+
>()
|
|
372
376
|
|
|
373
|
-
type makeContext2 = MakeContext<typeof router2
|
|
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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
|