From 5ef4be8dc46925fe078b583be3c8cdd698b1eb52 Mon Sep 17 00:00:00 2001 From: Jordan Ribbink Date: Fri, 29 Nov 2024 01:20:53 -0800 Subject: [PATCH 1/6] stash --- .../subscribe/handlers/account-statuses.ts | 80 +++++++++++++++++++ packages/typedefs/src/index.ts | 1 + .../src/sdk-transport/subscriptions.ts | 16 +++- 3 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 packages/transport-http/src/subscribe/handlers/account-statuses.ts diff --git a/packages/transport-http/src/subscribe/handlers/account-statuses.ts b/packages/transport-http/src/subscribe/handlers/account-statuses.ts new file mode 100644 index 000000000..eb7b7ec18 --- /dev/null +++ b/packages/transport-http/src/subscribe/handlers/account-statuses.ts @@ -0,0 +1,80 @@ +import {SdkTransport} from "@onflow/typedefs" +import {BlockArgsModel, createSubscriptionHandler} from "./types" + +type BlockDigestArgsModel = BlockArgsModel + +type BlockDigestDataModel = { + // TODO: We do not know the data model types yet + block_digest: { + id: string + height: number + timestamp: string + } +} + +export const accountStatusesHandler = createSubscriptionHandler<{ + Topic: SdkTransport.SubscriptionTopic.BLOCK_DIGESTS + Args: SdkTransport.SubscriptionArguments + Data: SdkTransport.SubscriptionData + ArgsModel: BlockDigestArgsModel + DataModel: BlockDigestDataModel +}>({ + topic: SdkTransport.SubscriptionTopic.BLOCK_DIGESTS, + createSubscriber: (initialArgs, onData, onError) => { + let resumeArgs: SdkTransport.SubscriptionArguments = + { + ...initialArgs, + } + + return { + sendData(data: BlockDigestDataModel) { + // Parse the raw data + const parsedData: SdkTransport.SubscriptionData = + { + blockDigest: { + id: data.block_digest.id, + height: data.block_digest.height, + timestamp: data.block_digest.timestamp, + }, + } + + // Update the resume args + resumeArgs = { + blockStatus: resumeArgs.blockStatus, + startBlockId: data.block_digest.id + 1, + } + + onData(parsedData) + }, + sendError(error: Error) { + onError(error) + }, + encodeArgs( + args: SdkTransport.SubscriptionArguments + ) { + let encodedArgs: BlockArgsModel = { + block_status: args.blockStatus, + } + + if ("startBlockHeight" in args) { + return { + ...encodedArgs, + start_block_height: args.startBlockHeight, + } + } + + if ("startBlockId" in args) { + return { + ...encodedArgs, + start_block_id: args.startBlockId, + } + } + + return encodedArgs + }, + get connectionArgs() { + return resumeArgs + }, + } + }, +}) diff --git a/packages/typedefs/src/index.ts b/packages/typedefs/src/index.ts index 8a6728d8e..d2b8f4a59 100644 --- a/packages/typedefs/src/index.ts +++ b/packages/typedefs/src/index.ts @@ -437,6 +437,7 @@ export type NodeVersionInfo = { */ nodeRootBlockHeight: number } + export interface StreamConnection { on( channel: C, diff --git a/packages/typedefs/src/sdk-transport/subscriptions.ts b/packages/typedefs/src/sdk-transport/subscriptions.ts index b0ecf2f15..c0538f67a 100644 --- a/packages/typedefs/src/sdk-transport/subscriptions.ts +++ b/packages/typedefs/src/sdk-transport/subscriptions.ts @@ -1,4 +1,4 @@ -import {Block, BlockDigest} from ".." +import {Block, BlockDigest, Event, EventFilter} from ".." export type SubscriptionSchema = { [SubscriptionTopic.BLOCKS]: SchemaItem< @@ -13,11 +13,25 @@ export type SubscriptionSchema = { blockDigest: BlockDigest } > + [SubscriptionTopic.ACCOUNT_STATUSES]: SchemaItem< + { + accountStatusFilter: EventFilter + }, + { + // TODO: We do not know the data model types yet + accountStatus: { + blockId: string + height: number + account_events: Event[] + } + } + > } export enum SubscriptionTopic { BLOCKS = "blocks", BLOCK_DIGESTS = "block_digests", + ACCOUNT_STATUSES = "account_statuses", } type BlockArgs = From 8b1cdb0fc871d656fa32d5d5b6d24b737cd565be Mon Sep 17 00:00:00 2001 From: Jordan Ribbink Date: Fri, 29 Nov 2024 01:20:57 -0800 Subject: [PATCH 2/6] stash --- packages/transport-http/src/subscribe/subscribe.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/transport-http/src/subscribe/subscribe.ts b/packages/transport-http/src/subscribe/subscribe.ts index 49d0a71c5..323b1cc2d 100644 --- a/packages/transport-http/src/subscribe/subscribe.ts +++ b/packages/transport-http/src/subscribe/subscribe.ts @@ -1,7 +1,7 @@ import {SdkTransport} from "@onflow/typedefs" import {SubscriptionManager} from "./subscription-manager" import {blocksHandler} from "./handlers/blocks" -import {blockDigestsHandler} from "./handlers/block_digests" +import {blockDigestsHandler} from "./handlers/block-digests" const SUBSCRIPTION_HANDLERS = [blocksHandler, blockDigestsHandler] From 80ca2670a40d252e51b3f93cc47d0a73acd8ad8f Mon Sep 17 00:00:00 2001 From: Jordan Ribbink Date: Fri, 29 Nov 2024 09:11:40 -0800 Subject: [PATCH 3/6] stream --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4699e1f07..b22800d4d 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ ], "scripts": { "build": "lerna run build", - "start": "npm run build && lerna run start --parallel", + "start": "npm run build && lerna run start --parallel --stream", "test": "jest", "release": "npm run build && npm run changeset publish", "changeset": "changeset", From ed5a69db0e78ed9b67861bfe37f97710ff7af975 Mon Sep 17 00:00:00 2001 From: Jordan Ribbink Date: Fri, 29 Nov 2024 09:17:04 -0800 Subject: [PATCH 4/6] stream --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b22800d4d..5b6087857 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "./packages/*" ], "scripts": { - "build": "lerna run build", - "start": "npm run build && lerna run start --parallel --stream", + "build": "lerna run build --stream", + "start": "npm run build && lerna run start --parallel", "test": "jest", "release": "npm run build && npm run changeset publish", "changeset": "changeset", From d2b7d95dbf673d64050858f43303b1b4fc9a8541 Mon Sep 17 00:00:00 2001 From: Jordan Ribbink Date: Fri, 29 Nov 2024 09:28:00 -0800 Subject: [PATCH 5/6] fixup --- .../subscribe/handlers/account-statuses.ts | 88 ++++++++++++------- .../src/sdk-transport/subscriptions.ts | 16 +++- 2 files changed, 69 insertions(+), 35 deletions(-) diff --git a/packages/transport-http/src/subscribe/handlers/account-statuses.ts b/packages/transport-http/src/subscribe/handlers/account-statuses.ts index eb7b7ec18..3c898d41b 100644 --- a/packages/transport-http/src/subscribe/handlers/account-statuses.ts +++ b/packages/transport-http/src/subscribe/handlers/account-statuses.ts @@ -1,47 +1,71 @@ import {SdkTransport} from "@onflow/typedefs" -import {BlockArgsModel, createSubscriptionHandler} from "./types" +import {createSubscriptionHandler} from "./types" +import {EventsArgsModel} from "./events" -type BlockDigestArgsModel = BlockArgsModel +type AccountStatusesArgs = + SdkTransport.SubscriptionArguments -type BlockDigestDataModel = { +type AccountStatusesData = + SdkTransport.SubscriptionData + +type AccountStatusesArgsModel = EventsArgsModel + +type AccountStatusesDataModel = { // TODO: We do not know the data model types yet - block_digest: { - id: string + account_status: { + block_id: string height: number - timestamp: string + account_events: { + block_id: string + block_height: number + block_timestamp: string + type: string + transaction_id: string + transaction_index: number + event_index: number + payload: string + }[] } } export const accountStatusesHandler = createSubscriptionHandler<{ - Topic: SdkTransport.SubscriptionTopic.BLOCK_DIGESTS - Args: SdkTransport.SubscriptionArguments - Data: SdkTransport.SubscriptionData - ArgsModel: BlockDigestArgsModel - DataModel: BlockDigestDataModel + Topic: SdkTransport.SubscriptionTopic.ACCOUNT_STATUSES + Args: SdkTransport.SubscriptionArguments + Data: SdkTransport.SubscriptionData + ArgsModel: AccountStatusesArgsModel + DataModel: AccountStatusesDataModel }>({ - topic: SdkTransport.SubscriptionTopic.BLOCK_DIGESTS, + topic: SdkTransport.SubscriptionTopic.ACCOUNT_STATUSES, createSubscriber: (initialArgs, onData, onError) => { - let resumeArgs: SdkTransport.SubscriptionArguments = - { - ...initialArgs, - } + let resumeArgs: AccountStatusesArgs = { + ...initialArgs, + } return { - sendData(data: BlockDigestDataModel) { + sendData(data: AccountStatusesDataModel) { // Parse the raw data - const parsedData: SdkTransport.SubscriptionData = - { - blockDigest: { - id: data.block_digest.id, - height: data.block_digest.height, - timestamp: data.block_digest.timestamp, - }, - } + const parsedData: AccountStatusesData = { + accountStatus: { + blockId: data.account_status.block_id, + height: data.account_status.height, + accountEvents: data.account_status.account_events.map(event => ({ + blockId: event.block_id, + blockHeight: event.block_height, + blockTimestamp: event.block_timestamp, + type: event.type, + transactionId: event.transaction_id, + transactionIndex: event.transaction_index, + eventIndex: event.event_index, + payload: event.payload, + })), + }, + } // Update the resume args resumeArgs = { - blockStatus: resumeArgs.blockStatus, - startBlockId: data.block_digest.id + 1, + ...resumeArgs, + startBlockHeight: data.account_status.height + 1, + startBlockId: undefined, } onData(parsedData) @@ -49,11 +73,11 @@ export const accountStatusesHandler = createSubscriptionHandler<{ sendError(error: Error) { onError(error) }, - encodeArgs( - args: SdkTransport.SubscriptionArguments - ) { - let encodedArgs: BlockArgsModel = { - block_status: args.blockStatus, + encodeArgs(args: AccountStatusesArgs) { + let encodedArgs: AccountStatusesArgsModel = { + event_types: args.filter?.eventTypes, + addresses: args.filter?.addresses, + contracts: args.filter?.contracts, } if ("startBlockHeight" in args) { diff --git a/packages/typedefs/src/sdk-transport/subscriptions.ts b/packages/typedefs/src/sdk-transport/subscriptions.ts index 9b619a4d7..a7a1ac455 100644 --- a/packages/typedefs/src/sdk-transport/subscriptions.ts +++ b/packages/typedefs/src/sdk-transport/subscriptions.ts @@ -14,15 +14,25 @@ export type SubscriptionSchema = { } > [SubscriptionTopic.ACCOUNT_STATUSES]: SchemaItem< - { - accountStatusFilter: EventFilter + ( + | { + startBlockId: string + } + | { + startBlockHeight: number + } + | {} + ) & { + filter: EventFilter }, { // TODO: We do not know the data model types yet accountStatus: { blockId: string height: number - account_events: Event[] + accountEvents: (Omit & { + payload: string + })[] } } > From 17036c760c1658c268f2531dda88c550fbbc5c78 Mon Sep 17 00:00:00 2001 From: Jordan Ribbink Date: Mon, 2 Dec 2024 15:41:26 -0800 Subject: [PATCH 6/6] fix build --- .../src/subscribe/handlers/account-statuses.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/transport-http/src/subscribe/handlers/account-statuses.ts b/packages/transport-http/src/subscribe/handlers/account-statuses.ts index 3c898d41b..74f8763af 100644 --- a/packages/transport-http/src/subscribe/handlers/account-statuses.ts +++ b/packages/transport-http/src/subscribe/handlers/account-statuses.ts @@ -1,6 +1,6 @@ import {SdkTransport} from "@onflow/typedefs" import {createSubscriptionHandler} from "./types" -import {EventsArgsModel} from "./events" +import {EventsArgsDto} from "./events" type AccountStatusesArgs = SdkTransport.SubscriptionArguments @@ -8,9 +8,9 @@ type AccountStatusesArgs = type AccountStatusesData = SdkTransport.SubscriptionData -type AccountStatusesArgsModel = EventsArgsModel +type AccountStatusesArgsDto = EventsArgsDto -type AccountStatusesDataModel = { +type AccountStatusesDataDto = { // TODO: We do not know the data model types yet account_status: { block_id: string @@ -32,8 +32,8 @@ export const accountStatusesHandler = createSubscriptionHandler<{ Topic: SdkTransport.SubscriptionTopic.ACCOUNT_STATUSES Args: SdkTransport.SubscriptionArguments Data: SdkTransport.SubscriptionData - ArgsModel: AccountStatusesArgsModel - DataModel: AccountStatusesDataModel + ArgsDto: AccountStatusesArgsDto + DataDto: AccountStatusesDataDto }>({ topic: SdkTransport.SubscriptionTopic.ACCOUNT_STATUSES, createSubscriber: (initialArgs, onData, onError) => { @@ -42,7 +42,7 @@ export const accountStatusesHandler = createSubscriptionHandler<{ } return { - sendData(data: AccountStatusesDataModel) { + onData(data: AccountStatusesDataDto) { // Parse the raw data const parsedData: AccountStatusesData = { accountStatus: { @@ -70,11 +70,11 @@ export const accountStatusesHandler = createSubscriptionHandler<{ onData(parsedData) }, - sendError(error: Error) { + onError(error: Error) { onError(error) }, - encodeArgs(args: AccountStatusesArgs) { - let encodedArgs: AccountStatusesArgsModel = { + argsToDto(args: AccountStatusesArgs) { + let encodedArgs: AccountStatusesArgsDto = { event_types: args.filter?.eventTypes, addresses: args.filter?.addresses, contracts: args.filter?.contracts,