Skip to content

Commit 0972d5c

Browse files
authored
feat: Update to latest common SDK, makes getBestAction available (#85)
* Update to latest common SDK * add test for best action * pin common version
1 parent edea33d commit 0972d5c

File tree

3 files changed

+80
-88
lines changed

3 files changed

+80
-88
lines changed

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@eppo/node-server-sdk",
3-
"version": "3.5.0",
3+
"version": "3.6.0",
44
"description": "Eppo node server SDK",
55
"main": "dist/index.js",
66
"files": [
@@ -29,7 +29,8 @@
2929
},
3030
"homepage": "https://github.com/Eppo-exp/node-server-sdk#readme",
3131
"dependencies": {
32-
"@eppo/js-client-sdk-common": "^4.5.1"
32+
"@eppo/js-client-sdk-common": "4.6.0",
33+
"lru-cache": "^10.0.1"
3334
},
3435
"devDependencies": {
3536
"@google-cloud/storage": "^6.9.3",

src/index.spec.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,32 @@ describe('EppoClient E2E test', () => {
402402
});
403403
});
404404

405+
describe('Best Bandit Action', () => {
406+
const flagKey = 'banner_bandit_flag'; // piggyback off a shared test data flag
407+
const bobAttributes: Attributes = { age: 25, country: 'USA', gender_identity: 'female' };
408+
const bobActions: Record<string, Attributes> = {
409+
nike: { brand_affinity: -10.5, loyalty_tier: 'silver' },
410+
adidas: { brand_affinity: 1.0, loyalty_tier: 'bronze' },
411+
reebok: { brand_affinity: 0.5, loyalty_tier: 'gold' },
412+
};
413+
414+
beforeAll(async () => {
415+
await init({
416+
apiKey: TEST_BANDIT_API_KEY, // Flag to dummy test server we want bandit-related files
417+
baseUrl: `http://127.0.0.1:${TEST_SERVER_PORT}`,
418+
assignmentLogger: mockLogger,
419+
});
420+
});
421+
422+
it('Should return the highest ranked bandit', async () => {
423+
const client = getInstance();
424+
425+
const bestAction = client.getBestAction(flagKey, bobAttributes, bobActions, 'default');
426+
427+
expect(bestAction).toEqual('adidas');
428+
});
429+
});
430+
405431
describe('initialization errors', () => {
406432
const maxRetryDelay = DEFAULT_POLL_INTERVAL_MS * POLL_JITTER_PCT;
407433
const mockConfigResponse = {

yarn.lock

Lines changed: 51 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -460,15 +460,16 @@
460460
resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz"
461461
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
462462

463-
"@eppo/js-client-sdk-common@^4.5.1":
464-
version "4.5.1"
465-
resolved "https://registry.yarnpkg.com/@eppo/js-client-sdk-common/-/js-client-sdk-common-4.5.1.tgz#010710be7c9fff53de7ff3b4ee7bb70d8bc46c64"
466-
integrity sha512-b9o5whrX/mR3+YTjFh2X5gZ/KkAN/LHGfPt6O6yMVpdwSFhzoH4KOAjYQtaeUch0RJFuiI+r4pp9M392OB0cvg==
463+
"@eppo/js-client-sdk-common@4.6.0":
464+
version "4.6.0"
465+
resolved "https://registry.yarnpkg.com/@eppo/js-client-sdk-common/-/js-client-sdk-common-4.6.0.tgz#39e8eae318f6046f29b722b236faa49df8e214f9"
466+
integrity sha512-XxKauJsNG72tDwOhrvFoueO2KWjjpNM3lLppBWy/TRkARgWlLeY11B+2iXTymi5/PXUxha3M76zhemvRuBiIFw==
467467
dependencies:
468+
buffer "npm:@eppo/[email protected]"
468469
js-base64 "^3.7.7"
469-
md5 "^2.3.0"
470-
pino "^8.19.0"
470+
pino "^9.5.0"
471471
semver "^7.5.4"
472+
spark-md5 "^3.0.2"
472473
uuid "^8.3.2"
473474

474475
"@eslint/eslintrc@^0.4.3":
@@ -1502,10 +1503,10 @@ buffer-from@^1.0.0:
15021503
resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz"
15031504
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
15041505

1505-
buffer@^6.0.3:
1506-
version "6.0.3"
1507-
resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
1508-
integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
1506+
"buffer@npm:@eppo/[email protected]":
1507+
version "6.2.0"
1508+
resolved "https://registry.yarnpkg.com/@eppo/buffer/-/buffer-6.2.0.tgz#c073617a106ec710e83835edd593ab55ad2b25a1"
1509+
integrity sha512-3SP9je+cXr2tHRCwG38P862MjjNALoM4/FGR5ciqjTb6xpJpJxHI1mg0ORwn0Shu8Prn6mUpqqzyAxCvszb8uw==
15091510
dependencies:
15101511
base64-js "^1.3.1"
15111512
ieee754 "^1.2.1"
@@ -1581,11 +1582,6 @@ char-regex@^1.0.2:
15811582
resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz"
15821583
integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
15831584

1584-
1585-
version "0.0.2"
1586-
resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
1587-
integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==
1588-
15891585
ci-info@^3.2.0:
15901586
version "3.3.0"
15911587
resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz"
@@ -1755,11 +1751,6 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3:
17551751
shebang-command "^2.0.0"
17561752
which "^2.0.1"
17571753

1758-
1759-
version "0.0.2"
1760-
resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
1761-
integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==
1762-
17631754
[email protected], debug@^2.6.9:
17641755
version "2.6.9"
17651756
resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
@@ -2212,11 +2203,6 @@ event-target-shim@^5.0.0:
22122203
resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz"
22132204
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
22142205

2215-
events@^3.3.0:
2216-
version "3.3.0"
2217-
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
2218-
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
2219-
22202206
execa@^5.0.0, execa@^5.1.1:
22212207
version "5.1.1"
22222208
resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz"
@@ -2785,11 +2771,6 @@ is-boolean-object@^1.1.0:
27852771
call-bind "^1.0.2"
27862772
has-tostringtag "^1.0.0"
27872773

2788-
is-buffer@~1.1.6:
2789-
version "1.1.6"
2790-
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
2791-
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
2792-
27932774
is-callable@^1.1.4, is-callable@^1.2.4:
27942775
version "1.2.4"
27952776
resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz"
@@ -3550,6 +3531,11 @@ log-update@^4.0.0:
35503531
slice-ansi "^4.0.0"
35513532
wrap-ansi "^6.2.0"
35523533

3534+
lru-cache@^10.0.1:
3535+
version "10.4.3"
3536+
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
3537+
integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
3538+
35533539
lru-cache@^5.1.1:
35543540
version "5.1.1"
35553541
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
@@ -3583,15 +3569,6 @@ [email protected]:
35833569
dependencies:
35843570
tmpl "1.0.5"
35853571

3586-
md5@^2.3.0:
3587-
version "2.3.0"
3588-
resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f"
3589-
integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==
3590-
dependencies:
3591-
charenc "0.0.2"
3592-
crypt "0.0.2"
3593-
is-buffer "~1.1.6"
3594-
35953572
35963573
version "0.3.0"
35973574
resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz"
@@ -3924,35 +3901,34 @@ pidtree@^0.5.0:
39243901
resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.5.0.tgz"
39253902
integrity sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==
39263903

3927-
pino-abstract-transport@^1.2.0:
3928-
version "1.2.0"
3929-
resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz#97f9f2631931e242da531b5c66d3079c12c9d1b5"
3930-
integrity sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==
3904+
pino-abstract-transport@^2.0.0:
3905+
version "2.0.0"
3906+
resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz#de241578406ac7b8a33ce0d77ae6e8a0b3b68a60"
3907+
integrity sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==
39313908
dependencies:
3932-
readable-stream "^4.0.0"
39333909
split2 "^4.0.0"
39343910

3935-
pino-std-serializers@^6.0.0:
3936-
version "6.2.2"
3937-
resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz#d9a9b5f2b9a402486a5fc4db0a737570a860aab3"
3938-
integrity sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==
3911+
pino-std-serializers@^7.0.0:
3912+
version "7.0.0"
3913+
resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz#7c625038b13718dbbd84ab446bd673dc52259e3b"
3914+
integrity sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==
39393915

3940-
pino@^8.19.0:
3941-
version "8.21.0"
3942-
resolved "https://registry.yarnpkg.com/pino/-/pino-8.21.0.tgz#e1207f3675a2722940d62da79a7a55a98409f00d"
3943-
integrity sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==
3916+
pino@^9.5.0:
3917+
version "9.5.0"
3918+
resolved "https://registry.yarnpkg.com/pino/-/pino-9.5.0.tgz#a7ef0fea868d22d52d8a4ce46e6e03c5dc46fdd6"
3919+
integrity sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==
39443920
dependencies:
39453921
atomic-sleep "^1.0.0"
39463922
fast-redact "^3.1.1"
39473923
on-exit-leak-free "^2.1.0"
3948-
pino-abstract-transport "^1.2.0"
3949-
pino-std-serializers "^6.0.0"
3950-
process-warning "^3.0.0"
3924+
pino-abstract-transport "^2.0.0"
3925+
pino-std-serializers "^7.0.0"
3926+
process-warning "^4.0.0"
39513927
quick-format-unescaped "^4.0.3"
39523928
real-require "^0.2.0"
39533929
safe-stable-stringify "^2.3.1"
3954-
sonic-boom "^3.7.0"
3955-
thread-stream "^2.6.0"
3930+
sonic-boom "^4.0.1"
3931+
thread-stream "^3.0.0"
39563932

39573933
pirates@^4.0.4:
39583934
version "4.0.5"
@@ -3992,15 +3968,10 @@ pretty-format@^29.0.0, pretty-format@^29.7.0:
39923968
ansi-styles "^5.0.0"
39933969
react-is "^18.0.0"
39943970

3995-
process-warning@^3.0.0:
3996-
version "3.0.0"
3997-
resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-3.0.0.tgz#96e5b88884187a1dce6f5c3166d611132058710b"
3998-
integrity sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==
3999-
4000-
process@^0.11.10:
4001-
version "0.11.10"
4002-
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
4003-
integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
3971+
process-warning@^4.0.0:
3972+
version "4.0.0"
3973+
resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-4.0.0.tgz#581e3a7a1fb456c5f4fd239f76bce75897682d5a"
3974+
integrity sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==
40043975

40053976
progress@^2.0.0:
40063977
version "2.0.3"
@@ -4087,17 +4058,6 @@ readable-stream@^3.1.1:
40874058
string_decoder "^1.1.1"
40884059
util-deprecate "^1.0.1"
40894060

4090-
readable-stream@^4.0.0:
4091-
version "4.5.2"
4092-
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09"
4093-
integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==
4094-
dependencies:
4095-
abort-controller "^3.0.0"
4096-
buffer "^6.0.3"
4097-
events "^3.3.0"
4098-
process "^0.11.10"
4099-
string_decoder "^1.3.0"
4100-
41014061
real-require@^0.2.0:
41024062
version "0.2.0"
41034063
resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78"
@@ -4368,10 +4328,10 @@ slice-ansi@^5.0.0:
43684328
ansi-styles "^6.0.0"
43694329
is-fullwidth-code-point "^4.0.0"
43704330

4371-
sonic-boom@^3.7.0:
4372-
version "3.8.1"
4373-
resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.8.1.tgz#d5ba8c4e26d6176c9a1d14d549d9ff579a163422"
4374-
integrity sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==
4331+
sonic-boom@^4.0.1:
4332+
version "4.2.0"
4333+
resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.2.0.tgz#e59a525f831210fa4ef1896428338641ac1c124d"
4334+
integrity sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==
43754335
dependencies:
43764336
atomic-sleep "^1.0.0"
43774337

@@ -4393,6 +4353,11 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
43934353
resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
43944354
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
43954355

4356+
spark-md5@^3.0.2:
4357+
version "3.0.2"
4358+
resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.2.tgz#7952c4a30784347abcee73268e473b9c0167e3fc"
4359+
integrity sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==
4360+
43964361
split2@^4.0.0:
43974362
version "4.2.0"
43984363
resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4"
@@ -4474,7 +4439,7 @@ string.prototype.trimstart@^1.0.4:
44744439
call-bind "^1.0.2"
44754440
define-properties "^1.1.3"
44764441

4477-
string_decoder@^1.1.1, string_decoder@^1.3.0:
4442+
string_decoder@^1.1.1:
44784443
version "1.3.0"
44794444
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
44804445
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
@@ -4610,10 +4575,10 @@ theredoc@^1.0.0:
46104575
resolved "https://registry.yarnpkg.com/theredoc/-/theredoc-1.0.0.tgz#bcace376af6feb1873efbdd0f91ed026570ff062"
46114576
integrity sha512-KU3SA3TjRRM932jpNfD3u4Ec3bSvedyo5ITPI7zgWYnKep7BwQQaxlhI9qbO+lKJoRnoAbEVfMcAHRuKVYikDA==
46124577

4613-
thread-stream@^2.6.0:
4614-
version "2.7.0"
4615-
resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.7.0.tgz#d8a8e1b3fd538a6cca8ce69dbe5d3d097b601e11"
4616-
integrity sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==
4578+
thread-stream@^3.0.0:
4579+
version "3.1.0"
4580+
resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-3.1.0.tgz#4b2ef252a7c215064507d4ef70c05a5e2d34c4f1"
4581+
integrity sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==
46174582
dependencies:
46184583
real-require "^0.2.0"
46194584

0 commit comments

Comments
 (0)