-
Notifications
You must be signed in to change notification settings - Fork 18
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: Add platform support for async hashing. #573
feat: Add platform support for async hashing. #573
Conversation
472b0f1
to
365f048
Compare
365f048
to
c4a67ce
Compare
/** | ||
* Note: Server SDKs MUST implement createHmac. | ||
*/ | ||
createHmac?(algorithm: string, key: string): Hmac; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we could create Hmac on all platforms, but we don't actually need to.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Basically I would prefer implementation of this not block or slow down platform implementations, and I would like for SDKs to not have unused bloat to implement it.
@@ -7,7 +7,19 @@ | |||
*/ | |||
export interface Hasher { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a little clunky. It would be nice if as much was statically checked as possible, but the platforms are not likely to be wrong outside initial implementation. We do have a couple other dynamic elements.
this.flagUpdater = new FlagUpdater(this.flagStore, logger); | ||
this.flagPersistence = new FlagPersistence( | ||
this.flagPersistencePromise = this.initPersistence( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Assign the promise synchronously and then await it when persistence needs to be used.
Getting the promise immediately removes any race conditions you would have with code that awaits and assigns the value.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is async now as generating the hash can be async.
if (!hasher.digest) { | ||
// This represents an error in platform implementation. | ||
throw new Error('Platform must implement digest or asyncDigest'); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there a straightforward way to make a default digest implementation that throws the error to centralize this case? I suppose that would advocate for hasher.digest and hasher.asyncDigest becoming non-optional with default erroring implementations.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you do that, then you cannot choose one to call without throwing an exception. Also, unlike Java for instance, there are not checked exceptions. The optional typing forces you do make a decision because the compiler won't let it be unhandled, so you have to check it, optionally call it, or force it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It could be centralized similar to the client, but it didn't seem worth it for the limited call sites, and that it is just a pass-through call, versus the tiny bit of logic required in the client.
🤖 I have created a release *beep* *boop* --- <details><summary>akamai-edgeworker-sdk-common: 1.2.0</summary> ## [1.2.0](akamai-edgeworker-sdk-common-v1.1.15...akamai-edgeworker-sdk-common-v1.2.0) (2024-09-26) ### Features * Add support for conditional event source capabilities. ([#577](#577)) ([fe82500](fe82500)) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/js-server-sdk-common bumped from ^2.6.1 to ^2.7.0 </details> <details><summary>akamai-server-base-sdk: 2.1.16</summary> ## [2.1.16](akamai-server-base-sdk-v2.1.15...akamai-server-base-sdk-v2.1.16) (2024-09-26) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/akamai-edgeworker-sdk-common bumped from ^1.1.15 to ^1.2.0 * @launchdarkly/js-server-sdk-common bumped from ^2.6.1 to ^2.7.0 </details> <details><summary>akamai-server-edgekv-sdk: 1.1.16</summary> ## [1.1.16](akamai-server-edgekv-sdk-v1.1.15...akamai-server-edgekv-sdk-v1.1.16) (2024-09-26) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/akamai-edgeworker-sdk-common bumped from ^1.1.15 to ^1.2.0 * @launchdarkly/js-server-sdk-common bumped from ^2.6.1 to ^2.7.0 </details> <details><summary>cloudflare-server-sdk: 2.5.14</summary> ## [2.5.14](cloudflare-server-sdk-v2.5.13...cloudflare-server-sdk-v2.5.14) (2024-09-26) ### Dependencies * The following workspace dependencies were updated * devDependencies * @launchdarkly/js-server-sdk-common-edge bumped from 2.3.9 to 2.4.0 </details> <details><summary>js-client-sdk-common: 1.8.0</summary> ## [1.8.0](js-client-sdk-common-v1.7.0...js-client-sdk-common-v1.8.0) (2024-09-26) ### Features * Add platform support for async hashing. ([#573](#573)) ([9248035](9248035)) * Add support for conditional event source capabilities. ([#577](#577)) ([fe82500](fe82500)) * Add support for js-client-sdk style initialization. ([53f5bb8](53f5bb8)) * Add URLs for custom events and URL filtering. ([#587](#587)) ([7131e69](7131e69)) * Adds support for REPORT. ([#575](#575)) ([916b724](916b724)) * Allow using custom user-agent name. ([#580](#580)) ([ed5a206](ed5a206)) * Implement goals for client-side SDKs. ([#585](#585)) ([fd38a8f](fd38a8f)) * Refactor data source connection handling. ([53f5bb8](53f5bb8)) ### Bug Fixes * Flag store should not access values from prototype. ([#567](#567)) ([fca4d92](fca4d92)) * Use flag value whenever provided even if variaiton is null or undefined. ([#581](#581)) ([d11224c](d11224c)) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/js-sdk-common bumped from 2.8.0 to 2.9.0 </details> <details><summary>js-sdk-common: 2.9.0</summary> ## [2.9.0](js-sdk-common-v2.8.0...js-sdk-common-v2.9.0) (2024-09-26) ### Features * Add platform support for async hashing. ([#573](#573)) ([9248035](9248035)) * Add support for conditional event source capabilities. ([#577](#577)) ([fe82500](fe82500)) * Add URLs for custom events and URL filtering. ([#587](#587)) ([7131e69](7131e69)) * Adds support for REPORT. ([#575](#575)) ([916b724](916b724)) * Allow using custom user-agent name. ([#580](#580)) ([ed5a206](ed5a206)) * Implement goals for client-side SDKs. ([#585](#585)) ([fd38a8f](fd38a8f)) ### Bug Fixes * Multi-kind context containing only 1 kind conveted incorrectly. ([#594](#594)) ([b6ff2a6](b6ff2a6)) </details> <details><summary>js-server-sdk-common: 2.7.0</summary> ## [2.7.0](js-server-sdk-common-v2.6.1...js-server-sdk-common-v2.7.0) (2024-09-26) ### Features * Add platform support for async hashing. ([#573](#573)) ([9248035](9248035)) * Add support for conditional event source capabilities. ([#577](#577)) ([fe82500](fe82500)) * Allow using custom user-agent name. ([#580](#580)) ([ed5a206](ed5a206)) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/js-sdk-common bumped from 2.8.0 to 2.9.0 </details> <details><summary>js-server-sdk-common-edge: 2.4.0</summary> ## [2.4.0](js-server-sdk-common-edge-v2.3.9...js-server-sdk-common-edge-v2.4.0) (2024-09-26) ### Features * Add support for conditional event source capabilities. ([#577](#577)) ([fe82500](fe82500)) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/js-server-sdk-common bumped from 2.6.1 to 2.7.0 </details> <details><summary>node-server-sdk: 9.6.0</summary> ## [9.6.0](node-server-sdk-v9.5.4...node-server-sdk-v9.6.0) (2024-09-26) ### Features * Add support for conditional event source capabilities. ([#577](#577)) ([fe82500](fe82500)) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/js-server-sdk-common bumped from 2.6.1 to 2.7.0 </details> <details><summary>node-server-sdk-dynamodb: 6.1.22</summary> ## [6.1.22](node-server-sdk-dynamodb-v6.1.21...node-server-sdk-dynamodb-v6.1.22) (2024-09-26) ### Dependencies * The following workspace dependencies were updated * devDependencies * @launchdarkly/node-server-sdk bumped from 9.5.4 to 9.6.0 * peerDependencies * @launchdarkly/node-server-sdk bumped from >=9.4.3 to >=9.6.0 </details> <details><summary>node-server-sdk-otel: 1.0.14</summary> ## [1.0.14](node-server-sdk-otel-v1.0.13...node-server-sdk-otel-v1.0.14) (2024-09-26) ### Dependencies * The following workspace dependencies were updated * devDependencies * @launchdarkly/node-server-sdk bumped from 9.5.4 to 9.6.0 * peerDependencies * @launchdarkly/node-server-sdk bumped from >=9.4.3 to >=9.6.0 </details> <details><summary>node-server-sdk-redis: 4.1.22</summary> ## [4.1.22](node-server-sdk-redis-v4.1.21...node-server-sdk-redis-v4.1.22) (2024-09-26) ### Dependencies * The following workspace dependencies were updated * devDependencies * @launchdarkly/node-server-sdk bumped from 9.5.4 to 9.6.0 * peerDependencies * @launchdarkly/node-server-sdk bumped from >=9.4.3 to >=9.6.0 </details> <details><summary>react-native-client-sdk: 10.7.0</summary> ## [10.7.0](react-native-client-sdk-v10.6.1...react-native-client-sdk-v10.7.0) (2024-09-26) ### Features * Add support for conditional event source capabilities. ([#577](#577)) ([fe82500](fe82500)) * Add support for js-client-sdk style initialization. ([53f5bb8](53f5bb8)) * Adds support for REPORT. ([#575](#575)) ([916b724](916b724)) * Refactor data source connection handling. ([53f5bb8](53f5bb8)) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/js-client-sdk-common bumped from 1.7.0 to 1.8.0 </details> <details><summary>vercel-server-sdk: 1.3.17</summary> ## [1.3.17](vercel-server-sdk-v1.3.16...vercel-server-sdk-v1.3.17) (2024-09-26) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/js-server-sdk-common-edge bumped from 2.3.9 to 2.4.0 </details> --- 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>
This adds platform support for async hashing for use in client-side SDKs.
It does not implement async hashing for any existing platform, but provides it as an option to allow for use of standard browser APIs. Allowing the usage of standard browser crypto APIs means that browser SDKs will not need to include an additional dependency to replicate built-in functionality.