@openai-oauth/web 2.0.0-beta.2 → 2.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -26,9 +26,9 @@ await fetch("/api/chat", {
26
26
 
27
27
  ### Hosted Sign-in
28
28
 
29
- Hosted browser sign-in uses the open-source [Sign in with ChatGPT Chrome extension](https://chromewebstore.google.com/detail/sign-in-with-chatgpt/odbgboachaefbbbdiffcefhpkekhfcna) to complete OpenAI's local OAuth callback. The extension shows the destination app for confirmation and then returns the callback directly to it.
29
+ Hosted browser sign-in uses the open-source Sign in with ChatGPT extension for [Chrome](https://chromewebstore.google.com/detail/sign-in-with-chatgpt/odbgboachaefbbbdiffcefhpkekhfcna) or [Firefox](https://addons.mozilla.org/firefox/addon/sign-in-with-chatgpt/) to complete OpenAI's local OAuth callback. The extension shows the destination app for confirmation and then returns the callback directly to it.
30
30
 
31
- `startLogin()` uses this extension flow by default. When installation is needed, it returns the official Chrome Web Store URL for your interface to display:
31
+ `startLogin()` uses this extension flow by default. When installation is needed, it returns the correct Chrome Web Store or Firefox Add-ons URL for your interface to display:
32
32
 
33
33
  ```ts
34
34
  import { startLogin } from "@openai-oauth/web";
@@ -43,7 +43,7 @@ if (result.status === "needs-extension") {
43
43
 
44
44
  After installation, call `startLogin()` again when the user returns to your app or presses Sign in again. It will start OAuth once the extension is available.
45
45
 
46
- The extension uses a single static redirect for `http://localhost:1455/auth/callback`. After the user confirms the destination, call `completeLogin()` on the returned app URL to exchange the code and save the browser session.
46
+ The extension redirects only `http://localhost:1455/auth/callback`. After the user confirms the destination, call `completeLogin()` on the returned app URL to exchange the code and save the browser session.
47
47
 
48
48
  `startLogin()` returns `{ status: "started" }` when OAuth begins or `{ status: "needs-extension", installUrl }` when your interface should show installation UI. Provide an explicit `redirectUri` only when your environment handles its own registered callback without the extension.
49
49
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -10,7 +10,10 @@ const browserExtensionStatePrefix = "oo2_";
10
10
  const browserExtensionRedirectUri = "http://localhost:1455/auth/callback";
11
11
  const browserExtensionId = "odbgboachaefbbbdiffcefhpkekhfcna";
12
12
  const browserExtensionInstalledPath = "src/installed.json";
13
- const browserExtensionInstallUrl = "https://chromewebstore.google.com/detail/sign-in-with-chatgpt/odbgboachaefbbbdiffcefhpkekhfcna";
13
+ const chromeExtensionInstallUrl = "https://chromewebstore.google.com/detail/sign-in-with-chatgpt/odbgboachaefbbbdiffcefhpkekhfcna";
14
+ const firefoxExtensionInstallUrl = "https://addons.mozilla.org/firefox/addon/sign-in-with-chatgpt/";
15
+ const firefoxExtensionDetectionUrl = "http://localhost:1455/openai-oauth/installed";
16
+ const browserExtensionMarkerType = "openai-oauth:browser-extension-installed";
14
17
  const browserExtensionDetectionTimeoutMs = 750;
15
18
  const refreshExpiryMarginMs = 5 * 60 * 1000;
16
19
  const refreshIntervalMs = 55 * 60 * 1000;
@@ -28,7 +31,9 @@ const assertBrowserWindow = () => {
28
31
  }
29
32
  return window;
30
33
  };
31
- const isBrowserExtensionInstalled = async () => {
34
+ const isFirefox = () => typeof navigator !== "undefined" &&
35
+ navigator.userAgent.toLowerCase().includes("firefox/");
36
+ const isChromeExtensionInstalled = async () => {
32
37
  const fetchImpl = globalThis.fetch;
33
38
  if (!fetchImpl) {
34
39
  return false;
@@ -57,15 +62,68 @@ const isBrowserExtensionInstalled = async () => {
57
62
  }
58
63
  }
59
64
  };
65
+ const isFirefoxExtensionInstalled = (browserWindow) => new Promise((resolve) => {
66
+ const document = browserWindow.document;
67
+ const parent = document?.body ?? document?.documentElement;
68
+ if (!document?.createElement || !parent) {
69
+ resolve(false);
70
+ return;
71
+ }
72
+ const iframe = document.createElement("iframe");
73
+ iframe.hidden = true;
74
+ iframe.setAttribute("aria-hidden", "true");
75
+ iframe.src = firefoxExtensionDetectionUrl;
76
+ let settled = false;
77
+ const finish = (installed) => {
78
+ if (settled) {
79
+ return;
80
+ }
81
+ settled = true;
82
+ globalThis.clearTimeout(timeout);
83
+ browserWindow.removeEventListener("message", onMessage);
84
+ iframe.remove();
85
+ resolve(installed);
86
+ };
87
+ const onMessage = (event) => {
88
+ const data = event.data;
89
+ if (event.source === iframe.contentWindow &&
90
+ event.origin.startsWith("moz-extension://") &&
91
+ data?.type === browserExtensionMarkerType &&
92
+ data.name === "sign-in-with-chatgpt" &&
93
+ data.protocol === "openai-oauth-browser-extension" &&
94
+ data.protocolVersion === 1) {
95
+ finish(true);
96
+ }
97
+ };
98
+ const timeout = globalThis.setTimeout(() => finish(false), browserExtensionDetectionTimeoutMs);
99
+ browserWindow.addEventListener("message", onMessage);
100
+ parent.appendChild(iframe);
101
+ });
102
+ const getBrowserExtension = (browserWindow) => isFirefox()
103
+ ? {
104
+ installUrl: firefoxExtensionInstallUrl,
105
+ isInstalled: () => isFirefoxExtensionInstalled(browserWindow),
106
+ }
107
+ : {
108
+ installUrl: chromeExtensionInstallUrl,
109
+ isInstalled: isChromeExtensionInstalled,
110
+ };
60
111
  const requestToPromise = (request) => new Promise((resolve, reject) => {
61
112
  request.onsuccess = () => resolve(request.result);
62
113
  request.onerror = () => reject(request.error ?? new Error("IndexedDB request failed."));
63
114
  });
115
+ const transactionToPromise = (transaction) => new Promise((resolve, reject) => {
116
+ transaction.oncomplete = () => resolve();
117
+ transaction.onerror = () => reject(transaction.error ?? new Error("IndexedDB transaction failed."));
118
+ transaction.onabort = () => reject(transaction.error ?? new Error("IndexedDB transaction was aborted."));
119
+ });
64
120
  const openDatabaseRequest = (settings, version) => {
65
121
  assertBrowserStorage();
66
122
  const browserWindow = assertBrowserWindow();
67
123
  return new Promise((resolve, reject) => {
124
+ let settled = false;
68
125
  const timeout = browserWindow.setTimeout(() => {
126
+ settled = true;
69
127
  reject(new Error("Timed out opening browser session storage."));
70
128
  }, 2000);
71
129
  const request = typeof version === "number"
@@ -79,14 +137,25 @@ const openDatabaseRequest = (settings, version) => {
79
137
  };
80
138
  request.onsuccess = () => {
81
139
  browserWindow.clearTimeout(timeout);
140
+ if (settled) {
141
+ request.result.close();
142
+ return;
143
+ }
144
+ settled = true;
82
145
  resolve(request.result);
83
146
  };
84
147
  request.onerror = () => {
85
148
  browserWindow.clearTimeout(timeout);
149
+ if (settled)
150
+ return;
151
+ settled = true;
86
152
  reject(request.error ?? new Error("Could not open IndexedDB."));
87
153
  };
88
154
  request.onblocked = () => {
89
155
  browserWindow.clearTimeout(timeout);
156
+ if (settled)
157
+ return;
158
+ settled = true;
90
159
  reject(new Error("Browser session storage is blocked."));
91
160
  };
92
161
  });
@@ -109,8 +178,21 @@ const withStore = async (settings, mode, fn) => {
109
178
  const db = await openDatabase(settings);
110
179
  try {
111
180
  const tx = db.transaction(settings.storeName, mode);
181
+ const completed = transactionToPromise(tx);
112
182
  const store = tx.objectStore(settings.storeName);
113
- return await fn(store);
183
+ try {
184
+ const result = await fn(store);
185
+ await completed;
186
+ return result;
187
+ }
188
+ catch (error) {
189
+ try {
190
+ tx.abort();
191
+ }
192
+ catch { }
193
+ await completed.catch(() => undefined);
194
+ throw error;
195
+ }
114
196
  }
115
197
  finally {
116
198
  db.close();
@@ -174,7 +256,16 @@ const decryptSession = async (key, encrypted) => {
174
256
  name: "AES-GCM",
175
257
  iv: base64ToBytes(encrypted.iv),
176
258
  }, key, base64ToBytes(encrypted.ciphertext));
177
- return JSON.parse(textDecoder.decode(plaintext));
259
+ const session = JSON.parse(textDecoder.decode(plaintext));
260
+ if (typeof session !== "object" ||
261
+ session === null ||
262
+ !("accessToken" in session) ||
263
+ typeof session.accessToken !== "string" ||
264
+ !("accountId" in session) ||
265
+ typeof session.accountId !== "string") {
266
+ throw new Error("The stored OpenAI OAuth session is malformed.");
267
+ }
268
+ return session;
178
269
  };
179
270
  export const createSessionStore = (options = {}) => {
180
271
  const settings = {
@@ -183,16 +274,15 @@ export const createSessionStore = (options = {}) => {
183
274
  };
184
275
  return {
185
276
  get: async () => {
186
- try {
187
- const encrypted = await getRecord(settings, settings.sessionKey);
188
- if (!encrypted) {
189
- return null;
190
- }
191
- return decryptSession(await getCryptoKey(settings), encrypted);
192
- }
193
- catch {
277
+ const encrypted = await getRecord(settings, settings.sessionKey);
278
+ if (!encrypted) {
194
279
  return null;
195
280
  }
281
+ if (typeof encrypted.iv !== "string" ||
282
+ typeof encrypted.ciphertext !== "string") {
283
+ throw new Error("The stored OpenAI OAuth session is malformed.");
284
+ }
285
+ return decryptSession(await getCryptoKey(settings), encrypted);
196
286
  },
197
287
  set: async (session) => {
198
288
  const key = await getCryptoKey(settings);
@@ -370,10 +460,11 @@ const createBrowserExtensionState = (callbackUrl, appState) => {
370
460
  export const startLogin = async (options = {}) => {
371
461
  const browserWindow = assertBrowserWindow();
372
462
  const usesBrowserExtension = options.redirectUri === undefined;
373
- if (usesBrowserExtension && !(await isBrowserExtensionInstalled())) {
463
+ const browserExtension = getBrowserExtension(browserWindow);
464
+ if (usesBrowserExtension && !(await browserExtension.isInstalled())) {
374
465
  return {
375
466
  status: "needs-extension",
376
- installUrl: browserExtensionInstallUrl,
467
+ installUrl: browserExtension.installUrl,
377
468
  };
378
469
  }
379
470
  const returnTo = options.returnTo ?? getCurrentRelativeUrl();
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,aAAa,EACb,WAAW,EAEX,MAAM,oBAAoB,CAAA;AAE3B,MAAM,MAAM,2BAA2B,GAAG;IACzC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AA6BD,eAAO,MAAM,iBAAiB,GAC7B,OAAO,OAAO,GAAG,OAAO,EACxB,UAAS,2BAAgC,KACvC,WAaF,CAAA"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,aAAa,EACb,WAAW,EAEX,MAAM,oBAAoB,CAAA;AAE3B,MAAM,MAAM,2BAA2B,GAAG;IACzC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AA6BD,eAAO,MAAM,iBAAiB,GAC7B,OAAO,OAAO,GAAG,OAAO,EACxB,UAAS,2BAAgC,KACvC,WAYF,CAAA"}
package/dist/server.js CHANGED
@@ -27,6 +27,5 @@ export const openaiCredentials = (input, options = {}) => {
27
27
  instructions: options.instructions,
28
28
  openAIBaseURL: options.openAIBaseURL,
29
29
  getSession: async () => session,
30
- refreshSession: async () => session,
31
30
  };
32
31
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openai-oauth/web",
3
- "version": "2.0.0-beta.2",
3
+ "version": "2.0.0-beta.4",
4
4
  "description": "Browser credential storage and web utilities for openai-oauth.",
5
5
  "keywords": [
6
6
  "openai",
@@ -11,6 +11,9 @@
11
11
  "web"
12
12
  ],
13
13
  "type": "module",
14
+ "engines": {
15
+ "node": ">=20"
16
+ },
14
17
  "sideEffects": false,
15
18
  "main": "./dist/index.js",
16
19
  "types": "./dist/index.d.ts",
@@ -32,7 +35,7 @@
32
35
  "LICENSE"
33
36
  ],
34
37
  "scripts": {
35
- "build": "tsc -p tsconfig.build.json",
38
+ "build": "node ../../scripts/clean-dist.mjs && tsc -p tsconfig.build.json",
36
39
  "prepublishOnly": "bun run build",
37
40
  "typecheck": "tsc --noEmit",
38
41
  "test": "vitest run"
@@ -41,12 +44,12 @@
41
44
  "access": "public"
42
45
  },
43
46
  "dependencies": {
44
- "@openai-oauth/core": "2.0.0-beta.2"
47
+ "@openai-oauth/core": "2.0.0-beta.4"
45
48
  },
46
49
  "devDependencies": {
47
- "@types/node": "20.17.24",
48
- "typescript": "latest",
49
- "vitest": "latest"
50
+ "fake-indexeddb": "6.2.5",
51
+ "typescript": "5.9.2",
52
+ "vitest": "4.1.10"
50
53
  },
51
54
  "author": "EvanZhouDev",
52
55
  "license": "AGPL-3.0-only",