@clayroach/effect 3.19.14-source-capture.6 → 3.19.14-source-capture.8
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/dist/cjs/Utils.js +1 -1
- package/dist/cjs/Utils.js.map +1 -1
- package/dist/cjs/internal/clock.js +1 -1
- package/dist/cjs/internal/clock.js.map +1 -1
- package/dist/esm/Utils.js +1 -1
- package/dist/esm/Utils.js.map +1 -1
- package/dist/esm/internal/clock.js +1 -1
- package/dist/esm/internal/clock.js.map +1 -1
- package/package.json +1 -1
- package/src/Arbitrary.ts +0 -1101
- package/src/Array.ts +0 -3589
- package/src/BigDecimal.ts +0 -1349
- package/src/BigInt.ts +0 -643
- package/src/Boolean.ts +0 -287
- package/src/Brand.ts +0 -360
- package/src/Cache.ts +0 -281
- package/src/Cause.ts +0 -1555
- package/src/Channel.ts +0 -2355
- package/src/ChildExecutorDecision.ts +0 -146
- package/src/Chunk.ts +0 -1495
- package/src/Clock.ts +0 -111
- package/src/Config.ts +0 -542
- package/src/ConfigError.ts +0 -270
- package/src/ConfigProvider.ts +0 -333
- package/src/ConfigProviderPathPatch.ts +0 -100
- package/src/Console.ts +0 -226
- package/src/Context.ts +0 -585
- package/src/Cron.ts +0 -706
- package/src/Data.ts +0 -596
- package/src/DateTime.ts +0 -1686
- package/src/DefaultServices.ts +0 -34
- package/src/Deferred.ts +0 -301
- package/src/Differ.ts +0 -450
- package/src/Duration.ts +0 -1000
- package/src/Effect.ts +0 -14839
- package/src/Effectable.ts +0 -107
- package/src/Either.ts +0 -1040
- package/src/Encoding.ts +0 -195
- package/src/Equal.ts +0 -98
- package/src/Equivalence.ts +0 -235
- package/src/ExecutionPlan.ts +0 -308
- package/src/ExecutionStrategy.ts +0 -119
- package/src/Exit.ts +0 -467
- package/src/FastCheck.ts +0 -9
- package/src/Fiber.ts +0 -744
- package/src/FiberHandle.ts +0 -540
- package/src/FiberId.ts +0 -195
- package/src/FiberMap.ts +0 -656
- package/src/FiberRef.ts +0 -431
- package/src/FiberRefs.ts +0 -204
- package/src/FiberRefsPatch.ts +0 -105
- package/src/FiberSet.ts +0 -491
- package/src/FiberStatus.ts +0 -108
- package/src/Function.ts +0 -1222
- package/src/GlobalValue.ts +0 -53
- package/src/Graph.ts +0 -3732
- package/src/GroupBy.ts +0 -103
- package/src/HKT.ts +0 -45
- package/src/Hash.ts +0 -195
- package/src/HashMap.ts +0 -519
- package/src/HashRing.ts +0 -317
- package/src/HashSet.ts +0 -2346
- package/src/Inspectable.ts +0 -287
- package/src/Iterable.ts +0 -1119
- package/src/JSONSchema.ts +0 -1044
- package/src/KeyedPool.ts +0 -167
- package/src/Layer.ts +0 -1251
- package/src/LayerMap.ts +0 -436
- package/src/List.ts +0 -977
- package/src/LogLevel.ts +0 -285
- package/src/LogSpan.ts +0 -25
- package/src/Logger.ts +0 -702
- package/src/Mailbox.ts +0 -268
- package/src/ManagedRuntime.ts +0 -180
- package/src/Match.ts +0 -1477
- package/src/MergeDecision.ts +0 -95
- package/src/MergeState.ts +0 -172
- package/src/MergeStrategy.ts +0 -107
- package/src/Metric.ts +0 -780
- package/src/MetricBoundaries.ts +0 -69
- package/src/MetricHook.ts +0 -151
- package/src/MetricKey.ts +0 -224
- package/src/MetricKeyType.ts +0 -262
- package/src/MetricLabel.ts +0 -47
- package/src/MetricPair.ts +0 -71
- package/src/MetricPolling.ts +0 -148
- package/src/MetricRegistry.ts +0 -48
- package/src/MetricState.ts +0 -257
- package/src/Micro.ts +0 -4405
- package/src/ModuleVersion.ts +0 -18
- package/src/MutableHashMap.ts +0 -411
- package/src/MutableHashSet.ts +0 -706
- package/src/MutableList.ts +0 -297
- package/src/MutableQueue.ts +0 -227
- package/src/MutableRef.ts +0 -202
- package/src/NonEmptyIterable.ts +0 -32
- package/src/Number.ts +0 -1071
- package/src/Option.ts +0 -2170
- package/src/Order.ts +0 -373
- package/src/Ordering.ts +0 -111
- package/src/ParseResult.ts +0 -2031
- package/src/PartitionedSemaphore.ts +0 -200
- package/src/Pipeable.ts +0 -566
- package/src/Pool.ts +0 -204
- package/src/Predicate.ts +0 -1405
- package/src/Pretty.ts +0 -205
- package/src/PrimaryKey.ts +0 -23
- package/src/PubSub.ts +0 -182
- package/src/Queue.ts +0 -644
- package/src/Random.ts +0 -204
- package/src/RateLimiter.ts +0 -138
- package/src/RcMap.ts +0 -141
- package/src/RcRef.ts +0 -122
- package/src/Readable.ts +0 -93
- package/src/Record.ts +0 -1274
- package/src/RedBlackTree.ts +0 -421
- package/src/Redacted.ts +0 -144
- package/src/Ref.ts +0 -180
- package/src/RegExp.ts +0 -38
- package/src/Reloadable.ts +0 -127
- package/src/Request.ts +0 -347
- package/src/RequestBlock.ts +0 -118
- package/src/RequestResolver.ts +0 -366
- package/src/Resource.ts +0 -119
- package/src/Runtime.ts +0 -383
- package/src/RuntimeFlags.ts +0 -368
- package/src/RuntimeFlagsPatch.ts +0 -183
- package/src/STM.ts +0 -2045
- package/src/Schedule.ts +0 -2219
- package/src/ScheduleDecision.ts +0 -62
- package/src/ScheduleInterval.ts +0 -151
- package/src/ScheduleIntervals.ts +0 -122
- package/src/Scheduler.ts +0 -353
- package/src/Schema.ts +0 -10914
- package/src/SchemaAST.ts +0 -3043
- package/src/Scope.ts +0 -204
- package/src/ScopedCache.ts +0 -151
- package/src/ScopedRef.ts +0 -117
- package/src/Secret.ts +0 -88
- package/src/SingleProducerAsyncInput.ts +0 -67
- package/src/Sink.ts +0 -1461
- package/src/SortedMap.ts +0 -287
- package/src/SortedSet.ts +0 -390
- package/src/Stream.ts +0 -6468
- package/src/StreamEmit.ts +0 -136
- package/src/StreamHaltStrategy.ts +0 -123
- package/src/Streamable.ts +0 -45
- package/src/String.ts +0 -778
- package/src/Struct.ts +0 -243
- package/src/Subscribable.ts +0 -100
- package/src/SubscriptionRef.ts +0 -298
- package/src/Supervisor.ts +0 -240
- package/src/Symbol.ts +0 -29
- package/src/SynchronizedRef.ts +0 -270
- package/src/TArray.ts +0 -495
- package/src/TDeferred.ts +0 -100
- package/src/TMap.ts +0 -515
- package/src/TPriorityQueue.ts +0 -223
- package/src/TPubSub.ts +0 -200
- package/src/TQueue.ts +0 -432
- package/src/TRandom.ts +0 -129
- package/src/TReentrantLock.ts +0 -224
- package/src/TRef.ts +0 -178
- package/src/TSemaphore.ts +0 -129
- package/src/TSet.ts +0 -365
- package/src/TSubscriptionRef.ts +0 -192
- package/src/Take.ts +0 -258
- package/src/TestAnnotation.ts +0 -158
- package/src/TestAnnotationMap.ts +0 -119
- package/src/TestAnnotations.ts +0 -117
- package/src/TestClock.ts +0 -556
- package/src/TestConfig.ts +0 -47
- package/src/TestContext.ts +0 -36
- package/src/TestLive.ts +0 -53
- package/src/TestServices.ts +0 -390
- package/src/TestSized.ts +0 -55
- package/src/Tracer.ts +0 -198
- package/src/Trie.ts +0 -840
- package/src/Tuple.ts +0 -305
- package/src/Types.ts +0 -353
- package/src/Unify.ts +0 -113
- package/src/UpstreamPullRequest.ts +0 -117
- package/src/UpstreamPullStrategy.ts +0 -121
- package/src/Utils.ts +0 -809
- package/src/index.ts +0 -1561
- package/src/internal/array.ts +0 -8
- package/src/internal/blockedRequests.ts +0 -520
- package/src/internal/cache.ts +0 -733
- package/src/internal/cause.ts +0 -1050
- package/src/internal/channel/channelExecutor.ts +0 -1200
- package/src/internal/channel/channelState.ts +0 -134
- package/src/internal/channel/childExecutorDecision.ts +0 -96
- package/src/internal/channel/continuation.ts +0 -200
- package/src/internal/channel/mergeDecision.ts +0 -113
- package/src/internal/channel/mergeState.ts +0 -120
- package/src/internal/channel/mergeStrategy.ts +0 -72
- package/src/internal/channel/singleProducerAsyncInput.ts +0 -259
- package/src/internal/channel/subexecutor.ts +0 -229
- package/src/internal/channel/upstreamPullRequest.ts +0 -84
- package/src/internal/channel/upstreamPullStrategy.ts +0 -87
- package/src/internal/channel.ts +0 -2603
- package/src/internal/clock.ts +0 -95
- package/src/internal/completedRequestMap.ts +0 -9
- package/src/internal/concurrency.ts +0 -54
- package/src/internal/config.ts +0 -716
- package/src/internal/configError.ts +0 -304
- package/src/internal/configProvider/pathPatch.ts +0 -97
- package/src/internal/configProvider.ts +0 -799
- package/src/internal/console.ts +0 -153
- package/src/internal/context.ts +0 -337
- package/src/internal/core-effect.ts +0 -2293
- package/src/internal/core-stream.ts +0 -998
- package/src/internal/core.ts +0 -3273
- package/src/internal/data.ts +0 -36
- package/src/internal/dataSource.ts +0 -327
- package/src/internal/dateTime.ts +0 -1277
- package/src/internal/defaultServices/console.ts +0 -100
- package/src/internal/defaultServices.ts +0 -163
- package/src/internal/deferred.ts +0 -46
- package/src/internal/differ/chunkPatch.ts +0 -211
- package/src/internal/differ/contextPatch.ts +0 -232
- package/src/internal/differ/hashMapPatch.ts +0 -220
- package/src/internal/differ/hashSetPatch.ts +0 -176
- package/src/internal/differ/orPatch.ts +0 -311
- package/src/internal/differ/readonlyArrayPatch.ts +0 -210
- package/src/internal/differ.ts +0 -200
- package/src/internal/doNotation.ts +0 -80
- package/src/internal/effect/circular.ts +0 -905
- package/src/internal/effectable.ts +0 -131
- package/src/internal/either.ts +0 -110
- package/src/internal/encoding/base64.ts +0 -286
- package/src/internal/encoding/base64Url.ts +0 -29
- package/src/internal/encoding/common.ts +0 -51
- package/src/internal/encoding/hex.ts +0 -315
- package/src/internal/errors.ts +0 -7
- package/src/internal/executionPlan.ts +0 -114
- package/src/internal/executionStrategy.ts +0 -74
- package/src/internal/fiber.ts +0 -388
- package/src/internal/fiberId.ts +0 -267
- package/src/internal/fiberMessage.ts +0 -82
- package/src/internal/fiberRefs/patch.ts +0 -144
- package/src/internal/fiberRefs.ts +0 -297
- package/src/internal/fiberRuntime.ts +0 -3915
- package/src/internal/fiberScope.ts +0 -71
- package/src/internal/fiberStatus.ts +0 -119
- package/src/internal/groupBy.ts +0 -530
- package/src/internal/hashMap/array.ts +0 -49
- package/src/internal/hashMap/bitwise.ts +0 -32
- package/src/internal/hashMap/config.ts +0 -14
- package/src/internal/hashMap/keySet.ts +0 -8
- package/src/internal/hashMap/node.ts +0 -391
- package/src/internal/hashMap.ts +0 -586
- package/src/internal/hashSet.ts +0 -323
- package/src/internal/keyedPool.ts +0 -244
- package/src/internal/layer/circular.ts +0 -228
- package/src/internal/layer.ts +0 -1487
- package/src/internal/logSpan.ts +0 -20
- package/src/internal/logger-circular.ts +0 -24
- package/src/internal/logger.ts +0 -485
- package/src/internal/mailbox.ts +0 -561
- package/src/internal/managedRuntime/circular.ts +0 -6
- package/src/internal/managedRuntime.ts +0 -134
- package/src/internal/matcher.ts +0 -652
- package/src/internal/metric/boundaries.ts +0 -75
- package/src/internal/metric/hook.ts +0 -483
- package/src/internal/metric/key.ts +0 -167
- package/src/internal/metric/keyType.ts +0 -238
- package/src/internal/metric/label.ts +0 -41
- package/src/internal/metric/pair.ts +0 -48
- package/src/internal/metric/polling.ts +0 -149
- package/src/internal/metric/registry.ts +0 -187
- package/src/internal/metric/state.ts +0 -290
- package/src/internal/metric.ts +0 -577
- package/src/internal/opCodes/cause.ts +0 -35
- package/src/internal/opCodes/channel.ts +0 -83
- package/src/internal/opCodes/channelChildExecutorDecision.ts +0 -17
- package/src/internal/opCodes/channelMergeDecision.ts +0 -11
- package/src/internal/opCodes/channelMergeState.ts +0 -17
- package/src/internal/opCodes/channelMergeStrategy.ts +0 -11
- package/src/internal/opCodes/channelState.ts +0 -23
- package/src/internal/opCodes/channelUpstreamPullRequest.ts +0 -11
- package/src/internal/opCodes/channelUpstreamPullStrategy.ts +0 -11
- package/src/internal/opCodes/config.ts +0 -65
- package/src/internal/opCodes/configError.ts +0 -35
- package/src/internal/opCodes/continuation.ts +0 -11
- package/src/internal/opCodes/deferred.ts +0 -11
- package/src/internal/opCodes/effect.ts +0 -89
- package/src/internal/opCodes/layer.ts +0 -59
- package/src/internal/opCodes/streamHaltStrategy.ts +0 -23
- package/src/internal/option.ts +0 -80
- package/src/internal/pool.ts +0 -432
- package/src/internal/pubsub.ts +0 -1762
- package/src/internal/query.ts +0 -204
- package/src/internal/queue.ts +0 -766
- package/src/internal/random.ts +0 -161
- package/src/internal/rateLimiter.ts +0 -93
- package/src/internal/rcMap.ts +0 -285
- package/src/internal/rcRef.ts +0 -192
- package/src/internal/redBlackTree/iterator.ts +0 -200
- package/src/internal/redBlackTree/node.ts +0 -68
- package/src/internal/redBlackTree.ts +0 -1245
- package/src/internal/redacted.ts +0 -73
- package/src/internal/ref.ts +0 -171
- package/src/internal/reloadable.ts +0 -140
- package/src/internal/request.ts +0 -177
- package/src/internal/resource.ts +0 -76
- package/src/internal/ringBuffer.ts +0 -68
- package/src/internal/runtime.ts +0 -558
- package/src/internal/runtimeFlags.ts +0 -188
- package/src/internal/runtimeFlagsPatch.ts +0 -103
- package/src/internal/schedule/decision.ts +0 -47
- package/src/internal/schedule/interval.ts +0 -101
- package/src/internal/schedule/intervals.ts +0 -180
- package/src/internal/schedule.ts +0 -2199
- package/src/internal/schema/errors.ts +0 -191
- package/src/internal/schema/schemaId.ts +0 -106
- package/src/internal/schema/util.ts +0 -50
- package/src/internal/scopedCache.ts +0 -644
- package/src/internal/scopedRef.ts +0 -118
- package/src/internal/secret.ts +0 -89
- package/src/internal/singleShotGen.ts +0 -35
- package/src/internal/sink.ts +0 -2120
- package/src/internal/stack.ts +0 -10
- package/src/internal/stm/core.ts +0 -817
- package/src/internal/stm/entry.ts +0 -59
- package/src/internal/stm/journal.ts +0 -123
- package/src/internal/stm/opCodes/stm.ts +0 -71
- package/src/internal/stm/opCodes/stmState.ts +0 -17
- package/src/internal/stm/opCodes/strategy.ts +0 -17
- package/src/internal/stm/opCodes/tExit.ts +0 -29
- package/src/internal/stm/opCodes/tryCommit.ts +0 -11
- package/src/internal/stm/stm.ts +0 -1453
- package/src/internal/stm/stmState.ts +0 -136
- package/src/internal/stm/tArray.ts +0 -550
- package/src/internal/stm/tDeferred.ts +0 -81
- package/src/internal/stm/tExit.ts +0 -190
- package/src/internal/stm/tMap.ts +0 -824
- package/src/internal/stm/tPriorityQueue.ts +0 -267
- package/src/internal/stm/tPubSub.ts +0 -551
- package/src/internal/stm/tQueue.ts +0 -393
- package/src/internal/stm/tRandom.ts +0 -140
- package/src/internal/stm/tReentrantLock.ts +0 -352
- package/src/internal/stm/tRef.ts +0 -195
- package/src/internal/stm/tSemaphore.ts +0 -113
- package/src/internal/stm/tSet.ts +0 -259
- package/src/internal/stm/tSubscriptionRef.ts +0 -286
- package/src/internal/stm/tryCommit.ts +0 -34
- package/src/internal/stm/txnId.ts +0 -14
- package/src/internal/stm/versioned.ts +0 -4
- package/src/internal/stream/debounceState.ts +0 -57
- package/src/internal/stream/emit.ts +0 -123
- package/src/internal/stream/haltStrategy.ts +0 -94
- package/src/internal/stream/handoff.ts +0 -187
- package/src/internal/stream/handoffSignal.ts +0 -59
- package/src/internal/stream/pull.ts +0 -34
- package/src/internal/stream/sinkEndReason.ts +0 -30
- package/src/internal/stream/zipAllState.ts +0 -88
- package/src/internal/stream/zipChunksState.ts +0 -56
- package/src/internal/stream.ts +0 -8801
- package/src/internal/string-utils.ts +0 -107
- package/src/internal/subscriptionRef.ts +0 -138
- package/src/internal/supervisor/patch.ts +0 -190
- package/src/internal/supervisor.ts +0 -303
- package/src/internal/synchronizedRef.ts +0 -114
- package/src/internal/take.ts +0 -199
- package/src/internal/testing/sleep.ts +0 -27
- package/src/internal/testing/suspendedWarningData.ts +0 -85
- package/src/internal/testing/warningData.ts +0 -94
- package/src/internal/tracer.ts +0 -293
- package/src/internal/trie.ts +0 -722
- package/src/internal/version.ts +0 -7
package/src/HashRing.ts
DELETED
|
@@ -1,317 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @since 3.19.0
|
|
3
|
-
* @experimental
|
|
4
|
-
*/
|
|
5
|
-
import { dual } from "./Function.js"
|
|
6
|
-
import * as Hash from "./Hash.js"
|
|
7
|
-
import * as Inspectable from "./Inspectable.js"
|
|
8
|
-
import * as Iterable from "./Iterable.js"
|
|
9
|
-
import { type Pipeable, pipeArguments } from "./Pipeable.js"
|
|
10
|
-
import { hasProperty } from "./Predicate.js"
|
|
11
|
-
import * as PrimaryKey from "./PrimaryKey.js"
|
|
12
|
-
|
|
13
|
-
const TypeId = "~effect/cluster/HashRing" as const
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* @since 3.19.0
|
|
17
|
-
* @category Models
|
|
18
|
-
* @experimental
|
|
19
|
-
*/
|
|
20
|
-
export interface HashRing<A extends PrimaryKey.PrimaryKey> extends Pipeable, Iterable<A> {
|
|
21
|
-
readonly [TypeId]: typeof TypeId
|
|
22
|
-
readonly baseWeight: number
|
|
23
|
-
totalWeightCache: number
|
|
24
|
-
readonly nodes: Map<string, [node: A, weight: number]>
|
|
25
|
-
ring: Array<[hash: number, node: string]>
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* @since 3.19.0
|
|
30
|
-
* @category Guards
|
|
31
|
-
* @experimental
|
|
32
|
-
*/
|
|
33
|
-
export const isHashRing = (u: unknown): u is HashRing<any> => hasProperty(u, TypeId)
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* @since 3.19.0
|
|
37
|
-
* @category Constructors
|
|
38
|
-
* @experimental
|
|
39
|
-
*/
|
|
40
|
-
export const make = <A extends PrimaryKey.PrimaryKey>(options?: {
|
|
41
|
-
readonly baseWeight?: number | undefined
|
|
42
|
-
}): HashRing<A> => {
|
|
43
|
-
const self = Object.create(Proto)
|
|
44
|
-
self.baseWeight = Math.max(options?.baseWeight ?? 128, 1)
|
|
45
|
-
self.totalWeightCache = 0
|
|
46
|
-
self.nodes = new Map()
|
|
47
|
-
self.ring = []
|
|
48
|
-
return self
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const Proto = {
|
|
52
|
-
[TypeId]: TypeId,
|
|
53
|
-
[Symbol.iterator]<A extends PrimaryKey.PrimaryKey>(this: HashRing<A>): Iterator<A> {
|
|
54
|
-
return Iterable.map(this.nodes.values(), ([n]) => n)[Symbol.iterator]()
|
|
55
|
-
},
|
|
56
|
-
pipe() {
|
|
57
|
-
return pipeArguments(this, arguments)
|
|
58
|
-
},
|
|
59
|
-
...Inspectable.BaseProto,
|
|
60
|
-
toJSON(this: HashRing<any>) {
|
|
61
|
-
return {
|
|
62
|
-
_id: "HashRing",
|
|
63
|
-
baseWeight: this.baseWeight,
|
|
64
|
-
nodes: this.ring.map(([, n]) => this.nodes.get(n)![0])
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Add new nodes to the ring. If a node already exists in the ring, it
|
|
71
|
-
* will be updated. For example, you can use this to update the node's weight.
|
|
72
|
-
*
|
|
73
|
-
* @since 3.19.0
|
|
74
|
-
* @category Combinators
|
|
75
|
-
* @experimental
|
|
76
|
-
*/
|
|
77
|
-
export const addMany: {
|
|
78
|
-
<A extends PrimaryKey.PrimaryKey>(nodes: Iterable<A>, options?: {
|
|
79
|
-
readonly weight?: number | undefined
|
|
80
|
-
}): (self: HashRing<A>) => HashRing<A>
|
|
81
|
-
<A extends PrimaryKey.PrimaryKey>(self: HashRing<A>, nodes: Iterable<A>, options?: {
|
|
82
|
-
readonly weight?: number | undefined
|
|
83
|
-
}): HashRing<A>
|
|
84
|
-
} = dual(
|
|
85
|
-
(args) => isHashRing(args[0]),
|
|
86
|
-
<A extends PrimaryKey.PrimaryKey>(self: HashRing<A>, nodes: Iterable<A>, options?: {
|
|
87
|
-
readonly weight?: number | undefined
|
|
88
|
-
}): HashRing<A> => {
|
|
89
|
-
const weight = Math.max(options?.weight ?? 1, 0.1)
|
|
90
|
-
const keys: Array<string> = []
|
|
91
|
-
let toRemove: Set<string> | undefined
|
|
92
|
-
for (const node of nodes) {
|
|
93
|
-
const key = PrimaryKey.value(node)
|
|
94
|
-
const entry = self.nodes.get(key)
|
|
95
|
-
if (entry) {
|
|
96
|
-
if (entry[1] === weight) continue
|
|
97
|
-
toRemove ??= new Set()
|
|
98
|
-
toRemove.add(key)
|
|
99
|
-
self.totalWeightCache -= entry[1]
|
|
100
|
-
self.totalWeightCache += weight
|
|
101
|
-
entry[1] = weight
|
|
102
|
-
} else {
|
|
103
|
-
self.nodes.set(key, [node, weight])
|
|
104
|
-
self.totalWeightCache += weight
|
|
105
|
-
}
|
|
106
|
-
keys.push(key)
|
|
107
|
-
}
|
|
108
|
-
if (toRemove) {
|
|
109
|
-
self.ring = self.ring.filter(([, n]) => !toRemove.has(n))
|
|
110
|
-
}
|
|
111
|
-
addNodesToRing(self, keys, Math.round(weight * self.baseWeight))
|
|
112
|
-
return self
|
|
113
|
-
}
|
|
114
|
-
)
|
|
115
|
-
|
|
116
|
-
function addNodesToRing<A extends PrimaryKey.PrimaryKey>(self: HashRing<A>, keys: Array<string>, weight: number) {
|
|
117
|
-
for (let i = weight; i > 0; i--) {
|
|
118
|
-
for (let j = 0; j < keys.length; j++) {
|
|
119
|
-
const key = keys[j]
|
|
120
|
-
self.ring.push([
|
|
121
|
-
Hash.string(`${key}:${i}`),
|
|
122
|
-
key
|
|
123
|
-
])
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
self.ring.sort((a, b) => a[0] - b[0])
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Add a new node to the ring. If the node already exists in the ring, it
|
|
131
|
-
* will be updated. For example, you can use this to update the node's weight.
|
|
132
|
-
*
|
|
133
|
-
* @since 3.19.0
|
|
134
|
-
* @category Combinators
|
|
135
|
-
* @experimental
|
|
136
|
-
*/
|
|
137
|
-
export const add: {
|
|
138
|
-
<A extends PrimaryKey.PrimaryKey>(node: A, options?: {
|
|
139
|
-
readonly weight?: number | undefined
|
|
140
|
-
}): (self: HashRing<A>) => HashRing<A>
|
|
141
|
-
<A extends PrimaryKey.PrimaryKey>(self: HashRing<A>, node: A, options?: {
|
|
142
|
-
readonly weight?: number | undefined
|
|
143
|
-
}): HashRing<A>
|
|
144
|
-
} = dual((args) => isHashRing(args[0]), <A extends PrimaryKey.PrimaryKey>(self: HashRing<A>, node: A, options?: {
|
|
145
|
-
readonly weight?: number | undefined
|
|
146
|
-
}): HashRing<A> => addMany(self, [node], options))
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Removes the node from the ring. No-op's if the node does not exist.
|
|
150
|
-
*
|
|
151
|
-
* @since 3.19.0
|
|
152
|
-
* @category Combinators
|
|
153
|
-
* @experimental
|
|
154
|
-
*/
|
|
155
|
-
export const remove: {
|
|
156
|
-
<A extends PrimaryKey.PrimaryKey>(node: A): (self: HashRing<A>) => HashRing<A>
|
|
157
|
-
<A extends PrimaryKey.PrimaryKey>(self: HashRing<A>, node: A): HashRing<A>
|
|
158
|
-
} = dual(2, <A extends PrimaryKey.PrimaryKey>(self: HashRing<A>, node: A): HashRing<A> => {
|
|
159
|
-
const key = PrimaryKey.value(node)
|
|
160
|
-
const entry = self.nodes.get(key)
|
|
161
|
-
if (entry) {
|
|
162
|
-
self.nodes.delete(key)
|
|
163
|
-
self.ring = self.ring.filter(([, n]) => n !== key)
|
|
164
|
-
self.totalWeightCache -= entry[1]
|
|
165
|
-
}
|
|
166
|
-
return self
|
|
167
|
-
})
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* @since 3.19.0
|
|
171
|
-
* @category Combinators
|
|
172
|
-
* @experimental
|
|
173
|
-
*/
|
|
174
|
-
export const has: {
|
|
175
|
-
<A extends PrimaryKey.PrimaryKey>(node: A): (self: HashRing<A>) => boolean
|
|
176
|
-
<A extends PrimaryKey.PrimaryKey>(self: HashRing<A>, node: A): boolean
|
|
177
|
-
} = dual(
|
|
178
|
-
2,
|
|
179
|
-
<A extends PrimaryKey.PrimaryKey>(self: HashRing<A>, node: A): boolean => self.nodes.has(PrimaryKey.value(node))
|
|
180
|
-
)
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Gets the node which should handle the given input. Returns undefined if
|
|
184
|
-
* the hashring has no elements with weight.
|
|
185
|
-
*
|
|
186
|
-
* @since 3.19.0
|
|
187
|
-
* @category Combinators
|
|
188
|
-
* @experimental
|
|
189
|
-
*/
|
|
190
|
-
export const get = <A extends PrimaryKey.PrimaryKey>(self: HashRing<A>, input: string): A | undefined => {
|
|
191
|
-
if (self.ring.length === 0) {
|
|
192
|
-
return undefined
|
|
193
|
-
}
|
|
194
|
-
const index = getIndexForInput(self, Hash.string(input))[0]
|
|
195
|
-
const node = self.ring[index][1]!
|
|
196
|
-
return self.nodes.get(node)![0]
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Distributes `count` shards across the nodes in the ring, attempting to
|
|
201
|
-
* balance the number of shards allocated to each node. Returns undefined if
|
|
202
|
-
* the hashring has no elements with weight.
|
|
203
|
-
*
|
|
204
|
-
* @since 3.19.0
|
|
205
|
-
* @category Combinators
|
|
206
|
-
* @experimental
|
|
207
|
-
*/
|
|
208
|
-
export const getShards = <A extends PrimaryKey.PrimaryKey>(self: HashRing<A>, count: number): Array<A> | undefined => {
|
|
209
|
-
if (self.ring.length === 0) {
|
|
210
|
-
return undefined
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
const shards = new Array<A>(count)
|
|
214
|
-
|
|
215
|
-
// for tracking how many shards have been allocated to each node
|
|
216
|
-
const allocations = new Map<string, number>()
|
|
217
|
-
// for tracking which shards still need to be allocated
|
|
218
|
-
const remaining = new Set<number>()
|
|
219
|
-
// for tracking which nodes have reached the max allocation
|
|
220
|
-
const exclude = new Set<string>()
|
|
221
|
-
|
|
222
|
-
// First pass - allocate the closest nodes, skipping nodes that have reached
|
|
223
|
-
// max
|
|
224
|
-
const distances = new Array<[shard: number, node: string, distance: number]>(count)
|
|
225
|
-
for (let shard = 0; shard < count; shard++) {
|
|
226
|
-
const hash = (shardHashes[shard] ??= Hash.string(`shard-${shard}`))
|
|
227
|
-
const [index, distance] = getIndexForInput(self, hash)
|
|
228
|
-
const node = self.ring[index][1]!
|
|
229
|
-
distances[shard] = [shard, node, distance]
|
|
230
|
-
remaining.add(shard)
|
|
231
|
-
}
|
|
232
|
-
distances.sort((a, b) => a[2] - b[2])
|
|
233
|
-
for (let i = 0; i < count; i++) {
|
|
234
|
-
const [shard, node] = distances[i]
|
|
235
|
-
if (exclude.has(node)) continue
|
|
236
|
-
const [value, weight] = self.nodes.get(node)!
|
|
237
|
-
shards[shard] = value
|
|
238
|
-
remaining.delete(shard)
|
|
239
|
-
const nodeCount = (allocations.get(node) ?? 0) + 1
|
|
240
|
-
allocations.set(node, nodeCount)
|
|
241
|
-
const maxPerNode = Math.max(1, Math.floor(count * (weight / self.totalWeightCache)))
|
|
242
|
-
if (nodeCount >= maxPerNode) {
|
|
243
|
-
exclude.add(node)
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// Second pass - allocate any remaining shards, skipping nodes that have
|
|
248
|
-
// reached max
|
|
249
|
-
let allAtMax = exclude.size === self.nodes.size
|
|
250
|
-
remaining.forEach((shard) => {
|
|
251
|
-
const index = getIndexForInput(self, shardHashes[shard], allAtMax ? undefined : exclude)[0]
|
|
252
|
-
const node = self.ring[index][1]
|
|
253
|
-
const [value, weight] = self.nodes.get(node)!
|
|
254
|
-
shards[shard] = value
|
|
255
|
-
|
|
256
|
-
if (allAtMax) return
|
|
257
|
-
const nodeCount = (allocations.get(node) ?? 0) + 1
|
|
258
|
-
allocations.set(node, nodeCount)
|
|
259
|
-
const maxPerNode = Math.max(1, Math.floor(count * (weight / self.totalWeightCache)))
|
|
260
|
-
if (nodeCount >= maxPerNode) {
|
|
261
|
-
exclude.add(node)
|
|
262
|
-
if (exclude.size === self.nodes.size) {
|
|
263
|
-
allAtMax = true
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
})
|
|
267
|
-
|
|
268
|
-
return shards
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
const shardHashes: Array<number> = []
|
|
272
|
-
|
|
273
|
-
function getIndexForInput<A extends PrimaryKey.PrimaryKey>(
|
|
274
|
-
self: HashRing<A>,
|
|
275
|
-
hash: number,
|
|
276
|
-
exclude?: ReadonlySet<string> | undefined
|
|
277
|
-
): readonly [index: number, distance: number] {
|
|
278
|
-
const ring = self.ring
|
|
279
|
-
const len = ring.length
|
|
280
|
-
|
|
281
|
-
let mid: number
|
|
282
|
-
let lo = 0
|
|
283
|
-
let hi = len - 1
|
|
284
|
-
|
|
285
|
-
while (lo <= hi) {
|
|
286
|
-
mid = ((lo + hi) / 2) >>> 0
|
|
287
|
-
if (ring[mid][0] >= hash) {
|
|
288
|
-
hi = mid - 1
|
|
289
|
-
} else {
|
|
290
|
-
lo = mid + 1
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
const a = lo === len ? lo - 1 : lo
|
|
294
|
-
const distA = Math.abs(ring[a][0] - hash)
|
|
295
|
-
if (exclude === undefined) {
|
|
296
|
-
const b = lo - 1
|
|
297
|
-
if (b < 0) {
|
|
298
|
-
return [a, distA]
|
|
299
|
-
}
|
|
300
|
-
const distB = Math.abs(ring[b][0] - hash)
|
|
301
|
-
return distA <= distB ? [a, distA] : [b, distB]
|
|
302
|
-
} else if (!exclude.has(ring[a][1])) {
|
|
303
|
-
return [a, distA]
|
|
304
|
-
}
|
|
305
|
-
const range = Math.max(lo, len - lo)
|
|
306
|
-
for (let i = 1; i < range; i++) {
|
|
307
|
-
let index = lo - i
|
|
308
|
-
if (index >= 0 && index < len && !exclude.has(ring[index][1])) {
|
|
309
|
-
return [index, Math.abs(ring[index][0] - hash)]
|
|
310
|
-
}
|
|
311
|
-
index = lo + i
|
|
312
|
-
if (index >= 0 && index < len && !exclude.has(ring[index][1])) {
|
|
313
|
-
return [index, Math.abs(ring[index][0] - hash)]
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
return [a, distA]
|
|
317
|
-
}
|