@zoneout/sdk 0.1.0
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/LICENSE +21 -0
- package/README.md +124 -0
- package/dist/cjs/client.d.ts +53 -0
- package/dist/cjs/client.d.ts.map +1 -0
- package/dist/cjs/client.js +141 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/errors.d.ts +7 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +13 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.d.ts +7 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +19 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/pkce.d.ts +4 -0
- package/dist/cjs/pkce.d.ts.map +1 -0
- package/dist/cjs/pkce.js +30 -0
- package/dist/cjs/pkce.js.map +1 -0
- package/dist/cjs/polling.d.ts +15 -0
- package/dist/cjs/polling.d.ts.map +1 -0
- package/dist/cjs/polling.js +53 -0
- package/dist/cjs/polling.js.map +1 -0
- package/dist/cjs/react/index.d.ts +3 -0
- package/dist/cjs/react/index.d.ts.map +1 -0
- package/dist/cjs/react/index.js +9 -0
- package/dist/cjs/react/index.js.map +1 -0
- package/dist/cjs/react/provider.d.ts +11 -0
- package/dist/cjs/react/provider.d.ts.map +1 -0
- package/dist/cjs/react/provider.js +24 -0
- package/dist/cjs/react/provider.js.map +1 -0
- package/dist/cjs/react/use-zoneout.d.ts +25 -0
- package/dist/cjs/react/use-zoneout.d.ts.map +1 -0
- package/dist/cjs/react/use-zoneout.js +60 -0
- package/dist/cjs/react/use-zoneout.js.map +1 -0
- package/dist/cjs/server.d.ts +12 -0
- package/dist/cjs/server.d.ts.map +1 -0
- package/dist/cjs/server.js +58 -0
- package/dist/cjs/server.js.map +1 -0
- package/dist/cjs/types.d.ts +85 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +4 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/client.d.ts +53 -0
- package/dist/esm/client.d.ts.map +1 -0
- package/dist/esm/client.js +137 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/errors.d.ts +7 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +9 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +9 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/pkce.d.ts +4 -0
- package/dist/esm/pkce.d.ts.map +1 -0
- package/dist/esm/pkce.js +25 -0
- package/dist/esm/pkce.js.map +1 -0
- package/dist/esm/polling.d.ts +15 -0
- package/dist/esm/polling.d.ts.map +1 -0
- package/dist/esm/polling.js +50 -0
- package/dist/esm/polling.js.map +1 -0
- package/dist/esm/react/index.d.ts +3 -0
- package/dist/esm/react/index.d.ts.map +1 -0
- package/dist/esm/react/index.js +3 -0
- package/dist/esm/react/index.js.map +1 -0
- package/dist/esm/react/provider.d.ts +11 -0
- package/dist/esm/react/provider.d.ts.map +1 -0
- package/dist/esm/react/provider.js +20 -0
- package/dist/esm/react/provider.js.map +1 -0
- package/dist/esm/react/use-zoneout.d.ts +25 -0
- package/dist/esm/react/use-zoneout.d.ts.map +1 -0
- package/dist/esm/react/use-zoneout.js +57 -0
- package/dist/esm/react/use-zoneout.js.map +1 -0
- package/dist/esm/server.d.ts +12 -0
- package/dist/esm/server.d.ts.map +1 -0
- package/dist/esm/server.js +54 -0
- package/dist/esm/server.js.map +1 -0
- package/dist/esm/types.d.ts +85 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +3 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/types/client.d.ts +53 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/errors.d.ts +7 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/pkce.d.ts +4 -0
- package/dist/types/pkce.d.ts.map +1 -0
- package/dist/types/polling.d.ts +15 -0
- package/dist/types/polling.d.ts.map +1 -0
- package/dist/types/react/index.d.ts +3 -0
- package/dist/types/react/index.d.ts.map +1 -0
- package/dist/types/react/provider.d.ts +11 -0
- package/dist/types/react/provider.d.ts.map +1 -0
- package/dist/types/react/use-zoneout.d.ts +25 -0
- package/dist/types/react/use-zoneout.d.ts.map +1 -0
- package/dist/types/server.d.ts +12 -0
- package/dist/types/server.d.ts.map +1 -0
- package/dist/types/types.d.ts +85 -0
- package/dist/types/types.d.ts.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ZoneOutClient } from '../client';
|
|
3
|
+
import type { ZoneOutConfig } from '../types';
|
|
4
|
+
export declare function useZoneOutClient(): ZoneOutClient;
|
|
5
|
+
interface ZoneOutProviderProps {
|
|
6
|
+
config: ZoneOutConfig;
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
}
|
|
9
|
+
export declare function ZoneOutProvider({ config, children }: ZoneOutProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/react/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6C,MAAM,OAAO,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAQ9C,wBAAgB,gBAAgB,IAAI,aAAa,CAMhD;AAED,UAAU,oBAAoB;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,eAAe,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CAYzE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useMemo } from 'react';
|
|
3
|
+
import { ZoneOutClient } from '../client';
|
|
4
|
+
const ZoneOutContext = createContext(null);
|
|
5
|
+
export function useZoneOutClient() {
|
|
6
|
+
const ctx = useContext(ZoneOutContext);
|
|
7
|
+
if (!ctx) {
|
|
8
|
+
throw new Error('useZoneOutClient must be used within <ZoneOutProvider>');
|
|
9
|
+
}
|
|
10
|
+
return ctx.client;
|
|
11
|
+
}
|
|
12
|
+
export function ZoneOutProvider({ config, children }) {
|
|
13
|
+
const client = useMemo(() => new ZoneOutClient(config), [
|
|
14
|
+
config.clientId,
|
|
15
|
+
config.authServerUrl,
|
|
16
|
+
config.redirectUri,
|
|
17
|
+
]);
|
|
18
|
+
return (_jsx(ZoneOutContext.Provider, { value: { client }, children: children }));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/react/provider.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAO1C,MAAM,cAAc,GAAG,aAAa,CAA6B,IAAI,CAAC,CAAC;AAEvE,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC;AAOD,MAAM,UAAU,eAAe,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAwB;IACxE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE;QACtD,MAAM,CAAC,QAAQ;QACf,MAAM,CAAC,aAAa;QACpB,MAAM,CAAC,WAAW;KACnB,CAAC,CAAC;IAEH,OAAO,CACL,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,MAAM,EAAE,YACvC,QAAQ,GACe,CAC3B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ZoneOutErrorCode } from '../types';
|
|
2
|
+
interface UseZoneOutReturn {
|
|
3
|
+
/** Avvia il login. Restituisce l'URL del QR code. */
|
|
4
|
+
initiateLogin: () => Promise<{
|
|
5
|
+
qrCodeUrl: string;
|
|
6
|
+
sessionId: string;
|
|
7
|
+
expiresAt: string;
|
|
8
|
+
waitForApproval: () => Promise<void>;
|
|
9
|
+
abort: AbortController;
|
|
10
|
+
}>;
|
|
11
|
+
/** Flusso completo login -> redirect */
|
|
12
|
+
login: () => Promise<void>;
|
|
13
|
+
/** Loading state */
|
|
14
|
+
isLoading: boolean;
|
|
15
|
+
/** URL del QR code (disponibile dopo initiateLogin) */
|
|
16
|
+
qrCodeUrl: string | null;
|
|
17
|
+
/** Errore ultimo tentativo */
|
|
18
|
+
error: {
|
|
19
|
+
code: ZoneOutErrorCode;
|
|
20
|
+
message: string;
|
|
21
|
+
} | null;
|
|
22
|
+
}
|
|
23
|
+
export declare function useZoneOut(): UseZoneOutReturn;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=use-zoneout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-zoneout.d.ts","sourceRoot":"","sources":["../../../src/react/use-zoneout.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGjD,UAAU,gBAAgB;IACxB,qDAAqD;IACrD,aAAa,EAAE,MAAM,OAAO,CAAC;QAC3B,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,EAAE,eAAe,CAAC;KACxB,CAAC,CAAC;IACH,wCAAwC;IACxC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,oBAAoB;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,8BAA8B;IAC9B,KAAK,EAAE;QAAE,IAAI,EAAE,gBAAgB,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC3D;AAED,wBAAgB,UAAU,IAAI,gBAAgB,CAsD7C"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { useState, useCallback } from 'react';
|
|
2
|
+
import { useZoneOutClient } from './provider';
|
|
3
|
+
export function useZoneOut() {
|
|
4
|
+
const client = useZoneOutClient();
|
|
5
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
6
|
+
const [qrCodeUrl, setQrCodeUrl] = useState(null);
|
|
7
|
+
const [error, setError] = useState(null);
|
|
8
|
+
const initiateLogin = useCallback(async () => {
|
|
9
|
+
setIsLoading(true);
|
|
10
|
+
setError(null);
|
|
11
|
+
setQrCodeUrl(null);
|
|
12
|
+
try {
|
|
13
|
+
const result = await client.initiateLogin();
|
|
14
|
+
setQrCodeUrl(result.qrCodeUrl);
|
|
15
|
+
return {
|
|
16
|
+
...result,
|
|
17
|
+
waitForApproval: async () => {
|
|
18
|
+
try {
|
|
19
|
+
const status = await result.waitForApproval();
|
|
20
|
+
if (status.authorization_code) {
|
|
21
|
+
window.location.href = client.buildCallbackUrl(status.authorization_code);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
const e = err;
|
|
26
|
+
setError({ code: e.code ?? 'UNKNOWN_ERROR', message: e.message });
|
|
27
|
+
throw err;
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
setIsLoading(false);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
const e = err;
|
|
37
|
+
setError({ code: e.code ?? 'UNKNOWN_ERROR', message: e.message });
|
|
38
|
+
setIsLoading(false);
|
|
39
|
+
throw err;
|
|
40
|
+
}
|
|
41
|
+
}, [client]);
|
|
42
|
+
const login = useCallback(async () => {
|
|
43
|
+
setIsLoading(true);
|
|
44
|
+
setError(null);
|
|
45
|
+
try {
|
|
46
|
+
await client.login();
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
const e = err;
|
|
50
|
+
setError({ code: e.code ?? 'UNKNOWN_ERROR', message: e.message });
|
|
51
|
+
setIsLoading(false);
|
|
52
|
+
throw err;
|
|
53
|
+
}
|
|
54
|
+
}, [client]);
|
|
55
|
+
return { initiateLogin, login, isLoading, qrCodeUrl, error };
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=use-zoneout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-zoneout.js","sourceRoot":"","sources":["../../../src/react/use-zoneout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAuB9C,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAChE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAqD,IAAI,CAAC,CAAC;IAE7F,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC3C,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,YAAY,CAAC,IAAI,CAAC,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;YAC5C,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAE/B,OAAO;gBACL,GAAG,MAAM;gBACT,eAAe,EAAE,KAAK,IAAI,EAAE;oBAC1B,IAAI,CAAC;wBACH,MAAM,MAAM,GAAkB,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;wBAC7D,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;4BAC9B,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;wBAC5E,CAAC;oBACH,CAAC;oBAAC,OAAO,GAAY,EAAE,CAAC;wBACtB,MAAM,CAAC,GAAG,GAAmD,CAAC;wBAC9D,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;wBAClE,MAAM,GAAG,CAAC;oBACZ,CAAC;4BAAS,CAAC;wBACT,YAAY,CAAC,KAAK,CAAC,CAAC;oBACtB,CAAC;gBACH,CAAC;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAAmD,CAAC;YAC9D,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAClE,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACnC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAAmD,CAAC;YAC9D,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAClE,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { TokenExchangeParams, TokenRefreshParams, TokenResponse } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Scambia l'authorization_code per access_token + refresh_token + user data.
|
|
4
|
+
* Da chiamare SOLO server-side (usa client_secret).
|
|
5
|
+
*/
|
|
6
|
+
export declare function exchangeCodeForTokens(params: TokenExchangeParams): Promise<TokenResponse>;
|
|
7
|
+
/**
|
|
8
|
+
* Refresh dell'access_token usando il refresh_token.
|
|
9
|
+
* Da chiamare SOLO server-side (usa client_secret).
|
|
10
|
+
*/
|
|
11
|
+
export declare function refreshAccessToken(params: TokenRefreshParams): Promise<TokenResponse>;
|
|
12
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGtF;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CA6B/F;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CA2B3F"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ZoneOutError } from './errors';
|
|
2
|
+
/**
|
|
3
|
+
* Scambia l'authorization_code per access_token + refresh_token + user data.
|
|
4
|
+
* Da chiamare SOLO server-side (usa client_secret).
|
|
5
|
+
*/
|
|
6
|
+
export async function exchangeCodeForTokens(params) {
|
|
7
|
+
const { code, clientId, clientSecret, codeVerifier, redirectUri, authServerUrl, apiKey } = params;
|
|
8
|
+
const res = await fetch(`${authServerUrl}/auth-token`, {
|
|
9
|
+
method: 'POST',
|
|
10
|
+
headers: {
|
|
11
|
+
'Content-Type': 'application/json',
|
|
12
|
+
...(apiKey ? { apikey: apiKey, Authorization: `Bearer ${apiKey}` } : {}),
|
|
13
|
+
},
|
|
14
|
+
body: JSON.stringify({
|
|
15
|
+
grant_type: 'authorization_code',
|
|
16
|
+
code,
|
|
17
|
+
client_id: clientId,
|
|
18
|
+
client_secret: clientSecret,
|
|
19
|
+
code_verifier: codeVerifier,
|
|
20
|
+
redirect_uri: redirectUri,
|
|
21
|
+
}),
|
|
22
|
+
});
|
|
23
|
+
if (!res.ok) {
|
|
24
|
+
const body = await res.json().catch(() => ({}));
|
|
25
|
+
throw new ZoneOutError('TOKEN_EXCHANGE_FAILED', body.error || `Token exchange failed: HTTP ${res.status}`, body);
|
|
26
|
+
}
|
|
27
|
+
return res.json();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Refresh dell'access_token usando il refresh_token.
|
|
31
|
+
* Da chiamare SOLO server-side (usa client_secret).
|
|
32
|
+
*/
|
|
33
|
+
export async function refreshAccessToken(params) {
|
|
34
|
+
const { refreshToken, clientId, clientSecret, authServerUrl, apiKey } = params;
|
|
35
|
+
const res = await fetch(`${authServerUrl}/auth-token`, {
|
|
36
|
+
method: 'POST',
|
|
37
|
+
headers: {
|
|
38
|
+
'Content-Type': 'application/json',
|
|
39
|
+
...(apiKey ? { apikey: apiKey, Authorization: `Bearer ${apiKey}` } : {}),
|
|
40
|
+
},
|
|
41
|
+
body: JSON.stringify({
|
|
42
|
+
grant_type: 'refresh_token',
|
|
43
|
+
refresh_token: refreshToken,
|
|
44
|
+
client_id: clientId,
|
|
45
|
+
client_secret: clientSecret,
|
|
46
|
+
}),
|
|
47
|
+
});
|
|
48
|
+
if (!res.ok) {
|
|
49
|
+
const body = await res.json().catch(() => ({}));
|
|
50
|
+
throw new ZoneOutError('TOKEN_EXCHANGE_FAILED', body.error || `Token refresh failed: HTTP ${res.status}`, body);
|
|
51
|
+
}
|
|
52
|
+
return res.json();
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAA2B;IACrE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAElG,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,aAAa,aAAa,EAAE;QACrD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzE;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,UAAU,EAAE,oBAAoB;YAChC,IAAI;YACJ,SAAS,EAAE,QAAQ;YACnB,aAAa,EAAE,YAAY;YAC3B,aAAa,EAAE,YAAY;YAC3B,YAAY,EAAE,WAAW;SAC1B,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,IAAI,YAAY,CACpB,uBAAuB,EACvB,IAAI,CAAC,KAAK,IAAI,+BAA+B,GAAG,CAAC,MAAM,EAAE,EACzD,IAAI,CACL,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAA0B;IACjE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAE/E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,aAAa,aAAa,EAAE;QACrD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzE;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,UAAU,EAAE,eAAe;YAC3B,aAAa,EAAE,YAAY;YAC3B,SAAS,EAAE,QAAQ;YACnB,aAAa,EAAE,YAAY;SAC5B,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,IAAI,YAAY,CACpB,uBAAuB,EACvB,IAAI,CAAC,KAAK,IAAI,8BAA8B,GAAG,CAAC,MAAM,EAAE,EACxD,IAAI,CACL,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
export interface ZoneOutConfig {
|
|
2
|
+
/** client_id ottenuto dalla registrazione su dashboard.zoneout.io */
|
|
3
|
+
clientId: string;
|
|
4
|
+
/** URL base delle Edge Functions Supabase (es: https://xxx.supabase.co/functions/v1) */
|
|
5
|
+
authServerUrl: string;
|
|
6
|
+
/** URI di redirect autorizzato per questo client */
|
|
7
|
+
redirectUri: string;
|
|
8
|
+
/** Supabase anon key — required for Supabase Edge Functions gateway */
|
|
9
|
+
apiKey?: string;
|
|
10
|
+
/** Scope richiesti (default: ["identity"]) */
|
|
11
|
+
scope?: string[];
|
|
12
|
+
/** Timeout polling in ms (default: 300000 = 5 min) */
|
|
13
|
+
pollingTimeout?: number;
|
|
14
|
+
/** Intervallo polling in ms (default: 2000) */
|
|
15
|
+
pollingInterval?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ZoneOutUser {
|
|
18
|
+
zo_sub: string;
|
|
19
|
+
username: string;
|
|
20
|
+
wallet_address: string | null;
|
|
21
|
+
providers: Record<string, {
|
|
22
|
+
username: string;
|
|
23
|
+
user_id: string;
|
|
24
|
+
}>;
|
|
25
|
+
trust: Record<string, 'unrated' | 'red' | 'yellow' | 'green' | 'blue'>;
|
|
26
|
+
}
|
|
27
|
+
export interface ZoneOutTokens {
|
|
28
|
+
access_token: string;
|
|
29
|
+
refresh_token: string;
|
|
30
|
+
expires_at: number;
|
|
31
|
+
}
|
|
32
|
+
export interface ZoneOutLoginResult {
|
|
33
|
+
user: ZoneOutUser;
|
|
34
|
+
tokens: ZoneOutTokens;
|
|
35
|
+
}
|
|
36
|
+
export type LoginSessionStatus = 'pending_approval' | 'approved' | 'rejected' | 'expired';
|
|
37
|
+
export interface LoginSession {
|
|
38
|
+
login_session_id: string;
|
|
39
|
+
expires_at: string;
|
|
40
|
+
status: LoginSessionStatus;
|
|
41
|
+
}
|
|
42
|
+
export interface LoginSessionDetail {
|
|
43
|
+
id: string;
|
|
44
|
+
client_app_name: string;
|
|
45
|
+
client_app_icon_url: string | null;
|
|
46
|
+
required_providers: string[];
|
|
47
|
+
requested_trust_categories: string[];
|
|
48
|
+
scope: string[];
|
|
49
|
+
status: LoginSessionStatus;
|
|
50
|
+
created_at: string;
|
|
51
|
+
expires_at: string;
|
|
52
|
+
}
|
|
53
|
+
export interface LoginSessionResponse {
|
|
54
|
+
session: LoginSessionDetail;
|
|
55
|
+
authorization_code?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface TokenExchangeParams {
|
|
58
|
+
code: string;
|
|
59
|
+
clientId: string;
|
|
60
|
+
clientSecret: string;
|
|
61
|
+
codeVerifier: string;
|
|
62
|
+
redirectUri: string;
|
|
63
|
+
authServerUrl: string;
|
|
64
|
+
apiKey?: string;
|
|
65
|
+
}
|
|
66
|
+
export interface TokenRefreshParams {
|
|
67
|
+
refreshToken: string;
|
|
68
|
+
clientId: string;
|
|
69
|
+
clientSecret: string;
|
|
70
|
+
authServerUrl: string;
|
|
71
|
+
apiKey?: string;
|
|
72
|
+
}
|
|
73
|
+
export interface TokenResponse {
|
|
74
|
+
access_token: string;
|
|
75
|
+
token_type: string;
|
|
76
|
+
expires_in: number;
|
|
77
|
+
refresh_token: string;
|
|
78
|
+
user?: ZoneOutUser;
|
|
79
|
+
}
|
|
80
|
+
export type ZoneOutEvent = 'login_start' | 'login_approved' | 'login_rejected' | 'login_expired' | 'login_error' | 'logout';
|
|
81
|
+
export interface ZoneOutEventCallback {
|
|
82
|
+
(event: ZoneOutEvent, data?: unknown): void;
|
|
83
|
+
}
|
|
84
|
+
export type ZoneOutErrorCode = 'USER_REJECTED' | 'SESSION_EXPIRED' | 'PROVIDER_MISSING' | 'PROVIDER_LOCKED' | 'DEVICE_NOT_BOUND' | 'INVALID_CLIENT' | 'INVALID_REDIRECT' | 'RATE_LIMITED' | 'NETWORK_ERROR' | 'POLLING_TIMEOUT' | 'TOKEN_EXCHANGE_FAILED' | 'UNKNOWN_ERROR';
|
|
85
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,yBAAyB"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { ZoneOutConfig, ZoneOutEvent, ZoneOutEventCallback } from './types';
|
|
2
|
+
import { type PollingResult } from './polling';
|
|
3
|
+
export interface LoginInitResult {
|
|
4
|
+
/** URL del QR code da mostrare all'utente: zoneout://approve?session={id} */
|
|
5
|
+
qrCodeUrl: string;
|
|
6
|
+
/** ID della sessione di login */
|
|
7
|
+
sessionId: string;
|
|
8
|
+
/** Scade a (ISO string) */
|
|
9
|
+
expiresAt: string;
|
|
10
|
+
/** AbortController per annullare il login */
|
|
11
|
+
abort: AbortController;
|
|
12
|
+
/**
|
|
13
|
+
* Promise che si risolve quando l'utente approva.
|
|
14
|
+
* Restituisce il risultato con authorization_code.
|
|
15
|
+
* Il consumer è responsabile del redirect.
|
|
16
|
+
*/
|
|
17
|
+
waitForApproval: () => Promise<PollingResult>;
|
|
18
|
+
}
|
|
19
|
+
export declare class ZoneOutClient {
|
|
20
|
+
private config;
|
|
21
|
+
private listeners;
|
|
22
|
+
private _codeVerifier;
|
|
23
|
+
private _state;
|
|
24
|
+
constructor(config: ZoneOutConfig);
|
|
25
|
+
/**
|
|
26
|
+
* Avvia il flusso di login.
|
|
27
|
+
* Restituisce l'URL del QR code e una promise per attendere l'approvazione.
|
|
28
|
+
*/
|
|
29
|
+
initiateLogin(): Promise<LoginInitResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Restituisce il code_verifier generato nell'ultimo initiateLogin.
|
|
32
|
+
* Serve al backend per il token exchange.
|
|
33
|
+
* ATTENZIONE: NON inviare mai il code_verifier a terzi. Va solo al TUO backend.
|
|
34
|
+
*/
|
|
35
|
+
getCodeVerifier(): string | null;
|
|
36
|
+
/**
|
|
37
|
+
* Restituisce lo state generato nell'ultimo initiateLogin.
|
|
38
|
+
*/
|
|
39
|
+
getState(): string | null;
|
|
40
|
+
/**
|
|
41
|
+
* Genera l'URL di redirect al backend del consumer con i parametri necessari.
|
|
42
|
+
*/
|
|
43
|
+
buildCallbackUrl(authorizationCode: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Flusso completo: initiate -> poll -> redirect.
|
|
46
|
+
*/
|
|
47
|
+
login(): Promise<void>;
|
|
48
|
+
on(event: ZoneOutEvent, callback: ZoneOutEventCallback): void;
|
|
49
|
+
off(event: ZoneOutEvent, callback: ZoneOutEventCallback): void;
|
|
50
|
+
private emit;
|
|
51
|
+
private mapServerError;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAEb,YAAY,EACZ,oBAAoB,EAErB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAEhE,MAAM,WAAW,eAAe;IAC9B,6EAA6E;IAC7E,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,KAAK,EAAE,eAAe,CAAC;IACvB;;;;OAIG;IACH,eAAe,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;CAC/C;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,SAAS,CAA2D;IAC5E,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,EAAE,aAAa;IAUjC;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC;IAgE/C;;;;OAIG;IACH,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,QAAQ,IAAI,MAAM,GAAG,IAAI;IAIzB;;OAEG;IACH,gBAAgB,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM;IAOnD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAO7D,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAI9D,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,cAAc;CAQvB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ZoneOutErrorCode } from './types';
|
|
2
|
+
export declare class ZoneOutError extends Error {
|
|
3
|
+
readonly code: ZoneOutErrorCode;
|
|
4
|
+
readonly detail?: Record<string, unknown>;
|
|
5
|
+
constructor(code: ZoneOutErrorCode, message: string, detail?: Record<string, unknown>);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAgB,IAAI,EAAE,gBAAgB,CAAC;IACvC,SAAgB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAErC,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAMtF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { ZoneOutClient } from './client';
|
|
2
|
+
export type { LoginInitResult } from './client';
|
|
3
|
+
export { exchangeCodeForTokens, refreshAccessToken } from './server';
|
|
4
|
+
export type { ZoneOutConfig, ZoneOutUser, ZoneOutTokens, ZoneOutLoginResult, LoginSession, LoginSessionStatus, LoginSessionDetail, LoginSessionResponse, TokenExchangeParams, TokenRefreshParams, TokenResponse, ZoneOutEvent, ZoneOutEventCallback, ZoneOutErrorCode, } from './types';
|
|
5
|
+
export { ZoneOutError } from './errors';
|
|
6
|
+
export { generateCodeVerifier, generateCodeChallenge, generateState } from './pkce';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGhD,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAGrE,YAAY,EACV,aAAa,EACb,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/pkce.ts"],"names":[],"mappings":"AASA,wBAAgB,oBAAoB,IAAI,MAAM,CAI7C;AAED,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK7E;AAED,wBAAgB,aAAa,IAAI,MAAM,CAItC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface PollingOptions {
|
|
2
|
+
sessionId: string;
|
|
3
|
+
authServerUrl: string;
|
|
4
|
+
apiKey?: string;
|
|
5
|
+
interval: number;
|
|
6
|
+
timeout: number;
|
|
7
|
+
onStatusChange?: (status: string) => void;
|
|
8
|
+
signal?: AbortSignal;
|
|
9
|
+
}
|
|
10
|
+
export interface PollingResult {
|
|
11
|
+
status: string;
|
|
12
|
+
authorization_code?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function pollForApproval(options: PollingOptions): Promise<PollingResult>;
|
|
15
|
+
//# sourceMappingURL=polling.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polling.d.ts","sourceRoot":"","sources":["../../src/polling.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAwDrF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ZoneOutClient } from '../client';
|
|
3
|
+
import type { ZoneOutConfig } from '../types';
|
|
4
|
+
export declare function useZoneOutClient(): ZoneOutClient;
|
|
5
|
+
interface ZoneOutProviderProps {
|
|
6
|
+
config: ZoneOutConfig;
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
}
|
|
9
|
+
export declare function ZoneOutProvider({ config, children }: ZoneOutProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/react/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6C,MAAM,OAAO,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAQ9C,wBAAgB,gBAAgB,IAAI,aAAa,CAMhD;AAED,UAAU,oBAAoB;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,eAAe,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CAYzE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ZoneOutErrorCode } from '../types';
|
|
2
|
+
interface UseZoneOutReturn {
|
|
3
|
+
/** Avvia il login. Restituisce l'URL del QR code. */
|
|
4
|
+
initiateLogin: () => Promise<{
|
|
5
|
+
qrCodeUrl: string;
|
|
6
|
+
sessionId: string;
|
|
7
|
+
expiresAt: string;
|
|
8
|
+
waitForApproval: () => Promise<void>;
|
|
9
|
+
abort: AbortController;
|
|
10
|
+
}>;
|
|
11
|
+
/** Flusso completo login -> redirect */
|
|
12
|
+
login: () => Promise<void>;
|
|
13
|
+
/** Loading state */
|
|
14
|
+
isLoading: boolean;
|
|
15
|
+
/** URL del QR code (disponibile dopo initiateLogin) */
|
|
16
|
+
qrCodeUrl: string | null;
|
|
17
|
+
/** Errore ultimo tentativo */
|
|
18
|
+
error: {
|
|
19
|
+
code: ZoneOutErrorCode;
|
|
20
|
+
message: string;
|
|
21
|
+
} | null;
|
|
22
|
+
}
|
|
23
|
+
export declare function useZoneOut(): UseZoneOutReturn;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=use-zoneout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-zoneout.d.ts","sourceRoot":"","sources":["../../../src/react/use-zoneout.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGjD,UAAU,gBAAgB;IACxB,qDAAqD;IACrD,aAAa,EAAE,MAAM,OAAO,CAAC;QAC3B,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,EAAE,eAAe,CAAC;KACxB,CAAC,CAAC;IACH,wCAAwC;IACxC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,oBAAoB;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,uDAAuD;IACvD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,8BAA8B;IAC9B,KAAK,EAAE;QAAE,IAAI,EAAE,gBAAgB,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC3D;AAED,wBAAgB,UAAU,IAAI,gBAAgB,CAsD7C"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { TokenExchangeParams, TokenRefreshParams, TokenResponse } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Scambia l'authorization_code per access_token + refresh_token + user data.
|
|
4
|
+
* Da chiamare SOLO server-side (usa client_secret).
|
|
5
|
+
*/
|
|
6
|
+
export declare function exchangeCodeForTokens(params: TokenExchangeParams): Promise<TokenResponse>;
|
|
7
|
+
/**
|
|
8
|
+
* Refresh dell'access_token usando il refresh_token.
|
|
9
|
+
* Da chiamare SOLO server-side (usa client_secret).
|
|
10
|
+
*/
|
|
11
|
+
export declare function refreshAccessToken(params: TokenRefreshParams): Promise<TokenResponse>;
|
|
12
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGtF;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CA6B/F;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CA2B3F"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
export interface ZoneOutConfig {
|
|
2
|
+
/** client_id ottenuto dalla registrazione su dashboard.zoneout.io */
|
|
3
|
+
clientId: string;
|
|
4
|
+
/** URL base delle Edge Functions Supabase (es: https://xxx.supabase.co/functions/v1) */
|
|
5
|
+
authServerUrl: string;
|
|
6
|
+
/** URI di redirect autorizzato per questo client */
|
|
7
|
+
redirectUri: string;
|
|
8
|
+
/** Supabase anon key — required for Supabase Edge Functions gateway */
|
|
9
|
+
apiKey?: string;
|
|
10
|
+
/** Scope richiesti (default: ["identity"]) */
|
|
11
|
+
scope?: string[];
|
|
12
|
+
/** Timeout polling in ms (default: 300000 = 5 min) */
|
|
13
|
+
pollingTimeout?: number;
|
|
14
|
+
/** Intervallo polling in ms (default: 2000) */
|
|
15
|
+
pollingInterval?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ZoneOutUser {
|
|
18
|
+
zo_sub: string;
|
|
19
|
+
username: string;
|
|
20
|
+
wallet_address: string | null;
|
|
21
|
+
providers: Record<string, {
|
|
22
|
+
username: string;
|
|
23
|
+
user_id: string;
|
|
24
|
+
}>;
|
|
25
|
+
trust: Record<string, 'unrated' | 'red' | 'yellow' | 'green' | 'blue'>;
|
|
26
|
+
}
|
|
27
|
+
export interface ZoneOutTokens {
|
|
28
|
+
access_token: string;
|
|
29
|
+
refresh_token: string;
|
|
30
|
+
expires_at: number;
|
|
31
|
+
}
|
|
32
|
+
export interface ZoneOutLoginResult {
|
|
33
|
+
user: ZoneOutUser;
|
|
34
|
+
tokens: ZoneOutTokens;
|
|
35
|
+
}
|
|
36
|
+
export type LoginSessionStatus = 'pending_approval' | 'approved' | 'rejected' | 'expired';
|
|
37
|
+
export interface LoginSession {
|
|
38
|
+
login_session_id: string;
|
|
39
|
+
expires_at: string;
|
|
40
|
+
status: LoginSessionStatus;
|
|
41
|
+
}
|
|
42
|
+
export interface LoginSessionDetail {
|
|
43
|
+
id: string;
|
|
44
|
+
client_app_name: string;
|
|
45
|
+
client_app_icon_url: string | null;
|
|
46
|
+
required_providers: string[];
|
|
47
|
+
requested_trust_categories: string[];
|
|
48
|
+
scope: string[];
|
|
49
|
+
status: LoginSessionStatus;
|
|
50
|
+
created_at: string;
|
|
51
|
+
expires_at: string;
|
|
52
|
+
}
|
|
53
|
+
export interface LoginSessionResponse {
|
|
54
|
+
session: LoginSessionDetail;
|
|
55
|
+
authorization_code?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface TokenExchangeParams {
|
|
58
|
+
code: string;
|
|
59
|
+
clientId: string;
|
|
60
|
+
clientSecret: string;
|
|
61
|
+
codeVerifier: string;
|
|
62
|
+
redirectUri: string;
|
|
63
|
+
authServerUrl: string;
|
|
64
|
+
apiKey?: string;
|
|
65
|
+
}
|
|
66
|
+
export interface TokenRefreshParams {
|
|
67
|
+
refreshToken: string;
|
|
68
|
+
clientId: string;
|
|
69
|
+
clientSecret: string;
|
|
70
|
+
authServerUrl: string;
|
|
71
|
+
apiKey?: string;
|
|
72
|
+
}
|
|
73
|
+
export interface TokenResponse {
|
|
74
|
+
access_token: string;
|
|
75
|
+
token_type: string;
|
|
76
|
+
expires_in: number;
|
|
77
|
+
refresh_token: string;
|
|
78
|
+
user?: ZoneOutUser;
|
|
79
|
+
}
|
|
80
|
+
export type ZoneOutEvent = 'login_start' | 'login_approved' | 'login_rejected' | 'login_expired' | 'login_error' | 'logout';
|
|
81
|
+
export interface ZoneOutEventCallback {
|
|
82
|
+
(event: ZoneOutEvent, data?: unknown): void;
|
|
83
|
+
}
|
|
84
|
+
export type ZoneOutErrorCode = 'USER_REJECTED' | 'SESSION_EXPIRED' | 'PROVIDER_MISSING' | 'PROVIDER_LOCKED' | 'DEVICE_NOT_BOUND' | 'INVALID_CLIENT' | 'INVALID_REDIRECT' | 'RATE_LIMITED' | 'NETWORK_ERROR' | 'POLLING_TIMEOUT' | 'TOKEN_EXCHANGE_FAILED' | 'UNKNOWN_ERROR';
|
|
85
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|