From b565dcca3a32778e0b1b0d7cdccadd287b614576 Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Tue, 17 Jan 2023 22:52:20 -0800 Subject: [PATCH 1/4] changed startLedger and endLedger of getEvents to be string types for compatibility with rpc interface --- src/server.ts | 8 +++---- test/unit/server/get_events_test.js | 34 ++++++++++++++--------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/server.ts b/src/server.ts index c5741d5d..84ef5d05 100644 --- a/src/server.ts +++ b/src/server.ts @@ -202,8 +202,8 @@ export class Server { * * @example * server.getEvents( - * 1000, - * 1010, + * "1000", + * "1010", * [ * { * type: "contract", @@ -229,8 +229,8 @@ export class Server { * of the events matching the given event filters. */ public async getEvents( - startLedger: number, - endLedger: number, + startLedger: string, + endLedger: string, filters?: SorobanRpc.EventFilter[], cursor?: string, limit?: number, diff --git a/test/unit/server/get_events_test.js b/test/unit/server/get_events_test.js index 29264448..01cdb838 100644 --- a/test/unit/server/get_events_test.js +++ b/test/unit/server/get_events_test.js @@ -16,16 +16,16 @@ describe("Server#getEvents", function() { setupMock( this.axiosMock, { - endLedger: 2, + endLedger: "2", filters: [], pagination: {}, - startLedger: 1, + startLedger: "1", }, result, ); this.server - .getEvents(1, 2) + .getEvents("1", "2") .then(function(response) { expect(response).to.be.deep.equal(result); done(); @@ -41,8 +41,8 @@ describe("Server#getEvents", function() { setupMock( this.axiosMock, { - startLedger: 1, - endLedger: 10, + startLedger: "1", + endLedger: "10", filters: [ { topics: [["*", "*"]], @@ -55,8 +55,8 @@ describe("Server#getEvents", function() { this.server .getEvents( - 1, - 10, [{ + "1", + "10", [{ topics: [["*", "*"]], }], ) @@ -76,8 +76,8 @@ describe("Server#getEvents", function() { setupMock( this.axiosMock, { - startLedger: 1, - endLedger: 10, + startLedger: "1", + endLedger: "10", filters: [ { topics: [["AAAABQAAAAh0cmFuc2Zlcg==", "AAAAAQB6Mcc="]], @@ -89,7 +89,7 @@ describe("Server#getEvents", function() { ); this.server - .getEvents(1, 10, [{ + .getEvents("1", "10", [{ topics: [["AAAABQAAAAh0cmFuc2Zlcg==", "AAAAAQB6Mcc="]], }]) .then(function(response) { @@ -109,8 +109,8 @@ describe("Server#getEvents", function() { setupMock( this.axiosMock, { - startLedger: 1, - endLedger: 2, + startLedger: "1", + endLedger: "2", filters: [ { topics: [["AAAABQAAAAh0cmFuc2Zlcg==", "*"]], @@ -122,7 +122,7 @@ describe("Server#getEvents", function() { ); this.server - .getEvents(1, 2, [{ + .getEvents("1", "2", [{ topics: [["AAAABQAAAAh0cmFuc2Zlcg==", "*"]], }]) .then(function(response) { @@ -142,8 +142,8 @@ describe("Server#getEvents", function() { setupMock( this.axiosMock, { - startLedger: 1, - endLedger: 2, + startLedger: "1", + endLedger: "2", filters: [ { topics: [["*", "*"]], @@ -159,8 +159,8 @@ describe("Server#getEvents", function() { this.server .getEvents( - 1, - 2, + "1", + "2", [{ topics: [["*", "*"]] }], From c6ed5a4b7d8549ee6846efa4797476ea99466cce Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Wed, 18 Jan 2023 00:20:46 -0800 Subject: [PATCH 2/4] removed params array usage if only one param value, rpc json unmarshal was not working when params was sent as array with one element --- src/jsonrpc.ts | 6 +++++- test/unit/server/get_account_test.js | 2 +- test/unit/server/get_events_test.js | 3 ++- test/unit/server/get_transaction_status_test.js | 2 +- test/unit/server/send_transaction_test.js | 2 +- test/unit/server/simulate_transaction_test.js | 2 +- 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/jsonrpc.ts b/src/jsonrpc.ts index dad5f657..efbd8a3a 100644 --- a/src/jsonrpc.ts +++ b/src/jsonrpc.ts @@ -32,12 +32,16 @@ export async function post( method: string, ...params: any ): Promise { + let jsonParams = params; + if (params.length === 1) { + jsonParams = params[0]; + } const response = await axios.post>(url, { jsonrpc: "2.0", // TODO: Generate a unique request id id: 1, method, - params, + params: jsonParams, }); if (hasOwnProperty(response.data, "error")) { throw response.data.error; diff --git a/test/unit/server/get_account_test.js b/test/unit/server/get_account_test.js index 90e080cf..ade0e452 100644 --- a/test/unit/server/get_account_test.js +++ b/test/unit/server/get_account_test.js @@ -26,7 +26,7 @@ describe('Server#getAccount', function() { jsonrpc: '2.0', id: 1, method: 'getAccount', - params: [address], + params: address, } ) .returns(Promise.resolve({ data: { result } })); diff --git a/test/unit/server/get_events_test.js b/test/unit/server/get_events_test.js index 01cdb838..b4a707ad 100644 --- a/test/unit/server/get_events_test.js +++ b/test/unit/server/get_events_test.js @@ -190,13 +190,14 @@ function filterEventsByLedger(events, start, end) { } function setupMock(axiosMock, params, result) { + axiosMock .expects("post") .withArgs(serverUrl, { jsonrpc: "2.0", id: 1, method: "getEvents", - params: [params], + params: params, }) .returns(Promise.resolve({ data: { result } })); } diff --git a/test/unit/server/get_transaction_status_test.js b/test/unit/server/get_transaction_status_test.js index db19c1b0..88806667 100644 --- a/test/unit/server/get_transaction_status_test.js +++ b/test/unit/server/get_transaction_status_test.js @@ -44,7 +44,7 @@ describe('Server#getTransactionStatus', function() { jsonrpc: '2.0', id: 1, method: 'getTransactionStatus', - params: [this.hash], + params: this.hash, } ) .returns(Promise.resolve({ data: {id: 1, error: {code: 404}} })); diff --git a/test/unit/server/send_transaction_test.js b/test/unit/server/send_transaction_test.js index 67032dfa..aedfe2f6 100644 --- a/test/unit/server/send_transaction_test.js +++ b/test/unit/server/send_transaction_test.js @@ -44,7 +44,7 @@ describe('Server#sendTransaction', function() { jsonrpc: '2.0', id: 1, method: 'sendTransaction', - params: [this.blob], + params: this.blob, } ) .returns(Promise.resolve({ data: {id: 1, result: {id: this.hash, status: 'pending'}} })); diff --git a/test/unit/server/simulate_transaction_test.js b/test/unit/server/simulate_transaction_test.js index 61335d68..790853f9 100644 --- a/test/unit/server/simulate_transaction_test.js +++ b/test/unit/server/simulate_transaction_test.js @@ -59,7 +59,7 @@ describe('Server#simulateTransaction', function() { jsonrpc: '2.0', id: 1, method: 'simulateTransaction', - params: [this.blob], + params: this.blob, } ) .returns(Promise.resolve({ data: {id: 1, result} })); From 46b61c1211803ad1cbb38f2e5b99e10d199d79be Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Wed, 18 Jan 2023 13:30:28 -0800 Subject: [PATCH 3/4] clean up the fix for passing string ledgers and object as params --- src/jsonrpc.ts | 7 ++++++- src/server.ts | 8 ++++---- test/unit/server/get_account_test.js | 2 +- test/unit/server/get_events_test.js | 15 +++++++-------- test/unit/server/get_transaction_status_test.js | 2 +- test/unit/server/send_transaction_test.js | 2 +- test/unit/server/simulate_transaction_test.js | 2 +- 7 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/jsonrpc.ts b/src/jsonrpc.ts index efbd8a3a..f928465e 100644 --- a/src/jsonrpc.ts +++ b/src/jsonrpc.ts @@ -33,7 +33,12 @@ export async function post( ...params: any ): Promise { let jsonParams = params; - if (params.length === 1) { + if ( + params.length === 1 && + typeof params[0] === "object" && params[0] !== null + ) { + // if only one param and it's a js object, then pass the object. + // otherwise rpc server throws unmarshal error on jsonrpc params. jsonParams = params[0]; } const response = await axios.post>(url, { diff --git a/src/server.ts b/src/server.ts index 84ef5d05..67d0f743 100644 --- a/src/server.ts +++ b/src/server.ts @@ -229,8 +229,8 @@ export class Server { * of the events matching the given event filters. */ public async getEvents( - startLedger: string, - endLedger: string, + startLedger: number, + endLedger: number, filters?: SorobanRpc.EventFilter[], cursor?: string, limit?: number, @@ -244,8 +244,8 @@ export class Server { // // It also means this library will rely on the XDR definitions. return await jsonrpc.post(this.serverURL.toString(), "getEvents", { - startLedger, - endLedger, + startLedger: String(startLedger), + endLedger: String(endLedger), filters: filters ?? [], pagination: { ...(cursor && { cursor }), // add fields only if defined diff --git a/test/unit/server/get_account_test.js b/test/unit/server/get_account_test.js index ade0e452..90e080cf 100644 --- a/test/unit/server/get_account_test.js +++ b/test/unit/server/get_account_test.js @@ -26,7 +26,7 @@ describe('Server#getAccount', function() { jsonrpc: '2.0', id: 1, method: 'getAccount', - params: address, + params: [address], } ) .returns(Promise.resolve({ data: { result } })); diff --git a/test/unit/server/get_events_test.js b/test/unit/server/get_events_test.js index b4a707ad..f0b613cc 100644 --- a/test/unit/server/get_events_test.js +++ b/test/unit/server/get_events_test.js @@ -25,7 +25,7 @@ describe("Server#getEvents", function() { ); this.server - .getEvents("1", "2") + .getEvents(1, 2) .then(function(response) { expect(response).to.be.deep.equal(result); done(); @@ -55,8 +55,8 @@ describe("Server#getEvents", function() { this.server .getEvents( - "1", - "10", [{ + 1, + 10, [{ topics: [["*", "*"]], }], ) @@ -89,7 +89,7 @@ describe("Server#getEvents", function() { ); this.server - .getEvents("1", "10", [{ + .getEvents(1, 10, [{ topics: [["AAAABQAAAAh0cmFuc2Zlcg==", "AAAAAQB6Mcc="]], }]) .then(function(response) { @@ -122,7 +122,7 @@ describe("Server#getEvents", function() { ); this.server - .getEvents("1", "2", [{ + .getEvents(1, 2, [{ topics: [["AAAABQAAAAh0cmFuc2Zlcg==", "*"]], }]) .then(function(response) { @@ -159,8 +159,8 @@ describe("Server#getEvents", function() { this.server .getEvents( - "1", - "2", + 1, + 2, [{ topics: [["*", "*"]] }], @@ -190,7 +190,6 @@ function filterEventsByLedger(events, start, end) { } function setupMock(axiosMock, params, result) { - axiosMock .expects("post") .withArgs(serverUrl, { diff --git a/test/unit/server/get_transaction_status_test.js b/test/unit/server/get_transaction_status_test.js index 88806667..db19c1b0 100644 --- a/test/unit/server/get_transaction_status_test.js +++ b/test/unit/server/get_transaction_status_test.js @@ -44,7 +44,7 @@ describe('Server#getTransactionStatus', function() { jsonrpc: '2.0', id: 1, method: 'getTransactionStatus', - params: this.hash, + params: [this.hash], } ) .returns(Promise.resolve({ data: {id: 1, error: {code: 404}} })); diff --git a/test/unit/server/send_transaction_test.js b/test/unit/server/send_transaction_test.js index aedfe2f6..67032dfa 100644 --- a/test/unit/server/send_transaction_test.js +++ b/test/unit/server/send_transaction_test.js @@ -44,7 +44,7 @@ describe('Server#sendTransaction', function() { jsonrpc: '2.0', id: 1, method: 'sendTransaction', - params: this.blob, + params: [this.blob], } ) .returns(Promise.resolve({ data: {id: 1, result: {id: this.hash, status: 'pending'}} })); diff --git a/test/unit/server/simulate_transaction_test.js b/test/unit/server/simulate_transaction_test.js index 790853f9..61335d68 100644 --- a/test/unit/server/simulate_transaction_test.js +++ b/test/unit/server/simulate_transaction_test.js @@ -59,7 +59,7 @@ describe('Server#simulateTransaction', function() { jsonrpc: '2.0', id: 1, method: 'simulateTransaction', - params: this.blob, + params: [this.blob], } ) .returns(Promise.resolve({ data: {id: 1, result} })); From 4cb61f2e57386cfe62a60e690de041130e7e0503 Mon Sep 17 00:00:00 2001 From: Shawn Reuland Date: Fri, 20 Jan 2023 10:27:31 -0800 Subject: [PATCH 4/4] #38: new jsonrpc.postObject method for getEvents to use --- src/jsonrpc.ts | 34 +++++++++++++++++++++++++--------- src/server.ts | 2 +- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/jsonrpc.ts b/src/jsonrpc.ts index f928465e..e9876944 100644 --- a/src/jsonrpc.ts +++ b/src/jsonrpc.ts @@ -27,26 +27,42 @@ export interface Error { data?: E; } +/** + * Sends the jsonrpc 'params' as an array. + */ export async function post( url: string, method: string, ...params: any ): Promise { - let jsonParams = params; - if ( - params.length === 1 && - typeof params[0] === "object" && params[0] !== null - ) { - // if only one param and it's a js object, then pass the object. - // otherwise rpc server throws unmarshal error on jsonrpc params. - jsonParams = params[0]; + const response = await axios.post>(url, { + jsonrpc: "2.0", + // TODO: Generate a unique request id + id: 1, + method, + params, + }); + if (hasOwnProperty(response.data, "error")) { + throw response.data.error; + } else { + return response.data?.result; } +} + +/** + * Sends the jsonrpc 'params' as the single 'param' obj, no array wrapper is applied. + */ +export async function postObject( + url: string, + method: string, + param: any, +): Promise { const response = await axios.post>(url, { jsonrpc: "2.0", // TODO: Generate a unique request id id: 1, method, - params: jsonParams, + params: param, }); if (hasOwnProperty(response.data, "error")) { throw response.data.error; diff --git a/src/server.ts b/src/server.ts index 67d0f743..141a6f70 100644 --- a/src/server.ts +++ b/src/server.ts @@ -243,7 +243,7 @@ export class Server { // The difficulty comes in matching up the correct integer primitives. // // It also means this library will rely on the XDR definitions. - return await jsonrpc.post(this.serverURL.toString(), "getEvents", { + return await jsonrpc.postObject(this.serverURL.toString(), "getEvents", { startLedger: String(startLedger), endLedger: String(endLedger), filters: filters ?? [],