Skip to content

Commit dbe60ca

Browse files
[Feature] Add setHeader and removeHeader methods for the AleoNetworkClient (#1026)
* added setHeader and removeHeader methods for the AleoNetworkClient * added option to include AleoNetworkClientOptions in ProgramManager constructor as well as setHeader and removeHeader methods
1 parent 56cfce6 commit dbe60ca

File tree

4 files changed

+119
-4
lines changed

4 files changed

+119
-4
lines changed

sdk/src/network-client.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class AleoNetworkClient {
3737
headers: { [key: string]: string };
3838
account: Account | undefined;
3939

40-
constructor(host: string, options?: AleoNetworkClientOptions) {
40+
constructor(host: string, options?: AleoNetworkClientOptions | undefined) {
4141
this.host = host + "/%%NETWORK%%";
4242

4343
if (options && options.headers) {
@@ -94,6 +94,43 @@ class AleoNetworkClient {
9494
this.host = host + "/%%NETWORK%%";
9595
}
9696

97+
/**
98+
* Set a header in the `AleoNetworkClient`s header map
99+
*
100+
* @param {string} headerName The name of the header to set
101+
* @param {string} value The header value
102+
*
103+
* @example
104+
* import { AleoNetworkClient } from "@provablehq/sdk/mainnet.js";
105+
*
106+
* // Create a networkClient
107+
* const networkClient = new AleoNetworkClient();
108+
*
109+
* // Set the value of the `Accept-Language` header to `en-US`
110+
* networkClient.setHeader('Accept-Language', 'en-US');
111+
*/
112+
setHeader(headerName: string, value: string) {
113+
this.headers[headerName] = value;
114+
}
115+
116+
/**
117+
* Remove a header from the `AleoNetworkClient`s header map
118+
*
119+
* @param {string} headerName The name of the header to be removed
120+
*
121+
* @example
122+
* import { AleoNetworkClient } from "@provablehq/sdk/mainnet.js";
123+
*
124+
* // Create a networkClient
125+
* const networkClient = new AleoNetworkClient();
126+
*
127+
* // Remove the default `X-Aleo-SDK-Version` header
128+
* networkClient.removeHeader('X-Aleo-SDK-Version');
129+
*/
130+
removeHeader(headerName: string) {
131+
delete this.headers[headerName]
132+
}
133+
97134
/**
98135
* Fetches data from the Aleo network and returns it as a JSON object.
99136
*

sdk/src/program-manager.ts

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Account } from "./account";
2-
import { AleoNetworkClient, ProgramImports } from "./network-client";
2+
import { AleoNetworkClient, AleoNetworkClientOptions, ProgramImports } from "./network-client";
33

44
import { RecordProvider, RecordSearchParams } from "./record-provider";
55

@@ -90,9 +90,10 @@ class ProgramManager {
9090
host?: string | undefined,
9191
keyProvider?: FunctionKeyProvider | undefined,
9292
recordProvider?: RecordProvider | undefined,
93+
networkClientOptions?: AleoNetworkClientOptions | undefined,
9394
) {
9495
this.host = host ? host : "https://api.explorer.provable.com/v1";
95-
this.networkClient = new AleoNetworkClient(this.host);
96+
this.networkClient = new AleoNetworkClient(this.host, networkClientOptions);
9697

9798
this.keyProvider = keyProvider ? keyProvider : new AleoKeyProvider();
9899
this.recordProvider = recordProvider;
@@ -148,6 +149,43 @@ class ProgramManager {
148149
this.recordProvider = recordProvider;
149150
}
150151

152+
/**
153+
* Set a header in the `AleoNetworkClient`s header map
154+
*
155+
* @param {string} headerName The name of the header to set
156+
* @param {string} value The header value
157+
*
158+
* @example
159+
* import { ProgramManager } from "@provablehq/sdk/mainnet.js";
160+
*
161+
* // Create a ProgramManager
162+
* const programManager = new ProgramManager("https://api.explorer.provable.com/v1");
163+
*
164+
* // Set the value of the `Accept-Language` header to `en-US`
165+
* programManager.setHeader('Accept-Language', 'en-US');
166+
*/
167+
setHeader(headerName: string, value: string) {
168+
this.networkClient.headers[headerName] = value;
169+
}
170+
171+
/**
172+
* Remove a header from the `AleoNetworkClient`s header map
173+
*
174+
* @param {string} headerName The name of the header to be removed
175+
*
176+
* @example
177+
* import { ProgramManager } from "@provablehq/sdk/mainnet.js";
178+
*
179+
* // Create a ProgramManager
180+
* const programManager = new ProgramManager("https://api.explorer.provable.com/v1");
181+
*
182+
* // Remove the default `X-Aleo-SDK-Version` header
183+
* programManager.removeHeader('X-Aleo-SDK-Version');
184+
*/
185+
removeHeader(headerName: string) {
186+
delete this.networkClient.headers[headerName]
187+
}
188+
151189
/**
152190
* Builds a deployment transaction for submission to the Aleo network.
153191
*

sdk/tests/network-client.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,25 @@ describe("NodeConnection", () => {
214214
});
215215
});
216216

217+
describe("setHeader", () => {
218+
it("should correctly update the headers map", async () => {
219+
connection.setHeader('X-Test-Header', 'testvalue');
220+
expect(connection.headers['X-Test-Header']).equal('testvalue');
221+
})
222+
223+
it("should update existing header in map", async () => {
224+
connection.setHeader('X-Test-Header', 'secondtestvalue');
225+
expect(connection.headers['X-Test-Header']).equal('secondtestvalue');
226+
})
227+
})
228+
229+
describe("removeHeader", () => {
230+
it("should remove header from the map", async () => {
231+
connection.removeHeader('X-Test-Header');
232+
expect(connection.headers['X-Test-Header']).undefined;
233+
})
234+
})
235+
217236
describe("waitForTransactionConfirmation", () => {
218237
const mainnetAcceptedTx =
219238
"at1dl9lze8wscct0dee8x9tjnfmpjvj33hh23jcnp5f0ywjn5552yrsperzl9";

sdk/tests/program-manager.test.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,30 @@ import {
1010
import { Account, ExecutionResponse, OfflineQuery, ProgramManager, RecordPlaintext } from "../src/node";
1111

1212
describe('Program Manager', () => {
13-
const programManager = new ProgramManager("https://api.explorer.provable.com/v1", undefined, undefined);
13+
const programManager = new ProgramManager("https://api.explorer.provable.com/v1");
1414
programManager.setAccount(new Account({privateKey: statePathRecordOwnerPrivateKey}));
1515

16+
describe('Instantiate with AleoNetworkClientOptions', () => {
17+
it('should have the specified headers when instantiated', async () => {
18+
const newProgramManager = new ProgramManager("https://api.explorer.provable.com/v1", undefined, undefined, { headers: {'X-Test-Header': 'programManager'} });
19+
expect(Object.keys(newProgramManager.networkClient.headers).length).equal(1);
20+
expect(newProgramManager.networkClient.headers['X-Test-Header']).equal('programManager');
21+
expect(newProgramManager.networkClient.headers['X-Aleo-SDK-Version']).undefined;
22+
})
23+
});
24+
25+
describe('networkClient header methods', () => {
26+
it('should correctly udpdate the networkClient headers map', async () => {
27+
programManager.setHeader('X-Added-Header', 'programManager');
28+
expect(programManager.networkClient.headers['X-Added-Header']).equal('programManager');
29+
})
30+
31+
it('should remove header from the networkClient headers map', async () => {
32+
programManager.removeHeader('X-Added-Header');
33+
expect(programManager.networkClient.headers['X-Added-Header']).undefined;
34+
})
35+
})
36+
1637
describe('Execute offline', () => {
1738
it.skip('Program manager should execute offline and verify the resulting proof correctly', async () => {
1839
const execution_result = <ExecutionResponse>await programManager.run(helloProgram, "hello", ["5u32", "5u32"], true, undefined, undefined, undefined, undefined, undefined, undefined)

0 commit comments

Comments
 (0)