| |
| |
|
|
| function makeWorkflowId() { |
| try { |
| if (crypto && typeof crypto.randomUUID === "function") { |
| return crypto.randomUUID(); |
| } |
| } catch { |
| |
| } |
| return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => { |
| const r = Math.floor(Math.random() * 16); |
| const v = c === "x" ? r : (r & 0x3) | 0x8; |
| return v.toString(16); |
| }); |
| } |
|
|
| function hash32(input, seed) { |
| let h = (0x811c9dc5 ^ seed) >>> 0; |
| for (let i = 0; i < input.length; i += 1) { |
| h ^= input.charCodeAt(i); |
| h = Math.imul(h, 0x01000193) >>> 0; |
| } |
| return h.toString(16).padStart(8, "0"); |
| } |
|
|
| |
| |
| |
| function stableWorkflowId(loadKey) { |
| const key = String(loadKey); |
| const hex = |
| hash32(key, 0) + |
| hash32(key, 0x9e3779b9) + |
| hash32(key, 0x85ebca6b) + |
| hash32(key, 0xc2b2ae35); |
| return [ |
| hex.slice(0, 8), |
| hex.slice(8, 12), |
| `5${hex.slice(13, 16)}`, |
| `8${hex.slice(17, 20)}`, |
| hex.slice(20, 32), |
| ].join("-"); |
| } |
|
|
| export function cloneWorkflowForTemporaryLoad(graphData, loadKey = null) { |
| const clone = JSON.parse(JSON.stringify(graphData || {})); |
| clone.id = loadKey == null ? makeWorkflowId() : stableWorkflowId(loadKey); |
| return clone; |
| } |
|
|