@vasanthcambium/marketplace-auth 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.
Files changed (78) hide show
  1. package/README.md +84 -0
  2. package/dist/browser/client.d.ts +3 -0
  3. package/dist/browser/client.d.ts.map +1 -0
  4. package/dist/browser/client.js +74 -0
  5. package/dist/browser/client.js.map +1 -0
  6. package/dist/browser/index.d.ts +12 -0
  7. package/dist/browser/index.d.ts.map +1 -0
  8. package/dist/browser/index.js +10 -0
  9. package/dist/browser/index.js.map +1 -0
  10. package/dist/browser/types.d.ts +19 -0
  11. package/dist/browser/types.d.ts.map +1 -0
  12. package/dist/browser/types.js +2 -0
  13. package/dist/browser/types.js.map +1 -0
  14. package/dist/index.d.ts +16 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +2 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/react/AppProvider.d.ts +9 -0
  19. package/dist/react/AppProvider.d.ts.map +1 -0
  20. package/dist/react/AppProvider.js +36 -0
  21. package/dist/react/AppProvider.js.map +1 -0
  22. package/dist/react/index.d.ts +13 -0
  23. package/dist/react/index.d.ts.map +1 -0
  24. package/dist/react/index.js +12 -0
  25. package/dist/react/index.js.map +1 -0
  26. package/dist/react/useAccount.d.ts +9 -0
  27. package/dist/react/useAccount.d.ts.map +1 -0
  28. package/dist/react/useAccount.js +16 -0
  29. package/dist/react/useAccount.js.map +1 -0
  30. package/dist/react/useNBI.d.ts +10 -0
  31. package/dist/react/useNBI.d.ts.map +1 -0
  32. package/dist/react/useNBI.js +15 -0
  33. package/dist/react/useNBI.js.map +1 -0
  34. package/dist/react/useNBIMutation.d.ts +15 -0
  35. package/dist/react/useNBIMutation.d.ts.map +1 -0
  36. package/dist/react/useNBIMutation.js +31 -0
  37. package/dist/react/useNBIMutation.js.map +1 -0
  38. package/dist/react/useSession.d.ts +8 -0
  39. package/dist/react/useSession.d.ts.map +1 -0
  40. package/dist/react/useSession.js +22 -0
  41. package/dist/react/useSession.js.map +1 -0
  42. package/dist/server/createApp.d.ts +3 -0
  43. package/dist/server/createApp.d.ts.map +1 -0
  44. package/dist/server/createApp.js +201 -0
  45. package/dist/server/createApp.js.map +1 -0
  46. package/dist/server/express.d.ts +11 -0
  47. package/dist/server/express.d.ts.map +1 -0
  48. package/dist/server/express.js +86 -0
  49. package/dist/server/express.js.map +1 -0
  50. package/dist/server/hono.d.ts +4 -0
  51. package/dist/server/hono.d.ts.map +1 -0
  52. package/dist/server/hono.js +66 -0
  53. package/dist/server/hono.js.map +1 -0
  54. package/dist/server/index.d.ts +21 -0
  55. package/dist/server/index.d.ts.map +1 -0
  56. package/dist/server/index.js +19 -0
  57. package/dist/server/index.js.map +1 -0
  58. package/dist/server/session.d.ts +15 -0
  59. package/dist/server/session.d.ts.map +1 -0
  60. package/dist/server/session.js +20 -0
  61. package/dist/server/session.js.map +1 -0
  62. package/dist/server/types.d.ts +60 -0
  63. package/dist/server/types.d.ts.map +1 -0
  64. package/dist/server/types.js +2 -0
  65. package/dist/server/types.js.map +1 -0
  66. package/dist/shared/errors.d.ts +33 -0
  67. package/dist/shared/errors.d.ts.map +1 -0
  68. package/dist/shared/errors.js +59 -0
  69. package/dist/shared/errors.js.map +1 -0
  70. package/dist/shared/regions.d.ts +3 -0
  71. package/dist/shared/regions.d.ts.map +1 -0
  72. package/dist/shared/regions.js +13 -0
  73. package/dist/shared/regions.js.map +1 -0
  74. package/dist/shared/types.d.ts +41 -0
  75. package/dist/shared/types.d.ts.map +1 -0
  76. package/dist/shared/types.js +7 -0
  77. package/dist/shared/types.js.map +1 -0
  78. package/package.json +58 -0
package/README.md ADDED
@@ -0,0 +1,84 @@
1
+ # @cmbmwifi/marketplace-auth
2
+
3
+ Auth library for [MarketApps Platform](https://developers.apps.cloud.cambiumnetworks.com/api/docs) apps. One install gives you the BFF helper, browser fetch wrapper, and React hooks.
4
+
5
+ ```bash
6
+ npm install @cmbmwifi/marketplace-auth
7
+ ```
8
+
9
+ ## Three subpath exports, one package
10
+
11
+ ```ts
12
+ // In your BFF (Node)
13
+ import { createApp, expressMiddleware } from '@cmbmwifi/marketplace-auth/server';
14
+
15
+ // In your SPA (Browser, no React)
16
+ import { createBridge } from '@cmbmwifi/marketplace-auth/browser';
17
+
18
+ // In your SPA (React)
19
+ import { AppProvider, useNBI } from '@cmbmwifi/marketplace-auth/react';
20
+ ```
21
+
22
+ The browser bundle never imports server code; the server bundle never imports DOM-only code. Tree-shaking is automatic.
23
+
24
+ ## Server (BFF)
25
+
26
+ ```ts
27
+ import express from 'express';
28
+ import { createApp, expressMiddleware } from '@cmbmwifi/marketplace-auth/server';
29
+
30
+ const cn = createApp({
31
+ appId: 'my-app',
32
+ region: 'us-east-1',
33
+ authServiceUrl: 'https://auth.cloud.cambiumnetworks.com',
34
+ appCredentials: {
35
+ clientId: process.env.CN_APP_CLIENT_ID!,
36
+ clientSecret: process.env.CN_APP_CLIENT_SECRET!,
37
+ },
38
+ });
39
+
40
+ const server = express();
41
+ server.use(expressMiddleware(cn)); // installs /launch + /api/* + /healthz + /logout
42
+ server.listen(5174);
43
+ ```
44
+
45
+ Hono adapter: `import { honoMiddleware } from '@cmbmwifi/marketplace-auth/server'`.
46
+
47
+ ## Browser
48
+
49
+ ```ts
50
+ import { createBridge } from '@cmbmwifi/marketplace-auth/browser';
51
+
52
+ const cn = createBridge({ baseUrl: '/' });
53
+
54
+ interface DeviceList { devices: { id: string; name: string }[] }
55
+
56
+ const data = await cn.fetch<DeviceList>('/api/v2/devices');
57
+ ```
58
+
59
+ ## React
60
+
61
+ ```tsx
62
+ import { AppProvider, useNBI } from '@cmbmwifi/marketplace-auth/react';
63
+
64
+ function Devices() {
65
+ const { data, error, isLoading } = useNBI<DeviceList>('/api/v2/devices');
66
+ if (isLoading) return <Spinner />;
67
+ if (error) return <ErrorBanner error={error} />;
68
+ return <DeviceTable rows={data!.devices} />;
69
+ }
70
+
71
+ export default function App() {
72
+ return (
73
+ <AppProvider config={{ baseUrl: '/' }}>
74
+ <Devices />
75
+ </AppProvider>
76
+ );
77
+ }
78
+ ```
79
+
80
+ Full documentation: [https://developers.apps.cloud.cambiumnetworks.com/api/docs/reference/sdk](https://developers.apps.cloud.cambiumnetworks.com/api/docs/reference/sdk)
81
+
82
+ ## License
83
+
84
+ Apache-2.0 © Cambium Networks, Ltd.
@@ -0,0 +1,3 @@
1
+ import type { Bridge, BridgeConfig } from './types.js';
2
+ export declare function createBridge(config?: BridgeConfig): Bridge;
3
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/browser/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAEnE,wBAAgB,YAAY,CAAC,MAAM,GAAE,YAAiB,GAAG,MAAM,CAkE9D"}
@@ -0,0 +1,74 @@
1
+ import { BridgeHttpError, SessionExpiredError } from '../shared/errors.js';
2
+ export function createBridge(config = {}) {
3
+ const baseUrl = (config.baseUrl ?? '/').replace(/\/$/, '');
4
+ const refreshOn401 = config.refreshOn401 ?? true;
5
+ const retryDelayMs = config.retryDelayMs ?? 250;
6
+ const expiredCbs = new Set();
7
+ let cachedSession = null;
8
+ void warmSession();
9
+ async function warmSession() {
10
+ try {
11
+ const res = await fetch(`${baseUrl}/api/v2/me`, { credentials: 'same-origin' });
12
+ if (res.ok)
13
+ cachedSession = await res.json().catch(() => null);
14
+ }
15
+ catch { /* swallow */ }
16
+ }
17
+ async function rawFetch(input, init) {
18
+ const url = typeof input === 'string' ? `${baseUrl}${input}` : input;
19
+ const headers = {};
20
+ // Headers is iterable as [name, value] pairs.
21
+ new Headers(init?.headers).forEach((v, k) => { headers[k] = v; });
22
+ if (init?.body && !(init.body instanceof FormData) && !headers['content-type']) {
23
+ headers['content-type'] = 'application/json';
24
+ }
25
+ return fetch(url, {
26
+ ...init,
27
+ headers,
28
+ credentials: init?.credentials ?? 'same-origin',
29
+ });
30
+ }
31
+ return {
32
+ async fetch(input, init) {
33
+ let res = await rawFetch(input, init);
34
+ const method = (init?.method ?? 'GET').toUpperCase();
35
+ const isIdempotent = ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE'].includes(method);
36
+ if (res.status === 401 && refreshOn401 && isIdempotent) {
37
+ await delay(retryDelayMs);
38
+ res = await rawFetch(input, init);
39
+ }
40
+ if (res.status === 401) {
41
+ expiredCbs.forEach((cb) => { try {
42
+ cb();
43
+ }
44
+ catch { /* ignore */ } });
45
+ throw new SessionExpiredError();
46
+ }
47
+ if (!res.ok) {
48
+ let body;
49
+ try {
50
+ body = await res.clone().json();
51
+ }
52
+ catch {
53
+ body = await res.text();
54
+ }
55
+ throw new BridgeHttpError(res.status, res.statusText, body);
56
+ }
57
+ if (init?.parseJson === false)
58
+ return res;
59
+ const ct = res.headers.get('content-type') ?? '';
60
+ if (!ct.includes('json'))
61
+ return res;
62
+ return res.json();
63
+ },
64
+ session() { return cachedSession; },
65
+ onSessionExpired(cb) {
66
+ expiredCbs.add(cb);
67
+ return () => expiredCbs.delete(cb);
68
+ },
69
+ };
70
+ }
71
+ function delay(ms) {
72
+ return new Promise((r) => setTimeout(r, ms));
73
+ }
74
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/browser/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @cmbmwifi/marketplace-auth/browser — Browser fetch wrapper.
3
+ *
4
+ * import { createBridge } from '@cmbmwifi/marketplace-auth/browser';
5
+ *
6
+ * Talks to your BFF same-origin. Never directly to the cnMaestro NBI.
7
+ */
8
+ export { createBridge } from './client.js';
9
+ export type { Bridge, BridgeConfig, BridgeInit } from './types.js';
10
+ export type { Session } from '../shared/types.js';
11
+ export { BridgeHttpError, SessionExpiredError } from '../shared/errors.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @cmbmwifi/marketplace-auth/browser — Browser fetch wrapper.
3
+ *
4
+ * import { createBridge } from '@cmbmwifi/marketplace-auth/browser';
5
+ *
6
+ * Talks to your BFF same-origin. Never directly to the cnMaestro NBI.
7
+ */
8
+ export { createBridge } from './client.js';
9
+ export { BridgeHttpError, SessionExpiredError } from '../shared/errors.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { Session } from '../shared/types.js';
2
+ export interface BridgeConfig {
3
+ /** Base URL for the BFF. Default '/'. */
4
+ baseUrl?: string;
5
+ /** Retry once on 401 after a delay (the BFF will refresh transparently). Default true. */
6
+ refreshOn401?: boolean;
7
+ /** Delay before the retry, in ms. Default 250. */
8
+ retryDelayMs?: number;
9
+ }
10
+ export interface BridgeInit extends RequestInit {
11
+ /** Parse the response as JSON. Default true. */
12
+ parseJson?: boolean;
13
+ }
14
+ export interface Bridge {
15
+ fetch<T = unknown>(input: string | URL, init?: BridgeInit): Promise<T>;
16
+ session(): Session | null;
17
+ onSessionExpired(cb: () => void): () => void;
18
+ }
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/browser/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0FAA0F;IAC1F,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,gDAAgD;IAChD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvE,OAAO,IAAI,OAAO,GAAG,IAAI,CAAC;IAC1B,gBAAgB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC9C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/browser/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @cmbmwifi/marketplace-auth — root barrel.
3
+ *
4
+ * Most consumers import from a specific subpath instead so they get only the
5
+ * code they need (and the type system enforces the right environment):
6
+ *
7
+ * import { createApp } from '@cmbmwifi/marketplace-auth/server';
8
+ * import { createBridge } from '@cmbmwifi/marketplace-auth/browser';
9
+ * import { AppProvider, useNBI } from '@cmbmwifi/marketplace-auth/react';
10
+ *
11
+ * The root export here re-exports only the SHARED public types so both halves
12
+ * can talk about the same Session, ApiRoute, etc.
13
+ */
14
+ export type { ApiRoute, Permission, Region, Session, UserRole, } from './shared/types.js';
15
+ export { AuthError, NonceVerificationError, TokenExchangeError, SessionNotFoundError, UpstreamError, BridgeHttpError, SessionExpiredError, } from './shared/errors.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,YAAY,EACV,QAAQ,EACR,UAAU,EACV,MAAM,EACN,OAAO,EACP,QAAQ,GACT,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,mBAAmB,GACpB,MAAM,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { AuthError, NonceVerificationError, TokenExchangeError, SessionNotFoundError, UpstreamError, BridgeHttpError, SessionExpiredError, } from './shared/errors.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAqBA,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,mBAAmB,GACpB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { Bridge, BridgeConfig } from '../browser/types.js';
3
+ export interface AppProviderProps {
4
+ config: BridgeConfig;
5
+ children: ReactNode;
6
+ }
7
+ export declare function AppProvider({ config, children }: AppProviderProps): import("react/jsx-runtime").JSX.Element | null;
8
+ export declare function useBridge(): Bridge;
9
+ //# sourceMappingURL=AppProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppProvider.d.ts","sourceRoot":"","sources":["../../src/react/AppProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEhG,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIhE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,gBAAgB,kDA0BjE;AAED,wBAAgB,SAAS,IAAI,MAAM,CAIlC"}
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useEffect, useMemo, useState } from 'react';
3
+ import { createBridge } from '../browser/client.js';
4
+ const BridgeCtx = createContext(null);
5
+ export function AppProvider({ config, children }) {
6
+ const bridge = useMemo(() => createBridge(config), []); // eslint-disable-line react-hooks/exhaustive-deps
7
+ const [launched, setLaunched] = useState(false);
8
+ useEffect(() => {
9
+ const url = new URL(window.location.href);
10
+ const token = url.searchParams.get('token') ?? url.searchParams.get('nonce');
11
+ if (!token) {
12
+ setLaunched(true);
13
+ return;
14
+ }
15
+ void fetch(`${(config.baseUrl ?? '/').replace(/\/$/, '')}/launch?token=${encodeURIComponent(token)}`, {
16
+ credentials: 'same-origin',
17
+ redirect: 'follow',
18
+ })
19
+ .then(() => {
20
+ url.searchParams.delete('token');
21
+ url.searchParams.delete('nonce');
22
+ window.history.replaceState({}, '', url.toString());
23
+ })
24
+ .finally(() => setLaunched(true));
25
+ }, [config.baseUrl]);
26
+ if (!launched)
27
+ return null;
28
+ return _jsx(BridgeCtx.Provider, { value: bridge, children: children });
29
+ }
30
+ export function useBridge() {
31
+ const v = useContext(BridgeCtx);
32
+ if (!v)
33
+ throw new Error('useBridge must be called inside <AppProvider>');
34
+ return v;
35
+ }
36
+ //# sourceMappingURL=AppProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppProvider.js","sourceRoot":"","sources":["../../src/react/AppProvider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAChG,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,MAAM,SAAS,GAAG,aAAa,CAAgB,IAAI,CAAC,CAAC;AAOrD,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAoB;IAChE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kDAAkD;IAC1G,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7E,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QACD,KAAK,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAAE;YACpG,WAAW,EAAE,aAAa;YAC1B,QAAQ,EAAE,QAAQ;SACnB,CAAC;aACC,IAAI,CAAC,GAAG,EAAE;YACT,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAErB,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,OAAO,KAAC,SAAS,CAAC,QAAQ,IAAC,KAAK,EAAE,MAAM,YAAG,QAAQ,GAAsB,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAChC,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACzE,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @cmbmwifi/marketplace-auth/react — React hooks layered on the browser fetch wrapper.
3
+ *
4
+ * import { AppProvider, useNBI } from '@cmbmwifi/marketplace-auth/react';
5
+ */
6
+ export { AppProvider, useBridge } from './AppProvider.js';
7
+ export { useSession } from './useSession.js';
8
+ export { useNBI } from './useNBI.js';
9
+ export { useNBIMutation } from './useNBIMutation.js';
10
+ export { useAccount, useUser } from './useAccount.js';
11
+ export type { AppProviderProps } from './AppProvider.js';
12
+ export { BridgeHttpError, SessionExpiredError } from '../shared/errors.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEtD,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @cmbmwifi/marketplace-auth/react — React hooks layered on the browser fetch wrapper.
3
+ *
4
+ * import { AppProvider, useNBI } from '@cmbmwifi/marketplace-auth/react';
5
+ */
6
+ export { AppProvider, useBridge } from './AppProvider.js';
7
+ export { useSession } from './useSession.js';
8
+ export { useNBI } from './useNBI.js';
9
+ export { useNBIMutation } from './useNBIMutation.js';
10
+ export { useAccount, useUser } from './useAccount.js';
11
+ export { BridgeHttpError, SessionExpiredError } from '../shared/errors.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare function useAccount(): {
2
+ cambiumId: string | null;
3
+ accountName: string | null;
4
+ };
5
+ export declare function useUser(): {
6
+ email: string | null;
7
+ role: string | null;
8
+ };
9
+ //# sourceMappingURL=useAccount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAccount.d.ts","sourceRoot":"","sources":["../../src/react/useAccount.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,IAAI;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAMrF;AAED,wBAAgB,OAAO,IAAI;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAMvE"}
@@ -0,0 +1,16 @@
1
+ import { useSession } from './useSession.js';
2
+ export function useAccount() {
3
+ const { session } = useSession();
4
+ return {
5
+ cambiumId: session?.accountCid ?? null,
6
+ accountName: null, // Reserved for v0.2 once /healthz exposes it.
7
+ };
8
+ }
9
+ export function useUser() {
10
+ const { session } = useSession();
11
+ return {
12
+ email: null, // Reserved for v0.2.
13
+ role: session?.userRole ?? null,
14
+ };
15
+ }
16
+ //# sourceMappingURL=useAccount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAccount.js","sourceRoot":"","sources":["../../src/react/useAccount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,UAAU,UAAU;IACxB,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAAC;IACjC,OAAO;QACL,SAAS,EAAI,OAAO,EAAE,UAAU,IAAI,IAAI;QACxC,WAAW,EAAE,IAAI,EAAa,8CAA8C;KAC7E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAAC;IACjC,OAAO;QACL,KAAK,EAAE,IAAI,EAAmB,qBAAqB;QACnD,IAAI,EAAG,OAAO,EAAE,QAAQ,IAAI,IAAI;KACjC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type SWRConfiguration, type SWRResponse } from 'swr';
2
+ export interface UseNBIResult<T> extends SWRResponse<T, Error> {
3
+ isLoading: boolean;
4
+ }
5
+ /**
6
+ * Read from the cnMaestro NBI through your BFF. SWR-backed.
7
+ * Pass `null` as the path to skip the fetch.
8
+ */
9
+ export declare function useNBI<T = unknown>(path: string | null, options?: SWRConfiguration<T, Error>): UseNBIResult<T>;
10
+ //# sourceMappingURL=useNBI.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNBI.d.ts","sourceRoot":"","sources":["../../src/react/useNBI.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,KAAK,CAAC;AAGtE,MAAM,WAAW,YAAY,CAAC,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC;IAC5D,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,CAAC,GAAG,OAAO,EAChC,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,OAAO,CAAC,EAAE,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,GACnC,YAAY,CAAC,CAAC,CAAC,CAWjB"}
@@ -0,0 +1,15 @@
1
+ import useSWR from 'swr';
2
+ import { useBridge } from './AppProvider.js';
3
+ /**
4
+ * Read from the cnMaestro NBI through your BFF. SWR-backed.
5
+ * Pass `null` as the path to skip the fetch.
6
+ */
7
+ export function useNBI(path, options) {
8
+ const bridge = useBridge();
9
+ const swr = useSWR(path, (key) => bridge.fetch(key), options);
10
+ return {
11
+ ...swr,
12
+ isLoading: !swr.data && !swr.error && path !== null,
13
+ };
14
+ }
15
+ //# sourceMappingURL=useNBI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNBI.js","sourceRoot":"","sources":["../../src/react/useNBI.ts"],"names":[],"mappings":"AAAA,OAAO,MAAmD,MAAM,KAAK,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAM7C;;;GAGG;AACH,MAAM,UAAU,MAAM,CACpB,IAAmB,EACnB,OAAoC;IAEpC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,CAChB,IAAI,EACJ,CAAC,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAI,GAAG,CAAC,EACrC,OAAO,CACR,CAAC;IACF,OAAO;QACL,GAAG,GAAG;QACN,SAAS,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,KAAK,IAAI;KACpD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ type Method = 'POST' | 'PUT' | 'PATCH' | 'DELETE';
2
+ export interface UseNBIMutationResult<TResponse, TBody> {
3
+ trigger: (body?: TBody) => Promise<TResponse>;
4
+ isPending: boolean;
5
+ error: Error | null;
6
+ reset: () => void;
7
+ }
8
+ export interface UseNBIMutationOptions<TResponse> {
9
+ onMutate?: () => Promise<void> | void;
10
+ onSuccess?: (data: TResponse) => Promise<void> | void;
11
+ onError?: (err: Error) => Promise<void> | void;
12
+ }
13
+ export declare function useNBIMutation<TResponse = unknown, TBody = unknown>(path: string, method?: Method, options?: UseNBIMutationOptions<TResponse>): UseNBIMutationResult<TResponse, TBody>;
14
+ export {};
15
+ //# sourceMappingURL=useNBIMutation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNBIMutation.d.ts","sourceRoot":"","sources":["../../src/react/useNBIMutation.ts"],"names":[],"mappings":"AAGA,KAAK,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAElD,MAAM,WAAW,oBAAoB,CAAC,SAAS,EAAE,KAAK;IACpD,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9C,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB,CAAC,SAAS;IAC9C,QAAQ,CAAC,EAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACvC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACtD,OAAO,CAAC,EAAI,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAClD;AAED,wBAAgB,cAAc,CAAC,SAAS,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,EACjE,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAe,EACvB,OAAO,GAAE,qBAAqB,CAAC,SAAS,CAAM,GAC7C,oBAAoB,CAAC,SAAS,EAAE,KAAK,CAAC,CA6BxC"}
@@ -0,0 +1,31 @@
1
+ import { useCallback, useState } from 'react';
2
+ import { useBridge } from './AppProvider.js';
3
+ export function useNBIMutation(path, method = 'POST', options = {}) {
4
+ const bridge = useBridge();
5
+ const [isPending, setIsPending] = useState(false);
6
+ const [error, setError] = useState(null);
7
+ const trigger = useCallback(async (body) => {
8
+ setIsPending(true);
9
+ setError(null);
10
+ try {
11
+ await options.onMutate?.();
12
+ const init = { method };
13
+ if (body != null)
14
+ init.body = JSON.stringify(body);
15
+ const data = await bridge.fetch(path, init);
16
+ await options.onSuccess?.(data);
17
+ return data;
18
+ }
19
+ catch (err) {
20
+ const e = err instanceof Error ? err : new Error(String(err));
21
+ setError(e);
22
+ await options.onError?.(e);
23
+ throw e;
24
+ }
25
+ finally {
26
+ setIsPending(false);
27
+ }
28
+ }, [bridge, path, method, options]);
29
+ return { trigger, isPending, error, reset: () => setError(null) };
30
+ }
31
+ //# sourceMappingURL=useNBIMutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNBIMutation.js","sourceRoot":"","sources":["../../src/react/useNBIMutation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAiB7C,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,SAAiB,MAAM,EACvB,UAA4C,EAAE;IAE9C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAK,QAAQ,CAAC,GAAM,QAAQ,CAAe,IAAI,CAAC,CAAC;IAE7D,MAAM,OAAO,GAAG,WAAW,CACzB,KAAK,EAAE,IAAY,EAAsB,EAAE;QACzC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAsC,EAAE,MAAM,EAAE,CAAC;YAC3D,IAAI,IAAI,IAAI,IAAI;gBAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAAY,IAAI,EAAE,IAAI,CAAC,CAAC;YACvD,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9D,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,CAAC,CAAC;QACV,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EACD,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAChC,CAAC;IAEF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;AACpE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Session } from '../shared/types.js';
2
+ export interface UseSessionResult {
3
+ session: Session | null;
4
+ isReady: boolean;
5
+ error: Error | null;
6
+ }
7
+ export declare function useSession(): UseSessionResult;
8
+ //# sourceMappingURL=useSession.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSession.d.ts","sourceRoot":"","sources":["../../src/react/useSession.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED,wBAAgB,UAAU,IAAI,gBAAgB,CAmB7C"}
@@ -0,0 +1,22 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { useBridge } from './AppProvider.js';
3
+ export function useSession() {
4
+ const bridge = useBridge();
5
+ const [state, setState] = useState({
6
+ session: bridge.session(),
7
+ isReady: bridge.session() !== null,
8
+ error: null,
9
+ });
10
+ useEffect(() => {
11
+ if (state.session)
12
+ return;
13
+ let mounted = true;
14
+ bridge
15
+ .fetch('/api/v2/me')
16
+ .then((s) => mounted && setState({ session: s, isReady: true, error: null }))
17
+ .catch((err) => mounted && setState({ session: null, isReady: true, error: err }));
18
+ return () => { mounted = false; };
19
+ }, [bridge, state.session]);
20
+ return state;
21
+ }
22
+ //# sourceMappingURL=useSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSession.js","sourceRoot":"","sources":["../../src/react/useSession.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAQ7C,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAmB;QACnD,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI;QAClC,KAAK,EAAI,IAAI;KACd,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,MAAM;aACH,KAAK,CAAU,YAAY,CAAC;aAC5B,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;aAC5E,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE,CAAC,OAAO,IAAI,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC5F,OAAO,GAAG,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5B,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { App, AppConfig } from './types.js';
2
+ export declare function createApp(config: AppConfig): App;
3
+ //# sourceMappingURL=createApp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createApp.d.ts","sourceRoot":"","sources":["../../src/server/createApp.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAA6C,MAAM,YAAY,CAAC;AAM5F,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,GAAG,CAqKhD"}