@mission_sciences/provider-sdk 0.3.0 → 0.4.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 CHANGED
@@ -122,7 +122,10 @@ npm install @mission_sciences/provider-sdk
122
122
  import { MarketplaceSDK } from '@mission_sciences/provider-sdk';
123
123
 
124
124
  const sdk = new MarketplaceSDK({
125
- jwksUri: '/.well-known/jwks.json',
125
+ // REQUIRED: Environment-aware JWKS URL for JWT signature validation
126
+ jwksUri: 'https://api.dev.generalwisdom.com/.well-known/jwks.json',
127
+ // REQUIRED: Environment-aware marketplace URL for session end redirects
128
+ marketplaceUrl: 'https://dev.generalwisdom.com/',
126
129
  applicationId: 'my-app',
127
130
  autoStart: true,
128
131
  warningThresholdSeconds: 120,
@@ -178,7 +181,10 @@ function useMarketplaceSession() {
178
181
 
179
182
  useEffect(() => {
180
183
  const sdk = new MarketplaceSDK({
181
- jwksUri: '/.well-known/jwks.json',
184
+ // REQUIRED: Environment-aware JWKS URL for JWT signature validation
185
+ jwksUri: 'https://api.dev.generalwisdom.com/.well-known/jwks.json',
186
+ // REQUIRED: Environment-aware marketplace URL for session end redirects
187
+ marketplaceUrl: 'https://dev.generalwisdom.com/',
182
188
  applicationId: 'my-react-app',
183
189
  autoStart: true,
184
190
  hooks: {
@@ -249,8 +255,10 @@ See [examples/auth-integration/README.md](./examples/auth-integration/README.md)
249
255
 
250
256
  ```typescript
251
257
  interface SDKConfig {
252
- // JWT & Validation
253
- jwksUri?: string; // JWKS endpoint (default: GW production endpoint)
258
+ // JWT & Validation (REQUIRED)
259
+ jwksUri: string; // REQUIRED: Environment-aware JWKS endpoint (NO default)
260
+ marketplaceUrl: string; // REQUIRED: Environment-aware marketplace URL for redirects (NO default)
261
+
254
262
  jwtParamName?: string; // URL query parameter name (default: 'gwSession')
255
263
  applicationId?: string; // Your application ID
256
264
  useBackendValidation?: boolean; // Use backend instead of JWKS (default: false)
@@ -258,7 +266,6 @@ interface SDKConfig {
258
266
  // Session Behavior
259
267
  autoStart?: boolean; // Auto-start from URL JWT (default: true)
260
268
  warningThresholdSeconds?: number; // Warning before expiry (default: 300)
261
- marketplaceUrl?: string; // Redirect URL after session end
262
269
 
263
270
  // Lifecycle Hooks
264
271
  hooks?: {
@@ -281,6 +288,18 @@ interface SDKConfig {
281
288
  }
282
289
  ```
283
290
 
291
+ ### Environment-Specific URLs (REQUIRED)
292
+
293
+ ⚠️ **Breaking Change (v0.4.0+)**: `jwksUri` and `marketplaceUrl` are now **required** and have **no default values**. Previous versions silently defaulted to production URLs, which caused dev/demo sessions to fail JWT validation. You must explicitly provide environment-aware values.
294
+
295
+ | Environment | `jwksUri` | `marketplaceUrl` |
296
+ |-------------|-----------|------------------|
297
+ | **dev** | `https://api.dev.generalwisdom.com/.well-known/jwks.json` | `https://dev.generalwisdom.com/` |
298
+ | **demo** | `https://api.demo.generalwisdom.com/.well-known/jwks.json` | `https://demo.generalwisdom.com/` |
299
+ | **prod** | `https://api.platform.generalwisdom.com/.well-known/jwks.json` | `https://platform.generalwisdom.com/` |
300
+
301
+ **Why this matters:** The SDK validates session JWTs using the JWKS endpoint. If you pass a dev JWT but point `jwksUri` at production, signature validation will fail. Similarly, `marketplaceUrl` determines where users are redirected when their session ends — pointing at the wrong environment breaks the session lifecycle.
302
+
284
303
  ## API Reference
285
304
 
286
305
  ### MarketplaceSDK
@@ -1,11 +1,12 @@
1
- import { useState as a, useRef as d, useEffect as K, useCallback as i } from "react";
2
- import { MarketplaceSDK as W } from "../../../core/MarketplaceSDK";
3
- function x(e) {
4
- const [m, S] = a(null), [f, c] = a(!0), [T, l] = a(null), [g, w] = a(0), [h, b] = a("0:00"), [k, E] = a("0:00:00"), [y, s] = a(!1), n = d(null), u = d(null);
1
+ import { useState as a, useRef as m, useEffect as K, useCallback as i } from "react";
2
+ import { MarketplaceSDK as U } from "../../../core/MarketplaceSDK";
3
+ function F(e) {
4
+ const [d, S] = a(null), [f, c] = a(!0), [T, l] = a(null), [g, k] = a(0), [w, h] = a("0:00"), [b, E] = a("0:00:00"), [y, s] = a(!1), n = m(null), u = m(null);
5
5
  K(() => ((async () => {
6
6
  try {
7
- const r = new W({
7
+ const r = new U({
8
8
  jwksUri: e.jwksUri,
9
+ marketplaceUrl: e.marketplaceUrl,
9
10
  apiEndpoint: e.apiEndpoint,
10
11
  debug: e.debug,
11
12
  autoStart: e.autoStart,
@@ -28,7 +29,7 @@ function x(e) {
28
29
  }), r.on("onError", (t) => {
29
30
  l(t.message), c(!1), e.onError?.(t);
30
31
  }), n.current = r, await r.initialize(), u.current = window.setInterval(() => {
31
- n.current && (w(n.current.getRemainingTime()), b(n.current.getFormattedTime()), E(n.current.getFormattedTimeWithHours()), s(n.current.isTimerRunning()));
32
+ n.current && (k(n.current.getRemainingTime()), h(n.current.getFormattedTime()), E(n.current.getFormattedTimeWithHours()), s(n.current.isTimerRunning()));
32
33
  }, 1e3);
33
34
  } catch (r) {
34
35
  const t = r instanceof Error ? r.message : "Unknown error";
@@ -53,12 +54,12 @@ function x(e) {
53
54
  await n.current.completeSession(o);
54
55
  }, []);
55
56
  return {
56
- session: m,
57
+ session: d,
57
58
  loading: f,
58
59
  error: T,
59
60
  remainingTime: g,
60
- formattedTime: h,
61
- formattedTimeWithHours: k,
61
+ formattedTime: w,
62
+ formattedTimeWithHours: b,
62
63
  isTimerRunning: y,
63
64
  startTimer: R,
64
65
  pauseTimer: H,
@@ -70,6 +71,6 @@ function x(e) {
70
71
  };
71
72
  }
72
73
  export {
73
- x as useMarketplaceSession
74
+ F as useMarketplaceSession
74
75
  };
75
76
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/adapters/react/useMarketplaceSession.ts"],"sourcesContent":["import { useEffect, useState, useCallback, useRef } from 'react';\nimport { MarketplaceSDK } from '../../core/MarketplaceSDK';\nimport type { SDKConfig, SessionData } from '../../types';\n\nexport interface UseMarketplaceSessionOptions extends Omit<SDKConfig, 'hooks'> {\n onSessionStart?: (data: SessionData) => void;\n onSessionWarning?: (data: { remainingSeconds: number }) => void;\n onSessionEnd?: () => void;\n onError?: (error: Error) => void;\n hooks?: SDKConfig['hooks'];\n}\n\nexport interface UseMarketplaceSessionReturn {\n session: SessionData | null;\n loading: boolean;\n error: string | null;\n remainingTime: number;\n formattedTime: string;\n formattedTimeWithHours: string;\n isTimerRunning: boolean;\n startTimer: () => void;\n pauseTimer: () => void;\n resumeTimer: () => void;\n endSession: () => void;\n extendSession: (minutes: number) => Promise<void>;\n completeSession: (actualUsageMinutes?: number) => Promise<void>;\n sdk: MarketplaceSDK | null;\n}\n\nexport function useMarketplaceSession(\n options: UseMarketplaceSessionOptions\n): UseMarketplaceSessionReturn {\n const [session, setSession] = useState<SessionData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [remainingTime, setRemainingTime] = useState(0);\n const [formattedTime, setFormattedTime] = useState('0:00');\n const [formattedTimeWithHours, setFormattedTimeWithHours] = useState('0:00:00');\n const [isTimerRunning, setIsTimerRunning] = useState(false);\n\n const sdkRef = useRef<MarketplaceSDK | null>(null);\n const intervalRef = useRef<number | null>(null);\n\n useEffect(() => {\n const initializeSDK = async () => {\n try {\n const sdk = new MarketplaceSDK({\n jwksUri: options.jwksUri,\n apiEndpoint: options.apiEndpoint,\n debug: options.debug,\n autoStart: options.autoStart,\n warningThresholdSeconds: options.warningThresholdSeconds,\n customStyles: options.customStyles,\n applicationId: options.applicationId,\n enableHeartbeat: options.enableHeartbeat ?? false,\n heartbeatIntervalSeconds: options.heartbeatIntervalSeconds ?? 30,\n enableTabSync: options.enableTabSync ?? false,\n pauseOnHidden: options.pauseOnHidden ?? false,\n useBackendValidation: options.useBackendValidation ?? false,\n hooks: options.hooks,\n });\n\n sdk.on('onSessionStart', (data) => {\n setSession(data);\n setLoading(false);\n setIsTimerRunning(sdk.isTimerRunning());\n options.onSessionStart?.(data);\n });\n\n sdk.on('onSessionWarning', (data) => {\n options.onSessionWarning?.(data);\n });\n\n sdk.on('onSessionEnd', () => {\n setIsTimerRunning(false);\n options.onSessionEnd?.();\n });\n\n sdk.on('onError', (err) => {\n setError(err.message);\n setLoading(false);\n options.onError?.(err);\n });\n\n sdkRef.current = sdk;\n await sdk.initialize();\n\n intervalRef.current = window.setInterval(() => {\n if (sdkRef.current) {\n setRemainingTime(sdkRef.current.getRemainingTime());\n setFormattedTime(sdkRef.current.getFormattedTime());\n setFormattedTimeWithHours(sdkRef.current.getFormattedTimeWithHours());\n setIsTimerRunning(sdkRef.current.isTimerRunning());\n }\n }, 1000);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n setError(errorMessage);\n setLoading(false);\n }\n };\n\n initializeSDK();\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n if (sdkRef.current) {\n sdkRef.current.destroy();\n }\n };\n }, []);\n\n const startTimer = useCallback(() => {\n sdkRef.current?.startTimer();\n setIsTimerRunning(true);\n }, []);\n\n const pauseTimer = useCallback(() => {\n sdkRef.current?.pauseTimer();\n setIsTimerRunning(false);\n }, []);\n\n const resumeTimer = useCallback(() => {\n sdkRef.current?.resumeTimer();\n setIsTimerRunning(true);\n }, []);\n\n const endSession = useCallback(() => {\n sdkRef.current?.endSession();\n setIsTimerRunning(false);\n }, []);\n\n const extendSession = useCallback(async (minutes: number) => {\n if (!sdkRef.current) throw new Error('SDK not initialized');\n await sdkRef.current.extendSession(minutes);\n }, []);\n\n const completeSession = useCallback(async (actualUsageMinutes?: number) => {\n if (!sdkRef.current) throw new Error('SDK not initialized');\n await sdkRef.current.completeSession(actualUsageMinutes);\n }, []);\n\n return {\n session,\n loading,\n error,\n remainingTime,\n formattedTime,\n formattedTimeWithHours,\n isTimerRunning,\n startTimer,\n pauseTimer,\n resumeTimer,\n endSession,\n extendSession,\n completeSession,\n sdk: sdkRef.current,\n };\n}\n"],"names":["useMarketplaceSession","options","session","setSession","useState","loading","setLoading","error","setError","remainingTime","setRemainingTime","formattedTime","setFormattedTime","formattedTimeWithHours","setFormattedTimeWithHours","isTimerRunning","setIsTimerRunning","sdkRef","useRef","intervalRef","useEffect","sdk","MarketplaceSDK","data","err","errorMessage","startTimer","useCallback","pauseTimer","resumeTimer","endSession","extendSession","minutes","completeSession","actualUsageMinutes"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/adapters/react/useMarketplaceSession.ts"],"sourcesContent":["import { useEffect, useState, useCallback, useRef } from 'react';\nimport { MarketplaceSDK } from '../../core/MarketplaceSDK';\nimport type { SDKConfig, SessionData } from '../../types';\n\nexport interface UseMarketplaceSessionOptions extends Omit<SDKConfig, 'hooks'> {\n onSessionStart?: (data: SessionData) => void;\n onSessionWarning?: (data: { remainingSeconds: number }) => void;\n onSessionEnd?: () => void;\n onError?: (error: Error) => void;\n hooks?: SDKConfig['hooks'];\n}\n\nexport interface UseMarketplaceSessionReturn {\n session: SessionData | null;\n loading: boolean;\n error: string | null;\n remainingTime: number;\n formattedTime: string;\n formattedTimeWithHours: string;\n isTimerRunning: boolean;\n startTimer: () => void;\n pauseTimer: () => void;\n resumeTimer: () => void;\n endSession: () => void;\n extendSession: (minutes: number) => Promise<void>;\n completeSession: (actualUsageMinutes?: number) => Promise<void>;\n sdk: MarketplaceSDK | null;\n}\n\nexport function useMarketplaceSession(\n options: UseMarketplaceSessionOptions\n): UseMarketplaceSessionReturn {\n const [session, setSession] = useState<SessionData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [remainingTime, setRemainingTime] = useState(0);\n const [formattedTime, setFormattedTime] = useState('0:00');\n const [formattedTimeWithHours, setFormattedTimeWithHours] = useState('0:00:00');\n const [isTimerRunning, setIsTimerRunning] = useState(false);\n\n const sdkRef = useRef<MarketplaceSDK | null>(null);\n const intervalRef = useRef<number | null>(null);\n\n useEffect(() => {\n const initializeSDK = async () => {\n try {\n const sdk = new MarketplaceSDK({\n jwksUri: options.jwksUri,\n marketplaceUrl: options.marketplaceUrl,\n apiEndpoint: options.apiEndpoint,\n debug: options.debug,\n autoStart: options.autoStart,\n warningThresholdSeconds: options.warningThresholdSeconds,\n customStyles: options.customStyles,\n applicationId: options.applicationId,\n enableHeartbeat: options.enableHeartbeat ?? false,\n heartbeatIntervalSeconds: options.heartbeatIntervalSeconds ?? 30,\n enableTabSync: options.enableTabSync ?? false,\n pauseOnHidden: options.pauseOnHidden ?? false,\n useBackendValidation: options.useBackendValidation ?? false,\n hooks: options.hooks,\n });\n\n sdk.on('onSessionStart', (data) => {\n setSession(data);\n setLoading(false);\n setIsTimerRunning(sdk.isTimerRunning());\n options.onSessionStart?.(data);\n });\n\n sdk.on('onSessionWarning', (data) => {\n options.onSessionWarning?.(data);\n });\n\n sdk.on('onSessionEnd', () => {\n setIsTimerRunning(false);\n options.onSessionEnd?.();\n });\n\n sdk.on('onError', (err) => {\n setError(err.message);\n setLoading(false);\n options.onError?.(err);\n });\n\n sdkRef.current = sdk;\n await sdk.initialize();\n\n intervalRef.current = window.setInterval(() => {\n if (sdkRef.current) {\n setRemainingTime(sdkRef.current.getRemainingTime());\n setFormattedTime(sdkRef.current.getFormattedTime());\n setFormattedTimeWithHours(sdkRef.current.getFormattedTimeWithHours());\n setIsTimerRunning(sdkRef.current.isTimerRunning());\n }\n }, 1000);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n setError(errorMessage);\n setLoading(false);\n }\n };\n\n initializeSDK();\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n if (sdkRef.current) {\n sdkRef.current.destroy();\n }\n };\n }, []);\n\n const startTimer = useCallback(() => {\n sdkRef.current?.startTimer();\n setIsTimerRunning(true);\n }, []);\n\n const pauseTimer = useCallback(() => {\n sdkRef.current?.pauseTimer();\n setIsTimerRunning(false);\n }, []);\n\n const resumeTimer = useCallback(() => {\n sdkRef.current?.resumeTimer();\n setIsTimerRunning(true);\n }, []);\n\n const endSession = useCallback(() => {\n sdkRef.current?.endSession();\n setIsTimerRunning(false);\n }, []);\n\n const extendSession = useCallback(async (minutes: number) => {\n if (!sdkRef.current) throw new Error('SDK not initialized');\n await sdkRef.current.extendSession(minutes);\n }, []);\n\n const completeSession = useCallback(async (actualUsageMinutes?: number) => {\n if (!sdkRef.current) throw new Error('SDK not initialized');\n await sdkRef.current.completeSession(actualUsageMinutes);\n }, []);\n\n return {\n session,\n loading,\n error,\n remainingTime,\n formattedTime,\n formattedTimeWithHours,\n isTimerRunning,\n startTimer,\n pauseTimer,\n resumeTimer,\n endSession,\n extendSession,\n completeSession,\n sdk: sdkRef.current,\n };\n}\n"],"names":["useMarketplaceSession","options","session","setSession","useState","loading","setLoading","error","setError","remainingTime","setRemainingTime","formattedTime","setFormattedTime","formattedTimeWithHours","setFormattedTimeWithHours","isTimerRunning","setIsTimerRunning","sdkRef","useRef","intervalRef","useEffect","sdk","MarketplaceSDK","data","err","errorMessage","startTimer","useCallback","pauseTimer","resumeTimer","endSession","extendSession","minutes","completeSession","actualUsageMinutes"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useMarketplaceSession.d.ts","sourceRoot":"","sources":["../../../src/adapters/react/useMarketplaceSession.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,WAAW,4BAA6B,SAAQ,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5E,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAChE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,eAAe,EAAE,CAAC,kBAAkB,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,GAAG,EAAE,cAAc,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,2BAA2B,CAiI7B"}
1
+ {"version":3,"file":"useMarketplaceSession.d.ts","sourceRoot":"","sources":["../../../src/adapters/react/useMarketplaceSession.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,WAAW,4BAA6B,SAAQ,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5E,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAChE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,eAAe,EAAE,CAAC,kBAAkB,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,GAAG,EAAE,cAAc,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,2BAA2B,CAkI7B"}
@@ -1,12 +1,13 @@
1
1
  import { ref as l, onMounted as v, onUnmounted as d } from "vue";
2
2
  import { MarketplaceSDK as f } from "../../../core/MarketplaceSDK";
3
- function h(e = {}) {
4
- const a = l(null), o = l(null), u = l(!0), i = l(null), m = l(0), c = l("0:00"), r = l(!1);
5
- let t = null;
3
+ function p(e = {}) {
4
+ const a = l(null), o = l(null), u = l(!0), t = l(null), m = l(0), c = l("0:00"), r = l(!1);
5
+ let i = null;
6
6
  return v(async () => {
7
7
  try {
8
8
  const n = new f({
9
9
  jwksUri: e.jwksUri,
10
+ marketplaceUrl: e.marketplaceUrl,
10
11
  apiEndpoint: e.apiEndpoint,
11
12
  debug: e.debug,
12
13
  autoStart: e.autoStart,
@@ -22,20 +23,20 @@ function h(e = {}) {
22
23
  }), n.on("onSessionEnd", () => {
23
24
  r.value = !1, e.onSessionEnd?.({});
24
25
  }), n.on("onError", (s) => {
25
- i.value = s.message, u.value = !1, e.onError?.(s);
26
- }), await n.initialize(), a.value = n, t = setInterval(() => {
26
+ t.value = s.message, u.value = !1, e.onError?.(s);
27
+ }), await n.initialize(), a.value = n, i = setInterval(() => {
27
28
  a.value && (m.value = a.value.getRemainingTime(), c.value = a.value.getFormattedTime(), r.value = a.value.isTimerRunning());
28
29
  }, 1e3);
29
30
  } catch (n) {
30
- i.value = n instanceof Error ? n.message : "Unknown error", u.value = !1;
31
+ t.value = n instanceof Error ? n.message : "Unknown error", u.value = !1;
31
32
  }
32
33
  }), d(() => {
33
- t && clearInterval(t), a.value?.destroy();
34
+ i && clearInterval(i), a.value?.destroy();
34
35
  }), {
35
36
  sdk: a,
36
37
  session: o,
37
38
  loading: u,
38
- error: i,
39
+ error: t,
39
40
  remainingTime: m,
40
41
  formattedTime: c,
41
42
  isTimerRunning: r,
@@ -51,6 +52,6 @@ function h(e = {}) {
51
52
  };
52
53
  }
53
54
  export {
54
- h as useMarketplaceSession
55
+ p as useMarketplaceSession
55
56
  };
56
57
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/adapters/vue/useMarketplaceSession.ts"],"sourcesContent":["import { ref, onMounted, onUnmounted } from 'vue';\nimport { MarketplaceSDK } from '../../core/MarketplaceSDK';\nimport type { SDKConfig, SessionData, SessionStartContext, SessionEndContext } from '../../types';\n\nexport interface UseMarketplaceSessionOptions extends Omit<SDKConfig, 'hooks'> {\n onSessionStart?: (context: SessionStartContext) => void | Promise<void>;\n onSessionEnd?: (context: SessionEndContext) => void | Promise<void>;\n onError?: (error: Error) => void;\n hooks?: SDKConfig['hooks'];\n}\n\nexport function useMarketplaceSession(options: UseMarketplaceSessionOptions = {} as UseMarketplaceSessionOptions) {\n const sdk = ref<MarketplaceSDK | null>(null);\n const session = ref<SessionData | null>(null);\n const loading = ref(true);\n const error = ref<string | null>(null);\n const remainingTime = ref(0);\n const formattedTime = ref('0:00');\n const isTimerRunning = ref(false);\n\n let timerInterval: ReturnType<typeof setInterval> | null = null;\n\n onMounted(async () => {\n try {\n const marketplaceSDK = new MarketplaceSDK({\n jwksUri: options.jwksUri,\n apiEndpoint: options.apiEndpoint,\n debug: options.debug,\n autoStart: options.autoStart,\n warningThresholdSeconds: options.warningThresholdSeconds,\n applicationId: options.applicationId,\n enableHeartbeat: options.enableHeartbeat ?? false,\n enableTabSync: options.enableTabSync ?? false,\n pauseOnHidden: options.pauseOnHidden ?? false,\n hooks: options.hooks,\n });\n\n marketplaceSDK.on('onSessionStart', (data) => {\n session.value = data;\n loading.value = false;\n isTimerRunning.value = marketplaceSDK.isTimerRunning();\n options.onSessionStart?.(data as unknown as SessionStartContext);\n });\n\n marketplaceSDK.on('onSessionEnd', () => {\n isTimerRunning.value = false;\n options.onSessionEnd?.({} as SessionEndContext);\n });\n\n marketplaceSDK.on('onError', (err) => {\n error.value = err.message;\n loading.value = false;\n options.onError?.(err);\n });\n\n await marketplaceSDK.initialize();\n sdk.value = marketplaceSDK;\n\n timerInterval = setInterval(() => {\n if (sdk.value) {\n remainingTime.value = sdk.value.getRemainingTime();\n formattedTime.value = sdk.value.getFormattedTime();\n isTimerRunning.value = sdk.value.isTimerRunning();\n }\n }, 1000);\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Unknown error';\n loading.value = false;\n }\n });\n\n onUnmounted(() => {\n if (timerInterval) clearInterval(timerInterval);\n sdk.value?.destroy();\n });\n\n const pauseTimer = () => {\n sdk.value?.pauseTimer();\n isTimerRunning.value = false;\n };\n\n const resumeTimer = () => {\n sdk.value?.resumeTimer();\n isTimerRunning.value = true;\n };\n\n const endSession = () => {\n sdk.value?.endSession();\n isTimerRunning.value = false;\n };\n\n return {\n sdk,\n session,\n loading,\n error,\n remainingTime,\n formattedTime,\n isTimerRunning,\n pauseTimer,\n resumeTimer,\n endSession,\n };\n}\n"],"names":["useMarketplaceSession","options","sdk","ref","session","loading","error","remainingTime","formattedTime","isTimerRunning","timerInterval","onMounted","marketplaceSDK","MarketplaceSDK","data","err","onUnmounted"],"mappings":";;AAWO,SAASA,EAAsBC,IAAwC,IAAoC;AAChH,QAAMC,IAAMC,EAA2B,IAAI,GACrCC,IAAUD,EAAwB,IAAI,GACtCE,IAAUF,EAAI,EAAI,GAClBG,IAAQH,EAAmB,IAAI,GAC/BI,IAAgBJ,EAAI,CAAC,GACrBK,IAAgBL,EAAI,MAAM,GAC1BM,IAAiBN,EAAI,EAAK;AAEhC,MAAIO,IAAuD;AAE3D,SAAAC,EAAU,YAAY;AACpB,QAAI;AACF,YAAMC,IAAiB,IAAIC,EAAe;AAAA,QACxC,SAASZ,EAAQ;AAAA,QACjB,aAAaA,EAAQ;AAAA,QACrB,OAAOA,EAAQ;AAAA,QACf,WAAWA,EAAQ;AAAA,QACnB,yBAAyBA,EAAQ;AAAA,QACjC,eAAeA,EAAQ;AAAA,QACvB,iBAAiBA,EAAQ,mBAAmB;AAAA,QAC5C,eAAeA,EAAQ,iBAAiB;AAAA,QACxC,eAAeA,EAAQ,iBAAiB;AAAA,QACxC,OAAOA,EAAQ;AAAA,MAAA,CAChB;AAED,MAAAW,EAAe,GAAG,kBAAkB,CAACE,MAAS;AAC5C,QAAAV,EAAQ,QAAQU,GAChBT,EAAQ,QAAQ,IAChBI,EAAe,QAAQG,EAAe,eAAA,GACtCX,EAAQ,iBAAiBa,CAAsC;AAAA,MACjE,CAAC,GAEDF,EAAe,GAAG,gBAAgB,MAAM;AACtC,QAAAH,EAAe,QAAQ,IACvBR,EAAQ,eAAe,EAAuB;AAAA,MAChD,CAAC,GAEDW,EAAe,GAAG,WAAW,CAACG,MAAQ;AACpC,QAAAT,EAAM,QAAQS,EAAI,SAClBV,EAAQ,QAAQ,IAChBJ,EAAQ,UAAUc,CAAG;AAAA,MACvB,CAAC,GAED,MAAMH,EAAe,WAAA,GACrBV,EAAI,QAAQU,GAEZF,IAAgB,YAAY,MAAM;AAChC,QAAIR,EAAI,UACNK,EAAc,QAAQL,EAAI,MAAM,iBAAA,GAChCM,EAAc,QAAQN,EAAI,MAAM,iBAAA,GAChCO,EAAe,QAAQP,EAAI,MAAM,eAAA;AAAA,MAErC,GAAG,GAAI;AAAA,IACT,SAASa,GAAK;AACZ,MAAAT,EAAM,QAAQS,aAAe,QAAQA,EAAI,UAAU,iBACnDV,EAAQ,QAAQ;AAAA,IAClB;AAAA,EACF,CAAC,GAEDW,EAAY,MAAM;AAChB,IAAIN,mBAA6BA,CAAa,GAC9CR,EAAI,OAAO,QAAA;AAAA,EACb,CAAC,GAiBM;AAAA,IACL,KAAAA;AAAA,IACA,SAAAE;AAAA,IACA,SAAAC;AAAA,IACA,OAAAC;AAAA,IACA,eAAAC;AAAA,IACA,eAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,YAvBiB,MAAM;AACvB,MAAAP,EAAI,OAAO,WAAA,GACXO,EAAe,QAAQ;AAAA,IACzB;AAAA,IAqBE,aAnBkB,MAAM;AACxB,MAAAP,EAAI,OAAO,YAAA,GACXO,EAAe,QAAQ;AAAA,IACzB;AAAA,IAiBE,YAfiB,MAAM;AACvB,MAAAP,EAAI,OAAO,WAAA,GACXO,EAAe,QAAQ;AAAA,IACzB;AAAA,EAYE;AAEJ;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/adapters/vue/useMarketplaceSession.ts"],"sourcesContent":["import { ref, onMounted, onUnmounted } from 'vue';\nimport { MarketplaceSDK } from '../../core/MarketplaceSDK';\nimport type { SDKConfig, SessionData, SessionStartContext, SessionEndContext } from '../../types';\n\nexport interface UseMarketplaceSessionOptions extends Omit<SDKConfig, 'hooks'> {\n onSessionStart?: (context: SessionStartContext) => void | Promise<void>;\n onSessionEnd?: (context: SessionEndContext) => void | Promise<void>;\n onError?: (error: Error) => void;\n hooks?: SDKConfig['hooks'];\n}\n\nexport function useMarketplaceSession(options: UseMarketplaceSessionOptions = {} as UseMarketplaceSessionOptions) {\n const sdk = ref<MarketplaceSDK | null>(null);\n const session = ref<SessionData | null>(null);\n const loading = ref(true);\n const error = ref<string | null>(null);\n const remainingTime = ref(0);\n const formattedTime = ref('0:00');\n const isTimerRunning = ref(false);\n\n let timerInterval: ReturnType<typeof setInterval> | null = null;\n\n onMounted(async () => {\n try {\n const marketplaceSDK = new MarketplaceSDK({\n jwksUri: options.jwksUri,\n marketplaceUrl: options.marketplaceUrl,\n apiEndpoint: options.apiEndpoint,\n debug: options.debug,\n autoStart: options.autoStart,\n warningThresholdSeconds: options.warningThresholdSeconds,\n applicationId: options.applicationId,\n enableHeartbeat: options.enableHeartbeat ?? false,\n enableTabSync: options.enableTabSync ?? false,\n pauseOnHidden: options.pauseOnHidden ?? false,\n hooks: options.hooks,\n });\n\n marketplaceSDK.on('onSessionStart', (data) => {\n session.value = data;\n loading.value = false;\n isTimerRunning.value = marketplaceSDK.isTimerRunning();\n options.onSessionStart?.(data as unknown as SessionStartContext);\n });\n\n marketplaceSDK.on('onSessionEnd', () => {\n isTimerRunning.value = false;\n options.onSessionEnd?.({} as SessionEndContext);\n });\n\n marketplaceSDK.on('onError', (err) => {\n error.value = err.message;\n loading.value = false;\n options.onError?.(err);\n });\n\n await marketplaceSDK.initialize();\n sdk.value = marketplaceSDK;\n\n timerInterval = setInterval(() => {\n if (sdk.value) {\n remainingTime.value = sdk.value.getRemainingTime();\n formattedTime.value = sdk.value.getFormattedTime();\n isTimerRunning.value = sdk.value.isTimerRunning();\n }\n }, 1000);\n } catch (err) {\n error.value = err instanceof Error ? err.message : 'Unknown error';\n loading.value = false;\n }\n });\n\n onUnmounted(() => {\n if (timerInterval) clearInterval(timerInterval);\n sdk.value?.destroy();\n });\n\n const pauseTimer = () => {\n sdk.value?.pauseTimer();\n isTimerRunning.value = false;\n };\n\n const resumeTimer = () => {\n sdk.value?.resumeTimer();\n isTimerRunning.value = true;\n };\n\n const endSession = () => {\n sdk.value?.endSession();\n isTimerRunning.value = false;\n };\n\n return {\n sdk,\n session,\n loading,\n error,\n remainingTime,\n formattedTime,\n isTimerRunning,\n pauseTimer,\n resumeTimer,\n endSession,\n };\n}\n"],"names":["useMarketplaceSession","options","sdk","ref","session","loading","error","remainingTime","formattedTime","isTimerRunning","timerInterval","onMounted","marketplaceSDK","MarketplaceSDK","data","err","onUnmounted"],"mappings":";;AAWO,SAASA,EAAsBC,IAAwC,IAAoC;AAChH,QAAMC,IAAMC,EAA2B,IAAI,GACrCC,IAAUD,EAAwB,IAAI,GACtCE,IAAUF,EAAI,EAAI,GAClBG,IAAQH,EAAmB,IAAI,GAC/BI,IAAgBJ,EAAI,CAAC,GACrBK,IAAgBL,EAAI,MAAM,GAC1BM,IAAiBN,EAAI,EAAK;AAEhC,MAAIO,IAAuD;AAE3D,SAAAC,EAAU,YAAY;AACpB,QAAI;AACF,YAAMC,IAAiB,IAAIC,EAAe;AAAA,QACxC,SAASZ,EAAQ;AAAA,QACjB,gBAAgBA,EAAQ;AAAA,QACxB,aAAaA,EAAQ;AAAA,QACrB,OAAOA,EAAQ;AAAA,QACf,WAAWA,EAAQ;AAAA,QACnB,yBAAyBA,EAAQ;AAAA,QACjC,eAAeA,EAAQ;AAAA,QACvB,iBAAiBA,EAAQ,mBAAmB;AAAA,QAC5C,eAAeA,EAAQ,iBAAiB;AAAA,QACxC,eAAeA,EAAQ,iBAAiB;AAAA,QACxC,OAAOA,EAAQ;AAAA,MAAA,CAChB;AAED,MAAAW,EAAe,GAAG,kBAAkB,CAACE,MAAS;AAC5C,QAAAV,EAAQ,QAAQU,GAChBT,EAAQ,QAAQ,IAChBI,EAAe,QAAQG,EAAe,eAAA,GACtCX,EAAQ,iBAAiBa,CAAsC;AAAA,MACjE,CAAC,GAEDF,EAAe,GAAG,gBAAgB,MAAM;AACtC,QAAAH,EAAe,QAAQ,IACvBR,EAAQ,eAAe,EAAuB;AAAA,MAChD,CAAC,GAEDW,EAAe,GAAG,WAAW,CAACG,MAAQ;AACpC,QAAAT,EAAM,QAAQS,EAAI,SAClBV,EAAQ,QAAQ,IAChBJ,EAAQ,UAAUc,CAAG;AAAA,MACvB,CAAC,GAED,MAAMH,EAAe,WAAA,GACrBV,EAAI,QAAQU,GAEZF,IAAgB,YAAY,MAAM;AAChC,QAAIR,EAAI,UACNK,EAAc,QAAQL,EAAI,MAAM,iBAAA,GAChCM,EAAc,QAAQN,EAAI,MAAM,iBAAA,GAChCO,EAAe,QAAQP,EAAI,MAAM,eAAA;AAAA,MAErC,GAAG,GAAI;AAAA,IACT,SAASa,GAAK;AACZ,MAAAT,EAAM,QAAQS,aAAe,QAAQA,EAAI,UAAU,iBACnDV,EAAQ,QAAQ;AAAA,IAClB;AAAA,EACF,CAAC,GAEDW,EAAY,MAAM;AAChB,IAAIN,mBAA6BA,CAAa,GAC9CR,EAAI,OAAO,QAAA;AAAA,EACb,CAAC,GAiBM;AAAA,IACL,KAAAA;AAAA,IACA,SAAAE;AAAA,IACA,SAAAC;AAAA,IACA,OAAAC;AAAA,IACA,eAAAC;AAAA,IACA,eAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,YAvBiB,MAAM;AACvB,MAAAP,EAAI,OAAO,WAAA,GACXO,EAAe,QAAQ;AAAA,IACzB;AAAA,IAqBE,aAnBkB,MAAM;AACxB,MAAAP,EAAI,OAAO,YAAA,GACXO,EAAe,QAAQ;AAAA,IACzB;AAAA,IAiBE,YAfiB,MAAM;AACvB,MAAAP,EAAI,OAAO,WAAA,GACXO,EAAe,QAAQ;AAAA,IACzB;AAAA,EAYE;AAEJ;"}
@@ -22,6 +22,8 @@ export declare function useMarketplaceSession(options?: UseMarketplaceSessionOpt
22
22
  getFormattedTime: () => string;
23
23
  getFormattedTimeWithHours: () => string;
24
24
  isTimerRunning: () => boolean;
25
+ requestPurchase: (itemId: string) => void;
26
+ getPurchaseStateManager: () => import('../../core/PurchaseStateManager').PurchaseStateManager;
25
27
  destroy: () => void;
26
28
  } | null, MarketplaceSDK | {
27
29
  on: <K extends keyof import('../../types').SDKEvents>(event: K, handler: import('../../types').SDKEvents[K]) => void;
@@ -37,6 +39,8 @@ export declare function useMarketplaceSession(options?: UseMarketplaceSessionOpt
37
39
  getFormattedTime: () => string;
38
40
  getFormattedTimeWithHours: () => string;
39
41
  isTimerRunning: () => boolean;
42
+ requestPurchase: (itemId: string) => void;
43
+ getPurchaseStateManager: () => import('../../core/PurchaseStateManager').PurchaseStateManager;
40
44
  destroy: () => void;
41
45
  } | null>;
42
46
  session: import('vue').Ref<{
@@ -1 +1 @@
1
- {"version":3,"file":"useMarketplaceSession.d.ts","sourceRoot":"","sources":["../../../src/adapters/vue/useMarketplaceSession.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAElG,MAAM,WAAW,4BAA6B,SAAQ,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5E,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;CAC5B;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,4BAAiE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4F/G"}
1
+ {"version":3,"file":"useMarketplaceSession.d.ts","sourceRoot":"","sources":["../../../src/adapters/vue/useMarketplaceSession.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAElG,MAAM,WAAW,4BAA6B,SAAQ,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5E,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;CAC5B;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,4BAAiE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6F/G"}
@@ -1,3 +1,4 @@
1
+ import { PurchaseStateManager } from './PurchaseStateManager';
1
2
  import { SDKConfig, SDKEvents, SessionData } from '../types';
2
3
 
3
4
  /**
@@ -20,6 +21,8 @@ export declare class MarketplaceSDK {
20
21
  private sessionData;
21
22
  private jwtToken;
22
23
  private endReason;
24
+ private purchaseStateManager;
25
+ private purchaseModal;
23
26
  constructor(config: SDKConfig);
24
27
  /**
25
28
  * Register event handlers
@@ -97,6 +100,15 @@ export declare class MarketplaceSDK {
97
100
  * Check if timer is running
98
101
  */
99
102
  isTimerRunning(): boolean;
103
+ /**
104
+ * Request purchase of an item — opens PurchaseModal directly
105
+ * Bypasses the add-ons panel; works for any active item (visible or hidden)
106
+ */
107
+ requestPurchase(itemId: string): void;
108
+ /**
109
+ * Get purchase state manager for item purchase state checking
110
+ */
111
+ getPurchaseStateManager(): PurchaseStateManager;
100
112
  /**
101
113
  * Cleanup and destroy SDK instance
102
114
  */
@@ -1 +1 @@
1
- {"version":3,"file":"MarketplaceSDK.d.ts","sourceRoot":"","sources":["../../src/core/MarketplaceSDK.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAiG,MAAM,UAAU,CAAC;AAE5J;;;;;;;GAOG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,SAAS,CAA4C;gBAEjD,MAAM,EAAE,SAAS;IAqC7B;;OAEG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI;IAKpE;;OAEG;YACW,WAAW;IAuCzB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAO/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IA+LxC;;OAEG;YACW,mBAAmB;IAkCjC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAapC;;OAEG;IACH,UAAU,IAAI,IAAI;IAYlB;;OAEG;IACH,UAAU,IAAI,IAAI;IAMlB;;OAEG;IACH,WAAW,IAAI,IAAI;IAMnB;;OAEG;IACG,aAAa,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoE7D;;OAEG;IACG,eAAe,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgDjE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2DjC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0CxB;;OAEG;IACH,cAAc,IAAI,WAAW,GAAG,IAAI;IAIpC;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,yBAAyB,IAAI,MAAM;IAInC;;OAEG;IACH,cAAc,IAAI,OAAO;IAIzB;;OAEG;IACH,OAAO,IAAI,IAAI;CAgBhB"}
1
+ {"version":3,"file":"MarketplaceSDK.d.ts","sourceRoot":"","sources":["../../src/core/MarketplaceSDK.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAI9D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAgI,MAAM,UAAU,CAAC;AAG3L;;;;;;;GAOG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,aAAa,CAA8B;gBAEvC,MAAM,EAAE,SAAS;IAsD7B;;OAEG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI;IAKpE;;OAEG;YACW,WAAW;IAuCzB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAO/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IA+LxC;;OAEG;YACW,mBAAmB;IAkCjC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAapC;;OAEG;IACH,UAAU,IAAI,IAAI;IAYlB;;OAEG;IACH,UAAU,IAAI,IAAI;IAMlB;;OAEG;IACH,WAAW,IAAI,IAAI;IAMnB;;OAEG;IACG,aAAa,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoE7D;;OAEG;IACG,eAAe,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgDjE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2DjC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0CxB;;OAEG;IACH,cAAc,IAAI,WAAW,GAAG,IAAI;IAIpC;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,yBAAyB,IAAI,MAAM;IAInC;;OAEG;IACH,cAAc,IAAI,OAAO;IAIzB;;;OAGG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IA4ErC;;OAEG;IACH,uBAAuB,IAAI,oBAAoB;IAI/C;;OAEG;IACH,OAAO,IAAI,IAAI;CAiBhB"}
@@ -0,0 +1,28 @@
1
+ import { PurchaseStateResponse } from '../types/index.js';
2
+
3
+ /**
4
+ * Configuration for PurchaseStateManager
5
+ */
6
+ export interface PurchaseStateManagerConfig {
7
+ apiEndpoint: string;
8
+ timeout?: number;
9
+ }
10
+ /**
11
+ * Manages purchase state logic and API interactions
12
+ * Handles data filtering to expose only safe data to publisher apps
13
+ */
14
+ export declare class PurchaseStateManager {
15
+ private config;
16
+ constructor(config: PurchaseStateManagerConfig);
17
+ /**
18
+ * Check purchase state for a specific item
19
+ * Filters raw API response to expose only safe data to publisher apps
20
+ */
21
+ checkItemPurchaseState(itemId: string): Promise<PurchaseStateResponse>;
22
+ /**
23
+ * Filters raw API response to expose only safe data to publisher apps
24
+ * CRITICAL: Raw privyEligibility map must NEVER be exposed to apps
25
+ */
26
+ private filterPurchaseStateResponse;
27
+ }
28
+ //# sourceMappingURL=PurchaseStateManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PurchaseStateManager.d.ts","sourceRoot":"","sources":["../../src/core/PurchaseStateManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,qBAAqB,EAAqD,MAAM,mBAAmB,CAAC;AAE5H;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAA6B;gBAE/B,MAAM,EAAE,0BAA0B;IAO9C;;;OAGG;IACG,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IA2B5E;;;OAGG;IACH,OAAO,CAAC,2BAA2B;CAmBpC"}
package/dist/index.d.ts CHANGED
@@ -11,10 +11,12 @@ export { TabSyncManager } from './core/TabSyncManager';
11
11
  export type { TabSyncMessage } from './core/TabSyncManager';
12
12
  export { WarningModal } from './ui/WarningModal';
13
13
  export { SessionHeader } from './ui/SessionHeader';
14
+ export { PurchaseModal } from './ui/PurchaseModal';
14
15
  export { lightTheme, darkTheme, getTheme, generateCSSVariables } from './styles/theme';
15
16
  export type { Theme, ThemeColors, ThemeTypography, ThemeSpacing } from './styles/theme';
16
17
  export type { SDKConfig, SessionData, SDKEvents, ModalStyles, ThemeMode, JWTHeader, JWTClaims, JWKSKey, JWKSResponse, SessionLifecycleHooks, SessionStartContext, SessionEndContext, SessionExtendContext, SessionWarningContext, } from './types';
17
- export { SDKError } from './types';
18
+ export { SDKError, PurchaseError } from './types';
19
+ export type { PurchaseResult } from './types';
18
20
  export { extractTokenFromURL, isBrowser } from './utils/url';
19
21
  export { Logger } from './utils/logger';
20
22
  export { MarketplaceSDK as default } from './core/MarketplaceSDK';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACvF,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGxF,YAAY,EACV,SAAS,EACT,WAAW,EACX,SAAS,EACT,WAAW,EACX,SAAS,EACT,SAAS,EACT,SAAS,EACT,OAAO,EACP,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGxC,OAAO,EAAE,cAAc,IAAI,OAAO,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACvF,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGxF,YAAY,EACV,SAAS,EACT,WAAW,EACX,SAAS,EACT,WAAW,EACX,SAAS,EACT,SAAS,EACT,SAAS,EACT,OAAO,EACP,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClD,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGxC,OAAO,EAAE,cAAc,IAAI,OAAO,EAAE,MAAM,uBAAuB,CAAC"}