diff --git a/package.json b/package.json index c2c01d0..4197aee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@eppo/js-client-sdk-common", - "version": "4.5.3", + "version": "4.5.4", "description": "Eppo SDK for client-side JavaScript applications (base for both web and react native)", "main": "dist/index.js", "files": [ diff --git a/src/events/sdk-key-decoder.spec.ts b/src/events/sdk-key-decoder.spec.ts index d2a3ca6..db6ea4d 100644 --- a/src/events/sdk-key-decoder.spec.ts +++ b/src/events/sdk-key-decoder.spec.ts @@ -1,16 +1,23 @@ import SdkKeyDecoder from './sdk-key-decoder'; describe('SdkKeyDecoder', () => { + const decoder = new SdkKeyDecoder(); it('should decode the event ingestion hostname from the SDK key', () => { - const decoder = new SdkKeyDecoder(); const hostname = decoder.decodeEventIngestionHostName( 'zCsQuoHJxVPp895.ZWg9MTIzNDU2LmUudGVzdGluZy5lcHBvLmNsb3Vk', ); expect(hostname).toEqual('123456.e.testing.eppo.cloud'); }); + it('should decode strings with non URL-safe characters', () => { + // this is not a really valid ingestion URL, but it's useful for testing the decoder + const invalidUrl = 'eh=12+3456/.e.testing.eppo.cloud'; + const encoded = Buffer.from(invalidUrl).toString('base64url'); + const hostname = decoder.decodeEventIngestionHostName(`zCsQuoHJxVPp895.${encoded}`); + expect(hostname).toEqual('12 3456/.e.testing.eppo.cloud'); + }); + it("should return null if the SDK key doesn't contain the event ingestion hostname", () => { - const decoder = new SdkKeyDecoder(); expect(decoder.decodeEventIngestionHostName('zCsQuoHJxVPp895')).toBeNull(); expect(decoder.decodeEventIngestionHostName('zCsQuoHJxVPp895.xxxxxx')).toBeNull(); }); diff --git a/src/events/sdk-key-decoder.ts b/src/events/sdk-key-decoder.ts index 8f01ac7..6853b8c 100644 --- a/src/events/sdk-key-decoder.ts +++ b/src/events/sdk-key-decoder.ts @@ -1,3 +1,5 @@ +import { Base64 } from 'js-base64'; + export default class SdkKeyDecoder { /** * Decodes and returns the event ingestion hostname from the provided Eppo SDK key string. @@ -7,7 +9,7 @@ export default class SdkKeyDecoder { const encodedPayload = sdkKey.split('.')[1]; if (!encodedPayload) return null; - const decodedPayload = Buffer.from(encodedPayload, 'base64url').toString('utf-8'); + const decodedPayload = Base64.decode(encodedPayload); const params = new URLSearchParams(decodedPayload); return params.get('eh'); }