Skip to content

Commit 78d7116

Browse files
committed
wip
1 parent d5f7548 commit 78d7116

File tree

1 file changed

+104
-16
lines changed

1 file changed

+104
-16
lines changed

typescript-sdk/src/runtime/runtime.ts

Lines changed: 104 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ import {
1515
FumeOffset,
1616
FumeShardIdx,
1717
FumeSlotStatus,
18+
Slot,
1819
} from "./state-machine";
20+
import { Runtime } from "inspector/promises";
1921

2022
export class CompletedDownloadBlockTask {
2123
constructor(
@@ -64,28 +66,34 @@ export abstract class AsyncSlotDownloader {
6466
): Promise<DownloadTaskResult>;
6567
}
6668

67-
type TaskName =
68-
| "dragonsmouth_bidi"
69-
| "control_plane_rx"
70-
| "download_task"
71-
| "commit_tick";
72-
73-
74-
7569
export type Tick = { };
7670

77-
export type ControlPlaneResp = { readonly response: ControlPlaneResp }
71+
export type ControlPlaneResp = { readonly response: ControlResponse }
7872

7973
export type DownloadTaskCompleted = { readonly result: DownloadTaskResult }
8074

8175
export type SubscribeRequestUpdate = { readonly new_subscribe_request: SubscribeRequest }
8276

77+
export type RuntimeEventKind =
78+
| 'tick'
79+
| 'subscribe_request_update'
80+
| 'download_completed'
81+
| 'control_plane_response';
82+
83+
// export type RuntimeEvent = {
84+
// _kind: RuntimeEventKind,
85+
// tick: Tick | undefined,
86+
// subscribe_request_update: SubscribeRequestUpdate | undefined,
87+
// download_completed: DownloadTaskCompleted | undefined,
88+
// control_plane_response: ControlPlaneResp | undefined
89+
// }
90+
91+
export type RuntimeEvent =
92+
| { _kind: 'tick'; tick: Tick }
93+
| { _kind: 'subscribe_request_update'; subscribe_request_update: SubscribeRequestUpdate }
94+
| { _kind: 'download_completed'; download_completed: DownloadTaskCompleted }
95+
| { _kind: 'control_plane_response'; control_plane_response: ControlPlaneResp };
8396

84-
export type RuntimeEvent =
85-
| { _kind: 'tick', value: Tick }
86-
| { _kind: 'subscribe_request_update', value: SubscribeRequestUpdate }
87-
| { _kind: 'download_completed', value: DownloadTaskCompleted }
88-
| { _kind: 'control_plane_response', value: ControlPlaneResp }
8997

9098
export class FumeDragonsmouthRuntime {
9199
public stateMachine: FumaroleSM;
@@ -426,11 +434,91 @@ export class FumeDragonsmouthRuntime {
426434

427435

428436

429-
type RuntimeContext = {
437+
type FumaroleRuntimeArgs = {
430438
download_task_observer: Observer<DownloadTaskArgs>,
431439
control_plane_observer: Observer<ControlCommand>,
432-
state: FumaroleSM,
440+
dragonsmouth_observer: Observer<SubscribeUpdate>,
441+
sm: FumaroleSM,
442+
download_task_result_observable: Observable<DownloadTaskResult>,
443+
}
444+
445+
446+
447+
type FumaroleRuntimeCtx = {
448+
sm: FumaroleSM,
449+
commitInterval: number; // in seconds
450+
gcInterval: number;
451+
maxConcurrentDownload: number;
452+
lastCommit: number;
453+
inflight_downloads: Map<Slot, FumeDownloadRequest>,
454+
subscribeRequest: SubscribeRequest,
455+
}
456+
457+
458+
function onControlPlaneResponse(this: FumaroleRuntimeCtx, resp: ControlResponse) {
459+
if (resp.pollHist) {
460+
const pollHist = resp.pollHist;
461+
console.log(`Received poll history ${pollHist.events.length} events`);
462+
this.sm.queueBlockchainEvent(pollHist.events);
463+
} else if (resp.commitOffset) {
464+
const commitOffset = resp.commitOffset;
465+
console.log(`Received commit offset: ${JSON.stringify(commitOffset)}`);
466+
this.sm.updateCommittedOffset(commitOffset.offset);
467+
} else if (resp.pong) {
468+
console.log("Received pong");
469+
} else {
470+
throw new Error("Unexpected control response");
471+
}
433472
}
434473

474+
function onDownloadCompleted(this: FumaroleRuntimeCtx, result: DownloadTaskResult) {
475+
console.log("Download completed:", result);
476+
if (result.kind === "Ok") {
477+
const completed = result.completed!;
478+
console.log(
479+
`Download completed for slot ${completed.slot}, shard ${completed.shardIdx}, ${completed.totalEventDownloaded} total events`
480+
);
435481

482+
this.sm.makeSlotDownloadProgress(
483+
completed.slot,
484+
completed.shardIdx
485+
);
486+
} else {
487+
const slot = result.slot;
488+
const err = result.err;
489+
throw new Error(`Failed to download slot ${slot}: ${err!.message}`);
490+
}
491+
}
492+
493+
function onSubscribeRequestUpdate(this: FumaroleRuntimeCtx, update: SubscribeRequestUpdate) {
494+
this.subscribeRequest = update.new_subscribe_request;
495+
}
496+
497+
function runtime_next(this: FumaroleRuntimeCtx, ev: RuntimeEvent) {
498+
switch (ev._kind) {
499+
case 'tick':
500+
return;
501+
case 'subscribe_request_update':
502+
onSubscribeRequestUpdate.call(this, ev.subscribe_request_update);
503+
case 'download_completed':
504+
onDownloadCompleted.call(this, ev.download_completed);
505+
case 'control_plane_response':
506+
onControlPlaneResponse.call(this, ev.control_plane_response);
507+
}
508+
}
509+
510+
511+
export function runtimeObserverFactory(args: FumaroleRuntimeArgs): Observer<RuntimeEvent> {
512+
const {
513+
download_task_observer,
514+
control_plane_observer,
515+
dragonsmouth_observer,
516+
sm,
517+
download_task_result_observable,
518+
} = args;
519+
520+
return {
521+
522+
}
523+
}
436524

0 commit comments

Comments
 (0)