@multiplatform.one/wallet 7.7.2
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 +8 -0
- package/dist/cjs/SiweKeycloakProvider.cjs +273 -0
- package/dist/cjs/SiweKeycloakProvider.native.js +309 -0
- package/dist/cjs/SiweKeycloakProvider.native.js.map +1 -0
- package/dist/cjs/base64.cjs +51 -0
- package/dist/cjs/base64.native.js +55 -0
- package/dist/cjs/base64.native.js.map +1 -0
- package/dist/cjs/base64.spec.cjs +57 -0
- package/dist/cjs/base64.spec.native.js +79 -0
- package/dist/cjs/base64.spec.native.js.map +1 -0
- package/dist/cjs/context.cjs +29 -0
- package/dist/cjs/context.native.js +32 -0
- package/dist/cjs/context.native.js.map +1 -0
- package/dist/cjs/hooks/context.cjs +29 -0
- package/dist/cjs/hooks/context.native.js +32 -0
- package/dist/cjs/hooks/context.native.js.map +1 -0
- package/dist/cjs/hooks/index.cjs +20 -0
- package/dist/cjs/hooks/index.native.js +23 -0
- package/dist/cjs/hooks/index.native.js.map +1 -0
- package/dist/cjs/hooks/useSiweKeycloak.cjs +61 -0
- package/dist/cjs/hooks/useSiweKeycloak.native.js +64 -0
- package/dist/cjs/hooks/useSiweKeycloak.native.js.map +1 -0
- package/dist/cjs/index.cjs +133 -0
- package/dist/cjs/index.native.js +189 -0
- package/dist/cjs/index.native.js.map +1 -0
- package/dist/cjs/render.cjs +78 -0
- package/dist/cjs/render.native.js +82 -0
- package/dist/cjs/render.native.js.map +1 -0
- package/dist/cjs/siwe.cjs +76 -0
- package/dist/cjs/siwe.native.js +94 -0
- package/dist/cjs/siwe.native.js.map +1 -0
- package/dist/cjs/types.cjs +18 -0
- package/dist/cjs/types.native.js +21 -0
- package/dist/cjs/types.native.js.map +1 -0
- package/dist/cjs/util.cjs +53 -0
- package/dist/cjs/util.native.js +56 -0
- package/dist/cjs/util.native.js.map +1 -0
- package/dist/cjs/util.spec.cjs +53 -0
- package/dist/cjs/util.spec.native.js +62 -0
- package/dist/cjs/util.spec.native.js.map +1 -0
- package/dist/esm/SiweKeycloakProvider.mjs +237 -0
- package/dist/esm/SiweKeycloakProvider.mjs.map +1 -0
- package/dist/esm/SiweKeycloakProvider.native.js +270 -0
- package/dist/esm/SiweKeycloakProvider.native.js.map +1 -0
- package/dist/esm/base64.mjs +26 -0
- package/dist/esm/base64.mjs.map +1 -0
- package/dist/esm/base64.native.js +27 -0
- package/dist/esm/base64.native.js.map +1 -0
- package/dist/esm/base64.spec.mjs +58 -0
- package/dist/esm/base64.spec.mjs.map +1 -0
- package/dist/esm/base64.spec.native.js +77 -0
- package/dist/esm/base64.spec.native.js.map +1 -0
- package/dist/esm/context.mjs +4 -0
- package/dist/esm/context.mjs.map +1 -0
- package/dist/esm/context.native.js +4 -0
- package/dist/esm/context.native.js.map +1 -0
- package/dist/esm/hooks/context.mjs +4 -0
- package/dist/esm/hooks/context.mjs.map +1 -0
- package/dist/esm/hooks/context.native.js +4 -0
- package/dist/esm/hooks/context.native.js.map +1 -0
- package/dist/esm/hooks/index.mjs +2 -0
- package/dist/esm/hooks/index.mjs.map +1 -0
- package/dist/esm/hooks/index.native.js +2 -0
- package/dist/esm/hooks/index.native.js.map +1 -0
- package/dist/esm/hooks/useSiweKeycloak.mjs +36 -0
- package/dist/esm/hooks/useSiweKeycloak.mjs.map +1 -0
- package/dist/esm/hooks/useSiweKeycloak.native.js +36 -0
- package/dist/esm/hooks/useSiweKeycloak.native.js.map +1 -0
- package/dist/esm/index.mjs +107 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/index.native.js +160 -0
- package/dist/esm/index.native.js.map +1 -0
- package/dist/esm/render.mjs +42 -0
- package/dist/esm/render.mjs.map +1 -0
- package/dist/esm/render.native.js +43 -0
- package/dist/esm/render.native.js.map +1 -0
- package/dist/esm/siwe.mjs +51 -0
- package/dist/esm/siwe.mjs.map +1 -0
- package/dist/esm/siwe.native.js +66 -0
- package/dist/esm/siwe.native.js.map +1 -0
- package/dist/esm/types.mjs +2 -0
- package/dist/esm/types.mjs.map +1 -0
- package/dist/esm/types.native.js +2 -0
- package/dist/esm/types.native.js.map +1 -0
- package/dist/esm/util.mjs +27 -0
- package/dist/esm/util.mjs.map +1 -0
- package/dist/esm/util.native.js +27 -0
- package/dist/esm/util.native.js.map +1 -0
- package/dist/esm/util.spec.mjs +54 -0
- package/dist/esm/util.spec.mjs.map +1 -0
- package/dist/esm/util.spec.native.js +60 -0
- package/dist/esm/util.spec.native.js.map +1 -0
- package/package.json +81 -0
- package/src/SiweKeycloakProvider.tsx +297 -0
- package/src/base64.spec.ts +65 -0
- package/src/base64.ts +26 -0
- package/src/context.ts +10 -0
- package/src/hooks/context.ts +10 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useSiweKeycloak.ts +23 -0
- package/src/index.ts +127 -0
- package/src/main/java/com/bitspur/keycloak/siwe/Errors.java +21 -0
- package/src/main/java/com/bitspur/keycloak/siwe/LiteAuthenticationService.java +167 -0
- package/src/main/java/com/bitspur/keycloak/siwe/SiweCredentials.java +36 -0
- package/src/main/java/com/bitspur/keycloak/siwe/SiweSession.java +36 -0
- package/src/main/java/com/bitspur/keycloak/siwe/SiweUtil.java +599 -0
- package/src/main/java/com/bitspur/keycloak/siwe/Token.java +85 -0
- package/src/main/java/com/bitspur/keycloak/siwe/authenticators/browser/SiweBrowserAuthenticator.java +109 -0
- package/src/main/java/com/bitspur/keycloak/siwe/authenticators/browser/SiweBrowserAuthenticatorFactory.java +93 -0
- package/src/main/java/com/bitspur/keycloak/siwe/authenticators/directgrant/SiweDirectGrantAuthenticator.java +153 -0
- package/src/main/java/com/bitspur/keycloak/siwe/authenticators/directgrant/SiweDirectGrantAuthenticatorFactory.java +93 -0
- package/src/main/java/com/bitspur/keycloak/siwe/jpa/nonce/SiweNonce.java +95 -0
- package/src/main/java/com/bitspur/keycloak/siwe/jpa/nonce/SiweNonceJpaEntityProvider.java +82 -0
- package/src/main/java/com/bitspur/keycloak/siwe/jpa/nonce/SiweNonceJpaEntityProviderFactory.java +46 -0
- package/src/main/java/com/bitspur/keycloak/siwe/jpa/wallet/SiweWalletAddress.java +103 -0
- package/src/main/java/com/bitspur/keycloak/siwe/jpa/wallet/SiweWalletJpaEntityProvider.java +43 -0
- package/src/main/java/com/bitspur/keycloak/siwe/jpa/wallet/SiweWalletJpaEntityProviderFactory.java +46 -0
- package/src/main/java/com/bitspur/keycloak/siwe/protocol/SiweWalletProtocolMapper.java +85 -0
- package/src/main/java/com/bitspur/keycloak/siwe/resource/SiweResource.java +210 -0
- package/src/main/java/com/bitspur/keycloak/siwe/resource/SiweResourceProvider.java +34 -0
- package/src/main/java/com/bitspur/keycloak/siwe/resource/SiweResourceProviderFactory.java +46 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/SiuCredentials.java +52 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/SiuMessage.java +362 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/SiuParseException.java +23 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/SiuUtil.java +547 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/authenticators/browser/SiuBrowserAuthenticator.java +112 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/authenticators/browser/SiuBrowserAuthenticatorFactory.java +96 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/authenticators/directgrant/SiuDirectGrantAuthenticator.java +169 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/authenticators/directgrant/SiuDirectGrantAuthenticatorFactory.java +96 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/resource/SiuResource.java +244 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/resource/SiuResourceProvider.java +34 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siu/resource/SiuResourceProviderFactory.java +48 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/SiwsCredentials.java +52 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/SiwsMessage.java +362 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/SiwsParseException.java +23 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/SiwsUtil.java +564 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/authenticators/browser/SiwsBrowserAuthenticator.java +112 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/authenticators/browser/SiwsBrowserAuthenticatorFactory.java +96 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/authenticators/directgrant/SiwsDirectGrantAuthenticator.java +169 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/authenticators/directgrant/SiwsDirectGrantAuthenticatorFactory.java +96 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/resource/SiwsResource.java +244 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/resource/SiwsResourceProvider.java +34 -0
- package/src/main/java/com/bitspur/keycloak/siwe/siws/resource/SiwsResourceProviderFactory.java +48 -0
- package/src/main/resources/META-INF/keycloak-themes.json +8 -0
- package/src/main/resources/META-INF/services/org.keycloak.authentication.AuthenticatorFactory +6 -0
- package/src/main/resources/META-INF/services/org.keycloak.connections.jpa.entityprovider.JpaEntityProviderFactory +2 -0
- package/src/main/resources/META-INF/services/org.keycloak.protocol.ProtocolMapper +1 -0
- package/src/main/resources/META-INF/services/org.keycloak.services.resource.RealmResourceProviderFactory +3 -0
- package/src/main/resources/META-INF/siwe-nonce-changelog.xml +29 -0
- package/src/main/resources/META-INF/siwe-wallet-changelog.xml +46 -0
- package/src/render.tsx +47 -0
- package/src/siwe.tsx +57 -0
- package/src/types.ts +6 -0
- package/src/util.spec.ts +72 -0
- package/src/util.ts +28 -0
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import Keycloak from "@multiplatform.one/keycloak-js";
|
|
3
|
+
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
4
|
+
import { ConnectKitProvider, SIWEProvider, createWalletMessage, getDefaultConfig } from "@multiplatform.one/web3/connectkit";
|
|
5
|
+
import { useMemo } from "react";
|
|
6
|
+
import { WagmiProvider, createConfig } from "wagmi";
|
|
7
|
+
import { arbitrum, mainnet, optimism, polygon } from "wagmi/chains";
|
|
8
|
+
import { storage } from "@multiplatform.one/store";
|
|
9
|
+
import { SiweKeycloakContext } from "./hooks/context.native.js";
|
|
10
|
+
import { encodeBase64 } from "./base64.native.js";
|
|
11
|
+
import { getNonce } from "./util.native.js";
|
|
12
|
+
function _instanceof(left, right) {
|
|
13
|
+
"@swc/helpers - instanceof";
|
|
14
|
+
|
|
15
|
+
if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
|
|
16
|
+
return !!right[Symbol.hasInstance](left);
|
|
17
|
+
} else {
|
|
18
|
+
return left instanceof right;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
var queryClient = new QueryClient();
|
|
22
|
+
var logger = console;
|
|
23
|
+
var ACCESS_TOKEN_KEY = "KEYCLOAK_TOKEN";
|
|
24
|
+
var ID_TOKEN_KEY = "KEYCLOAK_ID_TOKEN";
|
|
25
|
+
var REFRESH_TOKEN_KEY = "KEYCLOAK_REFRESH_TOKEN";
|
|
26
|
+
function SiweKeycloakProvider(param) {
|
|
27
|
+
var {
|
|
28
|
+
children,
|
|
29
|
+
clearTokens: clearTokensProp,
|
|
30
|
+
debug,
|
|
31
|
+
getTokens: getTokensProp,
|
|
32
|
+
keycloak: keycloakProp,
|
|
33
|
+
siwe,
|
|
34
|
+
setTokens: setTokensProp,
|
|
35
|
+
wagmi: wagmiProp,
|
|
36
|
+
onSignedIn,
|
|
37
|
+
onSignedInFailed,
|
|
38
|
+
...props
|
|
39
|
+
} = param;
|
|
40
|
+
var keycloakConfig = useMemo(function () {
|
|
41
|
+
return {
|
|
42
|
+
...keycloakProp,
|
|
43
|
+
...(typeof (keycloakProp === null || keycloakProp === void 0 ? void 0 : keycloakProp.baseUrl) !== "undefined" ? {
|
|
44
|
+
baseUrl: keycloakProp.baseUrl
|
|
45
|
+
} : {
|
|
46
|
+
baseUrl: "http://localhost:8080"
|
|
47
|
+
}),
|
|
48
|
+
...(typeof (keycloakProp === null || keycloakProp === void 0 ? void 0 : keycloakProp.clientId) !== "undefined" ? {
|
|
49
|
+
clientId: keycloakProp.clientId
|
|
50
|
+
} : {
|
|
51
|
+
clientId: "app"
|
|
52
|
+
}),
|
|
53
|
+
...(typeof (keycloakProp === null || keycloakProp === void 0 ? void 0 : keycloakProp.realm) !== "undefined" ? {
|
|
54
|
+
realm: keycloakProp.realm
|
|
55
|
+
} : {
|
|
56
|
+
realm: "main"
|
|
57
|
+
}),
|
|
58
|
+
...(typeof (keycloakProp === null || keycloakProp === void 0 ? void 0 : keycloakProp.scope) !== "undefined" ? {
|
|
59
|
+
scope: keycloakProp.scope
|
|
60
|
+
} : {
|
|
61
|
+
scope: []
|
|
62
|
+
})
|
|
63
|
+
};
|
|
64
|
+
}, [keycloakProp]);
|
|
65
|
+
var keycloak = useMemo(function () {
|
|
66
|
+
return typeof window !== "undefined" ? new Keycloak({
|
|
67
|
+
clientId: keycloakConfig.clientId,
|
|
68
|
+
realm: keycloakConfig.realm,
|
|
69
|
+
url: keycloakConfig.baseUrl
|
|
70
|
+
}) : void 0;
|
|
71
|
+
}, [keycloakConfig]);
|
|
72
|
+
var clearTokens = useMemo(function () {
|
|
73
|
+
return clearTokensProp || async function () {
|
|
74
|
+
await Promise.resolve(storage.removeItem(ID_TOKEN_KEY));
|
|
75
|
+
await Promise.resolve(storage.removeItem(REFRESH_TOKEN_KEY));
|
|
76
|
+
await Promise.resolve(storage.removeItem(ACCESS_TOKEN_KEY));
|
|
77
|
+
};
|
|
78
|
+
}, [clearTokensProp]);
|
|
79
|
+
var setTokens = useMemo(function () {
|
|
80
|
+
return setTokensProp || async function (param2) {
|
|
81
|
+
var {
|
|
82
|
+
accessToken,
|
|
83
|
+
refreshToken,
|
|
84
|
+
idToken
|
|
85
|
+
} = param2;
|
|
86
|
+
await Promise.resolve(storage.setItem(ID_TOKEN_KEY, idToken));
|
|
87
|
+
await Promise.resolve(storage.setItem(REFRESH_TOKEN_KEY, refreshToken));
|
|
88
|
+
await Promise.resolve(storage.setItem(ACCESS_TOKEN_KEY, accessToken));
|
|
89
|
+
};
|
|
90
|
+
}, [setTokensProp]);
|
|
91
|
+
var getTokens = useMemo(function () {
|
|
92
|
+
return getTokensProp || async function () {
|
|
93
|
+
return {
|
|
94
|
+
accessToken: (await Promise.resolve(storage.getItem(ACCESS_TOKEN_KEY))) || "",
|
|
95
|
+
idToken: (await Promise.resolve(storage.getItem(ID_TOKEN_KEY))) || "",
|
|
96
|
+
refreshToken: (await Promise.resolve(storage.getItem(REFRESH_TOKEN_KEY))) || ""
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
}, [getTokensProp]);
|
|
100
|
+
var keycloakRealmUrl = useMemo(function () {
|
|
101
|
+
return `${keycloakConfig.baseUrl}/realms/${keycloakConfig.realm || "main"}`;
|
|
102
|
+
}, [keycloakConfig]);
|
|
103
|
+
var keycloakSiweUrl = useMemo(function () {
|
|
104
|
+
return `${keycloakRealmUrl}/siwe`;
|
|
105
|
+
}, [keycloakRealmUrl]);
|
|
106
|
+
var config = useMemo(function () {
|
|
107
|
+
return createConfig(getDefaultConfig({
|
|
108
|
+
appName: "Example",
|
|
109
|
+
chains: [mainnet, polygon, optimism, arbitrum],
|
|
110
|
+
walletConnectProjectId: props.appName || "Example",
|
|
111
|
+
...props,
|
|
112
|
+
...wagmiProp
|
|
113
|
+
}));
|
|
114
|
+
}, [props, wagmiProp]);
|
|
115
|
+
var siweConfig = useMemo(function () {
|
|
116
|
+
var siweConfig2 = {
|
|
117
|
+
getNonce: async function getNonce1() {
|
|
118
|
+
return getNonce(keycloakSiweUrl);
|
|
119
|
+
},
|
|
120
|
+
// Chain-agnostic: derives the signer family from the active connector's
|
|
121
|
+
// (possibly synthetic) chainId and builds the matching SIWx message, so EVM
|
|
122
|
+
// and Solana/Sui/Bitcoin all sign in through ConnectKit's one signIn().
|
|
123
|
+
createMessage(param2) {
|
|
124
|
+
var {
|
|
125
|
+
nonce,
|
|
126
|
+
address,
|
|
127
|
+
chainId
|
|
128
|
+
} = param2;
|
|
129
|
+
return createWalletMessage({
|
|
130
|
+
address,
|
|
131
|
+
chainId,
|
|
132
|
+
nonce
|
|
133
|
+
});
|
|
134
|
+
},
|
|
135
|
+
async verifyMessage(param2) {
|
|
136
|
+
var {
|
|
137
|
+
message,
|
|
138
|
+
signature
|
|
139
|
+
} = param2;
|
|
140
|
+
var formData = new URLSearchParams({
|
|
141
|
+
client_id: keycloakConfig.clientId,
|
|
142
|
+
grant_type: "password",
|
|
143
|
+
password: encodeBase64(message),
|
|
144
|
+
username: signature,
|
|
145
|
+
scope: ["openid", [...(Array.isArray(keycloakConfig.scope) ? keycloakConfig.scope : keycloakConfig.scope ? [keycloakConfig.scope] : [])]].join(" ")
|
|
146
|
+
});
|
|
147
|
+
var res = await fetch(`${keycloakRealmUrl}/protocol/openid-connect/token`, {
|
|
148
|
+
method: "POST",
|
|
149
|
+
credentials: "include",
|
|
150
|
+
headers: {
|
|
151
|
+
"Content-Type": "application/x-www-form-urlencoded"
|
|
152
|
+
},
|
|
153
|
+
body: formData
|
|
154
|
+
});
|
|
155
|
+
if (!res.ok) {
|
|
156
|
+
var error = new Error(`sign in failed with status ${res.status}`);
|
|
157
|
+
logger.warn(error);
|
|
158
|
+
onSignedInFailed === null || onSignedInFailed === void 0 ? void 0 : onSignedInFailed(error);
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
var data = await res.json();
|
|
162
|
+
if (!data.access_token || !data.id_token || !data.refresh_token) {
|
|
163
|
+
var error1 = new Error(`missing tokens ${[!data.access_token && "access_token", !data.id_token && "id_token", !data.refresh_token && "refresh_token"].filter(Boolean).reduce(function (acc, curr, i, arr) {
|
|
164
|
+
if (i === 0) return curr;
|
|
165
|
+
if (i === arr.length - 1) return `${acc} and ${curr}`;
|
|
166
|
+
return `${acc}, ${curr}`;
|
|
167
|
+
}, "")}`);
|
|
168
|
+
logger.warn(error1);
|
|
169
|
+
onSignedInFailed === null || onSignedInFailed === void 0 ? void 0 : onSignedInFailed(error1);
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
await Promise.resolve(setTokens({
|
|
173
|
+
accessToken: data.access_token,
|
|
174
|
+
idToken: data.id_token,
|
|
175
|
+
refreshToken: data.refresh_token
|
|
176
|
+
}));
|
|
177
|
+
onSignedIn === null || onSignedIn === void 0 ? void 0 : onSignedIn();
|
|
178
|
+
return true;
|
|
179
|
+
},
|
|
180
|
+
async getSession() {
|
|
181
|
+
if (!keycloak) return null;
|
|
182
|
+
var {
|
|
183
|
+
accessToken,
|
|
184
|
+
refreshToken,
|
|
185
|
+
idToken
|
|
186
|
+
} = await Promise.resolve(getTokens());
|
|
187
|
+
await keycloak.init({
|
|
188
|
+
checkLoginIframe: false,
|
|
189
|
+
flow: "implicit",
|
|
190
|
+
idToken,
|
|
191
|
+
onLoad: void 0,
|
|
192
|
+
refreshToken,
|
|
193
|
+
timeSkew: 0,
|
|
194
|
+
token: accessToken
|
|
195
|
+
});
|
|
196
|
+
if (keycloak.token !== accessToken || keycloak.refreshToken !== refreshToken || keycloak.idToken !== idToken) {
|
|
197
|
+
await Promise.resolve(setTokens({
|
|
198
|
+
accessToken: keycloak.token || accessToken,
|
|
199
|
+
idToken: keycloak.idToken || idToken,
|
|
200
|
+
refreshToken: keycloak.refreshToken || refreshToken
|
|
201
|
+
}));
|
|
202
|
+
}
|
|
203
|
+
try {
|
|
204
|
+
var res = await fetch(`${keycloakSiweUrl}/session`, {
|
|
205
|
+
headers: {
|
|
206
|
+
Authorization: `Bearer ${keycloak.token}`
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
if (res.ok) return res.json();
|
|
210
|
+
if (res.status === 401) return null;
|
|
211
|
+
throw new Error("Failed to get session");
|
|
212
|
+
} catch (err) {
|
|
213
|
+
if (_instanceof(err, Error) && err.message === "Failed to get session") {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
throw err;
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
async signOut() {
|
|
220
|
+
if (!keycloak) return false;
|
|
221
|
+
keycloak.idToken = void 0;
|
|
222
|
+
keycloak.refreshToken = void 0;
|
|
223
|
+
keycloak.token = void 0;
|
|
224
|
+
await Promise.resolve(clearTokens());
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
return siweConfig2;
|
|
229
|
+
}, [keycloakRealmUrl, keycloakSiweUrl, keycloakConfig]);
|
|
230
|
+
if (siwe) {
|
|
231
|
+
return /* @__PURE__ */_jsx(WagmiProvider, {
|
|
232
|
+
config,
|
|
233
|
+
children: /* @__PURE__ */_jsx(QueryClientProvider, {
|
|
234
|
+
client: queryClient,
|
|
235
|
+
children: /* @__PURE__ */_jsx(SIWEProvider, {
|
|
236
|
+
signOutOnAccountChange: false,
|
|
237
|
+
signOutOnDisconnect: false,
|
|
238
|
+
signOutOnNetworkChange: false,
|
|
239
|
+
...siweConfig,
|
|
240
|
+
children: /* @__PURE__ */_jsx(ConnectKitProvider, {
|
|
241
|
+
debugMode: debug,
|
|
242
|
+
children: /* @__PURE__ */_jsx(SiweKeycloakContext.Provider, {
|
|
243
|
+
value: {
|
|
244
|
+
keycloak
|
|
245
|
+
},
|
|
246
|
+
children
|
|
247
|
+
})
|
|
248
|
+
})
|
|
249
|
+
})
|
|
250
|
+
})
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
return /* @__PURE__ */_jsx(WagmiProvider, {
|
|
254
|
+
config,
|
|
255
|
+
children: /* @__PURE__ */_jsx(QueryClientProvider, {
|
|
256
|
+
client: queryClient,
|
|
257
|
+
children: /* @__PURE__ */_jsx(ConnectKitProvider, {
|
|
258
|
+
debugMode: debug,
|
|
259
|
+
children: /* @__PURE__ */_jsx(SiweKeycloakContext.Provider, {
|
|
260
|
+
value: {
|
|
261
|
+
keycloak
|
|
262
|
+
},
|
|
263
|
+
children
|
|
264
|
+
})
|
|
265
|
+
})
|
|
266
|
+
})
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
export { SiweKeycloakProvider };
|
|
270
|
+
//# sourceMappingURL=SiweKeycloakProvider.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["jsx","_jsx","Keycloak","QueryClient","QueryClientProvider","ConnectKitProvider","SIWEProvider","createWalletMessage","getDefaultConfig","useMemo","WagmiProvider","createConfig","arbitrum","mainnet","optimism","polygon","storage","SiweKeycloakContext","encodeBase64","getNonce","_instanceof","left","right","Symbol","hasInstance","queryClient","logger","console","ACCESS_TOKEN_KEY","ID_TOKEN_KEY","REFRESH_TOKEN_KEY","SiweKeycloakProvider","param","children","clearTokens","clearTokensProp","debug","getTokens","getTokensProp","keycloak","keycloakProp","siwe","setTokens","setTokensProp","wagmi","wagmiProp","onSignedIn","onSignedInFailed","props","keycloakConfig","baseUrl","clientId","realm","scope","window","url","Promise","resolve","removeItem","param2","accessToken","refreshToken","idToken","setItem","getItem","keycloakRealmUrl","keycloakSiweUrl","config","appName","chains","walletConnectProjectId","siweConfig","siweConfig2","getNonce1","createMessage","nonce","address","chainId","verifyMessage","message","signature","formData","URLSearchParams","client_id","grant_type","password","username","Array","isArray","join","res","fetch","method","credentials","headers","body","ok","error","Error","status","warn","data","json","access_token","id_token","refresh_token","error1","filter","Boolean","reduce","acc","curr","i","arr","length","getSession","init","checkLoginIframe","flow","onLoad","timeSkew","token","Authorization","err","signOut","client","signOutOnAccountChange","signOutOnDisconnect","signOutOnNetworkChange","debugMode","Provider","value"],"sources":["SiweKeycloakProvider.native.js"],"sourcesContent":["import { jsx as _jsx } from \"react/jsx-runtime\";\nimport Keycloak from \"@multiplatform.one/keycloak-js\";\nimport { QueryClient, QueryClientProvider } from \"@tanstack/react-query\";\nimport { ConnectKitProvider, SIWEProvider, createWalletMessage, getDefaultConfig } from \"@multiplatform.one/web3/connectkit\";\nimport { useMemo } from \"react\";\nimport { WagmiProvider, createConfig } from \"wagmi\";\nimport { arbitrum, mainnet, optimism, polygon } from \"wagmi/chains\";\nimport { storage } from \"@multiplatform.one/store\";\nimport { SiweKeycloakContext } from \"./hooks/context\";\nimport { encodeBase64 } from \"./base64\";\nimport { getNonce } from \"./util\";\nfunction _instanceof(left, right) {\n \"@swc/helpers - instanceof\";\n if (right != null && typeof Symbol !== \"undefined\" && right[Symbol.hasInstance]) {\n return !!right[Symbol.hasInstance](left);\n } else {\n return left instanceof right;\n }\n}\nvar queryClient = new QueryClient();\nvar logger = console;\nvar ACCESS_TOKEN_KEY = \"KEYCLOAK_TOKEN\";\nvar ID_TOKEN_KEY = \"KEYCLOAK_ID_TOKEN\";\nvar REFRESH_TOKEN_KEY = \"KEYCLOAK_REFRESH_TOKEN\";\nfunction SiweKeycloakProvider(param) {\n var { children, clearTokens: clearTokensProp, debug, getTokens: getTokensProp, keycloak: keycloakProp, siwe, setTokens: setTokensProp, wagmi: wagmiProp, onSignedIn, onSignedInFailed, ...props } = param;\n var keycloakConfig = useMemo(function() {\n return {\n ...keycloakProp,\n ...typeof (keycloakProp === null || keycloakProp === void 0 ? void 0 : keycloakProp.baseUrl) !== \"undefined\" ? {\n baseUrl: keycloakProp.baseUrl\n } : {\n baseUrl: \"http://localhost:8080\"\n },\n ...typeof (keycloakProp === null || keycloakProp === void 0 ? void 0 : keycloakProp.clientId) !== \"undefined\" ? {\n clientId: keycloakProp.clientId\n } : {\n clientId: \"app\"\n },\n ...typeof (keycloakProp === null || keycloakProp === void 0 ? void 0 : keycloakProp.realm) !== \"undefined\" ? {\n realm: keycloakProp.realm\n } : {\n realm: \"main\"\n },\n ...typeof (keycloakProp === null || keycloakProp === void 0 ? void 0 : keycloakProp.scope) !== \"undefined\" ? {\n scope: keycloakProp.scope\n } : {\n scope: []\n }\n };\n }, [\n keycloakProp\n ]);\n var keycloak = useMemo(function() {\n return typeof window !== \"undefined\" ? new Keycloak({\n clientId: keycloakConfig.clientId,\n realm: keycloakConfig.realm,\n url: keycloakConfig.baseUrl\n }) : void 0;\n }, [\n keycloakConfig\n ]);\n var clearTokens = useMemo(function() {\n return clearTokensProp || async function() {\n await Promise.resolve(storage.removeItem(ID_TOKEN_KEY));\n await Promise.resolve(storage.removeItem(REFRESH_TOKEN_KEY));\n await Promise.resolve(storage.removeItem(ACCESS_TOKEN_KEY));\n };\n }, [\n clearTokensProp\n ]);\n var setTokens = useMemo(function() {\n return setTokensProp || async function(param2) {\n var { accessToken, refreshToken, idToken } = param2;\n await Promise.resolve(storage.setItem(ID_TOKEN_KEY, idToken));\n await Promise.resolve(storage.setItem(REFRESH_TOKEN_KEY, refreshToken));\n await Promise.resolve(storage.setItem(ACCESS_TOKEN_KEY, accessToken));\n };\n }, [\n setTokensProp\n ]);\n var getTokens = useMemo(function() {\n return getTokensProp || async function() {\n return {\n accessToken: await Promise.resolve(storage.getItem(ACCESS_TOKEN_KEY)) || \"\",\n idToken: await Promise.resolve(storage.getItem(ID_TOKEN_KEY)) || \"\",\n refreshToken: await Promise.resolve(storage.getItem(REFRESH_TOKEN_KEY)) || \"\"\n };\n };\n }, [\n getTokensProp\n ]);\n var keycloakRealmUrl = useMemo(function() {\n return `${keycloakConfig.baseUrl}/realms/${keycloakConfig.realm || \"main\"}`;\n }, [\n keycloakConfig\n ]);\n var keycloakSiweUrl = useMemo(function() {\n return `${keycloakRealmUrl}/siwe`;\n }, [\n keycloakRealmUrl\n ]);\n var config = useMemo(function() {\n return createConfig(getDefaultConfig({\n appName: \"Example\",\n chains: [\n mainnet,\n polygon,\n optimism,\n arbitrum\n ],\n walletConnectProjectId: props.appName || \"Example\",\n ...props,\n ...wagmiProp\n }));\n }, [\n props,\n wagmiProp\n ]);\n var siweConfig = useMemo(function() {\n var siweConfig2 = {\n getNonce: async function getNonce1() {\n return getNonce(keycloakSiweUrl);\n },\n // Chain-agnostic: derives the signer family from the active connector's\n // (possibly synthetic) chainId and builds the matching SIWx message, so EVM\n // and Solana/Sui/Bitcoin all sign in through ConnectKit's one signIn().\n createMessage(param2) {\n var { nonce, address, chainId } = param2;\n return createWalletMessage({\n address,\n chainId,\n nonce\n });\n },\n async verifyMessage(param2) {\n var { message, signature } = param2;\n var formData = new URLSearchParams({\n client_id: keycloakConfig.clientId,\n grant_type: \"password\",\n password: encodeBase64(message),\n username: signature,\n scope: [\n \"openid\",\n [\n ...Array.isArray(keycloakConfig.scope) ? keycloakConfig.scope : keycloakConfig.scope ? [\n keycloakConfig.scope\n ] : []\n ]\n ].join(\" \")\n });\n var res = await fetch(`${keycloakRealmUrl}/protocol/openid-connect/token`, {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\"\n },\n body: formData\n });\n if (!res.ok) {\n var error = new Error(`sign in failed with status ${res.status}`);\n logger.warn(error);\n onSignedInFailed === null || onSignedInFailed === void 0 ? void 0 : onSignedInFailed(error);\n return false;\n }\n var data = await res.json();\n if (!data.access_token || !data.id_token || !data.refresh_token) {\n var error1 = new Error(`missing tokens ${[\n !data.access_token && \"access_token\",\n !data.id_token && \"id_token\",\n !data.refresh_token && \"refresh_token\"\n ].filter(Boolean).reduce(function(acc, curr, i, arr) {\n if (i === 0) return curr;\n if (i === arr.length - 1) return `${acc} and ${curr}`;\n return `${acc}, ${curr}`;\n }, \"\")}`);\n logger.warn(error1);\n onSignedInFailed === null || onSignedInFailed === void 0 ? void 0 : onSignedInFailed(error1);\n return false;\n }\n await Promise.resolve(setTokens({\n accessToken: data.access_token,\n idToken: data.id_token,\n refreshToken: data.refresh_token\n }));\n onSignedIn === null || onSignedIn === void 0 ? void 0 : onSignedIn();\n return true;\n },\n async getSession() {\n if (!keycloak) return null;\n var { accessToken, refreshToken, idToken } = await Promise.resolve(getTokens());\n await keycloak.init({\n checkLoginIframe: false,\n flow: \"implicit\",\n idToken,\n onLoad: void 0,\n refreshToken,\n timeSkew: 0,\n token: accessToken\n });\n if (keycloak.token !== accessToken || keycloak.refreshToken !== refreshToken || keycloak.idToken !== idToken) {\n await Promise.resolve(setTokens({\n accessToken: keycloak.token || accessToken,\n idToken: keycloak.idToken || idToken,\n refreshToken: keycloak.refreshToken || refreshToken\n }));\n }\n try {\n var res = await fetch(`${keycloakSiweUrl}/session`, {\n headers: {\n Authorization: `Bearer ${keycloak.token}`\n }\n });\n if (res.ok) return res.json();\n if (res.status === 401) return null;\n throw new Error(\"Failed to get session\");\n } catch (err) {\n if (_instanceof(err, Error) && err.message === \"Failed to get session\") {\n return null;\n }\n throw err;\n }\n },\n async signOut() {\n if (!keycloak) return false;\n keycloak.idToken = void 0;\n keycloak.refreshToken = void 0;\n keycloak.token = void 0;\n await Promise.resolve(clearTokens());\n return true;\n }\n };\n return siweConfig2;\n }, [\n keycloakRealmUrl,\n keycloakSiweUrl,\n keycloakConfig\n ]);\n if (siwe) {\n return /* @__PURE__ */ _jsx(WagmiProvider, {\n config,\n children: /* @__PURE__ */ _jsx(QueryClientProvider, {\n client: queryClient,\n children: /* @__PURE__ */ _jsx(SIWEProvider, {\n signOutOnAccountChange: false,\n signOutOnDisconnect: false,\n signOutOnNetworkChange: false,\n ...siweConfig,\n children: /* @__PURE__ */ _jsx(ConnectKitProvider, {\n debugMode: debug,\n children: /* @__PURE__ */ _jsx(SiweKeycloakContext.Provider, {\n value: {\n keycloak\n },\n children\n })\n })\n })\n })\n });\n }\n return /* @__PURE__ */ _jsx(WagmiProvider, {\n config,\n children: /* @__PURE__ */ _jsx(QueryClientProvider, {\n client: queryClient,\n children: /* @__PURE__ */ _jsx(ConnectKitProvider, {\n debugMode: debug,\n children: /* @__PURE__ */ _jsx(SiweKeycloakContext.Provider, {\n value: {\n keycloak\n },\n children\n })\n })\n })\n });\n}\nexport {\n SiweKeycloakProvider\n};\n//# sourceMappingURL=SiweKeycloakProvider.js.map\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
2
|
+
function encodeBytes(bytes) {
|
|
3
|
+
let output = "";
|
|
4
|
+
for (let i = 0; i < bytes.length; i += 3) {
|
|
5
|
+
const a = bytes[i] ?? 0;
|
|
6
|
+
const b = bytes[i + 1] ?? 0;
|
|
7
|
+
const c = bytes[i + 2] ?? 0;
|
|
8
|
+
const triple = a << 16 | b << 8 | c;
|
|
9
|
+
output += alphabet[triple >> 18 & 63];
|
|
10
|
+
output += alphabet[triple >> 12 & 63];
|
|
11
|
+
output += i + 1 < bytes.length ? alphabet[triple >> 6 & 63] : "=";
|
|
12
|
+
output += i + 2 < bytes.length ? alphabet[triple & 63] : "=";
|
|
13
|
+
}
|
|
14
|
+
return output;
|
|
15
|
+
}
|
|
16
|
+
function encodeBase64(input) {
|
|
17
|
+
if (typeof globalThis.btoa === "function") {
|
|
18
|
+
return globalThis.btoa(input);
|
|
19
|
+
}
|
|
20
|
+
if (typeof Buffer !== "undefined") {
|
|
21
|
+
return Buffer.from(input, "utf-8").toString("base64");
|
|
22
|
+
}
|
|
23
|
+
return encodeBytes(new TextEncoder().encode(input));
|
|
24
|
+
}
|
|
25
|
+
export { encodeBase64 };
|
|
26
|
+
//# sourceMappingURL=base64.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["alphabet","encodeBytes","bytes","output","i","length","a","b","c","triple","encodeBase64","input","globalThis","btoa","Buffer","from","toString","TextEncoder","encode"],"sources":["../../src/base64.ts"],"sourcesContent":[null],"mappings":"AAAA,MAAMA,QAAA,GAAW;AAEjB,SAASC,YAAYC,KAAA,EAA2B;EAC9C,IAAIC,MAAA,GAAS;EACb,SAASC,CAAA,GAAI,GAAGA,CAAA,GAAIF,KAAA,CAAMG,MAAA,EAAQD,CAAA,IAAK,GAAG;IACxC,MAAME,CAAA,GAAIJ,KAAA,CAAME,CAAC,KAAK;IACtB,MAAMG,CAAA,GAAIL,KAAA,CAAME,CAAA,GAAI,CAAC,KAAK;IAC1B,MAAMI,CAAA,GAAIN,KAAA,CAAME,CAAA,GAAI,CAAC,KAAK;IAC1B,MAAMK,MAAA,GAAUH,CAAA,IAAK,KAAOC,CAAA,IAAK,IAAKC,CAAA;IACtCL,MAAA,IAAUH,QAAA,CAAUS,MAAA,IAAU,KAAM,EAAI;IACxCN,MAAA,IAAUH,QAAA,CAAUS,MAAA,IAAU,KAAM,EAAI;IACxCN,MAAA,IAAUC,CAAA,GAAI,IAAIF,KAAA,CAAMG,MAAA,GAASL,QAAA,CAAUS,MAAA,IAAU,IAAK,EAAI,IAAI;IAClEN,MAAA,IAAUC,CAAA,GAAI,IAAIF,KAAA,CAAMG,MAAA,GAASL,QAAA,CAASS,MAAA,GAAS,EAAI,IAAI;EAC7D;EACA,OAAON,MAAA;AACT;AAEO,SAASO,aAAaC,KAAA,EAAuB;EAClD,IAAI,OAAOC,UAAA,CAAWC,IAAA,KAAS,YAAY;IACzC,OAAOD,UAAA,CAAWC,IAAA,CAAKF,KAAK;EAC9B;EACA,IAAI,OAAOG,MAAA,KAAW,aAAa;IACjC,OAAOA,MAAA,CAAOC,IAAA,CAAKJ,KAAA,EAAO,OAAO,EAAEK,QAAA,CAAS,QAAQ;EACtD;EACA,OAAOf,WAAA,CAAY,IAAIgB,WAAA,CAAY,EAAEC,MAAA,CAAOP,KAAK,CAAC;AACpD","ignoreList":[]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
2
|
+
function encodeBytes(bytes) {
|
|
3
|
+
var output = "";
|
|
4
|
+
for (var i = 0; i < bytes.length; i += 3) {
|
|
5
|
+
var _bytes_i, _bytes_, _bytes_1;
|
|
6
|
+
var a = (_bytes_i = bytes[i]) !== null && _bytes_i !== void 0 ? _bytes_i : 0;
|
|
7
|
+
var b = (_bytes_ = bytes[i + 1]) !== null && _bytes_ !== void 0 ? _bytes_ : 0;
|
|
8
|
+
var c = (_bytes_1 = bytes[i + 2]) !== null && _bytes_1 !== void 0 ? _bytes_1 : 0;
|
|
9
|
+
var triple = a << 16 | b << 8 | c;
|
|
10
|
+
output += alphabet[triple >> 18 & 63];
|
|
11
|
+
output += alphabet[triple >> 12 & 63];
|
|
12
|
+
output += i + 1 < bytes.length ? alphabet[triple >> 6 & 63] : "=";
|
|
13
|
+
output += i + 2 < bytes.length ? alphabet[triple & 63] : "=";
|
|
14
|
+
}
|
|
15
|
+
return output;
|
|
16
|
+
}
|
|
17
|
+
function encodeBase64(input) {
|
|
18
|
+
if (typeof globalThis.btoa === "function") {
|
|
19
|
+
return globalThis.btoa(input);
|
|
20
|
+
}
|
|
21
|
+
if (typeof Buffer !== "undefined") {
|
|
22
|
+
return Buffer.from(input, "utf-8").toString("base64");
|
|
23
|
+
}
|
|
24
|
+
return encodeBytes(new TextEncoder().encode(input));
|
|
25
|
+
}
|
|
26
|
+
export { encodeBase64 };
|
|
27
|
+
//# sourceMappingURL=base64.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["alphabet","encodeBytes","bytes","output","i","length","_bytes_i","_bytes_","_bytes_1","a","b","c","triple","encodeBase64","input","globalThis","btoa","Buffer","from","toString","TextEncoder","encode"],"sources":["base64.native.js"],"sourcesContent":["var alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nfunction encodeBytes(bytes) {\n var output = \"\";\n for (var i = 0; i < bytes.length; i += 3) {\n var _bytes_i, _bytes_, _bytes_1;\n var a = (_bytes_i = bytes[i]) !== null && _bytes_i !== void 0 ? _bytes_i : 0;\n var b = (_bytes_ = bytes[i + 1]) !== null && _bytes_ !== void 0 ? _bytes_ : 0;\n var c = (_bytes_1 = bytes[i + 2]) !== null && _bytes_1 !== void 0 ? _bytes_1 : 0;\n var triple = a << 16 | b << 8 | c;\n output += alphabet[triple >> 18 & 63];\n output += alphabet[triple >> 12 & 63];\n output += i + 1 < bytes.length ? alphabet[triple >> 6 & 63] : \"=\";\n output += i + 2 < bytes.length ? alphabet[triple & 63] : \"=\";\n }\n return output;\n}\nfunction encodeBase64(input) {\n if (typeof globalThis.btoa === \"function\") {\n return globalThis.btoa(input);\n }\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(input, \"utf-8\").toString(\"base64\");\n }\n return encodeBytes(new TextEncoder().encode(input));\n}\nexport {\n encodeBase64\n};\n//# sourceMappingURL=base64.js.map\n"],"mappings":"AAAA,IAAIA,QAAQ,GAAG,kEAAkE;AACjF,SAASC,WAAWA,CAACC,KAAK,EAAE;EAC1B,IAAIC,MAAM,GAAG,EAAE;EACf,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGF,KAAK,CAACG,MAAM,EAAED,CAAC,IAAI,CAAC,EAAE;IACxC,IAAIE,QAAQ,EAAEC,OAAO,EAAEC,QAAQ;IAC/B,IAAIC,CAAC,GAAG,CAACH,QAAQ,GAAGJ,KAAK,CAACE,CAAC,CAAC,MAAM,IAAI,IAAIE,QAAQ,KAAK,KAAK,CAAC,GAAGA,QAAQ,GAAG,CAAC;IAC5E,IAAII,CAAC,GAAG,CAACH,OAAO,GAAGL,KAAK,CAACE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,IAAIG,OAAO,KAAK,KAAK,CAAC,GAAGA,OAAO,GAAG,CAAC;IAC7E,IAAII,CAAC,GAAG,CAACH,QAAQ,GAAGN,KAAK,CAACE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,IAAII,QAAQ,KAAK,KAAK,CAAC,GAAGA,QAAQ,GAAG,CAAC;IAChF,IAAII,MAAM,GAAGH,CAAC,IAAI,EAAE,GAAGC,CAAC,IAAI,CAAC,GAAGC,CAAC;IACjCR,MAAM,IAAIH,QAAQ,CAACY,MAAM,IAAI,EAAE,GAAG,EAAE,CAAC;IACrCT,MAAM,IAAIH,QAAQ,CAACY,MAAM,IAAI,EAAE,GAAG,EAAE,CAAC;IACrCT,MAAM,IAAIC,CAAC,GAAG,CAAC,GAAGF,KAAK,CAACG,MAAM,GAAGL,QAAQ,CAACY,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG;IACjET,MAAM,IAAIC,CAAC,GAAG,CAAC,GAAGF,KAAK,CAACG,MAAM,GAAGL,QAAQ,CAACY,MAAM,GAAG,EAAE,CAAC,GAAG,GAAG;EAC9D;EACA,OAAOT,MAAM;AACf;AACA,SAASU,YAAYA,CAACC,KAAK,EAAE;EAC3B,IAAI,OAAOC,UAAU,CAACC,IAAI,KAAK,UAAU,EAAE;IACzC,OAAOD,UAAU,CAACC,IAAI,CAACF,KAAK,CAAC;EAC/B;EACA,IAAI,OAAOG,MAAM,KAAK,WAAW,EAAE;IACjC,OAAOA,MAAM,CAACC,IAAI,CAACJ,KAAK,EAAE,OAAO,CAAC,CAACK,QAAQ,CAAC,QAAQ,CAAC;EACvD;EACA,OAAOlB,WAAW,CAAC,IAAImB,WAAW,CAAC,CAAC,CAACC,MAAM,CAACP,KAAK,CAAC,CAAC;AACrD;AACA,SACED,YAAY","ignoreList":[]}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, expect, it, vi, afterEach } from "vitest";
|
|
2
|
+
import { encodeBase64 } from "./base64.mjs";
|
|
3
|
+
describe("encodeBase64", () => {
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
vi.restoreAllMocks();
|
|
6
|
+
});
|
|
7
|
+
it("encodes an empty string", () => {
|
|
8
|
+
expect(encodeBase64("")).toBe("");
|
|
9
|
+
});
|
|
10
|
+
it("encodes a simple ASCII string", () => {
|
|
11
|
+
expect(encodeBase64("Hello")).toBe("SGVsbG8=");
|
|
12
|
+
});
|
|
13
|
+
it("encodes 'Hello, World!'", () => {
|
|
14
|
+
expect(encodeBase64("Hello, World!")).toBe("SGVsbG8sIFdvcmxkIQ==");
|
|
15
|
+
});
|
|
16
|
+
it("encodes a single character", () => {
|
|
17
|
+
expect(encodeBase64("A")).toBe("QQ==");
|
|
18
|
+
});
|
|
19
|
+
it("encodes two characters (padding = 1)", () => {
|
|
20
|
+
expect(encodeBase64("AB")).toBe("QUI=");
|
|
21
|
+
});
|
|
22
|
+
it("encodes three characters (no padding)", () => {
|
|
23
|
+
expect(encodeBase64("ABC")).toBe("QUJD");
|
|
24
|
+
});
|
|
25
|
+
it("encodes strings with special characters", () => {
|
|
26
|
+
expect(encodeBase64("foo:bar")).toBe("Zm9vOmJhcg==");
|
|
27
|
+
});
|
|
28
|
+
it("encodes strings with numbers", () => {
|
|
29
|
+
expect(encodeBase64("12345")).toBe("MTIzNDU=");
|
|
30
|
+
});
|
|
31
|
+
it("produces output matching btoa for ASCII input", () => {
|
|
32
|
+
const inputs = ["test", "a", "ab", "abc", "abcd", "Hello, World!", "base64 encoding test"];
|
|
33
|
+
for (const input of inputs) {
|
|
34
|
+
expect(encodeBase64(input)).toBe(btoa(input));
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
it("falls back to manual encoding when btoa is unavailable", () => {
|
|
38
|
+
const originalBtoa = globalThis.btoa;
|
|
39
|
+
vi.spyOn(globalThis, "btoa").mockImplementation(() => {
|
|
40
|
+
throw new Error("btoa not available");
|
|
41
|
+
});
|
|
42
|
+
Object.defineProperty(globalThis, "btoa", {
|
|
43
|
+
value: void 0,
|
|
44
|
+
configurable: true
|
|
45
|
+
});
|
|
46
|
+
try {
|
|
47
|
+
expect(encodeBase64("Hello")).toBe("SGVsbG8=");
|
|
48
|
+
expect(encodeBase64("ABC")).toBe("QUJD");
|
|
49
|
+
expect(encodeBase64("")).toBe("");
|
|
50
|
+
} finally {
|
|
51
|
+
Object.defineProperty(globalThis, "btoa", {
|
|
52
|
+
value: originalBtoa,
|
|
53
|
+
configurable: true
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=base64.spec.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["describe","expect","it","vi","afterEach","encodeBase64","restoreAllMocks","toBe","inputs","input","btoa","originalBtoa","globalThis","spyOn","mockImplementation","Error","Object","defineProperty","value","configurable"],"sources":["../../src/base64.spec.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAA,EAAUC,MAAA,EAAQC,EAAA,EAAIC,EAAA,EAAIC,SAAA,QAAiB;AACpD,SAASC,YAAA,QAAoB;AAE7BL,QAAA,CAAS,gBAAgB,MAAM;EAC7BI,SAAA,CAAU,MAAM;IACdD,EAAA,CAAGG,eAAA,CAAgB;EACrB,CAAC;EAEDJ,EAAA,CAAG,2BAA2B,MAAM;IAClCD,MAAA,CAAOI,YAAA,CAAa,EAAE,CAAC,EAAEE,IAAA,CAAK,EAAE;EAClC,CAAC;EAEDL,EAAA,CAAG,iCAAiC,MAAM;IACxCD,MAAA,CAAOI,YAAA,CAAa,OAAO,CAAC,EAAEE,IAAA,CAAK,UAAU;EAC/C,CAAC;EAEDL,EAAA,CAAG,2BAA2B,MAAM;IAClCD,MAAA,CAAOI,YAAA,CAAa,eAAe,CAAC,EAAEE,IAAA,CAAK,sBAAsB;EACnE,CAAC;EAEDL,EAAA,CAAG,8BAA8B,MAAM;IACrCD,MAAA,CAAOI,YAAA,CAAa,GAAG,CAAC,EAAEE,IAAA,CAAK,MAAM;EACvC,CAAC;EAEDL,EAAA,CAAG,wCAAwC,MAAM;IAC/CD,MAAA,CAAOI,YAAA,CAAa,IAAI,CAAC,EAAEE,IAAA,CAAK,MAAM;EACxC,CAAC;EAEDL,EAAA,CAAG,yCAAyC,MAAM;IAChDD,MAAA,CAAOI,YAAA,CAAa,KAAK,CAAC,EAAEE,IAAA,CAAK,MAAM;EACzC,CAAC;EAEDL,EAAA,CAAG,2CAA2C,MAAM;IAClDD,MAAA,CAAOI,YAAA,CAAa,SAAS,CAAC,EAAEE,IAAA,CAAK,cAAc;EACrD,CAAC;EAEDL,EAAA,CAAG,gCAAgC,MAAM;IACvCD,MAAA,CAAOI,YAAA,CAAa,OAAO,CAAC,EAAEE,IAAA,CAAK,UAAU;EAC/C,CAAC;EAEDL,EAAA,CAAG,iDAAiD,MAAM;IACxD,MAAMM,MAAA,GAAS,CAAC,QAAQ,KAAK,MAAM,OAAO,QAAQ,iBAAiB,sBAAsB;IACzF,WAAWC,KAAA,IAASD,MAAA,EAAQ;MAC1BP,MAAA,CAAOI,YAAA,CAAaI,KAAK,CAAC,EAAEF,IAAA,CAAKG,IAAA,CAAKD,KAAK,CAAC;IAC9C;EACF,CAAC;EAEDP,EAAA,CAAG,0DAA0D,MAAM;IACjE,MAAMS,YAAA,GAAeC,UAAA,CAAWF,IAAA;IAChCP,EAAA,CAAGU,KAAA,CAAMD,UAAA,EAAY,MAAM,EAAEE,kBAAA,CAAmB,MAAM;MACpD,MAAM,IAAIC,KAAA,CAAM,oBAAoB;IACtC,CAAC;IAGDC,MAAA,CAAOC,cAAA,CAAeL,UAAA,EAAY,QAAQ;MAAEM,KAAA,EAAO;MAAWC,YAAA,EAAc;IAAK,CAAC;IAElF,IAAI;MACFlB,MAAA,CAAOI,YAAA,CAAa,OAAO,CAAC,EAAEE,IAAA,CAAK,UAAU;MAC7CN,MAAA,CAAOI,YAAA,CAAa,KAAK,CAAC,EAAEE,IAAA,CAAK,MAAM;MACvCN,MAAA,CAAOI,YAAA,CAAa,EAAE,CAAC,EAAEE,IAAA,CAAK,EAAE;IAClC,UAAE;MACAS,MAAA,CAAOC,cAAA,CAAeL,UAAA,EAAY,QAAQ;QAAEM,KAAA,EAAOP,YAAA;QAAcQ,YAAA,EAAc;MAAK,CAAC;IACvF;EACF,CAAC;AACH,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { describe, expect, it, vi, afterEach } from "vitest";
|
|
2
|
+
import { encodeBase64 } from "./base64.native.js";
|
|
3
|
+
describe("encodeBase64", function () {
|
|
4
|
+
afterEach(function () {
|
|
5
|
+
vi.restoreAllMocks();
|
|
6
|
+
});
|
|
7
|
+
it("encodes an empty string", function () {
|
|
8
|
+
expect(encodeBase64("")).toBe("");
|
|
9
|
+
});
|
|
10
|
+
it("encodes a simple ASCII string", function () {
|
|
11
|
+
expect(encodeBase64("Hello")).toBe("SGVsbG8=");
|
|
12
|
+
});
|
|
13
|
+
it("encodes 'Hello, World!'", function () {
|
|
14
|
+
expect(encodeBase64("Hello, World!")).toBe("SGVsbG8sIFdvcmxkIQ==");
|
|
15
|
+
});
|
|
16
|
+
it("encodes a single character", function () {
|
|
17
|
+
expect(encodeBase64("A")).toBe("QQ==");
|
|
18
|
+
});
|
|
19
|
+
it("encodes two characters (padding = 1)", function () {
|
|
20
|
+
expect(encodeBase64("AB")).toBe("QUI=");
|
|
21
|
+
});
|
|
22
|
+
it("encodes three characters (no padding)", function () {
|
|
23
|
+
expect(encodeBase64("ABC")).toBe("QUJD");
|
|
24
|
+
});
|
|
25
|
+
it("encodes strings with special characters", function () {
|
|
26
|
+
expect(encodeBase64("foo:bar")).toBe("Zm9vOmJhcg==");
|
|
27
|
+
});
|
|
28
|
+
it("encodes strings with numbers", function () {
|
|
29
|
+
expect(encodeBase64("12345")).toBe("MTIzNDU=");
|
|
30
|
+
});
|
|
31
|
+
it("produces output matching btoa for ASCII input", function () {
|
|
32
|
+
var inputs = ["test", "a", "ab", "abc", "abcd", "Hello, World!", "base64 encoding test"];
|
|
33
|
+
var _iteratorNormalCompletion = true,
|
|
34
|
+
_didIteratorError = false,
|
|
35
|
+
_iteratorError = void 0;
|
|
36
|
+
try {
|
|
37
|
+
for (var _iterator = inputs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
38
|
+
var input = _step.value;
|
|
39
|
+
expect(encodeBase64(input)).toBe(btoa(input));
|
|
40
|
+
}
|
|
41
|
+
} catch (err) {
|
|
42
|
+
_didIteratorError = true;
|
|
43
|
+
_iteratorError = err;
|
|
44
|
+
} finally {
|
|
45
|
+
try {
|
|
46
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
47
|
+
_iterator.return();
|
|
48
|
+
}
|
|
49
|
+
} finally {
|
|
50
|
+
if (_didIteratorError) {
|
|
51
|
+
throw _iteratorError;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
it("falls back to manual encoding when btoa is unavailable", function () {
|
|
57
|
+
var originalBtoa = globalThis.btoa;
|
|
58
|
+
vi.spyOn(globalThis, "btoa").mockImplementation(function () {
|
|
59
|
+
throw new Error("btoa not available");
|
|
60
|
+
});
|
|
61
|
+
Object.defineProperty(globalThis, "btoa", {
|
|
62
|
+
value: void 0,
|
|
63
|
+
configurable: true
|
|
64
|
+
});
|
|
65
|
+
try {
|
|
66
|
+
expect(encodeBase64("Hello")).toBe("SGVsbG8=");
|
|
67
|
+
expect(encodeBase64("ABC")).toBe("QUJD");
|
|
68
|
+
expect(encodeBase64("")).toBe("");
|
|
69
|
+
} finally {
|
|
70
|
+
Object.defineProperty(globalThis, "btoa", {
|
|
71
|
+
value: originalBtoa,
|
|
72
|
+
configurable: true
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=base64.spec.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["describe","expect","it","vi","afterEach","encodeBase64","restoreAllMocks","toBe","inputs","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Symbol","iterator","_step","next","done","input","value","btoa","err","return","originalBtoa","globalThis","spyOn","mockImplementation","Error","Object","defineProperty","configurable"],"sources":["base64.spec.native.js"],"sourcesContent":["import { describe, expect, it, vi, afterEach } from \"vitest\";\nimport { encodeBase64 } from \"./base64\";\ndescribe(\"encodeBase64\", function() {\n afterEach(function() {\n vi.restoreAllMocks();\n });\n it(\"encodes an empty string\", function() {\n expect(encodeBase64(\"\")).toBe(\"\");\n });\n it(\"encodes a simple ASCII string\", function() {\n expect(encodeBase64(\"Hello\")).toBe(\"SGVsbG8=\");\n });\n it(\"encodes 'Hello, World!'\", function() {\n expect(encodeBase64(\"Hello, World!\")).toBe(\"SGVsbG8sIFdvcmxkIQ==\");\n });\n it(\"encodes a single character\", function() {\n expect(encodeBase64(\"A\")).toBe(\"QQ==\");\n });\n it(\"encodes two characters (padding = 1)\", function() {\n expect(encodeBase64(\"AB\")).toBe(\"QUI=\");\n });\n it(\"encodes three characters (no padding)\", function() {\n expect(encodeBase64(\"ABC\")).toBe(\"QUJD\");\n });\n it(\"encodes strings with special characters\", function() {\n expect(encodeBase64(\"foo:bar\")).toBe(\"Zm9vOmJhcg==\");\n });\n it(\"encodes strings with numbers\", function() {\n expect(encodeBase64(\"12345\")).toBe(\"MTIzNDU=\");\n });\n it(\"produces output matching btoa for ASCII input\", function() {\n var inputs = [\n \"test\",\n \"a\",\n \"ab\",\n \"abc\",\n \"abcd\",\n \"Hello, World!\",\n \"base64 encoding test\"\n ];\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = inputs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var input = _step.value;\n expect(encodeBase64(input)).toBe(btoa(input));\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n });\n it(\"falls back to manual encoding when btoa is unavailable\", function() {\n var originalBtoa = globalThis.btoa;\n vi.spyOn(globalThis, \"btoa\").mockImplementation(function() {\n throw new Error(\"btoa not available\");\n });\n Object.defineProperty(globalThis, \"btoa\", {\n value: void 0,\n configurable: true\n });\n try {\n expect(encodeBase64(\"Hello\")).toBe(\"SGVsbG8=\");\n expect(encodeBase64(\"ABC\")).toBe(\"QUJD\");\n expect(encodeBase64(\"\")).toBe(\"\");\n } finally {\n Object.defineProperty(globalThis, \"btoa\", {\n value: originalBtoa,\n configurable: true\n });\n }\n });\n});\n//# sourceMappingURL=base64.spec.js.map\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createContext","SiweKeycloakContext"],"sources":["../../src/context.ts"],"sourcesContent":[null],"mappings":"AACA,SAASA,aAAA,QAAqB;AAMvB,MAAMC,mBAAA,GAAsBD,aAAA,CACjC,CAAC,CACH","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createContext","SiweKeycloakContext"],"sources":["context.native.js"],"sourcesContent":["import { createContext } from \"react\";\nvar SiweKeycloakContext = createContext({});\nexport {\n SiweKeycloakContext\n};\n//# sourceMappingURL=context.js.map\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,OAAO;AACrC,IAAIC,mBAAmB,GAAGD,aAAa,CAAC,CAAC,CAAC,CAAC;AAC3C,SACEC,mBAAmB","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createContext","SiweKeycloakContext"],"sources":["../../../src/hooks/context.ts"],"sourcesContent":[null],"mappings":"AACA,SAASA,aAAA,QAAqB;AAMvB,MAAMC,mBAAA,GAAsBD,aAAA,CACjC,CAAC,CACH","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createContext","SiweKeycloakContext"],"sources":["context.native.js"],"sourcesContent":["import { createContext } from \"react\";\nvar SiweKeycloakContext = createContext({});\nexport {\n SiweKeycloakContext\n};\n//# sourceMappingURL=context.js.map\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,OAAO;AACrC,IAAIC,mBAAmB,GAAGD,aAAa,CAAC,CAAC,CAAC,CAAC;AAC3C,SACEC,mBAAmB","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["../../../src/hooks/index.ts"],"sourcesContent":[null],"mappings":"AAAA,cAAc","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["index.native.js"],"sourcesContent":["export * from \"./useSiweKeycloak\";\n//# sourceMappingURL=index.js.map\n"],"mappings":"AAAA,cAAc,6BAAmB","ignoreList":[]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { useModal, useSIWE } from "@multiplatform.one/web3/connectkit";
|
|
2
|
+
import { useContext } from "react";
|
|
3
|
+
import { useAccount } from "wagmi";
|
|
4
|
+
import { SiweKeycloakContext } from "./context.mjs";
|
|
5
|
+
function useSiweKeycloak() {
|
|
6
|
+
const {
|
|
7
|
+
addresses
|
|
8
|
+
} = useAccount();
|
|
9
|
+
const {
|
|
10
|
+
signOut
|
|
11
|
+
} = useSIWE();
|
|
12
|
+
const {
|
|
13
|
+
openSIWE,
|
|
14
|
+
openSwitchNetworks,
|
|
15
|
+
openOnboarding,
|
|
16
|
+
openAbout,
|
|
17
|
+
openProfile
|
|
18
|
+
} = useModal();
|
|
19
|
+
const {
|
|
20
|
+
keycloak
|
|
21
|
+
} = useContext(SiweKeycloakContext);
|
|
22
|
+
return {
|
|
23
|
+
signOut,
|
|
24
|
+
openSIWE,
|
|
25
|
+
openSwitchNetworks,
|
|
26
|
+
openOnboarding,
|
|
27
|
+
openAbout,
|
|
28
|
+
openProfile,
|
|
29
|
+
keycloak,
|
|
30
|
+
connect() {
|
|
31
|
+
if (!addresses?.length) openProfile();
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export { useSiweKeycloak };
|
|
36
|
+
//# sourceMappingURL=useSiweKeycloak.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useModal","useSIWE","useContext","useAccount","SiweKeycloakContext","useSiweKeycloak","addresses","signOut","openSIWE","openSwitchNetworks","openOnboarding","openAbout","openProfile","keycloak","connect","length"],"sources":["../../../src/hooks/useSiweKeycloak.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,QAAA,EAAUC,OAAA,QAAe;AAClC,SAASC,UAAA,QAAkB;AAC3B,SAASC,UAAA,QAAkB;AAC3B,SAASC,mBAAA,QAA2B;AAE7B,SAASC,gBAAA,EAAkB;EAChC,MAAM;IAAEC;EAAU,IAAIH,UAAA,CAAW;EACjC,MAAM;IAAEI;EAAQ,IAAIN,OAAA,CAAQ;EAC5B,MAAM;IAAEO,QAAA;IAAUC,kBAAA;IAAoBC,cAAA;IAAgBC,SAAA;IAAWC;EAAY,IAAIZ,QAAA,CAAS;EAC1F,MAAM;IAAEa;EAAS,IAAIX,UAAA,CAAWE,mBAAmB;EACnD,OAAO;IACLG,OAAA;IACAC,QAAA;IACAC,kBAAA;IACAC,cAAA;IACAC,SAAA;IACAC,WAAA;IACAC,QAAA;IACAC,QAAA,EAAU;MACR,IAAI,CAACR,SAAA,EAAWS,MAAA,EAAQH,WAAA,CAAY;IACtC;EACF;AACF","ignoreList":[]}
|