@effect-app/infra 0.7.0 → 0.8.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 +13 -0
- package/_cjs/errors.cjs +21 -22
- package/_cjs/errors.cjs.map +1 -1
- package/_cjs/lib/api/authorization.jwt.cjs +1 -1
- package/_cjs/{vendor/Cache/Cache/operations/makeWith.cjs → lib/api/codec.cjs} +16 -13
- package/_cjs/lib/api/codec.cjs.map +1 -0
- package/_cjs/{services/memQueue.cjs → lib/api/express/makeJsonSchema.cjs} +42 -22
- package/_cjs/lib/api/express/makeJsonSchema.cjs.map +1 -0
- package/_cjs/lib/api/express/makeOpenApiSpecs.cjs +66 -0
- package/_cjs/lib/api/express/makeOpenApiSpecs.cjs.map +1 -0
- package/_cjs/lib/api/express/schema/jwt.cjs +43 -0
- package/_cjs/lib/api/express/schema/jwt.cjs.map +1 -0
- package/_cjs/lib/api/express/schema/requestHandler.cjs +166 -0
- package/_cjs/lib/api/express/schema/requestHandler.cjs.map +1 -0
- package/_cjs/lib/api/express/schema/routing.cjs +121 -0
- package/_cjs/lib/api/express/schema/routing.cjs.map +1 -0
- package/_cjs/lib/api/routing.cjs +28 -28
- package/_cjs/lib/api/routing.cjs.map +1 -1
- package/_cjs/lib/api/writeDocs.cjs +4 -4
- package/_cjs/lib/api/writeDocs.cjs.map +1 -1
- package/_cjs/services/Store/Disk.cjs +1 -1
- package/_cjs/services/simpledb/cosmosdb.cjs +98 -0
- package/_cjs/services/simpledb/cosmosdb.cjs.map +1 -0
- package/_cjs/services/simpledb/diskdb.cjs +118 -0
- package/_cjs/services/simpledb/diskdb.cjs.map +1 -0
- package/_cjs/services/simpledb/fileutil.cjs +36 -0
- package/_cjs/services/simpledb/fileutil.cjs.map +1 -0
- package/_cjs/{vendor/Cache/Cache/_internal/CacheState.cjs → services/simpledb/index.cjs} +31 -24
- package/_cjs/services/simpledb/index.cjs.map +1 -0
- package/_cjs/services/simpledb/memdb.cjs +74 -0
- package/_cjs/services/simpledb/memdb.cjs.map +1 -0
- package/_cjs/services/simpledb/mongodb.cjs +86 -0
- package/_cjs/services/simpledb/mongodb.cjs.map +1 -0
- package/_cjs/services/simpledb/redisdb.cjs +120 -0
- package/_cjs/services/simpledb/redisdb.cjs.map +1 -0
- package/_cjs/services/simpledb/shared.cjs +80 -0
- package/_cjs/services/simpledb/shared.cjs.map +1 -0
- package/_cjs/services/simpledb/simpledb.cjs +77 -0
- package/_cjs/services/simpledb/simpledb.cjs.map +1 -0
- package/_src/_global.ext.ts +1 -1
- package/_src/errors.ts +12 -3
- package/_src/lib/api/app.ts.bak +125 -0
- package/_src/lib/api/authorization.jwt.ts +1 -1
- package/_src/lib/api/codec.ts +27 -0
- package/_src/lib/api/errors.ts.bak +20 -0
- package/_src/lib/api/express/makeJsonSchema.ts +49 -0
- package/_src/lib/api/express/makeOpenApiSpecs.ts +60 -0
- package/_src/lib/api/express/routing.ts.bak +460 -0
- package/_src/lib/api/express/schema/jwt.ts +38 -0
- package/_src/lib/api/express/schema/requestHandler.ts +360 -0
- package/_src/lib/api/express/schema/routing.ts +202 -0
- package/_src/lib/api/routing.ts +5 -10
- package/_src/lib/api/writeDocs.ts +4 -5
- package/_src/services/Store/Disk.ts +1 -1
- package/_src/services/simpledb/cosmosdb.ts +134 -0
- package/_src/services/simpledb/diskdb.ts +158 -0
- package/_src/services/simpledb/fileutil.ts +28 -0
- package/_src/services/simpledb/index.ts +6 -0
- package/_src/services/simpledb/memdb.ts +79 -0
- package/_src/services/simpledb/mongodb.ts +99 -0
- package/_src/services/simpledb/redisdb.ts +182 -0
- package/_src/services/simpledb/shared.ts +117 -0
- package/_src/services/simpledb/simpledb.ts +117 -0
- package/dist/_global.ext.d.ts +1 -1
- package/dist/_global.ext.d.ts.map +1 -1
- package/dist/errors.d.ts +11 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +17 -3
- package/dist/lib/api/authorization.jwt.d.ts +1 -1
- package/dist/lib/api/authorization.jwt.d.ts.map +1 -1
- package/dist/lib/api/authorization.jwt.js +2 -2
- package/dist/lib/api/codec.d.ts +7 -0
- package/dist/lib/api/codec.d.ts.map +1 -0
- package/dist/lib/api/codec.js +19 -0
- package/dist/lib/api/express/makeJsonSchema.d.ts +30 -0
- package/dist/lib/api/express/makeJsonSchema.d.ts.map +1 -0
- package/dist/lib/api/express/makeJsonSchema.js +40 -0
- package/dist/lib/api/express/makeOpenApiSpecs.d.ts +55 -0
- package/dist/lib/api/express/makeOpenApiSpecs.d.ts.map +1 -0
- package/dist/lib/api/express/makeOpenApiSpecs.js +56 -0
- package/dist/lib/api/express/schema/jwt.d.ts +5 -0
- package/dist/lib/api/express/schema/jwt.d.ts.map +1 -0
- package/dist/lib/api/express/schema/jwt.js +32 -0
- package/dist/lib/api/express/schema/requestHandler.d.ts +71 -0
- package/dist/lib/api/express/schema/requestHandler.d.ts.map +1 -0
- package/dist/lib/api/express/schema/requestHandler.js +140 -0
- package/dist/lib/api/express/schema/routing.d.ts +45 -0
- package/dist/lib/api/express/schema/routing.d.ts.map +1 -0
- package/dist/lib/api/express/schema/routing.js +95 -0
- package/dist/lib/api/routing.d.ts +4 -4
- package/dist/lib/api/routing.d.ts.map +1 -1
- package/dist/lib/api/routing.js +29 -28
- package/dist/lib/api/writeDocs.d.ts +1 -1
- package/dist/lib/api/writeDocs.d.ts.map +1 -1
- package/dist/lib/api/writeDocs.js +5 -5
- package/dist/services/Store/Disk.js +2 -2
- package/dist/services/simpledb/cosmosdb.d.ts +13 -0
- package/dist/services/simpledb/cosmosdb.d.ts.map +1 -0
- package/dist/services/simpledb/cosmosdb.js +88 -0
- package/dist/services/simpledb/diskdb.d.ts +12 -0
- package/dist/services/simpledb/diskdb.d.ts.map +1 -0
- package/dist/services/simpledb/diskdb.js +96 -0
- package/dist/services/simpledb/fileutil.d.ts +7 -0
- package/dist/services/simpledb/fileutil.d.ts.map +1 -0
- package/dist/services/simpledb/fileutil.js +25 -0
- package/dist/services/simpledb/index.d.ts +7 -0
- package/dist/services/simpledb/index.d.ts.map +1 -0
- package/dist/services/simpledb/index.js +7 -0
- package/dist/services/simpledb/memdb.d.ts +12 -0
- package/dist/services/simpledb/memdb.d.ts.map +1 -0
- package/dist/services/simpledb/memdb.js +55 -0
- package/dist/services/simpledb/mongodb.d.ts +13 -0
- package/dist/services/simpledb/mongodb.d.ts.map +1 -0
- package/dist/services/simpledb/mongodb.js +55 -0
- package/dist/services/simpledb/redisdb.d.ts +25 -0
- package/dist/services/simpledb/redisdb.d.ts.map +1 -0
- package/dist/services/simpledb/redisdb.js +105 -0
- package/dist/services/simpledb/shared.d.ts +63 -0
- package/dist/services/simpledb/shared.d.ts.map +1 -0
- package/dist/services/simpledb/shared.js +65 -0
- package/dist/services/simpledb/simpledb.d.ts +23 -0
- package/dist/services/simpledb/simpledb.d.ts.map +1 -0
- package/dist/services/simpledb/simpledb.js +56 -0
- package/package.json +126 -238
- package/_cjs/ext.cjs +0 -4
- package/_cjs/ext.cjs.map +0 -1
- package/_cjs/lib/fileUtil.cjs +0 -36
- package/_cjs/lib/fileUtil.cjs.map +0 -1
- package/_cjs/services/CUPS/service.cjs +0 -15
- package/_cjs/services/CUPS/service.cjs.map +0 -1
- package/_cjs/services/CUPS.cjs +0 -113
- package/_cjs/services/CUPS.cjs.map +0 -1
- package/_cjs/services/Cache.cjs +0 -39
- package/_cjs/services/Cache.cjs.map +0 -1
- package/_cjs/services/ServiceBus.cjs +0 -69
- package/_cjs/services/ServiceBus.cjs.map +0 -1
- package/_cjs/services/memQueue.cjs.map +0 -1
- package/_cjs/vendor/Cache/Cache/_internal/AtomicBoolean.cjs +0 -14
- package/_cjs/vendor/Cache/Cache/_internal/AtomicBoolean.cjs.map +0 -1
- package/_cjs/vendor/Cache/Cache/_internal/AtomicNumber.cjs +0 -29
- package/_cjs/vendor/Cache/Cache/_internal/AtomicNumber.cjs.map +0 -1
- package/_cjs/vendor/Cache/Cache/_internal/AtomicReference.cjs +0 -32
- package/_cjs/vendor/Cache/Cache/_internal/AtomicReference.cjs.map +0 -1
- package/_cjs/vendor/Cache/Cache/_internal/CacheInternal.cjs +0 -266
- package/_cjs/vendor/Cache/Cache/_internal/CacheInternal.cjs.map +0 -1
- package/_cjs/vendor/Cache/Cache/_internal/CacheState.cjs.map +0 -1
- package/_cjs/vendor/Cache/Cache/_internal/KeySet.cjs +0 -67
- package/_cjs/vendor/Cache/Cache/_internal/KeySet.cjs.map +0 -1
- package/_cjs/vendor/Cache/Cache/_internal/MapKey.cjs +0 -44
- package/_cjs/vendor/Cache/Cache/_internal/MapKey.cjs.map +0 -1
- package/_cjs/vendor/Cache/Cache/_internal/MapValue.cjs +0 -33
- package/_cjs/vendor/Cache/Cache/_internal/MapValue.cjs.map +0 -1
- package/_cjs/vendor/Cache/Cache/definition.cjs +0 -13
- package/_cjs/vendor/Cache/Cache/definition.cjs.map +0 -1
- package/_cjs/vendor/Cache/Cache/operations/make.cjs +0 -20
- package/_cjs/vendor/Cache/Cache/operations/make.cjs.map +0 -1
- package/_cjs/vendor/Cache/Cache/operations/makeWith.cjs.map +0 -1
- package/_cjs/vendor/Cache/Cache/operations.cjs +0 -28
- package/_cjs/vendor/Cache/Cache/operations.cjs.map +0 -1
- package/_cjs/vendor/Cache/Cache.cjs +0 -28
- package/_cjs/vendor/Cache/Cache.cjs.map +0 -1
- package/_cjs/vendor/Cache/CacheStats/definition.cjs +0 -13
- package/_cjs/vendor/Cache/CacheStats/definition.cjs.map +0 -1
- package/_cjs/vendor/Cache/CacheStats.cjs +0 -17
- package/_cjs/vendor/Cache/CacheStats.cjs.map +0 -1
- package/_cjs/vendor/Cache/EntryStats/definition.cjs +0 -11
- package/_cjs/vendor/Cache/EntryStats/definition.cjs.map +0 -1
- package/_cjs/vendor/Cache/EntryStats.cjs +0 -17
- package/_cjs/vendor/Cache/EntryStats.cjs.map +0 -1
- package/_cjs/vendor/Cache/Lookup/definition.cjs +0 -6
- package/_cjs/vendor/Cache/Lookup/definition.cjs.map +0 -1
- package/_cjs/vendor/Cache/Lookup.cjs +0 -17
- package/_cjs/vendor/Cache/Lookup.cjs.map +0 -1
- package/_cjs/vendor/Cache/index.cjs +0 -17
- package/_cjs/vendor/Cache/index.cjs.map +0 -1
- package/_src/ext.ts +0 -1
- package/_src/lib/fileUtil.ts +0 -56
- package/_src/services/CUPS/service.ts +0 -16
- package/_src/services/CUPS.ts +0 -105
- package/_src/services/Cache.ts +0 -45
- package/_src/services/ServiceBus.ts +0 -111
- package/_src/services/memQueue.ts +0 -30
- package/_src/vendor/Cache/Cache/_internal/AtomicBoolean.ts +0 -7
- package/_src/vendor/Cache/Cache/_internal/AtomicNumber.ts +0 -28
- package/_src/vendor/Cache/Cache/_internal/AtomicReference.ts +0 -30
- package/_src/vendor/Cache/Cache/_internal/CacheInternal.ts +0 -293
- package/_src/vendor/Cache/Cache/_internal/CacheState.ts +0 -56
- package/_src/vendor/Cache/Cache/_internal/KeySet.ts +0 -58
- package/_src/vendor/Cache/Cache/_internal/MapKey.ts +0 -43
- package/_src/vendor/Cache/Cache/_internal/MapValue.ts +0 -39
- package/_src/vendor/Cache/Cache/definition.ts +0 -112
- package/_src/vendor/Cache/Cache/operations/make.ts +0 -17
- package/_src/vendor/Cache/Cache/operations/makeWith.ts +0 -32
- package/_src/vendor/Cache/Cache/operations.ts +0 -4
- package/_src/vendor/Cache/Cache.ts +0 -4
- package/_src/vendor/Cache/CacheStats/definition.ts +0 -23
- package/_src/vendor/Cache/CacheStats.ts +0 -3
- package/_src/vendor/Cache/EntryStats/definition.ts +0 -19
- package/_src/vendor/Cache/EntryStats.ts +0 -3
- package/_src/vendor/Cache/Lookup/definition.ts +0 -15
- package/_src/vendor/Cache/Lookup.ts +0 -3
- package/_src/vendor/Cache/global.ts.bak +0 -23
- package/_src/vendor/Cache/index.ts +0 -4
- package/dist/ext.d.ts +0 -2
- package/dist/ext.d.ts.map +0 -1
- package/dist/ext.js +0 -2
- package/dist/lib/fileUtil.d.ts +0 -22
- package/dist/lib/fileUtil.d.ts.map +0 -1
- package/dist/lib/fileUtil.js +0 -23
- package/dist/services/CUPS/service.d.ts +0 -19
- package/dist/services/CUPS/service.d.ts.map +0 -1
- package/dist/services/CUPS/service.js +0 -5
- package/dist/services/CUPS.d.ts +0 -10
- package/dist/services/CUPS.d.ts.map +0 -1
- package/dist/services/CUPS.js +0 -89
- package/dist/services/Cache.d.ts +0 -28
- package/dist/services/Cache.d.ts.map +0 -1
- package/dist/services/Cache.js +0 -28
- package/dist/services/ServiceBus.d.ts +0 -26
- package/dist/services/ServiceBus.d.ts.map +0 -1
- package/dist/services/ServiceBus.js +0 -53
- package/dist/services/memQueue.d.ts +0 -18
- package/dist/services/memQueue.d.ts.map +0 -1
- package/dist/services/memQueue.js +0 -24
- package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.d.ts +0 -5
- package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.d.ts.map +0 -1
- package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.js +0 -7
- package/dist/vendor/Cache/Cache/_internal/AtomicNumber.d.ts +0 -8
- package/dist/vendor/Cache/Cache/_internal/AtomicNumber.d.ts.map +0 -1
- package/dist/vendor/Cache/Cache/_internal/AtomicNumber.js +0 -22
- package/dist/vendor/Cache/Cache/_internal/AtomicReference.d.ts +0 -10
- package/dist/vendor/Cache/Cache/_internal/AtomicReference.d.ts.map +0 -1
- package/dist/vendor/Cache/Cache/_internal/AtomicReference.js +0 -25
- package/dist/vendor/Cache/Cache/_internal/CacheInternal.d.ts +0 -51
- package/dist/vendor/Cache/Cache/_internal/CacheInternal.d.ts.map +0 -1
- package/dist/vendor/Cache/Cache/_internal/CacheInternal.js +0 -253
- package/dist/vendor/Cache/Cache/_internal/CacheState.d.ts +0 -33
- package/dist/vendor/Cache/Cache/_internal/CacheState.d.ts.map +0 -1
- package/dist/vendor/Cache/Cache/_internal/CacheState.js +0 -21
- package/dist/vendor/Cache/Cache/_internal/KeySet.d.ts +0 -20
- package/dist/vendor/Cache/Cache/_internal/KeySet.d.ts.map +0 -1
- package/dist/vendor/Cache/Cache/_internal/KeySet.js +0 -61
- package/dist/vendor/Cache/Cache/_internal/MapKey.d.ts +0 -24
- package/dist/vendor/Cache/Cache/_internal/MapKey.d.ts.map +0 -1
- package/dist/vendor/Cache/Cache/_internal/MapKey.js +0 -37
- package/dist/vendor/Cache/Cache/_internal/MapValue.d.ts +0 -32
- package/dist/vendor/Cache/Cache/_internal/MapValue.d.ts.map +0 -1
- package/dist/vendor/Cache/Cache/_internal/MapValue.js +0 -24
- package/dist/vendor/Cache/Cache/definition.d.ts +0 -100
- package/dist/vendor/Cache/Cache/definition.d.ts.map +0 -1
- package/dist/vendor/Cache/Cache/definition.js +0 -5
- package/dist/vendor/Cache/Cache/operations/make.d.ts +0 -12
- package/dist/vendor/Cache/Cache/operations/make.d.ts.map +0 -1
- package/dist/vendor/Cache/Cache/operations/make.js +0 -12
- package/dist/vendor/Cache/Cache/operations/makeWith.d.ts +0 -14
- package/dist/vendor/Cache/Cache/operations/makeWith.d.ts.map +0 -1
- package/dist/vendor/Cache/Cache/operations/makeWith.js +0 -15
- package/dist/vendor/Cache/Cache/operations.d.ts +0 -3
- package/dist/vendor/Cache/Cache/operations.d.ts.map +0 -1
- package/dist/vendor/Cache/Cache/operations.js +0 -4
- package/dist/vendor/Cache/Cache.d.ts +0 -3
- package/dist/vendor/Cache/Cache.d.ts.map +0 -1
- package/dist/vendor/Cache/Cache.js +0 -4
- package/dist/vendor/Cache/CacheStats/definition.d.ts +0 -19
- package/dist/vendor/Cache/CacheStats/definition.d.ts.map +0 -1
- package/dist/vendor/Cache/CacheStats/definition.js +0 -6
- package/dist/vendor/Cache/CacheStats.d.ts +0 -2
- package/dist/vendor/Cache/CacheStats.d.ts.map +0 -1
- package/dist/vendor/Cache/CacheStats.js +0 -3
- package/dist/vendor/Cache/EntryStats/definition.d.ts +0 -17
- package/dist/vendor/Cache/EntryStats/definition.d.ts.map +0 -1
- package/dist/vendor/Cache/EntryStats/definition.js +0 -4
- package/dist/vendor/Cache/EntryStats.d.ts +0 -2
- package/dist/vendor/Cache/EntryStats.d.ts.map +0 -1
- package/dist/vendor/Cache/EntryStats.js +0 -3
- package/dist/vendor/Cache/Lookup/definition.d.ts +0 -17
- package/dist/vendor/Cache/Lookup/definition.d.ts.map +0 -1
- package/dist/vendor/Cache/Lookup/definition.js +0 -2
- package/dist/vendor/Cache/Lookup.d.ts +0 -2
- package/dist/vendor/Cache/Lookup.d.ts.map +0 -1
- package/dist/vendor/Cache/Lookup.js +0 -3
- package/dist/vendor/Cache/index.d.ts +0 -5
- package/dist/vendor/Cache/index.d.ts.map +0 -1
- package/dist/vendor/Cache/index.js +0 -5
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import * as MO from "@effect-app/schema"
|
|
2
|
+
import type { SchemaAny } from "@effect-app/schema"
|
|
3
|
+
|
|
4
|
+
class BaseError {
|
|
5
|
+
constructor(public message: string) {}
|
|
6
|
+
}
|
|
7
|
+
export class CouldNotAquireDbLockException extends BaseError {
|
|
8
|
+
readonly _errorTag = "CouldNotAquireDbLockException"
|
|
9
|
+
constructor(readonly type: string, readonly id: string, readonly error: Error) {
|
|
10
|
+
super(`Couldn't lock db record ${type}: ${id}`)
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export class OptimisticLockException extends Error {
|
|
15
|
+
readonly _errorTag = "OptimisticLockException"
|
|
16
|
+
constructor(readonly type: string, readonly id: string) {
|
|
17
|
+
super(`Existing ${type} ${id} record changed`)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export class ConnectionException extends Error {
|
|
22
|
+
readonly _errorTag = "ConnectionException"
|
|
23
|
+
constructor(readonly error: Error) {
|
|
24
|
+
super("A connection error ocurred")
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface DBRecord<TKey extends string> {
|
|
29
|
+
id: TKey
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export class SerializedDBRecord extends MO.Model<SerializedDBRecord>()({
|
|
33
|
+
version: MO.prop(MO.string),
|
|
34
|
+
timestamp: MO.prop(MO.date),
|
|
35
|
+
data: MO.prop(MO.string)
|
|
36
|
+
}) {}
|
|
37
|
+
|
|
38
|
+
// unknown -> string -> SDB?
|
|
39
|
+
export function makeSerialisedDBRecord(s: SchemaAny) {
|
|
40
|
+
return MO.props({
|
|
41
|
+
version: MO.prop(MO.number),
|
|
42
|
+
timestamp: MO.prop(MO.date),
|
|
43
|
+
data: MO.prop(s)
|
|
44
|
+
})
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface CachedRecord<T> {
|
|
48
|
+
version: string
|
|
49
|
+
data: T
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface Index {
|
|
53
|
+
doc: string
|
|
54
|
+
key: string
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function getIndexName(type: string, id: string) {
|
|
58
|
+
return `${type}-idx_${id}`
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function getRecordName(type: string, id: string) {
|
|
62
|
+
return `${type}-r_${id}`
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function makeMap<TKey, T>() {
|
|
66
|
+
const map = new Map<TKey, T>()
|
|
67
|
+
return {
|
|
68
|
+
find: (k: TKey) => Effect(() => Opt.fromNullable(map.get(k))),
|
|
69
|
+
[Symbol.iterator]: () => map[Symbol.iterator](),
|
|
70
|
+
set: (k: TKey, v: T) =>
|
|
71
|
+
Effect(() => {
|
|
72
|
+
map.set(k, v)
|
|
73
|
+
})
|
|
74
|
+
} as EffectMap<TKey, T>
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface EffectMap<TKey, T> {
|
|
78
|
+
[Symbol.iterator](): IterableIterator<[TKey, T]>
|
|
79
|
+
find: (k: TKey) => Effect<never, never, Opt<T>>
|
|
80
|
+
set: (k: TKey, v: T) => Effect<never, never, void>
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// export function encodeOnlyWhenStrictMatch<A, E>(
|
|
84
|
+
// encode: MO.HasEncoder<A, E>["encode_"],
|
|
85
|
+
// v: A
|
|
86
|
+
// ) {
|
|
87
|
+
// const e1 = Sync.run(encode(v, "strict"))
|
|
88
|
+
// const e2 = Sync.run(encode(v, "classic"))
|
|
89
|
+
// try {
|
|
90
|
+
// assert.deepStrictEqual(e1, e2)
|
|
91
|
+
// } catch (err) {
|
|
92
|
+
// throw new Error(
|
|
93
|
+
// // eslint-disable-next-line @typescript-eslint/restrict-plus-operands
|
|
94
|
+
// "The strict encoding of these objects does not match the classic encoding of these objects. This means that there is a chance of a data-loss, and is probably a programming error\n" +
|
|
95
|
+
// err
|
|
96
|
+
// )
|
|
97
|
+
// }
|
|
98
|
+
// return e1
|
|
99
|
+
// }
|
|
100
|
+
|
|
101
|
+
// export function decodeOnlyWhenStrictMatch<A, E>(
|
|
102
|
+
// decode: MO.HasDecoder<A, E>["decode_"],
|
|
103
|
+
// u: unknown
|
|
104
|
+
// ) {
|
|
105
|
+
// return pipe(
|
|
106
|
+
// decode(u, "strict"),
|
|
107
|
+
// Sync.tap((v) =>
|
|
108
|
+
// pipe(
|
|
109
|
+
// decode(u),
|
|
110
|
+
// Sync.tap((v2) => {
|
|
111
|
+
// assert.deepStrictEqual(v, v2)
|
|
112
|
+
// return Sync.succeed(v2)
|
|
113
|
+
// })
|
|
114
|
+
// )
|
|
115
|
+
// )
|
|
116
|
+
// )
|
|
117
|
+
// }
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import type { CachedRecord, DBRecord, EffectMap } from "./shared.js"
|
|
2
|
+
import { makeMap, OptimisticLockException } from "./shared.js"
|
|
3
|
+
|
|
4
|
+
export type Version = string
|
|
5
|
+
export class InvalidStateError {
|
|
6
|
+
readonly _tag = "InvalidStateError"
|
|
7
|
+
constructor(readonly message: string, readonly details?: unknown) {}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function makeLiveRecordCache() {
|
|
11
|
+
const m = new Map<string, EffectMap<string, unknown>>()
|
|
12
|
+
return {
|
|
13
|
+
get: <T>(type: string) =>
|
|
14
|
+
Effect(() => {
|
|
15
|
+
const ex = m.get(type)
|
|
16
|
+
if (!ex) {
|
|
17
|
+
const nm = makeMap<string, unknown>()
|
|
18
|
+
m.set(type, nm)
|
|
19
|
+
return nm as EffectMap<string, CachedRecord<T>>
|
|
20
|
+
}
|
|
21
|
+
return ex as EffectMap<string, CachedRecord<T>>
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface RecordCache extends ReturnType<typeof makeLiveRecordCache> {}
|
|
27
|
+
|
|
28
|
+
// module tag
|
|
29
|
+
export const RecordCache = Tag<RecordCache>()
|
|
30
|
+
|
|
31
|
+
export const LiveRecordCache = Effect(makeLiveRecordCache()).toLayer(RecordCache)
|
|
32
|
+
|
|
33
|
+
const getM = <T>(type: string) =>
|
|
34
|
+
<R, E, A>(eff: (m: EffectMap<string, CachedRecord<T>>) => Effect<R, E, A>) =>
|
|
35
|
+
Effect.gen(function*($) {
|
|
36
|
+
const { get } = yield* $(RecordCache.access)
|
|
37
|
+
return yield* $(get<T>(type).flatMap(eff))
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
export function find<R, RDecode, EDecode, E, EA, A>(
|
|
41
|
+
tryRead: (id: string) => Effect<R, E, Opt<CachedRecord<EA>>>,
|
|
42
|
+
decode: (d: EA) => Effect<RDecode, EDecode, A>,
|
|
43
|
+
type: string
|
|
44
|
+
) {
|
|
45
|
+
const getCache = getM<A>(type)
|
|
46
|
+
const read = (id: string) =>
|
|
47
|
+
tryRead(id)
|
|
48
|
+
.flatMapOpt(({ data, version }) =>
|
|
49
|
+
decode(data).mapBoth(
|
|
50
|
+
err => new InvalidStateError("DB serialisation Issue", err),
|
|
51
|
+
data => ({ data, version })
|
|
52
|
+
)
|
|
53
|
+
)
|
|
54
|
+
.tapOpt(r => getCache(c => c.set(id, r)))
|
|
55
|
+
.mapOpt(r => r.data)
|
|
56
|
+
|
|
57
|
+
return (id: string) =>
|
|
58
|
+
getCache(c =>
|
|
59
|
+
c
|
|
60
|
+
.find(id)
|
|
61
|
+
.mapOpt(existing => existing.data)
|
|
62
|
+
.orElse(() => read(id))
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function storeDirectly<R, E, TKey extends string, A extends DBRecord<TKey>>(
|
|
67
|
+
save: (r: A, version: Opt<Version>) => Effect<R, E, CachedRecord<A>>,
|
|
68
|
+
type: string
|
|
69
|
+
) {
|
|
70
|
+
const getCache = getM<A>(type)
|
|
71
|
+
return (record: A) =>
|
|
72
|
+
getCache(c =>
|
|
73
|
+
c
|
|
74
|
+
.find(record.id)
|
|
75
|
+
.mapOpt(x => x.version)
|
|
76
|
+
.flatMap(cv => save(record, cv))
|
|
77
|
+
.tap(r => c.set(record.id, r))
|
|
78
|
+
.map(r => r.data)
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function store<R, E, R2, E2, TKey extends string, EA, A extends DBRecord<TKey>>(
|
|
83
|
+
tryRead: (id: string) => Effect<R, E, Opt<CachedRecord<EA>>>,
|
|
84
|
+
save: (r: A, version: Opt<Version>) => Effect<R, E, CachedRecord<A>>,
|
|
85
|
+
lock: (id: string) => Effect<R2 | Scope, E2, unknown>,
|
|
86
|
+
type: string
|
|
87
|
+
) {
|
|
88
|
+
const getCache = getM<A>(type)
|
|
89
|
+
return (record: A) =>
|
|
90
|
+
getCache(c =>
|
|
91
|
+
c
|
|
92
|
+
.find(record.id)
|
|
93
|
+
.mapOpt(x => x.version)
|
|
94
|
+
.flatMap(_ => _.match(() => save(record, Opt.none), confirmVersionAndSave(record)))
|
|
95
|
+
.tap(r => c.set(record.id, r))
|
|
96
|
+
.map(r => r.data)
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
function confirmVersionAndSave(record: A) {
|
|
100
|
+
return (cv: Version) =>
|
|
101
|
+
lock(record.id).zipRight(
|
|
102
|
+
tryRead(record.id)
|
|
103
|
+
.flatMap(_ =>
|
|
104
|
+
_.match(
|
|
105
|
+
() => Effect.fail(new InvalidStateError("record is gone")),
|
|
106
|
+
Effect.succeed
|
|
107
|
+
)
|
|
108
|
+
)
|
|
109
|
+
.tap(({ version }) =>
|
|
110
|
+
version !== cv
|
|
111
|
+
? Effect.fail(new OptimisticLockException(type, record.id))
|
|
112
|
+
: Effect.unit
|
|
113
|
+
)
|
|
114
|
+
.zipRight(save(record, Opt(cv)))
|
|
115
|
+
).scoped
|
|
116
|
+
}
|
|
117
|
+
}
|
package/dist/_global.ext.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_global.ext.d.ts","sourceRoot":"","sources":["../_src/_global.ext.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,yCAAyC,CAAA;AAC7D;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,6CAA6C,CAAA;AACjE;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,6BAA6B,CAAA;AACjD;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"_global.ext.d.ts","sourceRoot":"","sources":["../_src/_global.ext.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,yCAAyC,CAAA;AAC7D;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,6CAA6C,CAAA;AACjE;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,6BAA6B,CAAA;AACjD;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,iCAAiC,CAAA;AACrD;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,kCAAkC,CAAA;AACtD;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,iCAAiC,CAAA;AAErD;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,wCAAwC,CAAA;AAE5D;;GAEG;AACH,OAAO,EAAE,MAAM,uCAAuC,CAAA"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import { Cause } from "@effect/io/Cause";
|
|
2
|
-
import { NotLoggedInError } from "@effect-app/infra-adapters/errors";
|
|
3
2
|
export declare class NotFoundError<T extends string = string> {
|
|
4
3
|
readonly _tag = "NotFoundError";
|
|
5
4
|
readonly message: string;
|
|
6
5
|
constructor(type: T, id: string);
|
|
7
6
|
}
|
|
8
|
-
export
|
|
7
|
+
export declare class ValidationError {
|
|
8
|
+
readonly errors: ReadonlyArray<unknown>;
|
|
9
|
+
readonly _tag = "ValidationError";
|
|
10
|
+
constructor(errors: ReadonlyArray<unknown>);
|
|
11
|
+
}
|
|
12
|
+
export declare class NotLoggedInError {
|
|
13
|
+
readonly _tag = "NotLoggedInError";
|
|
14
|
+
}
|
|
15
|
+
export declare class UnauthorizedError {
|
|
16
|
+
readonly _tag = "UnauthorizedError";
|
|
17
|
+
}
|
|
9
18
|
/**
|
|
10
19
|
* The user carries a valid Userprofile, but there is a problem with the login none the less.
|
|
11
20
|
*/
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../_src/errors.ts"],"names":[],"mappings":";AAAA,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../_src/errors.ts"],"names":[],"mappings":";AAAA,qBAAa,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAClD,SAAgB,IAAI,mBAAkB;IACtC,SAAgB,OAAO,EAAE,MAAM,CAAA;gBACnB,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM;CAGhC;AAED,qBAAa,eAAe;aAEE,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC;IAD1D,SAAgB,IAAI,qBAAoB;gBACZ,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC;CAC3D;AAED,qBAAa,gBAAgB;IAC3B,SAAgB,IAAI,sBAAqB;CAC1C;AAED,qBAAa,iBAAiB;IAC5B,SAAgB,IAAI,uBAAsB;CAC3C;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,gBAAgB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM;gBAAf,OAAO,EAAE,MAAM;CAGrC;AAED,qBAAa,iBAAiB;aAEA,OAAO,EAAE,MAAM;IAD3C,SAAgB,IAAI,uBAAsB;gBACd,OAAO,EAAE,MAAM;CAC5C;AAED,qBAAa,cAAc,CAAC,CAAC,CAAE,SAAQ,KAAK;IAE9B,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM;IAD/D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;gBACF,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,EAAW,IAAI,EAAE,MAAM;IAK/D,MAAM;;;;;CAQP;AAED,qBAAa,8BAA8B;IAG7B,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM;IAAE,QAAQ,CAAC,OAAO,CAAC;IAAU,QAAQ,CAAC,KAAK,CAAC;IAFlG,QAAQ,CAAC,IAAI,oCAAmC;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;gBACH,IAAI,EAAE,MAAM,EAAW,EAAE,EAAE,MAAM,EAAW,OAAO,CAAC,oBAAQ,EAAW,KAAK,CAAC,oBAAQ;CAG3G"}
|
package/dist/errors.js
CHANGED
|
@@ -1,12 +1,26 @@
|
|
|
1
1
|
import * as tsplus_module_1 from "@effect/io/Cause";
|
|
2
|
-
import { NotLoggedInError } from "@effect-app/infra-adapters/errors";
|
|
3
2
|
export class NotFoundError {
|
|
4
3
|
constructor(type, id) {
|
|
5
4
|
this._tag = "NotFoundError";
|
|
6
5
|
this.message = `Didn't find ${type}#${id}`;
|
|
7
6
|
}
|
|
8
7
|
}
|
|
9
|
-
export
|
|
8
|
+
export class ValidationError {
|
|
9
|
+
constructor(errors) {
|
|
10
|
+
this.errors = errors;
|
|
11
|
+
this._tag = "ValidationError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class NotLoggedInError {
|
|
15
|
+
constructor() {
|
|
16
|
+
this._tag = "NotLoggedInError";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class UnauthorizedError {
|
|
20
|
+
constructor() {
|
|
21
|
+
this._tag = "UnauthorizedError";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
10
24
|
/**
|
|
11
25
|
* The user carries a valid Userprofile, but there is a problem with the login none the less.
|
|
12
26
|
*/
|
|
@@ -48,4 +62,4 @@ export class OptimisticConcurrencyException {
|
|
|
48
62
|
this.message = `Existing ${type} ${id} record changed`;
|
|
49
63
|
}
|
|
50
64
|
}
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vX3NyYy9lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE1BQU0sT0FBTyxhQUFhO0lBR3hCLFlBQVksSUFBTyxFQUFFLEVBQVU7UUFGZixTQUFJLEdBQUcsZUFBZSxDQUFBO1FBR3BDLElBQUksQ0FBQyxPQUFPLEdBQUcsZUFBZSxJQUFJLElBQUksRUFBRSxFQUFFLENBQUE7SUFDNUMsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGVBQWU7SUFFMUIsWUFBNEIsTUFBOEI7UUFBOUIsV0FBTSxHQUFOLE1BQU0sQ0FBd0I7UUFEMUMsU0FBSSxHQUFHLGlCQUFpQixDQUFBO0lBQ3FCLENBQUM7Q0FDL0Q7QUFFRCxNQUFNLE9BQU8sZ0JBQWdCO0lBQTdCO1FBQ2tCLFNBQUksR0FBRyxrQkFBa0IsQ0FBQTtJQUMzQyxDQUFDO0NBQUE7QUFFRCxNQUFNLE9BQU8saUJBQWlCO0lBQTlCO1FBQ2tCLFNBQUksR0FBRyxtQkFBbUIsQ0FBQTtJQUM1QyxDQUFDO0NBQUE7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxVQUFXLFNBQVEsZ0JBQWdCO0lBQzlDLFlBQXFCLE9BQWU7UUFDbEMsS0FBSyxFQUFFLENBQUE7UUFEWSxZQUFPLEdBQVAsT0FBTyxDQUFRO0lBRXBDLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxpQkFBaUI7SUFFNUIsWUFBNEIsT0FBZTtRQUFmLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFEM0IsU0FBSSxHQUFHLG1CQUFtQixDQUFBO0lBQ0ksQ0FBQztDQUNoRDtBQUVELE1BQU0sT0FBTyxjQUFrQixTQUFRLEtBQUs7SUFFMUMsWUFBcUIsU0FBbUIsRUFBVyxJQUFZO1FBQzdELEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxrREFBa0QsQ0FBQyxDQUFBO1FBRDNELGNBQVMsR0FBVCxTQUFTLENBQVU7UUFBVyxTQUFJLEdBQUosSUFBSSxDQUFRO1FBRTdELElBQUksQ0FBQyxNQUFNLEdBQUcseUJBQUEsU0FBUyxDQUFTLENBQUE7SUFDbEMsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQiwyREFBMkQ7U0FDNUQsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyw4QkFBOEI7SUFHekMsWUFBcUIsSUFBWSxFQUFXLEVBQVUsRUFBVyxPQUFnQixFQUFXLEtBQWM7UUFBckYsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUFXLE9BQUUsR0FBRixFQUFFLENBQVE7UUFBVyxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQVcsVUFBSyxHQUFMLEtBQUssQ0FBUztRQUZqRyxTQUFJLEdBQUcsZ0NBQWdDLENBQUE7UUFHOUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxZQUFZLElBQUksSUFBSSxFQUFFLGlCQUFpQixDQUFBO0lBQ3hELENBQUM7Q0FDRiJ9
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as Ex from "@effect-app/infra-adapters/express
|
|
1
|
+
import * as Ex from "@effect-app/infra-adapters/express";
|
|
2
2
|
export declare const checkJwt: (audience: string, issuer: string) => {
|
|
3
3
|
(req: import("express").Request<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>, res: import("express").Response<any, Record<string, any>>, next: import("express").NextFunction): Promise<any>;
|
|
4
4
|
unless: typeof import("express-unless").unless;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorization.jwt.d.ts","sourceRoot":"","sources":["../../../_src/lib/api/authorization.jwt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"authorization.jwt.d.ts","sourceRoot":"","sources":["../../../_src/lib/api/authorization.jwt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,oCAAoC,CAAA;AAQxD,eAAO,MAAM,QAAQ,aAAc,MAAM,UAAU,MAAM;;;CAgBrD,CAAA;AAUJ,eAAO,MAAM,MAAM,iGAA2B,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// import { configM, UserSVC } from "@/services.js"
|
|
2
|
-
import * as Ex from "@effect-app/infra-adapters/express
|
|
2
|
+
import * as Ex from "@effect-app/infra-adapters/express";
|
|
3
3
|
import { expressjwt } from "express-jwt";
|
|
4
4
|
import jwtAuthz from "express-jwt-authz";
|
|
5
5
|
import jwksRsa from "jwks-rsa";
|
|
@@ -29,4 +29,4 @@ const demandScopes = jwtAuthz([]);
|
|
|
29
29
|
// : Ex.use(Ex.classic(checkJwt)) > Ex.use(Ex.classic(demandScopes)) // TODO
|
|
30
30
|
// )
|
|
31
31
|
export const scopes = Ex.classic(demandScopes);
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXphdGlvbi5qd3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9fc3JjL2xpYi9hcGkvYXV0aG9yaXphdGlvbi5qd3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbURBQW1EO0FBQ25ELE9BQU8sS0FBSyxFQUFFLE1BQU0sb0NBQW9DLENBQUE7QUFDeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN4QyxPQUFPLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQTtBQUN4QyxPQUFPLE9BQU8sTUFBTSxVQUFVLENBQUE7QUFFOUIsMkNBQTJDO0FBQzNDLGtEQUFrRDtBQUNsRCw2QkFBNkI7QUFDN0IsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsRUFBRSxDQUMzRCxVQUFVLENBQUM7SUFDVCxvQ0FBb0M7SUFDcEMscUNBQXFDO0lBQ3JDLGtEQUFrRDtJQUNsRCxNQUFNLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1FBQy9CLEtBQUssRUFBRSxJQUFJO1FBQ1gsU0FBUyxFQUFFLElBQUk7UUFDZixxQkFBcUIsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sRUFBRSxHQUFHLE1BQU0sd0JBQXdCO0tBQzNDLENBQStCO0lBRWhDLHdDQUF3QztJQUN4QyxRQUFRO0lBQ1IsTUFBTSxFQUFFLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUN0QixVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUM7Q0FDdEIsQ0FBQyxDQUFBO0FBRUosTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBRWpDLCtCQUErQjtBQUMvQixhQUFhO0FBQ2Isd0JBQXdCO0FBQ3hCLHNCQUFzQjtBQUN0QixrRkFBa0Y7QUFDbEYsSUFBSTtBQUNKLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFBIn0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Effect } from "@effect/io/Effect";
|
|
2
|
+
import * as MO from "@effect-app/schema";
|
|
3
|
+
import type { ParserEnv } from "@effect-app/schema/custom/Parser";
|
|
4
|
+
export declare function makeCodec<ParsedShape extends {
|
|
5
|
+
id: Id;
|
|
6
|
+
}, ConstructorInput, Encoded, Api, Id>(self: MO.Schema<unknown, ParsedShape, ConstructorInput, Encoded, Api>): readonly [(e: Encoded, env?: ParserEnv) => import("@effect/io/Effect").Effect<never, never, ParsedShape>, (u: ParsedShape) => import("@effect/io/Effect").Effect<never, never, Encoded>, (a: readonly ParsedShape[]) => import("@effect/io/Effect").Effect<never, never, Map<ParsedShape["id"], Encoded>>];
|
|
7
|
+
//# sourceMappingURL=codec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../../_src/lib/api/codec.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAExC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;AAEjE,wBAAgB,SAAS,CACvB,WAAW,SAAS;IAAE,EAAE,EAAE,EAAE,CAAA;CAAE,EAC9B,gBAAgB,EAChB,OAAO,EACP,GAAG,EACH,EAAE,EACF,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,CAAC,iBAGlD,OAAO,QAAQ,SAAS,wEAGxB,WAAW,kLAG/B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as tracer_1 from "@effect/io/Debug";
|
|
2
|
+
const fileName_1 = "packages/infra/_src/lib/api/codec.ts";
|
|
3
|
+
import * as tsplus_module_1 from "@effect/io/Effect";
|
|
4
|
+
import * as tsplus_module_2 from "@effect-app/core/fluent/_ext/awesome/_files/Iterable";
|
|
5
|
+
import * as MO from "@effect-app/schema";
|
|
6
|
+
import { Encoder, Parser } from "@effect-app/schema";
|
|
7
|
+
export function makeCodec(self) {
|
|
8
|
+
const parse = MO.condemnDie(Parser.for(self));
|
|
9
|
+
// TODO: strict
|
|
10
|
+
const decode = (e, env) => parse(e, env);
|
|
11
|
+
const enc = Encoder.for(self);
|
|
12
|
+
const encode = (u) => tracer_1.withCallTrace(fileName_1 + ":17:38")(tsplus_module_1.sync(() => enc(u)));
|
|
13
|
+
const encodeToMap = toMap(encode);
|
|
14
|
+
return [decode, encode, encodeToMap];
|
|
15
|
+
}
|
|
16
|
+
function toMap(encode) {
|
|
17
|
+
return (a) => tracer_1.withCallTrace(fileName_1 + ":26:8")(tsplus_module_1.map(_ => new Map(_)))(tsplus_module_2.ext_collectAll(a.map(task => tracer_1.withCallTrace(fileName_1 + ":24:26")(tsplus_module_1.tuple(tracer_1.withCallTrace(fileName_1 + ":24:32")(tsplus_module_1.sync(() => task.id)), encode(task))))));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9fc3JjL2xpYi9hcGkvY29kZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDeEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUdwRCxNQUFNLFVBQVUsU0FBUyxDQU12QixJQUFxRTtJQUNyRSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUM3QyxlQUFlO0lBQ2YsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFVLEVBQUUsR0FBZSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBQzdELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFN0IsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFjLEVBQUUsRUFBRSwrQ0FBQyxxQkFBTyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFBO0lBQ3ZELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNqQyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQVUsQ0FBQTtBQUMvQyxDQUFDO0FBRUQsU0FBUyxLQUFLLENBQThCLE1BQXlDO0lBQ25GLE9BQU8sQ0FBQyxDQUFtQixFQUFFLEVBQUUsQ0FDN0IsaUVBRU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FGdEIsK0JBQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSwrQ0FBQyxvRUFBYSwyQkFBTyxJQUFJLENBQUMsRUFBYSxDQUFDLEdBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUN0RCxDQUNRLENBQUE7QUFDM0IsQ0FBQyJ9
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Chunk } from "@fp-ts/data/Chunk";
|
|
2
|
+
import * as RS from "./schema/routing.js";
|
|
3
|
+
type Methods = "GET" | "PUT" | "POST" | "PATCH" | "DELETE";
|
|
4
|
+
/**
|
|
5
|
+
* Work in progress JSONSchema generator.
|
|
6
|
+
*/
|
|
7
|
+
export declare function makeJsonSchema(r: Iterable<RS.RouteDescriptorAny>): import("@effect/io/Effect").Effect<never, never, Record<string, Record<Methods, {
|
|
8
|
+
[x: string]: {
|
|
9
|
+
responses: any;
|
|
10
|
+
tags: readonly string[] | undefined;
|
|
11
|
+
description: string | undefined;
|
|
12
|
+
summary: string | undefined;
|
|
13
|
+
operationId: string | undefined;
|
|
14
|
+
parameters: {
|
|
15
|
+
name: string;
|
|
16
|
+
in: import("@effect-app/infra-adapters/Openapi/atlas-plutus").ParameterLocation;
|
|
17
|
+
required: boolean;
|
|
18
|
+
schema: import("@effect-app/infra-adapters/Openapi/atlas-plutus").SubSchema | undefined;
|
|
19
|
+
}[];
|
|
20
|
+
requestBody: {
|
|
21
|
+
content: {
|
|
22
|
+
"application/json": {
|
|
23
|
+
schema: import("@effect-app/infra-adapters/Openapi/atlas-plutus").JSONSchema;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
} | undefined;
|
|
27
|
+
};
|
|
28
|
+
}>>>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=makeJsonSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"makeJsonSchema.d.ts","sourceRoot":"","sources":["../../../../_src/lib/api/express/makeJsonSchema.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAEzC,KAAK,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;AAM1D;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,kBAAkB,CAAC;;;;;;;;;;;;;;;;;;;;;KA4BhE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as tracer_1 from "@effect/io/Debug";
|
|
2
|
+
const fileName_1 = "packages/infra/_src/lib/api/express/makeJsonSchema.ts";
|
|
3
|
+
import * as tsplus_module_1 from "@fp-ts/data/Chunk";
|
|
4
|
+
import * as tsplus_module_2 from "@effect-app/core/fluent/_ext/awesome/_files/Iterable";
|
|
5
|
+
import * as tsplus_module_3 from "@effect/io/Effect";
|
|
6
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
7
|
+
import * as RS from "./schema/routing.js";
|
|
8
|
+
const rx = /:(\w+)/g;
|
|
9
|
+
/**
|
|
10
|
+
* Work in progress JSONSchema generator.
|
|
11
|
+
*/
|
|
12
|
+
export function makeJsonSchema(r) {
|
|
13
|
+
return tracer_1.withCallTrace(fileName_1 + ":17:6")(tsplus_module_3.map(e => {
|
|
14
|
+
const map = ({ method, path, responses, ...rest }) => ({
|
|
15
|
+
[method]: {
|
|
16
|
+
...rest,
|
|
17
|
+
responses: responses.reduce((prev, cur) => {
|
|
18
|
+
prev[cur.statusCode] = cur.type;
|
|
19
|
+
return prev;
|
|
20
|
+
}, {})
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
return tsplus_module_1.reduce({}, (prev, e) => {
|
|
24
|
+
const path = e.path.split("?")[0].replace(rx, (_a, b) => `{${b}}`);
|
|
25
|
+
prev[path] = {
|
|
26
|
+
...prev[path],
|
|
27
|
+
...map(e)
|
|
28
|
+
};
|
|
29
|
+
return prev;
|
|
30
|
+
})(e);
|
|
31
|
+
}))(tsplus_module_2.ext_forEach(tsplus_module_1.fromIterable(r), RS.makeFromSchema));
|
|
32
|
+
}
|
|
33
|
+
class Response {
|
|
34
|
+
constructor(statusCode, type // string | JSONSchema | SubSchema
|
|
35
|
+
) {
|
|
36
|
+
this.statusCode = statusCode;
|
|
37
|
+
this.type = type;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZUpzb25TY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9fc3JjL2xpYi9hcGkvZXhwcmVzcy9tYWtlSnNvblNjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHVEQUF1RDtBQUV2RCxPQUFPLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBSXpDLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQTtBQUlwQjs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsQ0FBa0M7SUFDL0QsT0FBTyxpRUFFQSxDQUFDLENBQUMsRUFBRTtRQUNQLE1BQU0sR0FBRyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksRUFBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNuRSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNSLEdBQUcsSUFBSTtnQkFDUCxTQUFTLEVBQUcsU0FBd0IsQ0FBQyxNQUFNLENBQ3pDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFO29CQUNaLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQTtvQkFDL0IsT0FBTyxJQUFJLENBQUE7Z0JBQ2IsQ0FBQyxFQUNELEVBQXNELENBQ3ZEO2FBQ0Y7U0FDRixDQUFDLENBQUE7UUFDRixPQUFPLHVCQUNMLEVBQTZELEVBQzdELENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ1YsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNsRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7Z0JBQ1gsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNiLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBUTthQUNqQixDQUFBO1lBQ0QsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDLEVBVEksQ0FBQyxDQVVQLENBQUE7SUFDSCxDQUFDLEdBMUJJLDRCQUFBLDZCQUFtQixDQUFDLENBQUMsRUFDWCxFQUFFLENBQUMsY0FBYyxDQUFDLENBeUIvQixDQUFBO0FBQ04sQ0FBQztBQUVELE1BQU0sUUFBUTtJQUNaLFlBQ2tCLFVBQWtCLEVBQ2xCLElBQVMsQ0FBQyxrQ0FBa0M7O1FBRDVDLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDbEIsU0FBSSxHQUFKLElBQUksQ0FBSztJQUN4QixDQUFDO0NBQ0wifQ==
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type * as Plutus from "@effect-app/infra-adapters/Openapi/atlas-plutus";
|
|
2
|
+
import type { RouteDescriptorAny } from "./schema/routing.js";
|
|
3
|
+
export declare function makeOpenApiSpecs(rdescs: Iterable<RouteDescriptorAny>, info: Plutus.Info): import("@effect/io/Effect").Effect<never, never, {
|
|
4
|
+
openapi: string;
|
|
5
|
+
info: {
|
|
6
|
+
title: string;
|
|
7
|
+
description: string | undefined;
|
|
8
|
+
termsOfService: string | undefined;
|
|
9
|
+
contact: {
|
|
10
|
+
name: string;
|
|
11
|
+
email: string;
|
|
12
|
+
url: string;
|
|
13
|
+
} | undefined;
|
|
14
|
+
license: {
|
|
15
|
+
name: string;
|
|
16
|
+
url: string;
|
|
17
|
+
} | undefined;
|
|
18
|
+
version: string;
|
|
19
|
+
};
|
|
20
|
+
tags: never[];
|
|
21
|
+
paths: Record<string, Record<"PATCH" | "GET" | "POST" | "PUT" | "DELETE", {
|
|
22
|
+
[x: string]: {
|
|
23
|
+
responses: any;
|
|
24
|
+
tags: readonly string[] | undefined;
|
|
25
|
+
description: string | undefined;
|
|
26
|
+
summary: string | undefined;
|
|
27
|
+
operationId: string | undefined;
|
|
28
|
+
parameters: {
|
|
29
|
+
name: string;
|
|
30
|
+
in: Plutus.ParameterLocation;
|
|
31
|
+
required: boolean;
|
|
32
|
+
schema: Plutus.SubSchema | undefined;
|
|
33
|
+
}[];
|
|
34
|
+
requestBody: {
|
|
35
|
+
content: {
|
|
36
|
+
"application/json": {
|
|
37
|
+
schema: Plutus.JSONSchema;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
} | undefined;
|
|
41
|
+
};
|
|
42
|
+
}>>;
|
|
43
|
+
components: {
|
|
44
|
+
securitySchemes: {
|
|
45
|
+
bearerAuth: {
|
|
46
|
+
type: string;
|
|
47
|
+
scheme: string;
|
|
48
|
+
bearerFormat: string;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
schemas: Record<string, any>;
|
|
52
|
+
parameters: Record<string, any>;
|
|
53
|
+
};
|
|
54
|
+
}>;
|
|
55
|
+
//# sourceMappingURL=makeOpenApiSpecs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"makeOpenApiSpecs.d.ts","sourceRoot":"","sources":["../../../../_src/lib/api/express/makeOpenApiSpecs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,MAAM,iDAAiD,CAAA;AAI9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAE7D,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACpC,IAAI,EAAE,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDlB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import * as tracer_1 from "@effect/io/Debug";
|
|
2
|
+
const fileName_1 = "packages/infra/_src/lib/api/express/makeOpenApiSpecs.ts";
|
|
3
|
+
import * as tsplus_module_1 from "@effect/io/Ref";
|
|
4
|
+
import * as tsplus_module_2 from "@effect/io/Effect";
|
|
5
|
+
import * as tsplus_module_3 from "@effect-app/core/Function";
|
|
6
|
+
import { References } from "@effect-app/infra-adapters/Openapi/atlas-plutus/Schema/index";
|
|
7
|
+
import { makeJsonSchema } from "./makeJsonSchema.js";
|
|
8
|
+
export function makeOpenApiSpecs(rdescs, info) {
|
|
9
|
+
return tracer_1.withCallTrace(fileName_1 + ":12:17")(tsplus_module_2.gen(function* ($) {
|
|
10
|
+
const ref = yield* $(tracer_1.withCallTrace(fileName_1 + ":13:30")(tsplus_module_1.make(new Map())));
|
|
11
|
+
const withRef = tracer_1.withCallTrace(fileName_1 + ":14:21")(tsplus_module_2.provideService(References)({ ref }));
|
|
12
|
+
const paths = yield* $(tsplus_module_3.pipe(makeJsonSchema(rdescs), withRef));
|
|
13
|
+
const refs = yield* $(tsplus_module_1.get(ref));
|
|
14
|
+
const parameterRefs = {}; // todos
|
|
15
|
+
const schemas = {};
|
|
16
|
+
const securitySchemes = {
|
|
17
|
+
bearerAuth: {
|
|
18
|
+
type: "http",
|
|
19
|
+
scheme: "bearer",
|
|
20
|
+
bearerFormat: "JWT"
|
|
21
|
+
}
|
|
22
|
+
}; // { basicAuth: { type: "http", scheme: "basic" } }
|
|
23
|
+
const components = { securitySchemes, schemas, parameters: parameterRefs };
|
|
24
|
+
for (const entry of refs.entries()) {
|
|
25
|
+
// eslint-disable-next-line prefer-destructuring
|
|
26
|
+
schemas[entry[0]] = entry[1];
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
openapi: "3.0.0",
|
|
30
|
+
info: {
|
|
31
|
+
title: info.title,
|
|
32
|
+
description: info.description,
|
|
33
|
+
termsOfService: info.tos,
|
|
34
|
+
contact: info.contact
|
|
35
|
+
? {
|
|
36
|
+
name: info.contact.name,
|
|
37
|
+
email: info.contact.email,
|
|
38
|
+
url: info.contact.url
|
|
39
|
+
}
|
|
40
|
+
: undefined,
|
|
41
|
+
license: info.license
|
|
42
|
+
? {
|
|
43
|
+
name: info.license.name,
|
|
44
|
+
url: info.license.url
|
|
45
|
+
}
|
|
46
|
+
: undefined,
|
|
47
|
+
version: info.version
|
|
48
|
+
},
|
|
49
|
+
tags: [],
|
|
50
|
+
paths,
|
|
51
|
+
components
|
|
52
|
+
// test,
|
|
53
|
+
};
|
|
54
|
+
}));
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZU9wZW5BcGlTcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL19zcmMvbGliL2FwaS9leHByZXNzL21ha2VPcGVuQXBpU3BlY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFHQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOERBQThELENBQUE7QUFDekYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBR3BELE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsTUFBb0MsRUFDcEMsSUFBaUI7SUFFakIscURBQU8sb0JBQVcsUUFBUSxDQUFDLEVBQUMsQ0FBQztRQUMzQixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLCtDQUFDLHFCQUE4QyxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUMsQ0FBQTtRQUM5RSxNQUFNLE9BQU8saURBQUcsK0JBQXNCLFVBQVUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQSxDQUFBO1FBQzFELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBQSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFDN0QsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxxQkFBQyxHQUFHLEVBQUssQ0FBQTtRQUM5QixNQUFNLGFBQWEsR0FBd0IsRUFBRSxDQUFBLENBQUMsUUFBUTtRQUN0RCxNQUFNLE9BQU8sR0FBd0IsRUFBRSxDQUFBO1FBQ3ZDLE1BQU0sZUFBZSxHQUFHO1lBQ3RCLFVBQVUsRUFBRTtnQkFDVixJQUFJLEVBQUUsTUFBTTtnQkFDWixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsWUFBWSxFQUFFLEtBQUs7YUFDcEI7U0FDRixDQUFBLENBQUMsbURBQW1EO1FBQ3JELE1BQU0sVUFBVSxHQUFHLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLENBQUE7UUFFMUUsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbEMsZ0RBQWdEO1lBQ2hELE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDN0I7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLE9BQU87WUFDaEIsSUFBSSxFQUFFO2dCQUNKLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM3QixjQUFjLEVBQUUsSUFBSSxDQUFDLEdBQUc7Z0JBQ3hCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztvQkFDbkIsQ0FBQyxDQUFDO3dCQUNBLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUk7d0JBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUs7d0JBQ3pCLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUc7cUJBQ3RCO29CQUNELENBQUMsQ0FBQyxTQUFTO2dCQUNiLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztvQkFDbkIsQ0FBQyxDQUFDO3dCQUNBLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUk7d0JBQ3ZCLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUc7cUJBQ3RCO29CQUNELENBQUMsQ0FBQyxTQUFTO2dCQUNiLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTzthQUN0QjtZQUNELElBQUksRUFBRSxFQUFFO1lBQ1IsS0FBSztZQUNMLFVBQVU7WUFDVixRQUFRO1NBQ1QsQ0FBQTtJQUNILENBQUMsQ0FBQyxFQUFBO0FBQ0osQ0FBQyJ9
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import * as MO from "@effect-app/schema";
|
|
2
|
+
export declare const jwtIdentifier: MO.Annotation<{}>;
|
|
3
|
+
export declare const jwtFromString: MO.Schema<string, unknown, unknown, string, {}>;
|
|
4
|
+
export declare const jwt: MO.Schema<unknown, unknown, unknown, string, {}>;
|
|
5
|
+
//# sourceMappingURL=jwt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../../../../_src/lib/api/express/schema/jwt.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAIxC,eAAO,MAAM,aAAa,mBAA0B,CAAA;AAEpD,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAyBzE,CAAA;AAED,eAAO,MAAM,GAAG,kDAAkC,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
/* eslint-disable @typescript-eslint/ban-types */
|
|
4
|
+
import { pipe } from "@effect-app/core/Function";
|
|
5
|
+
import * as MO from "@effect-app/schema";
|
|
6
|
+
import { These as Th } from "@effect-app/schema";
|
|
7
|
+
import jwt_decode from "jwt-decode";
|
|
8
|
+
export const jwtIdentifier = MO.makeAnnotation();
|
|
9
|
+
export const jwtFromString = pipe(
|
|
10
|
+
// MO.identity((u): u is string => typeof u === "string"),
|
|
11
|
+
MO.identity((u) => {
|
|
12
|
+
throw new Error("Cannot id JWT: " + u);
|
|
13
|
+
}), MO.constructor(n => Th.succeed(n)),
|
|
14
|
+
// MO.arbitrary((_) => {
|
|
15
|
+
// throw new Error("Cannot arb JWT")
|
|
16
|
+
// }), // TODO
|
|
17
|
+
// MO.encoder((_) => {
|
|
18
|
+
// throw new Error("can't encode")
|
|
19
|
+
// }),
|
|
20
|
+
MO.parser((p) => {
|
|
21
|
+
try {
|
|
22
|
+
return Th.succeed(
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
24
|
+
// @ts-expect-error
|
|
25
|
+
jwt_decode(p));
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
return Th.fail(MO.leafE(MO.parseStringE(p))); // "not a JWT: " + err as anyw
|
|
29
|
+
}
|
|
30
|
+
}), MO.mapApi(() => ({})), MO.annotate(jwtIdentifier, {}));
|
|
31
|
+
export const jwt = MO.string[">>>"](jwtFromString);
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vX3NyYy9saWIvYXBpL2V4cHJlc3Mvc2NoZW1hL2p3dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0REFBNEQ7QUFDNUQsdURBQXVEO0FBQ3ZELGlEQUFpRDtBQUNqRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDaEQsT0FBTyxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUUsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ2hELE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUVuQyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLGNBQWMsRUFBTSxDQUFBO0FBRXBELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBb0QsSUFBSTtBQUNoRiwwREFBMEQ7QUFDMUQsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBZSxFQUFFO0lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUE7QUFDeEMsQ0FBQyxDQUFDLEVBQ0YsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEMsMEJBQTBCO0FBQzFCLHdDQUF3QztBQUN4QyxnQkFBZ0I7QUFDaEIsd0JBQXdCO0FBQ3hCLHNDQUFzQztBQUN0QyxRQUFRO0FBQ1IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO0lBQ25CLElBQUk7UUFDRixPQUFPLEVBQUUsQ0FBQyxPQUFPO1FBQ2YsNkRBQTZEO1FBQzdELG1CQUFtQjtRQUNuQixVQUFVLENBQUMsQ0FBQyxDQUFDLENBQ2QsQ0FBQTtLQUNGO0lBQUMsT0FBTyxHQUFHLEVBQUU7UUFDWixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLDhCQUE4QjtLQUM1RTtBQUNILENBQUMsQ0FBQyxFQUNGLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNyQixFQUFFLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FDL0IsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFBIn0=
|