@mission_sciences/provider-sdk 0.3.0 → 0.4.0-dev.f853e1d
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 +24 -5
- package/dist/adapters/react/index.js +11 -10
- package/dist/adapters/react/index.js.map +1 -1
- package/dist/adapters/react/useMarketplaceSession.d.ts.map +1 -1
- package/dist/adapters/vue/index.js +10 -9
- package/dist/adapters/vue/index.js.map +1 -1
- package/dist/adapters/vue/useMarketplaceSession.d.ts +4 -0
- package/dist/adapters/vue/useMarketplaceSession.d.ts.map +1 -1
- package/dist/core/MarketplaceSDK.d.ts +12 -0
- package/dist/core/MarketplaceSDK.d.ts.map +1 -1
- package/dist/core/PurchaseStateManager.d.ts +28 -0
- package/dist/core/PurchaseStateManager.d.ts.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/marketplace-sdk.es.js +316 -2
- package/dist/marketplace-sdk.es.js.map +1 -1
- package/dist/marketplace-sdk.umd.js +1 -1
- package/dist/marketplace-sdk.umd.js.map +1 -1
- package/dist/types/index.d.ts +81 -16
- package/dist/types/index.d.ts.map +1 -1
- package/dist/ui/PurchaseModal.d.ts +30 -0
- package/dist/ui/PurchaseModal.d.ts.map +1 -0
- package/package.json +1 -1
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
2
|
-
import { MarketplaceSDK as
|
|
3
|
-
function
|
|
4
|
-
const [
|
|
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
|
|
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 && (
|
|
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:
|
|
57
|
+
session: d,
|
|
57
58
|
loading: f,
|
|
58
59
|
error: T,
|
|
59
60
|
remainingTime: g,
|
|
60
|
-
formattedTime:
|
|
61
|
-
formattedTimeWithHours:
|
|
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
|
-
|
|
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,
|
|
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
|
|
4
|
-
const a = l(null), o = l(null), u = l(!0),
|
|
5
|
-
let
|
|
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
|
-
|
|
26
|
-
}), await n.initialize(), a.value = n,
|
|
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
|
-
|
|
31
|
+
t.value = n instanceof Error ? n.message : "Unknown error", u.value = !1;
|
|
31
32
|
}
|
|
32
33
|
}), d(() => {
|
|
33
|
-
|
|
34
|
+
i && clearInterval(i), a.value?.destroy();
|
|
34
35
|
}), {
|
|
35
36
|
sdk: a,
|
|
36
37
|
session: o,
|
|
37
38
|
loading: u,
|
|
38
|
-
error:
|
|
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
|
-
|
|
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
|
|
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":"
|
|
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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|