diff --git a/engine/docker/dev-host/grafana/dashboards/guard.json b/engine/docker/dev-host/grafana/dashboards/guard.json index b4d37655bc..722321a813 100644 --- a/engine/docker/dev-host/grafana/dashboards/guard.json +++ b/engine/docker/dev-host/grafana/dashboards/guard.json @@ -92,9 +92,7 @@ "id": 10, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -198,9 +196,7 @@ "id": 11, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -304,9 +300,7 @@ "id": 12, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -410,9 +404,7 @@ "id": 2, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -517,9 +509,7 @@ "id": 5, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -727,9 +717,7 @@ "id": 7, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -834,9 +822,7 @@ "id": 8, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, diff --git a/engine/docker/dev-host/grafana/dashboards/tokio.json b/engine/docker/dev-host/grafana/dashboards/tokio.json index 45bd84de2a..e50028f6ff 100644 --- a/engine/docker/dev-host/grafana/dashboards/tokio.json +++ b/engine/docker/dev-host/grafana/dashboards/tokio.json @@ -93,9 +93,7 @@ "id": 24, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -200,9 +198,7 @@ "id": 27, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -418,9 +414,7 @@ "id": 26, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -636,9 +630,7 @@ "id": 25, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -743,9 +735,7 @@ "id": 28, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -850,9 +840,7 @@ "id": 29, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -968,12 +956,8 @@ }, { "current": { - "text": [ - "All" - ], - "value": [ - "$__all" - ] + "text": ["All"], + "value": ["$__all"] }, "datasource": { "type": "grafana-clickhouse-datasource", diff --git a/engine/docker/dev-multidc-multinode/core/grafana/dashboards/guard.json b/engine/docker/dev-multidc-multinode/core/grafana/dashboards/guard.json index b4d37655bc..722321a813 100644 --- a/engine/docker/dev-multidc-multinode/core/grafana/dashboards/guard.json +++ b/engine/docker/dev-multidc-multinode/core/grafana/dashboards/guard.json @@ -92,9 +92,7 @@ "id": 10, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -198,9 +196,7 @@ "id": 11, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -304,9 +300,7 @@ "id": 12, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -410,9 +404,7 @@ "id": 2, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -517,9 +509,7 @@ "id": 5, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -727,9 +717,7 @@ "id": 7, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -834,9 +822,7 @@ "id": 8, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, diff --git a/engine/docker/dev-multidc-multinode/core/grafana/dashboards/tokio.json b/engine/docker/dev-multidc-multinode/core/grafana/dashboards/tokio.json index 45bd84de2a..e50028f6ff 100644 --- a/engine/docker/dev-multidc-multinode/core/grafana/dashboards/tokio.json +++ b/engine/docker/dev-multidc-multinode/core/grafana/dashboards/tokio.json @@ -93,9 +93,7 @@ "id": 24, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -200,9 +198,7 @@ "id": 27, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -418,9 +414,7 @@ "id": 26, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -636,9 +630,7 @@ "id": 25, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -743,9 +735,7 @@ "id": 28, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -850,9 +840,7 @@ "id": 29, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -968,12 +956,8 @@ }, { "current": { - "text": [ - "All" - ], - "value": [ - "$__all" - ] + "text": ["All"], + "value": ["$__all"] }, "datasource": { "type": "grafana-clickhouse-datasource", diff --git a/engine/docker/dev-multidc/core/grafana/dashboards/guard.json b/engine/docker/dev-multidc/core/grafana/dashboards/guard.json index b4d37655bc..722321a813 100644 --- a/engine/docker/dev-multidc/core/grafana/dashboards/guard.json +++ b/engine/docker/dev-multidc/core/grafana/dashboards/guard.json @@ -92,9 +92,7 @@ "id": 10, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -198,9 +196,7 @@ "id": 11, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -304,9 +300,7 @@ "id": 12, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -410,9 +404,7 @@ "id": 2, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -517,9 +509,7 @@ "id": 5, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -727,9 +717,7 @@ "id": 7, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -834,9 +822,7 @@ "id": 8, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, diff --git a/engine/docker/dev-multidc/core/grafana/dashboards/tokio.json b/engine/docker/dev-multidc/core/grafana/dashboards/tokio.json index 45bd84de2a..e50028f6ff 100644 --- a/engine/docker/dev-multidc/core/grafana/dashboards/tokio.json +++ b/engine/docker/dev-multidc/core/grafana/dashboards/tokio.json @@ -93,9 +93,7 @@ "id": 24, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -200,9 +198,7 @@ "id": 27, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -418,9 +414,7 @@ "id": 26, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -636,9 +630,7 @@ "id": 25, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -743,9 +735,7 @@ "id": 28, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -850,9 +840,7 @@ "id": 29, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -968,12 +956,8 @@ }, { "current": { - "text": [ - "All" - ], - "value": [ - "$__all" - ] + "text": ["All"], + "value": ["$__all"] }, "datasource": { "type": "grafana-clickhouse-datasource", diff --git a/engine/docker/dev-multinode/grafana/dashboards/guard.json b/engine/docker/dev-multinode/grafana/dashboards/guard.json index b4d37655bc..722321a813 100644 --- a/engine/docker/dev-multinode/grafana/dashboards/guard.json +++ b/engine/docker/dev-multinode/grafana/dashboards/guard.json @@ -92,9 +92,7 @@ "id": 10, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -198,9 +196,7 @@ "id": 11, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -304,9 +300,7 @@ "id": 12, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -410,9 +404,7 @@ "id": 2, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -517,9 +509,7 @@ "id": 5, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -727,9 +717,7 @@ "id": 7, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -834,9 +822,7 @@ "id": 8, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, diff --git a/engine/docker/dev-multinode/grafana/dashboards/tokio.json b/engine/docker/dev-multinode/grafana/dashboards/tokio.json index 45bd84de2a..e50028f6ff 100644 --- a/engine/docker/dev-multinode/grafana/dashboards/tokio.json +++ b/engine/docker/dev-multinode/grafana/dashboards/tokio.json @@ -93,9 +93,7 @@ "id": 24, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -200,9 +198,7 @@ "id": 27, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -418,9 +414,7 @@ "id": 26, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -636,9 +630,7 @@ "id": 25, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -743,9 +735,7 @@ "id": 28, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -850,9 +840,7 @@ "id": 29, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -968,12 +956,8 @@ }, { "current": { - "text": [ - "All" - ], - "value": [ - "$__all" - ] + "text": ["All"], + "value": ["$__all"] }, "datasource": { "type": "grafana-clickhouse-datasource", diff --git a/engine/docker/dev/grafana/dashboards/guard.json b/engine/docker/dev/grafana/dashboards/guard.json index b4d37655bc..722321a813 100644 --- a/engine/docker/dev/grafana/dashboards/guard.json +++ b/engine/docker/dev/grafana/dashboards/guard.json @@ -92,9 +92,7 @@ "id": 10, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -198,9 +196,7 @@ "id": 11, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -304,9 +300,7 @@ "id": 12, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -410,9 +404,7 @@ "id": 2, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -517,9 +509,7 @@ "id": 5, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -727,9 +717,7 @@ "id": 7, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -834,9 +822,7 @@ "id": 8, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, diff --git a/engine/docker/dev/grafana/dashboards/tokio.json b/engine/docker/dev/grafana/dashboards/tokio.json index 45bd84de2a..e50028f6ff 100644 --- a/engine/docker/dev/grafana/dashboards/tokio.json +++ b/engine/docker/dev/grafana/dashboards/tokio.json @@ -93,9 +93,7 @@ "id": 24, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -200,9 +198,7 @@ "id": 27, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -418,9 +414,7 @@ "id": 26, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -636,9 +630,7 @@ "id": 25, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -743,9 +735,7 @@ "id": 28, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -850,9 +840,7 @@ "id": 29, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -968,12 +956,8 @@ }, { "current": { - "text": [ - "All" - ], - "value": [ - "$__all" - ] + "text": ["All"], + "value": ["$__all"] }, "datasource": { "type": "grafana-clickhouse-datasource", diff --git a/engine/docker/template/grafana-dashboards/guard.json b/engine/docker/template/grafana-dashboards/guard.json index b4d37655bc..722321a813 100644 --- a/engine/docker/template/grafana-dashboards/guard.json +++ b/engine/docker/template/grafana-dashboards/guard.json @@ -92,9 +92,7 @@ "id": 10, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -198,9 +196,7 @@ "id": 11, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -304,9 +300,7 @@ "id": 12, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -410,9 +404,7 @@ "id": 2, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -517,9 +509,7 @@ "id": 5, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -727,9 +717,7 @@ "id": 7, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, @@ -834,9 +822,7 @@ "id": 8, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": true, diff --git a/engine/docker/template/grafana-dashboards/tokio.json b/engine/docker/template/grafana-dashboards/tokio.json index 45bd84de2a..e50028f6ff 100644 --- a/engine/docker/template/grafana-dashboards/tokio.json +++ b/engine/docker/template/grafana-dashboards/tokio.json @@ -93,9 +93,7 @@ "id": 24, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -200,9 +198,7 @@ "id": 27, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -418,9 +414,7 @@ "id": 26, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -636,9 +630,7 @@ "id": 25, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -743,9 +735,7 @@ "id": 28, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -850,9 +840,7 @@ "id": 29, "options": { "legend": { - "calcs": [ - "lastNotNull" - ], + "calcs": ["lastNotNull"], "displayMode": "table", "placement": "bottom", "showLegend": false, @@ -968,12 +956,8 @@ }, { "current": { - "text": [ - "All" - ], - "value": [ - "$__all" - ] + "text": ["All"], + "value": ["$__all"] }, "datasource": { "type": "grafana-clickhouse-datasource", diff --git a/engine/sdks/typescript/runner/src/mod.ts b/engine/sdks/typescript/runner/src/mod.ts index 7e4955471e..841149610f 100644 --- a/engine/sdks/typescript/runner/src/mod.ts +++ b/engine/sdks/typescript/runner/src/mod.ts @@ -48,12 +48,14 @@ export interface RunnerConfig { fetch: ( runner: Runner, actorId: string, + requestId: protocol.RequestId, request: Request, ) => Promise; websocket?: ( runner: Runner, actorId: string, ws: any, + requestId: protocol.RequestId, request: Request, ) => Promise; onActorStart: ( diff --git a/engine/sdks/typescript/runner/src/tunnel.ts b/engine/sdks/typescript/runner/src/tunnel.ts index caa78648a8..5804406685 100644 --- a/engine/sdks/typescript/runner/src/tunnel.ts +++ b/engine/sdks/typescript/runner/src/tunnel.ts @@ -207,7 +207,7 @@ export class Tunnel { actor.webSockets.clear(); } - async #fetch(actorId: string, request: Request): Promise { + async #fetch(actorId: string, requestId: protocol.RequestId, request: Request): Promise { // Validate actor exists if (!this.#runner.hasActor(actorId)) { logger()?.warn({ @@ -220,6 +220,7 @@ export class Tunnel { const fetchHandler = this.#runner.config.fetch( this.#runner, actorId, + requestId, request, ); @@ -354,12 +355,13 @@ export class Tunnel { // Call fetch handler with validation const response = await this.#fetch( req.actorId, + requestId, streamingRequest, ); await this.#sendResponse(requestId, response); } else { // Non-streaming request - const response = await this.#fetch(req.actorId, request); + const response = await this.#fetch(req.actorId, requestId, request); await this.#sendResponse(requestId, response); } } catch (error) { @@ -451,7 +453,7 @@ export class Tunnel { } async #handleWebSocketOpen( - requestId: ArrayBuffer, + requestId: protocol.RequestId, open: protocol.ToClientWebSocketOpen, ) { const webSocketId = bufferToString(requestId); @@ -582,6 +584,7 @@ export class Tunnel { this.#runner, open.actorId, adapter, + requestId, request, ); } catch (error) { diff --git a/examples/kitchen-sink/src/backend/actors/demo.ts b/examples/kitchen-sink/src/backend/actors/demo.ts index bcf9649373..03aa01b311 100644 --- a/examples/kitchen-sink/src/backend/actors/demo.ts +++ b/examples/kitchen-sink/src/backend/actors/demo.ts @@ -157,6 +157,6 @@ export const demo = actor({ ...websocketActions, }, options: { - sleepTimeout: 2000, + sleepTimeout: 10_000, }, }); diff --git a/rivetkit-typescript/packages/rivetkit/src/actor/conn-socket.ts b/rivetkit-typescript/packages/rivetkit/src/actor/conn-socket.ts index ef5b1f095d..c41c3ca197 100644 --- a/rivetkit-typescript/packages/rivetkit/src/actor/conn-socket.ts +++ b/rivetkit-typescript/packages/rivetkit/src/actor/conn-socket.ts @@ -1,6 +1,6 @@ import type { ConnDriverState } from "./conn-drivers"; export interface ConnSocket { - socketId: string; + requestId: string; driverState: ConnDriverState; } diff --git a/rivetkit-typescript/packages/rivetkit/src/actor/conn.ts b/rivetkit-typescript/packages/rivetkit/src/actor/conn.ts index d268dbd142..0e7556be19 100644 --- a/rivetkit-typescript/packages/rivetkit/src/actor/conn.ts +++ b/rivetkit-typescript/packages/rivetkit/src/actor/conn.ts @@ -27,7 +27,7 @@ export function generateConnToken(): string { return generateSecureToken(32); } -export function generateConnSocketId(): string { +export function generateConnRequestId(): string { return crypto.randomUUID(); } @@ -258,7 +258,7 @@ export class Conn { }); } - this.#actor.__connDisconnected(this, true, this.__socket.socketId); + this.#actor.__connDisconnected(this, true, this.__socket.requestId); } else { this.#actor.rLog.warn({ msg: "missing connection driver state for disconnect", diff --git a/rivetkit-typescript/packages/rivetkit/src/actor/instance.ts b/rivetkit-typescript/packages/rivetkit/src/actor/instance.ts index 6020b25e25..573735aab3 100644 --- a/rivetkit-typescript/packages/rivetkit/src/actor/instance.ts +++ b/rivetkit-typescript/packages/rivetkit/src/actor/instance.ts @@ -27,7 +27,7 @@ import { Conn, type ConnId, generateConnId, - generateConnSocketId, + generateConnRequestId, generateConnToken, } from "./conn"; import { @@ -232,6 +232,10 @@ export class ActorInstance { lastSeen: conn.lastSeen, stateEnabled: conn.__stateEnabled, isHibernatable: conn.isHibernatable, + requestId: conn.__socket?.requestId, + driver: conn.__driverState + ? getConnDriverKindFromState(conn.__driverState) + : undefined, }), ); }, @@ -247,10 +251,10 @@ export class ActorInstance { await this.saveState({ immediate: true }); }, executeAction: async (name, params) => { - const socketId = generateConnSocketId(); + const requestId = generateConnRequestId(); const conn = await this.createConn( { - socketId, + requestId: requestId, driverState: { [ConnDriverKind.HTTP]: {} }, }, undefined, @@ -264,7 +268,7 @@ export class ActorInstance { params || [], ); } finally { - this.__connDisconnected(conn, true, socketId); + this.__connDisconnected(conn, true, requestId); } }, }; @@ -873,16 +877,20 @@ export class ActorInstance { __connDisconnected( conn: Conn, wasClean: boolean, - socketId: string, + requestId: string, ) { // If socket ID is provided, check if it matches the current socket ID // If it doesn't match, this is a stale disconnect event from an old socket - if (socketId && conn.__socket && socketId !== conn.__socket.socketId) { + if ( + requestId && + conn.__socket && + requestId !== conn.__socket.requestId + ) { this.#rLog.debug({ msg: "ignoring stale disconnect event", connId: conn.id, - eventSocketId: socketId, - currentSocketId: conn.__socket.socketId, + eventRequestId: requestId, + currentRequestId: conn.__socket.requestId, }); return; } diff --git a/rivetkit-typescript/packages/rivetkit/src/actor/router-endpoints.ts b/rivetkit-typescript/packages/rivetkit/src/actor/router-endpoints.ts index d8bb7128c0..37aa8c0801 100644 --- a/rivetkit-typescript/packages/rivetkit/src/actor/router-endpoints.ts +++ b/rivetkit-typescript/packages/rivetkit/src/actor/router-endpoints.ts @@ -7,7 +7,7 @@ import { ActionContext } from "@/actor/action"; import type { AnyConn } from "@/actor/conn"; import { generateConnId, - generateConnSocketId, + generateConnRequestId, generateConnToken, } from "@/actor/conn"; import { ConnDriverKind } from "@/actor/conn-drivers"; @@ -115,8 +115,9 @@ export async function handleWebSocketConnect( actorId: string, encoding: Encoding, parameters: unknown, - connId?: string, - connToken?: string, + requestId: string, + connId: string | undefined, + connToken: string | undefined, ): Promise { const exposeInternalError = req ? getRequestExposeInternalError(req) @@ -161,7 +162,6 @@ export async function handleWebSocketConnect( // Promise used to wait for the websocket close in `disconnect` const closePromise = promiseWithResolvers(); - const socketId = generateConnSocketId(); return { onOpen: (_evt: any, ws: WSContext) => { @@ -183,7 +183,7 @@ export async function handleWebSocketConnect( conn = await actor.createConn( { - socketId, + requestId: requestId, driverState: { [ConnDriverKind.WEBSOCKET]: { encoding, @@ -302,7 +302,7 @@ export async function handleWebSocketConnect( handlersPromise .then(({ conn, actor }) => { const wasClean = event.wasClean || event.code === 1000; - actor.__connDisconnected(conn, wasClean, socketId); + actor.__connDisconnected(conn, wasClean, requestId); }) .catch((error) => { deconstructError( @@ -342,7 +342,7 @@ export async function handleSseConnect( const encoding = getRequestEncoding(c.req); const parameters = getRequestConnParams(c.req); - const socketId = generateConnSocketId(); + const requestId = generateConnRequestId(); // Check for reconnection parameters const connId = c.req.header(HEADER_CONN_ID); @@ -365,7 +365,7 @@ export async function handleSseConnect( conn = await actor.createConn( { - socketId, + requestId: requestId, driverState: { [ConnDriverKind.SSE]: { encoding, @@ -396,7 +396,7 @@ export async function handleSseConnect( // Cleanup if (conn) { - actor.__connDisconnected(conn, false, socketId); + actor.__connDisconnected(conn, false, requestId); } abortResolver.resolve(undefined); @@ -435,7 +435,7 @@ export async function handleSseConnect( // Cleanup on error if (conn && actor !== undefined) { - actor.__connDisconnected(conn, false, socketId); + actor.__connDisconnected(conn, false, requestId); } // Close the stream on error @@ -465,7 +465,7 @@ export async function handleAction( HTTP_ACTION_REQUEST_VERSIONED, ); const actionArgs = cbor.decode(new Uint8Array(request.args)); - const socketId = generateConnSocketId(); + const requestId = generateConnRequestId(); // Invoke the action let actor: AnyActorInstance | undefined; @@ -479,7 +479,7 @@ export async function handleAction( // Create conn conn = await actor.createConn( { - socketId, + requestId: requestId, driverState: { [ConnDriverKind.HTTP]: {} }, }, parameters, @@ -492,7 +492,7 @@ export async function handleAction( } finally { if (conn) { // HTTP connections don't have persistent sockets, so no socket ID needed - actor?.__connDisconnected(conn, true, socketId); + actor?.__connDisconnected(conn, true, requestId); } } diff --git a/rivetkit-typescript/packages/rivetkit/src/actor/router.ts b/rivetkit-typescript/packages/rivetkit/src/actor/router.ts index f91658f757..517b3e4232 100644 --- a/rivetkit-typescript/packages/rivetkit/src/actor/router.ts +++ b/rivetkit-typescript/packages/rivetkit/src/actor/router.ts @@ -42,6 +42,7 @@ import { } from "@/inspector/actor"; import { isInspectorEnabled, secureInspector } from "@/inspector/utils"; import type { RunnerConfig } from "@/registry/run-config"; +import { generateConnRequestId } from "./conn"; import { ConnDriverKind } from "./conn-drivers"; import type { ActorDriver } from "./driver"; import { InternalError } from "./errors"; @@ -175,6 +176,7 @@ export function createActorRouter( c.env.actorId, encoding, connParams, + generateConnRequestId(), connIdRaw, connTokenRaw, ); diff --git a/rivetkit-typescript/packages/rivetkit/src/drivers/engine/actor-driver.ts b/rivetkit-typescript/packages/rivetkit/src/drivers/engine/actor-driver.ts index 230f60c616..f1cc9bc1a6 100644 --- a/rivetkit-typescript/packages/rivetkit/src/drivers/engine/actor-driver.ts +++ b/rivetkit-typescript/packages/rivetkit/src/drivers/engine/actor-driver.ts @@ -41,6 +41,7 @@ import type { RunnerConfig } from "@/registry/run-config"; import { getEndpoint } from "@/remote-manager-driver/api-utils"; import { arrayBuffersEqual, + bufferToString, type LongTimeoutHandle, promiseWithResolvers, setLongTimeout, @@ -434,8 +435,9 @@ export class EngineActorDriver implements ActorDriver { } async #runnerFetch( - runner: Runner, + _runner: Runner, actorId: string, + _requestIdBuf: ArrayBuffer, request: Request, ): Promise { logger().debug({ @@ -448,12 +450,14 @@ export class EngineActorDriver implements ActorDriver { } async #runnerWebSocket( - runner: Runner, + _runner: Runner, actorId: string, websocketRaw: any, + requestIdBuf: ArrayBuffer, request: Request, ): Promise { const websocket = websocketRaw as UniversalWebSocket; + const requestId = bufferToString(requestIdBuf); logger().debug({ msg: "runner websocket", actorId, url: request.url }); @@ -497,6 +501,7 @@ export class EngineActorDriver implements ActorDriver { actorId, encoding, connParams, + requestId, // Extract connId and connToken from protocols if needed undefined, undefined, diff --git a/rivetkit-typescript/packages/rivetkit/src/drivers/file-system/manager.ts b/rivetkit-typescript/packages/rivetkit/src/drivers/file-system/manager.ts index 416e3475c5..0891cb3138 100644 --- a/rivetkit-typescript/packages/rivetkit/src/drivers/file-system/manager.ts +++ b/rivetkit-typescript/packages/rivetkit/src/drivers/file-system/manager.ts @@ -1,5 +1,6 @@ import type { Context as HonoContext } from "hono"; import invariant from "invariant"; +import { generateConnRequestId } from "@/actor/conn"; import { type ActorRouter, createActorRouter } from "@/actor/router"; import { handleRawWebSocketHandler, @@ -173,6 +174,7 @@ export class FileSystemManagerDriver implements ManagerDriver { actorId, encoding, params, + generateConnRequestId(), connId, connToken, ); @@ -231,6 +233,7 @@ export class FileSystemManagerDriver implements ManagerDriver { actorId, encoding, connParams, + generateConnRequestId(), connId, connToken, ); diff --git a/rivetkit-typescript/packages/rivetkit/src/utils.ts b/rivetkit-typescript/packages/rivetkit/src/utils.ts index 797978c934..cee74f86e7 100644 --- a/rivetkit-typescript/packages/rivetkit/src/utils.ts +++ b/rivetkit-typescript/packages/rivetkit/src/utils.ts @@ -269,3 +269,8 @@ export const EXTRA_ERROR_LOG = { support: "https://rivet.dev/discord", version: VERSION, }; + +/** Converts a buffer to a string. Used for storing strings in a lookup map. */ +export function bufferToString(buffer: ArrayBuffer): string { + return Buffer.from(buffer).toString("base64"); +}