Skip to content

Commit f914e34

Browse files
committed
add polyfill for random uuid for insecure http
1 parent 47a0fb3 commit f914e34

16 files changed

+50
-22
lines changed

src/app/(outerbase)/local/hooks.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { SavedConnectionRawLocalStorage } from "@/app/(theme)/connect/saved-connection-storage";
22
import { LocalConnectionData, LocalDashboardData, localDb } from "@/indexdb";
3+
import { generateId } from "@/lib/generate-id";
34
import parseSafeJson from "@/lib/json-safe";
45
import useSWR, { mutate } from "swr";
56

@@ -18,7 +19,7 @@ export function useLocalDashboardList() {
1819
}
1920

2021
export async function createLocalDashboard(boardName: string) {
21-
const id = crypto.randomUUID();
22+
const id = generateId();
2223
const now = Date.now();
2324

2425
const data: LocalDashboardData = {
@@ -103,7 +104,7 @@ export async function removeLocalConnection(id: string) {
103104
export async function createLocalConnection(
104105
config: SavedConnectionRawLocalStorage
105106
): Promise<LocalConnectionData> {
106-
const id = crypto.randomUUID();
107+
const id = generateId();
107108

108109
const data = {
109110
id,

src/app/api/events/insert-tracking-record.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import StarbaseDriver from "@/drivers/starbase-driver";
44
import { env } from "@/env";
5+
import { generateId } from "@/lib/generate-id";
56
import { type TrackEventItem } from "../../../lib/tracking";
67

78
export async function insertTrackingRecord(
@@ -26,7 +27,7 @@ export async function insertTrackingRecord(
2627
(event) =>
2728
"(" +
2829
[
29-
crypto.randomUUID(),
30+
generateId(),
3031
Date.now(),
3132
deviceId,
3233
event.name,

src/components/editor/prompt-plugin.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import AgentDriverList from "@/drivers/agent/list";
2+
import { generateId } from "@/lib/generate-id";
23
import { unifiedMergeView } from "@codemirror/merge";
34
import {
45
Compartment,
@@ -73,7 +74,7 @@ class PromptWidget extends WidgetType {
7374
super();
7475

7576
// Generate unique session id for this prompt
76-
const sessionId = crypto.randomUUID();
77+
const sessionId = generateId();
7778

7879
plugin.lock();
7980
this.container = document.createElement("div");

src/components/filehandler-picker.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { localDb } from "@/indexdb";
2+
import { generateId } from "@/lib/generate-id";
23
import { cn } from "@/lib/utils";
34
import { LucideFile, LucideFolderClosed } from "lucide-react";
45
import { useCallback, useEffect, useState } from "react";
@@ -52,7 +53,7 @@ async function openFileHandler() {
5253
],
5354
});
5455

55-
const id = crypto.randomUUID();
56+
const id = generateId();
5657
localDb.file_handler.add({ id, handler: newFileHandler }).then();
5758

5859
return id;

src/components/gui/schema-editor/index.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useStudioContext } from "@/context/driver-provider";
22
import { DatabaseTableSchemaChange } from "@/drivers/base-driver";
3+
import { generateId } from "@/lib/generate-id";
34
import { checkSchemaChange } from "@/lib/sql/sql-generate.schema";
45
import { LucideCode, LucideCopy, LucidePlus, LucideSave } from "lucide-react";
56
import { Dispatch, SetStateAction, useCallback, useMemo } from "react";
@@ -51,7 +52,7 @@ export default function SchemaEditor({
5152
columns: [
5253
...value.columns,
5354
{
54-
key: window.crypto.randomUUID(),
55+
key: generateId(),
5556
old: null,
5657
new: newColumn,
5758
},

src/components/gui/schema-editor/schema-editor-constraint-list.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
DatabaseTableConstraintChange,
55
DatabaseTableSchemaChange,
66
} from "@/drivers/base-driver";
7+
import { generateId } from "@/lib/generate-id";
78
import { cn } from "@/lib/utils";
89
import {
910
LucideArrowUpRight,
@@ -410,7 +411,7 @@ export default function SchemaEditorConstraintList({
410411
constraints: [
411412
...prev.constraints,
412413
{
413-
id: window.crypto.randomUUID(),
414+
id: generateId(),
414415
new: con,
415416
old: null,
416417
},

src/components/gui/table-result/context-menu.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
exportRowsToJson,
66
exportRowsToSqlInsert,
77
} from "@/lib/export-helper";
8+
import { generateId } from "@/lib/generate-id";
89
import { KEY_BINDING } from "@/lib/key-matcher";
910
import { LucidePlus, LucideTrash2 } from "lucide-react";
1011
import { useCallback } from "react";
@@ -34,7 +35,7 @@ export default function useTableResultContextMenu({
3435
state: OptimizeTableState;
3536
event: React.MouseEvent;
3637
}) => {
37-
const randomUUID = crypto.randomUUID();
38+
const randomUUID = generateId();
3839
const timestamp = Math.floor(Date.now() / 1000).toString();
3940
const hasFocus = !!state.getFocus();
4041

src/components/gui/tabs/schema-editor-tab.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import OpacityLoading from "@/components/gui/loading-opacity";
22
import { useStudioContext } from "@/context/driver-provider";
33
import { DatabaseTableSchemaChange } from "@/drivers/base-driver";
4+
import { generateId } from "@/lib/generate-id";
45
import { createTableSchemaDraft } from "@/lib/sql/sql-generate.schema";
56
import { cloneDeep } from "lodash";
67
import { useCallback, useEffect, useMemo, useState } from "react";
@@ -74,7 +75,7 @@ export default function SchemaEditorTab({
7475
}))
7576
.filter((col) => col.old),
7677
constraints: prev.constraints.map((con) => ({
77-
id: window.crypto.randomUUID(),
78+
id: generateId(),
7879
old: con.old,
7980
new: cloneDeep(con.old),
8081
})),

src/core/builtin-tab/open-query-tab.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import QueryWindow from "@/components/gui/tabs/query-tab";
2+
import { generateId } from "@/lib/generate-id";
23
import { Binoculars } from "@phosphor-icons/react";
34
import { createTabExtension } from "../extension-tab";
45

@@ -20,11 +21,11 @@ export const builtinOpenQueryTab = createTabExtension<
2021
if (options?.saved) {
2122
return options.saved.key;
2223
}
23-
return window.crypto.randomUUID();
24+
return generateId();
2425
},
2526
generate: (options) => {
2627
const title = options?.saved
27-
? options.name ?? "Query"
28+
? (options.name ?? "Query")
2829
: "Query " + (QUERY_COUNTER++).toString();
2930

3031
const component = options?.saved ? (

src/drivers/agent/common.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { generateId } from "@/lib/generate-id";
12
import {
23
BaseDriver,
34
DatabaseSchemas,
@@ -61,7 +62,7 @@ export default abstract class CommonAgentDriverImplementation extends AgentBaseD
6162
option: AgentPromptOption
6263
): Promise<string> {
6364
const session = this.history[previousId ?? ""] ?? {
64-
id: previousId || crypto.randomUUID(),
65+
id: previousId || generateId(),
6566
createdAt: Date.now(),
6667
messages: [],
6768
};

src/drivers/board-storage/local.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import { DashboardProps } from "@/components/board";
22
import { ChartValue } from "@/components/chart/chart-type";
33
import { LocalDashboardData, localDb } from "@/indexdb";
4+
import { generateId } from "@/lib/generate-id";
45
import { IBoardStorageDriver } from "./base";
56

67
export default class LocalBoardStorage implements IBoardStorageDriver {
78
constructor(protected board: LocalDashboardData) {}
89

910
async add(chart: ChartValue): Promise<ChartValue | undefined> {
10-
const id = crypto.randomUUID();
11+
const id = generateId();
1112
const now = Date.now();
1213

1314
const data: ChartValue = {

src/drivers/saved-doc/electron-saved-doc.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
"use client";
2+
import { generateId } from "@/lib/generate-id";
23
import {
34
SavedDocData,
45
SavedDocDriver,
@@ -32,7 +33,7 @@ export default class ElectronSavedDocs implements SavedDocDriver {
3233

3334
this.cacheDocs = {
3435
workspace: [],
35-
}
36+
};
3637

3738
return this.cacheNamespaceList;
3839
} else {
@@ -60,7 +61,7 @@ export default class ElectronSavedDocs implements SavedDocDriver {
6061
await this.getNamespaces();
6162

6263
const now = Math.floor(Date.now() / 1000);
63-
const id = window.crypto.randomUUID();
64+
const id = generateId();
6465

6566
const namespace = {
6667
id,
@@ -119,7 +120,7 @@ export default class ElectronSavedDocs implements SavedDocDriver {
119120
(n) => n.id === namespace
120121
)!,
121122
type,
122-
id: window.crypto.randomUUID(),
123+
id: generateId(),
123124
};
124125

125126
if (this.cacheDocs[r.namespace.id]) {

src/drivers/saved-doc/indexdb-saved-doc.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { localDb } from "@/indexdb";
2+
import { generateId } from "@/lib/generate-id";
23
import {
34
SavedDocData,
45
SavedDocDriver,
@@ -18,7 +19,7 @@ export default class IndexdbSavedDoc implements SavedDocDriver {
1819

1920
async createNamespace(name: string): Promise<SavedDocNamespace> {
2021
const now = Math.floor(Date.now() / 1000);
21-
const id = window.crypto.randomUUID();
22+
const id = generateId();
2223

2324
await localDb.namespace.add({
2425
id,
@@ -92,7 +93,7 @@ export default class IndexdbSavedDoc implements SavedDocDriver {
9293
data: SavedDocInput
9394
): Promise<SavedDocData> {
9495
const now = Math.floor(Date.now() / 1000);
95-
const id = window.crypto.randomUUID();
96+
const id = generateId();
9697

9798
const namespaceData = await localDb.namespace.get(namespace);
9899
if (!namespaceData) throw new Error("Namespace does not exist");

src/lib/generate-id.ts

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export function generateId() {
2+
if (crypto.randomUUID) {
3+
return crypto.randomUUID();
4+
}
5+
6+
// https://stackoverflow.com/questions/105034/how-do-i-create-a-guid-uuid/2117523#2117523
7+
return "10000000-1000-4000-8000-100000000000".replace(/[018]/g, (c) =>
8+
(
9+
+c ^
10+
(crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))
11+
).toString(16)
12+
);
13+
}

src/lib/sql/sql-generate.schema.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import deepEqual from "deep-equal";
21
import {
32
DatabaseTableColumnChange,
43
DatabaseTableSchema,
54
DatabaseTableSchemaChange,
65
} from "@/drivers/base-driver";
6+
import deepEqual from "deep-equal";
77
import { cloneDeep } from "lodash";
8+
import { generateId } from "../generate-id";
89

910
export function checkSchemaColumnChange(change: DatabaseTableColumnChange) {
1011
return !deepEqual(change.old, change.new);
@@ -33,12 +34,12 @@ export function createTableSchemaDraft(
3334
new: schema.tableName,
3435
},
3536
columns: schema.columns.map((col) => ({
36-
key: window.crypto.randomUUID(),
37+
key: generateId(),
3738
old: col,
3839
new: cloneDeep(col),
3940
})),
4041
constraints: (schema.constraints ?? []).map((con) => ({
41-
id: window.crypto.randomUUID(),
42+
id: generateId(),
4243
old: con,
4344
new: cloneDeep(con),
4445
})),

src/lib/tracking.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { generateId } from "./generate-id";
12
import { throttleEvent } from "./tracking-throttle";
23

34
export interface TrackEventItem {
@@ -39,7 +40,7 @@ export function sendAnalyticEvents(events: TrackEventItem[]) {
3940

4041
let deviceId = localStorage.getItem("od-id");
4142
if (!deviceId) {
42-
deviceId = crypto.randomUUID();
43+
deviceId = generateId();
4344
localStorage.setItem("od-id", deviceId);
4445
}
4546

0 commit comments

Comments
 (0)