From 58dfec68c268390852cc511191c7f9b47ec3e668 Mon Sep 17 00:00:00 2001 From: Cliff Tawiah <82856282+ctawiah@users.noreply.github.com> Date: Thu, 14 Nov 2024 17:38:28 -0600 Subject: [PATCH 1/2] feat: Upgrade edgekv bundled files to 0.6.3 (#610) **Requirements** - [ ] I have added test coverage for new or changed functionality - [x] I have followed the repository's [pull request submission guidelines](../blob/main/CONTRIBUTING.md#submitting-pull-requests) - [x] I have validated my changes against all supported platform versions **Related issues** Provide links to any issues in this repository or elsewhere relating to this pull request. **Describe the solution you've provided** Provide a clear and concise description of what you expect to happen. **Describe alternatives you've considered** Provide a clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context about the pull request here. --------- Co-authored-by: Ryan Lamb <4955475+kinyoklion@users.noreply.github.com> --- .../__tests__/edgekv/edgeKVProvider.test.ts | 13 +- .../src/edgekv/edgeKVProvider.ts | 8 +- .../sdk/akamai-edgekv/src/edgekv/edgekv.js | 757 ++++++++---------- packages/sdk/akamai-edgekv/src/index.ts | 7 +- 4 files changed, 371 insertions(+), 414 deletions(-) diff --git a/packages/sdk/akamai-edgekv/__tests__/edgekv/edgeKVProvider.test.ts b/packages/sdk/akamai-edgekv/__tests__/edgekv/edgeKVProvider.test.ts index b97366dd2..a785aea8c 100644 --- a/packages/sdk/akamai-edgekv/__tests__/edgekv/edgeKVProvider.test.ts +++ b/packages/sdk/akamai-edgekv/__tests__/edgekv/edgeKVProvider.test.ts @@ -1,3 +1,5 @@ +import { LDLogger } from '@launchdarkly/js-server-sdk-common'; + import { EdgeKV } from '../../src/edgekv/edgekv'; import EdgeKVProvider from '../../src/edgekv/edgeKVProvider'; @@ -11,14 +13,21 @@ const NAMESPACE = 'namespace'; const GROUP = 'group'; describe('EdgeKVProvider', () => { + let logger: LDLogger; beforeEach(() => { mockEdgeKV.mockImplementation(() => ({ getText: jest.fn().mockResolvedValue('some-text'), })); + logger = { + debug: jest.fn(), + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + }; }); it('get string from edgeKV', async () => { - const edgeKVProvider = new EdgeKVProvider({ namespace: NAMESPACE, group: GROUP }); + const edgeKVProvider = new EdgeKVProvider({ namespace: NAMESPACE, group: GROUP, logger }); expect(await edgeKVProvider.get('rootKey')).toEqual('some-text'); }); @@ -28,7 +37,7 @@ describe('EdgeKVProvider', () => { getText: jest.fn().mockRejectedValueOnce(expectedError), })); - const edgeKVProvider = new EdgeKVProvider({ namespace: NAMESPACE, group: GROUP }); + const edgeKVProvider = new EdgeKVProvider({ namespace: NAMESPACE, group: GROUP, logger }); const result = await edgeKVProvider.get('rootKey'); expect(result).toBe(undefined); }); diff --git a/packages/sdk/akamai-edgekv/src/edgekv/edgeKVProvider.ts b/packages/sdk/akamai-edgekv/src/edgekv/edgeKVProvider.ts index 66a1f17ed..9924f724a 100644 --- a/packages/sdk/akamai-edgekv/src/edgekv/edgeKVProvider.ts +++ b/packages/sdk/akamai-edgekv/src/edgekv/edgeKVProvider.ts @@ -1,24 +1,28 @@ import { EdgeProvider } from '@launchdarkly/akamai-edgeworker-sdk-common'; +import { LDLogger } from '@launchdarkly/js-server-sdk-common'; import { EdgeKV } from './edgekv'; type EdgeKVProviderParams = { namespace: string; group: string; + logger: LDLogger; }; export default class EdgeKVProvider implements EdgeProvider { private _edgeKv: EdgeKV; + private _logger: LDLogger; - constructor({ namespace, group }: EdgeKVProviderParams) { + constructor({ namespace, group, logger }: EdgeKVProviderParams) { this._edgeKv = new EdgeKV({ namespace, group } as any); + this._logger = logger; } async get(rootKey: string): Promise { try { return await this._edgeKv.getText({ item: rootKey } as any); } catch (e) { - /* empty */ + this._logger?.error(`Error getting value from EdgeKV: ${e}`); } return undefined; } diff --git a/packages/sdk/akamai-edgekv/src/edgekv/edgekv.js b/packages/sdk/akamai-edgekv/src/edgekv/edgekv.js index 5ed3c8e74..722d22325 100644 --- a/packages/sdk/akamai-edgekv/src/edgekv/edgekv.js +++ b/packages/sdk/akamai-edgekv/src/edgekv/edgekv.js @@ -1,6 +1,6 @@ /* (c) Copyright 2020 Akamai Technologies, Inc. Licensed under Apache 2 license. -Version: 0.6.0 +Version: 0.6.3 Purpose: Provide a helper class to simplify the interaction with EdgeKV in an EdgeWorker. Repo: https://github.com/akamai/edgeworkers-examples/tree/master/edgekv/lib */ @@ -15,430 +15,371 @@ import { httpRequest } from 'http-request'; import { edgekv_access_tokens } from 'edgekv_tokens.js'; export class EdgeKV { - #namespace; - #group; - #edgekv_uri; - #token_override; - #num_retries_on_timeout; - #sandbox_id; - #sandbox_fallback; + #namespace; + #group; + #edgekv_uri; + #token_override; + #num_retries_on_timeout; + #sandbox_id; + #sandbox_fallback; - /** - * Constructor to allow setting default namespace and group - * These defaults can be overriden when making individual GET, PUT, and DELETE operations - * @param {string} [$0.namepsace="default"] the default namespace to use for all GET, PUT, and DELETE operations - * Namespace must be 32 characters or less, consisting of A-Z a-z 0-9 _ or - - * @param {string} [$0.group="default"] the default group to use for all GET, PUT, and DELETE operations - * Group must be 128 characters or less, consisting of A-Z a-z 0-9 _ or - - * @param {number} [$0.num_retries_on_timeout=0] the number of times to retry a GET requests when the sub request times out - * @param {object} [$0.ew_request=null] passes the request object from the EdgeWorkers event handler to enable access to EdgeKV data in sandbox environments - * @param {boolean} [$0.sandbox_fallback=false] whether to fallback to retrieving staging data if the sandbox data does not exist, instead of returning null or the specified default value - */ - constructor(namespace = 'default', group = 'default') { - if (typeof namespace === 'object') { - this.#namespace = namespace.namespace || 'default'; - this.#group = namespace.group || 'default'; - this.#edgekv_uri = namespace.edgekv_uri || 'https://edgekv.akamai-edge-svcs.net'; - this.#token_override = namespace.token_override || null; - this.#num_retries_on_timeout = namespace.num_retries_on_timeout || 0; - this.#sandbox_id = namespace.ew_request ? namespace.ew_request.sandboxId || null : null; - this.#sandbox_fallback = namespace.sandbox_fallback || false; - } else { - this.#namespace = namespace; - this.#group = group; - this.#edgekv_uri = 'https://edgekv.akamai-edge-svcs.net'; - this.#token_override = null; - this.#num_retries_on_timeout = 0; - this.#sandbox_id = null; - this.#sandbox_fallback = false; - } - } + /** + * Constructor to allow setting default namespace and group + * These defaults can be overridden when making individual GET, PUT, and DELETE operations + * + * @typedef {Object} Opts + * @property {string} [namespace="default"] the default namespace to use for all GET, PUT, and DELETE operations + * Namespace must be 32 characters or fewer, consisting of A-Z a-z 0-9 _ or - + * @property {string} [group="default"] the default group to use for all GET, PUT, and DELETE operations + * Group must be 128 characters or fewer, consisting of A-Z a-z 0-9 _ or - + * @property {number} [num_retries_on_timeout=0] the number of times to retry a GET requests when the sub request times out + * @property {object} [ew_request=null] passes the request object from the EdgeWorkers event handler to enable access to EdgeKV data in sandbox environments + * @property {boolean} [sandbox_fallback=false] whether to fall back to retrieving staging data if the sandbox data does not exist, instead of returning null or the specified default value + * + * @param {Opts|string} [namespace="default"] the default namespace to use for all GET, PUT, and DELETE operations + * @param {string} [group="default"] the default group to use for all GET, PUT, and DELETE operations + * Group must be 128 characters or fewer, consisting of A-Z a-z 0-9 _ or - + */ + constructor(namespace = "default", group = "default") { + if (typeof namespace === "object") { + this.#namespace = namespace.namespace || "default"; + this.#group = namespace.group || "default"; + this.#edgekv_uri = namespace.edgekv_uri || "https://edgekv.akamai-edge-svcs.net"; + this.#token_override = namespace.token_override || null; + this.#num_retries_on_timeout = namespace.num_retries_on_timeout || 0; + this.#sandbox_id = (namespace.ew_request ? (namespace.ew_request.sandboxId || null) : null); + this.#sandbox_fallback = namespace.sandbox_fallback || false; + } else { + this.#namespace = namespace; + this.#group = group; + this.#edgekv_uri = "https://edgekv.akamai-edge-svcs.net"; + this.#token_override = null; + this.#num_retries_on_timeout = 0; + this.#sandbox_id = null; + this.#sandbox_fallback = false; + } + } - throwError(failed_reason, status, body) { - throw { - failed: failed_reason, - status: status, - body: body, - toString: function () { - return JSON.stringify(this); - }, - }; - } + /** + * if EdgeKV operation was not successful, an object describing the non-200 response + * @typedef {Object} EdgeKVError + * @property {string} failed - Failure reason. + * @property {number} status - HTTP status code. + * @property {*} body - Response body. + */ - async requestHandlerTemplate( - http_request, - handler_200, - handler_large_200, - error_text, - default_value, - num_retries_on_timeout - ) { - try { - let response = await http_request(); - switch (response.status) { - case 200: - // need to handle content length > 128000 bytes differently in EdgeWorkers - let contentLength = response.getHeader('Content-Length'); - if (!contentLength || contentLength.length == 0 || contentLength[0] >= 128000) { - return handler_large_200(response); - } else { - return handler_200(response); - } - case 404: - return default_value; - default: - let content = ''; - try { - content = await response.text(); - content = JSON.parse(content); - } catch (error) {} - throw { status: response.status, body: content }; // to be caught in surrounding catch block - } - } catch (error) { - if ( - num_retries_on_timeout > 0 && - /^.*subrequest to URL.*timed out.*$/.test(error.toString()) - ) { - return this.requestHandlerTemplate( - http_request, - handler_200, - handler_large_200, - error_text, - default_value, - num_retries_on_timeout - 1 - ); - } - if (error.hasOwnProperty('status')) { - this.throwError(error_text + ' FAILED', error.status, error.body); - } - this.throwError(error_text + ' FAILED', 0, error.toString()); - } - } + throwError(failed_reason, status, body) { + throw { + failed: failed_reason, + status: status, + body: body, + toString: function () { return JSON.stringify(this); } + }; + } - validate({ namespace = null, group = null, item = null }) { - if (!namespace || !/^[A-Za-z0-9_-]{1,32}$/.test(namespace)) { - throw 'Namespace is not valid. Must be 32 characters or less, consisting of A-Z a-z 0-9 _ or -'; - } - if (!group || !/^[A-Za-z0-9_-]{1,128}$/.test(group)) { - throw 'Group is not valid. Must be 128 characters or less, consisting of A-Z a-z 0-9 _ or -'; - } - if (!item || !/^[A-Za-z0-9_-]{1,512}$/.test(item)) { - throw 'Item is not valid. Must be 512 characters or less, consisting of A-Z a-z 0-9 _ or -'; - } - } + async requestHandlerTemplate(http_request, handler_200, handler_large_200, error_text, default_value, num_retries_on_timeout) { + try { + let response = await http_request(); + switch (response.status) { + case 200: + // need to handle content length > 128000 bytes differently in EdgeWorkers + let contentLength = response.getHeader('Content-Length'); + if (!contentLength || contentLength.length === 0 || contentLength[0] >= 128000) { + return handler_large_200(response); + } else { + return handler_200(response); + } + case 404: + return default_value; + default: + let content = ""; + try { + content = await response.text(); + content = JSON.parse(content); + } catch (error) { } + throw { status: response.status, body: content }; // to be caught in surrounding catch block + } + } catch (error) { + if (num_retries_on_timeout > 0 && /^.*subrequest to URL.*timed out.*$/.test(error.toString())) { + return this.requestHandlerTemplate(http_request, handler_200, handler_large_200, error_text, default_value, num_retries_on_timeout - 1); + } + if (error.hasOwnProperty('status')) { + this.throwError(error_text + " FAILED", error.status, error.body); + } + this.throwError(error_text + " FAILED", 0, error.toString()); + } + } - getNamespaceToken(namespace) { - if (this.#token_override) { - return this.#token_override; - } - let name = 'namespace-' + namespace; - if (!(name in edgekv_access_tokens)) { - throw ( - "MISSING ACCESS TOKEN. No EdgeKV Access Token defined for namespace '" + namespace + "'." - ); - } - return edgekv_access_tokens[name]['value']; - } + validate({ namespace = null, group = null, item = null }) { + if (!namespace || !/^[A-Za-z0-9_-]{1,32}$/.test(namespace)) { + throw "Namespace is not valid. Must be 32 characters or less, consisting of A-Z a-z 0-9 _ or -"; + } + if (!group || !/^[A-Za-z0-9_-]{1,128}$/.test(group)) { + throw "Group is not valid. Must be 128 characters or less, consisting of A-Z a-z 0-9 _ or -"; + } + if (!item || !/^[A-Za-z0-9_-]{1,512}$/.test(item)) { + throw "Item is not valid. Must be 512 characters or less, consisting of A-Z a-z 0-9 _ or -"; + } + } - addTimeout(options, timeout) { - if ( - timeout && - (typeof timeout !== 'number' || !isFinite(timeout) || timeout <= 0 || timeout > 1000) - ) { - throw 'Timeout is not valid. Must be a number greater than 0 and less than 1000.'; - } - if (timeout) { - options.timeout = timeout; - } - return options; - } + getNamespaceTokenHeader(namespace) { + if (this.#token_override) { + return this.#token_override; + } + let name = "namespace-" + namespace; + if (!(name in edgekv_access_tokens)) { + throw "MISSING ACCESS TOKEN. No EdgeKV Access Token defined for namespace '" + namespace + "'."; + } + if ("value" in edgekv_access_tokens[name]) { + return { 'X-Akamai-EdgeDB-Auth': [edgekv_access_tokens[name]["value"]]}; + } else if ("reference" in edgekv_access_tokens[name]) { + return { 'X-Akamai-EdgeDB-Auth-Ref': [edgekv_access_tokens[name]["reference"]]}; + } else { + throw "MISSING ACCESS TOKEN. No EdgeKV Access Token value or reference defined for namespace '" + namespace + "'."; + } + } - addSandboxId(uri) { - if (this.#sandbox_id) { - uri = uri + '?sandboxId=' + this.#sandbox_id; - if (this.#sandbox_fallback) { - uri = uri + '&sandboxFallback=true'; - } - } - return uri; - } + addTimeout(options, timeout) { + if (timeout && (typeof timeout !== 'number' || !isFinite(timeout) || timeout <= 0 || timeout > 4000)) { + throw "Timeout is not valid. Must be a number greater than 0 and less than 4000."; + } + if (timeout) { + options.timeout = timeout; + } + return options; + } - async streamText(response_body) { - let result = ''; - await response_body.pipeThrough(new TextDecoderStream()).pipeTo( - new WritableStream({ - write(chunk) { - result += chunk; - }, - }), - { preventAbort: true } - ); - return result; - } + addSandboxId(uri) { + if (this.#sandbox_id) { + uri = uri + "?sandboxId=" + this.#sandbox_id; + if (this.#sandbox_fallback) { + uri = uri + "&sandboxFallback=true"; + } + } + return uri; + } - async streamJson(response_body) { - return JSON.parse(await this.streamText(response_body)); - } + async streamText(response_body) { + let result = ""; + await response_body + .pipeThrough(new TextDecoderStream()) + .pipeTo(new WritableStream({ + write(chunk) { + result += chunk; + } + }), { preventAbort: true }); + return result; + } - putRequest({ - namespace = this.#namespace, - group = this.#group, - item, - value, - timeout = null, - } = {}) { - this.validate({ namespace: namespace, group: group, item: item }); - let uri = - this.#edgekv_uri + '/api/v1/namespaces/' + namespace + '/groups/' + group + '/items/' + item; - return httpRequest( - this.addSandboxId(uri), - this.addTimeout( - { - method: 'PUT', - body: typeof value === 'object' ? JSON.stringify(value) : value, - headers: { 'X-Akamai-EdgeDB-Auth': [this.getNamespaceToken(namespace)] }, - }, - timeout - ) - ); - } + async streamJson(response_body) { + return JSON.parse(await this.streamText(response_body)); + } - /** - * async PUT text into an item in the EdgeKV. - * @param {string} [$0.namepsace=this.#namespace] specify a namespace other than the default - * @param {string} [$0.group=this.#group] specify a group other than the default - * @param {string} $0.item item key to put into the EdgeKV - * @param {string} $0.value text value to put into the EdgeKV - * @param {number} [$0.timeout=null] the maximum time, between 1 and 1000 milliseconds, to wait for the response - * @returns {Promise} if the operation was successful, the response from the EdgeKV - * @throws {object} if the operation was not successful, - * an object describing the non-200 response from the EdgeKV: {failed, status, body} - */ - async putText({ - namespace = this.#namespace, - group = this.#group, - item, - value, - timeout = null, - } = {}) { - return this.requestHandlerTemplate( - () => - this.putRequest({ - namespace: namespace, - group: group, - item: item, - value: value, - timeout: timeout, - }), - (response) => response.text(), - (response) => this.streamText(response.body), - 'PUT', - null, - 0 - ); - } + putRequest(args) { + const { namespace = this.#namespace, group = this.#group, item, value, timeout = null } = args || {}; + this.validate({ namespace: namespace, group: group, item: item }); + let uri = this.#edgekv_uri + "/api/v1/namespaces/" + namespace + "/groups/" + group + "/items/" + item; + return httpRequest(this.addSandboxId(uri), this.addTimeout({ + method: "PUT", + body: typeof value === "object" ? JSON.stringify(value) : value, + headers: { ...this.getNamespaceTokenHeader(namespace) } + }, timeout)); + } - /** - * PUT text into an item in the EdgeKV while only waiting for the request to send and not for the response. - * @param {string} [$0.namepsace=this.#namespace] specify a namespace other than the default - * @param {string} [$0.group=this.#group] specify a group other than the default - * @param {string} $0.item item key to put into the EdgeKV - * @param {string} $0.value text value to put into the EdgeKV - * @throws {object} if the operation was not successful at sending the request, - * an object describing the error: {failed, status, body} - */ - putTextNoWait({ namespace = this.#namespace, group = this.#group, item, value } = {}) { - try { - this.putRequest({ namespace: namespace, group: group, item: item, value: value }); - } catch (error) { - this.throwError('PUT FAILED', 0, error.toString()); - } - } + /** + * async PUT text into an item in the EdgeKV. + * @param {Object} args + * @param {string} [args.namespace=this.#namespace] specify a namespace other than the default + * @param {string} [args.group=this.#group] specify a group other than the default + * @param {string} args.item item key to put into the EdgeKV + * @param {string} args.value text value to put into the EdgeKV + * @param {number?} [args.timeout=null] the maximum time, between 1 and 4000 milliseconds, to wait for the response + * @returns {Promise} if the operation was successful, the response from the EdgeKV + * @throws {EdgeKVError} if the operation was not successful, + * an object describing the non-200 response from the EdgeKV: {failed, status, body} + */ + async putText(args) { + const { namespace = this.#namespace, group = this.#group, item, value, timeout = null } = args || {}; + return this.requestHandlerTemplate( + () => this.putRequest({ namespace: namespace, group: group, item: item, value: value, timeout: timeout }), + (response) => response.text(), + (response) => this.streamText(response.body), + "PUT", + null, + 0 + ); + } - /** - * async PUT json into an item in the EdgeKV. - * @param {string} [$0.namepsace=this.#namespace] specify a namespace other than the default - * @param {string} [$0.group=this.#group] specify a group other than the default - * @param {string} $0.item item key to put into the EdgeKV - * @param {object} $0.value json value to put into the EdgeKV - * @param {number} [$0.timeout=null] the maximum time, between 1 and 1000 milliseconds, to wait for the response - * @returns {Promise} if the operation was successful, the response from the EdgeKV - * @throws {object} if the operation was not successful, - * an object describing the non-200 response from the EdgeKV: {failed, status, body} - */ - async putJson({ - namespace = this.#namespace, - group = this.#group, - item, - value, - timeout = null, - } = {}) { - return this.requestHandlerTemplate( - () => - this.putRequest({ - namespace: namespace, - group: group, - item: item, - value: JSON.stringify(value), - timeout: timeout, - }), - (response) => response.text(), - (response) => this.streamText(response.body), - 'PUT', - null, - 0 - ); - } + /** + * PUT text into an item in the EdgeKV while only waiting for the request to send and not for the response. + * @param {Object} args + * @param {string} [args.namespace=this.#namespace] specify a namespace other than the default + * @param {string} [args.group=this.#group] specify a group other than the default + * @param {string} args.item item key to put into the EdgeKV + * @param {string} args.value text value to put into the EdgeKV + * @throws {EdgeKVError} if the operation was not successful at sending the request, + * an object describing the error: {failed, status, body} + */ + putTextNoWait(args) { + const { namespace = this.#namespace, group = this.#group, item, value } = args || {}; + try { + this.putRequest({ namespace: namespace, group: group, item: item, value: value }); + } catch (error) { + this.throwError("PUT FAILED", 0, error.toString()); + } + } - /** - * PUT json into an item in the EdgeKV while only waiting for the request to send and not for the response. - * @param {string} [$0.namepsace=this.#namespace] specify a namespace other than the default - * @param {string} [$0.group=this.#group] specify a group other than the default - * @param {string} $0.item item key to put into the EdgeKV - * @param {object} $0.value json value to put into the EdgeKV - * @throws {object} if the operation was not successful at sending the request, - * an object describing the error: {failed, status, body} - */ - putJsonNoWait({ namespace = this.#namespace, group = this.#group, item, value } = {}) { - try { - this.putRequest({ - namespace: namespace, - group: group, - item: item, - value: JSON.stringify(value), - }); - } catch (error) { - this.throwError('PUT FAILED', 0, error.toString()); - } - } + /** + * async PUT json into an item in the EdgeKV. + * @param {Object} args + * @param {string} [args.namespace=this.#namespace] specify a namespace other than the default + * @param {string} [args.group=this.#group] specify a group other than the default + * @param {string} args.item item key to put into the EdgeKV + * @param {Object} args.value json value to put into the EdgeKV + * @param {number?} [args.timeout=null] the maximum time, between 1 and 4000 milliseconds, to wait for the response + * @returns {Promise} if the operation was successful, the response from the EdgeKV + * @throws {EdgeKVError} if the operation was not successful, + * an object describing the non-200 response from the EdgeKV: {failed, status, body} + */ + async putJson(args) { + const { namespace = this.#namespace, group = this.#group, item, value, timeout = null } = args || {}; + return this.requestHandlerTemplate( + () => this.putRequest({ namespace: namespace, group: group, item: item, value: JSON.stringify(value), timeout: timeout }), + (response) => response.text(), + (response) => this.streamText(response.body), + "PUT", + null, + 0 + ); + } - getRequest({ namespace = this.#namespace, group = this.#group, item, timeout = null } = {}) { - this.validate({ namespace: namespace, group: group, item: item }); - let uri = - this.#edgekv_uri + '/api/v1/namespaces/' + namespace + '/groups/' + group + '/items/' + item; - return httpRequest( - this.addSandboxId(uri), - this.addTimeout( - { - method: 'GET', - headers: { 'X-Akamai-EdgeDB-Auth': [this.getNamespaceToken(namespace)] }, - }, - timeout - ) - ); - } + /** + * PUT json into an item in the EdgeKV while only waiting for the request to send and not for the response. + * @param {Object} args + * @param {string} [args.namespace=this.#namespace] specify a namespace other than the default + * @param {string} [args.group=this.#group] specify a group other than the default + * @param {string} args.item item key to put into the EdgeKV + * @param {object} args.value json value to put into the EdgeKV + * @throws {EdgeKVError} if the operation was not successful at sending the request, + * an object describing the error: {failed, status, body} + */ + putJsonNoWait(args) { + const { namespace = this.#namespace, group = this.#group, item, value } = args || {}; + try { + this.putRequest({ namespace: namespace, group: group, item: item, value: JSON.stringify(value) }); + } catch (error) { + this.throwError("PUT FAILED", 0, error.toString()); + } + } - /** - * async GET text from an item in the EdgeKV. - * @param {string} [$0.namepsace=this.#namespace] specify a namespace other than the default - * @param {string} [$0.group=this.#group] specify a group other than the default - * @param {string} $0.item item key to get from the EdgeKV - * @param {string} [$0.default_value=null] the default value to return if a 404 response is returned from EdgeKV - * @param {number} [$0.timeout=null] the maximum time, between 1 and 1000 milliseconds, to wait for the response - * @param {number} [$0.num_retries_on_timeout=null] the number of times to retry a requests when the sub request times out - * @returns {Promise} if the operation was successful, the text response from the EdgeKV or the default_value on 404 - * @throws {object} if the operation was not successful, - * an object describing the non-200 and non-404 response from the EdgeKV: {failed, status, body} - */ - async getText({ - namespace = this.#namespace, - group = this.#group, - item, - default_value = null, - timeout = null, - num_retries_on_timeout = null, - } = {}) { - return this.requestHandlerTemplate( - () => this.getRequest({ namespace: namespace, group: group, item: item, timeout: timeout }), - (response) => response.text(), - (response) => this.streamText(response.body), - 'GET TEXT', - default_value, - num_retries_on_timeout ?? this.#num_retries_on_timeout - ); - } + getRequest(args) { + const { namespace = this.#namespace, group = this.#group, item, timeout = null } = args || {}; + this.validate({ namespace: namespace, group: group, item: item }); + let uri = this.#edgekv_uri + "/api/v1/namespaces/" + namespace + "/groups/" + group + "/items/" + item; + return httpRequest(this.addSandboxId(uri), this.addTimeout({ + method: "GET", + headers: { ...this.getNamespaceTokenHeader(namespace) } + }, timeout)); + } - /** - * async GET json from an item in the EdgeKV. - * @param {string} [$0.namepsace=this.#namespace] specify a namespace other than the default - * @param {string} [$0.group=this.#group] specify a group other than the default - * @param {string} $0.item item key to get from the EdgeKV - * @param {object} [$0.default_value=null] the default value to return if a 404 response is returned from EdgeKV - * @param {number} [$0.timeout=null] the maximum time, between 1 and 1000 milliseconds, to wait for the response - * @param {number} [$0.num_retries_on_timeout=null] the number of times to retry a requests when the sub request times out - * @returns {Promise} if the operation was successful, the json response from the EdgeKV or the default_value on 404 - * @throws {object} if the operation was not successful, - * an object describing the non-200 and non-404 response from the EdgeKV: {failed, status, body} - */ - async getJson({ - namespace = this.#namespace, - group = this.#group, - item, - default_value = null, - timeout = null, - num_retries_on_timeout = null, - } = {}) { - return this.requestHandlerTemplate( - () => this.getRequest({ namespace: namespace, group: group, item: item, timeout: timeout }), - (response) => response.json(), - (response) => this.streamJson(response.body), - 'GET JSON', - default_value, - num_retries_on_timeout ?? this.#num_retries_on_timeout - ); - } + /** + * async GET text from an item in the EdgeKV. + * @param {Object} args + * @param {string} [args.namespace=this.#namespace] specify a namespace other than the default + * @param {string} [args.group=this.#group] specify a group other than the default + * @param {string} args.item item key to get from the EdgeKV + * @param {string?} [args.default_value=null] the default value to return if a 404 response is returned from EdgeKV + * @param {number?} [args.timeout=null] the maximum time, between 1 and 4000 milliseconds, to wait for the response + * @param {number?} [args.num_retries_on_timeout=null] the number of times to retry a requests when the sub request times out + * @returns {Promise} if the operation was successful, the text response from the EdgeKV or the default_value on 404 + * @throws {EdgeKVError} if the operation was not successful, + * an object describing the non-200 and non-404 response from the EdgeKV: {failed, status, body} + */ + async getText(args) { + const { namespace = this.#namespace, group = this.#group, item, default_value = null, timeout = null, num_retries_on_timeout = null } = args || {}; + return this.requestHandlerTemplate( + () => this.getRequest({ namespace: namespace, group: group, item: item, timeout: timeout }), + (response) => response.text(), + (response) => this.streamText(response.body), + "GET TEXT", + default_value, + num_retries_on_timeout ?? this.#num_retries_on_timeout + ); + } - deleteRequest({ namespace = this.#namespace, group = this.#group, item, timeout = null } = {}) { - this.validate({ namespace: namespace, group: group, item: item }); - let uri = - this.#edgekv_uri + '/api/v1/namespaces/' + namespace + '/groups/' + group + '/items/' + item; - return httpRequest( - this.addSandboxId(uri), - this.addTimeout( - { - method: 'DELETE', - headers: { 'X-Akamai-EdgeDB-Auth': [this.getNamespaceToken(namespace)] }, - }, - timeout - ) - ); - } + /** + * async GET json from an item in the EdgeKV. + * @param {Object} args + * @param {string} [args.namespace=this.#namespace] specify a namespace other than the default + * @param {string} [args.group=this.#group] specify a group other than the default + * @param {string} args.item item key to get from the EdgeKV + * @param {Object} [args.default_value=null] the default value to return if a 404 response is returned from EdgeKV + * @param {number?} [args.timeout=null] the maximum time, between 1 and 4000 milliseconds, to wait for the response + * @param {number?} [args.num_retries_on_timeout=null] the number of times to retry a requests when the sub request times out + * @returns {Promise} if the operation was successful, the json response from the EdgeKV or the default_value on 404 + * @throws {EdgeKVError} if the operation was not successful, + * an object describing the non-200 and non-404 response from the EdgeKV: {failed, status, body} + */ + async getJson(args) { + const { namespace = this.#namespace, group = this.#group, item, default_value = null, timeout = null, num_retries_on_timeout = null } = args || {}; + return this.requestHandlerTemplate( + () => this.getRequest({ namespace: namespace, group: group, item: item, timeout: timeout }), + (response) => response.json(), + (response) => this.streamJson(response.body), + "GET JSON", + default_value, + num_retries_on_timeout ?? this.#num_retries_on_timeout + ); + } - /** - * async DELETE an item in the EdgeKV. - * @param {string} [$0.namepsace=this.#namespace] specify a namespace other than the default - * @param {string} [$0.group=this.#group] specify a group other than the default - * @param {string} $0.item item key to delete from the EdgeKV - * @param {number} [$0.timeout=null] the maximum time, between 1 and 1000 milliseconds, to wait for the response - * @returns {Promise} if the operation was successful, the text response from the EdgeKV - * @throws {object} if the operation was not successful, - * an object describing the non-200 response from the EdgeKV: {failed, status, body} - */ - async delete({ namespace = this.#namespace, group = this.#group, item, timeout = null } = {}) { - return this.requestHandlerTemplate( - () => - this.deleteRequest({ namespace: namespace, group: group, item: item, timeout: timeout }), - (response) => response.text(), - (response) => this.streamText(response.body), - 'DELETE', - null, - 0 - ); - } + deleteRequest(args) { + const { namespace = this.#namespace, group = this.#group, item, timeout = null } = args || {}; + this.validate({ namespace: namespace, group: group, item: item }); + let uri = this.#edgekv_uri + "/api/v1/namespaces/" + namespace + "/groups/" + group + "/items/" + item; + return httpRequest(this.addSandboxId(uri), this.addTimeout({ + method: "DELETE", + headers: { ...this.getNamespaceTokenHeader(namespace) } + }, timeout)); + } - /** - * DELETE an item in the EdgeKV while only waiting for the request to send and not for the response. - * @param {string} [$0.namepsace=this.#namespace] specify a namespace other than the default - * @param {string} [$0.group=this.#group] specify a group other than the default - * @param {string} $0.item item key to delete from the EdgeKV - * @throws {object} if the operation was not successful at sending the request, - * an object describing the error: {failed, status, body} - */ - deleteNoWait({ namespace = this.#namespace, group = this.#group, item } = {}) { - try { - this.delete({ namespace: namespace, group: group, item: item }); - } catch (error) { - this.throwError('DELETE FAILED', 0, error.toString()); - } - } -} + /** + * async DELETE an item in the EdgeKV. + * @param {Object} args + * @param {string} [args.namespace=this.#namespace] specify a namespace other than the default + * @param {string} [args.group=this.#group] specify a group other than the default + * @param {string} args.item item key to delete from the EdgeKV + * @param {number?} [args.timeout=null] the maximum time, between 1 and 4000 milliseconds, to wait for the response + * @returns {Promise} if the operation was successful, the text response from the EdgeKV + * @throws {EdgeKVError} if the operation was not successful, + * an object describing the non-200 response from the EdgeKV: {failed, status, body} + */ + async delete(args) { + const { namespace = this.#namespace, group = this.#group, item, timeout = null } = args || {}; + return this.requestHandlerTemplate( + () => this.deleteRequest({ namespace: namespace, group: group, item: item, timeout: timeout }), + (response) => response.text(), + (response) => this.streamText(response.body), + "DELETE", + null, + 0 + ); + } + + /** + * DELETE an item in the EdgeKV while only waiting for the request to send and not for the response. + * @param {Object} args + * @param {string} [args.namespace=this.#namespace] specify a namespace other than the default + * @param {string} [args.group=this.#group] specify a group other than the default + * @param {string} args.item item key to delete from the EdgeKV + * @throws {EdgeKVError} if the operation was not successful at sending the request, + * an object describing the error: {failed, status, body} + */ + deleteNoWait(args) { + const { namespace = this.#namespace, group = this.#group, item } = args || {}; + try { + this.delete({ namespace: namespace, group: group, item: item }); + } catch (error) { + this.throwError("DELETE FAILED", 0, error.toString()); + } + } +} \ No newline at end of file diff --git a/packages/sdk/akamai-edgekv/src/index.ts b/packages/sdk/akamai-edgekv/src/index.ts index d5780ba39..acdd85b58 100644 --- a/packages/sdk/akamai-edgekv/src/index.ts +++ b/packages/sdk/akamai-edgekv/src/index.ts @@ -9,6 +9,7 @@ * @packageDocumentation */ import { init as initEdge, LDClient, LDOptions } from '@launchdarkly/akamai-edgeworker-sdk-common'; +import { BasicLogger } from '@launchdarkly/js-server-sdk-common'; import EdgeKVProvider from './edgekv/edgeKVProvider'; @@ -32,11 +33,13 @@ export const init = ({ options = {}, sdkKey, }: AkamaiLDClientParams): LDClient => { - const edgekvProvider = new EdgeKVProvider({ namespace, group }); + const logger = options.logger ?? BasicLogger.get(); + + const edgekvProvider = new EdgeKVProvider({ namespace, group, logger }); return initEdge({ sdkKey, - options, + options: { ...options, logger }, featureStoreProvider: edgekvProvider, platformName: 'Akamai EdgeWorker', sdkName: '@launchdarkly/akamai-server-edgekv-sdk', From 8ad7d465d80af49f55e1cdc0f939fa1d0cabba4e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2024 15:42:20 -0800 Subject: [PATCH 2/2] chore: release main (#686) :robot: I have created a release *beep* *boop* ---
akamai-edgeworker-sdk-common: 1.3.2 ## [1.3.2](https://github.com/launchdarkly/js-core/compare/akamai-edgeworker-sdk-common-v1.3.1...akamai-edgeworker-sdk-common-v1.3.2) (2024-11-14) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/js-server-sdk-common bumped from ^2.9.1 to ^2.10.0
akamai-server-base-sdk: 2.1.20 ## [2.1.20](https://github.com/launchdarkly/js-core/compare/akamai-server-base-sdk-v2.1.19...akamai-server-base-sdk-v2.1.20) (2024-11-14) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/akamai-edgeworker-sdk-common bumped from ^1.3.1 to ^1.3.2 * @launchdarkly/js-server-sdk-common bumped from ^2.9.1 to ^2.10.0
akamai-server-edgekv-sdk: 1.3.0 ## [1.3.0](https://github.com/launchdarkly/js-core/compare/akamai-server-edgekv-sdk-v1.2.1...akamai-server-edgekv-sdk-v1.3.0) (2024-11-14) ### Features * Upgrade edgekv bundled files to 0.6.3 ([#610](https://github.com/launchdarkly/js-core/issues/610)) ([58dfec6](https://github.com/launchdarkly/js-core/commit/58dfec68c268390852cc511191c7f9b47ec3e668)) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/akamai-edgeworker-sdk-common bumped from ^1.3.1 to ^1.3.2 * @launchdarkly/js-server-sdk-common bumped from ^2.9.1 to ^2.10.0
cloudflare-server-sdk: 2.6.2 ## [2.6.2](https://github.com/launchdarkly/js-core/compare/cloudflare-server-sdk-v2.6.1...cloudflare-server-sdk-v2.6.2) (2024-11-14) ### Dependencies * The following workspace dependencies were updated * devDependencies * @launchdarkly/js-server-sdk-common-edge bumped from 2.5.1 to 2.5.2
js-server-sdk-common: 2.10.0 ## [2.10.0](https://github.com/launchdarkly/js-core/compare/js-server-sdk-common-v2.9.1...js-server-sdk-common-v2.10.0) (2024-11-14) ### Features * Add support for getting the logger from server-side SDKs. ([#684](https://github.com/launchdarkly/js-core/issues/684)) ([1c411a1](https://github.com/launchdarkly/js-core/commit/1c411a15e308520dc7a0f20af76045f84d53e8a4))
js-server-sdk-common-edge: 2.5.2 ## [2.5.2](https://github.com/launchdarkly/js-core/compare/js-server-sdk-common-edge-v2.5.1...js-server-sdk-common-edge-v2.5.2) (2024-11-14) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/js-server-sdk-common bumped from 2.9.1 to 2.10.0
node-server-sdk: 9.7.2 ## [9.7.2](https://github.com/launchdarkly/js-core/compare/node-server-sdk-v9.7.1...node-server-sdk-v9.7.2) (2024-11-14) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/js-server-sdk-common bumped from 2.9.1 to 2.10.0
node-server-sdk-dynamodb: 6.2.2 ## [6.2.2](https://github.com/launchdarkly/js-core/compare/node-server-sdk-dynamodb-v6.2.1...node-server-sdk-dynamodb-v6.2.2) (2024-11-14) ### Dependencies * The following workspace dependencies were updated * devDependencies * @launchdarkly/node-server-sdk bumped from 9.7.1 to 9.7.2 * peerDependencies * @launchdarkly/node-server-sdk bumped from >=9.4.3 to >=9.7.2
node-server-sdk-otel: 1.1.2 ## [1.1.2](https://github.com/launchdarkly/js-core/compare/node-server-sdk-otel-v1.1.1...node-server-sdk-otel-v1.1.2) (2024-11-14) ### Dependencies * The following workspace dependencies were updated * devDependencies * @launchdarkly/node-server-sdk bumped from 9.7.1 to 9.7.2 * peerDependencies * @launchdarkly/node-server-sdk bumped from >=9.4.3 to >=9.7.2
node-server-sdk-redis: 4.2.2 ## [4.2.2](https://github.com/launchdarkly/js-core/compare/node-server-sdk-redis-v4.2.1...node-server-sdk-redis-v4.2.2) (2024-11-14) ### Dependencies * The following workspace dependencies were updated * devDependencies * @launchdarkly/node-server-sdk bumped from 9.7.1 to 9.7.2 * peerDependencies * @launchdarkly/node-server-sdk bumped from >=9.4.3 to >=9.7.2
server-sdk-ai: 0.2.1 ## [0.2.1](https://github.com/launchdarkly/js-core/compare/server-sdk-ai-v0.2.0...server-sdk-ai-v0.2.1) (2024-11-14) ### Dependencies * The following workspace dependencies were updated * devDependencies * @launchdarkly/js-server-sdk-common bumped from 2.9.0 to 2.10.0 * peerDependencies * @launchdarkly/js-server-sdk-common bumped from 2.x to 2.10.0
vercel-server-sdk: 1.3.21 ## [1.3.21](https://github.com/launchdarkly/js-core/compare/vercel-server-sdk-v1.3.20...vercel-server-sdk-v1.3.21) (2024-11-14) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/js-server-sdk-common-edge bumped from 2.5.1 to 2.5.2
--- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .release-please-manifest.json | 24 +++++++++---------- packages/sdk/akamai-base/CHANGELOG.md | 10 ++++++++ packages/sdk/akamai-base/example/package.json | 2 +- packages/sdk/akamai-base/package.json | 6 ++--- packages/sdk/akamai-edgekv/CHANGELOG.md | 15 ++++++++++++ .../sdk/akamai-edgekv/example/package.json | 2 +- packages/sdk/akamai-edgekv/package.json | 6 ++--- packages/sdk/cloudflare/CHANGELOG.md | 9 +++++++ packages/sdk/cloudflare/example/package.json | 2 +- packages/sdk/cloudflare/jsr.json | 14 ++++++++--- packages/sdk/cloudflare/package.json | 4 ++-- .../sdk/cloudflare/src/createPlatformInfo.ts | 2 +- packages/sdk/server-ai/CHANGELOG.md | 11 +++++++++ .../server-ai/examples/bedrock/package.json | 2 +- .../server-ai/examples/openai/package.json | 2 +- packages/sdk/server-ai/package.json | 4 ++-- packages/sdk/server-node/CHANGELOG.md | 9 +++++++ packages/sdk/server-node/package.json | 4 ++-- packages/sdk/vercel/CHANGELOG.md | 9 +++++++ packages/sdk/vercel/package.json | 4 ++-- .../shared/akamai-edgeworker-sdk/CHANGELOG.md | 9 +++++++ .../shared/akamai-edgeworker-sdk/package.json | 4 ++-- packages/shared/sdk-server-edge/CHANGELOG.md | 9 +++++++ packages/shared/sdk-server-edge/package.json | 4 ++-- packages/shared/sdk-server/CHANGELOG.md | 7 ++++++ packages/shared/sdk-server/package.json | 2 +- .../node-server-sdk-dynamodb/CHANGELOG.md | 11 +++++++++ .../node-server-sdk-dynamodb/package.json | 4 ++-- .../store/node-server-sdk-redis/CHANGELOG.md | 11 +++++++++ .../store/node-server-sdk-redis/package.json | 4 ++-- .../node-server-sdk-otel/CHANGELOG.md | 11 +++++++++ .../node-server-sdk-otel/package.json | 4 ++-- 32 files changed, 175 insertions(+), 46 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 9935b44ba..beb974f99 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,18 +1,18 @@ { "packages/shared/common": "2.12.0", - "packages/shared/sdk-server": "2.9.1", - "packages/sdk/server-node": "9.7.1", - "packages/sdk/cloudflare": "2.6.1", - "packages/shared/sdk-server-edge": "2.5.1", - "packages/sdk/vercel": "1.3.20", - "packages/sdk/akamai-base": "2.1.19", - "packages/sdk/akamai-edgekv": "1.2.1", - "packages/shared/akamai-edgeworker-sdk": "1.3.1", - "packages/store/node-server-sdk-dynamodb": "6.2.1", - "packages/store/node-server-sdk-redis": "4.2.1", + "packages/shared/sdk-server": "2.10.0", + "packages/sdk/server-node": "9.7.2", + "packages/sdk/cloudflare": "2.6.2", + "packages/shared/sdk-server-edge": "2.5.2", + "packages/sdk/vercel": "1.3.21", + "packages/sdk/akamai-base": "2.1.20", + "packages/sdk/akamai-edgekv": "1.3.0", + "packages/shared/akamai-edgeworker-sdk": "1.3.2", + "packages/store/node-server-sdk-dynamodb": "6.2.2", + "packages/store/node-server-sdk-redis": "4.2.2", "packages/shared/sdk-client": "1.12.0", "packages/sdk/react-native": "10.9.2", - "packages/telemetry/node-server-sdk-otel": "1.1.1", + "packages/telemetry/node-server-sdk-otel": "1.1.2", "packages/sdk/browser": "0.3.2", - "packages/sdk/server-ai": "0.2.0" + "packages/sdk/server-ai": "0.2.1" } diff --git a/packages/sdk/akamai-base/CHANGELOG.md b/packages/sdk/akamai-base/CHANGELOG.md index 02be8b5b6..926b2439c 100644 --- a/packages/sdk/akamai-base/CHANGELOG.md +++ b/packages/sdk/akamai-base/CHANGELOG.md @@ -30,6 +30,16 @@ All notable changes to the LaunchDarkly SDK for Akamai Workers will be documente * @launchdarkly/akamai-edgeworker-sdk-common bumped from ^1.1.1 to ^1.1.2 * @launchdarkly/js-server-sdk-common bumped from ^2.2.1 to ^2.2.2 +## [2.1.20](https://github.com/launchdarkly/js-core/compare/akamai-server-base-sdk-v2.1.19...akamai-server-base-sdk-v2.1.20) (2024-11-14) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @launchdarkly/akamai-edgeworker-sdk-common bumped from ^1.3.1 to ^1.3.2 + * @launchdarkly/js-server-sdk-common bumped from ^2.9.1 to ^2.10.0 + ## [2.1.19](https://github.com/launchdarkly/js-core/compare/akamai-server-base-sdk-v2.1.18...akamai-server-base-sdk-v2.1.19) (2024-11-04) diff --git a/packages/sdk/akamai-base/example/package.json b/packages/sdk/akamai-base/example/package.json index 01fe04e0d..3daa98335 100644 --- a/packages/sdk/akamai-base/example/package.json +++ b/packages/sdk/akamai-base/example/package.json @@ -32,6 +32,6 @@ "typescript": "5.1.6" }, "dependencies": { - "@launchdarkly/akamai-server-base-sdk": "2.1.19" + "@launchdarkly/akamai-server-base-sdk": "2.1.20" } } diff --git a/packages/sdk/akamai-base/package.json b/packages/sdk/akamai-base/package.json index 0d51504a8..219462035 100644 --- a/packages/sdk/akamai-base/package.json +++ b/packages/sdk/akamai-base/package.json @@ -1,6 +1,6 @@ { "name": "@launchdarkly/akamai-server-base-sdk", - "version": "2.1.19", + "version": "2.1.20", "description": "Akamai LaunchDarkly EdgeWorker SDK", "homepage": "https://github.com/launchdarkly/js-core/tree/main/packages/sdk/akamai-base", "repository": { @@ -73,7 +73,7 @@ "typescript": "5.1.6" }, "dependencies": { - "@launchdarkly/akamai-edgeworker-sdk-common": "^1.3.1", - "@launchdarkly/js-server-sdk-common": "^2.9.1" + "@launchdarkly/akamai-edgeworker-sdk-common": "^1.3.2", + "@launchdarkly/js-server-sdk-common": "^2.10.0" } } diff --git a/packages/sdk/akamai-edgekv/CHANGELOG.md b/packages/sdk/akamai-edgekv/CHANGELOG.md index 4a6ac5eb5..c39ad349a 100644 --- a/packages/sdk/akamai-edgekv/CHANGELOG.md +++ b/packages/sdk/akamai-edgekv/CHANGELOG.md @@ -31,6 +31,21 @@ All notable changes to the LaunchDarkly SDK for Akamai Workers will be documente * @launchdarkly/akamai-edgeworker-sdk-common bumped from ^1.1.1 to ^1.1.2 * @launchdarkly/js-server-sdk-common bumped from ^2.2.1 to ^2.2.2 +## [1.3.0](https://github.com/launchdarkly/js-core/compare/akamai-server-edgekv-sdk-v1.2.1...akamai-server-edgekv-sdk-v1.3.0) (2024-11-14) + + +### Features + +* Upgrade edgekv bundled files to 0.6.3 ([#610](https://github.com/launchdarkly/js-core/issues/610)) ([58dfec6](https://github.com/launchdarkly/js-core/commit/58dfec68c268390852cc511191c7f9b47ec3e668)) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @launchdarkly/akamai-edgeworker-sdk-common bumped from ^1.3.1 to ^1.3.2 + * @launchdarkly/js-server-sdk-common bumped from ^2.9.1 to ^2.10.0 + ## [1.2.1](https://github.com/launchdarkly/js-core/compare/akamai-server-edgekv-sdk-v1.2.0...akamai-server-edgekv-sdk-v1.2.1) (2024-11-04) diff --git a/packages/sdk/akamai-edgekv/example/package.json b/packages/sdk/akamai-edgekv/example/package.json index e745dce2b..6c577ce31 100644 --- a/packages/sdk/akamai-edgekv/example/package.json +++ b/packages/sdk/akamai-edgekv/example/package.json @@ -31,6 +31,6 @@ "typescript": "5.1.6" }, "dependencies": { - "@launchdarkly/akamai-server-edgekv-sdk": "1.2.1" + "@launchdarkly/akamai-server-edgekv-sdk": "1.3.0" } } diff --git a/packages/sdk/akamai-edgekv/package.json b/packages/sdk/akamai-edgekv/package.json index 7af59534b..9508b75a6 100644 --- a/packages/sdk/akamai-edgekv/package.json +++ b/packages/sdk/akamai-edgekv/package.json @@ -1,6 +1,6 @@ { "name": "@launchdarkly/akamai-server-edgekv-sdk", - "version": "1.2.1", + "version": "1.3.0", "description": "Akamai LaunchDarkly EdgeWorker SDK for EdgeKV feature store", "homepage": "https://github.com/launchdarkly/js-core/tree/main/packages/sdk/akamai-edgekv", "repository": { @@ -73,7 +73,7 @@ "typescript": "5.1.6" }, "dependencies": { - "@launchdarkly/akamai-edgeworker-sdk-common": "^1.3.1", - "@launchdarkly/js-server-sdk-common": "^2.9.1" + "@launchdarkly/akamai-edgeworker-sdk-common": "^1.3.2", + "@launchdarkly/js-server-sdk-common": "^2.10.0" } } diff --git a/packages/sdk/cloudflare/CHANGELOG.md b/packages/sdk/cloudflare/CHANGELOG.md index 781fe50be..f35fb315c 100644 --- a/packages/sdk/cloudflare/CHANGELOG.md +++ b/packages/sdk/cloudflare/CHANGELOG.md @@ -21,6 +21,15 @@ All notable changes to the LaunchDarkly SDK for Cloudflare Workers will be docum * devDependencies * @launchdarkly/js-server-sdk-common-edge bumped from 2.2.1 to 2.2.2 +## [2.6.2](https://github.com/launchdarkly/js-core/compare/cloudflare-server-sdk-v2.6.1...cloudflare-server-sdk-v2.6.2) (2024-11-14) + + +### Dependencies + +* The following workspace dependencies were updated + * devDependencies + * @launchdarkly/js-server-sdk-common-edge bumped from 2.5.1 to 2.5.2 + ## [2.6.1](https://github.com/launchdarkly/js-core/compare/cloudflare-server-sdk-v2.6.0...cloudflare-server-sdk-v2.6.1) (2024-11-04) diff --git a/packages/sdk/cloudflare/example/package.json b/packages/sdk/cloudflare/example/package.json index b37c8f6ac..d0551b4db 100644 --- a/packages/sdk/cloudflare/example/package.json +++ b/packages/sdk/cloudflare/example/package.json @@ -5,7 +5,7 @@ "module": "./dist/index.mjs", "packageManager": "yarn@3.4.1", "dependencies": { - "@launchdarkly/cloudflare-server-sdk": "2.6.1" + "@launchdarkly/cloudflare-server-sdk": "2.6.2" }, "devDependencies": { "@cloudflare/workers-types": "^4.20230321.0", diff --git a/packages/sdk/cloudflare/jsr.json b/packages/sdk/cloudflare/jsr.json index 4b0c8164d..1bddeee18 100644 --- a/packages/sdk/cloudflare/jsr.json +++ b/packages/sdk/cloudflare/jsr.json @@ -1,9 +1,17 @@ { "name": "@launchdarkly/cloudflare-server-sdk", - "version": "2.6.1", + "version": "2.6.2", "exports": "./src/index.ts", "publish": { - "include": ["LICENSE", "README.md", "package.json", "jsr.json", "src/**/*.ts"], - "exclude": ["src/**/*.test.ts"] + "include": [ + "LICENSE", + "README.md", + "package.json", + "jsr.json", + "src/**/*.ts" + ], + "exclude": [ + "src/**/*.test.ts" + ] } } diff --git a/packages/sdk/cloudflare/package.json b/packages/sdk/cloudflare/package.json index fec6d84df..4963bf42e 100644 --- a/packages/sdk/cloudflare/package.json +++ b/packages/sdk/cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@launchdarkly/cloudflare-server-sdk", - "version": "2.6.1", + "version": "2.6.2", "description": "Cloudflare LaunchDarkly SDK", "homepage": "https://github.com/launchdarkly/js-core/tree/main/packages/sdk/cloudflare", "repository": { @@ -44,7 +44,7 @@ "crypto-js": "^4.1.1" }, "devDependencies": { - "@launchdarkly/js-server-sdk-common-edge": "2.5.1", + "@launchdarkly/js-server-sdk-common-edge": "2.5.2", "@rollup/plugin-commonjs": "^25.0.4", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.2.1", diff --git a/packages/sdk/cloudflare/src/createPlatformInfo.ts b/packages/sdk/cloudflare/src/createPlatformInfo.ts index 1c1990f76..4994a70ef 100644 --- a/packages/sdk/cloudflare/src/createPlatformInfo.ts +++ b/packages/sdk/cloudflare/src/createPlatformInfo.ts @@ -1,7 +1,7 @@ import type { Info, PlatformData, SdkData } from '@launchdarkly/js-server-sdk-common-edge'; const name = '@launchdarkly/cloudflare-server-sdk'; -const version = '2.6.1'; // x-release-please-version +const version = '2.6.2'; // x-release-please-version class CloudflarePlatformInfo implements Info { platformData(): PlatformData { diff --git a/packages/sdk/server-ai/CHANGELOG.md b/packages/sdk/server-ai/CHANGELOG.md index 0c5bc88e6..77044bed5 100644 --- a/packages/sdk/server-ai/CHANGELOG.md +++ b/packages/sdk/server-ai/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## [0.2.1](https://github.com/launchdarkly/js-core/compare/server-sdk-ai-v0.2.0...server-sdk-ai-v0.2.1) (2024-11-14) + + +### Dependencies + +* The following workspace dependencies were updated + * devDependencies + * @launchdarkly/js-server-sdk-common bumped from 2.9.0 to 2.10.0 + * peerDependencies + * @launchdarkly/js-server-sdk-common bumped from 2.x to 2.10.0 + ## [0.2.0](https://github.com/launchdarkly/js-core/compare/server-sdk-ai-v0.1.1...server-sdk-ai-v0.2.0) (2024-11-12) diff --git a/packages/sdk/server-ai/examples/bedrock/package.json b/packages/sdk/server-ai/examples/bedrock/package.json index 555d19497..942b438ea 100644 --- a/packages/sdk/server-ai/examples/bedrock/package.json +++ b/packages/sdk/server-ai/examples/bedrock/package.json @@ -24,7 +24,7 @@ "dependencies": { "@aws-sdk/client-bedrock-runtime": "^3.679.0", "@launchdarkly/node-server-sdk": "^9.7.1", - "@launchdarkly/server-sdk-ai": "0.2.0" + "@launchdarkly/server-sdk-ai": "0.2.1" }, "devDependencies": { "@trivago/prettier-plugin-sort-imports": "^4.1.1", diff --git a/packages/sdk/server-ai/examples/openai/package.json b/packages/sdk/server-ai/examples/openai/package.json index 13eb0fb45..ac0bf215b 100644 --- a/packages/sdk/server-ai/examples/openai/package.json +++ b/packages/sdk/server-ai/examples/openai/package.json @@ -22,7 +22,7 @@ "license": "Apache-2.0", "dependencies": { "@launchdarkly/node-server-sdk": "^9.7.1", - "@launchdarkly/server-sdk-ai": "0.2.0", + "@launchdarkly/server-sdk-ai": "0.2.1", "openai": "^4.58.1" }, "devDependencies": { diff --git a/packages/sdk/server-ai/package.json b/packages/sdk/server-ai/package.json index 517d36cee..904a316e7 100644 --- a/packages/sdk/server-ai/package.json +++ b/packages/sdk/server-ai/package.json @@ -1,6 +1,6 @@ { "name": "@launchdarkly/server-sdk-ai", - "version": "0.2.0", + "version": "0.2.1", "description": "LaunchDarkly AI SDK for Server-Side JavaScript", "homepage": "https://github.com/launchdarkly/js-core/tree/main/packages/sdk/server-ai", "repository": { @@ -29,7 +29,7 @@ "mustache": "^4.2.0" }, "devDependencies": { - "@launchdarkly/js-server-sdk-common": "2.9.0", + "@launchdarkly/js-server-sdk-common": "2.10.0", "@trivago/prettier-plugin-sort-imports": "^4.1.1", "@types/jest": "^29.5.3", "@types/mustache": "^4.2.5", diff --git a/packages/sdk/server-node/CHANGELOG.md b/packages/sdk/server-node/CHANGELOG.md index 2245617d1..0520035b0 100644 --- a/packages/sdk/server-node/CHANGELOG.md +++ b/packages/sdk/server-node/CHANGELOG.md @@ -2,6 +2,15 @@ All notable changes to `@launchdarkly/node-server-sdk` will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org). +## [9.7.2](https://github.com/launchdarkly/js-core/compare/node-server-sdk-v9.7.1...node-server-sdk-v9.7.2) (2024-11-14) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @launchdarkly/js-server-sdk-common bumped from 2.9.1 to 2.10.0 + ## [9.7.1](https://github.com/launchdarkly/js-core/compare/node-server-sdk-v9.7.0...node-server-sdk-v9.7.1) (2024-11-04) diff --git a/packages/sdk/server-node/package.json b/packages/sdk/server-node/package.json index 73707df39..24024688c 100644 --- a/packages/sdk/server-node/package.json +++ b/packages/sdk/server-node/package.json @@ -1,6 +1,6 @@ { "name": "@launchdarkly/node-server-sdk", - "version": "9.7.1", + "version": "9.7.2", "description": "LaunchDarkly Server-Side SDK for Node.js", "homepage": "https://github.com/launchdarkly/js-core/tree/main/packages/sdk/server-node", "repository": { @@ -45,7 +45,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@launchdarkly/js-server-sdk-common": "2.9.1", + "@launchdarkly/js-server-sdk-common": "2.10.0", "https-proxy-agent": "^5.0.1", "launchdarkly-eventsource": "2.0.3" }, diff --git a/packages/sdk/vercel/CHANGELOG.md b/packages/sdk/vercel/CHANGELOG.md index 4008a7756..23b7a1d36 100644 --- a/packages/sdk/vercel/CHANGELOG.md +++ b/packages/sdk/vercel/CHANGELOG.md @@ -20,6 +20,15 @@ All notable changes to the LaunchDarkly SDK for Vercel Edge Config will be docum * dependencies * @launchdarkly/js-server-sdk-common-edge bumped from 2.2.1 to 2.2.2 +## [1.3.21](https://github.com/launchdarkly/js-core/compare/vercel-server-sdk-v1.3.20...vercel-server-sdk-v1.3.21) (2024-11-14) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @launchdarkly/js-server-sdk-common-edge bumped from 2.5.1 to 2.5.2 + ## [1.3.20](https://github.com/launchdarkly/js-core/compare/vercel-server-sdk-v1.3.19...vercel-server-sdk-v1.3.20) (2024-11-04) diff --git a/packages/sdk/vercel/package.json b/packages/sdk/vercel/package.json index 34524022f..75e9127c9 100644 --- a/packages/sdk/vercel/package.json +++ b/packages/sdk/vercel/package.json @@ -1,6 +1,6 @@ { "name": "@launchdarkly/vercel-server-sdk", - "version": "1.3.20", + "version": "1.3.21", "description": "LaunchDarkly Server-Side SDK for Vercel Edge", "homepage": "https://github.com/launchdarkly/js-core/tree/main/packages/sdk/vercel", "repository": { @@ -36,7 +36,7 @@ "check": "yarn prettier && yarn lint && yarn build && yarn test" }, "dependencies": { - "@launchdarkly/js-server-sdk-common-edge": "2.5.1", + "@launchdarkly/js-server-sdk-common-edge": "2.5.2", "@vercel/edge-config": "^1.1.0", "crypto-js": "^4.1.1" }, diff --git a/packages/shared/akamai-edgeworker-sdk/CHANGELOG.md b/packages/shared/akamai-edgeworker-sdk/CHANGELOG.md index cb1960452..0d22c3e38 100644 --- a/packages/shared/akamai-edgeworker-sdk/CHANGELOG.md +++ b/packages/shared/akamai-edgeworker-sdk/CHANGELOG.md @@ -86,6 +86,15 @@ All notable changes to the LaunchDarkly SDK for Akamai Workers will be documente * dependencies * @launchdarkly/js-server-sdk-common bumped from ^2.2.1 to ^2.2.2 +## [1.3.2](https://github.com/launchdarkly/js-core/compare/akamai-edgeworker-sdk-common-v1.3.1...akamai-edgeworker-sdk-common-v1.3.2) (2024-11-14) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @launchdarkly/js-server-sdk-common bumped from ^2.9.1 to ^2.10.0 + ## [1.3.1](https://github.com/launchdarkly/js-core/compare/akamai-edgeworker-sdk-common-v1.3.0...akamai-edgeworker-sdk-common-v1.3.1) (2024-11-04) diff --git a/packages/shared/akamai-edgeworker-sdk/package.json b/packages/shared/akamai-edgeworker-sdk/package.json index c4ada33db..2b9f12c6f 100644 --- a/packages/shared/akamai-edgeworker-sdk/package.json +++ b/packages/shared/akamai-edgeworker-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@launchdarkly/akamai-edgeworker-sdk-common", - "version": "1.3.1", + "version": "1.3.2", "homepage": "https://github.com/launchdarkly/js-core/tree/main/packages/shared/akamai-edge-sdk", "repository": { "type": "git", @@ -55,7 +55,7 @@ "typescript": "5.1.6" }, "dependencies": { - "@launchdarkly/js-server-sdk-common": "^2.9.1", + "@launchdarkly/js-server-sdk-common": "^2.10.0", "crypto-js": "^4.1.1" } } diff --git a/packages/shared/sdk-server-edge/CHANGELOG.md b/packages/shared/sdk-server-edge/CHANGELOG.md index 49fd9d22a..b6d43a158 100644 --- a/packages/shared/sdk-server-edge/CHANGELOG.md +++ b/packages/shared/sdk-server-edge/CHANGELOG.md @@ -96,6 +96,15 @@ * dependencies * @launchdarkly/js-server-sdk-common bumped from 2.2.1 to 2.2.2 +## [2.5.2](https://github.com/launchdarkly/js-core/compare/js-server-sdk-common-edge-v2.5.1...js-server-sdk-common-edge-v2.5.2) (2024-11-14) + + +### Dependencies + +* The following workspace dependencies were updated + * dependencies + * @launchdarkly/js-server-sdk-common bumped from 2.9.1 to 2.10.0 + ## [2.5.1](https://github.com/launchdarkly/js-core/compare/js-server-sdk-common-edge-v2.5.0...js-server-sdk-common-edge-v2.5.1) (2024-11-04) diff --git a/packages/shared/sdk-server-edge/package.json b/packages/shared/sdk-server-edge/package.json index ae9c35c56..b38716b01 100644 --- a/packages/shared/sdk-server-edge/package.json +++ b/packages/shared/sdk-server-edge/package.json @@ -1,6 +1,6 @@ { "name": "@launchdarkly/js-server-sdk-common-edge", - "version": "2.5.1", + "version": "2.5.2", "homepage": "https://github.com/launchdarkly/js-core/tree/main/packages/shared/sdk-server-edge", "repository": { "type": "git", @@ -36,7 +36,7 @@ "check": "yarn prettier && yarn lint && yarn build && yarn test && yarn doc" }, "dependencies": { - "@launchdarkly/js-server-sdk-common": "2.9.1", + "@launchdarkly/js-server-sdk-common": "2.10.0", "crypto-js": "^4.1.1" }, "devDependencies": { diff --git a/packages/shared/sdk-server/CHANGELOG.md b/packages/shared/sdk-server/CHANGELOG.md index eccfd1357..00af9302f 100644 --- a/packages/shared/sdk-server/CHANGELOG.md +++ b/packages/shared/sdk-server/CHANGELOG.md @@ -8,6 +8,13 @@ All notable changes to `@launchdarkly/js-server-sdk-common` will be documented i * dependencies * @launchdarkly/js-sdk-common bumped from 2.3.0 to 2.3.1 +## [2.10.0](https://github.com/launchdarkly/js-core/compare/js-server-sdk-common-v2.9.1...js-server-sdk-common-v2.10.0) (2024-11-14) + + +### Features + +* Add support for getting the logger from server-side SDKs. ([#684](https://github.com/launchdarkly/js-core/issues/684)) ([1c411a1](https://github.com/launchdarkly/js-core/commit/1c411a15e308520dc7a0f20af76045f84d53e8a4)) + ## [2.9.1](https://github.com/launchdarkly/js-core/compare/js-server-sdk-common-v2.9.0...js-server-sdk-common-v2.9.1) (2024-11-04) diff --git a/packages/shared/sdk-server/package.json b/packages/shared/sdk-server/package.json index a61578d1b..43e5ef109 100644 --- a/packages/shared/sdk-server/package.json +++ b/packages/shared/sdk-server/package.json @@ -1,6 +1,6 @@ { "name": "@launchdarkly/js-server-sdk-common", - "version": "2.9.1", + "version": "2.10.0", "type": "commonjs", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/packages/store/node-server-sdk-dynamodb/CHANGELOG.md b/packages/store/node-server-sdk-dynamodb/CHANGELOG.md index 074c23bf5..e47412f8e 100644 --- a/packages/store/node-server-sdk-dynamodb/CHANGELOG.md +++ b/packages/store/node-server-sdk-dynamodb/CHANGELOG.md @@ -90,6 +90,17 @@ * devDependencies * @launchdarkly/node-server-sdk bumped from 9.2.1 to 9.2.2 +## [6.2.2](https://github.com/launchdarkly/js-core/compare/node-server-sdk-dynamodb-v6.2.1...node-server-sdk-dynamodb-v6.2.2) (2024-11-14) + + +### Dependencies + +* The following workspace dependencies were updated + * devDependencies + * @launchdarkly/node-server-sdk bumped from 9.7.1 to 9.7.2 + * peerDependencies + * @launchdarkly/node-server-sdk bumped from >=9.4.3 to >=9.7.2 + ## [6.2.1](https://github.com/launchdarkly/js-core/compare/node-server-sdk-dynamodb-v6.2.0...node-server-sdk-dynamodb-v6.2.1) (2024-11-04) diff --git a/packages/store/node-server-sdk-dynamodb/package.json b/packages/store/node-server-sdk-dynamodb/package.json index 4acd2bceb..7206ffec5 100644 --- a/packages/store/node-server-sdk-dynamodb/package.json +++ b/packages/store/node-server-sdk-dynamodb/package.json @@ -1,6 +1,6 @@ { "name": "@launchdarkly/node-server-sdk-dynamodb", - "version": "6.2.1", + "version": "6.2.2", "description": "DynamoDB-backed feature store for the LaunchDarkly Server-Side SDK for Node.js", "homepage": "https://github.com/launchdarkly/js-core/tree/main/packages/store/node-server-sdk-dynamodb", "repository": { @@ -35,7 +35,7 @@ }, "devDependencies": { "@aws-sdk/client-dynamodb": "3.348.0", - "@launchdarkly/node-server-sdk": "9.7.1", + "@launchdarkly/node-server-sdk": "9.7.2", "@trivago/prettier-plugin-sort-imports": "^4.1.1", "@types/jest": "^29.4.0", "@typescript-eslint/eslint-plugin": "^6.20.0", diff --git a/packages/store/node-server-sdk-redis/CHANGELOG.md b/packages/store/node-server-sdk-redis/CHANGELOG.md index 199dcf2b6..988afd2ab 100644 --- a/packages/store/node-server-sdk-redis/CHANGELOG.md +++ b/packages/store/node-server-sdk-redis/CHANGELOG.md @@ -90,6 +90,17 @@ * devDependencies * @launchdarkly/node-server-sdk bumped from 9.2.1 to 9.2.2 +## [4.2.2](https://github.com/launchdarkly/js-core/compare/node-server-sdk-redis-v4.2.1...node-server-sdk-redis-v4.2.2) (2024-11-14) + + +### Dependencies + +* The following workspace dependencies were updated + * devDependencies + * @launchdarkly/node-server-sdk bumped from 9.7.1 to 9.7.2 + * peerDependencies + * @launchdarkly/node-server-sdk bumped from >=9.4.3 to >=9.7.2 + ## [4.2.1](https://github.com/launchdarkly/js-core/compare/node-server-sdk-redis-v4.2.0...node-server-sdk-redis-v4.2.1) (2024-11-04) diff --git a/packages/store/node-server-sdk-redis/package.json b/packages/store/node-server-sdk-redis/package.json index 10eebb837..9d252beb7 100644 --- a/packages/store/node-server-sdk-redis/package.json +++ b/packages/store/node-server-sdk-redis/package.json @@ -1,6 +1,6 @@ { "name": "@launchdarkly/node-server-sdk-redis", - "version": "4.2.1", + "version": "4.2.2", "description": "Redis-backed feature store for the LaunchDarkly Server-Side SDK for Node.js", "homepage": "https://github.com/launchdarkly/js-core/tree/main/packages/store/node-server-sdk-redis", "repository": { @@ -33,7 +33,7 @@ "@launchdarkly/node-server-sdk": ">=9.4.3" }, "devDependencies": { - "@launchdarkly/node-server-sdk": "9.7.1", + "@launchdarkly/node-server-sdk": "9.7.2", "@trivago/prettier-plugin-sort-imports": "^4.1.1", "@types/jest": "^29.4.0", "@typescript-eslint/eslint-plugin": "^6.20.0", diff --git a/packages/telemetry/node-server-sdk-otel/CHANGELOG.md b/packages/telemetry/node-server-sdk-otel/CHANGELOG.md index 7cd83c05a..aa0ec086e 100644 --- a/packages/telemetry/node-server-sdk-otel/CHANGELOG.md +++ b/packages/telemetry/node-server-sdk-otel/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## [1.1.2](https://github.com/launchdarkly/js-core/compare/node-server-sdk-otel-v1.1.1...node-server-sdk-otel-v1.1.2) (2024-11-14) + + +### Dependencies + +* The following workspace dependencies were updated + * devDependencies + * @launchdarkly/node-server-sdk bumped from 9.7.1 to 9.7.2 + * peerDependencies + * @launchdarkly/node-server-sdk bumped from >=9.4.3 to >=9.7.2 + ## [1.1.1](https://github.com/launchdarkly/js-core/compare/node-server-sdk-otel-v1.1.0...node-server-sdk-otel-v1.1.1) (2024-11-04) diff --git a/packages/telemetry/node-server-sdk-otel/package.json b/packages/telemetry/node-server-sdk-otel/package.json index fe86a0010..4f8f00efc 100644 --- a/packages/telemetry/node-server-sdk-otel/package.json +++ b/packages/telemetry/node-server-sdk-otel/package.json @@ -1,6 +1,6 @@ { "name": "@launchdarkly/node-server-sdk-otel", - "version": "1.1.1", + "version": "1.1.2", "type": "commonjs", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -33,7 +33,7 @@ "@opentelemetry/api": ">=1.3.0" }, "devDependencies": { - "@launchdarkly/node-server-sdk": "9.7.1", + "@launchdarkly/node-server-sdk": "9.7.2", "@opentelemetry/api": ">=1.3.0", "@opentelemetry/sdk-node": "0.49.1", "@opentelemetry/sdk-trace-node": "1.22.0",