@effect/cluster 0.38.1 → 0.38.3
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/EntityProxy/package.json +6 -0
- package/EntityProxyServer/package.json +6 -0
- package/dist/cjs/ClusterWorkflowEngine.js +34 -66
- package/dist/cjs/ClusterWorkflowEngine.js.map +1 -1
- package/dist/cjs/EntityProxy.js +126 -0
- package/dist/cjs/EntityProxy.js.map +1 -0
- package/dist/cjs/EntityProxyServer.js +54 -0
- package/dist/cjs/EntityProxyServer.js.map +1 -0
- package/dist/cjs/ShardingConfig.js +1 -1
- package/dist/cjs/ShardingConfig.js.map +1 -1
- package/dist/cjs/index.js +5 -1
- package/dist/dts/ClusterWorkflowEngine.d.ts +0 -1
- package/dist/dts/ClusterWorkflowEngine.d.ts.map +1 -1
- package/dist/dts/EntityProxy.d.ts +93 -0
- package/dist/dts/EntityProxy.d.ts.map +1 -0
- package/dist/dts/EntityProxyServer.d.ts +26 -0
- package/dist/dts/EntityProxyServer.d.ts.map +1 -0
- package/dist/dts/ShardingConfig.d.ts.map +1 -1
- package/dist/dts/index.d.ts +8 -0
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/esm/ClusterWorkflowEngine.js +34 -66
- package/dist/esm/ClusterWorkflowEngine.js.map +1 -1
- package/dist/esm/EntityProxy.js +116 -0
- package/dist/esm/EntityProxy.js.map +1 -0
- package/dist/esm/EntityProxyServer.js +45 -0
- package/dist/esm/EntityProxyServer.js.map +1 -0
- package/dist/esm/ShardingConfig.js +1 -1
- package/dist/esm/ShardingConfig.js.map +1 -1
- package/dist/esm/index.js +8 -0
- package/dist/esm/index.js.map +1 -1
- package/package.json +21 -5
- package/src/ClusterWorkflowEngine.ts +54 -89
- package/src/EntityProxy.ts +193 -0
- package/src/EntityProxyServer.ts +86 -0
- package/src/ShardingConfig.ts +0 -1
- package/src/index.ts +10 -0
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ShardingConfig.js","names":["Config","ConfigProvider","Context","Duration","Effect","Layer","Option","RunnerAddress","ShardingConfig","Tag","defaultRunnerAddress","make","host","port","defaults","runnerAddress","some","runnerListenAddress","none","serverVersion","shardsPerGroup","shardManagerAddress","shardManagerUnavailableTimeout","minutes","shardGroups","entityMailboxCapacity","entityMaxIdleTime","entityTerminationTimeout","seconds","entityMessagePollInterval","entityReplyPollInterval","millis","sendRetryInterval","refreshAssignmentsInterval","simulateRemoteSerialization","layer","options","succeed","layerDefaults","config","all","string","pipe","withDefault","withDescription","integer","map","option","array","duration","boolean","configFromEnv","withConfigProvider","fromEnv","constantCase","layerFromEnv","effect"],"sources":["../../src/ShardingConfig.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,MAAM,MAAM,eAAe;AAEvC,OAAO,KAAKC,cAAc,MAAM,uBAAuB;AACvD,OAAO,KAAKC,OAAO,MAAM,gBAAgB;AAEzC,OAAO,KAAKC,QAAQ,MAAM,iBAAiB;AAC3C,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,SAASC,aAAa,QAAQ,oBAAoB;AAElD;;;;;;AAMA,OAAM,MAAOC,cAAe,sBAAQN,OAAO,CAACO,GAAG,CAAC,gCAAgC,CAAC,EA0E7E;AAEJ,MAAMC,oBAAoB,gBAAGH,aAAa,CAACI,IAAI,CAAC;EAAEC,IAAI,EAAE,WAAW;EAAEC,IAAI,EAAE;AAAK,CAAE,CAAC;AAEnF;;;;AAIA,OAAO,MAAMC,QAAQ,GAA2B;EAC9CC,aAAa,eAAET,MAAM,CAACU,IAAI,CAACN,oBAAoB,CAAC;EAChDO,mBAAmB,eAAEX,MAAM,CAACY,IAAI,EAAE;EAClCC,aAAa,EAAE,CAAC;EAChBC,cAAc,EAAE,GAAG;EACnBC,mBAAmB,eAAEd,aAAa,CAACI,IAAI,CAAC;IAAEC,IAAI,EAAE,WAAW;IAAEC,IAAI,EAAE;EAAI,CAAE,CAAC;EAC1ES,8BAA8B,eAAEnB,QAAQ,CAACoB,OAAO,CAAC,EAAE,CAAC;EACpDC,WAAW,EAAE,CAAC,SAAS,CAAC;EACxBC,qBAAqB,EAAE,IAAI;EAC3BC,iBAAiB,eAAEvB,QAAQ,CAACoB,OAAO,CAAC,CAAC,CAAC;EACtCI,wBAAwB,eAAExB,QAAQ,CAACyB,OAAO,CAAC,EAAE,CAAC;EAC9CC,yBAAyB,eAAE1B,QAAQ,CAACyB,OAAO,CAAC,EAAE,CAAC;EAC/CE,uBAAuB,eAAE3B,QAAQ,CAAC4B,MAAM,CAAC,GAAG,CAAC;EAC7CC,iBAAiB,eAAE7B,QAAQ,CAAC4B,MAAM,CAAC,GAAG,CAAC;EACvCE,0BAA0B,eAAE9B,QAAQ,CAACoB,OAAO,CAAC,CAAC,CAAC;EAC/CW,2BAA2B,EAAE;CAC9B;AAED;;;;AAIA,OAAO,MAAMC,KAAK,GAAIC,OAAyC,IAC7D/B,KAAK,CAACgC,OAAO,CAAC7B,cAAc,EAAE;EAAE,GAAGM,QAAQ;EAAE,GAAGsB;AAAO,CAAE,CAAC;AAE5D;;;;AAIA,OAAO,MAAME,aAAa,gBAAgCH,KAAK,EAAE;AAEjE;;;;AAIA,OAAO,MAAMI,MAAM,gBAA0CvC,MAAM,CAACwC,GAAG,CAAC;EACtEzB,aAAa,eAAEf,MAAM,CAACwC,GAAG,CAAC;IACxB5B,IAAI,EAAEZ,MAAM,CAACyC,MAAM,CAAC,MAAM,CAAC,CAACC,IAAI,CAC9B1C,MAAM,CAAC2C,WAAW,CAACjC,oBAAoB,CAACE,IAAI,CAAC,EAC7CZ,MAAM,CAAC4C,eAAe,CAAC,2CAA2C,CAAC,CACpE;IACD/B,IAAI,EAAEb,MAAM,CAAC6C,OAAO,CAAC,MAAM,CAAC,CAACH,IAAI,CAC/B1C,MAAM,CAAC2C,WAAW,CAACjC,oBAAoB,CAACG,IAAI,CAAC,EAC7Cb,MAAM,CAAC4C,eAAe,CAAC,+CAA+C,CAAC;GAE1E,CAAC,CAACF,IAAI,cAAC1C,MAAM,CAAC8C,GAAG,CAAEV,OAAO,IAAK7B,aAAa,CAACI,IAAI,CAACyB,OAAO,CAAC,CAAC,EAAEpC,MAAM,CAAC+C,MAAM,CAAC;EAC5E9B,mBAAmB,eAAEjB,MAAM,CAACwC,GAAG,CAAC;IAC9B5B,IAAI,EAAEZ,MAAM,CAACyC,MAAM,CAAC,YAAY,CAAC,CAACC,IAAI,CACpC1C,MAAM,
|
1
|
+
{"version":3,"file":"ShardingConfig.js","names":["Config","ConfigProvider","Context","Duration","Effect","Layer","Option","RunnerAddress","ShardingConfig","Tag","defaultRunnerAddress","make","host","port","defaults","runnerAddress","some","runnerListenAddress","none","serverVersion","shardsPerGroup","shardManagerAddress","shardManagerUnavailableTimeout","minutes","shardGroups","entityMailboxCapacity","entityMaxIdleTime","entityTerminationTimeout","seconds","entityMessagePollInterval","entityReplyPollInterval","millis","sendRetryInterval","refreshAssignmentsInterval","simulateRemoteSerialization","layer","options","succeed","layerDefaults","config","all","string","pipe","withDefault","withDescription","integer","map","option","array","duration","boolean","configFromEnv","withConfigProvider","fromEnv","constantCase","layerFromEnv","effect"],"sources":["../../src/ShardingConfig.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/dist/esm/index.js
CHANGED
@@ -34,6 +34,14 @@ export * as EntityAddress from "./EntityAddress.js";
|
|
34
34
|
* @since 1.0.0
|
35
35
|
*/
|
36
36
|
export * as EntityId from "./EntityId.js";
|
37
|
+
/**
|
38
|
+
* @since 1.0.0
|
39
|
+
*/
|
40
|
+
export * as EntityProxy from "./EntityProxy.js";
|
41
|
+
/**
|
42
|
+
* @since 1.0.0
|
43
|
+
*/
|
44
|
+
export * as EntityProxyServer from "./EntityProxyServer.js";
|
37
45
|
/**
|
38
46
|
* @since 1.0.0
|
39
47
|
*/
|
package/dist/esm/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","names":["ClusterCron","ClusterError","ClusterMetrics","ClusterSchema","ClusterWorkflowEngine","DeliverAt","Entity","EntityAddress","EntityId","EntityType","Envelope","HttpCommon","HttpRunner","HttpShardManager","MachineId","Message","MessageStorage","Reply","Runner","RunnerAddress","RunnerHealth","RunnerServer","Runners","ShardId","ShardManager","ShardStorage","Sharding","ShardingConfig","ShardingRegistrationEvent","Singleton","SingletonAddress","Snowflake","SocketRunner","SocketShardManager","SqlMessageStorage","SqlShardStorage","SynchronizedClock"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,WAAW,MAAM,kBAAkB;AAE/C;;;AAGA,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,cAAc,MAAM,qBAAqB;AAErD;;;AAGA,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AAEnD;;;AAGA,OAAO,KAAKC,qBAAqB,MAAM,4BAA4B;AAEnE;;;AAGA,OAAO,KAAKC,SAAS,MAAM,gBAAgB;AAE3C;;;AAGA,OAAO,KAAKC,MAAM,MAAM,aAAa;AAErC;;;AAGA,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AAEnD;;;AAGA,OAAO,KAAKC,QAAQ,MAAM,eAAe;AAEzC;;;AAGA,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAE7C;;;AAGA,OAAO,KAAKC,QAAQ,MAAM,eAAe;AAEzC;;;AAGA,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAE7C;;;AAGA,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAE7C;;;AAGA,OAAO,KAAKC,gBAAgB,MAAM,uBAAuB;AAEzD;;;AAGA,OAAO,KAAKC,SAAS,MAAM,gBAAgB;AAE3C;;;AAGA,OAAO,KAAKC,OAAO,MAAM,cAAc;AAEvC;;;AAGA,OAAO,KAAKC,cAAc,MAAM,qBAAqB;AAErD;;;AAGA,OAAO,KAAKC,KAAK,MAAM,YAAY;AAEnC;;;AAGA,OAAO,KAAKC,MAAM,MAAM,aAAa;AAErC;;;AAGA,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AAEnD;;;AAGA,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,OAAO,MAAM,cAAc;AAEvC;;;AAGA,OAAO,KAAKC,OAAO,MAAM,cAAc;AAEvC;;;AAGA,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,QAAQ,MAAM,eAAe;AAEzC;;;AAGA,OAAO,KAAKC,cAAc,MAAM,qBAAqB;AAErD;;;AAGA,OAAO,KAAKC,yBAAyB,MAAM,gCAAgC;AAE3E;;;AAGA,OAAO,KAAKC,SAAS,MAAM,gBAAgB;AAE3C;;;AAGA,OAAO,KAAKC,gBAAgB,MAAM,uBAAuB;AAEzD;;;AAGA,OAAO,KAAKC,SAAS,MAAM,gBAAgB;AAE3C;;;AAGA,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,kBAAkB,MAAM,yBAAyB;AAE7D;;;AAGA,OAAO,KAAKC,iBAAiB,MAAM,wBAAwB;AAE3D;;;AAGA,OAAO,KAAKC,eAAe,MAAM,sBAAsB;AAEvD;;;AAGA,OAAO,KAAKC,iBAAiB,MAAM,wBAAwB","ignoreList":[]}
|
1
|
+
{"version":3,"file":"index.js","names":["ClusterCron","ClusterError","ClusterMetrics","ClusterSchema","ClusterWorkflowEngine","DeliverAt","Entity","EntityAddress","EntityId","EntityProxy","EntityProxyServer","EntityType","Envelope","HttpCommon","HttpRunner","HttpShardManager","MachineId","Message","MessageStorage","Reply","Runner","RunnerAddress","RunnerHealth","RunnerServer","Runners","ShardId","ShardManager","ShardStorage","Sharding","ShardingConfig","ShardingRegistrationEvent","Singleton","SingletonAddress","Snowflake","SocketRunner","SocketShardManager","SqlMessageStorage","SqlShardStorage","SynchronizedClock"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,WAAW,MAAM,kBAAkB;AAE/C;;;AAGA,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,cAAc,MAAM,qBAAqB;AAErD;;;AAGA,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AAEnD;;;AAGA,OAAO,KAAKC,qBAAqB,MAAM,4BAA4B;AAEnE;;;AAGA,OAAO,KAAKC,SAAS,MAAM,gBAAgB;AAE3C;;;AAGA,OAAO,KAAKC,MAAM,MAAM,aAAa;AAErC;;;AAGA,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AAEnD;;;AAGA,OAAO,KAAKC,QAAQ,MAAM,eAAe;AAEzC;;;AAGA,OAAO,KAAKC,WAAW,MAAM,kBAAkB;AAE/C;;;AAGA,OAAO,KAAKC,iBAAiB,MAAM,wBAAwB;AAE3D;;;AAGA,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAE7C;;;AAGA,OAAO,KAAKC,QAAQ,MAAM,eAAe;AAEzC;;;AAGA,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAE7C;;;AAGA,OAAO,KAAKC,UAAU,MAAM,iBAAiB;AAE7C;;;AAGA,OAAO,KAAKC,gBAAgB,MAAM,uBAAuB;AAEzD;;;AAGA,OAAO,KAAKC,SAAS,MAAM,gBAAgB;AAE3C;;;AAGA,OAAO,KAAKC,OAAO,MAAM,cAAc;AAEvC;;;AAGA,OAAO,KAAKC,cAAc,MAAM,qBAAqB;AAErD;;;AAGA,OAAO,KAAKC,KAAK,MAAM,YAAY;AAEnC;;;AAGA,OAAO,KAAKC,MAAM,MAAM,aAAa;AAErC;;;AAGA,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AAEnD;;;AAGA,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,OAAO,MAAM,cAAc;AAEvC;;;AAGA,OAAO,KAAKC,OAAO,MAAM,cAAc;AAEvC;;;AAGA,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,QAAQ,MAAM,eAAe;AAEzC;;;AAGA,OAAO,KAAKC,cAAc,MAAM,qBAAqB;AAErD;;;AAGA,OAAO,KAAKC,yBAAyB,MAAM,gCAAgC;AAE3E;;;AAGA,OAAO,KAAKC,SAAS,MAAM,gBAAgB;AAE3C;;;AAGA,OAAO,KAAKC,gBAAgB,MAAM,uBAAuB;AAEzD;;;AAGA,OAAO,KAAKC,SAAS,MAAM,gBAAgB;AAE3C;;;AAGA,OAAO,KAAKC,YAAY,MAAM,mBAAmB;AAEjD;;;AAGA,OAAO,KAAKC,kBAAkB,MAAM,yBAAyB;AAE7D;;;AAGA,OAAO,KAAKC,iBAAiB,MAAM,wBAAwB;AAE3D;;;AAGA,OAAO,KAAKC,eAAe,MAAM,sBAAsB;AAEvD;;;AAGA,OAAO,KAAKC,iBAAiB,MAAM,wBAAwB","ignoreList":[]}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@effect/cluster",
|
3
|
-
"version": "0.38.
|
3
|
+
"version": "0.38.3",
|
4
4
|
"description": "Unified interfaces for common cluster-specific services",
|
5
5
|
"license": "MIT",
|
6
6
|
"repository": {
|
@@ -11,10 +11,10 @@
|
|
11
11
|
"sideEffects": [],
|
12
12
|
"homepage": "https://effect.website",
|
13
13
|
"peerDependencies": {
|
14
|
-
"@effect/platform": "^0.84.
|
15
|
-
"@effect/rpc": "^0.61.
|
16
|
-
"@effect/sql": "^0.37.
|
17
|
-
"@effect/workflow": "^0.1.
|
14
|
+
"@effect/platform": "^0.84.6",
|
15
|
+
"@effect/rpc": "^0.61.6",
|
16
|
+
"@effect/sql": "^0.37.7",
|
17
|
+
"@effect/workflow": "^0.1.3",
|
18
18
|
"effect": "^3.16.3"
|
19
19
|
},
|
20
20
|
"publishConfig": {
|
@@ -75,6 +75,16 @@
|
|
75
75
|
"import": "./dist/esm/EntityId.js",
|
76
76
|
"default": "./dist/cjs/EntityId.js"
|
77
77
|
},
|
78
|
+
"./EntityProxy": {
|
79
|
+
"types": "./dist/dts/EntityProxy.d.ts",
|
80
|
+
"import": "./dist/esm/EntityProxy.js",
|
81
|
+
"default": "./dist/cjs/EntityProxy.js"
|
82
|
+
},
|
83
|
+
"./EntityProxyServer": {
|
84
|
+
"types": "./dist/dts/EntityProxyServer.d.ts",
|
85
|
+
"import": "./dist/esm/EntityProxyServer.js",
|
86
|
+
"default": "./dist/cjs/EntityProxyServer.js"
|
87
|
+
},
|
78
88
|
"./EntityType": {
|
79
89
|
"types": "./dist/dts/EntityType.d.ts",
|
80
90
|
"import": "./dist/esm/EntityType.js",
|
@@ -250,6 +260,12 @@
|
|
250
260
|
"EntityId": [
|
251
261
|
"./dist/dts/EntityId.d.ts"
|
252
262
|
],
|
263
|
+
"EntityProxy": [
|
264
|
+
"./dist/dts/EntityProxy.d.ts"
|
265
|
+
],
|
266
|
+
"EntityProxyServer": [
|
267
|
+
"./dist/dts/EntityProxyServer.d.ts"
|
268
|
+
],
|
253
269
|
"EntityType": [
|
254
270
|
"./dist/dts/EntityType.d.ts"
|
255
271
|
],
|
@@ -42,6 +42,7 @@ export const make = Effect.gen(function*() {
|
|
42
42
|
string,
|
43
43
|
Entity.Entity<
|
44
44
|
| Rpc.Rpc<"run", Schema.Struct<{}>, Schema.Schema<Workflow.Result<any, any>>>
|
45
|
+
| Rpc.Rpc<"deferred", Schema.Struct<{ name: typeof Schema.String; exit: typeof ExitUnknown }>, typeof ExitUnknown>
|
45
46
|
| Rpc.Rpc<
|
46
47
|
"activity",
|
47
48
|
Schema.Struct<{ name: typeof Schema.String; attempt: typeof Schema.Number }>,
|
@@ -65,7 +66,6 @@ export const make = Effect.gen(function*() {
|
|
65
66
|
idleTimeToLive: "5 minutes"
|
66
67
|
})
|
67
68
|
const clockClient = yield* ClockEntity.client
|
68
|
-
const deferredClient = yield* DeferredEntity.client
|
69
69
|
|
70
70
|
const requestIdFor = Effect.fnUntraced(function*(options: {
|
71
71
|
readonly workflow: Workflow.Any
|
@@ -151,6 +151,22 @@ export const make = Effect.gen(function*() {
|
|
151
151
|
yield* storage.clearAddress(clockAddress)
|
152
152
|
})
|
153
153
|
|
154
|
+
const resume = Effect.fnUntraced(function*(workflow: Workflow.Any, executionId: string) {
|
155
|
+
const maybeReply = yield* requestReply({
|
156
|
+
workflow,
|
157
|
+
entityType: `Workflow/${workflow.name}`,
|
158
|
+
executionId,
|
159
|
+
tag: "run",
|
160
|
+
id: ""
|
161
|
+
})
|
162
|
+
const maybeSuspended = Option.filter(
|
163
|
+
maybeReply,
|
164
|
+
(reply) => reply.exit._tag === "Success" && reply.exit.value._tag === "Suspended"
|
165
|
+
)
|
166
|
+
if (Option.isNone(maybeSuspended)) return
|
167
|
+
yield* sharding.reset(Snowflake.Snowflake(maybeSuspended.value.requestId))
|
168
|
+
})
|
169
|
+
|
154
170
|
return WorkflowEngine.of({
|
155
171
|
register(workflow, execute) {
|
156
172
|
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
@@ -198,6 +214,7 @@ export const make = Effect.gen(function*() {
|
|
198
214
|
Effect.provideService(WorkflowInstance, instance)
|
199
215
|
) as any
|
200
216
|
},
|
217
|
+
|
201
218
|
activity: Effect.fnUntraced(function*(request: Entity.Request<any>) {
|
202
219
|
const activityId = `${executionId}/${request.payload.name}`
|
203
220
|
let entry = activities.get(activityId)
|
@@ -224,7 +241,12 @@ export const make = Effect.gen(function*() {
|
|
224
241
|
activities.delete(activityId)
|
225
242
|
}))
|
226
243
|
)
|
227
|
-
}, Rpc.fork)
|
244
|
+
}, Rpc.fork),
|
245
|
+
|
246
|
+
deferred: Effect.fnUntraced(function*(request: Entity.Request<any>) {
|
247
|
+
yield* ensureSuccess(resume(workflow, executionId))
|
248
|
+
return request.payload.exit
|
249
|
+
})
|
228
250
|
}
|
229
251
|
})
|
230
252
|
) as Effect.Effect<void>
|
@@ -240,17 +262,13 @@ export const make = Effect.gen(function*() {
|
|
240
262
|
|
241
263
|
interrupt: Effect.fnUntraced(
|
242
264
|
function*(this: WorkflowEngine["Type"], workflow, executionId) {
|
243
|
-
const
|
265
|
+
const reply = yield* requestReply({
|
244
266
|
workflow,
|
245
267
|
entityType: `Workflow/${workflow.name}`,
|
246
268
|
executionId,
|
247
269
|
tag: "run",
|
248
270
|
id: ""
|
249
271
|
})
|
250
|
-
if (Option.isNone(requestId)) {
|
251
|
-
return
|
252
|
-
}
|
253
|
-
const reply = yield* replyForRequestId(requestId.value)
|
254
272
|
const nonSuspendedReply = reply.pipe(
|
255
273
|
Option.filter((reply) => reply.exit._tag !== "Success" || reply.exit.value._tag !== "Suspended")
|
256
274
|
)
|
@@ -273,34 +291,6 @@ export const make = Effect.gen(function*() {
|
|
273
291
|
Effect.orDie
|
274
292
|
),
|
275
293
|
|
276
|
-
resume: Effect.fnUntraced(
|
277
|
-
function*(workflowName: string, executionId: string) {
|
278
|
-
const workflow = workflows.get(workflowName)
|
279
|
-
if (!workflow) {
|
280
|
-
return yield* Effect.dieMessage(`WorkflowEngine.resume: ${workflowName} not registered`)
|
281
|
-
}
|
282
|
-
const maybeReply = yield* requestReply({
|
283
|
-
workflow,
|
284
|
-
entityType: `Workflow/${workflowName}`,
|
285
|
-
executionId,
|
286
|
-
tag: "run",
|
287
|
-
id: ""
|
288
|
-
})
|
289
|
-
const maybeSuspended = Option.filter(
|
290
|
-
maybeReply,
|
291
|
-
(reply) => reply.exit._tag === "Success" && reply.exit.value._tag === "Suspended"
|
292
|
-
)
|
293
|
-
if (Option.isNone(maybeSuspended)) return
|
294
|
-
yield* sharding.reset(Snowflake.Snowflake(maybeSuspended.value.requestId))
|
295
|
-
},
|
296
|
-
Effect.retry({
|
297
|
-
while: (e) => e._tag === "PersistenceError",
|
298
|
-
times: 3,
|
299
|
-
schedule: Schedule.exponential(250)
|
300
|
-
}),
|
301
|
-
Effect.orDie
|
302
|
-
),
|
303
|
-
|
304
294
|
activityExecute: Effect.fnUntraced(function*({ activity, attempt }) {
|
305
295
|
const context = yield* Effect.context<WorkflowInstance>()
|
306
296
|
const instance = Context.get(context, WorkflowInstance)
|
@@ -335,9 +325,9 @@ export const make = Effect.gen(function*() {
|
|
335
325
|
Effect.flatMap((instance) =>
|
336
326
|
requestReply({
|
337
327
|
workflow: instance.workflow,
|
338
|
-
entityType:
|
328
|
+
entityType: `Workflow/${instance.workflow.name}`,
|
339
329
|
executionId: instance.executionId,
|
340
|
-
tag: "
|
330
|
+
tag: "deferred",
|
341
331
|
id: deferred.name
|
342
332
|
})
|
343
333
|
),
|
@@ -350,14 +340,15 @@ export const make = Effect.gen(function*() {
|
|
350
340
|
Effect.orDie
|
351
341
|
),
|
352
342
|
|
353
|
-
deferredDone({ deferred, executionId, exit, workflowName }) {
|
354
|
-
const client =
|
355
|
-
return Effect.orDie(
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
343
|
+
deferredDone: Effect.fnUntraced(function*({ deferred, executionId, exit, workflowName }) {
|
344
|
+
const client = yield* RcMap.get(clients, workflowName)
|
345
|
+
return yield* Effect.orDie(
|
346
|
+
client(executionId).deferred({
|
347
|
+
name: deferred.name,
|
348
|
+
exit
|
349
|
+
})
|
350
|
+
)
|
351
|
+
}, Effect.scoped),
|
361
352
|
|
362
353
|
scheduleClock(options) {
|
363
354
|
const client = clockClient(options.executionId)
|
@@ -396,7 +387,7 @@ const ActivityRpc = Rpc.make("activity", {
|
|
396
387
|
success: Schema.Unknown,
|
397
388
|
error: Schema.Unknown
|
398
389
|
})
|
399
|
-
})
|
390
|
+
}).annotate(ClusterSchema.Persisted, true)
|
400
391
|
|
401
392
|
const makeWorkflowEntity = (workflow: Workflow.Any) =>
|
402
393
|
Entity.make(`Workflow/${workflow.name}`, [
|
@@ -407,12 +398,23 @@ const makeWorkflowEntity = (workflow: Workflow.Any) =>
|
|
407
398
|
success: workflow.successSchema,
|
408
399
|
error: workflow.errorSchema
|
409
400
|
})
|
410
|
-
})
|
401
|
+
})
|
402
|
+
.annotate(ClusterSchema.Persisted, true)
|
403
|
+
.annotate(ClusterSchema.Uninterruptible, true),
|
404
|
+
|
405
|
+
Rpc.make("deferred", {
|
406
|
+
payload: {
|
407
|
+
name: Schema.String,
|
408
|
+
exit: ExitUnknown
|
409
|
+
},
|
410
|
+
primaryKey: ({ name }) => name,
|
411
|
+
success: ExitUnknown
|
412
|
+
})
|
413
|
+
.annotate(ClusterSchema.Persisted, true)
|
414
|
+
.annotate(ClusterSchema.Uninterruptible, true),
|
415
|
+
|
411
416
|
ActivityRpc
|
412
|
-
])
|
413
|
-
.annotateContext(workflow.annotations)
|
414
|
-
.annotateRpcs(ClusterSchema.Persisted, true)
|
415
|
-
.annotateRpcs(ClusterSchema.Uninterruptible, true)
|
417
|
+
]).annotateContext(workflow.annotations)
|
416
418
|
|
417
419
|
const activityPrimaryKey = (activity: string, attempt: number) => `${activity}/${attempt}`
|
418
420
|
|
@@ -422,42 +424,6 @@ const ExitUnknown = Schema.encodedSchema(Schema.Exit({
|
|
422
424
|
defect: Schema.Defect
|
423
425
|
}))
|
424
426
|
|
425
|
-
const DeferredEntity = Entity.make("Workflow/-/DurableDeferred", [
|
426
|
-
Rpc.make("set", {
|
427
|
-
payload: {
|
428
|
-
workflowName: Schema.String,
|
429
|
-
name: Schema.String,
|
430
|
-
exit: ExitUnknown
|
431
|
-
},
|
432
|
-
primaryKey: ({ name }) => name,
|
433
|
-
success: ExitUnknown
|
434
|
-
}),
|
435
|
-
Rpc.make("resume", {
|
436
|
-
payload: {
|
437
|
-
workflowName: Schema.String,
|
438
|
-
name: Schema.String
|
439
|
-
},
|
440
|
-
primaryKey: ({ name }) => name
|
441
|
-
})
|
442
|
-
])
|
443
|
-
.annotateRpcs(ClusterSchema.Persisted, true)
|
444
|
-
.annotateRpcs(ClusterSchema.Uninterruptible, true)
|
445
|
-
|
446
|
-
const DeferredEntityLayer = DeferredEntity.toLayer(Effect.gen(function*() {
|
447
|
-
const engine = yield* WorkflowEngine
|
448
|
-
const address = yield* Entity.CurrentAddress
|
449
|
-
const executionId = address.entityId
|
450
|
-
const client = (yield* DeferredEntity.client)(executionId)
|
451
|
-
return {
|
452
|
-
set: (request) =>
|
453
|
-
Effect.as(
|
454
|
-
ensureSuccess(client.resume(request.payload, { discard: true })),
|
455
|
-
request.payload.exit
|
456
|
-
),
|
457
|
-
resume: (request) => engine.resume(request.payload.workflowName, executionId)
|
458
|
-
}
|
459
|
-
}))
|
460
|
-
|
461
427
|
class ClockPayload extends Schema.Class<ClockPayload>(`Workflow/DurableClock/Run`)({
|
462
428
|
name: Schema.String,
|
463
429
|
workflowName: Schema.String,
|
@@ -504,7 +470,6 @@ export const layer: Layer.Layer<
|
|
504
470
|
WorkflowEngine,
|
505
471
|
never,
|
506
472
|
Sharding.Sharding | MessageStorage
|
507
|
-
> =
|
508
|
-
Layer.merge(ClockEntityLayer),
|
473
|
+
> = ClockEntityLayer.pipe(
|
509
474
|
Layer.provideMerge(Layer.scoped(WorkflowEngine, make))
|
510
475
|
)
|
@@ -0,0 +1,193 @@
|
|
1
|
+
/**
|
2
|
+
* @since 1.0.0
|
3
|
+
*/
|
4
|
+
import * as HttpApiEndpoint from "@effect/platform/HttpApiEndpoint"
|
5
|
+
import * as HttpApiGroup from "@effect/platform/HttpApiGroup"
|
6
|
+
import * as Rpc from "@effect/rpc/Rpc"
|
7
|
+
import * as RpcGroup from "@effect/rpc/RpcGroup"
|
8
|
+
import * as Schema from "effect/Schema"
|
9
|
+
import { AlreadyProcessingMessage, EntityNotManagedByRunner, MailboxFull, PersistenceError } from "./ClusterError.js"
|
10
|
+
import type * as Entity from "./Entity.js"
|
11
|
+
|
12
|
+
const clientErrors = [
|
13
|
+
MailboxFull,
|
14
|
+
AlreadyProcessingMessage,
|
15
|
+
PersistenceError,
|
16
|
+
EntityNotManagedByRunner
|
17
|
+
] as const
|
18
|
+
|
19
|
+
/**
|
20
|
+
* Derives an `RpcGroup` from an `Entity`.
|
21
|
+
*
|
22
|
+
* ```ts
|
23
|
+
* import { ClusterSchema, Entity, EntityProxy, EntityProxyServer } from "@effect/cluster"
|
24
|
+
* import { Rpc, RpcServer } from "@effect/rpc"
|
25
|
+
* import { Layer, Schema } from "effect"
|
26
|
+
*
|
27
|
+
* export const Counter = Entity.make("Counter", [
|
28
|
+
* Rpc.make("Increment", {
|
29
|
+
* payload: { id: Schema.String, amount: Schema.Number },
|
30
|
+
* primaryKey: ({ id }) => id,
|
31
|
+
* success: Schema.Number
|
32
|
+
* })
|
33
|
+
* ]).annotateRpcs(ClusterSchema.Persisted, true)
|
34
|
+
*
|
35
|
+
* // Use EntityProxy.toRpcGroup to create a `RpcGroup` from the Counter entity
|
36
|
+
* export class MyRpcs extends EntityProxy.toRpcGroup(Counter) {}
|
37
|
+
*
|
38
|
+
* // Use EntityProxyServer.layerRpcHandlers to create a layer that implements
|
39
|
+
* // the rpc handlers
|
40
|
+
* const RpcServerLayer = RpcServer.layer(MyRpcs).pipe(
|
41
|
+
* Layer.provide(EntityProxyServer.layerRpcHandlers(Counter))
|
42
|
+
* )
|
43
|
+
* ```
|
44
|
+
*
|
45
|
+
* @since 1.0.0
|
46
|
+
* @category Constructors
|
47
|
+
*/
|
48
|
+
export const toRpcGroup = <Rpcs extends Rpc.Any, const Prefix extends string = "">(
|
49
|
+
entity: Entity.Entity<Rpcs>,
|
50
|
+
options?: {
|
51
|
+
readonly prefix?: Prefix | undefined
|
52
|
+
}
|
53
|
+
): RpcGroup.RpcGroup<ConvertRpcs<Rpcs, Prefix>> => {
|
54
|
+
const prefix = options?.prefix ?? ""
|
55
|
+
const rpcs: Array<Rpc.Any> = []
|
56
|
+
for (const parentRpc_ of entity.protocol.requests.values()) {
|
57
|
+
const parentRpc = parentRpc_ as any as Rpc.AnyWithProps
|
58
|
+
const payloadSchema = Schema.Struct({
|
59
|
+
entityId: Schema.String,
|
60
|
+
payload: parentRpc.payloadSchema
|
61
|
+
})
|
62
|
+
const oldMake = payloadSchema.make
|
63
|
+
payloadSchema.make = (input: any, options?: Schema.MakeOptions) => {
|
64
|
+
return oldMake({
|
65
|
+
entityId: input.entityId,
|
66
|
+
payload: parentRpc.payloadSchema.make(input.payload, options)
|
67
|
+
}, options)
|
68
|
+
}
|
69
|
+
const rpc = Rpc.make(`${prefix}${parentRpc._tag}`, {
|
70
|
+
payload: payloadSchema,
|
71
|
+
error: Schema.Union(parentRpc.errorSchema, ...clientErrors),
|
72
|
+
success: parentRpc.successSchema
|
73
|
+
}).annotateContext(parentRpc.annotations)
|
74
|
+
rpcs.push(rpc)
|
75
|
+
}
|
76
|
+
return RpcGroup.make(...rpcs) as any as RpcGroup.RpcGroup<ConvertRpcs<Rpcs, Prefix>>
|
77
|
+
}
|
78
|
+
|
79
|
+
/**
|
80
|
+
* @since 1.0.0
|
81
|
+
*/
|
82
|
+
export type ConvertRpcs<Rpcs extends Rpc.Any, Prefix extends string> = Rpcs extends Rpc.Rpc<
|
83
|
+
infer _Tag,
|
84
|
+
infer _Payload,
|
85
|
+
infer _Success,
|
86
|
+
infer _Error,
|
87
|
+
infer _Middleware
|
88
|
+
> ? Rpc.Rpc<
|
89
|
+
`${Prefix}${_Tag}`,
|
90
|
+
Schema.Struct<{
|
91
|
+
entityId: typeof Schema.String
|
92
|
+
payload: _Payload
|
93
|
+
}>,
|
94
|
+
_Success,
|
95
|
+
Schema.Schema<
|
96
|
+
_Error["Type"] | MailboxFull | AlreadyProcessingMessage | PersistenceError | EntityNotManagedByRunner,
|
97
|
+
| _Error["Encoded"]
|
98
|
+
| typeof MailboxFull["Encoded"]
|
99
|
+
| typeof AlreadyProcessingMessage["Encoded"]
|
100
|
+
| typeof PersistenceError["Encoded"]
|
101
|
+
| typeof EntityNotManagedByRunner["Encoded"],
|
102
|
+
_Error["Context"]
|
103
|
+
>
|
104
|
+
>
|
105
|
+
: never
|
106
|
+
|
107
|
+
const entityIdPath = Schema.Struct({
|
108
|
+
entityId: Schema.String
|
109
|
+
})
|
110
|
+
|
111
|
+
/**
|
112
|
+
* Derives an `HttpApiGroup` from an `Entity`.
|
113
|
+
*
|
114
|
+
* ```ts
|
115
|
+
* import { ClusterSchema, Entity, EntityProxy, EntityProxyServer } from "@effect/cluster"
|
116
|
+
* import { HttpApi, HttpApiBuilder } from "@effect/platform"
|
117
|
+
* import { Rpc } from "@effect/rpc"
|
118
|
+
* import { Layer, Schema } from "effect"
|
119
|
+
*
|
120
|
+
* export const Counter = Entity.make("Counter", [
|
121
|
+
* Rpc.make("Increment", {
|
122
|
+
* payload: { id: Schema.String, amount: Schema.Number },
|
123
|
+
* primaryKey: ({ id }) => id,
|
124
|
+
* success: Schema.Number
|
125
|
+
* })
|
126
|
+
* ]).annotateRpcs(ClusterSchema.Persisted, true)
|
127
|
+
*
|
128
|
+
* // Use EntityProxy.toHttpApiGroup to create a `HttpApiGroup` from the
|
129
|
+
* // Counter entity
|
130
|
+
* export class MyApi extends HttpApi.make("api")
|
131
|
+
* .add(
|
132
|
+
* EntityProxy.toHttpApiGroup("counter", Counter)
|
133
|
+
* .prefix("/counter")
|
134
|
+
* )
|
135
|
+
* {}
|
136
|
+
*
|
137
|
+
* // Use EntityProxyServer.layerHttpApi to create a layer that implements
|
138
|
+
* // the handlers for the HttpApiGroup
|
139
|
+
* const ApiLayer = HttpApiBuilder.api(MyApi).pipe(
|
140
|
+
* Layer.provide(EntityProxyServer.layerHttpApi(MyApi, "counter", Counter))
|
141
|
+
* )
|
142
|
+
* ```
|
143
|
+
*
|
144
|
+
* @since 1.0.0
|
145
|
+
* @category Constructors
|
146
|
+
*/
|
147
|
+
export const toHttpApiGroup = <const Name extends string, Rpcs extends Rpc.Any>(
|
148
|
+
name: Name,
|
149
|
+
entity: Entity.Entity<Rpcs>
|
150
|
+
): HttpApiGroup.HttpApiGroup<Name, ConvertHttpApi<Rpcs>> => {
|
151
|
+
let group = HttpApiGroup.make(name)
|
152
|
+
for (const parentRpc_ of entity.protocol.requests.values()) {
|
153
|
+
const parentRpc = parentRpc_ as any as Rpc.AnyWithProps
|
154
|
+
const endpoint = HttpApiEndpoint.post(parentRpc._tag, `/${tagToPath(parentRpc._tag)}/:entityId`)
|
155
|
+
.setPath(entityIdPath)
|
156
|
+
.setPayload(parentRpc.payloadSchema)
|
157
|
+
.addSuccess(parentRpc.successSchema)
|
158
|
+
.addError(Schema.Union(parentRpc.errorSchema, ...clientErrors))
|
159
|
+
.annotateContext(parentRpc.annotations)
|
160
|
+
|
161
|
+
group = group.add(endpoint) as any
|
162
|
+
}
|
163
|
+
return group as any as HttpApiGroup.HttpApiGroup<Name, ConvertHttpApi<Rpcs>>
|
164
|
+
}
|
165
|
+
|
166
|
+
const tagToPath = (tag: string): string =>
|
167
|
+
tag
|
168
|
+
.replace(/[^a-zA-Z0-9]+/g, "-") // Replace non-alphanumeric characters with hyphen
|
169
|
+
.replace(/([a-z])([A-Z])/g, "$1-$2") // Insert hyphen before uppercase letters
|
170
|
+
.toLowerCase()
|
171
|
+
|
172
|
+
/**
|
173
|
+
* @since 1.0.0
|
174
|
+
*/
|
175
|
+
export type ConvertHttpApi<Rpcs extends Rpc.Any> = Rpcs extends Rpc.Rpc<
|
176
|
+
infer _Tag,
|
177
|
+
infer _Payload,
|
178
|
+
infer _Success,
|
179
|
+
infer _Error,
|
180
|
+
infer _Middleware
|
181
|
+
> ? HttpApiEndpoint.HttpApiEndpoint<
|
182
|
+
_Tag,
|
183
|
+
"POST",
|
184
|
+
{ readonly entityId: string },
|
185
|
+
never,
|
186
|
+
_Payload["Type"],
|
187
|
+
never,
|
188
|
+
_Success["Type"],
|
189
|
+
_Error["Type"] | MailboxFull | AlreadyProcessingMessage | PersistenceError | EntityNotManagedByRunner,
|
190
|
+
_Payload["Context"] | _Success["Context"],
|
191
|
+
_Error["Context"]
|
192
|
+
> :
|
193
|
+
never
|
@@ -0,0 +1,86 @@
|
|
1
|
+
/**
|
2
|
+
* @since 1.0.0
|
3
|
+
*/
|
4
|
+
import type * as HttpApi from "@effect/platform/HttpApi"
|
5
|
+
import * as HttpApiBuilder from "@effect/platform/HttpApiBuilder"
|
6
|
+
import type { ApiGroup, HttpApiGroup } from "@effect/platform/HttpApiGroup"
|
7
|
+
import type * as Rpc from "@effect/rpc/Rpc"
|
8
|
+
import * as Context from "effect/Context"
|
9
|
+
import * as Effect from "effect/Effect"
|
10
|
+
import * as Layer from "effect/Layer"
|
11
|
+
import type * as Entity from "./Entity.js"
|
12
|
+
import type { Sharding } from "./Sharding.js"
|
13
|
+
|
14
|
+
/**
|
15
|
+
* @since 1.0.0
|
16
|
+
* @category Layers
|
17
|
+
*/
|
18
|
+
export const layerHttpApi = <
|
19
|
+
ApiId extends string,
|
20
|
+
Groups extends HttpApiGroup.Any,
|
21
|
+
ApiE,
|
22
|
+
ApiR,
|
23
|
+
Name extends HttpApiGroup.Name<Groups>,
|
24
|
+
Rpcs extends Rpc.Any
|
25
|
+
>(
|
26
|
+
api: HttpApi.HttpApi<ApiId, Groups, ApiE, ApiR>,
|
27
|
+
name: Name,
|
28
|
+
entity: Entity.Entity<Rpcs>
|
29
|
+
): Layer.Layer<ApiGroup<ApiId, Name>, never, Sharding | Rpc.Context<Rpcs>> =>
|
30
|
+
HttpApiBuilder.group(
|
31
|
+
api,
|
32
|
+
name,
|
33
|
+
Effect.fnUntraced(function*(handlers_) {
|
34
|
+
const client = yield* entity.client
|
35
|
+
let handlers = handlers_
|
36
|
+
for (const parentRpc_ of entity.protocol.requests.values()) {
|
37
|
+
const parentRpc = parentRpc_ as any as Rpc.AnyWithProps
|
38
|
+
handlers = handlers.handle(
|
39
|
+
parentRpc._tag as any,
|
40
|
+
(({ path, payload }: { path: { entityId: string }; payload: any }) =>
|
41
|
+
(client(path.entityId) as any)[parentRpc._tag](payload)) as any
|
42
|
+
) as any
|
43
|
+
}
|
44
|
+
return handlers as HttpApiBuilder.Handlers<never, never, never>
|
45
|
+
})
|
46
|
+
)
|
47
|
+
|
48
|
+
/**
|
49
|
+
* @since 1.0.0
|
50
|
+
* @category Layers
|
51
|
+
*/
|
52
|
+
export const layerRpcHandlers = <
|
53
|
+
Rpcs extends Rpc.Any,
|
54
|
+
const Prefix extends string = ""
|
55
|
+
>(entity: Entity.Entity<Rpcs>, options?: {
|
56
|
+
readonly prefix?: Prefix
|
57
|
+
}): Layer.Layer<RpcHandlers<Rpcs, Prefix>, never, Sharding | Rpc.Context<Rpcs>> =>
|
58
|
+
Layer.effectContext(Effect.gen(function*() {
|
59
|
+
const context = yield* Effect.context<never>()
|
60
|
+
const prefix = options?.prefix ?? ""
|
61
|
+
const client = yield* entity.client
|
62
|
+
const handlers = new Map<string, Rpc.Handler<string>>()
|
63
|
+
for (const parentRpc_ of entity.protocol.requests.values()) {
|
64
|
+
const parentRpc = parentRpc_ as any as Rpc.AnyWithProps
|
65
|
+
const tag = `${prefix}${parentRpc._tag}` as const
|
66
|
+
const key = `@effect/rpc/Rpc/${tag}`
|
67
|
+
handlers.set(key, {
|
68
|
+
context,
|
69
|
+
tag,
|
70
|
+
handler: ({ entityId, payload }: any) => (client(entityId) as any)[parentRpc._tag](payload) as any
|
71
|
+
} as any)
|
72
|
+
}
|
73
|
+
return Context.unsafeMake(handlers)
|
74
|
+
}))
|
75
|
+
|
76
|
+
/**
|
77
|
+
* @since 1.0.0
|
78
|
+
*/
|
79
|
+
export type RpcHandlers<Rpcs extends Rpc.Any, Prefix extends string> = Rpcs extends Rpc.Rpc<
|
80
|
+
infer _Tag,
|
81
|
+
infer _Payload,
|
82
|
+
infer _Success,
|
83
|
+
infer _Error,
|
84
|
+
infer _Middleware
|
85
|
+
> ? Rpc.Handler<`${Prefix}${_Tag}`>
|
86
|
+
: never
|
package/src/ShardingConfig.ts
CHANGED
@@ -148,7 +148,6 @@ export const config: Config.Config<ShardingConfig["Type"]> = Config.all({
|
|
148
148
|
}).pipe(Config.map((options) => RunnerAddress.make(options)), Config.option),
|
149
149
|
runnerListenAddress: Config.all({
|
150
150
|
host: Config.string("listenHost").pipe(
|
151
|
-
Config.withDefault(defaultRunnerAddress.host),
|
152
151
|
Config.withDescription("The host to listen on.")
|
153
152
|
),
|
154
153
|
port: Config.integer("listenPort").pipe(
|
package/src/index.ts
CHANGED
@@ -43,6 +43,16 @@ export * as EntityAddress from "./EntityAddress.js"
|
|
43
43
|
*/
|
44
44
|
export * as EntityId from "./EntityId.js"
|
45
45
|
|
46
|
+
/**
|
47
|
+
* @since 1.0.0
|
48
|
+
*/
|
49
|
+
export * as EntityProxy from "./EntityProxy.js"
|
50
|
+
|
51
|
+
/**
|
52
|
+
* @since 1.0.0
|
53
|
+
*/
|
54
|
+
export * as EntityProxyServer from "./EntityProxyServer.js"
|
55
|
+
|
46
56
|
/**
|
47
57
|
* @since 1.0.0
|
48
58
|
*/
|