@autofleet/api-http-client 0.0.0-beta--beta0.0 → 0.0.0-beta--beta0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{RapidoHttpClient as e}from"@autofleet/rapido-http-client";import{SecretManagerServiceClient as t}from"@google-cloud/secret-manager";var n=class{logger;constructor(e){this.logger=e}},r=class extends n{client=new t;async getSecretValue(e){try{let[t]=await this.client.accessSecretVersion({name:`${e}/versions/latest`});return t.payload?.data?t.payload.data.toString():(this.logger.error(`secret payload data is empty`,{name:e}),null)}catch(e){return this.logger.error(`error when accessing secret`,{error:e}),null}}async updateSecretValue(e,t){try{await this.client.addSecretVersion({parent:e,payload:{data:Buffer.from(t,`utf8`)}})}catch(e){this.logger.error(`error when updating secret`,{error:e})}}},i=class t{accessToken=null;refreshPromise=null;client;logger;refreshTokenSecretPath;secretManager;static validateStatus(e){return e>=200&&e<300||e===401}constructor({apiGatewayUrl:n,refreshTokenSecretPath:i,...a}){this.refreshTokenSecretPath=i,this.logger=a.logger,this.secretManager=new r(this.logger),this.client=new e({...a,serviceUrl:n,validateStatus:a.validateStatus??t.validateStatus})}get(e,t){return this.sendWithAuth(t=>this.client.get(e,t),t)}post(e,t,n){return this.sendWithAuth(n=>this.client.post(e,t,n),n)}put(e,t,n){return this.sendWithAuth(n=>this.client.put(e,t,n),n)}patch(e,t,n){return this.sendWithAuth(n=>this.client.patch(e,t,n),n)}delete(e,t){return this.sendWithAuth(t=>this.client.delete(e,t),t)}async sendWithAuth(e,t){this.accessToken||await this.refreshToken();let n=await e(this.injectAuthHeader(t));return n.status===401?(await this.refreshToken(),e(this.injectAuthHeader(t))):n}injectAuthHeader(e){return this.accessToken?{...e,headers:{...e?.headers,Authorization:`Bearer ${this.accessToken}`}}:e??{}}refreshToken(){return this.refreshPromise||=(async()=>{try{this.logger.info(`Refreshing token for AutofleetApi...`);let e=await this.secretManager.getSecretValue(this.refreshTokenSecretPath),t=await this.client.post(`/api/v1/login/refresh`,{refreshToken:e});if(t.status!==200||!t.data?.token)throw Error(`Token refresh failed: status ${t.status}`);this.accessToken=t.data.token,t.data.refreshToken&&await this.secretManager.updateSecretValue(this.refreshTokenSecretPath,t.data.refreshToken)}catch(e){this.logger.error(`Error refreshing token for AutofleetApi`,{error:e}),this.accessToken=null}finally{this.refreshPromise=null}})(),this.refreshPromise}};export{i as AutofleetApiHttpClient};
1
+ import{RapidoHttpClient as e}from"@autofleet/rapido-http-client";import{SecretManagerServiceClient as t}from"@google-cloud/secret-manager";var n=class{logger;constructor(e){this.logger=e}},r=class extends n{client=new t;async getSecretValue(e){try{let[t]=await this.client.accessSecretVersion({name:`${e}/versions/latest`});return t.payload?.data?t.payload.data.toString():(this.logger.error(`secret payload data is empty`,{name:e}),null)}catch(e){return this.logger.error(`error when accessing secret`,{error:e}),null}}async updateSecretValue(e,t){try{await this.client.addSecretVersion({parent:e,payload:{data:Buffer.from(t,`utf8`)}})}catch(e){this.logger.error(`error when updating secret`,{error:e})}}},i=class t{accessToken=null;refreshPromise=null;client;logger;refreshTokenSecretPath;secretManager;static validateStatus(e){return e>=200&&e<300||e===401}constructor({apiGatewayUrl:n,refreshTokenSecretPath:i,...a}){this.refreshTokenSecretPath=i,this.logger=a.logger.child(`ApiHttpClient`,{}),this.secretManager=new r(this.logger),this.client=new e({...a,serviceUrl:n,validateStatus:a.validateStatus??t.validateStatus})}get(e,t){return this.sendWithAuth(t=>this.client.get(e,t),t)}post(e,t,n){return this.sendWithAuth(n=>this.client.post(e,t,n),n)}put(e,t,n){return this.sendWithAuth(n=>this.client.put(e,t,n),n)}patch(e,t,n){return this.sendWithAuth(n=>this.client.patch(e,t,n),n)}delete(e,t){return this.sendWithAuth(t=>this.client.delete(e,t),t)}async sendWithAuth(e,t){this.accessToken||await this.refreshToken();let n=await e(this.injectAuthHeader(t));return n.status===401?(await this.refreshToken(),e(this.injectAuthHeader(t))):n}injectAuthHeader(e){return this.accessToken?{...e,headers:{...e?.headers,Authorization:`Bearer ${this.accessToken}`}}:e??{}}refreshToken(){return this.refreshPromise||=(async()=>{try{this.logger.info(`Refreshing token for AutofleetApi...`);let e=await this.secretManager.getSecretValue(this.refreshTokenSecretPath),t=await this.client.post(`/api/v1/login/refresh`,{refreshToken:e});if(t.status!==200||!t.data?.token)throw Error(`Token refresh failed: status ${t.status}`);this.accessToken=t.data.token,t.data.refreshToken&&await this.secretManager.updateSecretValue(this.refreshTokenSecretPath,t.data.refreshToken)}catch(e){this.logger.error(`Error refreshing token for AutofleetApi`,{error:e}),this.accessToken=null}finally{this.refreshPromise=null}})(),this.refreshPromise}};export{i as AutofleetApiHttpClient};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/secret-managers/secret-manager.ts","../src/secret-managers/gcp.ts","../src/client.ts"],"sourcesContent":["import type { LoggerInstanceManager } from '@autofleet/logger';\n\nexport abstract class SecretManager {\n protected readonly logger: LoggerInstanceManager;\n\n constructor(logger: LoggerInstanceManager) {\n this.logger = logger;\n }\n\n abstract getSecretValue(name: string): Promise<string | null>;\n abstract updateSecretValue(name: string, value: string): Promise<void>;\n}\n","import { SecretManagerServiceClient } from '@google-cloud/secret-manager';\nimport { SecretManager } from './secret-manager';\n\nexport class GcpSecretManager extends SecretManager {\n private readonly client = new SecretManagerServiceClient();\n\n async getSecretValue(name: string): Promise<string | null> {\n try {\n const [secret] = await this.client.accessSecretVersion({\n name: `${name}/versions/latest`,\n });\n if (!secret.payload?.data) {\n this.logger.error('secret payload data is empty', { name });\n return null;\n }\n return secret.payload.data.toString();\n } catch (error) {\n this.logger.error('error when accessing secret', { error });\n return null;\n }\n }\n\n async updateSecretValue(name: string, value: string): Promise<void> {\n try {\n await this.client.addSecretVersion({\n parent: name,\n payload: {\n data: Buffer.from(value, 'utf8'),\n },\n });\n } catch (error) {\n this.logger.error('error when updating secret', { error });\n }\n }\n}\n","import {\n RapidoHttpClient,\n type RapidoHttpClientResponse,\n type RapidoHttpClientSettings,\n type RequestConfig,\n} from '@autofleet/rapido-http-client';\nimport type { LoggerInstanceManager } from '@autofleet/logger';\nimport type { ZodType, output } from 'zod';\nimport { GcpSecretManager, type SecretManager } from './secret-managers';\n\ninterface RefreshTokenResponse {\n token: string;\n refreshToken: string;\n}\n\ntype NoSchemaConfig = Omit<RequestConfig, 'successSchema' | 'errorSchema'> & {\n successSchema?: never;\n errorSchema?: never;\n};\n\nexport interface AutofleetApiHttpClientSettings\n extends Omit<RapidoHttpClientSettings, 'serviceName' | 'serviceUrl'> {\n apiGatewayUrl: string;\n refreshTokenSecretPath: string;\n}\n\nexport class AutofleetApiHttpClient {\n private accessToken: string | null = null;\n\n private refreshPromise: Promise<void> | null = null;\n\n private readonly client: RapidoHttpClient;\n\n private readonly logger: LoggerInstanceManager;\n\n private readonly refreshTokenSecretPath: string;\n\n private readonly secretManager: SecretManager;\n\n static validateStatus(status: number): boolean {\n return (status >= 200 && status < 300) || status === 401;\n }\n\n constructor({\n apiGatewayUrl,\n refreshTokenSecretPath,\n ...rapidoSettings\n }: AutofleetApiHttpClientSettings) {\n this.refreshTokenSecretPath = refreshTokenSecretPath;\n this.logger = rapidoSettings.logger;\n this.secretManager = new GcpSecretManager(this.logger);\n this.client = new RapidoHttpClient({\n ...rapidoSettings,\n serviceUrl: apiGatewayUrl,\n validateStatus: rapidoSettings.validateStatus ?? AutofleetApiHttpClient.validateStatus,\n });\n }\n\n get<T = unknown>(url: string, config?: NoSchemaConfig): Promise<RapidoHttpClientResponse<T>>;\n get<TSuccess extends ZodType>(\n url: string,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: never; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n get<TSuccess extends ZodType>(\n url: string,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: ZodType; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n get<T = unknown>(url: string, config?: RequestConfig): Promise<RapidoHttpClientResponse<T>> {\n return this.sendWithAuth(c => this.client.get<T>(url, c as NoSchemaConfig), config);\n }\n\n post<T = unknown>(url: string, body?: unknown, config?: NoSchemaConfig): Promise<RapidoHttpClientResponse<T>>;\n post<TSuccess extends ZodType>(\n url: string,\n body: unknown,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: never; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n post<TSuccess extends ZodType>(\n url: string,\n body: unknown,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: ZodType; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n post<T = unknown>(url: string, body?: unknown, config?: RequestConfig): Promise<RapidoHttpClientResponse<T>> {\n return this.sendWithAuth(c => this.client.post<T>(url, body, c as NoSchemaConfig), config);\n }\n\n put<T = unknown>(url: string, body?: unknown, config?: NoSchemaConfig): Promise<RapidoHttpClientResponse<T>>;\n put<TSuccess extends ZodType>(\n url: string,\n body: unknown,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: never; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n put<TSuccess extends ZodType>(\n url: string,\n body: unknown,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: ZodType; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n put<T = unknown>(url: string, body?: unknown, config?: RequestConfig): Promise<RapidoHttpClientResponse<T>> {\n return this.sendWithAuth(c => this.client.put<T>(url, body, c as NoSchemaConfig), config);\n }\n\n patch<T = unknown>(url: string, body?: unknown, config?: NoSchemaConfig): Promise<RapidoHttpClientResponse<T>>;\n patch<TSuccess extends ZodType>(\n url: string,\n body: unknown,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: never; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n patch<TSuccess extends ZodType>(\n url: string,\n body: unknown,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: ZodType; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n patch<T = unknown>(url: string, body?: unknown, config?: RequestConfig): Promise<RapidoHttpClientResponse<T>> {\n return this.sendWithAuth(c => this.client.patch<T>(url, body, c as NoSchemaConfig), config);\n }\n\n delete<T = unknown>(url: string, config?: NoSchemaConfig): Promise<RapidoHttpClientResponse<T>>;\n delete<TSuccess extends ZodType>(\n url: string,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: never; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n delete<TSuccess extends ZodType>(\n url: string,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: ZodType; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n delete<T = unknown>(url: string, config?: RequestConfig): Promise<RapidoHttpClientResponse<T>> {\n return this.sendWithAuth(c => this.client.delete<T>(url, c as NoSchemaConfig), config);\n }\n\n private async sendWithAuth<T>(\n request: (config: RequestConfig) => Promise<RapidoHttpClientResponse<T>>,\n config?: RequestConfig,\n ): Promise<RapidoHttpClientResponse<T>> {\n if (!this.accessToken) {\n await this.refreshToken();\n }\n const response = await request(this.injectAuthHeader(config));\n if (response.status === 401) {\n await this.refreshToken();\n return request(this.injectAuthHeader(config));\n }\n return response;\n }\n\n private injectAuthHeader(config?: RequestConfig): RequestConfig {\n if (!this.accessToken) {\n return config ?? {};\n }\n return {\n ...config,\n headers: {\n ...config?.headers,\n Authorization: `Bearer ${this.accessToken}`,\n },\n };\n }\n\n private refreshToken(): Promise<void> {\n if (this.refreshPromise) {\n return this.refreshPromise;\n }\n\n this.refreshPromise = (async () => {\n try {\n this.logger.info('Refreshing token for AutofleetApi...');\n const refreshToken = await this.secretManager.getSecretValue(this.refreshTokenSecretPath);\n const response = await this.client.post<RefreshTokenResponse>(\n '/api/v1/login/refresh',\n { refreshToken },\n );\n if (response.status !== 200 || !response.data?.token) {\n throw new Error(`Token refresh failed: status ${response.status}`);\n }\n this.accessToken = response.data.token;\n if (response.data.refreshToken) {\n await this.secretManager.updateSecretValue(this.refreshTokenSecretPath, response.data.refreshToken);\n }\n } catch (error) {\n this.logger.error('Error refreshing token for AutofleetApi', { error });\n this.accessToken = null;\n } finally {\n this.refreshPromise = null;\n }\n })();\n\n return this.refreshPromise;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/secret-managers/secret-manager.ts","../src/secret-managers/gcp.ts","../src/client.ts"],"sourcesContent":["import type { LoggerInstanceManager } from '@autofleet/logger';\n\nexport abstract class SecretManager {\n protected readonly logger: LoggerInstanceManager;\n\n constructor(logger: LoggerInstanceManager) {\n this.logger = logger;\n }\n\n abstract getSecretValue(name: string): Promise<string | null>;\n abstract updateSecretValue(name: string, value: string): Promise<void>;\n}\n","import { SecretManagerServiceClient } from '@google-cloud/secret-manager';\nimport { SecretManager } from './secret-manager';\n\nexport class GcpSecretManager extends SecretManager {\n private readonly client = new SecretManagerServiceClient();\n\n async getSecretValue(name: string): Promise<string | null> {\n try {\n const [secret] = await this.client.accessSecretVersion({\n name: `${name}/versions/latest`,\n });\n if (!secret.payload?.data) {\n this.logger.error('secret payload data is empty', { name });\n return null;\n }\n return secret.payload.data.toString();\n } catch (error) {\n this.logger.error('error when accessing secret', { error });\n return null;\n }\n }\n\n async updateSecretValue(name: string, value: string): Promise<void> {\n try {\n await this.client.addSecretVersion({\n parent: name,\n payload: {\n data: Buffer.from(value, 'utf8'),\n },\n });\n } catch (error) {\n this.logger.error('error when updating secret', { error });\n }\n }\n}\n","import {\n RapidoHttpClient,\n type RapidoHttpClientResponse,\n type RapidoHttpClientSettings,\n type RequestConfig,\n} from '@autofleet/rapido-http-client';\nimport type { LoggerInstanceManager } from '@autofleet/logger';\nimport type { ZodType, output } from 'zod';\nimport { GcpSecretManager, type SecretManager } from './secret-managers';\n\ninterface RefreshTokenResponse {\n token: string;\n refreshToken: string;\n}\n\ntype NoSchemaConfig = Omit<RequestConfig, 'successSchema' | 'errorSchema'> & {\n successSchema?: never;\n errorSchema?: never;\n};\n\nexport interface AutofleetApiHttpClientSettings\n extends Omit<RapidoHttpClientSettings, 'serviceName' | 'serviceUrl'> {\n apiGatewayUrl: string;\n refreshTokenSecretPath: string;\n}\n\nexport class AutofleetApiHttpClient {\n private accessToken: string | null = null;\n\n private refreshPromise: Promise<void> | null = null;\n\n private readonly client: RapidoHttpClient;\n\n private readonly logger: LoggerInstanceManager;\n\n private readonly refreshTokenSecretPath: string;\n\n private readonly secretManager: SecretManager;\n\n static validateStatus(status: number): boolean {\n return (status >= 200 && status < 300) || status === 401;\n }\n\n constructor({\n apiGatewayUrl,\n refreshTokenSecretPath,\n ...rapidoSettings\n }: AutofleetApiHttpClientSettings) {\n this.refreshTokenSecretPath = refreshTokenSecretPath;\n this.logger = rapidoSettings.logger.child('ApiHttpClient', {});\n this.secretManager = new GcpSecretManager(this.logger);\n this.client = new RapidoHttpClient({\n ...rapidoSettings,\n serviceUrl: apiGatewayUrl,\n validateStatus: rapidoSettings.validateStatus ?? AutofleetApiHttpClient.validateStatus,\n });\n }\n\n get<T = unknown>(url: string, config?: NoSchemaConfig): Promise<RapidoHttpClientResponse<T>>;\n get<TSuccess extends ZodType>(\n url: string,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: never; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n get<TSuccess extends ZodType>(\n url: string,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: ZodType; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n get<T = unknown>(url: string, config?: RequestConfig): Promise<RapidoHttpClientResponse<T>> {\n return this.sendWithAuth(c => this.client.get<T>(url, c as NoSchemaConfig), config);\n }\n\n post<T = unknown>(url: string, body?: unknown, config?: NoSchemaConfig): Promise<RapidoHttpClientResponse<T>>;\n post<TSuccess extends ZodType>(\n url: string,\n body: unknown,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: never; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n post<TSuccess extends ZodType>(\n url: string,\n body: unknown,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: ZodType; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n post<T = unknown>(url: string, body?: unknown, config?: RequestConfig): Promise<RapidoHttpClientResponse<T>> {\n return this.sendWithAuth(c => this.client.post<T>(url, body, c as NoSchemaConfig), config);\n }\n\n put<T = unknown>(url: string, body?: unknown, config?: NoSchemaConfig): Promise<RapidoHttpClientResponse<T>>;\n put<TSuccess extends ZodType>(\n url: string,\n body: unknown,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: never; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n put<TSuccess extends ZodType>(\n url: string,\n body: unknown,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: ZodType; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n put<T = unknown>(url: string, body?: unknown, config?: RequestConfig): Promise<RapidoHttpClientResponse<T>> {\n return this.sendWithAuth(c => this.client.put<T>(url, body, c as NoSchemaConfig), config);\n }\n\n patch<T = unknown>(url: string, body?: unknown, config?: NoSchemaConfig): Promise<RapidoHttpClientResponse<T>>;\n patch<TSuccess extends ZodType>(\n url: string,\n body: unknown,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: never; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n patch<TSuccess extends ZodType>(\n url: string,\n body: unknown,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: ZodType; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n patch<T = unknown>(url: string, body?: unknown, config?: RequestConfig): Promise<RapidoHttpClientResponse<T>> {\n return this.sendWithAuth(c => this.client.patch<T>(url, body, c as NoSchemaConfig), config);\n }\n\n delete<T = unknown>(url: string, config?: NoSchemaConfig): Promise<RapidoHttpClientResponse<T>>;\n delete<TSuccess extends ZodType>(\n url: string,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: never; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n delete<TSuccess extends ZodType>(\n url: string,\n config: RequestConfig & { successSchema: TSuccess; errorSchema?: ZodType; }\n ): Promise<RapidoHttpClientResponse<output<TSuccess>>>;\n delete<T = unknown>(url: string, config?: RequestConfig): Promise<RapidoHttpClientResponse<T>> {\n return this.sendWithAuth(c => this.client.delete<T>(url, c as NoSchemaConfig), config);\n }\n\n private async sendWithAuth<T>(\n request: (config: RequestConfig) => Promise<RapidoHttpClientResponse<T>>,\n config?: RequestConfig,\n ): Promise<RapidoHttpClientResponse<T>> {\n if (!this.accessToken) {\n await this.refreshToken();\n }\n const response = await request(this.injectAuthHeader(config));\n if (response.status === 401) {\n await this.refreshToken();\n return request(this.injectAuthHeader(config));\n }\n return response;\n }\n\n private injectAuthHeader(config?: RequestConfig): RequestConfig {\n if (!this.accessToken) {\n return config ?? {};\n }\n return {\n ...config,\n headers: {\n ...config?.headers,\n Authorization: `Bearer ${this.accessToken}`,\n },\n };\n }\n\n private refreshToken(): Promise<void> {\n if (this.refreshPromise) {\n return this.refreshPromise;\n }\n\n this.refreshPromise = (async () => {\n try {\n this.logger.info('Refreshing token for AutofleetApi...');\n const refreshToken = await this.secretManager.getSecretValue(this.refreshTokenSecretPath);\n const response = await this.client.post<RefreshTokenResponse>(\n '/api/v1/login/refresh',\n { refreshToken },\n );\n if (response.status !== 200 || !response.data?.token) {\n throw new Error(`Token refresh failed: status ${response.status}`);\n }\n this.accessToken = response.data.token;\n if (response.data.refreshToken) {\n await this.secretManager.updateSecretValue(this.refreshTokenSecretPath, response.data.refreshToken);\n }\n } catch (error) {\n this.logger.error('Error refreshing token for AutofleetApi', { error });\n this.accessToken = null;\n } finally {\n this.refreshPromise = null;\n }\n })();\n\n return this.refreshPromise;\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/api-http-client",
3
- "version": "0.0.0-beta--beta0.0",
3
+ "version": "0.0.0-beta--beta0.1",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "author": "Or Mizrahi",