@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
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
OperationOptionsBase,
|
|
3
|
-
ProcessErrorArgs,
|
|
4
|
-
ServiceBusMessage,
|
|
5
|
-
ServiceBusMessageBatch,
|
|
6
|
-
ServiceBusReceivedMessage,
|
|
7
|
-
ServiceBusReceiver,
|
|
8
|
-
ServiceBusSender
|
|
9
|
-
} from "@azure/service-bus"
|
|
10
|
-
import { ServiceBusClient } from "@azure/service-bus"
|
|
11
|
-
|
|
12
|
-
function makeClient(url: string) {
|
|
13
|
-
return Effect(() => new ServiceBusClient(url)).acquireRelease(
|
|
14
|
-
client => Effect.promise(() => client.close())
|
|
15
|
-
)
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const Client = Tag<ServiceBusClient>()
|
|
19
|
-
export const LiveServiceBusClient = (url: string) => makeClient(url).toScopedLayer(Client)
|
|
20
|
-
|
|
21
|
-
function makeSender(queueName: string) {
|
|
22
|
-
return Effect.gen(function*($) {
|
|
23
|
-
const serviceBusClient = yield* $(Client.access)
|
|
24
|
-
|
|
25
|
-
return yield* $(
|
|
26
|
-
Effect(() => serviceBusClient.createSender(queueName)).acquireRelease(
|
|
27
|
-
subscription => Effect.promise(() => subscription.close())
|
|
28
|
-
)
|
|
29
|
-
)
|
|
30
|
-
})
|
|
31
|
-
}
|
|
32
|
-
export const Sender = Tag<ServiceBusSender>()
|
|
33
|
-
|
|
34
|
-
export function LiveSender(queueName: string) {
|
|
35
|
-
return makeSender(queueName).toScopedLayer(Sender)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function makeReceiver(queueName: string) {
|
|
39
|
-
return Effect.gen(function*($) {
|
|
40
|
-
const serviceBusClient = yield* $(Client.access)
|
|
41
|
-
|
|
42
|
-
return yield* $(
|
|
43
|
-
Effect(() => serviceBusClient.createReceiver(queueName)).acquireRelease(
|
|
44
|
-
r => Effect.promise(() => r.close())
|
|
45
|
-
)
|
|
46
|
-
)
|
|
47
|
-
})
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export const Receiver = Tag<ServiceBusReceiver>()
|
|
51
|
-
export function LiveReceiver(queueName: string) {
|
|
52
|
-
return makeReceiver(queueName).toScopedLayer(Receiver)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export function sendMessages(
|
|
56
|
-
messages: ServiceBusMessage | ServiceBusMessage[] | ServiceBusMessageBatch,
|
|
57
|
-
options?: OperationOptionsBase
|
|
58
|
-
) {
|
|
59
|
-
return Effect.gen(function*($) {
|
|
60
|
-
const s = yield* $(Sender.access)
|
|
61
|
-
return yield* $(Effect.promise(() => s.sendMessages(messages, options)))
|
|
62
|
-
})
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export function subscribe<RMsg, RErr>(hndlr: MessageHandlers<RMsg, RErr>) {
|
|
66
|
-
return Effect.gen(function*($) {
|
|
67
|
-
const r = yield* $(Receiver.access)
|
|
68
|
-
|
|
69
|
-
const env = yield* $(Effect.environment<RMsg | RErr>())
|
|
70
|
-
|
|
71
|
-
yield* $(
|
|
72
|
-
Effect(() =>
|
|
73
|
-
r.subscribe({
|
|
74
|
-
processError: err =>
|
|
75
|
-
hndlr.processError(err)
|
|
76
|
-
.provideEnvironment(env)
|
|
77
|
-
.unsafeRunPromise
|
|
78
|
-
.catch(console.error),
|
|
79
|
-
processMessage: msg =>
|
|
80
|
-
hndlr.processMessage(msg)
|
|
81
|
-
.provideEnvironment(env)
|
|
82
|
-
.unsafeRunPromise
|
|
83
|
-
// DO NOT CATCH ERRORS here as they should return to the queue!
|
|
84
|
-
})
|
|
85
|
-
).acquireRelease(
|
|
86
|
-
subscription => Effect.promise(() => subscription.close())
|
|
87
|
-
)
|
|
88
|
-
)
|
|
89
|
-
})
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
const SubscribeTag = Tag<Effect.Success<ReturnType<typeof subscribe>>>()
|
|
93
|
-
|
|
94
|
-
export function Subscription<RMsg, RErr>(hndlr: MessageHandlers<RMsg, RErr>) {
|
|
95
|
-
return subscribe(hndlr).toScopedLayer(SubscribeTag)
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
export interface MessageHandlers<RMsg, RErr> {
|
|
99
|
-
/**
|
|
100
|
-
* Handler that processes messages from service bus.
|
|
101
|
-
*
|
|
102
|
-
* @param message - A message received from Service Bus.
|
|
103
|
-
*/
|
|
104
|
-
processMessage(message: ServiceBusReceivedMessage): Effect<RMsg, never, void>
|
|
105
|
-
/**
|
|
106
|
-
* Handler that processes errors that occur during receiving.
|
|
107
|
-
* @param args - The error and additional context to indicate where
|
|
108
|
-
* the error originated.
|
|
109
|
-
*/
|
|
110
|
-
processError(args: ProcessErrorArgs): Effect<RErr, never, void>
|
|
111
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { Queue as Q } from "@effect/io/Queue"
|
|
2
|
-
|
|
3
|
-
export interface MemQueue {
|
|
4
|
-
getOrCreateQueue: (k: string) => Effect<never, never, Queue<string>>
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* @tsplus type MemQueue.Ops
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
export interface MemQueueOps extends Tag<MemQueue> {}
|
|
12
|
-
export const MemQueue: MemQueueOps = Tag<MemQueue>()
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* @tsplus static MemQueue.Ops Live
|
|
16
|
-
*/
|
|
17
|
-
export const LiveMemQueue = Effect.gen(function*($) {
|
|
18
|
-
const store = yield* $(Effect(new Map<string, Queue<string>>()))
|
|
19
|
-
|
|
20
|
-
return {
|
|
21
|
-
getOrCreateQueue: (k: string) =>
|
|
22
|
-
Effect.gen(function*($) {
|
|
23
|
-
const q = store.get(k)
|
|
24
|
-
if (q) return q
|
|
25
|
-
const newQ = yield* $(Q.unbounded<string>())
|
|
26
|
-
store.set(k, newQ)
|
|
27
|
-
return newQ
|
|
28
|
-
})
|
|
29
|
-
}
|
|
30
|
-
}).toLayer(MemQueue)
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { AtomicReference } from "./AtomicReference.js"
|
|
2
|
-
|
|
3
|
-
export class AtomicNumber extends AtomicReference<number> {
|
|
4
|
-
constructor(n: number) {
|
|
5
|
-
super(n)
|
|
6
|
-
|
|
7
|
-
this.incrementAndGet = this.incrementAndGet.bind(this)
|
|
8
|
-
this.decrementAndGet = this.decrementAndGet.bind(this)
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
incrementAndGet() {
|
|
12
|
-
this.set(this.get + 1)
|
|
13
|
-
return this.get
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
decrementAndGet() {
|
|
17
|
-
this.set(this.get - 1)
|
|
18
|
-
return this.get
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
getAndIncrement(): number {
|
|
22
|
-
const ret = this.get
|
|
23
|
-
|
|
24
|
-
this.set(this.get + 1)
|
|
25
|
-
|
|
26
|
-
return ret
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
export class AtomicReference<A> {
|
|
2
|
-
private current: A
|
|
3
|
-
|
|
4
|
-
constructor(readonly initial: A) {
|
|
5
|
-
this.current = initial
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
get get() {
|
|
9
|
-
return this.current
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
getAndSet(value: A) {
|
|
13
|
-
const old = this.current
|
|
14
|
-
|
|
15
|
-
this.set(value)
|
|
16
|
-
return old
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
set(value: A) {
|
|
20
|
-
this.current = value
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
compareAndSet(old: A, value: A) {
|
|
24
|
-
if (this.get === old) {
|
|
25
|
-
this.set(value)
|
|
26
|
-
return true
|
|
27
|
-
}
|
|
28
|
-
return false
|
|
29
|
-
}
|
|
30
|
-
}
|
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
import type { Clock } from "@effect/io/Clock"
|
|
2
|
-
import { Deferred, done as doneDeferred } from "@effect/io/Deferred"
|
|
3
|
-
import type { FiberId } from "@effect/io/Fiber/Id"
|
|
4
|
-
import { EmptyMutableQueue } from "@fp-ts/data/MutableQueue"
|
|
5
|
-
import { CacheStats } from "../../CacheStats.js"
|
|
6
|
-
import { EntryStats } from "../../EntryStats.js"
|
|
7
|
-
import type { Lookup } from "../../Lookup.js"
|
|
8
|
-
import type { Cache } from "../definition.js"
|
|
9
|
-
import { CacheURI } from "../definition.js"
|
|
10
|
-
import { CacheState } from "./CacheState.js"
|
|
11
|
-
import { MapKey } from "./MapKey.js"
|
|
12
|
-
import type { MapValue } from "./MapValue.js"
|
|
13
|
-
import { Complete, Pending, Refreshing } from "./MapValue.js"
|
|
14
|
-
|
|
15
|
-
export class CacheInternal<Key, Environment, Error, Value> implements Cache<Key, Error, Value> {
|
|
16
|
-
readonly [CacheURI] = {
|
|
17
|
-
_Key: (_: Key) => void 0,
|
|
18
|
-
_Error: (_: never) => _,
|
|
19
|
-
_Value: (_: never) => _
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
private cacheState: CacheState<Key, Error, Value>
|
|
23
|
-
|
|
24
|
-
constructor(
|
|
25
|
-
readonly capacity: number,
|
|
26
|
-
readonly lookup: Lookup<Key, Environment, Error, Value>,
|
|
27
|
-
readonly timeToLive: (exit: Exit<Error, Value>) => DUR,
|
|
28
|
-
readonly clock: Clock,
|
|
29
|
-
readonly environment: Context<Environment>,
|
|
30
|
-
readonly fiberId: FiberId
|
|
31
|
-
) {
|
|
32
|
-
this.cacheState = CacheState.initial<Key, Error, Value>()
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
get size(): Effect<never, never, number> {
|
|
36
|
-
return Effect(() => this.cacheState.map.size)
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
get entries(): Effect<never, never, Chunk<readonly [Key, Value]>> {
|
|
40
|
-
return Effect(() => {
|
|
41
|
-
const entries: Array<readonly [Key, Value]> = []
|
|
42
|
-
for (const [key, value] of this.cacheState.map) {
|
|
43
|
-
if (value._tag === "Complete" && value.exit.isSuccess()) {
|
|
44
|
-
entries.push([key, value.exit.value] as const)
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return Chunk.fromIterable(entries)
|
|
48
|
-
})
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
get values(): Effect<never, never, Chunk<Value>> {
|
|
52
|
-
return Effect(() => {
|
|
53
|
-
const values: Array<Value> = []
|
|
54
|
-
for (const [_, value] of this.cacheState.map) {
|
|
55
|
-
if (value._tag === "Complete" && value.exit.isSuccess()) {
|
|
56
|
-
values.push(value.exit.value)
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return Chunk.fromIterable(values)
|
|
60
|
-
})
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
get cacheStats(): Effect<never, never, CacheStats> {
|
|
64
|
-
return Effect(CacheStats(
|
|
65
|
-
this.cacheState.hits,
|
|
66
|
-
this.cacheState.misses,
|
|
67
|
-
this.cacheState.map.size
|
|
68
|
-
))
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
entryStats(k: Key): Effect<never, never, Opt<EntryStats>> {
|
|
72
|
-
return Effect(() => {
|
|
73
|
-
const value = this.cacheState.map.get(k).value
|
|
74
|
-
if (value == null) {
|
|
75
|
-
return Opt.none
|
|
76
|
-
}
|
|
77
|
-
switch (value._tag) {
|
|
78
|
-
case "Pending": {
|
|
79
|
-
return Opt.none
|
|
80
|
-
}
|
|
81
|
-
case "Complete": {
|
|
82
|
-
return Opt(EntryStats(value.entryStats.loadedMillis))
|
|
83
|
-
}
|
|
84
|
-
case "Refreshing": {
|
|
85
|
-
return Opt(EntryStats(value.complete.entryStats.loadedMillis))
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
})
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
get(k: Key): Effect<never, Error, Value> {
|
|
92
|
-
return Effect.suspendSucceed(() => {
|
|
93
|
-
let key: MapKey<Key> | undefined = undefined
|
|
94
|
-
let deferred: Deferred<Error, Value> | undefined = undefined
|
|
95
|
-
let value = this.cacheState.map.get(k).value
|
|
96
|
-
if (value == null) {
|
|
97
|
-
deferred = Deferred.unsafeMake<Error, Value>(this.fiberId)
|
|
98
|
-
key = new MapKey(k)
|
|
99
|
-
if (this.cacheState.map.has(k)) {
|
|
100
|
-
value = this.cacheState.map.get(k).value!
|
|
101
|
-
} else {
|
|
102
|
-
this.cacheState.map.set(k, new Pending(key, deferred))
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
if (value == null) {
|
|
106
|
-
this.trackAccess(key!)
|
|
107
|
-
this.trackMiss()
|
|
108
|
-
return this.lookupValueOf(k, deferred!)
|
|
109
|
-
}
|
|
110
|
-
switch (value._tag) {
|
|
111
|
-
case "Pending": {
|
|
112
|
-
this.trackAccess(value.key)
|
|
113
|
-
this.trackHit()
|
|
114
|
-
return value.deferred.await
|
|
115
|
-
}
|
|
116
|
-
case "Complete": {
|
|
117
|
-
this.trackAccess(value.key)
|
|
118
|
-
this.trackHit()
|
|
119
|
-
if (this.hasExpired(value.timeToLiveMillis)) {
|
|
120
|
-
const found = this.cacheState.map.get(k).value
|
|
121
|
-
if (Equals.equals(found, value)) {
|
|
122
|
-
this.cacheState.map.remove(k)
|
|
123
|
-
}
|
|
124
|
-
return this.get(k)
|
|
125
|
-
}
|
|
126
|
-
return value.exit.done
|
|
127
|
-
}
|
|
128
|
-
case "Refreshing": {
|
|
129
|
-
this.trackAccess(value.complete.key)
|
|
130
|
-
this.trackHit()
|
|
131
|
-
if (this.hasExpired(value.complete.timeToLiveMillis)) {
|
|
132
|
-
return value.deferred.await
|
|
133
|
-
}
|
|
134
|
-
return value.complete.exit.done
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
})
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
set(key: Key, value: Value): Effect<never, never, void> {
|
|
141
|
-
return Effect(() => {
|
|
142
|
-
const now = this.clock.currentTimeMillis().unsafeRunSync
|
|
143
|
-
const lookupResult = Exit.succeed(value)
|
|
144
|
-
this.cacheState.map.set(
|
|
145
|
-
key,
|
|
146
|
-
new Complete(
|
|
147
|
-
new MapKey(key),
|
|
148
|
-
lookupResult,
|
|
149
|
-
EntryStats(now),
|
|
150
|
-
now + this.timeToLive(lookupResult).millis
|
|
151
|
-
)
|
|
152
|
-
)
|
|
153
|
-
})
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
contains(key: Key): Effect<never, never, boolean> {
|
|
157
|
-
return Effect(() => this.cacheState.map.has(key))
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
refresh(k: Key): Effect<never, Error, void> {
|
|
161
|
-
return Effect.suspendSucceed(() => {
|
|
162
|
-
const deferred = Deferred.unsafeMake<Error, Value>(this.fiberId)
|
|
163
|
-
let value = this.cacheState.map.get(k).value
|
|
164
|
-
if (value == null) {
|
|
165
|
-
if (this.cacheState.map.has(k)) {
|
|
166
|
-
value = this.cacheState.map.get(k).value!
|
|
167
|
-
} else {
|
|
168
|
-
this.cacheState.map.set(k, new Pending(new MapKey(k), deferred))
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
if (value == null) {
|
|
172
|
-
return this.lookupValueOf(k, deferred).asUnit
|
|
173
|
-
}
|
|
174
|
-
switch (value._tag) {
|
|
175
|
-
case "Pending": {
|
|
176
|
-
return value.deferred.await.asUnit
|
|
177
|
-
}
|
|
178
|
-
case "Complete": {
|
|
179
|
-
if (this.hasExpired(value.timeToLiveMillis)) {
|
|
180
|
-
const found = this.cacheState.map.get(k).value!
|
|
181
|
-
if (Equals.equals(found, value)) {
|
|
182
|
-
this.cacheState.map.remove(k)
|
|
183
|
-
}
|
|
184
|
-
return this.get(k).asUnit
|
|
185
|
-
}
|
|
186
|
-
// Only trigger the lookup if we're still the current value
|
|
187
|
-
return this.lookupValueOf(value.key.value, deferred)
|
|
188
|
-
.when(() => {
|
|
189
|
-
const current = this.cacheState.map.get(k).value
|
|
190
|
-
if (Equals.equals(current, value)) {
|
|
191
|
-
this.cacheState.map.set(
|
|
192
|
-
k,
|
|
193
|
-
new Refreshing(deferred, value as Complete<Key, Error, Value>)
|
|
194
|
-
)
|
|
195
|
-
return true
|
|
196
|
-
}
|
|
197
|
-
return false
|
|
198
|
-
})
|
|
199
|
-
.asUnit
|
|
200
|
-
}
|
|
201
|
-
case "Refreshing": {
|
|
202
|
-
return value.deferred.await.asUnit
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
})
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
invalidate(key: Key): Effect<never, never, void> {
|
|
209
|
-
return Effect(() => {
|
|
210
|
-
this.cacheState.map.remove(key)
|
|
211
|
-
})
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
invalidateAll: Effect<never, never, void> = Effect(() => {
|
|
215
|
-
this.cacheState.map = MutableHashMap.empty<Key, MapValue<Key, Error, Value>>()
|
|
216
|
-
})
|
|
217
|
-
|
|
218
|
-
private trackHit(): void {
|
|
219
|
-
this.cacheState.hits = this.cacheState.hits + 1
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
private trackMiss(): void {
|
|
223
|
-
this.cacheState.misses = this.cacheState.misses + 1
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
private trackAccess(key: MapKey<Key>): void {
|
|
227
|
-
this.cacheState.accesses.offer(key)
|
|
228
|
-
if (this.cacheState.updating.compareAndSet(false, true)) {
|
|
229
|
-
let loop = true
|
|
230
|
-
while (loop) {
|
|
231
|
-
const key = this.cacheState.accesses.poll(EmptyMutableQueue)
|
|
232
|
-
if (key === EmptyMutableQueue) {
|
|
233
|
-
loop = false
|
|
234
|
-
} else {
|
|
235
|
-
this.cacheState.keys.add(key)
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
let size = this.cacheState.map.size
|
|
239
|
-
loop = size > this.capacity
|
|
240
|
-
while (loop) {
|
|
241
|
-
const key = this.cacheState.keys.remove()
|
|
242
|
-
if (key != null) {
|
|
243
|
-
if (this.cacheState.map.remove(key.value) != null) {
|
|
244
|
-
size = size - 1
|
|
245
|
-
loop = size > this.capacity
|
|
246
|
-
}
|
|
247
|
-
} else {
|
|
248
|
-
loop = false
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
this.cacheState.updating.set(false)
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
private lookupValueOf(key: Key, deferred: Deferred<Error, Value>): Effect<never, Error, Value> {
|
|
256
|
-
return this.lookup(key)
|
|
257
|
-
.provideEnvironment(this.environment)
|
|
258
|
-
.exit
|
|
259
|
-
.flatMap(exit => {
|
|
260
|
-
const now = this.clock.currentTimeMillis().unsafeRunSync
|
|
261
|
-
const entryStats = EntryStats(now)
|
|
262
|
-
this.cacheState.map.set(
|
|
263
|
-
key,
|
|
264
|
-
new Complete(
|
|
265
|
-
new MapKey(key),
|
|
266
|
-
exit,
|
|
267
|
-
entryStats,
|
|
268
|
-
now + this.timeToLive(exit).millis
|
|
269
|
-
)
|
|
270
|
-
)
|
|
271
|
-
// TODO: later for updated Deferred handling
|
|
272
|
-
return doneDeferred(deferred)(exit).zipRight(exit.done)
|
|
273
|
-
})
|
|
274
|
-
.onInterrupt(() =>
|
|
275
|
-
deferred.interrupt.zipRight(Effect(() => {
|
|
276
|
-
this.cacheState.map.remove(key)
|
|
277
|
-
}))
|
|
278
|
-
)
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
private hasExpired(timeToLiveMillis: number): boolean {
|
|
282
|
-
return this.clock.currentTimeMillis().unsafeRunSync > timeToLiveMillis
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
/**
|
|
287
|
-
* @tsplus macro remove
|
|
288
|
-
*/
|
|
289
|
-
export function concreteCache<Key, Error, Value>(
|
|
290
|
-
_: Cache<Key, Error, Value>
|
|
291
|
-
): asserts _ is CacheInternal<Key, unknown, Error, Value> {
|
|
292
|
-
//
|
|
293
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { AtomicBoolean } from "./AtomicBoolean.js"
|
|
2
|
-
import { KeySet } from "./KeySet.js"
|
|
3
|
-
import type { MapKey } from "./MapKey.js"
|
|
4
|
-
import type { MapValue } from "./MapValue.js"
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* The `CacheState` represents the mutable state underlying the cache.
|
|
8
|
-
*
|
|
9
|
-
* @tsplus type effect/cache/Cache/CacheState
|
|
10
|
-
*/
|
|
11
|
-
export interface CacheState<Key, Error, Value> {
|
|
12
|
-
map: MutableHashMap<Key, MapValue<Key, Error, Value>>
|
|
13
|
-
keys: KeySet<Key>
|
|
14
|
-
accesses: MutableQueue<MapKey<Key>>
|
|
15
|
-
updating: AtomicBoolean
|
|
16
|
-
hits: number
|
|
17
|
-
misses: number
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* @tsplus type effect/cache/Cache/CacheState.Ops
|
|
22
|
-
*/
|
|
23
|
-
export interface CacheStateOps {
|
|
24
|
-
<Key, Error, Value>(
|
|
25
|
-
map: MutableHashMap<Key, MapValue<Key, Error, Value>>,
|
|
26
|
-
keys: KeySet<Key>,
|
|
27
|
-
accesses: MutableQueue<MapKey<Key>>,
|
|
28
|
-
updating: AtomicBoolean,
|
|
29
|
-
hits: number,
|
|
30
|
-
misses: number
|
|
31
|
-
): CacheState<Key, Error, Value>
|
|
32
|
-
}
|
|
33
|
-
export const CacheState: CacheStateOps = (map, keys, accesses, updating, hits, misses) => ({
|
|
34
|
-
map,
|
|
35
|
-
keys,
|
|
36
|
-
accesses,
|
|
37
|
-
updating,
|
|
38
|
-
hits,
|
|
39
|
-
misses
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Constructs an initial cache state.
|
|
44
|
-
*
|
|
45
|
-
* @tsplus static effect/cache/Cache/CacheState.Ops initial
|
|
46
|
-
*/
|
|
47
|
-
export function initial<Key, Error, Value>(): CacheState<Key, Error, Value> {
|
|
48
|
-
return CacheState(
|
|
49
|
-
MutableHashMap.empty(),
|
|
50
|
-
new KeySet(),
|
|
51
|
-
MutableQueue.unbounded(),
|
|
52
|
-
new AtomicBoolean(false),
|
|
53
|
-
0,
|
|
54
|
-
0
|
|
55
|
-
)
|
|
56
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import type { MapKey } from "./MapKey.js"
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* A `KeySet` is a sorted set of keys in the cache ordered by last access.
|
|
5
|
-
* For efficiency, the set is implemented in terms of a doubly linked list
|
|
6
|
-
* and is not safe for concurrent access.
|
|
7
|
-
*/
|
|
8
|
-
export class KeySet<Key> {
|
|
9
|
-
head: MapKey<Key> | undefined = undefined
|
|
10
|
-
tail: MapKey<Key> | undefined = undefined
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Adds the specified key to the set.
|
|
14
|
-
*/
|
|
15
|
-
add(key: MapKey<Key>): void {
|
|
16
|
-
if (!Equals.equals(key, this.tail)) {
|
|
17
|
-
if (this.tail != null) {
|
|
18
|
-
const previous = key.previous
|
|
19
|
-
const next = key.next
|
|
20
|
-
if (next != null) {
|
|
21
|
-
key.next = undefined
|
|
22
|
-
if (previous != null) {
|
|
23
|
-
previous.next = next
|
|
24
|
-
next.previous = previous
|
|
25
|
-
} else {
|
|
26
|
-
this.head = next
|
|
27
|
-
this.head.previous = undefined
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
this.tail.next = key
|
|
31
|
-
key.previous = this.tail
|
|
32
|
-
this.tail = key
|
|
33
|
-
} else {
|
|
34
|
-
this.head = key
|
|
35
|
-
this.tail = key
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Removes the lowest priority key from the set.
|
|
42
|
-
*/
|
|
43
|
-
remove(): MapKey<Key> | undefined {
|
|
44
|
-
const key = this.head
|
|
45
|
-
if (key != null) {
|
|
46
|
-
const next = key.next
|
|
47
|
-
if (next) {
|
|
48
|
-
key.next = undefined
|
|
49
|
-
this.head = next
|
|
50
|
-
this.head.previous = undefined
|
|
51
|
-
} else {
|
|
52
|
-
this.head = undefined
|
|
53
|
-
this.tail = undefined
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return key
|
|
57
|
-
}
|
|
58
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { symbolEqual, symbolHash } from "@fp-ts/data/Equal"
|
|
2
|
-
|
|
3
|
-
export const MapKeyURI = Symbol.for("@effect/cache/Cache/MapKey")
|
|
4
|
-
export type MapKeyURI = typeof MapKeyURI
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* A `MapKey` represents a key in the cache. It contains mutable references
|
|
8
|
-
* to the previous key and next key in the `KeySet` to support an efficient
|
|
9
|
-
* implementation of a sorted set of keys.
|
|
10
|
-
*/
|
|
11
|
-
export class MapKey<Key> implements Equals {
|
|
12
|
-
readonly [MapKeyURI]: MapKeyURI = MapKeyURI
|
|
13
|
-
|
|
14
|
-
previous: MapKey<Key> | undefined = undefined
|
|
15
|
-
next: MapKey<Key> | undefined = undefined
|
|
16
|
-
|
|
17
|
-
constructor(readonly value: Key) {}
|
|
18
|
-
|
|
19
|
-
[symbolHash](): number {
|
|
20
|
-
return Equals.hashCombine(
|
|
21
|
-
Equals.hashCombine(
|
|
22
|
-
Equals.hash(this.next)
|
|
23
|
-
)(Equals.hash(this.previous))
|
|
24
|
-
)(Equals.hash(this.value))
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
[symbolEqual](that: unknown): boolean {
|
|
28
|
-
if (this === that) {
|
|
29
|
-
return true
|
|
30
|
-
}
|
|
31
|
-
return isMapKey(that) &&
|
|
32
|
-
Equals.equals(this.value, that.value) &&
|
|
33
|
-
Equals.equals(this.previous, that.previous) &&
|
|
34
|
-
Equals.equals(this.next, that.next)
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* @tsplus static effect/cache/Cache/MapKey.Ops is
|
|
40
|
-
*/
|
|
41
|
-
export function isMapKey(u: unknown): u is MapKey<unknown> {
|
|
42
|
-
return typeof u === "object" && u != null && MapKeyURI in u
|
|
43
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { EntryStats } from "../../EntryStats/definition.js"
|
|
2
|
-
import type { MapKey } from "./MapKey.js"
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* A `MapValue` represents a value in the cache. A value may either be
|
|
6
|
-
* `Pending` with a `Deferred` that will contain the result of computing the
|
|
7
|
-
* lookup function, when it is available, or `Complete` with an `Exit` value
|
|
8
|
-
* that contains the result of computing the lookup function.
|
|
9
|
-
*/
|
|
10
|
-
export type MapValue<Key, Error, Value> =
|
|
11
|
-
| Pending<Key, Error, Value>
|
|
12
|
-
| Complete<Key, Error, Value>
|
|
13
|
-
| Refreshing<Key, Error, Value>
|
|
14
|
-
|
|
15
|
-
export class Pending<Key, Error, Value> {
|
|
16
|
-
readonly _tag = "Pending"
|
|
17
|
-
constructor(
|
|
18
|
-
readonly key: MapKey<Key>,
|
|
19
|
-
readonly deferred: Deferred<Error, Value>
|
|
20
|
-
) {}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export class Complete<Key, Error, Value> {
|
|
24
|
-
readonly _tag = "Complete"
|
|
25
|
-
constructor(
|
|
26
|
-
readonly key: MapKey<Key>,
|
|
27
|
-
readonly exit: Exit<Error, Value>,
|
|
28
|
-
readonly entryStats: EntryStats,
|
|
29
|
-
readonly timeToLiveMillis: number
|
|
30
|
-
) {}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export class Refreshing<Key, Error, Value> {
|
|
34
|
-
readonly _tag = "Refreshing"
|
|
35
|
-
constructor(
|
|
36
|
-
readonly deferred: Deferred<Error, Value>,
|
|
37
|
-
readonly complete: Complete<Key, Error, Value>
|
|
38
|
-
) {}
|
|
39
|
-
}
|