@hive-ng/web-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/README.md +85 -0
- package/dist/chunk-NWQONJK2.js +898 -0
- package/dist/chunk-NWQONJK2.js.map +1 -0
- package/dist/hive-ng.global.js +3 -0
- package/dist/hive-ng.global.js.map +1 -0
- package/dist/index.cjs +909 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1676 -0
- package/dist/index.d.ts +1676 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/react/index.cjs +982 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +33 -0
- package/dist/react/index.d.ts +33 -0
- package/dist/react/index.js +105 -0
- package/dist/react/index.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { createHiveNg } from '../chunk-NWQONJK2.js';
|
|
2
|
+
import { createContext, useRef, useState, useEffect, useMemo, useContext, useCallback } from 'react';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var HiveContext = createContext(null);
|
|
6
|
+
function HiveProvider({ config, children }) {
|
|
7
|
+
const hiveRef = useRef(null);
|
|
8
|
+
if (hiveRef.current === null) {
|
|
9
|
+
hiveRef.current = createHiveNg(config);
|
|
10
|
+
}
|
|
11
|
+
const hive = hiveRef.current;
|
|
12
|
+
const [ready, setReady] = useState(false);
|
|
13
|
+
const [initError, setInitError] = useState(null);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
let cancelled = false;
|
|
16
|
+
hive.init().then(() => hive.auth.restoreSession()).then(() => {
|
|
17
|
+
if (!cancelled) setReady(true);
|
|
18
|
+
}).catch((err) => {
|
|
19
|
+
if (!cancelled) setInitError(err);
|
|
20
|
+
});
|
|
21
|
+
return () => {
|
|
22
|
+
cancelled = true;
|
|
23
|
+
};
|
|
24
|
+
}, [hive]);
|
|
25
|
+
const value = useMemo(
|
|
26
|
+
() => ({ hive, ready, initError }),
|
|
27
|
+
[hive, ready, initError]
|
|
28
|
+
);
|
|
29
|
+
return /* @__PURE__ */ jsx(HiveContext.Provider, { value, children });
|
|
30
|
+
}
|
|
31
|
+
function useHiveNg() {
|
|
32
|
+
const ctx = useContext(HiveContext);
|
|
33
|
+
if (ctx === null) {
|
|
34
|
+
throw new Error("useHiveNg must be used within <HiveProvider>");
|
|
35
|
+
}
|
|
36
|
+
return ctx;
|
|
37
|
+
}
|
|
38
|
+
function useAuth() {
|
|
39
|
+
const { hive, ready, initError } = useHiveNg();
|
|
40
|
+
const [player, setPlayer] = useState(() => hive.auth.currentPlayer());
|
|
41
|
+
const [pending, setPending] = useState(false);
|
|
42
|
+
const [error, setError] = useState(null);
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
if (ready) {
|
|
45
|
+
setPlayer(hive.auth.currentPlayer());
|
|
46
|
+
}
|
|
47
|
+
}, [ready, hive]);
|
|
48
|
+
const getLoginProviders = useCallback(
|
|
49
|
+
async (countryOverride) => hive.auth.getLoginProviders(countryOverride),
|
|
50
|
+
[hive]
|
|
51
|
+
);
|
|
52
|
+
const loginWithGoogle = useCallback(
|
|
53
|
+
async (idToken) => {
|
|
54
|
+
setPending(true);
|
|
55
|
+
setError(null);
|
|
56
|
+
try {
|
|
57
|
+
const loggedIn = await hive.auth.loginWithGoogle(idToken);
|
|
58
|
+
setPlayer(loggedIn);
|
|
59
|
+
return loggedIn;
|
|
60
|
+
} catch (err) {
|
|
61
|
+
setError(err);
|
|
62
|
+
throw err;
|
|
63
|
+
} finally {
|
|
64
|
+
setPending(false);
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
[hive]
|
|
68
|
+
);
|
|
69
|
+
const loginAsGuest = useCallback(
|
|
70
|
+
async (deviceId) => {
|
|
71
|
+
setPending(true);
|
|
72
|
+
setError(null);
|
|
73
|
+
try {
|
|
74
|
+
const loggedIn = await hive.auth.loginAsGuest(deviceId);
|
|
75
|
+
setPlayer(loggedIn);
|
|
76
|
+
return loggedIn;
|
|
77
|
+
} catch (err) {
|
|
78
|
+
setError(err);
|
|
79
|
+
throw err;
|
|
80
|
+
} finally {
|
|
81
|
+
setPending(false);
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
[hive]
|
|
85
|
+
);
|
|
86
|
+
const logout = useCallback(async () => {
|
|
87
|
+
await hive.auth.logout();
|
|
88
|
+
setPlayer(null);
|
|
89
|
+
}, [hive]);
|
|
90
|
+
return {
|
|
91
|
+
ready,
|
|
92
|
+
initError,
|
|
93
|
+
player,
|
|
94
|
+
pending,
|
|
95
|
+
error,
|
|
96
|
+
getLoginProviders,
|
|
97
|
+
loginWithGoogle,
|
|
98
|
+
loginAsGuest,
|
|
99
|
+
logout
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export { HiveProvider, useAuth, useHiveNg };
|
|
104
|
+
//# sourceMappingURL=index.js.map
|
|
105
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/react/index.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n createHiveNg,\n type HiveNgClient,\n type HiveNgConfig,\n type LoginProviders,\n type Player,\n} from \"../index\";\n\ninterface HiveContextValue {\n hive: HiveNgClient;\n ready: boolean;\n initError: Error | null;\n}\n\nconst HiveContext = createContext<HiveContextValue | null>(null);\n\nexport interface HiveProviderProps {\n config: HiveNgConfig;\n children: ReactNode;\n}\n\nexport function HiveProvider({ config, children }: HiveProviderProps) {\n // config는 마운트 시점 값으로 1회 생성한다(런타임 재구성은 재마운트로).\n const hiveRef = useRef<HiveNgClient | null>(null);\n if (hiveRef.current === null) {\n hiveRef.current = createHiveNg(config);\n }\n const hive = hiveRef.current;\n\n const [ready, setReady] = useState(false);\n const [initError, setInitError] = useState<Error | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n hive\n .init()\n .then(() => hive.auth.restoreSession())\n .then(() => {\n if (!cancelled) setReady(true);\n })\n .catch((err: unknown) => {\n if (!cancelled) setInitError(err as Error);\n });\n return () => {\n cancelled = true;\n };\n }, [hive]);\n\n const value = useMemo<HiveContextValue>(\n () => ({ hive, ready, initError }),\n [hive, ready, initError],\n );\n\n return <HiveContext.Provider value={value}>{children}</HiveContext.Provider>;\n}\n\nexport function useHiveNg(): HiveContextValue {\n const ctx = useContext(HiveContext);\n if (ctx === null) {\n throw new Error(\"useHiveNg must be used within <HiveProvider>\");\n }\n return ctx;\n}\n\nexport interface UseAuthResult {\n ready: boolean;\n initError: Error | null;\n player: Player | null;\n pending: boolean;\n error: Error | null;\n getLoginProviders: (countryOverride?: string) => Promise<LoginProviders>;\n loginWithGoogle: (idToken: string) => Promise<Player>;\n loginAsGuest: (deviceId: string) => Promise<Player>;\n logout: () => Promise<void>;\n}\n\nexport function useAuth(): UseAuthResult {\n const { hive, ready, initError } = useHiveNg();\n const [player, setPlayer] = useState<Player | null>(() => hive.auth.currentPlayer());\n const [pending, setPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // init+restoreSession 완료(ready) 시점에 복원된 player를 반영한다.\n useEffect(() => {\n if (ready) {\n setPlayer(hive.auth.currentPlayer());\n }\n }, [ready, hive]);\n\n const getLoginProviders = useCallback(\n async (countryOverride?: string): Promise<LoginProviders> =>\n hive.auth.getLoginProviders(countryOverride),\n [hive],\n );\n\n const loginWithGoogle = useCallback(\n async (idToken: string): Promise<Player> => {\n setPending(true);\n setError(null);\n try {\n const loggedIn = await hive.auth.loginWithGoogle(idToken);\n setPlayer(loggedIn);\n return loggedIn;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setPending(false);\n }\n },\n [hive],\n );\n\n const loginAsGuest = useCallback(\n async (deviceId: string): Promise<Player> => {\n setPending(true);\n setError(null);\n try {\n const loggedIn = await hive.auth.loginAsGuest(deviceId);\n setPlayer(loggedIn);\n return loggedIn;\n } catch (err) {\n setError(err as Error);\n throw err;\n } finally {\n setPending(false);\n }\n },\n [hive],\n );\n\n const logout = useCallback(async (): Promise<void> => {\n await hive.auth.logout();\n setPlayer(null);\n }, [hive]);\n\n return {\n ready,\n initError,\n player,\n pending,\n error,\n getLoginProviders,\n loginWithGoogle,\n loginAsGuest,\n logout,\n };\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hive-ng/web-sdk",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "HIVE-NG browser SDK for game clients.",
|
|
5
|
+
"license": "UNLICENSED",
|
|
6
|
+
"author": "HIVE-NG",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"sideEffects": false,
|
|
9
|
+
"main": "./dist/index.cjs",
|
|
10
|
+
"module": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"unpkg": "./dist/hive-ng.global.js",
|
|
13
|
+
"jsdelivr": "./dist/hive-ng.global.js",
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"import": "./dist/index.js",
|
|
21
|
+
"require": "./dist/index.cjs"
|
|
22
|
+
},
|
|
23
|
+
"./react": {
|
|
24
|
+
"types": "./dist/react/index.d.ts",
|
|
25
|
+
"import": "./dist/react/index.js",
|
|
26
|
+
"require": "./dist/react/index.cjs"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist",
|
|
31
|
+
"README.md"
|
|
32
|
+
],
|
|
33
|
+
"scripts": {
|
|
34
|
+
"prepack": "pnpm run build",
|
|
35
|
+
"build": "tsc --noEmit && tsup",
|
|
36
|
+
"test": "vitest run"
|
|
37
|
+
},
|
|
38
|
+
"keywords": [
|
|
39
|
+
"hive-ng",
|
|
40
|
+
"hiveng",
|
|
41
|
+
"sdk",
|
|
42
|
+
"game",
|
|
43
|
+
"auth",
|
|
44
|
+
"browser",
|
|
45
|
+
"web"
|
|
46
|
+
],
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@bufbuild/protobuf": "^2.12.0",
|
|
49
|
+
"@connectrpc/connect": "^2.1.0",
|
|
50
|
+
"@connectrpc/connect-web": "^2.1.0"
|
|
51
|
+
},
|
|
52
|
+
"peerDependencies": {
|
|
53
|
+
"react": ">=18"
|
|
54
|
+
},
|
|
55
|
+
"peerDependenciesMeta": {
|
|
56
|
+
"react": {
|
|
57
|
+
"optional": true
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@testing-library/react": "^16.1.0",
|
|
62
|
+
"@types/react": "^18.3.0",
|
|
63
|
+
"jsdom": "^26.1.0",
|
|
64
|
+
"react": "^18.3.0",
|
|
65
|
+
"react-dom": "^18.3.0",
|
|
66
|
+
"tsup": "^8.3.0",
|
|
67
|
+
"typescript": "^5.8.0",
|
|
68
|
+
"vitest": "^3.2.0"
|
|
69
|
+
}
|
|
70
|
+
}
|