Skip to content

Commit fa93255

Browse files
committed
feat(cardano-services-client): add a debug parameter to handle resolution call
1 parent 9c6375d commit fa93255

File tree

4 files changed

+56
-5
lines changed

4 files changed

+56
-5
lines changed

packages/cardano-services-client/src/HandleProvider/handleHttpProvider.ts

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ export const handleHttpProvider = (config: CreateHttpProviderConfig<HandleProvid
1111
createHttpProvider<HandleProvider>({
1212
...config,
1313
apiVersion: config.apiVersion || apiVersion.handle,
14+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
15+
modifyData: (method: string | number | symbol, data: any) =>
16+
method === 'resolveHandles' ? { ...data, check_handle: true } : { ...data },
1417
paths: handleProviderPaths,
1518
serviceSlug: 'handle'
1619
});

packages/cardano-services-client/src/HttpProvider.ts

+12-3
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ export interface HttpProviderConfig<T extends Provider> {
3434

3535
/** Slug used in the URL path */
3636
serviceSlug: string;
37+
38+
/** Function to modify the input data before performing the HTTP request. */
39+
modifyData?: (method: string | number | symbol, data: any) => any;
3740
}
3841

3942
/** The subset of parameters from HttpProviderConfig that must be set by the client code. */
@@ -55,6 +58,8 @@ const transformRequest: AxiosRequestTransformer = (data) => {
5558
return JSON.stringify(toSerializableObject(data));
5659
};
5760

61+
const defaultModifyData = (_method: string | number | symbol, data: any) => ({ ...data });
62+
5863
/**
5964
* Creates a HTTP client for specified provider type, following some conventions:
6065
* - All methods use POST requests
@@ -73,9 +78,12 @@ export const createHttpProvider = <T extends Provider>({
7378
paths,
7479
adapter,
7580
logger,
81+
modifyData,
7682
serviceSlug
77-
}: HttpProviderConfig<T>): T =>
78-
new Proxy<T>({} as T, {
83+
}: HttpProviderConfig<T>): T => {
84+
const internalModifyData = modifyData || defaultModifyData;
85+
86+
return new Proxy<T>({} as T, {
7987
// eslint-disable-next-line sonarjs/cognitive-complexity
8088
get(_, prop) {
8189
const method = prop as keyof T;
@@ -87,7 +95,7 @@ export const createHttpProvider = <T extends Provider>({
8795
...axiosOptions,
8896
adapter,
8997
baseURL: `${baseUrl.replace(/\/$/, '')}/v${apiVersion}/${serviceSlug}`,
90-
data: { ...args[0] },
98+
data: internalModifyData(method, args[0]),
9199
headers: {
92100
...axiosOptions?.headers,
93101
'Content-Type': 'application/json',
@@ -127,3 +135,4 @@ export const createHttpProvider = <T extends Provider>({
127135
return prop in paths;
128136
}
129137
});
138+
};

packages/cardano-services-client/test/HandleProvider/handleHttpProvider.test.ts

+11
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,15 @@ describe('handleHttpProvider', () => {
2424
axiosMock.onPost().replyOnce(200, []);
2525
await expect(provider.resolveHandles({ handles: [] })).resolves.toEqual([]);
2626
});
27+
28+
test('resolve handles has one more parameter', async () => {
29+
const provider = handleHttpProvider(config);
30+
31+
axiosMock.onPost().reply((cfg) => [200, cfg.data]);
32+
33+
await expect(provider.resolveHandles({ handles: ['test'] })).resolves.toEqual({
34+
check_handle: true,
35+
handles: ['test']
36+
});
37+
});
2738
});

packages/cardano-services-client/test/HttpProvider.test.ts

+30-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ const packageJson = require(path.join(__dirname, '..', 'package.json'));
1313

1414
type ComplexArg2 = { map: Map<string, Uint8Array> };
1515
type ComplexResponse = Map<bigint, Uint8Array>[];
16+
type OptionalParameters = { num?: number; str?: string };
1617
interface TestProvider extends Provider {
1718
noArgsEmptyReturn(): Promise<void>;
1819
complexArgsAndReturn({ arg1, arg2 }: { arg1: bigint; arg2: ComplexArg2 }): Promise<ComplexResponse>;
20+
optionalParameters(args: OptionalParameters): Promise<OptionalParameters>;
1921
}
2022

2123
const apiVersion = '1.0.0';
@@ -34,7 +36,8 @@ const createStubHttpProviderServer = async (port: number, urlPath: string, handl
3436
const stubProviderPaths = {
3537
complexArgsAndReturn: '/complex',
3638
healthCheck: '/health',
37-
noArgsEmptyReturn: '/simple'
39+
noArgsEmptyReturn: '/simple',
40+
optionalParameters: '/optional'
3841
};
3942

4043
describe('createHttpProvider', () => {
@@ -43,7 +46,7 @@ describe('createHttpProvider', () => {
4346
let closeServer: () => Promise<unknown>;
4447

4548
const createTxSubmitProviderClient = (
46-
config: Pick<HttpProviderConfig<TestProvider>, 'axiosOptions' | 'mapError'> = {}
49+
config: Pick<HttpProviderConfig<TestProvider>, 'axiosOptions' | 'mapError' | 'modifyData'> = {}
4750
) =>
4851
createHttpProvider<TestProvider>({
4952
apiVersion,
@@ -113,6 +116,31 @@ describe('createHttpProvider', () => {
113116
});
114117
});
115118

119+
describe('modifyData', () => {
120+
beforeEach(
121+
async () =>
122+
(closeServer = await createStubHttpProviderServer(port, stubProviderPaths.optionalParameters, (req, res) =>
123+
res.send(req.body)
124+
))
125+
);
126+
127+
it("defaultModifyData doesn't change the input data", async () => {
128+
const provider = createTxSubmitProviderClient();
129+
const data = { num: 23 };
130+
131+
const response = await provider.optionalParameters(data);
132+
expect(response).toEqual(data);
133+
});
134+
135+
it('modifyData changes the input data as expected', async () => {
136+
const provider = createTxSubmitProviderClient({ modifyData: (_, data) => ({ ...data, added: true }) });
137+
const data = { num: 23 };
138+
139+
const response = await provider.optionalParameters(data);
140+
expect(response).toEqual({ ...data, added: true });
141+
});
142+
});
143+
116144
describe('errors', () => {
117145
describe('connection errors', () => {
118146
it('maps ECONNREFUSED and ENOTFOUND to ProviderError{ConnectionFailure}', async () => {

0 commit comments

Comments
 (0)