@effect-app/infra 4.0.0-beta.123 → 4.0.0-beta.125
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 +16 -0
- package/dist/Model/Repository/ext.d.ts +17 -10
- package/dist/Model/Repository/ext.d.ts.map +1 -1
- package/dist/Model/Repository/ext.js +21 -1
- package/dist/Model/Repository/internal/internal.d.ts +2 -2
- package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
- package/dist/Model/Repository/internal/internal.js +5 -2
- package/dist/Model/Repository/service.d.ts +2 -2
- package/dist/Model/Repository/service.d.ts.map +1 -1
- package/dist/Operations.d.ts +1 -1
- package/dist/QueueMaker/memQueue.d.ts +5 -2
- package/dist/QueueMaker/memQueue.d.ts.map +1 -1
- package/dist/QueueMaker/memQueue.js +1 -1
- package/dist/QueueMaker/sbqueue.d.ts +5 -2
- package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
- package/dist/QueueMaker/sbqueue.js +1 -1
- package/dist/RequestContext.d.ts +2 -2
- package/dist/Store/Memory.js +1 -1
- package/dist/Store/SQL/Pg.js +1 -1
- package/dist/Store/SQL.js +1 -1
- package/dist/api/internal/auth.d.ts +42 -4
- package/dist/api/internal/auth.d.ts.map +1 -1
- package/dist/api/internal/auth.js +160 -29
- package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware.js +1 -1
- package/dist/api/routing.js +1 -1
- package/package.json +3 -7
- package/src/Model/Repository/ext.ts +39 -24
- package/src/Model/Repository/internal/internal.ts +4 -1
- package/src/Model/Repository/service.ts +4 -2
- package/src/QueueMaker/memQueue.ts +2 -2
- package/src/QueueMaker/sbqueue.ts +2 -2
- package/src/Store/Memory.ts +1 -1
- package/src/Store/SQL/Pg.ts +1 -1
- package/src/Store/SQL.ts +2 -2
- package/src/api/internal/auth.ts +242 -42
- package/src/api/routing/middleware/middleware.ts +1 -1
- package/src/api/routing.ts +1 -1
- package/test/auth.test.ts +101 -0
- package/test/rawQuery.test.ts +1 -1
|
@@ -127,4 +127,4 @@ export const makeSqlTransactionMiddleware = Effect.fnUntraced(function* (rcm) {
|
|
|
127
127
|
};
|
|
128
128
|
return mw;
|
|
129
129
|
});
|
|
130
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcGkvcm91dGluZy9taWRkbGV3YXJlL21pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdELE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUNqSixPQUFPLEVBQUUsYUFBYSxFQUFzQixNQUFNLGdCQUFnQixDQUFBO0FBQ2xFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUV6QyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFBO0FBQ2pFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUV4RCxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUE7QUFDM0MsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7QUFFakQsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUNyQyxPQUFPLEVBQ1AsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDbEIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcs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
|
package/dist/api/routing.js
CHANGED
|
@@ -164,4 +164,4 @@ export const makeRouter = (middleware) => {
|
|
|
164
164
|
Router: matchFor
|
|
165
165
|
};
|
|
166
166
|
};
|
|
167
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcm91dGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0REFBNEQ7QUFDNUQsMERBQTBEO0FBQzFELDREQUE0RDtBQUM1RCx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUE4QixTQUFTLEVBQUUsQ0FBQyxFQUFjLE1BQU0sWUFBWSxDQUFBO0FBQ3hHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUkzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBRTdELE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUF5QixTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUlyRixjQUFjLHlCQUF5QixDQUFBO0FBOEJ2QyxRQUFRO0FBQ1IsdUNBQXVDO0FBQ3ZDLDRDQUE0QztBQUM1QyxJQUFVLFlBQVksQ0FLckI7QUFMRCxXQUFVLFlBQVk7SUFDUCxvQkFBTyxHQUFHLEdBQVksQ0FBQTtJQUV0QixnQkFBRyxHQUFHLEtBQWMsQ0FBQTtBQUVuQyxDQUFDLEVBTFMsWUFBWSxLQUFaLFlBQVksUUFLckI7QUFtR0QsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLE1BQU07S0FDN0IsR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUNaLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkMsT0FBTyxHQUFHLEtBQUssTUFBTSxDQUFBO0FBQ3ZCLENBQUMsQ0FBQztLQUNELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7QUFFckIsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBVXhCLFVBU0MsRUFDRCxFQUFFO0lBQ0Y7OztPQUdHO0lBQ0gsU0FBUyxRQUFRLENBR2YsR0FBYSxF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
|
package/package.json
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/infra",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.125",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
7
7
|
"@faker-js/faker": "^8.4.1",
|
|
8
8
|
"change-case": "^5.4.4",
|
|
9
9
|
"cross-fetch": "^4.1.0",
|
|
10
|
-
"express-oauth2-jwt-bearer": "^1.8.0",
|
|
11
10
|
"fast-check": "~4.7.0",
|
|
11
|
+
"jose": "^6.2.2",
|
|
12
12
|
"path-parser": "^6.1.0",
|
|
13
13
|
"proper-lockfile": "^4.1.2",
|
|
14
14
|
"pure-rand": "7.0.1",
|
|
15
15
|
"query-string": "^9.3.1",
|
|
16
|
-
"effect-app": "4.0.0-beta.
|
|
16
|
+
"effect-app": "4.0.0-beta.125"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@azure/cosmos": "^4.9.3",
|
|
@@ -21,14 +21,11 @@
|
|
|
21
21
|
"@sentry/node": "10.49.0",
|
|
22
22
|
"@sentry/opentelemetry": "10.49.0",
|
|
23
23
|
"@types/better-sqlite3": "^7.6.13",
|
|
24
|
-
"@types/express": "^5.0.6",
|
|
25
24
|
"@types/node": "25.6.0",
|
|
26
25
|
"@types/proper-lockfile": "^4.1.4",
|
|
27
26
|
"@types/redis": "^2.8.32",
|
|
28
27
|
"@types/redlock": "^4.0.8",
|
|
29
28
|
"better-sqlite3": "^12.9.0",
|
|
30
|
-
"express": "^5.2.1",
|
|
31
|
-
"jwks-rsa": "2.1.4",
|
|
32
29
|
"jwt-decode": "^4.0.0",
|
|
33
30
|
"mongodb": "7.2.0",
|
|
34
31
|
"redis": "^3.1.2",
|
|
@@ -47,7 +44,6 @@
|
|
|
47
44
|
"@sentry/node": "10.49.0",
|
|
48
45
|
"@sentry/opentelemetry": "10.49.0",
|
|
49
46
|
"effect": "^4.0.0-beta.52",
|
|
50
|
-
"express": "^5.2.1",
|
|
51
47
|
"jwt-decode": "^4.0.0",
|
|
52
48
|
"redis": "^3.1.2",
|
|
53
49
|
"redlock": "^4.2.0"
|
|
@@ -263,6 +263,10 @@ export const extendRepo = <
|
|
|
263
263
|
request: (id: T[IdKey]) => Effect.request(_request({ id }), requestResolver),
|
|
264
264
|
get,
|
|
265
265
|
log: (evt: Evt) => AnyPureDSL.log(evt),
|
|
266
|
+
/**
|
|
267
|
+
* Enables chunked writes for large batches via `options.batch`.
|
|
268
|
+
* Note: batching breaks transactional properties because chunks are saved independently.
|
|
269
|
+
*/
|
|
266
270
|
save: ((itemOrItems: T | NonEmptyReadonlyArray<T>, options?: BatchOptions) => {
|
|
267
271
|
const items = asReadonlyArray(itemOrItems)
|
|
268
272
|
const batchSize = getBatchSize(options?.batch)
|
|
@@ -274,23 +278,19 @@ export const extendRepo = <
|
|
|
274
278
|
(batch) => repo.saveAndPublish(batch),
|
|
275
279
|
{ discard: true }
|
|
276
280
|
)
|
|
277
|
-
}) as
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
InvalidStateError | OptimisticConcurrencyException,
|
|
286
|
-
RSchema | RPublish
|
|
287
|
-
>
|
|
288
|
-
/**
|
|
289
|
-
* Enables chunked writes for large batches.
|
|
290
|
-
* Note: batching breaks transactional properties because chunks are saved independently.
|
|
291
|
-
*/
|
|
292
|
-
},
|
|
281
|
+
}) as (
|
|
282
|
+
itemOrItems: T | NonEmptyReadonlyArray<T>,
|
|
283
|
+
options?: BatchOptions
|
|
284
|
+
) => Effect.Effect<
|
|
285
|
+
void,
|
|
286
|
+
InvalidStateError | OptimisticConcurrencyException,
|
|
287
|
+
RSchema | RPublish
|
|
288
|
+
>,
|
|
293
289
|
saveWithEvents: (events: Iterable<Evt>) => (...items: NonEmptyArray<T>) => repo.saveAndPublish(items, events),
|
|
290
|
+
/**
|
|
291
|
+
* Enables chunked deletes for large batches via `options.batch`.
|
|
292
|
+
* Note: batching breaks transactional properties because chunks are removed independently.
|
|
293
|
+
*/
|
|
294
294
|
remove: ((itemOrItems: T | NonEmptyReadonlyArray<T>, options?: BatchOptions) => {
|
|
295
295
|
const items = asReadonlyArray(itemOrItems)
|
|
296
296
|
const batchSize = getBatchSize(options?.batch)
|
|
@@ -302,14 +302,29 @@ export const extendRepo = <
|
|
|
302
302
|
(batch) => repo.removeAndPublish(batch),
|
|
303
303
|
{ discard: true }
|
|
304
304
|
)
|
|
305
|
-
}) as
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
305
|
+
}) as (
|
|
306
|
+
itemOrItems: T | NonEmptyReadonlyArray<T>,
|
|
307
|
+
options?: BatchOptions
|
|
308
|
+
) => Effect.Effect<void, never, RSchema | RPublish>,
|
|
309
|
+
/**
|
|
310
|
+
* Enables chunked deletes for large batches via `options.batch`.
|
|
311
|
+
* Note: batching breaks transactional properties because chunks are removed independently.
|
|
312
|
+
*/
|
|
313
|
+
removeById: ((idOrIds: T[IdKey] | NonEmptyReadonlyArray<T[IdKey]>, options?: BatchOptions) => {
|
|
314
|
+
const ids = asReadonlyArray(idOrIds) as NonEmptyReadonlyArray<T[IdKey]>
|
|
315
|
+
const batchSize = getBatchSize(options?.batch)
|
|
316
|
+
if (batchSize === undefined) {
|
|
317
|
+
return repo.removeById(ids)
|
|
318
|
+
}
|
|
319
|
+
return Effect.forEach(
|
|
320
|
+
Array.chunksOf(ids, batchSize),
|
|
321
|
+
(batch) => repo.removeById(batch),
|
|
322
|
+
{ discard: true }
|
|
323
|
+
)
|
|
324
|
+
}) as (
|
|
325
|
+
idOrIds: T[IdKey] | NonEmptyReadonlyArray<T[IdKey]>,
|
|
326
|
+
options?: BatchOptions
|
|
327
|
+
) => Effect.Effect<void, never, RSchema>,
|
|
313
328
|
queryAndSavePure,
|
|
314
329
|
saveManyWithPure,
|
|
315
330
|
byIdAndSaveWithPure,
|
|
@@ -233,7 +233,10 @@ export function makeRepoInternal<
|
|
|
233
233
|
)
|
|
234
234
|
|
|
235
235
|
const removeById = Effect.fn("removeById", { attributes: { itemType: name } })(
|
|
236
|
-
function*(
|
|
236
|
+
function*(idOrIds: T[IdKey] | NonEmptyReadonlyArray<T[IdKey]>) {
|
|
237
|
+
const ids = globalThis.Array.isArray(idOrIds)
|
|
238
|
+
? idOrIds as readonly T[IdKey][]
|
|
239
|
+
: [idOrIds as T[IdKey]]
|
|
237
240
|
if (!Array.isReadonlyArrayNonEmpty(ids)) {
|
|
238
241
|
return
|
|
239
242
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import type { Effect, Option, PubSub, S } from "effect-app"
|
|
2
|
+
import type { Effect, NonEmptyReadonlyArray, Option, PubSub, S } from "effect-app"
|
|
3
3
|
import type { InvalidStateError, NotFoundError, OptimisticConcurrencyException } from "effect-app/client/errors"
|
|
4
4
|
import type { NonNegativeInt } from "effect-app/Schema/numbers"
|
|
5
5
|
import type { FieldValues, IsNever, ResolveFirstLevel } from "../filter/types.js"
|
|
@@ -31,7 +31,9 @@ export interface Repository<
|
|
|
31
31
|
events?: Iterable<Evt>
|
|
32
32
|
) => Effect.Effect<void, never, RSchema | RPublish>
|
|
33
33
|
|
|
34
|
-
readonly removeById: (
|
|
34
|
+
readonly removeById: (
|
|
35
|
+
idOrIds: T[IdKey] | NonEmptyReadonlyArray<T[IdKey]>
|
|
36
|
+
) => Effect.Effect<void, never, RSchema>
|
|
35
37
|
|
|
36
38
|
readonly queryRaw: <T, Out, R>(
|
|
37
39
|
schema: S.Codec<T, Out, R>,
|
|
@@ -6,7 +6,7 @@ import { MemQueue } from "../adapters/memQueue.js"
|
|
|
6
6
|
import { getRequestContext, setupRequestContextWithCustomSpan } from "../api/setupRequest.js"
|
|
7
7
|
import { InfraLogger } from "../logger.js"
|
|
8
8
|
import { reportNonInterruptedFailure, reportNonInterruptedFailureCause } from "./errors.js"
|
|
9
|
-
import {
|
|
9
|
+
import { QueueMeta } from "./service.js"
|
|
10
10
|
|
|
11
11
|
export const makeMemQueue = Effect.fnUntraced(function*<
|
|
12
12
|
Evt extends { id: S.StringId; _tag: string },
|
|
@@ -105,5 +105,5 @@ export const makeMemQueue = Effect.fnUntraced(function*<
|
|
|
105
105
|
}, (effect) => effect.pipe(silenceAndReportError, Effect.forever))()
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
|
-
return queue
|
|
108
|
+
return queue
|
|
109
109
|
})
|
|
@@ -6,7 +6,7 @@ import { Receiver, Sender } from "../adapters/ServiceBus.js"
|
|
|
6
6
|
import { getRequestContext, setupRequestContextWithCustomSpan } from "../api/setupRequest.js"
|
|
7
7
|
import { InfraLogger } from "../logger.js"
|
|
8
8
|
import { reportNonInterruptedFailure, reportNonInterruptedFailureCause, reportQueueError } from "./errors.js"
|
|
9
|
-
import {
|
|
9
|
+
import { QueueMeta } from "./service.js"
|
|
10
10
|
|
|
11
11
|
export function makeServiceBusQueue<
|
|
12
12
|
Evt extends { id: StringId; _tag: string },
|
|
@@ -102,6 +102,6 @@ export function makeServiceBusQueue<
|
|
|
102
102
|
yield* sender.sendMessages(msgs)
|
|
103
103
|
})
|
|
104
104
|
}
|
|
105
|
-
return queue
|
|
105
|
+
return queue
|
|
106
106
|
})
|
|
107
107
|
}
|
package/src/Store/Memory.ts
CHANGED
package/src/Store/SQL/Pg.ts
CHANGED
|
@@ -209,7 +209,7 @@ const makePgStore = Effect.fnUntraced(function*({ prefix }: StorageConfig) {
|
|
|
209
209
|
f.select as
|
|
210
210
|
| NonEmptyReadonlyArray<string | { key: string; subKeys: readonly string[] }>
|
|
211
211
|
| undefined,
|
|
212
|
-
f.order
|
|
212
|
+
f.order,
|
|
213
213
|
f.skip,
|
|
214
214
|
f.limit
|
|
215
215
|
)
|
package/src/Store/SQL.ts
CHANGED
|
@@ -229,7 +229,7 @@ function makeSQLStoreInt(dialect: SQLDialect, jsonColumnType: string) {
|
|
|
229
229
|
| NonEmptyReadonlyArray<string | { key: string; subKeys: readonly string[] }>
|
|
230
230
|
| undefined,
|
|
231
231
|
f
|
|
232
|
-
.order
|
|
232
|
+
.order,
|
|
233
233
|
f
|
|
234
234
|
.skip,
|
|
235
235
|
f
|
|
@@ -655,7 +655,7 @@ export function SQLiteStoreLayer(
|
|
|
655
655
|
const withTransaction: WithNsTransactionFn = (effect) =>
|
|
656
656
|
storeId.asEffect().pipe(
|
|
657
657
|
Effect.flatMap((ns) => withNsSql(ns, (sql) => sql.withTransaction(effect).pipe(Effect.orDie)))
|
|
658
|
-
)
|
|
658
|
+
)
|
|
659
659
|
|
|
660
660
|
return StoreMaker.context(storeMaker).pipe(
|
|
661
661
|
Context.add(WithNsTransaction, withTransaction)
|
package/src/api/internal/auth.ts
CHANGED
|
@@ -1,42 +1,244 @@
|
|
|
1
|
-
|
|
2
|
-
/* eslint-disable unused-imports/no-unused-vars */
|
|
3
|
-
import { Data, Effect } from "effect-app"
|
|
1
|
+
import { Data, Effect, Option } from "effect-app"
|
|
4
2
|
import { HttpHeaders, HttpMiddleware, HttpServerRequest, HttpServerResponse } from "effect-app/http"
|
|
5
|
-
import {
|
|
3
|
+
import { createRemoteJWKSet, jwtVerify } from "jose"
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
const getHeaders = (error: string, description: string, scopes?: ReadonlyArray<string>) => ({
|
|
6
|
+
"WWW-Authenticate": `Bearer realm="api", error="${error}", error_description="${description.replace(/"/g, "'")}"${
|
|
7
|
+
scopes ? `, scope="${scopes.join(" ")}"` : ""
|
|
8
|
+
}`
|
|
9
|
+
})
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
11
|
+
export class UnauthorizedError extends Error {
|
|
12
|
+
readonly status: number = 401
|
|
13
|
+
readonly statusCode: number = 401
|
|
14
|
+
headers = { "WWW-Authenticate": "Bearer realm=\"api\"" }
|
|
15
|
+
|
|
16
|
+
constructor(message = "Unauthorized") {
|
|
17
|
+
super(message)
|
|
18
|
+
this.name = this.constructor.name
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export class InvalidRequestError extends UnauthorizedError {
|
|
23
|
+
readonly code: string
|
|
24
|
+
override readonly status = 400
|
|
25
|
+
override readonly statusCode = 400
|
|
26
|
+
|
|
27
|
+
constructor(message = "Invalid Request", useErrorCode = true) {
|
|
28
|
+
super(message)
|
|
29
|
+
this.code = useErrorCode ? "invalid_request" : ""
|
|
30
|
+
if (useErrorCode) {
|
|
31
|
+
this.headers = getHeaders(this.code, this.message)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export class InvalidTokenError extends UnauthorizedError {
|
|
37
|
+
readonly code = "invalid_token"
|
|
38
|
+
|
|
39
|
+
constructor(message = "Invalid Token") {
|
|
40
|
+
super(message)
|
|
41
|
+
this.headers = getHeaders(this.code, this.message)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export class InsufficientScopeError extends UnauthorizedError {
|
|
46
|
+
readonly code = "insufficient_scope"
|
|
47
|
+
override readonly status = 403
|
|
48
|
+
override readonly statusCode = 403
|
|
49
|
+
|
|
50
|
+
constructor(scopes?: ReadonlyArray<string>, message = "Insufficient Scope") {
|
|
51
|
+
super(message)
|
|
52
|
+
this.headers = getHeaders(this.code, this.message, scopes)
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface JwtVerifierOptions {
|
|
57
|
+
readonly audience?: string | Array<string> | ReadonlyArray<string>
|
|
58
|
+
readonly clockTolerance?: number
|
|
59
|
+
readonly issuer?: string
|
|
60
|
+
readonly issuerBaseURL?: string
|
|
61
|
+
readonly jwksUri?: string
|
|
62
|
+
readonly maxTokenAge?: number
|
|
63
|
+
readonly secret?: string
|
|
64
|
+
readonly strict?: boolean
|
|
65
|
+
readonly tokenSigningAlg?: string
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface AuthOptions extends JwtVerifierOptions {
|
|
69
|
+
readonly authRequired?: boolean
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
type Config = AuthOptions
|
|
73
|
+
|
|
74
|
+
type JwtError = InsufficientScopeError | InvalidRequestError | InvalidTokenError | UnauthorizedError
|
|
75
|
+
|
|
76
|
+
type ResolvedConfigBase = {
|
|
77
|
+
readonly audience: string | Array<string> | undefined
|
|
78
|
+
readonly clockTolerance: number
|
|
79
|
+
readonly issuer: string | undefined
|
|
80
|
+
readonly maxTokenAge: number | undefined
|
|
81
|
+
readonly strict: boolean
|
|
82
|
+
readonly tokenSigningAlg: string | undefined
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
type ResolvedConfig =
|
|
86
|
+
& ResolvedConfigBase
|
|
87
|
+
& (
|
|
88
|
+
| {
|
|
89
|
+
readonly key: ReturnType<typeof createRemoteJWKSet>
|
|
90
|
+
readonly keyType: "jwks"
|
|
91
|
+
}
|
|
92
|
+
| {
|
|
93
|
+
readonly key: Uint8Array
|
|
94
|
+
readonly keyType: "secret"
|
|
95
|
+
}
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
const isRecord = (value: unknown): value is Record<string, unknown> => typeof value === "object" && value !== null
|
|
99
|
+
|
|
100
|
+
const getErrorMessage = (error: unknown) => error instanceof Error ? error.message : String(error)
|
|
101
|
+
|
|
102
|
+
const normalizeAudience = (audience: Config["audience"]): string | Array<string> | undefined =>
|
|
103
|
+
Array.isArray(audience) ? Array.from(audience) : audience as string | undefined
|
|
104
|
+
|
|
105
|
+
const buildDiscoveryUrl = (issuerBaseURL: string) => {
|
|
106
|
+
const url = new URL(issuerBaseURL)
|
|
107
|
+
if (!url.pathname.includes("/.well-known/")) {
|
|
108
|
+
url.pathname = url.pathname.endsWith("/")
|
|
109
|
+
? `${url.pathname}.well-known/openid-configuration`
|
|
110
|
+
: `${url.pathname}/.well-known/openid-configuration`
|
|
111
|
+
}
|
|
112
|
+
url.search = ""
|
|
113
|
+
url.hash = ""
|
|
114
|
+
return url
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const fetchDiscoveryDocumentPromise = async (issuerBaseURL: string) => {
|
|
118
|
+
const response = await fetch(buildDiscoveryUrl(issuerBaseURL))
|
|
119
|
+
if (!response.ok) {
|
|
120
|
+
throw new Error(`Failed to fetch authorization server metadata: ${response.status}`)
|
|
121
|
+
}
|
|
122
|
+
const json = await response.json()
|
|
123
|
+
if (!isRecord(json) || typeof json["issuer"] !== "string" || typeof json["jwks_uri"] !== "string") {
|
|
124
|
+
throw new Error("Invalid authorization server metadata")
|
|
125
|
+
}
|
|
126
|
+
return { issuer: json["issuer"], jwksUri: json["jwks_uri"] }
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const getAuthorizationToken = (headers: HttpHeaders.Headers, authRequired: boolean) => {
|
|
130
|
+
const authorization = HttpHeaders.get(headers, "authorization")
|
|
131
|
+
if (Option.isNone(authorization)) {
|
|
132
|
+
return authRequired ? Effect.fail(new UnauthorizedError()) : Effect.succeed(Option.none<string>())
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const [scheme, token] = authorization.value.split(" ")
|
|
136
|
+
if (!scheme || !token || scheme.toLowerCase() !== "bearer") {
|
|
137
|
+
return Effect.fail(new InvalidRequestError("", false))
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return Effect.succeed(Option.some(token))
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const makeResolveConfig = (config: Config) => {
|
|
144
|
+
let cached: Promise<ResolvedConfig> | undefined
|
|
145
|
+
|
|
146
|
+
return Effect.tryPromise({
|
|
147
|
+
try: () => {
|
|
148
|
+
if (!cached) {
|
|
149
|
+
cached = (async (): Promise<ResolvedConfig> => {
|
|
150
|
+
const discovery = config.issuerBaseURL
|
|
151
|
+
? await fetchDiscoveryDocumentPromise(config.issuerBaseURL)
|
|
152
|
+
: undefined
|
|
153
|
+
|
|
154
|
+
const issuer = config.issuer ?? discovery?.issuer
|
|
155
|
+
const jwksUri = config.jwksUri ?? discovery?.jwksUri
|
|
156
|
+
const secret = config.secret
|
|
157
|
+
const base = {
|
|
158
|
+
audience: normalizeAudience(config.audience),
|
|
159
|
+
clockTolerance: config.clockTolerance ?? 5,
|
|
160
|
+
issuer,
|
|
161
|
+
maxTokenAge: config.maxTokenAge,
|
|
162
|
+
strict: config.strict ?? false,
|
|
163
|
+
tokenSigningAlg: config.tokenSigningAlg
|
|
164
|
+
} satisfies ResolvedConfigBase
|
|
165
|
+
|
|
166
|
+
if (!issuer && !secret) {
|
|
167
|
+
throw new InvalidRequestError("JWT config requires 'issuer', 'issuerBaseURL', or 'secret'")
|
|
29
168
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
169
|
+
|
|
170
|
+
if (!secret) {
|
|
171
|
+
if (!jwksUri) {
|
|
172
|
+
throw new InvalidRequestError("JWT config requires 'jwksUri', 'issuerBaseURL', or 'secret'")
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return {
|
|
176
|
+
...base,
|
|
177
|
+
key: createRemoteJWKSet(new URL(jwksUri)),
|
|
178
|
+
keyType: "jwks"
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return {
|
|
183
|
+
...base,
|
|
184
|
+
key: new TextEncoder().encode(secret),
|
|
185
|
+
keyType: "secret"
|
|
186
|
+
}
|
|
187
|
+
})()
|
|
38
188
|
}
|
|
189
|
+
|
|
190
|
+
return cached
|
|
191
|
+
},
|
|
192
|
+
catch: (error) =>
|
|
193
|
+
error instanceof InvalidRequestError || error instanceof InvalidTokenError
|
|
194
|
+
? error
|
|
195
|
+
: new InvalidTokenError(getErrorMessage(error))
|
|
196
|
+
})
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const verifyToken =
|
|
200
|
+
(resolveConfig: Effect.Effect<ResolvedConfig, InvalidRequestError | InvalidTokenError>) => (token: string) =>
|
|
201
|
+
resolveConfig.pipe(
|
|
202
|
+
Effect.flatMap((config) => {
|
|
203
|
+
const options = {
|
|
204
|
+
clockTolerance: config.clockTolerance,
|
|
205
|
+
...(config.tokenSigningAlg ? { algorithms: [config.tokenSigningAlg] } : {}),
|
|
206
|
+
...(config.audience !== undefined ? { audience: config.audience } : {}),
|
|
207
|
+
...(config.issuer !== undefined ? { issuer: config.issuer } : {}),
|
|
208
|
+
...(config.maxTokenAge !== undefined ? { maxTokenAge: config.maxTokenAge } : {})
|
|
209
|
+
}
|
|
210
|
+
const verified = config.keyType === "jwks"
|
|
211
|
+
? Effect.tryPromise({
|
|
212
|
+
try: () => jwtVerify(token, config.key, options).then(({ protectedHeader }) => ({ protectedHeader })),
|
|
213
|
+
catch: (error) => new InvalidTokenError(getErrorMessage(error))
|
|
214
|
+
})
|
|
215
|
+
: Effect.tryPromise({
|
|
216
|
+
try: () => jwtVerify(token, config.key, options).then(({ protectedHeader }) => ({ protectedHeader })),
|
|
217
|
+
catch: (error) => new InvalidTokenError(getErrorMessage(error))
|
|
218
|
+
})
|
|
219
|
+
|
|
220
|
+
return verified.pipe(
|
|
221
|
+
Effect.flatMap(({ protectedHeader }) => {
|
|
222
|
+
const typ = protectedHeader.typ?.toLowerCase().replace(/^application\//, "")
|
|
223
|
+
return config.strict && typ !== "at+jwt"
|
|
224
|
+
? Effect.fail(new InvalidTokenError("Unexpected 'typ' value"))
|
|
225
|
+
: Effect.void
|
|
226
|
+
})
|
|
227
|
+
)
|
|
228
|
+
})
|
|
39
229
|
)
|
|
230
|
+
|
|
231
|
+
export const checkJWTI = (config: Config) => {
|
|
232
|
+
const resolveConfig = makeResolveConfig(config)
|
|
233
|
+
const verify = verifyToken(resolveConfig)
|
|
234
|
+
|
|
235
|
+
return Effect.fnUntraced(function*(headers: HttpHeaders.Headers) {
|
|
236
|
+
const token = yield* getAuthorizationToken(headers, config.authRequired !== false)
|
|
237
|
+
if (Option.isNone(token)) {
|
|
238
|
+
return
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
yield* verify(token.value)
|
|
40
242
|
})
|
|
41
243
|
}
|
|
42
244
|
|
|
@@ -46,25 +248,23 @@ export const checkJwt = (config: Config) => {
|
|
|
46
248
|
Effect.gen(function*() {
|
|
47
249
|
const req = yield* HttpServerRequest.HttpServerRequest
|
|
48
250
|
const response = yield* check(req.headers).pipe(
|
|
49
|
-
Effect.catch((
|
|
50
|
-
HttpServerResponse.json({ message:
|
|
51
|
-
status:
|
|
52
|
-
headers: HttpHeaders.fromInput(
|
|
251
|
+
Effect.catch((error: JwtError) =>
|
|
252
|
+
HttpServerResponse.json({ message: error.message }, {
|
|
253
|
+
status: error.status,
|
|
254
|
+
headers: HttpHeaders.fromInput(error.headers)
|
|
53
255
|
})
|
|
54
256
|
)
|
|
55
257
|
)
|
|
258
|
+
|
|
56
259
|
if (response) {
|
|
57
260
|
return response
|
|
58
261
|
}
|
|
262
|
+
|
|
59
263
|
return yield* app
|
|
60
264
|
})
|
|
61
265
|
)
|
|
62
266
|
}
|
|
63
267
|
|
|
64
268
|
export class JWTError extends Data.TaggedClass("JWTError")<{
|
|
65
|
-
error:
|
|
66
|
-
| InsufficientScopeError
|
|
67
|
-
| InvalidRequestError
|
|
68
|
-
| InvalidTokenError
|
|
69
|
-
| UnauthorizedError
|
|
269
|
+
error: JwtError
|
|
70
270
|
}> {}
|
|
@@ -142,7 +142,7 @@ export const DefaultGenericMiddlewaresLive = Layer.mergeAll(
|
|
|
142
142
|
* }) {}
|
|
143
143
|
* ```
|
|
144
144
|
*/
|
|
145
|
-
export const requiresTransactionConfig = RpcContextMap.makeCustom()(Schema.Never, false
|
|
145
|
+
export const requiresTransactionConfig = RpcContextMap.makeCustom()(Schema.Never, false)
|
|
146
146
|
|
|
147
147
|
/**
|
|
148
148
|
* Creates the middleware Effect for SQL transaction wrapping.
|
package/src/api/routing.ts
CHANGED
|
@@ -249,7 +249,7 @@ export const makeRouter = <
|
|
|
249
249
|
type RequestModules = FilterRequestModules<Resource>
|
|
250
250
|
const requestModules = typedKeysOf(rsc).reduce((acc, cur) => {
|
|
251
251
|
if (Predicate.isObjectKeyword(rsc[cur]) && rsc[cur]["success"]) {
|
|
252
|
-
acc[cur as keyof RequestModules] = rsc[cur]
|
|
252
|
+
acc[cur as keyof RequestModules] = rsc[cur]
|
|
253
253
|
}
|
|
254
254
|
return acc
|
|
255
255
|
}, {} as RequestModules)
|