From 37502b5b56eb2e91eceb04d3bd2972c6a9d661e3 Mon Sep 17 00:00:00 2001 From: bzp2010 Date: Tue, 26 Aug 2025 19:01:17 +0800 Subject: [PATCH 1/2] feat(apisix-standalone): add server field to sync result --- apps/cli/src/server/sync.ts | 6 ++++-- libs/backend-apisix-standalone/src/index.ts | 10 +++++++--- libs/backend-apisix-standalone/src/operator.ts | 2 ++ libs/sdk/src/backend/index.ts | 1 + package.json | 2 +- 5 files changed, 15 insertions(+), 6 deletions(-) diff --git a/apps/cli/src/server/sync.ts b/apps/cli/src/server/sync.ts index 5601274a..0a225137 100644 --- a/apps/cli/src/server/sync.ts +++ b/apps/cli/src/server/sync.ts @@ -119,7 +119,8 @@ export const syncHandler: RequestHandler< success_count: successes.length, failed_count: faileds.length, success: [ - ...successes.map(({ event, axiosResponse }) => ({ + ...successes.map(({ event, axiosResponse, server }) => ({ + server, event: simplifyEvent(event), synced_at: new Date( axiosResponse?.headers?.date ?? new Date(), @@ -127,7 +128,8 @@ export const syncHandler: RequestHandler< })), ], failed: [ - ...faileds.map(({ event, error, axiosResponse }) => ({ + ...faileds.map(({ event, error, axiosResponse, server }) => ({ + server, event: simplifyEvent(event), failed_at: new Date( axiosResponse?.headers?.date ?? new Date(), diff --git a/libs/backend-apisix-standalone/src/index.ts b/libs/backend-apisix-standalone/src/index.ts index 308768e1..e3b77c84 100644 --- a/libs/backend-apisix-standalone/src/index.ts +++ b/libs/backend-apisix-standalone/src/index.ts @@ -10,7 +10,7 @@ import { type AgentOptions as httpsAgentOptions, } from 'node:https'; import { type Observable, Subject, from, map, of, switchMap } from 'rxjs'; -import semver, { SemVer } from 'semver'; +import semver, { SemVer, eq as semverEQ } from 'semver'; import { config as configCache, @@ -100,7 +100,8 @@ export class BackendAPISIXStandalone implements ADCSDK.Backend { event: { response: resp, description: `Get APISIX version` }, }); - let version = new SemVer('999.999.999'); + const mockVersion = '999.999.999'; + let version = new SemVer(mockVersion); if (resp.headers.server) { const parsedVersion = (resp.headers.server as string).match( /APISIX\/(.*)/, @@ -108,7 +109,10 @@ export class BackendAPISIXStandalone implements ADCSDK.Backend { if (parsedVersion) version = semver.coerce(parsedVersion[1]) ?? version; } - versionCache.set(this.opts.cacheKey, version); + // Only cache it when the actual value is obtained + if (!semverEQ(version, mockVersion)) + versionCache.set(this.opts.cacheKey, version); + return version; } diff --git a/libs/backend-apisix-standalone/src/operator.ts b/libs/backend-apisix-standalone/src/operator.ts index c5af964e..c45b9e7d 100644 --- a/libs/backend-apisix-standalone/src/operator.ts +++ b/libs/backend-apisix-standalone/src/operator.ts @@ -113,6 +113,7 @@ export class Operator extends ADCSDK.backend.BackendEventSource { success: true, event: {} as ADCSDK.Event, // keep empty axiosResponse: response, + server, }) satisfies ADCSDK.BackendSyncResult, ), catchError< @@ -140,6 +141,7 @@ export class Operator extends ADCSDK.backend.BackendEventSource { error: new Error(error.response.data.error_msg), }), }), + server, } satisfies ADCSDK.BackendSyncResult); }), tap(() => { diff --git a/libs/sdk/src/backend/index.ts b/libs/sdk/src/backend/index.ts index c7a8359b..b28e31e4 100644 --- a/libs/sdk/src/backend/index.ts +++ b/libs/sdk/src/backend/index.ts @@ -60,6 +60,7 @@ export interface BackendSyncResult { event: ADCSDK.Event; axiosResponse?: AxiosResponse; error?: Error; + server?: string; } export interface BackendMetadata { diff --git a/package.json b/package.json index 261b34ca..22a2ef27 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "yaml": "^2.4.2", "zod": "^4.0.10" }, - "packageManager": "pnpm@10.14.0+sha512.ad27a79641b49c3e481a16a805baa71817a04bbe06a38d17e60e2eaee83f6a146c6a688125f5792e48dd5ba30e7da52a5cda4c3992b9ccf333f9ce223af84748", + "packageManager": "pnpm@10.15.0+sha512.486ebc259d3e999a4e8691ce03b5cac4a71cbeca39372a9b762cb500cfdf0873e2cb16abe3d951b1ee2cf012503f027b98b6584e4df22524e0c7450d9ec7aa7b", "pnpm": { "onlyBuiltDependencies": [ "@parcel/watcher", From 21cd97e3e2df271fe65314d3dc0f00483d8b4339 Mon Sep 17 00:00:00 2001 From: bzp2010 Date: Tue, 26 Aug 2025 19:23:50 +0800 Subject: [PATCH 2/2] test --- .../e2e/cache.e2e-spec.ts | 15 +++++++++++++-- .../e2e/support/constants.ts | 3 +++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/libs/backend-apisix-standalone/e2e/cache.e2e-spec.ts b/libs/backend-apisix-standalone/e2e/cache.e2e-spec.ts index 8391486b..007f5558 100644 --- a/libs/backend-apisix-standalone/e2e/cache.e2e-spec.ts +++ b/libs/backend-apisix-standalone/e2e/cache.e2e-spec.ts @@ -11,6 +11,7 @@ import { import { server1, server2, + server3, servers, token1, token2, @@ -104,7 +105,10 @@ describe('Cache - Single APISIX', () => { vi.setSystemTime(now); - return syncEvents(backend, events); + const result = await syncEvents(backend, events); + expect(result[0].server).toEqual(server1); + + return result; }); it('check if the cache is updated', async () => { @@ -235,7 +239,14 @@ describe('Cache - Multiple APISIX (completely new instances)', () => { .filter((item) => item === ADCSDK.EventType.CREATE), ).toHaveLength(4); - return syncEvents(backend, events); + const result = await syncEvents(backend, events); + result.forEach((item) => { + expect([server1, server2, server3].includes(`${item.server}`)).toEqual( + true, + ); + }); + + return result; }); it('wait for sync', async () => wait(100)); diff --git a/libs/backend-apisix-standalone/e2e/support/constants.ts b/libs/backend-apisix-standalone/e2e/support/constants.ts index 245f5519..3df413e6 100644 --- a/libs/backend-apisix-standalone/e2e/support/constants.ts +++ b/libs/backend-apisix-standalone/e2e/support/constants.ts @@ -4,6 +4,9 @@ export const token1 = 'edd1c9f034335f136f87ad84b625c8f1'; export const server2 = 'http://localhost:29180'; export const token2 = 'edd1c9f034335f136f87ad84b625c8f1'; +export const server3 = 'http://localhost:39180'; +export const token3 = 'edd1c9f034335f136f87ad84b625c8f1'; + export const servers = 'http://localhost:19180,http://localhost:29180,http://localhost:39180'; export const tokens =