From 58c2e6cb0e713f30c988dca6740ca2457ba84acb Mon Sep 17 00:00:00 2001 From: sabljak Date: Tue, 17 Dec 2024 23:05:01 +0100 Subject: [PATCH 1/2] Implement UUID v4 with crypto.getRandomValues() --- app/assets/javascripts/hotwire_combobox.esm.js | 11 ++++++++++- app/assets/javascripts/hw_combobox/helpers.js | 9 +++++++++ .../hw_combobox/models/combobox/callbacks.js | 3 ++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/hotwire_combobox.esm.js b/app/assets/javascripts/hotwire_combobox.esm.js index 086a8ce6..f1a9137d 100644 --- a/app/assets/javascripts/hotwire_combobox.esm.js +++ b/app/assets/javascripts/hotwire_combobox.esm.js @@ -150,6 +150,15 @@ function nextEventLoopTick() { return new Promise((resolve) => setTimeout(() => resolve(), 0)) } +function randomUUID() { + const uuidPattern = "10000000-1000-4000-8000-100000000000"; + + return uuidPattern.replace(/[018]/g, (match) => { + const randomByte = crypto.getRandomValues(new Uint8Array(1))[0]; + return (match ^ (randomByte & 15) >> (match / 4)).toString(16) + }) +} + Combobox.Autocomplete = Base => class extends Base { _connectListAutocomplete() { if (!this._autocompletesList) { @@ -213,7 +222,7 @@ Combobox.Callbacks = Base => class extends Base { } _enqueueCallback() { - const callbackId = crypto.randomUUID(); + const callbackId = randomUUID(); this.callbackQueue.push(callbackId); return callbackId } diff --git a/app/assets/javascripts/hw_combobox/helpers.js b/app/assets/javascripts/hw_combobox/helpers.js index a40a2822..aa1c6e39 100644 --- a/app/assets/javascripts/hw_combobox/helpers.js +++ b/app/assets/javascripts/hw_combobox/helpers.js @@ -95,3 +95,12 @@ export function nextAnimationFrame() { export function nextEventLoopTick() { return new Promise((resolve) => setTimeout(() => resolve(), 0)) } + +export function randomUUID() { + const uuidPattern = "10000000-1000-4000-8000-100000000000" + + return uuidPattern.replace(/[018]/g, (match) => { + const randomByte = crypto.getRandomValues(new Uint8Array(1))[0] + return (match ^ (randomByte & 15) >> (match / 4)).toString(16) + }) +} diff --git a/app/assets/javascripts/hw_combobox/models/combobox/callbacks.js b/app/assets/javascripts/hw_combobox/models/combobox/callbacks.js index cb78843b..ac0a9bb9 100644 --- a/app/assets/javascripts/hw_combobox/models/combobox/callbacks.js +++ b/app/assets/javascripts/hw_combobox/models/combobox/callbacks.js @@ -1,4 +1,5 @@ import Combobox from "hw_combobox/models/combobox/base" +import { randomUUID } from "hw_combobox/helpers"; const MAX_CALLBACK_ATTEMPTS = 3 @@ -9,7 +10,7 @@ Combobox.Callbacks = Base => class extends Base { } _enqueueCallback() { - const callbackId = crypto.randomUUID() + const callbackId = randomUUID() this.callbackQueue.push(callbackId) return callbackId } From ca6000c9c534bb1f9210a1118caee869a38ed8d5 Mon Sep 17 00:00:00 2001 From: Jose Farias <31393016+josefarias@users.noreply.github.com> Date: Mon, 30 Dec 2024 18:50:36 -0600 Subject: [PATCH 2/2] Remove semicolon --- app/assets/javascripts/hw_combobox/models/combobox/callbacks.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/hw_combobox/models/combobox/callbacks.js b/app/assets/javascripts/hw_combobox/models/combobox/callbacks.js index ac0a9bb9..dfcfe8d6 100644 --- a/app/assets/javascripts/hw_combobox/models/combobox/callbacks.js +++ b/app/assets/javascripts/hw_combobox/models/combobox/callbacks.js @@ -1,5 +1,5 @@ import Combobox from "hw_combobox/models/combobox/base" -import { randomUUID } from "hw_combobox/helpers"; +import { randomUUID } from "hw_combobox/helpers" const MAX_CALLBACK_ATTEMPTS = 3