diff --git a/packages/ui-extensions-server-kit/src/ExtensionServerClient/ExtensionServerClient.test.ts b/packages/ui-extensions-server-kit/src/ExtensionServerClient/ExtensionServerClient.test.ts index 8ef4ffa1aea..70e722af101 100644 --- a/packages/ui-extensions-server-kit/src/ExtensionServerClient/ExtensionServerClient.test.ts +++ b/packages/ui-extensions-server-kit/src/ExtensionServerClient/ExtensionServerClient.test.ts @@ -163,6 +163,28 @@ describe('ExtensionServerClient', () => { }) describe('initialization', () => { + test('uses crypto.randomUUID() when available', () => { + const uuid = '12345678-1234-1234-1234-1234567890ab' + vi.stubGlobal('crypto', {randomUUID: () => uuid}) + + const client = new ExtensionServerClient(defaultOptions) + + expect(client.id).toBe(uuid) + + vi.unstubAllGlobals() + }) + + test('falls back to Math.random() when crypto.randomUUID() is not available', () => { + vi.stubGlobal('crypto', undefined) + + const client = new ExtensionServerClient(defaultOptions) + + expect(client.id).toBeDefined() + expect(client.id.length).toBeLessThan(36) + + vi.unstubAllGlobals() + }) + test('connects to the target websocket', async () => { // Create client const client = new ExtensionServerClient(defaultOptions) diff --git a/packages/ui-extensions-server-kit/src/ExtensionServerClient/ExtensionServerClient.ts b/packages/ui-extensions-server-kit/src/ExtensionServerClient/ExtensionServerClient.ts index 507bfb5df73..84e953e43d2 100644 --- a/packages/ui-extensions-server-kit/src/ExtensionServerClient/ExtensionServerClient.ts +++ b/packages/ui-extensions-server-kit/src/ExtensionServerClient/ExtensionServerClient.ts @@ -32,7 +32,10 @@ export class ExtensionServerClient implements ExtensionServer.Client { private uiExtensionsByUuid: Record = {} constructor(options: DeepPartial = {}) { - this.id = (Math.random() + 1).toString(36).substring(7) + this.id = + typeof globalThis.crypto?.randomUUID === 'function' + ? globalThis.crypto.randomUUID() + : (Math.random() + 1).toString(36).substring(7) this.options = getValidatedOptions({ ...options, connection: {