diff --git a/README.md b/README.md index 6dd246f..c4a52a7 100644 --- a/README.md +++ b/README.md @@ -77,8 +77,8 @@ stream.latestTradeDetail$.subscribe((v) => {}) - [ ] Query historical transaction orders * Listen Key - [x] Generate Listen Key - - [ ] Extend Listen Key Validity period - - [ ] Delete Listen Key + - [x] Extend Listen Key Validity period + - [x] Delete Listen Key * Socket API * Market Data - [ ] Subscribe Market Depth Data diff --git a/src/bingx-client/services/listen-key.service.spec.ts b/src/bingx-client/services/listen-key.service.spec.ts new file mode 100644 index 0000000..d4acf61 --- /dev/null +++ b/src/bingx-client/services/listen-key.service.spec.ts @@ -0,0 +1,61 @@ +import { ApiAccount } from 'bingx-api/bingx'; +import { BingxDeleteListenKeyEndpoint } from 'bingx-api/bingx/endpoints/bingx-delete-listen-key-endpoint'; +import { BingxExtendListenKeyEndpoint } from 'bingx-api/bingx/endpoints/bingx-extend-listen-key-endpoint'; +import { BingxGenerateListenKeyEndpoint } from 'bingx-api/bingx/endpoints/bingx-generate-listen-key-endpoint'; +import { RequestExecutorInterface } from 'bingx-api/bingx/request-executor/request-executor.interface'; +import { ListenKeyService } from './listen-key.service'; + +describe('listen key service', () => { + let execute: jest.Mock; + let service: ListenKeyService; + const account = new ApiAccount('api-key', 'secret-key'); + + beforeEach(() => { + execute = jest.fn().mockResolvedValue(undefined); + service = new ListenKeyService({ + execute, + } as RequestExecutorInterface); + }); + + it('must execute generate listen key endpoint', async () => { + await service.generateListenKey(account); + + expect(execute).toHaveBeenCalledWith( + expect.any(BingxGenerateListenKeyEndpoint), + ); + }); + + it('must execute extend listen key validity period endpoint', async () => { + await service.extendListenKeyValidityPeriod('listen-key', account); + + expect(execute).toHaveBeenCalledWith( + expect.any(BingxExtendListenKeyEndpoint), + ); + + const endpoint = execute.mock.calls[0][0] as BingxExtendListenKeyEndpoint; + expect(endpoint.method()).toBe('put'); + expect(endpoint.path()).toBe('/openApi/user/auth/userDataStream'); + expect(endpoint.parameters().asRecord()).toEqual( + expect.objectContaining({ + listenKey: 'listen-key', + }), + ); + }); + + it('must execute delete listen key endpoint', async () => { + await service.deleteListenKey('listen-key', account); + + expect(execute).toHaveBeenCalledWith( + expect.any(BingxDeleteListenKeyEndpoint), + ); + + const endpoint = execute.mock.calls[0][0] as BingxDeleteListenKeyEndpoint; + expect(endpoint.method()).toBe('delete'); + expect(endpoint.path()).toBe('/openApi/user/auth/userDataStream'); + expect(endpoint.parameters().asRecord()).toEqual( + expect.objectContaining({ + listenKey: 'listen-key', + }), + ); + }); +}); diff --git a/src/bingx-client/services/listen-key.service.ts b/src/bingx-client/services/listen-key.service.ts index 6535d93..e0fb771 100644 --- a/src/bingx-client/services/listen-key.service.ts +++ b/src/bingx-client/services/listen-key.service.ts @@ -1,4 +1,6 @@ import { AccountInterface } from 'bingx-api/bingx/account/account.interface'; +import { BingxDeleteListenKeyEndpoint } from 'bingx-api/bingx/endpoints/bingx-delete-listen-key-endpoint'; +import { BingxExtendListenKeyEndpoint } from 'bingx-api/bingx/endpoints/bingx-extend-listen-key-endpoint'; import { BingxGenerateListenKeyEndpoint } from 'bingx-api/bingx/endpoints/bingx-generate-listen-key-endpoint'; import { BingxGenerateListenKeyResponse } from 'bingx-api/bingx/endpoints/bingx-generate-listen-key-response'; import { RequestExecutorInterface } from 'bingx-api/bingx/request-executor/request-executor.interface'; @@ -13,4 +15,22 @@ export class ListenKeyService { new BingxGenerateListenKeyEndpoint(account), ); } + + async extendListenKeyValidityPeriod( + listenKey: string, + account: AccountInterface, + ): Promise { + return this.requestExecutor.execute( + new BingxExtendListenKeyEndpoint(listenKey, account), + ); + } + + async deleteListenKey( + listenKey: string, + account: AccountInterface, + ): Promise { + return this.requestExecutor.execute( + new BingxDeleteListenKeyEndpoint(listenKey, account), + ); + } } diff --git a/src/bingx/endpoints/bingx-delete-listen-key-endpoint.ts b/src/bingx/endpoints/bingx-delete-listen-key-endpoint.ts new file mode 100644 index 0000000..82652c4 --- /dev/null +++ b/src/bingx/endpoints/bingx-delete-listen-key-endpoint.ts @@ -0,0 +1,33 @@ +import { AccountInterface } from 'bingx-api/bingx/account/account.interface'; +import { DefaultSignatureParameters } from 'bingx-api/bingx/account/default-signature-parameters'; +import { SignatureParametersInterface } from 'bingx-api/bingx/account/signature-parameters.interface'; +import { Endpoint } from 'bingx-api/bingx/endpoints/endpoint'; +import { EndpointInterface } from 'bingx-api/bingx/endpoints/endpoint.interface'; + +export class BingxDeleteListenKeyEndpoint + extends Endpoint + implements EndpointInterface +{ + constructor( + private readonly listenKey: string, + account: AccountInterface, + ) { + super(account); + } + + method(): 'get' | 'post' | 'put' | 'patch' | 'delete' { + return 'delete'; + } + + parameters(): SignatureParametersInterface { + return new DefaultSignatureParameters({ + listenKey: this.listenKey, + }); + } + + path(): string { + return '/openApi/user/auth/userDataStream'; + } + + readonly t!: R; +} diff --git a/src/bingx/endpoints/bingx-extend-listen-key-endpoint.ts b/src/bingx/endpoints/bingx-extend-listen-key-endpoint.ts index a71c3b4..32a4ca4 100644 --- a/src/bingx/endpoints/bingx-extend-listen-key-endpoint.ts +++ b/src/bingx/endpoints/bingx-extend-listen-key-endpoint.ts @@ -1,10 +1,8 @@ -import { - AccountInterface, - DefaultSignatureParameters, - Endpoint, - EndpointInterface, - SignatureParametersInterface, -} from 'bingx-api/bingx'; +import { AccountInterface } from 'bingx-api/bingx/account/account.interface'; +import { DefaultSignatureParameters } from 'bingx-api/bingx/account/default-signature-parameters'; +import { SignatureParametersInterface } from 'bingx-api/bingx/account/signature-parameters.interface'; +import { Endpoint } from 'bingx-api/bingx/endpoints/endpoint'; +import { EndpointInterface } from 'bingx-api/bingx/endpoints/endpoint.interface'; export class BingxExtendListenKeyEndpoint extends Endpoint diff --git a/src/bingx/endpoints/index.ts b/src/bingx/endpoints/index.ts index 6866f8b..37d123f 100644 --- a/src/bingx/endpoints/index.ts +++ b/src/bingx/endpoints/index.ts @@ -1,5 +1,7 @@ export * from './bingx-cancel-all-orders-endpoint'; export * from './bingx-close-all-positions-endpoint'; +export * from './bingx-delete-listen-key-endpoint'; +export * from './bingx-extend-listen-key-endpoint'; export * from './bingx-generate-listen-key-endpoint'; export * from './bingx-generate-listen-key-response'; export * from './bingx-get-perpetual-swap-account-asset-endpoint';