diff --git a/examples/cloudflare-workers/web-sdk/package-lock.json b/examples/cloudflare-workers/web-sdk/package-lock.json index c1a0baab5..4025b0bc5 100644 --- a/examples/cloudflare-workers/web-sdk/package-lock.json +++ b/examples/cloudflare-workers/web-sdk/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.0", "dependencies": { "@gomomento/sdk-core": "^1.40.0", - "@gomomento/sdk-web": "^1.95.0", + "@gomomento/sdk-web": "^1.96.0", "xhr4sw": "^0.0.5" }, "devDependencies": { @@ -518,9 +518,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" @@ -553,12 +553,12 @@ } }, "node_modules/@gomomento/sdk-web": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-web/-/sdk-web-1.95.0.tgz", - "integrity": "sha512-xA6L8v2alp2AX49hGgw3zRa/5A1heNq8tPRw37wTL0siy2Q4SEi3JtaWMTLw+6zwdon7DJI4Munu8fl1c/3TaQ==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-web/-/sdk-web-1.96.0.tgz", + "integrity": "sha512-FEu/ovqzYn51/13l6Exs/p19egxialrEHpJnHr4ezWbDr1XiRALakXruPyXbthfvkddABAteNCWQt5HkxAMgow==", "dependencies": { "@gomomento/generated-types-webtext": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@types/google-protobuf": "3.15.6", "google-protobuf": "3.21.2", "grpc-web": "1.4.2", diff --git a/examples/cloudflare-workers/web-sdk/package.json b/examples/cloudflare-workers/web-sdk/package.json index 832a1d84e..7e68d7421 100644 --- a/examples/cloudflare-workers/web-sdk/package.json +++ b/examples/cloudflare-workers/web-sdk/package.json @@ -14,7 +14,7 @@ }, "dependencies": { "@gomomento/sdk-core": "^1.40.0", - "@gomomento/sdk-web": "^1.95.0", + "@gomomento/sdk-web": "^1.96.0", "xhr4sw": "^0.0.5" } } diff --git a/examples/nodejs/access-control/package-lock.json b/examples/nodejs/access-control/package-lock.json index daa3fbc9a..83c380e83 100644 --- a/examples/nodejs/access-control/package-lock.json +++ b/examples/nodejs/access-control/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "uuidv4": "6.2.13" }, "devDependencies": { @@ -67,12 +67,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -83,9 +83,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" @@ -3292,12 +3292,12 @@ } }, "@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "requires": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -3305,9 +3305,9 @@ } }, "@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "requires": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/access-control/package.json b/examples/nodejs/access-control/package.json index f299c2539..5d928b0ad 100644 --- a/examples/nodejs/access-control/package.json +++ b/examples/nodejs/access-control/package.json @@ -26,7 +26,7 @@ "typescript": "4.9.5" }, "dependencies": { - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "uuidv4": "6.2.13" } } diff --git a/examples/nodejs/aws/eventbridge/cliApp/package-lock.json b/examples/nodejs/aws/eventbridge/cliApp/package-lock.json index f711b5368..cc5aa45fe 100644 --- a/examples/nodejs/aws/eventbridge/cliApp/package-lock.json +++ b/examples/nodejs/aws/eventbridge/cliApp/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "@aws-sdk/client-dynamodb": "^3.596.0", - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "dotenv": "^16.4.5" }, "devDependencies": { @@ -683,12 +683,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -699,9 +699,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/aws/eventbridge/cliApp/package.json b/examples/nodejs/aws/eventbridge/cliApp/package.json index 1bf584dc9..cfb0842ab 100644 --- a/examples/nodejs/aws/eventbridge/cliApp/package.json +++ b/examples/nodejs/aws/eventbridge/cliApp/package.json @@ -27,7 +27,7 @@ }, "dependencies": { "@aws-sdk/client-dynamodb": "^3.596.0", - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "dotenv": "^16.4.5" }, "engines": { diff --git a/examples/nodejs/aws/eventbridge/webapp/package-lock.json b/examples/nodejs/aws/eventbridge/webapp/package-lock.json index 226b85afb..e3c8f9537 100644 --- a/examples/nodejs/aws/eventbridge/webapp/package-lock.json +++ b/examples/nodejs/aws/eventbridge/webapp/package-lock.json @@ -8,7 +8,7 @@ "name": "vite-project", "version": "0.0.0", "dependencies": { - "@gomomento/sdk-web": "^1.95.0", + "@gomomento/sdk-web": "^1.96.0", "aws-sdk": "^2.1628.0", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -471,9 +471,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" @@ -483,12 +483,12 @@ } }, "node_modules/@gomomento/sdk-web": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-web/-/sdk-web-1.95.0.tgz", - "integrity": "sha512-xA6L8v2alp2AX49hGgw3zRa/5A1heNq8tPRw37wTL0siy2Q4SEi3JtaWMTLw+6zwdon7DJI4Munu8fl1c/3TaQ==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-web/-/sdk-web-1.96.0.tgz", + "integrity": "sha512-FEu/ovqzYn51/13l6Exs/p19egxialrEHpJnHr4ezWbDr1XiRALakXruPyXbthfvkddABAteNCWQt5HkxAMgow==", "dependencies": { "@gomomento/generated-types-webtext": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@types/google-protobuf": "3.15.6", "google-protobuf": "3.21.2", "grpc-web": "1.4.2", diff --git a/examples/nodejs/aws/eventbridge/webapp/package.json b/examples/nodejs/aws/eventbridge/webapp/package.json index f500af591..effae9cfa 100644 --- a/examples/nodejs/aws/eventbridge/webapp/package.json +++ b/examples/nodejs/aws/eventbridge/webapp/package.json @@ -10,7 +10,7 @@ "deploy": "npm install && cd - && cdk deploy" }, "dependencies": { - "@gomomento/sdk-web": "^1.95.0", + "@gomomento/sdk-web": "^1.96.0", "aws-sdk": "^2.1628.0", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/examples/nodejs/aws/lambda-examples/advanced-compression/package-lock.json b/examples/nodejs/aws/lambda-examples/advanced-compression/package-lock.json index 047f44077..fc99aa725 100644 --- a/examples/nodejs/aws/lambda-examples/advanced-compression/package-lock.json +++ b/examples/nodejs/aws/lambda-examples/advanced-compression/package-lock.json @@ -5,7 +5,7 @@ "packages": { "": { "dependencies": { - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "@gomomento/sdk-nodejs-compression-zstd": "^0.92.2", "@mongodb-js/zstd-linux-x64-gnu": "^1.2.0", "aws-lambda": "^1.0.7", @@ -1647,12 +1647,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -1663,9 +1663,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/aws/lambda-examples/advanced-compression/package.json b/examples/nodejs/aws/lambda-examples/advanced-compression/package.json index a5596880c..b5ffc7295 100644 --- a/examples/nodejs/aws/lambda-examples/advanced-compression/package.json +++ b/examples/nodejs/aws/lambda-examples/advanced-compression/package.json @@ -10,7 +10,7 @@ "typescript": "^4.9.5" }, "dependencies": { - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "@gomomento/sdk-nodejs-compression-zstd": "^0.92.2", "@mongodb-js/zstd-linux-x64-gnu": "^1.2.0", "aws-lambda": "^1.0.7", diff --git a/examples/nodejs/aws/lambda-examples/cloudwatch-metrics/docker/ecs-code/package-lock.json b/examples/nodejs/aws/lambda-examples/cloudwatch-metrics/docker/ecs-code/package-lock.json index 5203d6a5a..0f1aa5b85 100644 --- a/examples/nodejs/aws/lambda-examples/cloudwatch-metrics/docker/ecs-code/package-lock.json +++ b/examples/nodejs/aws/lambda-examples/cloudwatch-metrics/docker/ecs-code/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "@aws-sdk/client-secrets-manager": "3.470.0", - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "aws-lambda": "1.0.7" }, "devDependencies": { @@ -666,12 +666,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -682,9 +682,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" @@ -5473,12 +5473,12 @@ } }, "@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "requires": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -5486,9 +5486,9 @@ } }, "@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "requires": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/aws/lambda-examples/cloudwatch-metrics/docker/ecs-code/package.json b/examples/nodejs/aws/lambda-examples/cloudwatch-metrics/docker/ecs-code/package.json index 38459b3f1..ed26ff5b9 100644 --- a/examples/nodejs/aws/lambda-examples/cloudwatch-metrics/docker/ecs-code/package.json +++ b/examples/nodejs/aws/lambda-examples/cloudwatch-metrics/docker/ecs-code/package.json @@ -28,7 +28,7 @@ }, "dependencies": { "@aws-sdk/client-secrets-manager": "3.470.0", - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "aws-lambda": "1.0.7" } } diff --git a/examples/nodejs/aws/lambda-examples/cloudwatch-metrics/lambda/package-lock.json b/examples/nodejs/aws/lambda-examples/cloudwatch-metrics/lambda/package-lock.json index 351f2ae79..300f710b8 100644 --- a/examples/nodejs/aws/lambda-examples/cloudwatch-metrics/lambda/package-lock.json +++ b/examples/nodejs/aws/lambda-examples/cloudwatch-metrics/lambda/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "@aws-sdk/client-secrets-manager": "3.468.0", - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "aws-lambda": "1.0.7" }, "devDependencies": { @@ -666,12 +666,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -682,9 +682,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" @@ -5473,12 +5473,12 @@ } }, "@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "requires": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -5486,9 +5486,9 @@ } }, "@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "requires": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/aws/lambda-examples/cloudwatch-metrics/lambda/package.json b/examples/nodejs/aws/lambda-examples/cloudwatch-metrics/lambda/package.json index 18a60b554..ccecca7de 100644 --- a/examples/nodejs/aws/lambda-examples/cloudwatch-metrics/lambda/package.json +++ b/examples/nodejs/aws/lambda-examples/cloudwatch-metrics/lambda/package.json @@ -28,7 +28,7 @@ }, "dependencies": { "@aws-sdk/client-secrets-manager": "3.468.0", - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "aws-lambda": "1.0.7" } } diff --git a/examples/nodejs/aws/lambda-examples/simple-get/lambda/simple-get/package-lock.json b/examples/nodejs/aws/lambda-examples/simple-get/lambda/simple-get/package-lock.json index 5e3aaf2c5..300242494 100644 --- a/examples/nodejs/aws/lambda-examples/simple-get/lambda/simple-get/package-lock.json +++ b/examples/nodejs/aws/lambda-examples/simple-get/lambda/simple-get/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "@aws-sdk/client-secrets-manager": "3.470.0", - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "aws-lambda": "1.0.7" }, "devDependencies": { @@ -666,12 +666,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -682,9 +682,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" @@ -5473,12 +5473,12 @@ } }, "@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "requires": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -5486,9 +5486,9 @@ } }, "@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "requires": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/aws/lambda-examples/simple-get/lambda/simple-get/package.json b/examples/nodejs/aws/lambda-examples/simple-get/lambda/simple-get/package.json index 16f9d040f..0d342e05f 100644 --- a/examples/nodejs/aws/lambda-examples/simple-get/lambda/simple-get/package.json +++ b/examples/nodejs/aws/lambda-examples/simple-get/lambda/simple-get/package.json @@ -28,7 +28,7 @@ }, "dependencies": { "@aws-sdk/client-secrets-manager": "3.470.0", - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "aws-lambda": "1.0.7" } } diff --git a/examples/nodejs/aws/secrets-manager/package-lock.json b/examples/nodejs/aws/secrets-manager/package-lock.json index 66adb4bb0..b834b9a0c 100644 --- a/examples/nodejs/aws/secrets-manager/package-lock.json +++ b/examples/nodejs/aws/secrets-manager/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "@aws-sdk/client-secrets-manager": "^3.370.0", - "@gomomento/sdk": "^1.95.0" + "@gomomento/sdk": "^1.96.0" }, "devDependencies": { "@types/node": "^16.11.4", @@ -643,12 +643,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -659,9 +659,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" @@ -4980,12 +4980,12 @@ } }, "@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "requires": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -4993,9 +4993,9 @@ } }, "@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "requires": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/aws/secrets-manager/package.json b/examples/nodejs/aws/secrets-manager/package.json index 0ee022bc9..921327757 100644 --- a/examples/nodejs/aws/secrets-manager/package.json +++ b/examples/nodejs/aws/secrets-manager/package.json @@ -27,6 +27,6 @@ }, "dependencies": { "@aws-sdk/client-secrets-manager": "^3.370.0", - "@gomomento/sdk": "^1.95.0" + "@gomomento/sdk": "^1.96.0" } } diff --git a/examples/nodejs/cache/package-lock.json b/examples/nodejs/cache/package-lock.json index ac6f7db44..feb1b3e99 100644 --- a/examples/nodejs/cache/package-lock.json +++ b/examples/nodejs/cache/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@gomomento/sdk": "^1.95.0" + "@gomomento/sdk": "^1.96.0" }, "devDependencies": { "@types/node": "16.11.4", @@ -62,12 +62,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -78,9 +78,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/cache/package.json b/examples/nodejs/cache/package.json index d466fb3c6..1b6812758 100644 --- a/examples/nodejs/cache/package.json +++ b/examples/nodejs/cache/package.json @@ -33,7 +33,7 @@ "typescript": "4.9.5" }, "dependencies": { - "@gomomento/sdk": "^1.95.0" + "@gomomento/sdk": "^1.96.0" }, "engines": { "node": ">=10.4.0" diff --git a/examples/nodejs/compression-zstd/package-lock.json b/examples/nodejs/compression-zstd/package-lock.json index dbf734ae9..21b089e10 100644 --- a/examples/nodejs/compression-zstd/package-lock.json +++ b/examples/nodejs/compression-zstd/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "@gomomento/sdk-nodejs-compression-zstd": "^0.92.2" }, "devDependencies": { @@ -72,12 +72,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -88,9 +88,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/compression-zstd/package.json b/examples/nodejs/compression-zstd/package.json index 125ff3bd8..27c3cf032 100644 --- a/examples/nodejs/compression-zstd/package.json +++ b/examples/nodejs/compression-zstd/package.json @@ -27,7 +27,7 @@ "typescript": "4.9.5" }, "dependencies": { - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "@gomomento/sdk-nodejs-compression-zstd": "^0.92.2" }, "engines": { diff --git a/examples/nodejs/compression/package-lock.json b/examples/nodejs/compression/package-lock.json index d1c5b8654..40b89c9a1 100644 --- a/examples/nodejs/compression/package-lock.json +++ b/examples/nodejs/compression/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "@gomomento/sdk-nodejs-compression": "^0.84.0" }, "devDependencies": { @@ -63,12 +63,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -79,9 +79,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/compression/package.json b/examples/nodejs/compression/package.json index ffe0aaf0f..a99394e20 100644 --- a/examples/nodejs/compression/package.json +++ b/examples/nodejs/compression/package.json @@ -27,7 +27,7 @@ "typescript": "4.9.5" }, "dependencies": { - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "@gomomento/sdk-nodejs-compression": "^0.84.0" }, "engines": { diff --git a/examples/nodejs/get-set-batch-perf-test/package-lock.json b/examples/nodejs/get-set-batch-perf-test/package-lock.json index 50ac46850..aee02976b 100644 --- a/examples/nodejs/get-set-batch-perf-test/package-lock.json +++ b/examples/nodejs/get-set-batch-perf-test/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "hdr-histogram-js": "3.0.0" }, "devDependencies": { @@ -133,12 +133,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -149,9 +149,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/get-set-batch-perf-test/package.json b/examples/nodejs/get-set-batch-perf-test/package.json index f4c7de345..88a0f2c82 100644 --- a/examples/nodejs/get-set-batch-perf-test/package.json +++ b/examples/nodejs/get-set-batch-perf-test/package.json @@ -26,7 +26,7 @@ "typescript": "5.4.5" }, "dependencies": { - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "hdr-histogram-js": "3.0.0" }, "engines": { diff --git a/examples/nodejs/load-gen/package-lock.json b/examples/nodejs/load-gen/package-lock.json index 2975d73cc..924b76510 100644 --- a/examples/nodejs/load-gen/package-lock.json +++ b/examples/nodejs/load-gen/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "hdr-histogram-js": "3.0.0" }, "devDependencies": { @@ -65,12 +65,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -81,9 +81,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" @@ -3502,12 +3502,12 @@ } }, "@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "requires": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -3515,9 +3515,9 @@ } }, "@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "requires": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/load-gen/package.json b/examples/nodejs/load-gen/package.json index 64c3fe513..3a322fe93 100644 --- a/examples/nodejs/load-gen/package.json +++ b/examples/nodejs/load-gen/package.json @@ -27,7 +27,7 @@ "typescript": "4.9.5" }, "dependencies": { - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "hdr-histogram-js": "3.0.0" } } diff --git a/examples/nodejs/mongodb-examples/simple-read-aside/package-lock.json b/examples/nodejs/mongodb-examples/simple-read-aside/package-lock.json index 106bbdc44..47bb76009 100644 --- a/examples/nodejs/mongodb-examples/simple-read-aside/package-lock.json +++ b/examples/nodejs/mongodb-examples/simple-read-aside/package-lock.json @@ -10,7 +10,7 @@ "license": "Apache 2.0", "dependencies": { "@aws-sdk/client-secrets-manager": "^3.369.0", - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "mongodb": "^5.8.0" }, "devDependencies": { @@ -1332,12 +1332,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -1348,9 +1348,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" @@ -8640,12 +8640,12 @@ } }, "@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "requires": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -8653,9 +8653,9 @@ } }, "@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "requires": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/mongodb-examples/simple-read-aside/package.json b/examples/nodejs/mongodb-examples/simple-read-aside/package.json index a11f5f029..ba05ac8fc 100644 --- a/examples/nodejs/mongodb-examples/simple-read-aside/package.json +++ b/examples/nodejs/mongodb-examples/simple-read-aside/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@aws-sdk/client-secrets-manager": "^3.369.0", - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "mongodb": "^5.8.0" }, "devDependencies": { diff --git a/examples/nodejs/observability/package-lock.json b/examples/nodejs/observability/package-lock.json index a73bb004f..57a51a57f 100644 --- a/examples/nodejs/observability/package-lock.json +++ b/examples/nodejs/observability/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "@opentelemetry/api": "1.4.1", "@opentelemetry/exporter-prometheus": "0.39.1", "@opentelemetry/exporter-zipkin": "1.13.0", @@ -82,12 +82,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -98,9 +98,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" @@ -4130,12 +4130,12 @@ } }, "@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "requires": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -4143,9 +4143,9 @@ } }, "@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "requires": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/observability/package.json b/examples/nodejs/observability/package.json index 94ce00d6b..0c6d0d9cf 100644 --- a/examples/nodejs/observability/package.json +++ b/examples/nodejs/observability/package.json @@ -29,7 +29,7 @@ "typescript": "4.9.5" }, "dependencies": { - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "@opentelemetry/api": "1.4.1", "@opentelemetry/exporter-prometheus": "0.39.1", "@opentelemetry/exporter-zipkin": "1.13.0", diff --git a/examples/nodejs/rate-limiter/package-lock.json b/examples/nodejs/rate-limiter/package-lock.json index 1aefc70fe..33a57a295 100644 --- a/examples/nodejs/rate-limiter/package-lock.json +++ b/examples/nodejs/rate-limiter/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@gomomento/sdk": "^1.95.0" + "@gomomento/sdk": "^1.96.0" }, "devDependencies": { "@types/node": "16.18.60", @@ -204,12 +204,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -220,9 +220,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" @@ -3940,12 +3940,12 @@ } }, "@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "requires": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -3953,9 +3953,9 @@ } }, "@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "requires": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/rate-limiter/package.json b/examples/nodejs/rate-limiter/package.json index 84e594cc5..b3a90da3c 100644 --- a/examples/nodejs/rate-limiter/package.json +++ b/examples/nodejs/rate-limiter/package.json @@ -26,7 +26,7 @@ "typescript": "4.9.5" }, "dependencies": { - "@gomomento/sdk": "^1.95.0" + "@gomomento/sdk": "^1.96.0" }, "engines": { "node": ">=10.4.0" diff --git a/examples/nodejs/storage-load-gen/package-lock.json b/examples/nodejs/storage-load-gen/package-lock.json index 2975d73cc..924b76510 100644 --- a/examples/nodejs/storage-load-gen/package-lock.json +++ b/examples/nodejs/storage-load-gen/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "hdr-histogram-js": "3.0.0" }, "devDependencies": { @@ -65,12 +65,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -81,9 +81,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" @@ -3502,12 +3502,12 @@ } }, "@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "requires": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -3515,9 +3515,9 @@ } }, "@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "requires": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/storage-load-gen/package.json b/examples/nodejs/storage-load-gen/package.json index 64c3fe513..3a322fe93 100644 --- a/examples/nodejs/storage-load-gen/package.json +++ b/examples/nodejs/storage-load-gen/package.json @@ -27,7 +27,7 @@ "typescript": "4.9.5" }, "dependencies": { - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "hdr-histogram-js": "3.0.0" } } diff --git a/examples/nodejs/storage/basic.ts b/examples/nodejs/storage/basic.ts new file mode 100644 index 000000000..cf81d325f --- /dev/null +++ b/examples/nodejs/storage/basic.ts @@ -0,0 +1,65 @@ +import { + CreateStoreResponse, + CredentialProvider, + PreviewStorageClient, + StorageConfigurations, + StorageGetResponse, + StoragePutResponse, +} from '@gomomento/sdk'; + +async function main() { + const storageClient = new PreviewStorageClient({ + configuration: StorageConfigurations.Laptop.latest(), + credentialProvider: CredentialProvider.fromEnvironmentVariable('MOMENTO_API_KEY'), + }); + + const storeName = 'my-store'; + const createStoreResponse = await storageClient.createStore(storeName); + switch (createStoreResponse.type) { + case CreateStoreResponse.AlreadyExists: + console.log(`Store '${storeName}' already exists`); + break; + case CreateStoreResponse.Success: + console.log(`Store '${storeName}' created`); + break; + case CreateStoreResponse.Error: + throw new Error( + `An error occurred while attempting to create store '${storeName}': ${createStoreResponse.errorCode()}: ${createStoreResponse.toString()}` + ); + } + + const putResponse = await storageClient.putString(storeName, 'test-key', 'test-value'); + switch (putResponse.type) { + case StoragePutResponse.Success: + console.log("Key 'test-key' stored successfully"); + break; + case StoragePutResponse.Error: + throw new Error( + `An error occurred while attempting to store key 'test-key' in store '${storeName}': ${putResponse.errorCode()}: ${putResponse.toString()}` + ); + } + + const getResponse = await storageClient.get(storeName, 'test-key'); + // simplified style; assume the value was found, and that it was a string + console.log(`string hit: ${getResponse.value()!.string()!}`); + + // pattern-matching style; safer for production code + switch (getResponse.type) { + case StorageGetResponse.Found: + // if you know the value is a string: + console.log(`Retrieved value for key 'test-key': ${getResponse.value().string()!}`); + break; + case StorageGetResponse.NotFound: + console.log(`Key 'test-key' was not found in store '${storeName}'`); + break; + case StorageGetResponse.Error: + throw new Error( + `An error occurred while attempting to get key 'test-key' from store '${storeName}': ${getResponse.errorCode()}: ${getResponse.toString()}` + ); + } +} + +main().catch(e => { + console.error('An error occurred! ', e); + throw e; +}); diff --git a/examples/nodejs/storage/package-lock.json b/examples/nodejs/storage/package-lock.json index 7641e66a4..2673c6083 100644 --- a/examples/nodejs/storage/package-lock.json +++ b/examples/nodejs/storage/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@gomomento/sdk": "^1.95.0" + "@gomomento/sdk": "^1.96.0" }, "devDependencies": { "@types/node": "16.11.4", @@ -62,12 +62,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -78,9 +78,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" @@ -122,6 +122,7 @@ "version": "0.9.5", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -136,6 +137,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true }, "node_modules/@js-sdsl/ordered-map": { @@ -584,9 +586,9 @@ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1010,9 +1012,9 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dependencies": { "ms": "2.1.2" }, @@ -1345,9 +1347,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.2.tgz", + "integrity": "sha512-3XnC5fDyc8M4J2E8pt8pmSVRX2M+5yWMCfI/kDZwauQeFgzQOuhcRBFKjTeJagqgk4sFKxe1mvNVnaWwImx/Tg==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -1636,9 +1638,9 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -2182,9 +2184,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "engines": { "node": ">= 4" @@ -2301,12 +2303,15 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2624,9 +2629,9 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { "braces": "^3.0.3", @@ -2763,10 +2768,13 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2942,9 +2950,9 @@ } }, "node_modules/protobufjs": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz", - "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -3185,9 +3193,9 @@ } }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, diff --git a/examples/nodejs/storage/package.json b/examples/nodejs/storage/package.json index ac721fa60..093ebf3ab 100644 --- a/examples/nodejs/storage/package.json +++ b/examples/nodejs/storage/package.json @@ -6,8 +6,9 @@ "scripts": { "prebuild": "eslint . --ext .ts", "build": "tsc", + "basic": "tsc && node dist/basic.js", "doc-examples": "tsc && node dist/doc-examples-js-apis.js", - "validate-examples": "tsc && node dist/doc-examples-js-apis.js && node dist/cheat-sheet-main.js", + "validate-examples": "tsc && node dist/doc-example-files/doc-examples-js-apis.js && node dist/doc-example-files/cheat-sheet-main.js", "test": "jest", "lint": "eslint . --ext .ts", "format": "eslint . --ext .ts --fix" @@ -27,7 +28,7 @@ "typescript": "4.9.5" }, "dependencies": { - "@gomomento/sdk": "^1.95.0" + "@gomomento/sdk": "^1.96.0" }, "engines": { "node": ">=10.4.0" diff --git a/examples/nodejs/token-vending-machine/lambda/authorizer/package-lock.json b/examples/nodejs/token-vending-machine/lambda/authorizer/package-lock.json index fbdaea605..4c8cf13fc 100644 --- a/examples/nodejs/token-vending-machine/lambda/authorizer/package-lock.json +++ b/examples/nodejs/token-vending-machine/lambda/authorizer/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "@aws-sdk/client-secrets-manager": "3.485.0", - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "aws-lambda": "1.0.7" }, "devDependencies": { @@ -657,12 +657,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -673,9 +673,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/token-vending-machine/lambda/authorizer/package.json b/examples/nodejs/token-vending-machine/lambda/authorizer/package.json index 78612a07b..83836b662 100644 --- a/examples/nodejs/token-vending-machine/lambda/authorizer/package.json +++ b/examples/nodejs/token-vending-machine/lambda/authorizer/package.json @@ -24,7 +24,7 @@ }, "dependencies": { "@aws-sdk/client-secrets-manager": "3.485.0", - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "aws-lambda": "1.0.7" } } diff --git a/examples/nodejs/token-vending-machine/lambda/token-vending-machine/package-lock.json b/examples/nodejs/token-vending-machine/lambda/token-vending-machine/package-lock.json index 204d23eab..7e8eab101 100644 --- a/examples/nodejs/token-vending-machine/lambda/token-vending-machine/package-lock.json +++ b/examples/nodejs/token-vending-machine/lambda/token-vending-machine/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "@aws-sdk/client-secrets-manager": "3.485.0", - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "aws-lambda": "1.0.7" }, "devDependencies": { @@ -657,12 +657,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -673,9 +673,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/token-vending-machine/lambda/token-vending-machine/package.json b/examples/nodejs/token-vending-machine/lambda/token-vending-machine/package.json index a4ff164d3..c3fb8c674 100644 --- a/examples/nodejs/token-vending-machine/lambda/token-vending-machine/package.json +++ b/examples/nodejs/token-vending-machine/lambda/token-vending-machine/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "@aws-sdk/client-secrets-manager": "3.485.0", - "@gomomento/sdk": "^1.95.0", + "@gomomento/sdk": "^1.96.0", "aws-lambda": "1.0.7" } } diff --git a/examples/nodejs/topics/package-lock.json b/examples/nodejs/topics/package-lock.json index 2a42ef12c..e4d3348d3 100644 --- a/examples/nodejs/topics/package-lock.json +++ b/examples/nodejs/topics/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@gomomento/sdk": "^1.95.0" + "@gomomento/sdk": "^1.96.0" }, "devDependencies": { "@types/node": "^16.11.4", @@ -59,12 +59,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -75,9 +75,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" diff --git a/examples/nodejs/topics/package.json b/examples/nodejs/topics/package.json index cfd592ee2..7fb0c3571 100644 --- a/examples/nodejs/topics/package.json +++ b/examples/nodejs/topics/package.json @@ -28,6 +28,6 @@ "typescript": "4.9.5" }, "dependencies": { - "@gomomento/sdk": "^1.95.0" + "@gomomento/sdk": "^1.96.0" } } diff --git a/examples/web/cache/package-lock.json b/examples/web/cache/package-lock.json index 8747cd10f..eb00f97ad 100644 --- a/examples/web/cache/package-lock.json +++ b/examples/web/cache/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@gomomento/sdk-web": "^1.95.0", + "@gomomento/sdk-web": "^1.96.0", "jsdom": "22.1.0" }, "devDependencies": { @@ -91,9 +91,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" @@ -103,12 +103,12 @@ } }, "node_modules/@gomomento/sdk-web": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-web/-/sdk-web-1.95.0.tgz", - "integrity": "sha512-xA6L8v2alp2AX49hGgw3zRa/5A1heNq8tPRw37wTL0siy2Q4SEi3JtaWMTLw+6zwdon7DJI4Munu8fl1c/3TaQ==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-web/-/sdk-web-1.96.0.tgz", + "integrity": "sha512-FEu/ovqzYn51/13l6Exs/p19egxialrEHpJnHr4ezWbDr1XiRALakXruPyXbthfvkddABAteNCWQt5HkxAMgow==", "dependencies": { "@gomomento/generated-types-webtext": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@types/google-protobuf": "3.15.6", "google-protobuf": "3.21.2", "grpc-web": "1.4.2", @@ -3475,21 +3475,21 @@ } }, "@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "requires": { "buffer": "6.0.3", "jwt-decode": "3.1.2" } }, "@gomomento/sdk-web": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-web/-/sdk-web-1.95.0.tgz", - "integrity": "sha512-xA6L8v2alp2AX49hGgw3zRa/5A1heNq8tPRw37wTL0siy2Q4SEi3JtaWMTLw+6zwdon7DJI4Munu8fl1c/3TaQ==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-web/-/sdk-web-1.96.0.tgz", + "integrity": "sha512-FEu/ovqzYn51/13l6Exs/p19egxialrEHpJnHr4ezWbDr1XiRALakXruPyXbthfvkddABAteNCWQt5HkxAMgow==", "requires": { "@gomomento/generated-types-webtext": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@types/google-protobuf": "3.15.6", "google-protobuf": "3.21.2", "grpc-web": "1.4.2", diff --git a/examples/web/cache/package.json b/examples/web/cache/package.json index 06a1675fa..a68c05fc0 100644 --- a/examples/web/cache/package.json +++ b/examples/web/cache/package.json @@ -29,7 +29,7 @@ "typescript": "4.9.5" }, "dependencies": { - "@gomomento/sdk-web": "^1.95.0", + "@gomomento/sdk-web": "^1.96.0", "jsdom": "22.1.0" } } diff --git a/examples/web/nextjs-chat/package-lock.json b/examples/web/nextjs-chat/package-lock.json index 30ddfa271..dda8de435 100644 --- a/examples/web/nextjs-chat/package-lock.json +++ b/examples/web/nextjs-chat/package-lock.json @@ -8,8 +8,8 @@ "name": "momento-nextjs-chat", "version": "0.1.0", "dependencies": { - "@gomomento/sdk": "^1.95.0", - "@gomomento/sdk-web": "^1.95.0", + "@gomomento/sdk": "^1.96.0", + "@gomomento/sdk-web": "^1.96.0", "autoprefixer": "10.4.14", "next": "^13.5.6", "next-auth": "^4.24.5", @@ -145,12 +145,12 @@ } }, "node_modules/@gomomento/sdk": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.95.0.tgz", - "integrity": "sha512-/Hx7Og1CivgrevmwM6iZr+ORW8isHhAfr2sFDGz8zKg9EZIsjpCdaeUEkR2dv402zfrsZvXPV3mjuYx7x5WAqg==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk/-/sdk-1.96.0.tgz", + "integrity": "sha512-CErzGZjCuiXaw+GjHRjFqkR8lmrnquyB/LFBEsunSpfafiI7D6J8NhFrFGbgy/b6dmjxOC2UYRVEtY1NP8rJ9w==", "dependencies": { "@gomomento/generated-types": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@grpc/grpc-js": "1.10.9", "@types/google-protobuf": "3.15.10", "google-protobuf": "3.21.2", @@ -161,9 +161,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" @@ -173,12 +173,12 @@ } }, "node_modules/@gomomento/sdk-web": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-web/-/sdk-web-1.95.0.tgz", - "integrity": "sha512-xA6L8v2alp2AX49hGgw3zRa/5A1heNq8tPRw37wTL0siy2Q4SEi3JtaWMTLw+6zwdon7DJI4Munu8fl1c/3TaQ==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-web/-/sdk-web-1.96.0.tgz", + "integrity": "sha512-FEu/ovqzYn51/13l6Exs/p19egxialrEHpJnHr4ezWbDr1XiRALakXruPyXbthfvkddABAteNCWQt5HkxAMgow==", "dependencies": { "@gomomento/generated-types-webtext": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@types/google-protobuf": "3.15.6", "google-protobuf": "3.21.2", "grpc-web": "1.4.2", diff --git a/examples/web/nextjs-chat/package.json b/examples/web/nextjs-chat/package.json index 17252a660..a60d29e97 100644 --- a/examples/web/nextjs-chat/package.json +++ b/examples/web/nextjs-chat/package.json @@ -9,8 +9,8 @@ "lint": "next lint" }, "dependencies": { - "@gomomento/sdk": "^1.95.0", - "@gomomento/sdk-web": "^1.95.0", + "@gomomento/sdk": "^1.96.0", + "@gomomento/sdk-web": "^1.96.0", "autoprefixer": "10.4.14", "next": "^13.5.6", "next-auth": "^4.24.5", diff --git a/examples/web/vite-chat-app/package-lock.json b/examples/web/vite-chat-app/package-lock.json index 8b77cefb0..e406d9a2a 100644 --- a/examples/web/vite-chat-app/package-lock.json +++ b/examples/web/vite-chat-app/package-lock.json @@ -9,7 +9,7 @@ "version": "0.0.0", "dependencies": { "@aws-sdk/client-cognito-identity-provider": "^3.378.0", - "@gomomento/sdk-web": "^1.95.0", + "@gomomento/sdk-web": "^1.96.0", "jwt-decode": "^3.1.2", "react": "^18.2.0", "react-dom": "^18.2.0" @@ -1481,9 +1481,9 @@ } }, "node_modules/@gomomento/sdk-core": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.95.0.tgz", - "integrity": "sha512-1e3115v1AMk65HBUYisTnfoadTYefgMmrOJPLBYTIuyMDFh2JpxgQeSUnYN0tX5fn+0DJY2RBc9ujj9JzuNEeA==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-core/-/sdk-core-1.96.0.tgz", + "integrity": "sha512-2MtULKUgDTwYqUuOVL+6+Z1eclruMfJfi/21MGPMTBwj+52A4QKLocXisssoOD35AFQ23GmJ+QMYRFwk78DK1A==", "dependencies": { "buffer": "6.0.3", "jwt-decode": "3.1.2" @@ -1493,12 +1493,12 @@ } }, "node_modules/@gomomento/sdk-web": { - "version": "1.95.0", - "resolved": "https://registry.npmjs.org/@gomomento/sdk-web/-/sdk-web-1.95.0.tgz", - "integrity": "sha512-xA6L8v2alp2AX49hGgw3zRa/5A1heNq8tPRw37wTL0siy2Q4SEi3JtaWMTLw+6zwdon7DJI4Munu8fl1c/3TaQ==", + "version": "1.96.0", + "resolved": "https://registry.npmjs.org/@gomomento/sdk-web/-/sdk-web-1.96.0.tgz", + "integrity": "sha512-FEu/ovqzYn51/13l6Exs/p19egxialrEHpJnHr4ezWbDr1XiRALakXruPyXbthfvkddABAteNCWQt5HkxAMgow==", "dependencies": { "@gomomento/generated-types-webtext": "0.113.0", - "@gomomento/sdk-core": "1.95.0", + "@gomomento/sdk-core": "1.96.0", "@types/google-protobuf": "3.15.6", "google-protobuf": "3.21.2", "grpc-web": "1.4.2", diff --git a/examples/web/vite-chat-app/package.json b/examples/web/vite-chat-app/package.json index 74ec8c145..f395c5691 100644 --- a/examples/web/vite-chat-app/package.json +++ b/examples/web/vite-chat-app/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@aws-sdk/client-cognito-identity-provider": "^3.378.0", - "@gomomento/sdk-web": "^1.95.0", + "@gomomento/sdk-web": "^1.96.0", "jwt-decode": "^3.1.2", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/packages/client-sdk-nodejs/src/auth-client-props.ts b/packages/client-sdk-nodejs/src/auth-client-props.ts index c1f71ac04..37d29aca9 100644 --- a/packages/client-sdk-nodejs/src/auth-client-props.ts +++ b/packages/client-sdk-nodejs/src/auth-client-props.ts @@ -1,4 +1,5 @@ import {CredentialProvider} from '.'; +import {AuthClientConfiguration} from './config/auth-client-configuration'; export interface AuthClientProps { /** @@ -6,6 +7,11 @@ export interface AuthClientProps { */ credentialProvider: CredentialProvider; + /** + * Controls the configuration settings for the auth client, such as logging configuration. + */ + configuration?: AuthClientConfiguration; + /** * Configures whether the client should return a Momento Error object or throw an exception when an * error occurs. By default, this is set to false, and the client will return a Momento Error object on errors. Set it diff --git a/packages/client-sdk-nodejs/src/config/auth-client-configuration.ts b/packages/client-sdk-nodejs/src/config/auth-client-configuration.ts new file mode 100644 index 000000000..3ea204120 --- /dev/null +++ b/packages/client-sdk-nodejs/src/config/auth-client-configuration.ts @@ -0,0 +1,33 @@ +import {MomentoLoggerFactory} from '@gomomento/sdk-core'; + +export interface AuthClientConfigurationProps { + /** + * Configures logging verbosity and format + */ + loggerFactory: MomentoLoggerFactory; +} + +/** + * Configuration options for Momento CacheClient. + * + * @export + * @interface Configuration + */ +export interface AuthConfiguration { + /** + * @returns {MomentoLoggerFactory} the current configuration options for logging verbosity and format + */ + getLoggerFactory(): MomentoLoggerFactory; +} + +export class AuthClientConfiguration implements AuthConfiguration { + private readonly loggerFactory: MomentoLoggerFactory; + + constructor(props: AuthClientConfigurationProps) { + this.loggerFactory = props.loggerFactory; + } + + getLoggerFactory(): MomentoLoggerFactory { + return this.loggerFactory; + } +} diff --git a/packages/client-sdk-nodejs/src/config/auth-client-configurations.ts b/packages/client-sdk-nodejs/src/config/auth-client-configurations.ts new file mode 100644 index 000000000..a42ef3ac4 --- /dev/null +++ b/packages/client-sdk-nodejs/src/config/auth-client-configurations.ts @@ -0,0 +1,28 @@ +import {AuthClientConfiguration} from './auth-client-configuration'; +import {MomentoLoggerFactory} from '@gomomento/sdk-core'; +import {DefaultMomentoLoggerFactory} from './logging/default-momento-logger'; + +const defaultLoggerFactory: MomentoLoggerFactory = + new DefaultMomentoLoggerFactory(); + +/** + * Laptop config provides defaults suitable for a medium-to-high-latency dev environment. Permissive timeouts, retries, and + * relaxed latency and throughput targets. + * @export + * @class Laptop + */ +export class Default extends AuthClientConfiguration { + /** + * Provides the latest recommended configuration for a laptop development environment. NOTE: this configuration may + * change in future releases to take advantage of improvements we identify for default configurations. + * @param {MomentoLoggerFactory} [loggerFactory=defaultLoggerFactory] + * @returns {CacheConfiguration} + */ + static latest( + loggerFactory: MomentoLoggerFactory = defaultLoggerFactory + ): AuthClientConfiguration { + return new AuthClientConfiguration({ + loggerFactory: loggerFactory, + }); + } +} diff --git a/packages/client-sdk-nodejs/src/config/retry/eligibility-strategy.ts b/packages/client-sdk-nodejs/src/config/retry/eligibility-strategy.ts index 600d72106..865574b35 100644 --- a/packages/client-sdk-nodejs/src/config/retry/eligibility-strategy.ts +++ b/packages/client-sdk-nodejs/src/config/retry/eligibility-strategy.ts @@ -1,9 +1,10 @@ -import {StatusObject} from '@grpc/grpc-js'; +import {Metadata, StatusObject} from '@grpc/grpc-js'; import {ClientMethodDefinition} from '@grpc/grpc-js/build/src/make-client'; export interface EligibleForRetryProps { grpcStatus: StatusObject; grpcRequest: ClientMethodDefinition; + requestMetadata: Metadata; } export interface EligibilityStrategy { diff --git a/packages/client-sdk-nodejs/src/config/retry/fixed-timeout-retry-strategy.ts b/packages/client-sdk-nodejs/src/config/retry/fixed-timeout-retry-strategy.ts new file mode 100644 index 000000000..8697dcdc9 --- /dev/null +++ b/packages/client-sdk-nodejs/src/config/retry/fixed-timeout-retry-strategy.ts @@ -0,0 +1,57 @@ +import { + DeterminewhenToRetryRequestProps, + RetryStrategy, +} from './retry-strategy'; +import {EligibilityStrategy} from './eligibility-strategy'; +import {MomentoLoggerFactory, MomentoLogger} from '../..'; +import {DefaultStorageEligibilityStrategy} from './storage-default-eligibility-strategy'; + +export interface FixedTimeoutRetryStrategyProps { + loggerFactory: MomentoLoggerFactory; + eligibilityStrategy?: EligibilityStrategy; + + // Retry request after a fixed time interval (defaults to 100ms) + retryDelayIntervalMillis?: number; + + // Number of milliseconds the client is willing to wait for response data to be received before retrying (defaults to 1000ms). After the overarching GRPC config deadlineMillis has been reached, the client will terminate the RPC with a Cancelled error. + responseDataReceivedTimeoutMillis?: number; +} + +export class FixedTimeoutRetryStrategy implements RetryStrategy { + private readonly logger: MomentoLogger; + private readonly eligibilityStrategy: EligibilityStrategy; + private readonly retryDelayIntervalMillis: number; + readonly responseDataReceivedTimeoutMillis: number; + + constructor(props: FixedTimeoutRetryStrategyProps) { + this.logger = props.loggerFactory.getLogger(this); + this.eligibilityStrategy = + props.eligibilityStrategy ?? + new DefaultStorageEligibilityStrategy(props.loggerFactory); + this.retryDelayIntervalMillis = props.retryDelayIntervalMillis ?? 100; + this.responseDataReceivedTimeoutMillis = + props.responseDataReceivedTimeoutMillis ?? 1000; + } + + determineWhenToRetryRequest( + props: DeterminewhenToRetryRequestProps + ): number | null { + this.logger.debug( + `Determining whether request is eligible for retry; status code: ${props.grpcStatus.code}, request type: ${props.grpcRequest.path}, attemptNumber: ${props.attemptNumber}` + ); + if (!this.eligibilityStrategy.isEligibleForRetry(props)) { + // null means do not retry + return null; + } + + this.logger.debug( + `Request is eligible for retry (attempt ${props.attemptNumber}), retrying after ${this.retryDelayIntervalMillis} ms +/- jitter.` + ); + // retry after a fixed time interval has passed (+/- some jitter) + return addJitter(this.retryDelayIntervalMillis); + } +} + +function addJitter(whenToRetry: number): number { + return (0.2 * Math.random() + 0.9) * whenToRetry; +} diff --git a/packages/client-sdk-nodejs/src/config/retry/no-retry-strategy.ts b/packages/client-sdk-nodejs/src/config/retry/no-retry-strategy.ts new file mode 100644 index 000000000..355a1f000 --- /dev/null +++ b/packages/client-sdk-nodejs/src/config/retry/no-retry-strategy.ts @@ -0,0 +1,27 @@ +import { + DeterminewhenToRetryRequestProps, + RetryStrategy, +} from './retry-strategy'; +import {MomentoLoggerFactory, MomentoLogger} from '../../'; + +export interface NoRetryStrategyProps { + loggerFactory: MomentoLoggerFactory; +} + +export class NoRetryStrategy implements RetryStrategy { + private readonly logger: MomentoLogger; + + constructor(props: NoRetryStrategyProps) { + this.logger = props.loggerFactory.getLogger(this); + } + + determineWhenToRetryRequest( + props: DeterminewhenToRetryRequestProps + ): number | null { + this.logger.debug( + `Using no-retry strategy, therefore not retrying request; status code: ${props.grpcStatus.code}, request type: ${props.grpcRequest.path}, attemptNumber: ${props.attemptNumber}` + ); + // null means do not retry + return null; + } +} diff --git a/packages/client-sdk-nodejs/src/config/retry/retry-strategy.ts b/packages/client-sdk-nodejs/src/config/retry/retry-strategy.ts index 4a9a9814d..ae2fe5a57 100644 --- a/packages/client-sdk-nodejs/src/config/retry/retry-strategy.ts +++ b/packages/client-sdk-nodejs/src/config/retry/retry-strategy.ts @@ -1,13 +1,16 @@ -import {StatusObject} from '@grpc/grpc-js'; +import {Metadata, StatusObject} from '@grpc/grpc-js'; import {ClientMethodDefinition} from '@grpc/grpc-js/build/src/make-client'; export interface DeterminewhenToRetryRequestProps { grpcStatus: StatusObject; grpcRequest: ClientMethodDefinition; attemptNumber: number; + requestMetadata: Metadata; } export interface RetryStrategy { + responseDataReceivedTimeoutMillis?: number; + determineWhenToRetryRequest( props: DeterminewhenToRetryRequestProps ): number | null; diff --git a/packages/client-sdk-nodejs/src/config/retry/storage-default-eligibility-strategy.ts b/packages/client-sdk-nodejs/src/config/retry/storage-default-eligibility-strategy.ts new file mode 100644 index 000000000..8578d4e31 --- /dev/null +++ b/packages/client-sdk-nodejs/src/config/retry/storage-default-eligibility-strategy.ts @@ -0,0 +1,81 @@ +import {MomentoLogger, MomentoLoggerFactory} from '../../'; +import {Status} from '@grpc/grpc-js/build/src/constants'; +import { + EligibilityStrategy, + EligibleForRetryProps, +} from './eligibility-strategy'; +import {Metadata} from '@grpc/grpc-js'; + +const retryableGrpcStatusCodes: Array = [ + // including all the status codes for reference, but + // commenting out the ones we don't want to retry on for now. + + // Status.OK, + // Status.CANCELLED, + // Status.UNKNOWN, + // Status.INVALID_ARGUMENT, + Status.DEADLINE_EXCEEDED, + // Status.NOT_FOUND, + // Status.ALREADY_EXISTS, + // Status.PERMISSION_DENIED, + // Status.RESOURCE_EXHAUSTED, + // Status.FAILED_PRECONDITION, + // Status.ABORTED, + // Status.OUT_OF_RANGE, + // Status.UNIMPLEMENTED, + Status.INTERNAL, + Status.UNAVAILABLE, + // Status.DATA_LOSS, + // Status.UNAUTHENTICATED +]; + +const retryableRequestTypes: Array = [ + '/store.Store/Put', + '/store.Store/Get', + '/store.Store/Delete', +]; + +export class DefaultStorageEligibilityStrategy implements EligibilityStrategy { + private readonly logger: MomentoLogger; + + constructor(loggerFactory: MomentoLoggerFactory) { + this.logger = loggerFactory.getLogger(this); + } + + isEligibleForRetry(props: EligibleForRetryProps): boolean { + if (!retryableGrpcStatusCodes.includes(props.grpcStatus.code)) { + this.logger.debug( + `Response with status code ${props.grpcStatus.code} is not retryable.` + ); + return false; + } + + // If retry disposition metadata is available and the value is "retryable", + // it is safe to retry regardless of idempotency. + const retryMetadata = this.getRetryDispositionMetadata( + props.grpcStatus.metadata + ); + if (retryMetadata === 'retryable') { + return true; + } + + // Otherwise, if there is no retry metadata or the retry disposition is + // "possibly_retryable", it is safe to retry only idempotent commands. + if (!retryableRequestTypes.includes(props.grpcRequest.path)) { + this.logger.debug( + `Request with type ${props.grpcRequest.path} is not retryable.` + ); + return false; + } + + return true; + } + + private getRetryDispositionMetadata(metadata: Metadata): string | undefined { + const retryMetadata = metadata.get('retry_disposition'); + if (retryMetadata.length === 1) { + return retryMetadata[0].toString(); + } + return undefined; + } +} diff --git a/packages/client-sdk-nodejs/src/config/storage-configuration.ts b/packages/client-sdk-nodejs/src/config/storage-configuration.ts index 459eb5849..8af6ad960 100644 --- a/packages/client-sdk-nodejs/src/config/storage-configuration.ts +++ b/packages/client-sdk-nodejs/src/config/storage-configuration.ts @@ -1,4 +1,4 @@ -import {MomentoLoggerFactory} from '../'; +import {MomentoLoggerFactory, RetryStrategy} from '../'; import {StorageTransportStrategy} from './transport/storage'; /** @@ -18,6 +18,11 @@ export interface StorageConfiguration { */ getTransportStrategy(): StorageTransportStrategy; + /** + * @returns {RetryStrategy} the current configuration options for how and when failed requests will be retried + */ + getRetryStrategy(): RetryStrategy; + /** * Convenience copy constructor that updates the client-side timeout setting in the TransportStrategy * @param {number} clientTimeoutMillis @@ -28,11 +33,18 @@ export interface StorageConfiguration { /** * Copy constructor for overriding TransportStrategy * @param {StorageTransportStrategy} transportStrategy - * @returns {Configuration} a new Configuration object with the specified TransportStrategy + * @returns {StorageConfiguration} a new Configuration object with the specified TransportStrategy */ withTransportStrategy( transportStrategy: StorageTransportStrategy ): StorageConfiguration; + + /** + * Copy constructor for overriding RetryStrategy + * @param {RetryStrategy} retryStrategy + * @returns {StorageConfiguration} a new Configuration object with the specified RetryStrategy + */ + withRetryStrategy(retryStrategy: RetryStrategy): StorageConfiguration; } export interface StorageConfigurationProps { @@ -44,15 +56,21 @@ export interface StorageConfigurationProps { * Configures low-level options for network interactions with the Momento service */ transportStrategy: StorageTransportStrategy; + /** + * Configures how and when failed requests will be retried + */ + retryStrategy: RetryStrategy; } export class StorageClientConfiguration implements StorageConfiguration { private readonly loggerFactory: MomentoLoggerFactory; private readonly transportStrategy: StorageTransportStrategy; + private readonly retryStrategy: RetryStrategy; constructor(props: StorageConfigurationProps) { this.loggerFactory = props.loggerFactory; this.transportStrategy = props.transportStrategy; + this.retryStrategy = props.retryStrategy; } getLoggerFactory(): MomentoLoggerFactory { @@ -63,11 +81,16 @@ export class StorageClientConfiguration implements StorageConfiguration { return this.transportStrategy; } + getRetryStrategy(): RetryStrategy { + return this.retryStrategy; + } + withClientTimeoutMillis(clientTimeoutMillis: number): StorageConfiguration { return new StorageClientConfiguration({ loggerFactory: this.loggerFactory, transportStrategy: this.transportStrategy.withClientTimeoutMillis(clientTimeoutMillis), + retryStrategy: this.retryStrategy, }); } @@ -77,6 +100,15 @@ export class StorageClientConfiguration implements StorageConfiguration { return new StorageClientConfiguration({ loggerFactory: this.loggerFactory, transportStrategy: transportStrategy, + retryStrategy: this.retryStrategy, + }); + } + + withRetryStrategy(retryStrategy: RetryStrategy): StorageConfiguration { + return new StorageClientConfiguration({ + loggerFactory: this.loggerFactory, + transportStrategy: this.transportStrategy, + retryStrategy: retryStrategy, }); } } diff --git a/packages/client-sdk-nodejs/src/config/storage-configurations.ts b/packages/client-sdk-nodejs/src/config/storage-configurations.ts index 26763b3ae..7ad9b09d9 100644 --- a/packages/client-sdk-nodejs/src/config/storage-configurations.ts +++ b/packages/client-sdk-nodejs/src/config/storage-configurations.ts @@ -8,10 +8,20 @@ import { StaticStorageGrpcConfiguration, StaticStorageTransportStrategy, } from './transport/storage'; +import {FixedTimeoutRetryStrategy} from './retry/fixed-timeout-retry-strategy'; +import {RetryStrategy} from './retry/retry-strategy'; const defaultLoggerFactory: MomentoLoggerFactory = new DefaultMomentoLoggerFactory(); +function defaultRetryStrategy( + loggerFactory: MomentoLoggerFactory +): RetryStrategy { + return new FixedTimeoutRetryStrategy({ + loggerFactory: loggerFactory, + }); +} + /** * Laptop config provides defaults suitable for a medium-to-high-latency dev environment. * @export @@ -34,6 +44,7 @@ export class Laptop extends StorageClientConfiguration { deadlineMillis: 5000, }), }), + retryStrategy: defaultRetryStrategy(loggerFactory), }); } } diff --git a/packages/client-sdk-nodejs/src/index.ts b/packages/client-sdk-nodejs/src/index.ts index 767cdcf70..ae5415120 100644 --- a/packages/client-sdk-nodejs/src/index.ts +++ b/packages/client-sdk-nodejs/src/index.ts @@ -2,6 +2,7 @@ import {CacheClient, SimpleCacheClient} from './cache-client'; import {TopicClient} from './topic-client'; import {PreviewStorageClient} from './preview-storage-client'; import * as Configurations from './config/configurations'; +import * as AuthClientConfigurations from './config/auth-client-configurations'; import * as TopicConfigurations from './config/topic-configurations'; import * as StorageConfigurations from './config/storage-configurations'; import * as LeaderboardConfigurations from './config/leaderboard-configurations'; @@ -180,6 +181,10 @@ import { } from '@gomomento/sdk-core'; import {Configuration, CacheConfiguration} from './config/configuration'; +import { + AuthConfiguration, + AuthClientConfiguration, +} from './config/auth-client-configuration'; import { TopicConfiguration, TopicClientConfiguration, @@ -215,6 +220,11 @@ export { FixedCountRetryStrategyProps, } from './config/retry/fixed-count-retry-strategy'; +export { + FixedTimeoutRetryStrategy, + FixedTimeoutRetryStrategyProps, +} from './config/retry/fixed-timeout-retry-strategy'; + export {DefaultEligibilityStrategy} from './config/retry/default-eligibility-strategy'; export { @@ -414,6 +424,9 @@ export { WebhookDestinationType, // AuthClient response types AuthClient, + AuthConfiguration, + AuthClientConfiguration, + AuthClientConfigurations, GenerateApiKey, /** * @deprecated Use 'GenerateApiKey' instead diff --git a/packages/client-sdk-nodejs/src/internal/cache-control-client.ts b/packages/client-sdk-nodejs/src/internal/cache-control-client.ts index d64d5d002..c8f2653bf 100644 --- a/packages/client-sdk-nodejs/src/internal/cache-control-client.ts +++ b/packages/client-sdk-nodejs/src/internal/cache-control-client.ts @@ -1,7 +1,6 @@ import {control} from '@gomomento/generated-types'; import grpcControl = control.control_client; -import {Header, HeaderInterceptorProvider} from './grpc/headers-interceptor'; -import {ClientTimeoutInterceptor} from './grpc/client-timeout-interceptor'; +import {Header, HeaderInterceptor} from './grpc/headers-interceptor'; import {CacheServiceErrorMapper} from '../errors/cache-service-error-mapper'; import {ChannelCredentials, Interceptor} from '@grpc/grpc-js'; import { @@ -23,6 +22,7 @@ import { CacheLimits, TopicLimits, } from '@gomomento/sdk-core/dist/src/messages/cache-info'; +import {RetryInterceptor} from './grpc/retry-interceptor'; export interface ControlClientProps { configuration: Configuration; @@ -50,8 +50,12 @@ export class CacheControlClient { new Header('runtime-version', `nodejs:${process.versions.node}`), ]; this.interceptors = [ - new HeaderInterceptorProvider(headers).createHeadersInterceptor(), - ClientTimeoutInterceptor(CacheControlClient.REQUEST_TIMEOUT_MS), + HeaderInterceptor.createHeadersInterceptor(headers), + RetryInterceptor.createRetryInterceptor({ + clientName: 'CacheControlClient', + loggerFactory: props.configuration.getLoggerFactory(), + overallRequestTimeoutMs: CacheControlClient.REQUEST_TIMEOUT_MS, + }), ]; this.logger.debug( `Creating control client using endpoint: '${props.credentialProvider.getControlEndpoint()}` diff --git a/packages/client-sdk-nodejs/src/internal/cache-data-client.ts b/packages/client-sdk-nodejs/src/internal/cache-data-client.ts index b04cc9834..1f6db3f08 100644 --- a/packages/client-sdk-nodejs/src/internal/cache-data-client.ts +++ b/packages/client-sdk-nodejs/src/internal/cache-data-client.ts @@ -1,9 +1,8 @@ import {cache} from '@gomomento/generated-types'; // older versions of node don't have the global util variables https://github.com/nodejs/node/issues/20365 import {TextEncoder} from 'util'; -import {Header, HeaderInterceptorProvider} from './grpc/headers-interceptor'; -import {ClientTimeoutInterceptor} from './grpc/client-timeout-interceptor'; -import {createRetryInterceptorIfEnabled} from './grpc/retry-interceptor'; +import {Header, HeaderInterceptor} from './grpc/headers-interceptor'; +import {RetryInterceptor} from './grpc/retry-interceptor'; import {CacheServiceErrorMapper} from '../errors/cache-service-error-mapper'; import { ChannelCredentials, @@ -4120,19 +4119,20 @@ export class CacheDataClient implements IDataClient { middlewareRequestContext, this.clientWrapper.getClient() ), - new HeaderInterceptorProvider(headers).createHeadersInterceptor(), - ClientTimeoutInterceptor(this.requestTimeoutMs), - ...createRetryInterceptorIfEnabled( - this.configuration.getLoggerFactory(), - this.configuration.getRetryStrategy() - ), + HeaderInterceptor.createHeadersInterceptor(headers), + RetryInterceptor.createRetryInterceptor({ + clientName: 'CacheDataClient', + loggerFactory: this.configuration.getLoggerFactory(), + retryStrategy: this.configuration.getRetryStrategy(), + overallRequestTimeoutMs: this.requestTimeoutMs, + }), ]; } // TODO https://github.com/momentohq/client-sdk-nodejs/issues/349 // decide on streaming interceptors and middlewares private initializeStreamingInterceptors(headers: Header[]): Interceptor[] { - return [new HeaderInterceptorProvider(headers).createHeadersInterceptor()]; + return [HeaderInterceptor.createHeadersInterceptor(headers)]; } private convert(v: string | Uint8Array): Uint8Array { diff --git a/packages/client-sdk-nodejs/src/internal/grpc/client-timeout-interceptor.ts b/packages/client-sdk-nodejs/src/internal/grpc/client-timeout-interceptor.ts deleted file mode 100644 index 8060a3387..000000000 --- a/packages/client-sdk-nodejs/src/internal/grpc/client-timeout-interceptor.ts +++ /dev/null @@ -1,14 +0,0 @@ -import {InterceptingCall, Interceptor} from '@grpc/grpc-js'; - -export const ClientTimeoutInterceptor = ( - requestTimeoutMs: number -): Interceptor => { - return (options, nextCall) => { - if (!options.deadline) { - const deadline = new Date(Date.now()); - deadline.setMilliseconds(deadline.getMilliseconds() + requestTimeoutMs); - options.deadline = deadline; - } - return new InterceptingCall(nextCall(options)); - }; -}; diff --git a/packages/client-sdk-nodejs/src/internal/grpc/headers-interceptor.ts b/packages/client-sdk-nodejs/src/internal/grpc/headers-interceptor.ts index ccbdbb097..6b931ffec 100644 --- a/packages/client-sdk-nodejs/src/internal/grpc/headers-interceptor.ts +++ b/packages/client-sdk-nodejs/src/internal/grpc/headers-interceptor.ts @@ -15,33 +15,24 @@ export class Header { } } -export class HeaderInterceptorProvider { - private readonly headersToAddEveryTime: Header[]; - private readonly headersToAddOnce: Header[]; - private areOnlyOnceHeadersSent = false; - - /** - * @param {Header[]} headers - */ - constructor(headers: Header[]) { - this.headersToAddOnce = headers.filter(header => +export class HeaderInterceptor { + public static createHeadersInterceptor(headers: Header[]): Interceptor { + const headersToAddOnce = headers.filter(header => header.onceOnlyHeaders.includes(header.name) ); - this.headersToAddEveryTime = headers.filter( + const headersToAddEveryTime = headers.filter( header => !header.onceOnlyHeaders.includes(header.name) ); - } - - public createHeadersInterceptor(): Interceptor { + let areOnlyOnceHeadersSent = false; return (options, nextCall) => { return new InterceptingCall(nextCall(options), { start: (metadata, listener, next) => { - this.headersToAddEveryTime.forEach(h => - metadata.add(h.name, h.value) - ); - if (!this.areOnlyOnceHeadersSent) { - this.areOnlyOnceHeadersSent = true; - this.headersToAddOnce.forEach(h => metadata.add(h.name, h.value)); + headersToAddEveryTime.forEach(h => { + metadata.set(h.name, h.value); + }); + if (!areOnlyOnceHeadersSent) { + areOnlyOnceHeadersSent = true; + headersToAddOnce.forEach(h => metadata.add(h.name, h.value)); } next(metadata, {}); }, diff --git a/packages/client-sdk-nodejs/src/internal/grpc/retry-interceptor.ts b/packages/client-sdk-nodejs/src/internal/grpc/retry-interceptor.ts index 2f62d3ceb..46cc35fd3 100644 --- a/packages/client-sdk-nodejs/src/internal/grpc/retry-interceptor.ts +++ b/packages/client-sdk-nodejs/src/internal/grpc/retry-interceptor.ts @@ -14,39 +14,59 @@ import { } from '@grpc/grpc-js'; import {RetryStrategy} from '../../config/retry/retry-strategy'; import {Status} from '@grpc/grpc-js/build/src/constants'; -import {MomentoLoggerFactory, MomentoLogger} from '../../'; +import {MomentoLoggerFactory} from '../../'; +import {NoRetryStrategy} from '../../config/retry/no-retry-strategy'; -export function createRetryInterceptorIfEnabled( - loggerFactory: MomentoLoggerFactory, - retryStrategy: RetryStrategy -): Array { - return [ - new RetryInterceptor(loggerFactory, retryStrategy).createRetryInterceptor(), - ]; +export interface RetryInterceptorProps { + clientName: string; + loggerFactory: MomentoLoggerFactory; + overallRequestTimeoutMs: number; + retryStrategy?: RetryStrategy; } export class RetryInterceptor { - private readonly logger: MomentoLogger; - private readonly retryStrategy: RetryStrategy; - - constructor( - loggerFactory: MomentoLoggerFactory, - retryStrategy: RetryStrategy - ) { - this.logger = loggerFactory.getLogger(this); - this.retryStrategy = retryStrategy; - } - // TODO: We need to send retry count information to the server so that we // will have some visibility into how often this is happening to customers: // https://github.com/momentohq/client-sdk-nodejs/issues/80 - // TODO: we need to add backoff/jitter for the retries: - // https://github.com/momentohq/client-sdk-nodejs/issues/81 - public createRetryInterceptor(): Interceptor { - const logger = this.logger; - const retryStrategy = this.retryStrategy; + public static createRetryInterceptor( + props: RetryInterceptorProps + ): Interceptor { + const logger = props.loggerFactory.getLogger(RetryInterceptor.name); + + const retryStrategy: RetryStrategy = + props.retryStrategy ?? + new NoRetryStrategy({loggerFactory: props.loggerFactory}); + + const overallRequestTimeoutMs = props.overallRequestTimeoutMs; + const deadlineOffset = + retryStrategy.responseDataReceivedTimeoutMillis ?? + props.overallRequestTimeoutMs; + + logger.trace( + `Creating RetryInterceptor (for ${ + props.clientName + }); overall request timeout offset: ${overallRequestTimeoutMs} ms; retry strategy responseDataRecievedTimeoutMillis: ${String( + retryStrategy?.responseDataReceivedTimeoutMillis + )}; deadline offset: ${deadlineOffset} ms` + ); return (options, nextCall) => { + logger.trace( + `Entering RetryInterceptor (for ${ + props.clientName + }); overall request timeout offset: ${overallRequestTimeoutMs} ms; deadline offset: ${String( + deadlineOffset + )}` + ); + const overallDeadline = calculateDeadline(overallRequestTimeoutMs); + + logger.trace( + `Setting initial deadline (for ${props.clientName}) based on offset: ${deadlineOffset} ms` + ); + let nextDeadline = calculateDeadline(deadlineOffset); + + options.deadline = nextDeadline; + let savedMetadata: Metadata; let savedSendMessage: unknown; let savedReceiveMessage: unknown; @@ -68,9 +88,31 @@ export class RetryInterceptor { // eslint-disable-next-line @typescript-eslint/no-explicit-any next: (arg0: any) => void ) { - let attempts = 1; + let attempts = 0; const retry = function (message: unknown, metadata: Metadata) { - attempts++; + logger.debug( + `Retrying request: path: ${ + options.method_definition.path + }; deadline was: ${String( + (options.deadline as Date | undefined)?.toISOString() + )}, overall deadline is: ${overallDeadline.toISOString()}` + ); + if (new Date(Date.now()) >= overallDeadline) { + logger.debug( + `Request not eligible for retry: path: ${ + options.method_definition.path + }; overall deadline exceeded: ${overallDeadline.toISOString()}` + ); + savedMessageNext(savedReceiveMessage); + next(status); + return; + } + nextDeadline = calculateDeadline(deadlineOffset); + logger.debug( + `Setting next deadline (via offset of ${deadlineOffset} ms) to: ${nextDeadline.toISOString()}` + ); + options.deadline = nextDeadline; + const newCall = nextCall(options); newCall.start(metadata, { onReceiveMessage: function (message) { @@ -82,6 +124,7 @@ export class RetryInterceptor { grpcStatus: status, grpcRequest: options.method_definition, attemptNumber: attempts, + requestMetadata: metadata, }); if (whenToRetry === null) { @@ -91,6 +134,7 @@ export class RetryInterceptor { savedMessageNext(savedReceiveMessage); next(status); } else { + attempts++; logger.debug( `Request eligible for retry: path: ${options.method_definition.path}; response status code: ${status.code}; number of attempts (${attempts}); will retry in ${whenToRetry}ms` ); @@ -110,6 +154,7 @@ export class RetryInterceptor { grpcStatus: status, grpcRequest: options.method_definition, attemptNumber: attempts, + requestMetadata: metadata, }); if (whenToRetry === null) { logger.debug( @@ -118,6 +163,7 @@ export class RetryInterceptor { savedMessageNext(savedReceiveMessage); next(status); } else { + attempts++; logger.debug( `Request eligible for retry: path: ${options.method_definition.path}; response status code: ${status.code}; number of attempts (${attempts}); will retry in ${whenToRetry}ms` ); @@ -139,3 +185,9 @@ export class RetryInterceptor { }; } } + +function calculateDeadline(offsetMillis: number): Date { + const deadline = new Date(Date.now()); + deadline.setMilliseconds(deadline.getMilliseconds() + offsetMillis); + return deadline; +} diff --git a/packages/client-sdk-nodejs/src/internal/internal-auth-client.ts b/packages/client-sdk-nodejs/src/internal/internal-auth-client.ts index 8cf671390..a05479c81 100644 --- a/packages/client-sdk-nodejs/src/internal/internal-auth-client.ts +++ b/packages/client-sdk-nodejs/src/internal/internal-auth-client.ts @@ -1,7 +1,6 @@ import {auth, token} from '@gomomento/generated-types'; import grpcAuth = auth.auth; -import {Header, HeaderInterceptorProvider} from './grpc/headers-interceptor'; -import {ClientTimeoutInterceptor} from './grpc/client-timeout-interceptor'; +import {Header, HeaderInterceptor} from './grpc/headers-interceptor'; import {ChannelCredentials, Interceptor} from '@grpc/grpc-js'; import {version} from '../../package.json'; import {CacheServiceErrorMapper} from '../errors/cache-service-error-mapper'; @@ -58,6 +57,8 @@ import { isDisposableTokenCachePermission, isDisposableTokenPermissionsObject, } from '@gomomento/sdk-core/dist/src/auth/tokens/disposable-token-scope'; +import {RetryInterceptor} from './grpc/retry-interceptor'; +import {AuthClientConfigurations} from '../index'; export class InternalAuthClient implements IAuthClient { private static readonly REQUEST_TIMEOUT_MS: number = 60 * 1000; @@ -69,6 +70,8 @@ export class InternalAuthClient implements IAuthClient { private readonly authClient: grpcAuth.AuthClient; constructor(props: AuthClientProps) { + const configuration = + props.configuration ?? AuthClientConfigurations.Default.latest(); this.cacheServiceErrorMapper = new CacheServiceErrorMapper( props.throwOnErrors ?? false ); @@ -78,8 +81,12 @@ export class InternalAuthClient implements IAuthClient { new Header('runtime-version', `nodejs:${process.versions.node}`), ]; this.interceptors = [ - new HeaderInterceptorProvider(headers).createHeadersInterceptor(), - ClientTimeoutInterceptor(InternalAuthClient.REQUEST_TIMEOUT_MS), + HeaderInterceptor.createHeadersInterceptor(headers), + RetryInterceptor.createRetryInterceptor({ + clientName: 'AuthClient', + loggerFactory: configuration.getLoggerFactory(), + overallRequestTimeoutMs: InternalAuthClient.REQUEST_TIMEOUT_MS, + }), ]; this.tokenClient = new token.token.TokenClient( this.creds.getTokenEndpoint(), diff --git a/packages/client-sdk-nodejs/src/internal/leaderboard-data-client.ts b/packages/client-sdk-nodejs/src/internal/leaderboard-data-client.ts index ea4b9ca3f..f95b9a34c 100644 --- a/packages/client-sdk-nodejs/src/internal/leaderboard-data-client.ts +++ b/packages/client-sdk-nodejs/src/internal/leaderboard-data-client.ts @@ -23,8 +23,7 @@ import {leaderboard} from '@gomomento/generated-types/dist/leaderboard'; import _Element = leaderboard._Element; import {IdleGrpcClientWrapper} from './grpc/idle-grpc-client-wrapper'; import {GrpcClientWrapper} from './grpc/grpc-client-wrapper'; -import {Header, HeaderInterceptorProvider} from './grpc/headers-interceptor'; -import {ClientTimeoutInterceptor} from './grpc/client-timeout-interceptor'; +import {Header, HeaderInterceptor} from './grpc/headers-interceptor'; import {CacheServiceErrorMapper} from '../errors/cache-service-error-mapper'; import { ChannelCredentials, @@ -42,6 +41,7 @@ import { } from '../config/middleware/middleware'; import {grpcChannelOptionsFromGrpcConfig} from './grpc/grpc-channel-options'; import {common} from '@gomomento/generated-types/dist/common'; +import {RetryInterceptor} from './grpc/retry-interceptor'; export const CONNECTION_ID_KEY = Symbol('connectionID'); @@ -142,8 +142,12 @@ export class LeaderboardDataClient implements ILeaderboardDataClient { middlewares, middlewareRequestContext ), - new HeaderInterceptorProvider(headers).createHeadersInterceptor(), - ClientTimeoutInterceptor(this.requestTimeoutMs), + HeaderInterceptor.createHeadersInterceptor(headers), + RetryInterceptor.createRetryInterceptor({ + clientName: 'LeaderboardDataClient', + loggerFactory: _loggerFactory, + overallRequestTimeoutMs: this.requestTimeoutMs, + }), ]; } diff --git a/packages/client-sdk-nodejs/src/internal/ping-client.ts b/packages/client-sdk-nodejs/src/internal/ping-client.ts index d6d5f3b58..9b9292a1b 100644 --- a/packages/client-sdk-nodejs/src/internal/ping-client.ts +++ b/packages/client-sdk-nodejs/src/internal/ping-client.ts @@ -1,13 +1,13 @@ import {ping} from '@gomomento/generated-types'; import grpcPing = ping.cache_client; -import {Header, HeaderInterceptorProvider} from './grpc/headers-interceptor'; -import {ClientTimeoutInterceptor} from './grpc/client-timeout-interceptor'; +import {Header, HeaderInterceptor} from './grpc/headers-interceptor'; import {ChannelCredentials, Interceptor} from '@grpc/grpc-js'; import {version} from '../../package.json'; import {IdleGrpcClientWrapper} from './grpc/idle-grpc-client-wrapper'; import {GrpcClientWrapper} from './grpc/grpc-client-wrapper'; import {Configuration} from '../config/configuration'; import {CredentialProvider, MomentoLogger} from '../'; +import {RetryInterceptor} from './grpc/retry-interceptor'; export interface PingClientProps { configuration: Configuration; @@ -31,8 +31,12 @@ export class InternalNodeGrpcPingClient { new Header('runtime-version', `nodejs:${process.versions.node}`), ]; this.interceptors = [ - new HeaderInterceptorProvider(headers).createHeadersInterceptor(), - ClientTimeoutInterceptor(InternalNodeGrpcPingClient.REQUEST_TIMEOUT_MS), + HeaderInterceptor.createHeadersInterceptor(headers), + RetryInterceptor.createRetryInterceptor({ + clientName: 'PingClient', + loggerFactory: props.configuration.getLoggerFactory(), + overallRequestTimeoutMs: InternalNodeGrpcPingClient.REQUEST_TIMEOUT_MS, + }), ]; this.logger.debug( `Creating ping client using endpoint: '${props.endpoint}` diff --git a/packages/client-sdk-nodejs/src/internal/pubsub-client.ts b/packages/client-sdk-nodejs/src/internal/pubsub-client.ts index 0d4147715..e989a8545 100644 --- a/packages/client-sdk-nodejs/src/internal/pubsub-client.ts +++ b/packages/client-sdk-nodejs/src/internal/pubsub-client.ts @@ -1,8 +1,7 @@ import {pubsub} from '@gomomento/generated-types'; import grpcPubsub = pubsub.cache_client.pubsub; // older versions of node don't have the global util variables https://github.com/nodejs/node/issues/20365 -import {Header, HeaderInterceptorProvider} from './grpc/headers-interceptor'; -import {ClientTimeoutInterceptor} from './grpc/client-timeout-interceptor'; +import {Header, HeaderInterceptor} from './grpc/headers-interceptor'; import {CacheServiceErrorMapper} from '../errors/cache-service-error-mapper'; import {ChannelCredentials, Interceptor, ServiceError} from '@grpc/grpc-js'; import {version} from '../../package.json'; @@ -26,6 +25,7 @@ import { import {TopicConfiguration} from '../config/topic-configuration'; import {TopicClientPropsWithConfiguration} from './topic-client-props-with-config'; import {grpcChannelOptionsFromGrpcConfig} from './grpc/grpc-channel-options'; +import {RetryInterceptor} from './grpc/retry-interceptor'; export class PubsubClient extends AbstractPubsubClient { private readonly client: grpcPubsub.PubsubClient; @@ -306,8 +306,12 @@ export class PubsubClient extends AbstractPubsubClient { ): Interceptor[] { return [ middlewaresInterceptor(configuration.getLoggerFactory(), [], {}), - new HeaderInterceptorProvider(headers).createHeadersInterceptor(), - ClientTimeoutInterceptor(requestTimeoutMs), + HeaderInterceptor.createHeadersInterceptor(headers), + RetryInterceptor.createRetryInterceptor({ + clientName: 'PubSubClient', + loggerFactory: configuration.getLoggerFactory(), + overallRequestTimeoutMs: requestTimeoutMs, + }), ]; } @@ -316,6 +320,6 @@ export class PubsubClient extends AbstractPubsubClient { private static initializeStreamingInterceptors( headers: Header[] ): Interceptor[] { - return [new HeaderInterceptorProvider(headers).createHeadersInterceptor()]; + return [HeaderInterceptor.createHeadersInterceptor(headers)]; } } diff --git a/packages/client-sdk-nodejs/src/internal/storage-control-client.ts b/packages/client-sdk-nodejs/src/internal/storage-control-client.ts index 1e941594d..3056adcb3 100644 --- a/packages/client-sdk-nodejs/src/internal/storage-control-client.ts +++ b/packages/client-sdk-nodejs/src/internal/storage-control-client.ts @@ -1,7 +1,6 @@ import {control} from '@gomomento/generated-types'; import grpcControl = control.control_client; -import {Header, HeaderInterceptorProvider} from './grpc/headers-interceptor'; -import {ClientTimeoutInterceptor} from './grpc/client-timeout-interceptor'; +import {Header, HeaderInterceptor} from './grpc/headers-interceptor'; import {CacheServiceErrorMapper} from '../errors/cache-service-error-mapper'; import {ChannelCredentials, Interceptor} from '@grpc/grpc-js'; import {MomentoLogger, StoreInfo, ListStores, MomentoErrorCode} from '..'; @@ -9,6 +8,7 @@ import {version} from '../../package.json'; import {validateStoreName} from '@gomomento/sdk-core/dist/src/internal/utils'; import {CreateStore, DeleteStore} from '@gomomento/sdk-core'; import {StorageClientPropsWithConfig} from './storage-client-props-with-config'; +import {RetryInterceptor} from './grpc/retry-interceptor'; export class StorageControlClient { private readonly clientWrapper: grpcControl.ScsControlClient; @@ -29,8 +29,12 @@ export class StorageControlClient { new Header('runtime-version', `nodejs:${process.versions.node}`), ]; this.interceptors = [ - new HeaderInterceptorProvider(headers).createHeadersInterceptor(), - ClientTimeoutInterceptor(StorageControlClient.REQUEST_TIMEOUT_MS), + HeaderInterceptor.createHeadersInterceptor(headers), + RetryInterceptor.createRetryInterceptor({ + clientName: 'StorageControlClient', + loggerFactory: props.configuration.getLoggerFactory(), + overallRequestTimeoutMs: StorageControlClient.REQUEST_TIMEOUT_MS, + }), ]; this.logger.debug( `Creating storage control client using endpoint: '${props.credentialProvider.getControlEndpoint()}` diff --git a/packages/client-sdk-nodejs/src/internal/storage-data-client.ts b/packages/client-sdk-nodejs/src/internal/storage-data-client.ts index bca006633..c1113c352 100644 --- a/packages/client-sdk-nodejs/src/internal/storage-data-client.ts +++ b/packages/client-sdk-nodejs/src/internal/storage-data-client.ts @@ -11,8 +11,7 @@ import { } from '@gomomento/sdk-core'; import {validateStoreName} from '@gomomento/sdk-core/dist/src/internal/utils'; import {store} from '@gomomento/generated-types/dist/store'; -import {Header, HeaderInterceptorProvider} from './grpc/headers-interceptor'; -import {ClientTimeoutInterceptor} from './grpc/client-timeout-interceptor'; +import {Header, HeaderInterceptor} from './grpc/headers-interceptor'; import { ChannelCredentials, Interceptor, @@ -26,6 +25,7 @@ import {StorageConfiguration} from '../config/storage-configuration'; import {StorageClientPropsWithConfig} from './storage-client-props-with-config'; import {StaticGrpcConfiguration} from '../config/transport/cache'; import {CacheServiceErrorMapper} from '../errors/cache-service-error-mapper'; +import {RetryInterceptor} from './grpc/retry-interceptor'; export class StorageDataClient implements IStorageDataClient { private readonly configuration: StorageConfiguration; @@ -51,7 +51,7 @@ export class StorageDataClient implements IStorageDataClient { .getDeadlineMillis(); this.validateRequestTimeout(this.requestTimeoutMs); this.logger.debug( - `Creating leaderboard client using endpoint: '${this.credentialProvider.getStorageEndpoint()}'` + `Creating storage client using endpoint: '${this.credentialProvider.getStorageEndpoint()}'` ); // NOTE: This is hard-coded for now but we may want to expose it via StorageConfiguration in the @@ -112,8 +112,13 @@ export class StorageDataClient implements IStorageDataClient { new Header('runtime-version', `nodejs:${process.versions.node}`), ]; return [ - new HeaderInterceptorProvider(headers).createHeadersInterceptor(), - ClientTimeoutInterceptor(this.requestTimeoutMs), + HeaderInterceptor.createHeadersInterceptor(headers), + RetryInterceptor.createRetryInterceptor({ + clientName: 'StorageDataClient', + loggerFactory: this.configuration.getLoggerFactory(), + retryStrategy: this.configuration.getRetryStrategy(), + overallRequestTimeoutMs: this.requestTimeoutMs, + }), ]; } diff --git a/packages/client-sdk-nodejs/src/internal/webhook-client.ts b/packages/client-sdk-nodejs/src/internal/webhook-client.ts index 32e02a076..476be8322 100644 --- a/packages/client-sdk-nodejs/src/internal/webhook-client.ts +++ b/packages/client-sdk-nodejs/src/internal/webhook-client.ts @@ -14,9 +14,8 @@ import { } from '@gomomento/sdk-core'; import {ChannelCredentials, Interceptor} from '@grpc/grpc-js'; import {IWebhookClient} from '@gomomento/sdk-core/dist/src/internal/clients/pubsub/IWebhookClient'; -import {Header, HeaderInterceptorProvider} from './grpc/headers-interceptor'; +import {Header, HeaderInterceptor} from './grpc/headers-interceptor'; import {version} from '../../package.json'; -import {ClientTimeoutInterceptor} from './grpc/client-timeout-interceptor'; import {CacheServiceErrorMapper} from '../errors/cache-service-error-mapper'; import { validateCacheName, @@ -24,6 +23,7 @@ import { validateWebhookName, } from '@gomomento/sdk-core/dist/src/internal/utils'; import {TopicClientPropsWithConfiguration} from './topic-client-props-with-config'; +import {RetryInterceptor} from './grpc/retry-interceptor'; export class WebhookClient implements IWebhookClient { private readonly webhookClient: grpcWebhook.WebhookClient; @@ -48,8 +48,12 @@ export class WebhookClient implements IWebhookClient { new Header('runtime-version', `nodejs:${process.versions.node}`), ]; this.unaryInterceptors = [ - new HeaderInterceptorProvider(headers).createHeadersInterceptor(), - ClientTimeoutInterceptor(WebhookClient.DEFAULT_REQUEST_TIMEOUT_MS), + HeaderInterceptor.createHeadersInterceptor(headers), + RetryInterceptor.createRetryInterceptor({ + clientName: 'WebhookClient', + loggerFactory: props.configuration.getLoggerFactory(), + overallRequestTimeoutMs: WebhookClient.DEFAULT_REQUEST_TIMEOUT_MS, + }), ]; this.webhookClient = new webhook.webhook.WebhookClient( props.credentialProvider.getControlEndpoint(), diff --git a/packages/client-sdk-nodejs/test/unit/storage-retry.test.ts b/packages/client-sdk-nodejs/test/unit/storage-retry.test.ts new file mode 100644 index 000000000..b4087f913 --- /dev/null +++ b/packages/client-sdk-nodejs/test/unit/storage-retry.test.ts @@ -0,0 +1,162 @@ +import {Status} from '@grpc/grpc-js/build/src/constants'; +import { + ClientMethodDefinition, + Deserialize, + Serialize, +} from '@grpc/grpc-js/build/src/make-client'; +import { + DefaultMomentoLoggerFactory, + FixedCountRetryStrategy, + FixedTimeoutRetryStrategy, + StaticStorageGrpcConfiguration, + StaticStorageTransportStrategy, + StorageClientConfiguration, +} from '../../src'; +import {Metadata, StatusObject} from '@grpc/grpc-js'; + +describe('storage configuration', () => { + const testLoggerFactory = new DefaultMomentoLoggerFactory(); + const testGrpcConfiguration = new StaticStorageGrpcConfiguration({ + deadlineMillis: 5000, + }); + const testTransportStrategy = new StaticStorageTransportStrategy({ + grpcConfiguration: testGrpcConfiguration, + }); + const testRetryStrategy = new FixedTimeoutRetryStrategy({ + loggerFactory: testLoggerFactory, + }); + const testConfiguration = new StorageClientConfiguration({ + loggerFactory: testLoggerFactory, + transportStrategy: testTransportStrategy, + retryStrategy: testRetryStrategy, + }); + + it('should support overriding retry strategy', () => { + const newRetryStrategy = new FixedCountRetryStrategy({ + loggerFactory: testLoggerFactory, + maxAttempts: 2, + }); + const configWithNewRetryStrategy = + testConfiguration.withRetryStrategy(newRetryStrategy); + expect(configWithNewRetryStrategy.getLoggerFactory()).toEqual( + testLoggerFactory + ); + expect(configWithNewRetryStrategy.getRetryStrategy()).toEqual( + newRetryStrategy + ); + expect(configWithNewRetryStrategy.getTransportStrategy()).toEqual( + testTransportStrategy + ); + }); + + it('should support overriding transport strategy', () => { + const newTransportStrategy = new StaticStorageTransportStrategy({ + grpcConfiguration: testGrpcConfiguration.withDeadlineMillis(10000), + }); + const configWithNewTransportStrategy = + testConfiguration.withTransportStrategy(newTransportStrategy); + expect(configWithNewTransportStrategy.getLoggerFactory()).toEqual( + testLoggerFactory + ); + expect(configWithNewTransportStrategy.getRetryStrategy()).toEqual( + testRetryStrategy + ); + expect(configWithNewTransportStrategy.getTransportStrategy()).toEqual( + newTransportStrategy + ); + }); + + it('default storage retry strategy retries when eligible', () => { + function testSerialize(value: string): Buffer { + return Buffer.from(value); + } + const sFunc: Serialize = testSerialize; + + function TestDeserialize(bytes: Buffer): string { + return bytes.toString(); + } + const dFunc: Deserialize = TestDeserialize; + + const testClientRequest: ClientMethodDefinition = { + path: '/store.Store/Put', + requestStream: false, + responseStream: false, + requestSerialize: sFunc, + responseDeserialize: dFunc, + }; + + const testGrpcStatusDeadlineExceeded: StatusObject = { + code: Status.DEADLINE_EXCEEDED, + details: 'deadline exceeded', + metadata: new Metadata(), + }; + const whenToRetryDeadlineExceeded = + testRetryStrategy.determineWhenToRetryRequest({ + grpcStatus: testGrpcStatusDeadlineExceeded, + grpcRequest: testClientRequest as ClientMethodDefinition< + unknown, + unknown + >, + attemptNumber: 1, + requestMetadata: new Metadata(), + }); + // should retry after 100ms +/- 10% jitter + expect(whenToRetryDeadlineExceeded).toBeGreaterThanOrEqual(90); + expect(whenToRetryDeadlineExceeded).toBeLessThanOrEqual(110); + + const testGrpcStatusInternalError = { + code: Status.INTERNAL, + details: 'internal server error', + metadata: new Metadata(), + }; + const whenToRetryInternalError = + testRetryStrategy.determineWhenToRetryRequest({ + grpcStatus: testGrpcStatusInternalError, + grpcRequest: testClientRequest as ClientMethodDefinition< + unknown, + unknown + >, + attemptNumber: 1, + requestMetadata: new Metadata(), + }); + // should retry after 100ms +/- 10% jitter + expect(whenToRetryInternalError).toBeGreaterThanOrEqual(90); + expect(whenToRetryInternalError).toBeLessThanOrEqual(110); + + const testGrpcStatusUnavailable = { + code: Status.UNAVAILABLE, + details: 'server unavailable', + metadata: new Metadata(), + }; + const whenToRetryUnavailable = + testRetryStrategy.determineWhenToRetryRequest({ + grpcStatus: testGrpcStatusUnavailable, + grpcRequest: testClientRequest as ClientMethodDefinition< + unknown, + unknown + >, + attemptNumber: 1, + requestMetadata: new Metadata(), + }); + // should retry after 100ms +/- 10% jitter + expect(whenToRetryUnavailable).toBeGreaterThanOrEqual(90); + expect(whenToRetryUnavailable).toBeLessThanOrEqual(110); + + const testGrpcStatusCancelled = { + code: Status.CANCELLED, + details: 'cancelled', + metadata: new Metadata(), + }; + expect( + testRetryStrategy.determineWhenToRetryRequest({ + grpcStatus: testGrpcStatusCancelled, + grpcRequest: testClientRequest as ClientMethodDefinition< + unknown, + unknown + >, + attemptNumber: 1, + requestMetadata: new Metadata(), + }) + ).toBeNull(); // will not retry + }); +}); diff --git a/packages/common-integration-tests/src/storage/storage.ts b/packages/common-integration-tests/src/storage/storage.ts index ca550e470..34d14b8e2 100644 --- a/packages/common-integration-tests/src/storage/storage.ts +++ b/packages/common-integration-tests/src/storage/storage.ts @@ -8,8 +8,13 @@ import { StorageGetResponse, StoragePutResponse, } from '@gomomento/sdk-core'; -import {testStoreName, WithStore} from '../common-int-test-utils'; +import { + expectWithMessage, + testStoreName, + WithStore, +} from '../common-int-test-utils'; import {v4} from 'uuid'; +import {sleep} from '@gomomento/sdk-core/dist/src/internal/utils'; export function runStorageServiceTests( storageClient: IStorageClient, @@ -123,7 +128,9 @@ export function runStorageServiceTests( } } const getIntResponse = await storageClient.get(testingStoreName, key); - expect(getIntResponse.type).toEqual(StorageGetResponse.Found); + expectWithMessage(() => { + expect(getIntResponse.type).toEqual(StorageGetResponse.Found); + }, `expected Found, received ${getIntResponse.toString()}`); expect(getIntResponse.value()?.int()).toEqual(intValue); // put/get a double value @@ -147,7 +154,9 @@ export function runStorageServiceTests( testingStoreName, key ); - expect(getDoubleResponse.type).toEqual(StorageGetResponse.Found); + expectWithMessage(() => { + expect(getDoubleResponse.type).toEqual(StorageGetResponse.Found); + }, `expected Found, received ${getDoubleResponse.toString()}`); expect(getDoubleResponse.value()?.double()).toEqual(doubleValue); // put/get a string value @@ -171,7 +180,9 @@ export function runStorageServiceTests( testingStoreName, key ); - expect(getStringResponse.type).toEqual(StorageGetResponse.Found); + expectWithMessage(() => { + expect(getStringResponse.type).toEqual(StorageGetResponse.Found); + }, `expected Found, received ${getStringResponse.toString()}`); expect(getStringResponse.value()?.string()).toEqual(stringValue); // put/get a bytes value @@ -192,7 +203,9 @@ export function runStorageServiceTests( } } const getBytesResponse = await storageClient.get(testingStoreName, key); - expect(getBytesResponse.type).toEqual(StorageGetResponse.Found); + expectWithMessage(() => { + expect(getBytesResponse.type).toEqual(StorageGetResponse.Found); + }, `expected Found, received ${getBytesResponse.toString()}`); expect(getBytesResponse.value()?.bytes()).toEqual(bytesValue); const deleteResponse = await storageClient.delete( @@ -215,7 +228,9 @@ export function runStorageServiceTests( await WithStore(storageClient, testingStoreName, async () => { const key = v4(); const getResponse = await storageClient.get(testingStoreName, key); - expect(getResponse.type).toEqual(StorageGetResponse.NotFound); + expectWithMessage(() => { + expect(getResponse.type).toEqual(StorageGetResponse.NotFound); + }, `expected NotFound, received ${getResponse.toString()}`); expect(getResponse.value()).toBeUndefined(); }); }); @@ -238,5 +253,21 @@ export function runStorageServiceTests( } } }); + it('should successfully make two of the same requests after 5s retry timeout', async () => { + await WithStore(storageClient, testingStoreName, async () => { + const key = v4(); + const getResponse1 = await storageClient.get(testingStoreName, key); + expectWithMessage(() => { + expect(getResponse1.type).toEqual(StorageGetResponse.NotFound); + }, `expected NotFound, received ${getResponse1.toString()}`); + + await sleep(5000); + + const getResponse2 = await storageClient.get(testingStoreName, key); + expectWithMessage(() => { + expect(getResponse2.type).toEqual(StorageGetResponse.NotFound); + }, `expected NotFound, received ${getResponse2.toString()}`); + }); + }); }); }