@osdk/oauth 1.1.0-beta.6 → 1.1.0-beta.8
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/CHANGELOG.md +14 -0
- package/build/browser/common.d.ts +9 -10
- package/build/browser/common.d.ts.map +1 -1
- package/build/browser/common.js +23 -6
- package/build/browser/common.js.map +1 -1
- package/build/browser/common.test.d.ts +2 -0
- package/build/browser/common.test.d.ts.map +1 -0
- package/build/browser/common.test.js +64 -0
- package/build/browser/common.test.js.map +1 -0
- package/build/browser/createConfidentialOauthClient.d.ts.map +1 -1
- package/build/browser/createConfidentialOauthClient.js +1 -1
- package/build/browser/createConfidentialOauthClient.js.map +1 -1
- package/build/browser/createPublicOauthClient.d.ts +4 -0
- package/build/browser/createPublicOauthClient.d.ts.map +1 -1
- package/build/browser/createPublicOauthClient.js +28 -16
- package/build/browser/createPublicOauthClient.js.map +1 -1
- package/build/browser/publicOauth.test.js +109 -34
- package/build/browser/publicOauth.test.js.map +1 -1
- package/build/browser/utils.d.ts +4 -2
- package/build/browser/utils.d.ts.map +1 -1
- package/build/browser/utils.js +2 -1
- package/build/browser/utils.js.map +1 -1
- package/build/esm/common.d.ts +9 -10
- package/build/esm/common.d.ts.map +1 -1
- package/build/esm/common.js +23 -6
- package/build/esm/common.js.map +1 -1
- package/build/esm/common.test.d.ts +2 -0
- package/build/esm/common.test.d.ts.map +1 -0
- package/build/esm/common.test.js +64 -0
- package/build/esm/common.test.js.map +1 -0
- package/build/esm/createConfidentialOauthClient.d.ts.map +1 -1
- package/build/esm/createConfidentialOauthClient.js +1 -1
- package/build/esm/createConfidentialOauthClient.js.map +1 -1
- package/build/esm/createPublicOauthClient.d.ts +4 -0
- package/build/esm/createPublicOauthClient.d.ts.map +1 -1
- package/build/esm/createPublicOauthClient.js +28 -16
- package/build/esm/createPublicOauthClient.js.map +1 -1
- package/build/esm/publicOauth.test.js +109 -34
- package/build/esm/publicOauth.test.js.map +1 -1
- package/build/esm/utils.d.ts +4 -2
- package/build/esm/utils.d.ts.map +1 -1
- package/build/esm/utils.js +2 -1
- package/build/esm/utils.js.map +1 -1
- package/package.json +4 -3
|
@@ -42,7 +42,8 @@ vi.mock("./common.js", async importOriginal => {
|
|
|
42
42
|
makeTokenAndSaveRefresh: hoistedMocks.makeTokenAndSaveRefresh
|
|
43
43
|
};
|
|
44
44
|
}),
|
|
45
|
-
readLocal: vi.spyOn(original, "readLocal")
|
|
45
|
+
readLocal: vi.spyOn(original, "readLocal"),
|
|
46
|
+
readSession: vi.spyOn(original, "readSession")
|
|
46
47
|
// vi.fn(original.readLocal),
|
|
47
48
|
};
|
|
48
49
|
});
|
|
@@ -66,6 +67,11 @@ describe(createPublicOauthClient, () => {
|
|
|
66
67
|
getItem: vi.fn(),
|
|
67
68
|
removeItem: vi.fn()
|
|
68
69
|
};
|
|
70
|
+
const mockSessionStorage = {
|
|
71
|
+
setItem: vi.fn(),
|
|
72
|
+
getItem: vi.fn(),
|
|
73
|
+
removeItem: vi.fn()
|
|
74
|
+
};
|
|
69
75
|
beforeEach(() => {
|
|
70
76
|
vi.restoreAllMocks();
|
|
71
77
|
fetchFn.mockRestore();
|
|
@@ -77,6 +83,7 @@ describe(createPublicOauthClient, () => {
|
|
|
77
83
|
beforeAll(() => {
|
|
78
84
|
vi.stubGlobal("window", mockWindow);
|
|
79
85
|
vi.stubGlobal("localStorage", mockLocalStorage);
|
|
86
|
+
vi.stubGlobal("sessionStorage", mockSessionStorage);
|
|
80
87
|
});
|
|
81
88
|
afterAll(() => {
|
|
82
89
|
vi.unstubAllGlobals();
|
|
@@ -88,6 +95,81 @@ describe(createPublicOauthClient, () => {
|
|
|
88
95
|
fetchFn
|
|
89
96
|
};
|
|
90
97
|
const fullLoginUrl = new URL("/loginPage", DEFAULT_CUR_URL);
|
|
98
|
+
function setupWindowLocation(currentUrl) {
|
|
99
|
+
mockWindow.location.href = new URL(currentUrl).href;
|
|
100
|
+
mockWindow.location.pathname = new URL(currentUrl).pathname;
|
|
101
|
+
}
|
|
102
|
+
function setupLocalState(initialLocalState) {
|
|
103
|
+
vi.mocked(commonJs.readLocal).mockImplementation(() => initialLocalState);
|
|
104
|
+
}
|
|
105
|
+
let client;
|
|
106
|
+
let clientArgs;
|
|
107
|
+
function setupClient(clientArgs_) {
|
|
108
|
+
clientArgs = clientArgs_;
|
|
109
|
+
if (clientArgs.refreshTokenMarker) {
|
|
110
|
+
client = createPublicOauthClient(clientArgs.clientId, clientArgs.foundryUrl, clientArgs.redirectUrl, clientArgs);
|
|
111
|
+
} else {
|
|
112
|
+
client = createPublicOauthClient(clientArgs.clientId, clientArgs.foundryUrl, clientArgs.redirectUrl, clientArgs.useHistory, clientArgs.loginPage, clientArgs.postLoginPage, clientArgs.scopes, clientArgs.fetchFn, clientArgs.ctxPath);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
beforeEach(() => {
|
|
116
|
+
// prevents mistakes like forgetting to initialize the client with an
|
|
117
|
+
// old value around
|
|
118
|
+
client = undefined;
|
|
119
|
+
clientArgs = undefined;
|
|
120
|
+
});
|
|
121
|
+
async function expectRedirectToMultipass(tokenPromise) {
|
|
122
|
+
// we assume window.location.assign will take you away therefore we
|
|
123
|
+
// also have to expect in this scenario that the thrown error happens
|
|
124
|
+
await expect(tokenPromise).rejects.toThrowError(new Error("Unable to redirect"));
|
|
125
|
+
expect(mockWindow.location.assign).toHaveBeenCalledOnce();
|
|
126
|
+
const url = new URL(mockWindow.location.assign.mock.calls[0][0]);
|
|
127
|
+
expect(url.origin).toEqual(clientArgs.foundryUrl);
|
|
128
|
+
expect(url.pathname).toEqual("/multipass/api/oauth2/authorize");
|
|
129
|
+
expect(Object.fromEntries(url.searchParams.entries())).toEqual(expect.objectContaining({
|
|
130
|
+
client_id: clientArgs.clientId,
|
|
131
|
+
code_challenge: expect.any(String),
|
|
132
|
+
redirect_uri: clientArgs.redirectUrl,
|
|
133
|
+
response_type: "code",
|
|
134
|
+
code_challenge_method: "S256",
|
|
135
|
+
scope: "offline_access api:read-data api:write-data",
|
|
136
|
+
state: expect.any(String)
|
|
137
|
+
}));
|
|
138
|
+
}
|
|
139
|
+
describe("refresh token marker", () => {
|
|
140
|
+
beforeEach(() => {
|
|
141
|
+
setupWindowLocation("https://foundry.local");
|
|
142
|
+
});
|
|
143
|
+
it("should not allow refresh if the refresh markers do not match", async () => {
|
|
144
|
+
setupLocalState({
|
|
145
|
+
refresh_token: "refreshToken",
|
|
146
|
+
refreshTokenMarker: "not-the-right-marker"
|
|
147
|
+
});
|
|
148
|
+
setupClient({
|
|
149
|
+
...BASE_CLIENT_ARGS,
|
|
150
|
+
refreshTokenMarker: "marker"
|
|
151
|
+
});
|
|
152
|
+
await expectRedirectToMultipass(client());
|
|
153
|
+
});
|
|
154
|
+
it("should try to refresh if refresh tokens do match", async () => {
|
|
155
|
+
setupLocalState({
|
|
156
|
+
refresh_token: "refreshToken",
|
|
157
|
+
refreshTokenMarker: "marker"
|
|
158
|
+
});
|
|
159
|
+
setupClient({
|
|
160
|
+
...BASE_CLIENT_ARGS,
|
|
161
|
+
refreshTokenMarker: "marker"
|
|
162
|
+
});
|
|
163
|
+
hoistedMocks.makeTokenAndSaveRefresh.mockImplementationOnce(() => ({
|
|
164
|
+
access_token: "some token",
|
|
165
|
+
expires_at: Date.now(),
|
|
166
|
+
expires_in: 10000
|
|
167
|
+
}));
|
|
168
|
+
const tokenPromise = client();
|
|
169
|
+
await expect(tokenPromise).resolves.toEqual("some token");
|
|
170
|
+
expect(hoistedMocks.makeTokenAndSaveRefresh).toBeCalledTimes(1);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
91
173
|
describe.each([{
|
|
92
174
|
name: "Basic Usage",
|
|
93
175
|
currentUrl: DEFAULT_CUR_URL,
|
|
@@ -142,35 +224,43 @@ describe(createPublicOauthClient, () => {
|
|
|
142
224
|
currentUrl,
|
|
143
225
|
should
|
|
144
226
|
}) => {
|
|
145
|
-
let client;
|
|
146
227
|
beforeEach(() => {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
mockWindow.location.pathname = new URL(currentUrl).pathname;
|
|
228
|
+
setupClient(clientArgs);
|
|
229
|
+
setupWindowLocation(currentUrl.toString());
|
|
150
230
|
});
|
|
151
231
|
it("calls common with expected values", () => {
|
|
152
232
|
expect(vi.mocked(commonJs.common)).toHaveBeenCalledWith(expect.objectContaining({
|
|
153
233
|
client_id: clientArgs.clientId,
|
|
154
234
|
token_endpoint_auth_method: "none"
|
|
155
|
-
}), commonJs.createAuthorizationServer(clientArgs.ctxPath ?? "/multipass", clientArgs.foundryUrl), expect.any(Function), expect.anything(), expect.any(Function));
|
|
235
|
+
}), commonJs.createAuthorizationServer(clientArgs.ctxPath ?? "/multipass", clientArgs.foundryUrl), expect.any(Function), expect.anything(), expect.any(Function), undefined);
|
|
156
236
|
});
|
|
157
237
|
describe.each([{
|
|
158
|
-
|
|
238
|
+
localStorage: {
|
|
239
|
+
refresh_token: "a-refresh-token"
|
|
240
|
+
},
|
|
241
|
+
sessionStorage: {}
|
|
242
|
+
}, {
|
|
243
|
+
localStorage: {},
|
|
244
|
+
sessionStorage: {
|
|
245
|
+
codeVerifier: "hi",
|
|
246
|
+
state: "mom",
|
|
247
|
+
oldUrl: "https://someoldurl.local"
|
|
248
|
+
}
|
|
159
249
|
}, {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
}, {}])("Initial Local State: %s", initialLocalState => {
|
|
250
|
+
localStorage: {},
|
|
251
|
+
sessionStorage: {}
|
|
252
|
+
}])("Initial Local State: %s", initialState => {
|
|
164
253
|
const ACCESS_TOKEN = (Math.random() + 1).toString(36).substring(7);
|
|
165
254
|
beforeEach(() => {
|
|
166
|
-
vi.mocked(commonJs.readLocal).mockImplementation(() =>
|
|
255
|
+
vi.mocked(commonJs.readLocal).mockImplementation(() => initialState.localStorage);
|
|
256
|
+
vi.mocked(commonJs.readSession).mockImplementation(() => initialState.sessionStorage);
|
|
167
257
|
hoistedMocks.makeTokenAndSaveRefresh.mockImplementation(() => ({
|
|
168
258
|
access_token: ACCESS_TOKEN,
|
|
169
259
|
expires_at: Date.now(),
|
|
170
260
|
expires_in: 10000
|
|
171
261
|
}));
|
|
172
262
|
});
|
|
173
|
-
if (Object.keys(
|
|
263
|
+
if (Object.keys(initialState.localStorage).length === 0 && Object.keys(initialState.sessionStorage).length === 0) {
|
|
174
264
|
if (should.redirectToLoginPage) {
|
|
175
265
|
it("redirects to login page", async () => {
|
|
176
266
|
const tokenPromise = client();
|
|
@@ -178,7 +268,7 @@ describe(createPublicOauthClient, () => {
|
|
|
178
268
|
if (should.redirectToLoginPage) {
|
|
179
269
|
// expect save local
|
|
180
270
|
await expect(tokenPromise).resolves.toBeUndefined();
|
|
181
|
-
expect(
|
|
271
|
+
expect(mockSessionStorage.setItem).toBeCalledWith(`@osdk/oauth : refresh : ${clientArgs.clientId}`, JSON.stringify({
|
|
182
272
|
oldUrl: window.location.toString()
|
|
183
273
|
}));
|
|
184
274
|
expect(mockWindow.history.replaceState).toHaveBeenCalledWith({}, "", clientArgs.loginPage);
|
|
@@ -191,32 +281,17 @@ describe(createPublicOauthClient, () => {
|
|
|
191
281
|
if (should.redirectToLoginPage) {
|
|
192
282
|
// expect save local
|
|
193
283
|
await expect(tokenPromise).resolves.toBeUndefined();
|
|
194
|
-
expect(
|
|
284
|
+
expect(mockSessionStorage.setItem).toBeCalledWith(`@osdk/oauth : refresh : ${clientArgs.clientId}`, JSON.stringify({
|
|
195
285
|
oldUrl: window.location.toString()
|
|
196
286
|
}));
|
|
197
287
|
expect(mockWindow.history.replaceState).toHaveBeenCalledWith({}, "", clientArgs.loginPage);
|
|
198
288
|
return;
|
|
199
289
|
}
|
|
200
|
-
|
|
201
|
-
// also have to expect in this scenario that the thrown error happens
|
|
202
|
-
await expect(tokenPromise).rejects.toThrowError(new Error("Unable to redirect"));
|
|
203
|
-
expect(mockWindow.location.assign).toHaveBeenCalledOnce();
|
|
204
|
-
const url = new URL(mockWindow.location.assign.mock.calls[0][0]);
|
|
205
|
-
expect(url.origin).toEqual(clientArgs.foundryUrl);
|
|
206
|
-
expect(url.pathname).toEqual("/multipass/api/oauth2/authorize");
|
|
207
|
-
expect(Object.fromEntries(url.searchParams.entries())).toEqual(expect.objectContaining({
|
|
208
|
-
client_id: clientArgs.clientId,
|
|
209
|
-
code_challenge: expect.any(String),
|
|
210
|
-
redirect_uri: clientArgs.redirectUrl,
|
|
211
|
-
response_type: "code",
|
|
212
|
-
code_challenge_method: "S256",
|
|
213
|
-
scope: "offline_access api:read-data api:write-data",
|
|
214
|
-
state: expect.any(String)
|
|
215
|
-
}));
|
|
290
|
+
await expectRedirectToMultipass(tokenPromise);
|
|
216
291
|
});
|
|
217
292
|
}
|
|
218
293
|
}
|
|
219
|
-
if (
|
|
294
|
+
if (initialState.sessionStorage.codeVerifier) {
|
|
220
295
|
it("tries to auth with return results", async () => {
|
|
221
296
|
await expect(client()).resolves.toEqual(ACCESS_TOKEN);
|
|
222
297
|
expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(1);
|
|
@@ -224,10 +299,10 @@ describe(createPublicOauthClient, () => {
|
|
|
224
299
|
// this is only because we didn't mock out the internals
|
|
225
300
|
"signIn");
|
|
226
301
|
expect(mockWindow.history.replaceState).toHaveBeenCalledTimes(1);
|
|
227
|
-
expect(mockWindow.history.replaceState).toBeCalledWith(expect.anything(), expect.anything(),
|
|
302
|
+
expect(mockWindow.history.replaceState).toBeCalledWith(expect.anything(), expect.anything(), initialState.sessionStorage.oldUrl);
|
|
228
303
|
});
|
|
229
304
|
}
|
|
230
|
-
if (
|
|
305
|
+
if (initialState.localStorage.refresh_token) {
|
|
231
306
|
it("refreshes", async () => {
|
|
232
307
|
await expect(client()).resolves.toEqual(ACCESS_TOKEN);
|
|
233
308
|
expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publicOauth.test.js","names":["afterAll","afterEach","beforeAll","beforeEach","describe","expect","it","vi","commonJs","createPublicOauthClient","hoistedMocks","hoisted","makeTokenAndSaveRefresh","fn","mock","importOriginal","original","default","ms","opts","common","args","result","readLocal","spyOn","DEFAULT_CUR_URL","URL","fetchFn","mockWindow","location","toString","assign","href","pathname","history","replaceState","mockLocalStorage","setItem","getItem","removeItem","restoreAllMocks","mockRestore","clearAllMocks","mockReset","stubGlobal","unstubAllGlobals","BASE_CLIENT_ARGS","clientId","foundryUrl","redirectUrl","fullLoginUrl","each","name","currentUrl","clientArgs","should","redirectToLoginPage","loginPage","client","useHistory","postLoginPage","scopes","ctxPath","mocked","toHaveBeenCalledWith","objectContaining","client_id","token_endpoint_auth_method","createAuthorizationServer","any","Function","anything","refresh_token","codeVerifier","state","oldUrl","initialLocalState","ACCESS_TOKEN","Math","random","substring","mockImplementation","access_token","expires_at","Date","now","expires_in","Object","keys","length","tokenPromise","toBeCalledTimes","resolves","toBeUndefined","toBeCalledWith","JSON","stringify","window","rejects","toThrowError","Error","toHaveBeenCalledOnce","url","calls","origin","toEqual","fromEntries","searchParams","entries","code_challenge","String","redirect_uri","response_type","code_challenge_method","scope","toHaveBeenCalledTimes","undefined"],"sources":["publicOauth.test.js"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* eslint-disable @typescript-eslint/consistent-type-imports */\nimport { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi, } from \"vitest\";\nimport * as commonJs from \"./common.js\";\nimport { createPublicOauthClient } from \"./createPublicOauthClient.js\";\nconst hoistedMocks = vi.hoisted(() => {\n return {\n makeTokenAndSaveRefresh: vi.fn(),\n };\n});\nvi.mock(\"delay\", async (importOriginal) => {\n const original = await importOriginal();\n return {\n default: vi.fn((ms, opts) => {\n // speed up the tests\n return original.default(ms / 100, opts);\n }),\n };\n});\nvi.mock(\"./common.js\", async (importOriginal) => {\n const original = await importOriginal();\n return {\n ...original,\n common: vi.fn((...args) => {\n const result = original.common(...args);\n return {\n ...result,\n makeTokenAndSaveRefresh: hoistedMocks.makeTokenAndSaveRefresh,\n };\n }),\n readLocal: vi.spyOn(original, \"readLocal\"),\n // vi.fn(original.readLocal),\n };\n});\nvi.mock(\"oauth4webapi\");\ndescribe(createPublicOauthClient, () => {\n const DEFAULT_CUR_URL = new URL(\"https://fauxurl\");\n const fetchFn = vi.fn();\n const mockWindow = {\n location: {\n toString: vi.fn(() => DEFAULT_CUR_URL),\n assign: vi.fn(),\n href: DEFAULT_CUR_URL.href,\n pathname: DEFAULT_CUR_URL.pathname,\n },\n history: {\n replaceState: vi.fn(),\n },\n };\n const mockLocalStorage = {\n setItem: vi.fn(),\n getItem: vi.fn(),\n removeItem: vi.fn(),\n };\n beforeEach((context) => {\n vi.restoreAllMocks();\n fetchFn.mockRestore();\n });\n afterEach((context) => {\n vi.clearAllMocks();\n fetchFn.mockReset();\n });\n beforeAll(() => {\n vi.stubGlobal(\"window\", mockWindow);\n vi.stubGlobal(\"localStorage\", mockLocalStorage);\n });\n afterAll(() => {\n vi.unstubAllGlobals();\n });\n const BASE_CLIENT_ARGS = {\n clientId: \"this-would-be-client-id\",\n foundryUrl: \"https://a.foundry.url.local\",\n redirectUrl: \"https://my.redirect.url.local\",\n fetchFn,\n };\n const fullLoginUrl = new URL(\"/loginPage\", DEFAULT_CUR_URL);\n describe.each([\n {\n name: \"Basic Usage\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n {\n name: \"Base w/ full loginPage and curUrl is root\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: fullLoginUrl.toString(),\n },\n should: {\n redirectToLoginPage: true,\n },\n },\n {\n name: \"Base w/ full loginPage and curUrl is login page\",\n currentUrl: fullLoginUrl,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: fullLoginUrl.toString(),\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n {\n name: \"Base w/ short loginPage and curUrl is root\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: \"/loginPage\",\n },\n should: {\n redirectToLoginPage: true,\n },\n },\n {\n name: \"Base w/ short loginPage and curUrl is loginPage\",\n currentUrl: new URL(\"/loginPage\", DEFAULT_CUR_URL),\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: \"/loginPage\",\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n ])(\"$name\", ({ clientArgs, currentUrl, should }) => {\n let client;\n beforeEach(() => {\n client = createPublicOauthClient(clientArgs.clientId, clientArgs.foundryUrl, clientArgs.redirectUrl, clientArgs.useHistory, clientArgs.loginPage, clientArgs.postLoginPage, clientArgs.scopes, clientArgs.fetchFn, clientArgs.ctxPath);\n mockWindow.location.href = new URL(currentUrl).href;\n mockWindow.location.pathname = new URL(currentUrl).pathname;\n });\n it(\"calls common with expected values\", () => {\n expect(vi.mocked(commonJs.common)).toHaveBeenCalledWith(expect.objectContaining({\n client_id: clientArgs.clientId,\n token_endpoint_auth_method: \"none\",\n }), commonJs.createAuthorizationServer(clientArgs.ctxPath ?? \"/multipass\", clientArgs.foundryUrl), expect.any(Function), expect.anything(), expect.any(Function));\n });\n describe.each([\n {\n refresh_token: \"a-refresh-token\",\n },\n {\n codeVerifier: \"hi\",\n state: \"mom\",\n oldUrl: \"https://someoldurl.local\",\n },\n {},\n ])(\"Initial Local State: %s\", (initialLocalState) => {\n const ACCESS_TOKEN = (Math.random() + 1).toString(36).substring(7);\n beforeEach(() => {\n vi.mocked(commonJs.readLocal).mockImplementation(() => initialLocalState);\n hoistedMocks.makeTokenAndSaveRefresh.mockImplementation(() => ({\n access_token: ACCESS_TOKEN,\n expires_at: Date.now(),\n expires_in: 10000,\n }));\n });\n if (Object.keys(initialLocalState).length === 0) {\n if (should.redirectToLoginPage) {\n it(\"redirects to login page\", async () => {\n const tokenPromise = client();\n expect(vi.mocked(commonJs.common)).toBeCalledTimes(1);\n if (should.redirectToLoginPage) {\n // expect save local\n await expect(tokenPromise).resolves.toBeUndefined();\n expect(mockLocalStorage.setItem).toBeCalledWith(`@osdk/oauth : refresh : ${clientArgs.clientId}`, JSON.stringify({ oldUrl: window.location.toString() }));\n expect(mockWindow.history.replaceState).toHaveBeenCalledWith({}, \"\", clientArgs.loginPage);\n return;\n }\n });\n }\n else {\n it(\"redirects to multipass\", async () => {\n const tokenPromise = client();\n expect(vi.mocked(commonJs.common)).toBeCalledTimes(1);\n if (should.redirectToLoginPage) {\n // expect save local\n await expect(tokenPromise).resolves.toBeUndefined();\n expect(mockLocalStorage.setItem).toBeCalledWith(`@osdk/oauth : refresh : ${clientArgs.clientId}`, JSON.stringify({ oldUrl: window.location.toString() }));\n expect(mockWindow.history.replaceState).toHaveBeenCalledWith({}, \"\", clientArgs.loginPage);\n return;\n }\n // we assume window.location.assign will take you away therefore we\n // also have to expect in this scenario that the thrown error happens\n await expect(tokenPromise)\n .rejects.toThrowError(new Error(\"Unable to redirect\"));\n expect(mockWindow.location.assign).toHaveBeenCalledOnce();\n const url = new URL(mockWindow.location.assign.mock.calls[0][0]);\n expect(url.origin).toEqual(clientArgs.foundryUrl);\n expect(url.pathname).toEqual(\"/multipass/api/oauth2/authorize\");\n expect(Object.fromEntries(url.searchParams.entries())).toEqual(expect.objectContaining({\n client_id: clientArgs.clientId,\n code_challenge: expect.any(String),\n redirect_uri: clientArgs.redirectUrl,\n response_type: \"code\",\n code_challenge_method: \"S256\",\n scope: \"offline_access api:read-data api:write-data\",\n state: expect.any(String),\n }));\n });\n }\n }\n if (initialLocalState.codeVerifier) {\n it(\"tries to auth with return results\", async () => {\n await expect(client()).resolves.toEqual(ACCESS_TOKEN);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(1);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledWith(undefined, // this is only because we didn't mock out the internals\n \"signIn\");\n expect(mockWindow.history.replaceState).toHaveBeenCalledTimes(1);\n expect(mockWindow.history.replaceState).toBeCalledWith(expect.anything(), expect.anything(), initialLocalState.oldUrl);\n });\n }\n if (initialLocalState.refresh_token) {\n it(\"refreshes\", async () => {\n await expect(client()).resolves.toEqual(ACCESS_TOKEN);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(1);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledWith(undefined, // this is only because we didn't mock out the internals\n \"refresh\");\n });\n }\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"publicOauth.test.js","names":["afterAll","afterEach","beforeAll","beforeEach","describe","expect","it","vi","commonJs","createPublicOauthClient","hoistedMocks","hoisted","makeTokenAndSaveRefresh","fn","mock","importOriginal","original","default","ms","opts","common","args","result","readLocal","spyOn","readSession","DEFAULT_CUR_URL","URL","fetchFn","mockWindow","location","toString","assign","href","pathname","history","replaceState","mockLocalStorage","setItem","getItem","removeItem","mockSessionStorage","restoreAllMocks","mockRestore","clearAllMocks","mockReset","stubGlobal","unstubAllGlobals","BASE_CLIENT_ARGS","clientId","foundryUrl","redirectUrl","fullLoginUrl","setupWindowLocation","currentUrl","setupLocalState","initialLocalState","mocked","mockImplementation","client","clientArgs","setupClient","clientArgs_","refreshTokenMarker","useHistory","loginPage","postLoginPage","scopes","ctxPath","undefined","expectRedirectToMultipass","tokenPromise","rejects","toThrowError","Error","toHaveBeenCalledOnce","url","calls","origin","toEqual","Object","fromEntries","searchParams","entries","objectContaining","client_id","code_challenge","any","String","redirect_uri","response_type","code_challenge_method","scope","state","refresh_token","mockImplementationOnce","access_token","expires_at","Date","now","expires_in","resolves","toBeCalledTimes","each","name","should","redirectToLoginPage","toHaveBeenCalledWith","token_endpoint_auth_method","createAuthorizationServer","Function","anything","localStorage","sessionStorage","codeVerifier","oldUrl","initialState","ACCESS_TOKEN","Math","random","substring","keys","length","toBeUndefined","toBeCalledWith","JSON","stringify","window","toHaveBeenCalledTimes"],"sources":["publicOauth.test.js"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* eslint-disable @typescript-eslint/consistent-type-imports */\nimport { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi, } from \"vitest\";\nimport * as commonJs from \"./common.js\";\nimport { createPublicOauthClient } from \"./createPublicOauthClient.js\";\nconst hoistedMocks = vi.hoisted(() => {\n return {\n makeTokenAndSaveRefresh: vi.fn(),\n };\n});\nvi.mock(\"delay\", async (importOriginal) => {\n const original = await importOriginal();\n return {\n default: vi.fn((ms, opts) => {\n // speed up the tests\n return original.default(ms / 100, opts);\n }),\n };\n});\nvi.mock(\"./common.js\", async (importOriginal) => {\n const original = await importOriginal();\n return {\n ...original,\n common: vi.fn((...args) => {\n const result = original.common(...args);\n return {\n ...result,\n makeTokenAndSaveRefresh: hoistedMocks.makeTokenAndSaveRefresh,\n };\n }),\n readLocal: vi.spyOn(original, \"readLocal\"),\n readSession: vi.spyOn(original, \"readSession\"),\n // vi.fn(original.readLocal),\n };\n});\nvi.mock(\"oauth4webapi\");\ndescribe(createPublicOauthClient, () => {\n const DEFAULT_CUR_URL = new URL(\"https://fauxurl\");\n const fetchFn = vi.fn();\n const mockWindow = {\n location: {\n toString: vi.fn(() => DEFAULT_CUR_URL),\n assign: vi.fn(),\n href: DEFAULT_CUR_URL.href,\n pathname: DEFAULT_CUR_URL.pathname,\n },\n history: {\n replaceState: vi.fn(),\n },\n };\n const mockLocalStorage = {\n setItem: vi.fn(),\n getItem: vi.fn(),\n removeItem: vi.fn(),\n };\n const mockSessionStorage = {\n setItem: vi.fn(),\n getItem: vi.fn(),\n removeItem: vi.fn(),\n };\n beforeEach((context) => {\n vi.restoreAllMocks();\n fetchFn.mockRestore();\n });\n afterEach((context) => {\n vi.clearAllMocks();\n fetchFn.mockReset();\n });\n beforeAll(() => {\n vi.stubGlobal(\"window\", mockWindow);\n vi.stubGlobal(\"localStorage\", mockLocalStorage);\n vi.stubGlobal(\"sessionStorage\", mockSessionStorage);\n });\n afterAll(() => {\n vi.unstubAllGlobals();\n });\n const BASE_CLIENT_ARGS = {\n clientId: \"this-would-be-client-id\",\n foundryUrl: \"https://a.foundry.url.local\",\n redirectUrl: \"https://my.redirect.url.local\",\n fetchFn,\n };\n const fullLoginUrl = new URL(\"/loginPage\", DEFAULT_CUR_URL);\n function setupWindowLocation(currentUrl) {\n mockWindow.location.href = new URL(currentUrl).href;\n mockWindow.location.pathname = new URL(currentUrl).pathname;\n }\n function setupLocalState(initialLocalState) {\n vi.mocked(commonJs.readLocal).mockImplementation(() => initialLocalState);\n }\n let client;\n let clientArgs;\n function setupClient(clientArgs_) {\n clientArgs = clientArgs_;\n if (clientArgs.refreshTokenMarker) {\n client = createPublicOauthClient(clientArgs.clientId, clientArgs.foundryUrl, clientArgs.redirectUrl, clientArgs);\n }\n else {\n client = createPublicOauthClient(clientArgs.clientId, clientArgs.foundryUrl, clientArgs.redirectUrl, clientArgs.useHistory, clientArgs.loginPage, clientArgs.postLoginPage, clientArgs.scopes, clientArgs.fetchFn, clientArgs.ctxPath);\n }\n }\n beforeEach((context) => {\n // prevents mistakes like forgetting to initialize the client with an\n // old value around\n client = undefined;\n clientArgs = undefined;\n });\n async function expectRedirectToMultipass(tokenPromise) {\n // we assume window.location.assign will take you away therefore we\n // also have to expect in this scenario that the thrown error happens\n await expect(tokenPromise)\n .rejects.toThrowError(new Error(\"Unable to redirect\"));\n expect(mockWindow.location.assign).toHaveBeenCalledOnce();\n const url = new URL(mockWindow.location.assign.mock.calls[0][0]);\n expect(url.origin).toEqual(clientArgs.foundryUrl);\n expect(url.pathname).toEqual(\"/multipass/api/oauth2/authorize\");\n expect(Object.fromEntries(url.searchParams.entries())).toEqual(expect.objectContaining({\n client_id: clientArgs.clientId,\n code_challenge: expect.any(String),\n redirect_uri: clientArgs.redirectUrl,\n response_type: \"code\",\n code_challenge_method: \"S256\",\n scope: \"offline_access api:read-data api:write-data\",\n state: expect.any(String),\n }));\n }\n describe(\"refresh token marker\", () => {\n beforeEach(() => {\n setupWindowLocation(\"https://foundry.local\");\n });\n it(\"should not allow refresh if the refresh markers do not match\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n refreshTokenMarker: \"not-the-right-marker\",\n });\n setupClient({\n ...BASE_CLIENT_ARGS,\n refreshTokenMarker: \"marker\",\n });\n await expectRedirectToMultipass(client());\n });\n it(\"should try to refresh if refresh tokens do match\", async () => {\n setupLocalState({\n refresh_token: \"refreshToken\",\n refreshTokenMarker: \"marker\",\n });\n setupClient({\n ...BASE_CLIENT_ARGS,\n refreshTokenMarker: \"marker\",\n });\n hoistedMocks.makeTokenAndSaveRefresh.mockImplementationOnce(() => ({\n access_token: \"some token\",\n expires_at: Date.now(),\n expires_in: 10000,\n }));\n const tokenPromise = client();\n await expect(tokenPromise).resolves.toEqual(\"some token\");\n expect(hoistedMocks.makeTokenAndSaveRefresh).toBeCalledTimes(1);\n });\n });\n describe.each([\n {\n name: \"Basic Usage\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n {\n name: \"Base w/ full loginPage and curUrl is root\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: fullLoginUrl.toString(),\n },\n should: {\n redirectToLoginPage: true,\n },\n },\n {\n name: \"Base w/ full loginPage and curUrl is login page\",\n currentUrl: fullLoginUrl,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: fullLoginUrl.toString(),\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n {\n name: \"Base w/ short loginPage and curUrl is root\",\n currentUrl: DEFAULT_CUR_URL,\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: \"/loginPage\",\n },\n should: {\n redirectToLoginPage: true,\n },\n },\n {\n name: \"Base w/ short loginPage and curUrl is loginPage\",\n currentUrl: new URL(\"/loginPage\", DEFAULT_CUR_URL),\n clientArgs: {\n ...BASE_CLIENT_ARGS,\n loginPage: \"/loginPage\",\n },\n should: {\n redirectToLoginPage: false,\n },\n },\n ])(\"$name\", ({ clientArgs, currentUrl, should }) => {\n beforeEach(() => {\n setupClient(clientArgs);\n setupWindowLocation(currentUrl.toString());\n });\n it(\"calls common with expected values\", () => {\n expect(vi.mocked(commonJs.common)).toHaveBeenCalledWith(expect.objectContaining({\n client_id: clientArgs.clientId,\n token_endpoint_auth_method: \"none\",\n }), commonJs.createAuthorizationServer(clientArgs.ctxPath ?? \"/multipass\", clientArgs.foundryUrl), expect.any(Function), expect.anything(), expect.any(Function), undefined);\n });\n describe.each([\n {\n localStorage: {\n refresh_token: \"a-refresh-token\",\n },\n sessionStorage: {},\n },\n {\n localStorage: {},\n sessionStorage: {\n codeVerifier: \"hi\",\n state: \"mom\",\n oldUrl: \"https://someoldurl.local\",\n },\n },\n { localStorage: {}, sessionStorage: {} },\n ])(\"Initial Local State: %s\", (initialState) => {\n const ACCESS_TOKEN = (Math.random() + 1).toString(36).substring(7);\n beforeEach(() => {\n vi.mocked(commonJs.readLocal).mockImplementation(() => initialState.localStorage);\n vi.mocked(commonJs.readSession).mockImplementation(() => initialState.sessionStorage);\n hoistedMocks.makeTokenAndSaveRefresh.mockImplementation(() => ({\n access_token: ACCESS_TOKEN,\n expires_at: Date.now(),\n expires_in: 10000,\n }));\n });\n if (Object.keys(initialState.localStorage).length === 0\n && Object.keys(initialState.sessionStorage).length === 0) {\n if (should.redirectToLoginPage) {\n it(\"redirects to login page\", async () => {\n const tokenPromise = client();\n expect(vi.mocked(commonJs.common)).toBeCalledTimes(1);\n if (should.redirectToLoginPage) {\n // expect save local\n await expect(tokenPromise).resolves.toBeUndefined();\n expect(mockSessionStorage.setItem).toBeCalledWith(`@osdk/oauth : refresh : ${clientArgs.clientId}`, JSON.stringify({ oldUrl: window.location.toString() }));\n expect(mockWindow.history.replaceState).toHaveBeenCalledWith({}, \"\", clientArgs.loginPage);\n return;\n }\n });\n }\n else {\n it(\"redirects to multipass\", async () => {\n const tokenPromise = client();\n expect(vi.mocked(commonJs.common)).toBeCalledTimes(1);\n if (should.redirectToLoginPage) {\n // expect save local\n await expect(tokenPromise).resolves.toBeUndefined();\n expect(mockSessionStorage.setItem).toBeCalledWith(`@osdk/oauth : refresh : ${clientArgs.clientId}`, JSON.stringify({ oldUrl: window.location.toString() }));\n expect(mockWindow.history.replaceState).toHaveBeenCalledWith({}, \"\", clientArgs.loginPage);\n return;\n }\n await expectRedirectToMultipass(tokenPromise);\n });\n }\n }\n if (initialState.sessionStorage.codeVerifier) {\n it(\"tries to auth with return results\", async () => {\n await expect(client()).resolves.toEqual(ACCESS_TOKEN);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(1);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledWith(undefined, // this is only because we didn't mock out the internals\n \"signIn\");\n expect(mockWindow.history.replaceState).toHaveBeenCalledTimes(1);\n expect(mockWindow.history.replaceState).toBeCalledWith(expect.anything(), expect.anything(), initialState.sessionStorage.oldUrl);\n });\n }\n if (initialState.localStorage.refresh_token) {\n it(\"refreshes\", async () => {\n await expect(client()).resolves.toEqual(ACCESS_TOKEN);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledTimes(1);\n expect(hoistedMocks.makeTokenAndSaveRefresh).toHaveBeenCalledWith(undefined, // this is only because we didn't mock out the internals\n \"refresh\");\n });\n }\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
package/build/browser/utils.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { PublicOauthClientOptions } from "./createPublicOauthClient.js";
|
|
2
|
-
|
|
2
|
+
interface ProcessedPublicOauthClientOptions extends Omit<Required<PublicOauthClientOptions>, "loginPage" | "refreshTokenMarker"> {
|
|
3
3
|
loginPage?: string;
|
|
4
|
-
|
|
4
|
+
refreshTokenMarker?: string;
|
|
5
|
+
}
|
|
5
6
|
export declare function processOptionsAndAssignDefaults(url: string, redirect_uri: string, useHistory?: boolean | PublicOauthClientOptions, loginPage?: string, postLoginPage?: string, scopes?: string[], fetchFn?: typeof globalThis.fetch, ctxPath?: string): ProcessedPublicOauthClientOptions;
|
|
7
|
+
export {};
|
|
6
8
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAE7E,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAE7E,UAAU,iCACR,SACE,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,WAAW,GAAG,oBAAoB,CAAC;IAE9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,OAAO,GAAG,wBAAwB,EAC/C,SAAS,CAAC,EAAE,MAAM,EAClB,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,EACjC,OAAO,CAAC,EAAE,MAAM,GACf,iCAAiC,CAiCnC"}
|
package/build/browser/utils.js
CHANGED
|
@@ -38,7 +38,8 @@ export function processOptionsAndAssignDefaults(url, redirect_uri, useHistory, l
|
|
|
38
38
|
postLoginPage: options.postLoginPage || window.location.toString(),
|
|
39
39
|
scopes: options.scopes ?? ["api:read-data", "api:write-data"],
|
|
40
40
|
fetchFn: options.fetchFn ?? globalThis.fetch,
|
|
41
|
-
ctxPath: options.ctxPath ?? "multipass"
|
|
41
|
+
ctxPath: options.ctxPath ?? "multipass",
|
|
42
|
+
refreshTokenMarker: options.refreshTokenMarker
|
|
42
43
|
};
|
|
43
44
|
}
|
|
44
45
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["invariant","processOptionsAndAssignDefaults","url","redirect_uri","useHistory","loginPage","postLoginPage","scopes","fetchFn","ctxPath","options","process","env","NODE_ENV","window","location","toString","globalThis","fetch"],"sources":["utils.js"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport invariant from \"tiny-invariant\";\nexport function processOptionsAndAssignDefaults(url, redirect_uri, useHistory, loginPage, postLoginPage, scopes, fetchFn, ctxPath) {\n let options = {};\n if (typeof useHistory === \"object\") {\n invariant(!loginPage && !postLoginPage && !scopes && !fetchFn && !ctxPath, \"If useHistory is an object, other options should not be provided\");\n options = useHistory;\n }\n else {\n options = {\n useHistory,\n loginPage,\n postLoginPage,\n scopes,\n fetchFn,\n ctxPath,\n };\n }\n invariant(url, \"url is required\");\n invariant(redirect_uri, \"redirectUrl is required\");\n // Assign defaults\n return {\n useHistory: options.useHistory ?? true,\n loginPage: options.loginPage,\n postLoginPage: options.postLoginPage || window.location.toString(),\n scopes: options.scopes ?? [\"api:read-data\", \"api:write-data\"],\n fetchFn: options.fetchFn ?? globalThis.fetch,\n ctxPath: options.ctxPath ?? \"multipass\",\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAOA,SAAS,MAAM,gBAAgB;AACtC,OAAO,SAASC,+BAA+BA,CAACC,GAAG,EAAEC,YAAY,EAAEC,UAAU,EAAEC,SAAS,EAAEC,aAAa,EAAEC,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAE;EAC/H,IAAIC,OAAO,GAAG,CAAC,CAAC;EAChB,IAAI,OAAON,UAAU,KAAK,QAAQ,EAAE;IAChC,EAAU,CAACC,SAAS,IAAI,CAACC,aAAa,IAAI,CAACC,MAAM,IAAI,CAACC,OAAO,IAAI,CAACC,OAAO,IAAAE,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAzEb,SAAS,QAAkE,kEAAkE,IAA7IA,SAAS;IACTU,OAAO,GAAGN,UAAU;EACxB,CAAC,MACI;IACDM,OAAO,GAAG;MACNN,UAAU;MACVC,SAAS;MACTC,aAAa;MACbC,MAAM;MACNC,OAAO;MACPC;IACJ,CAAC;EACL;EACA,CAAUP,GAAG,GAAAS,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAbb,SAAS,QAAM,iBAAiB,IAAhCA,SAAS;EACT,CAAUG,YAAY,GAAAQ,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAtBb,SAAS,QAAe,yBAAyB,IAAjDA,SAAS;EACT;EACA,OAAO;IACHI,UAAU,EAAEM,OAAO,CAACN,UAAU,IAAI,IAAI;IACtCC,SAAS,EAAEK,OAAO,CAACL,SAAS;IAC5BC,aAAa,EAAEI,OAAO,CAACJ,aAAa,IAAIQ,MAAM,CAACC,QAAQ,CAACC,QAAQ,CAAC,CAAC;IAClET,MAAM,EAAEG,OAAO,CAACH,MAAM,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAC7DC,OAAO,EAAEE,OAAO,CAACF,OAAO,IAAIS,UAAU,CAACC,KAAK;IAC5CT,OAAO,EAAEC,OAAO,CAACD,OAAO,IAAI;EAChC,CAAC;AACL","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"utils.js","names":["invariant","processOptionsAndAssignDefaults","url","redirect_uri","useHistory","loginPage","postLoginPage","scopes","fetchFn","ctxPath","options","process","env","NODE_ENV","window","location","toString","globalThis","fetch","refreshTokenMarker"],"sources":["utils.js"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport invariant from \"tiny-invariant\";\nexport function processOptionsAndAssignDefaults(url, redirect_uri, useHistory, loginPage, postLoginPage, scopes, fetchFn, ctxPath) {\n let options = {};\n if (typeof useHistory === \"object\") {\n invariant(!loginPage && !postLoginPage && !scopes && !fetchFn && !ctxPath, \"If useHistory is an object, other options should not be provided\");\n options = useHistory;\n }\n else {\n options = {\n useHistory,\n loginPage,\n postLoginPage,\n scopes,\n fetchFn,\n ctxPath,\n };\n }\n invariant(url, \"url is required\");\n invariant(redirect_uri, \"redirectUrl is required\");\n // Assign defaults\n return {\n useHistory: options.useHistory ?? true,\n loginPage: options.loginPage,\n postLoginPage: options.postLoginPage || window.location.toString(),\n scopes: options.scopes ?? [\"api:read-data\", \"api:write-data\"],\n fetchFn: options.fetchFn ?? globalThis.fetch,\n ctxPath: options.ctxPath ?? \"multipass\",\n refreshTokenMarker: options.refreshTokenMarker,\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAOA,SAAS,MAAM,gBAAgB;AACtC,OAAO,SAASC,+BAA+BA,CAACC,GAAG,EAAEC,YAAY,EAAEC,UAAU,EAAEC,SAAS,EAAEC,aAAa,EAAEC,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAE;EAC/H,IAAIC,OAAO,GAAG,CAAC,CAAC;EAChB,IAAI,OAAON,UAAU,KAAK,QAAQ,EAAE;IAChC,EAAU,CAACC,SAAS,IAAI,CAACC,aAAa,IAAI,CAACC,MAAM,IAAI,CAACC,OAAO,IAAI,CAACC,OAAO,IAAAE,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAzEb,SAAS,QAAkE,kEAAkE,IAA7IA,SAAS;IACTU,OAAO,GAAGN,UAAU;EACxB,CAAC,MACI;IACDM,OAAO,GAAG;MACNN,UAAU;MACVC,SAAS;MACTC,aAAa;MACbC,MAAM;MACNC,OAAO;MACPC;IACJ,CAAC;EACL;EACA,CAAUP,GAAG,GAAAS,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAbb,SAAS,QAAM,iBAAiB,IAAhCA,SAAS;EACT,CAAUG,YAAY,GAAAQ,OAAA,CAAAC,GAAA,CAAAC,QAAA,oBAAtBb,SAAS,QAAe,yBAAyB,IAAjDA,SAAS;EACT;EACA,OAAO;IACHI,UAAU,EAAEM,OAAO,CAACN,UAAU,IAAI,IAAI;IACtCC,SAAS,EAAEK,OAAO,CAACL,SAAS;IAC5BC,aAAa,EAAEI,OAAO,CAACJ,aAAa,IAAIQ,MAAM,CAACC,QAAQ,CAACC,QAAQ,CAAC,CAAC;IAClET,MAAM,EAAEG,OAAO,CAACH,MAAM,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAC7DC,OAAO,EAAEE,OAAO,CAACF,OAAO,IAAIS,UAAU,CAACC,KAAK;IAC5CT,OAAO,EAAEC,OAAO,CAACD,OAAO,IAAI,WAAW;IACvCU,kBAAkB,EAAET,OAAO,CAACS;EAChC,CAAC;AACL","ignoreList":[]}
|
package/build/esm/common.d.ts
CHANGED
|
@@ -1,23 +1,19 @@
|
|
|
1
1
|
import type { AuthorizationServer, Client, HttpRequestOptions, OAuth2TokenEndpointResponse } from "oauth4webapi";
|
|
2
2
|
import type { BaseOauthClient, Events } from "./BaseOauthClient.js";
|
|
3
3
|
import type { Token } from "./Token.js";
|
|
4
|
-
export
|
|
5
|
-
refresh_token?:
|
|
4
|
+
export interface LocalStorageState {
|
|
5
|
+
refresh_token?: string;
|
|
6
|
+
refreshTokenMarker?: string;
|
|
7
|
+
}
|
|
8
|
+
export type SessionStorageState = {
|
|
6
9
|
codeVerifier?: never;
|
|
7
10
|
state?: never;
|
|
8
11
|
oldUrl: string;
|
|
9
12
|
} | {
|
|
10
|
-
refresh_token?: never;
|
|
11
13
|
codeVerifier: string;
|
|
12
14
|
state: string;
|
|
13
15
|
oldUrl: string;
|
|
14
16
|
} | {
|
|
15
|
-
refresh_token?: string;
|
|
16
|
-
codeVerifier?: never;
|
|
17
|
-
state?: never;
|
|
18
|
-
oldUrl?: never;
|
|
19
|
-
} | {
|
|
20
|
-
refresh_token?: never;
|
|
21
17
|
codeVerifier?: never;
|
|
22
18
|
state?: never;
|
|
23
19
|
oldUrl?: never;
|
|
@@ -25,7 +21,10 @@ export type LocalStorageState = {
|
|
|
25
21
|
export declare function saveLocal(client: Client, x: LocalStorageState): void;
|
|
26
22
|
export declare function removeLocal(client: Client): void;
|
|
27
23
|
export declare function readLocal(client: Client): LocalStorageState;
|
|
28
|
-
export declare function
|
|
24
|
+
export declare function saveSession(client: Client, x: SessionStorageState): void;
|
|
25
|
+
export declare function removeSession(client: Client): void;
|
|
26
|
+
export declare function readSession(client: Client): SessionStorageState;
|
|
27
|
+
export declare function common<R extends undefined | (() => Promise<Token | undefined>)>(client: Client, as: AuthorizationServer, _signIn: () => Promise<Token>, oauthHttpOptions: HttpRequestOptions, refresh: R, refreshTokenMarker: string | undefined): {
|
|
29
28
|
getToken: BaseOauthClient<keyof Events & string> & {
|
|
30
29
|
refresh: R;
|
|
31
30
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/common.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,mBAAmB,EACnB,MAAM,EACN,kBAAkB,EAClB,2BAA2B,EAC5B,MAAM,cAAc,CAAC;AAItB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAwBxC,MAAM,
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/common.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,mBAAmB,EACnB,MAAM,EACN,kBAAkB,EAClB,2BAA2B,EAC5B,MAAM,cAAc,CAAC;AAItB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAwBxC,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,mBAAmB,GAE3B;IACA,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,GAEC;IACA,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,GAEC;IACA,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,CAAC,EAAE,KAAK,CAAC;CAChB,CAAC;AAMJ,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAMpE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAKhD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAQ3D;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAMxE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAKlD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAQ/D;AAED,wBAAgB,MAAM,CACpB,CAAC,SAAS,SAAS,GAAG,CAAC,MAAM,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,EAExD,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,mBAAmB,EACvB,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,EAC7B,gBAAgB,EAAE,kBAAkB,EACpC,OAAO,EAAE,CAAC,EACV,kBAAkB,EAAE,MAAM,GAAG,SAAS,GACrC;IACD,QAAQ,EAAE,eAAe,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC,CAAA;KAAE,CAAC;IAClE,uBAAuB,EAAE,CACvB,IAAI,EAAE,2BAA2B,EACjC,IAAI,EAAE,QAAQ,GAAG,SAAS,KACvB,KAAK,CAAC;CACZ,CA6GA;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,QAAQ,CACT,IAAI,CACF,mBAAmB,EACjB,QAAQ,GACR,gBAAgB,GAChB,wBAAwB,GACxB,qBAAqB,CACxB,CACF,CAQA"}
|
package/build/esm/common.js
CHANGED
|
@@ -29,20 +29,36 @@ const CustomEvent = globalThis.CustomEvent ?? class extends Event {
|
|
|
29
29
|
return this.#detail;
|
|
30
30
|
}
|
|
31
31
|
};
|
|
32
|
+
function localStorageKey(client) {
|
|
33
|
+
return `@osdk/oauth : refresh : ${client.client_id}`;
|
|
34
|
+
}
|
|
32
35
|
export function saveLocal(client, x) {
|
|
33
36
|
// MUST `localStorage?` as nodejs does not have localStorage
|
|
34
|
-
globalThis.localStorage?.setItem(
|
|
37
|
+
globalThis.localStorage?.setItem(localStorageKey(client), JSON.stringify(x));
|
|
35
38
|
}
|
|
36
39
|
export function removeLocal(client) {
|
|
37
40
|
// MUST `localStorage?` as nodejs does not have localStorage
|
|
38
|
-
globalThis.localStorage?.removeItem(
|
|
41
|
+
globalThis.localStorage?.removeItem(localStorageKey(client));
|
|
39
42
|
}
|
|
40
43
|
export function readLocal(client) {
|
|
41
44
|
return JSON.parse(
|
|
42
45
|
// MUST `localStorage?` as nodejs does not have localStorage
|
|
43
|
-
globalThis.localStorage?.getItem(
|
|
46
|
+
globalThis.localStorage?.getItem(localStorageKey(client)) ?? "{}");
|
|
47
|
+
}
|
|
48
|
+
export function saveSession(client, x) {
|
|
49
|
+
// MUST `sessionStorage?` as nodejs does not have sessionStorage
|
|
50
|
+
globalThis.sessionStorage?.setItem(localStorageKey(client), JSON.stringify(x));
|
|
51
|
+
}
|
|
52
|
+
export function removeSession(client) {
|
|
53
|
+
// MUST `sessionStorage?` as nodejs does not have sessionStorage
|
|
54
|
+
globalThis.sessionStorage?.removeItem(localStorageKey(client));
|
|
44
55
|
}
|
|
45
|
-
export function
|
|
56
|
+
export function readSession(client) {
|
|
57
|
+
return JSON.parse(
|
|
58
|
+
// MUST `sessionStorage?` as nodejs does not have sessionStorage
|
|
59
|
+
globalThis.sessionStorage?.getItem(localStorageKey(client)) ?? "{}");
|
|
60
|
+
}
|
|
61
|
+
export function common(client, as, _signIn, oauthHttpOptions, refresh, refreshTokenMarker) {
|
|
46
62
|
let token;
|
|
47
63
|
const eventTarget = new TypedEventTarget();
|
|
48
64
|
function makeTokenAndSaveRefresh(resp, type) {
|
|
@@ -53,7 +69,8 @@ export function common(client, as, _signIn, oauthHttpOptions, refresh) {
|
|
|
53
69
|
} = resp;
|
|
54
70
|
!(expires_in != null) ? process.env.NODE_ENV !== "production" ? invariant(false) : invariant(false) : void 0;
|
|
55
71
|
saveLocal(client, {
|
|
56
|
-
refresh_token
|
|
72
|
+
refresh_token,
|
|
73
|
+
refreshTokenMarker
|
|
57
74
|
});
|
|
58
75
|
token = {
|
|
59
76
|
refresh_token,
|
|
@@ -125,7 +142,7 @@ export function common(client, as, _signIn, oauthHttpOptions, refresh) {
|
|
|
125
142
|
};
|
|
126
143
|
}
|
|
127
144
|
export function createAuthorizationServer(ctxPath, url) {
|
|
128
|
-
const issuer = `${new URL(ctxPath, url)}`;
|
|
145
|
+
const issuer = `${new URL(ctxPath, url + "/")}`;
|
|
129
146
|
return {
|
|
130
147
|
token_endpoint: `${issuer}/api/oauth2/token`,
|
|
131
148
|
authorization_endpoint: `${issuer}/api/oauth2/authorize`,
|
package/build/esm/common.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","names":["processRevocationResponse","revocationRequest","invariant","TypedEventTarget","throwIfError","CustomEvent","globalThis","Event","detail","constructor","type","options","saveLocal","client","x","localStorage","setItem","client_id","JSON","stringify","removeLocal","removeItem","readLocal","parse","getItem","common","as","_signIn","oauthHttpOptions","refresh","token","eventTarget","makeTokenAndSaveRefresh","resp","refresh_token","expires_in","access_token","process","env","NODE_ENV","expires_at","Date","now","dispatchTypedEvent","refreshTimeout","rmTimeout","clearTimeout","restartRefreshTimer","evt","setTimeout","pendingSignIn","signIn","undefined","addEventListener","getTokenOrUndefined","getToken","Object","assign","signOut","result","bind","removeEventListener","createAuthorizationServer","ctxPath","url","issuer","URL","token_endpoint","authorization_endpoint","revocation_endpoint"],"sources":["common.js"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { processRevocationResponse, revocationRequest } from \"oauth4webapi\";\nimport invariant from \"tiny-invariant\";\nimport { TypedEventTarget } from \"typescript-event-target\";\nimport { throwIfError } from \"./throwIfError.js\";\n// Node 18 is supposed to have a `CustomEvent` but it is not exposed on `globalThis`\n// which creates a problem for making a single codebase for node and browser. This polyfill works around it\nconst CustomEvent = process.env.TARGET === \"browser\"\n ? globalThis.CustomEvent\n : globalThis.CustomEvent\n ?? class CustomEvent extends Event {\n #detail;\n constructor(type, options) {\n super(type, options);\n this.#detail = options?.detail ?? null;\n }\n get detail() {\n return this.#detail;\n }\n };\nexport function saveLocal(client, x) {\n // MUST `localStorage?` as nodejs does not have localStorage\n globalThis.localStorage?.setItem(`@osdk/oauth : refresh : ${client.client_id}`, JSON.stringify(x));\n}\nexport function removeLocal(client) {\n // MUST `localStorage?` as nodejs does not have localStorage\n globalThis.localStorage?.removeItem(`@osdk/oauth : refresh : ${client.client_id}`);\n}\nexport function readLocal(client) {\n return JSON.parse(\n // MUST `localStorage?` as nodejs does not have localStorage\n globalThis.localStorage?.getItem(`@osdk/oauth : refresh : ${client.client_id}`)\n ?? \"{}\");\n}\nexport function common(client, as, _signIn, oauthHttpOptions, refresh) {\n let token;\n const eventTarget = new TypedEventTarget();\n function makeTokenAndSaveRefresh(resp, type) {\n const { refresh_token, expires_in, access_token } = resp;\n invariant(expires_in != null);\n saveLocal(client, { refresh_token });\n token = {\n refresh_token,\n expires_in,\n access_token,\n expires_at: Date.now() + expires_in * 1000,\n };\n eventTarget.dispatchTypedEvent(type, new CustomEvent(type, { detail: token }));\n return token;\n }\n let refreshTimeout;\n function rmTimeout() {\n if (refreshTimeout)\n clearTimeout(refreshTimeout);\n }\n function restartRefreshTimer(evt) {\n if (refresh) {\n rmTimeout();\n refreshTimeout = setTimeout(refresh, evt.detail.expires_in * 1000 - 60 * 1000);\n }\n }\n async function signOut() {\n invariant(token, \"not signed in\");\n const result = await processRevocationResponse(await revocationRequest(as, client, token.access_token, oauthHttpOptions));\n rmTimeout();\n // Clean up\n removeLocal(client);\n token = undefined;\n throwIfError(result);\n eventTarget.dispatchTypedEvent(\"signOut\", new Event(\"signOut\"));\n }\n let pendingSignIn;\n async function signIn() {\n if (pendingSignIn) {\n return pendingSignIn;\n }\n try {\n pendingSignIn = _signIn();\n return await pendingSignIn;\n }\n finally {\n pendingSignIn = undefined;\n }\n }\n eventTarget.addEventListener(\"signIn\", restartRefreshTimer);\n eventTarget.addEventListener(\"refresh\", restartRefreshTimer);\n function getTokenOrUndefined() {\n if (!token || Date.now() >= token.expires_at) {\n return undefined;\n }\n return token?.access_token;\n }\n const getToken = Object.assign(async function getToken() {\n if (!token || Date.now() >= token.expires_at) {\n token = await signIn();\n }\n return token?.access_token;\n }, {\n signIn,\n refresh,\n signOut,\n rmTimeout,\n getTokenOrUndefined,\n addEventListener: eventTarget.addEventListener.bind(eventTarget),\n removeEventListener: eventTarget.removeEventListener.bind(eventTarget),\n });\n return { getToken, makeTokenAndSaveRefresh };\n}\nexport function createAuthorizationServer(ctxPath, url) {\n const issuer = `${new URL(ctxPath, url)}`;\n return {\n token_endpoint: `${issuer}/api/oauth2/token`,\n authorization_endpoint: `${issuer}/api/oauth2/authorize`,\n revocation_endpoint: `${issuer}/api/oauth2/revoke_token`,\n issuer,\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"common.js","names":["processRevocationResponse","revocationRequest","invariant","TypedEventTarget","throwIfError","CustomEvent","globalThis","Event","detail","constructor","type","options","localStorageKey","client","client_id","saveLocal","x","localStorage","setItem","JSON","stringify","removeLocal","removeItem","readLocal","parse","getItem","saveSession","sessionStorage","removeSession","readSession","common","as","_signIn","oauthHttpOptions","refresh","refreshTokenMarker","token","eventTarget","makeTokenAndSaveRefresh","resp","refresh_token","expires_in","access_token","process","env","NODE_ENV","expires_at","Date","now","dispatchTypedEvent","refreshTimeout","rmTimeout","clearTimeout","restartRefreshTimer","evt","setTimeout","pendingSignIn","signIn","undefined","addEventListener","getTokenOrUndefined","getToken","Object","assign","signOut","result","bind","removeEventListener","createAuthorizationServer","ctxPath","url","issuer","URL","token_endpoint","authorization_endpoint","revocation_endpoint"],"sources":["common.js"],"sourcesContent":["/*\n * Copyright 2024 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { processRevocationResponse, revocationRequest } from \"oauth4webapi\";\nimport invariant from \"tiny-invariant\";\nimport { TypedEventTarget } from \"typescript-event-target\";\nimport { throwIfError } from \"./throwIfError.js\";\n// Node 18 is supposed to have a `CustomEvent` but it is not exposed on `globalThis`\n// which creates a problem for making a single codebase for node and browser. This polyfill works around it\nconst CustomEvent = process.env.TARGET === \"browser\"\n ? globalThis.CustomEvent\n : globalThis.CustomEvent\n ?? class CustomEvent extends Event {\n #detail;\n constructor(type, options) {\n super(type, options);\n this.#detail = options?.detail ?? null;\n }\n get detail() {\n return this.#detail;\n }\n };\nfunction localStorageKey(client) {\n return `@osdk/oauth : refresh : ${client.client_id}`;\n}\nexport function saveLocal(client, x) {\n // MUST `localStorage?` as nodejs does not have localStorage\n globalThis.localStorage?.setItem(localStorageKey(client), JSON.stringify(x));\n}\nexport function removeLocal(client) {\n // MUST `localStorage?` as nodejs does not have localStorage\n globalThis.localStorage?.removeItem(localStorageKey(client));\n}\nexport function readLocal(client) {\n return JSON.parse(\n // MUST `localStorage?` as nodejs does not have localStorage\n globalThis.localStorage?.getItem(localStorageKey(client))\n ?? \"{}\");\n}\nexport function saveSession(client, x) {\n // MUST `sessionStorage?` as nodejs does not have sessionStorage\n globalThis.sessionStorage?.setItem(localStorageKey(client), JSON.stringify(x));\n}\nexport function removeSession(client) {\n // MUST `sessionStorage?` as nodejs does not have sessionStorage\n globalThis.sessionStorage?.removeItem(localStorageKey(client));\n}\nexport function readSession(client) {\n return JSON.parse(\n // MUST `sessionStorage?` as nodejs does not have sessionStorage\n globalThis.sessionStorage?.getItem(localStorageKey(client))\n ?? \"{}\");\n}\nexport function common(client, as, _signIn, oauthHttpOptions, refresh, refreshTokenMarker) {\n let token;\n const eventTarget = new TypedEventTarget();\n function makeTokenAndSaveRefresh(resp, type) {\n const { refresh_token, expires_in, access_token } = resp;\n invariant(expires_in != null);\n saveLocal(client, {\n refresh_token,\n refreshTokenMarker,\n });\n token = {\n refresh_token,\n expires_in,\n access_token,\n expires_at: Date.now() + expires_in * 1000,\n };\n eventTarget.dispatchTypedEvent(type, new CustomEvent(type, { detail: token }));\n return token;\n }\n let refreshTimeout;\n function rmTimeout() {\n if (refreshTimeout)\n clearTimeout(refreshTimeout);\n }\n function restartRefreshTimer(evt) {\n if (refresh) {\n rmTimeout();\n refreshTimeout = setTimeout(refresh, evt.detail.expires_in * 1000 - 60 * 1000);\n }\n }\n async function signOut() {\n invariant(token, \"not signed in\");\n const result = await processRevocationResponse(await revocationRequest(as, client, token.access_token, oauthHttpOptions));\n rmTimeout();\n // Clean up\n removeLocal(client);\n token = undefined;\n throwIfError(result);\n eventTarget.dispatchTypedEvent(\"signOut\", new Event(\"signOut\"));\n }\n let pendingSignIn;\n async function signIn() {\n if (pendingSignIn) {\n return pendingSignIn;\n }\n try {\n pendingSignIn = _signIn();\n return await pendingSignIn;\n }\n finally {\n pendingSignIn = undefined;\n }\n }\n eventTarget.addEventListener(\"signIn\", restartRefreshTimer);\n eventTarget.addEventListener(\"refresh\", restartRefreshTimer);\n function getTokenOrUndefined() {\n if (!token || Date.now() >= token.expires_at) {\n return undefined;\n }\n return token?.access_token;\n }\n const getToken = Object.assign(async function getToken() {\n if (!token || Date.now() >= token.expires_at) {\n token = await signIn();\n }\n return token?.access_token;\n }, {\n signIn,\n refresh,\n signOut,\n rmTimeout,\n getTokenOrUndefined,\n addEventListener: eventTarget.addEventListener.bind(eventTarget),\n removeEventListener: eventTarget.removeEventListener.bind(eventTarget),\n });\n return { getToken, makeTokenAndSaveRefresh };\n}\nexport function createAuthorizationServer(ctxPath, url) {\n const issuer = `${new URL(ctxPath, url + \"/\")}`;\n return {\n token_endpoint: `${issuer}/api/oauth2/token`,\n authorization_endpoint: `${issuer}/api/oauth2/authorize`,\n revocation_endpoint: `${issuer}/api/oauth2/revoke_token`,\n issuer,\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.test.d.ts","sourceRoot":"","sources":["../../src/common.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
17
|
+
import { common, createAuthorizationServer, readLocal, removeLocal, saveLocal } from "./common.js";
|
|
18
|
+
describe("local functions", () => {
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
vi.stubGlobal("localStorage", {
|
|
21
|
+
setItem: vi.fn(),
|
|
22
|
+
removeItem: vi.fn(),
|
|
23
|
+
getItem: vi.fn()
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
afterEach(() => {
|
|
27
|
+
vi.unstubAllGlobals();
|
|
28
|
+
});
|
|
29
|
+
it("should use the old style keys when there is no refresh token marker", () => {
|
|
30
|
+
const client = {
|
|
31
|
+
client_id: "hi_mom",
|
|
32
|
+
$refreshTokenMarker: undefined
|
|
33
|
+
};
|
|
34
|
+
const oldLocalStorageKey = `@osdk/oauth : refresh : ${client.client_id}`;
|
|
35
|
+
readLocal(client);
|
|
36
|
+
removeLocal(client);
|
|
37
|
+
saveLocal(client, {});
|
|
38
|
+
expect(vi.mocked(globalThis.localStorage.getItem)).toBeCalledWith(oldLocalStorageKey);
|
|
39
|
+
expect(vi.mocked(globalThis.localStorage.setItem)).toBeCalledWith(oldLocalStorageKey, expect.anything());
|
|
40
|
+
expect(vi.mocked(globalThis.localStorage.removeItem)).toBeCalledWith(oldLocalStorageKey);
|
|
41
|
+
});
|
|
42
|
+
it("should save the refreshTokenMaker if it exists", () => {
|
|
43
|
+
const client = {
|
|
44
|
+
client_id: "hi_mom"
|
|
45
|
+
};
|
|
46
|
+
const signIn = vi.fn();
|
|
47
|
+
const refresh = vi.fn();
|
|
48
|
+
const authServer = createAuthorizationServer("multipass", "https://stack.palantir.com");
|
|
49
|
+
const {
|
|
50
|
+
makeTokenAndSaveRefresh
|
|
51
|
+
} = common(client, authServer, signIn, {}, refresh, "marker marker");
|
|
52
|
+
makeTokenAndSaveRefresh({
|
|
53
|
+
refresh_token: "refresh",
|
|
54
|
+
access_token: "access",
|
|
55
|
+
token_type: "idk",
|
|
56
|
+
expires_in: 10_000
|
|
57
|
+
}, "signIn");
|
|
58
|
+
expect(globalThis.localStorage.setItem).toBeCalledWith(`@osdk/oauth : refresh : ${client.client_id}`, JSON.stringify({
|
|
59
|
+
refresh_token: "refresh",
|
|
60
|
+
refreshTokenMarker: "marker marker"
|
|
61
|
+
}));
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=common.test.js.map
|