@playporter/sdk 0.1.0 → 0.2.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.
@@ -0,0 +1,63 @@
1
+ import type { JsonValue, Platform } from "@playporter/core";
2
+ export interface AuthSignInResult {
3
+ providerId: string;
4
+ externalUserId: string;
5
+ /** Provider-issued token forwarded to PlayPorter Studio for cross-verification. */
6
+ token: string;
7
+ profile?: {
8
+ displayName?: string | null;
9
+ avatarUrl?: string | null;
10
+ };
11
+ }
12
+ export interface AuthServiceAdapter {
13
+ readonly providerId: string;
14
+ readonly supportedPlatforms: readonly Platform[];
15
+ signIn(credential: Record<string, unknown>): Promise<AuthSignInResult>;
16
+ signOut(): Promise<void>;
17
+ refreshToken?(): Promise<string | null>;
18
+ }
19
+ export interface SaveServiceAdapter {
20
+ readonly providerId: string;
21
+ get(playerId: string, key: string): Promise<JsonValue | null>;
22
+ set(playerId: string, key: string, value: JsonValue): Promise<void>;
23
+ delete(playerId: string, key: string): Promise<void>;
24
+ list?(playerId: string, prefix?: string): Promise<string[]>;
25
+ }
26
+ export interface PurchaseResult {
27
+ status: "success" | "cancelled" | "pending";
28
+ transactionId?: string;
29
+ sku: string;
30
+ provider: string;
31
+ amount?: number;
32
+ currency?: string;
33
+ }
34
+ export interface PaymentServiceAdapter {
35
+ readonly providerId: string;
36
+ readonly supportedPlatforms: readonly Platform[];
37
+ purchase(sku: string, playerId: string, metadata?: Record<string, JsonValue>): Promise<PurchaseResult>;
38
+ restorePurchases?(playerId: string): Promise<PurchaseResult[]>;
39
+ }
40
+ export interface AnalyticsContext {
41
+ playerId: string;
42
+ platform: Platform;
43
+ sessionId: string;
44
+ appVersion: string;
45
+ }
46
+ export interface AnalyticsServiceAdapter {
47
+ readonly providerId: string;
48
+ track(event: string, properties: Record<string, JsonValue>, context: AnalyticsContext): void | Promise<void>;
49
+ flush?(): Promise<void>;
50
+ }
51
+ /**
52
+ * Pass adapters to `PlayPorterClient.initialize({ adapters: { ... } })`.
53
+ * Any domain you omit falls back to PlayPorter's own backend.
54
+ * For payments you can supply a per-platform map so Discord uses its native
55
+ * payments while web uses Stripe.
56
+ * For analytics you can supply an array to dual-fire to multiple providers.
57
+ */
58
+ export interface ServiceAdapters {
59
+ auth?: AuthServiceAdapter;
60
+ saves?: SaveServiceAdapter;
61
+ payments?: PaymentServiceAdapter | Partial<Record<Platform, PaymentServiceAdapter>>;
62
+ analytics?: AnalyticsServiceAdapter | AnalyticsServiceAdapter[];
63
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=service-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-adapter.js","sourceRoot":"","sources":["../../src/adapters/service-adapter.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import type { PassportSummary, EffectiveConfig, EnvironmentName, JsonValue, Platform, PlayerProfile } from "@playporter/core";
1
+ import type { CapabilityGraph, PassportSummary, EffectiveConfig, EnvironmentName, JsonValue, Platform, PlayerProfile } from "@playporter/core";
2
+ export type { ServiceAdapters } from "./router.js";
2
3
  export interface PlayPorterOptions {
3
4
  apiBaseUrl: string;
4
5
  projectKey: string;
@@ -7,18 +8,24 @@ export interface PlayPorterOptions {
7
8
  discordClientId?: string;
8
9
  appVersion?: string;
9
10
  autoTrackLifecycle?: boolean;
11
+ /** Plug in third-party service adapters (auth, saves, payments, analytics). */
12
+ adapters?: import("./adapters/service-adapter.js").ServiceAdapters;
10
13
  }
11
14
  export declare class PlayPorterClient {
12
15
  private readonly options;
13
16
  readonly platform: Platform;
14
17
  private readonly adapter;
18
+ private readonly router;
15
19
  private token?;
16
20
  private currentPlayer?;
17
21
  private eventQueue;
18
22
  private flushTimer?;
19
23
  private readonly sessionId;
24
+ private _capabilityGraph?;
20
25
  private constructor();
21
26
  static initialize(options: PlayPorterOptions): Promise<PlayPorterClient>;
27
+ /** Resolved Capability Graph built at initialization time. */
28
+ get capabilityGraph(): CapabilityGraph | undefined;
22
29
  readonly player: {
23
30
  getCurrent: () => PlayerProfile;
24
31
  createLinkCode: () => Promise<{
@@ -61,9 +68,15 @@ export declare class PlayPorterClient {
61
68
  }>>;
62
69
  };
63
70
  readonly payments: {
71
+ /**
72
+ * Routes to the registered PaymentServiceAdapter for the current platform,
73
+ * or falls back to tracking the intent via PlayPorter analytics.
74
+ */
64
75
  purchase: (sku: string, metadata?: Record<string, JsonValue>) => Promise<{
65
- status: "tracked";
76
+ status: "tracked" | "success" | "cancelled" | "pending";
66
77
  sku: string;
78
+ provider?: string;
79
+ transactionId?: string;
67
80
  }>;
68
81
  };
69
82
  readonly passport: {
@@ -94,3 +107,16 @@ export declare class PlayPorterClient {
94
107
  private sessionKey;
95
108
  }
96
109
  export * from "@playporter/core";
110
+ export type { AuthServiceAdapter, AuthSignInResult, SaveServiceAdapter, PaymentServiceAdapter, PurchaseResult, AnalyticsServiceAdapter, AnalyticsContext, } from "./adapters/service-adapter.js";
111
+ export { FirebaseAuthAdapter } from "./service-adapters/firebase-auth.js";
112
+ export type { FirebaseAuthConfig, FirebaseSignInCredential } from "./service-adapters/firebase-auth.js";
113
+ export { SupabaseAuthAdapter, SupabaseSaveAdapter } from "./service-adapters/supabase.js";
114
+ export type { SupabaseConfig, SupabaseSignInCredential } from "./service-adapters/supabase.js";
115
+ export { StripeAdapter } from "./service-adapters/stripe.js";
116
+ export type { StripeAdapterConfig } from "./service-adapters/stripe.js";
117
+ export { XsollaAdapter } from "./service-adapters/xsolla.js";
118
+ export type { XsollaAdapterConfig } from "./service-adapters/xsolla.js";
119
+ export { GameAnalyticsAdapter } from "./service-adapters/gameanalytics.js";
120
+ export type { GameAnalyticsConfig } from "./service-adapters/gameanalytics.js";
121
+ export { FirebaseAnalyticsAdapter } from "./service-adapters/firebase-analytics.js";
122
+ export type { FirebaseAnalyticsConfig } from "./service-adapters/firebase-analytics.js";
package/dist/index.js CHANGED
@@ -2,19 +2,23 @@ import { DiscordAdapter } from "./adapters/discord.js";
2
2
  import { RedditAdapter } from "./adapters/reddit.js";
3
3
  import { TelegramAdapter } from "./adapters/telegram.js";
4
4
  import { WebAdapter } from "./adapters/web.js";
5
+ import { AdapterRouter } from "./router.js";
5
6
  export class PlayPorterClient {
6
7
  options;
7
8
  platform;
8
9
  adapter;
10
+ router;
9
11
  token;
10
12
  currentPlayer;
11
13
  eventQueue = [];
12
14
  flushTimer;
13
15
  sessionId = globalThis.crypto?.randomUUID?.() ?? `pp_${Date.now().toString(36)}`;
16
+ _capabilityGraph;
14
17
  constructor(options, adapter) {
15
18
  this.options = options;
16
19
  this.adapter = adapter;
17
20
  this.platform = adapter.platform;
21
+ this.router = new AdapterRouter(options.adapters ?? {}, this.platform);
18
22
  }
19
23
  static async initialize(options) {
20
24
  const normalized = {
@@ -33,6 +37,10 @@ export class PlayPorterClient {
33
37
  client.installLifecycleTracking();
34
38
  return client;
35
39
  }
40
+ /** Resolved Capability Graph built at initialization time. */
41
+ get capabilityGraph() {
42
+ return this._capabilityGraph;
43
+ }
36
44
  player = {
37
45
  getCurrent: () => {
38
46
  if (!this.currentPlayer)
@@ -57,6 +65,13 @@ export class PlayPorterClient {
57
65
  analytics = {
58
66
  track: (name, properties = {}) => {
59
67
  this.eventQueue.push({ name, occurredAt: new Date().toISOString(), sessionId: this.sessionId, properties });
68
+ // Fan out to external analytics adapters synchronously (they batch internally).
69
+ this.router.trackExternal(name, properties, {
70
+ playerId: this.currentPlayer?.id ?? "guest",
71
+ platform: this.platform,
72
+ sessionId: this.sessionId,
73
+ appVersion: this.options.appVersion,
74
+ });
60
75
  if (this.eventQueue.length >= 20)
61
76
  void this.flushEvents();
62
77
  else
@@ -86,7 +101,17 @@ export class PlayPorterClient {
86
101
  top: async (leaderboard, limit = 20) => this.request(`/api/v1/leaderboards/${encodeURIComponent(leaderboard)}?limit=${limit}`),
87
102
  };
88
103
  payments = {
104
+ /**
105
+ * Routes to the registered PaymentServiceAdapter for the current platform,
106
+ * or falls back to tracking the intent via PlayPorter analytics.
107
+ */
89
108
  purchase: async (sku, metadata = {}) => {
109
+ if (this.router.hasPayments()) {
110
+ const playerId = this.currentPlayer?.id ?? "guest";
111
+ const result = await this.router.purchase(sku, playerId, metadata);
112
+ this.analytics.track("purchase_completed", { sku, provider: result.provider, status: result.status, transactionId: result.transactionId ?? null, ...metadata });
113
+ return result;
114
+ }
90
115
  this.analytics.track("purchase_requested", { sku, ...metadata });
91
116
  return { status: "tracked", sku };
92
117
  },
@@ -161,6 +186,11 @@ export class PlayPorterClient {
161
186
  this.token = session.token;
162
187
  this.currentPlayer = session.player;
163
188
  sessionStorage.setItem(this.sessionKey(), JSON.stringify(session));
189
+ this._capabilityGraph = this.router.buildCapabilityGraph({
190
+ slug: this.options.projectKey,
191
+ name: this.options.projectKey,
192
+ version: this.options.appVersion,
193
+ });
164
194
  }
165
195
  async request(path, init = {}) {
166
196
  const headers = new Headers(init.headers);
@@ -195,6 +225,7 @@ export class PlayPorterClient {
195
225
  }, 5_000);
196
226
  }
197
227
  async flushEvents(useBeacon = false) {
228
+ void this.router.flushExternal();
198
229
  if (this.eventQueue.length === 0 || !this.token)
199
230
  return;
200
231
  const events = this.eventQueue.splice(0, 50);
@@ -245,4 +276,11 @@ function detectPlatform() {
245
276
  return "web";
246
277
  }
247
278
  export * from "@playporter/core";
279
+ // Concrete service adapters
280
+ export { FirebaseAuthAdapter } from "./service-adapters/firebase-auth.js";
281
+ export { SupabaseAuthAdapter, SupabaseSaveAdapter } from "./service-adapters/supabase.js";
282
+ export { StripeAdapter } from "./service-adapters/stripe.js";
283
+ export { XsollaAdapter } from "./service-adapters/xsolla.js";
284
+ export { GameAnalyticsAdapter } from "./service-adapters/gameanalytics.js";
285
+ export { FirebaseAnalyticsAdapter } from "./service-adapters/firebase-analytics.js";
248
286
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAqB5C,MAAM,OAAO,gBAAgB;IAYR;IAXV,QAAQ,CAAW;IACX,OAAO,CAAkB;IACzB,MAAM,CAAgB;IAC/B,KAAK,CAAU;IACf,aAAa,CAAiB;IAC9B,UAAU,GAA0B,EAAE,CAAC;IACvC,UAAU,CAAU;IACX,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1F,gBAAgB,CAAmB;IAE3C,YACmB,OAA6K,EAC9L,OAAwB;QADP,YAAO,GAAP,OAAO,CAAsK;QAG9L,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAA0B;QAChD,MAAM,UAAU,GAAG;YACjB,WAAW,EAAE,YAAqB;YAClC,QAAQ,EAAE,MAAe;YACzB,UAAU,EAAE,OAAO;YACnB,kBAAkB,EAAE,IAAI;YACxB,GAAG,OAAO;YACV,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClD,CAAC;QACF,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;QAC5B,IAAI,UAAU,CAAC,kBAAkB;YAAE,MAAM,CAAC,wBAAwB,EAAE,CAAC;QACrE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,8DAA8D;IAC9D,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAEQ,MAAM,GAAG;QAChB,UAAU,EAAE,GAAkB,EAAE;YAC9B,IAAI,CAAC,IAAI,CAAC,aAAa;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAC9E,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;QACD,cAAc,EAAE,KAAK,IAAkD,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACzI,WAAW,EAAE,KAAK,EAAE,IAAY,EAAE,eAAwB,EAAsC,EAAE,CAChG,IAAI,CAAC,OAAO,CAAC,+BAA+B,EAAE;YAC5C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;SAClD,CAAC;KACH,CAAC;IAEO,QAAQ,GAAG;QAClB,SAAS,EAAE,KAAK,IAA4B,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;QACvE,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc;QAC1C,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;QACpC,WAAW,EAAE,KAAK,IAA8B,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,2BAA2B,CAAC;KAC7F,CAAC;IAEO,OAAO,GAAG;QACjB,SAAS,EAAE,KAAK,IAA8B,EAAE,CAAC,IAAI,CAAC,OAAO,CAC3D,wCAAwC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,IAAI,CAAC,QAAQ,eAAe,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAC3K;KACF,CAAC;IAEO,SAAS,GAAG;QACnB,KAAK,EAAE,CAAC,IAAY,EAAE,aAAwC,EAAE,EAAQ,EAAE;YACxE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;YAC5G,gFAAgF;YAChF,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE;gBAC1C,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,OAAO;gBAC3C,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;aACpC,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE;gBAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;;gBACrD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC/B,CAAC;QACD,KAAK,EAAE,GAAkB,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE;KAC/C,CAAC;IAEO,OAAO,GAAG;QACjB,GAAG,EAAE,KAAK,EAAuB,GAAW,EAAqB,EAAE;YACjE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAsB,mBAAmB,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrG,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,GAAW,EAAE,KAAgB,EAAiB,EAAE;YAC1D,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACvH,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,GAAW,EAAiB,EAAE;YAC3C,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzF,CAAC;KACF,CAAC;IAEO,YAAY,GAAG;QACtB,MAAM,EAAE,KAAK,EAAE,WAAmB,EAAE,KAAa,EAAE,WAAsC,EAAE,EAAiB,EAAE;YAC5G,MAAM,IAAI,CAAC,OAAO,CAAC,6BAA6B,EAAE;gBAChD,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;aACvD,CAAC,CAAC;QACL,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,WAAmB,EAAE,KAAK,GAAG,EAAE,EAA0E,EAAE,CACrH,IAAI,CAAC,OAAO,CAAC,wBAAwB,kBAAkB,CAAC,WAAW,CAAC,UAAU,KAAK,EAAE,CAAC;KACzF,CAAC;IAEO,QAAQ,GAAG;QAClB;;;WAGG;QACH,QAAQ,EAAE,KAAK,EAAE,GAAW,EAAE,WAAsC,EAAE,EAAgI,EAAE;YACtM,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,OAAO,CAAC;gBACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACnE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;gBAChK,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;YACjE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;QACpC,CAAC;KACF,CAAC;IAEO,QAAQ,GAAG;QAClB,GAAG,EAAE,KAAK,IAA8B,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;QACtE,aAAa,EAAE,KAAK,EAAE,OAAkC,EAAiB,EAAE;YACzE,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,iBAAiB,EAAE,KAAK,EAAE,WAAsC,EAAiB,EAAE;YACjF,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,WAAW,CAAC,CAAC;YAC5D,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACpG,CAAC;QACD,iBAAiB,EAAE,KAAK,EAAE,aAAqB,EAAE,WAAsC,EAAE,EAAiB,EAAE;YAC1G,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAkF,uBAAuB,CAAC,IAAI,EAAE,CAAC;YAC5J,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,CAAC;gBAC9D,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACzF,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,YAAY,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,aAAa,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,cAAc,EAAE,KAAK,EAAE,GAAW,EAAE,WAAsC,EAAE,EAAiB,EAAE;YAC7F,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAgG,oBAAoB,CAAC,IAAI,EAAE,CAAC;YACpK,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1I,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC;YACxD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,SAAS,EAAE,KAAK,EAAE,MAAwE,EAAiB,EAAE;YAC3G,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAA4F,kBAAkB,CAAC,IAAI,EAAE,CAAC;YAC5J,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;gBACrD,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBAChE,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;YACtD,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC;QAC7G,CAAC;KACF,CAAC;IAEO,MAAM,GAAG;QAChB,MAAM,EAAE,KAAK,EAAE,OAAe,EAAiB,EAAE;YAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YAC3G,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QACD,KAAK,EAAE,KAAK,EAAE,OAA0D,EAAiB,EAAE;YACzF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YAClG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;KACF,CAAC;IAEM,KAAK,CAAC,YAAY;QACxB,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3D,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAoB,CAAC;gBACvD,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;oBAC/D,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;oBAC1B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;oBACnC,OAAO;gBACT,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;YAAC,CAAC;QAC3D,CAAC;QAED,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,uBAAuB,CAAC;QAC1F,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAkB,QAAQ,EAAE;YAC5D,MAAM,EAAE,MAAM;YACd,eAAe,EAAE,IAAI;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,kBAAkB,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;SACrF,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;QACpC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;YACvD,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;YAC7B,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;SACjC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,OAAO,CAAc,IAAY,EAAE,OAAoD,EAAE;QACrG,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9F,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAuB,CAAC;YAC1G,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,wBAAwB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,SAAc,CAAC;QACnD,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;IACvC,CAAC;IAEO,wBAAwB;QAC9B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1G,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,EAAE;YACjD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;YACnF,IAAI,QAAQ,CAAC,MAAM;gBAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/C,CAAC,CAAC,CAAC;QACH,gBAAgB,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,CAAC;IAEO,gBAAgB;QACtB,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACvC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC5B,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1B,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,SAAS,GAAG,KAAK;QACzC,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QACtG,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,sBAAsB,CAAC;QAC7D,IAAI,SAAS,EAAE,CAAC;YACd,iGAAiG;YACjG,KAAK,KAAK,CAAC,GAAG,EAAE;gBACd,MAAM,EAAE,MAAM;gBACd,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,uBAAuB,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;oBAChD,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;iBACtC;gBACD,IAAI;aACL,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;YACnC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,OAAO,sBAAsB,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC1E,CAAC;CACF;AAED,SAAS,aAAa,CAAC,SAA4B,EAAE,eAAwB;IAC3E,MAAM,QAAQ,GAAG,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS,CAAC,CAAC,OAAO,IAAI,cAAc,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;QACjE,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC;QAC9C,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,aAAa,EAAE,CAAC;QAC1C,OAAO,CAAC,CAAC,OAAO,IAAI,UAAU,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5H,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QAAE,OAAO,UAAU,CAAC;IACxF,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IACrG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,cAAc,kBAAkB,CAAC;AAajC,4BAA4B;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1F,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { CapabilityGraph, JsonValue, Platform } from "@playporter/core";
2
+ import type { AnalyticsContext, AuthSignInResult, PurchaseResult, ServiceAdapters } from "./adapters/service-adapter.js";
3
+ export type { ServiceAdapters } from "./adapters/service-adapter.js";
4
+ /**
5
+ * AdapterRouter is the core of PlayPorter's vendor-neutral control plane.
6
+ * It resolves the right service adapter per capability and platform, and
7
+ * builds the CapabilityGraph that documents the resolved providers.
8
+ */
9
+ export declare class AdapterRouter {
10
+ private readonly adapters;
11
+ private readonly platform;
12
+ private readonly auth?;
13
+ private readonly saves?;
14
+ private readonly analyticsAdapters;
15
+ constructor(adapters: ServiceAdapters, platform: Platform);
16
+ hasAuth(): boolean;
17
+ signIn(credential: Record<string, unknown>): Promise<AuthSignInResult>;
18
+ signOut(): Promise<void>;
19
+ hasSaves(): boolean;
20
+ saveGet(playerId: string, key: string): Promise<JsonValue | null>;
21
+ saveSet(playerId: string, key: string, value: JsonValue): Promise<void>;
22
+ saveDelete(playerId: string, key: string): Promise<void>;
23
+ hasPayments(): boolean;
24
+ private resolvePayments;
25
+ purchase(sku: string, playerId: string, metadata?: Record<string, JsonValue>): Promise<PurchaseResult>;
26
+ trackExternal(event: string, properties: Record<string, JsonValue>, context: AnalyticsContext): void;
27
+ flushExternal(): Promise<void>;
28
+ buildCapabilityGraph(game: {
29
+ slug: string;
30
+ name: string;
31
+ version: string;
32
+ }): CapabilityGraph;
33
+ }
package/dist/router.js ADDED
@@ -0,0 +1,121 @@
1
+ /**
2
+ * AdapterRouter is the core of PlayPorter's vendor-neutral control plane.
3
+ * It resolves the right service adapter per capability and platform, and
4
+ * builds the CapabilityGraph that documents the resolved providers.
5
+ */
6
+ export class AdapterRouter {
7
+ adapters;
8
+ platform;
9
+ auth;
10
+ saves;
11
+ analyticsAdapters;
12
+ constructor(adapters, platform) {
13
+ this.adapters = adapters;
14
+ this.platform = platform;
15
+ this.auth = adapters.auth;
16
+ this.saves = adapters.saves;
17
+ const analytics = adapters.analytics;
18
+ if (!analytics) {
19
+ this.analyticsAdapters = [];
20
+ }
21
+ else if (Array.isArray(analytics)) {
22
+ this.analyticsAdapters = analytics;
23
+ }
24
+ else {
25
+ this.analyticsAdapters = [analytics];
26
+ }
27
+ }
28
+ // ─── Auth ───────────────────────────────────────────────────────────────────
29
+ hasAuth() {
30
+ return this.auth !== undefined && this.auth.supportedPlatforms.includes(this.platform);
31
+ }
32
+ async signIn(credential) {
33
+ if (!this.auth)
34
+ throw new Error("No auth adapter registered.");
35
+ return this.auth.signIn(credential);
36
+ }
37
+ async signOut() {
38
+ await this.auth?.signOut();
39
+ }
40
+ // ─── Saves ──────────────────────────────────────────────────────────────────
41
+ hasSaves() {
42
+ return this.saves !== undefined;
43
+ }
44
+ async saveGet(playerId, key) {
45
+ if (!this.saves)
46
+ throw new Error("No save adapter registered.");
47
+ return this.saves.get(playerId, key);
48
+ }
49
+ async saveSet(playerId, key, value) {
50
+ if (!this.saves)
51
+ throw new Error("No save adapter registered.");
52
+ return this.saves.set(playerId, key, value);
53
+ }
54
+ async saveDelete(playerId, key) {
55
+ if (!this.saves)
56
+ throw new Error("No save adapter registered.");
57
+ return this.saves.delete(playerId, key);
58
+ }
59
+ // ─── Payments ───────────────────────────────────────────────────────────────
60
+ hasPayments() {
61
+ return this.resolvePayments() !== undefined;
62
+ }
63
+ resolvePayments() {
64
+ const payments = this.adapters.payments;
65
+ if (!payments)
66
+ return undefined;
67
+ if (isPlatformMap(payments)) {
68
+ const adapter = payments[this.platform];
69
+ return adapter?.supportedPlatforms.includes(this.platform) ? adapter : undefined;
70
+ }
71
+ return payments.supportedPlatforms.includes(this.platform) ? payments : undefined;
72
+ }
73
+ async purchase(sku, playerId, metadata) {
74
+ const adapter = this.resolvePayments();
75
+ if (!adapter)
76
+ throw new Error(`No payment adapter available for platform "${this.platform}".`);
77
+ return adapter.purchase(sku, playerId, metadata);
78
+ }
79
+ // ─── Analytics ──────────────────────────────────────────────────────────────
80
+ trackExternal(event, properties, context) {
81
+ for (const adapter of this.analyticsAdapters) {
82
+ void Promise.resolve(adapter.track(event, properties, context)).catch(() => null);
83
+ }
84
+ }
85
+ async flushExternal() {
86
+ await Promise.allSettled(this.analyticsAdapters.filter((a) => a.flush).map((a) => a.flush()));
87
+ }
88
+ // ─── Capability Graph ────────────────────────────────────────────────────────
89
+ buildCapabilityGraph(game) {
90
+ const capabilities = [];
91
+ const routing = {};
92
+ if (this.auth) {
93
+ capabilities.push({ domain: "auth", provider: this.auth.providerId, platforms: [...this.auth.supportedPlatforms] });
94
+ if (this.auth.supportedPlatforms.includes(this.platform))
95
+ routing.auth = this.auth.providerId;
96
+ }
97
+ if (this.saves) {
98
+ capabilities.push({ domain: "saves", provider: this.saves.providerId, platforms: ["web", "discord", "telegram", "reddit"] });
99
+ routing.saves = this.saves.providerId;
100
+ }
101
+ const paymentsAdapter = this.resolvePayments();
102
+ if (paymentsAdapter) {
103
+ capabilities.push({ domain: "payments", provider: paymentsAdapter.providerId, platforms: [...paymentsAdapter.supportedPlatforms] });
104
+ routing.payments = paymentsAdapter.providerId;
105
+ }
106
+ else if (this.adapters.payments && !isPlatformMap(this.adapters.payments)) {
107
+ capabilities.push({ domain: "payments", provider: this.adapters.payments.providerId, platforms: [...this.adapters.payments.supportedPlatforms] });
108
+ }
109
+ for (const analytics of this.analyticsAdapters) {
110
+ capabilities.push({ domain: "analytics", provider: analytics.providerId, platforms: ["web", "discord", "telegram", "reddit"] });
111
+ }
112
+ if (this.analyticsAdapters.length > 0) {
113
+ routing.analytics = this.analyticsAdapters.map((a) => a.providerId).join("+");
114
+ }
115
+ return { game, resolvedAt: new Date().toISOString(), capabilities, routing };
116
+ }
117
+ }
118
+ function isPlatformMap(value) {
119
+ return !("providerId" in value);
120
+ }
121
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { AnalyticsServiceAdapter, AnalyticsContext } from "../adapters/service-adapter.js";
2
+ import type { JsonValue } from "@playporter/core";
3
+ export interface FirebaseAnalyticsConfig {
4
+ /** GA4 Measurement ID, e.g. "G-XXXXXXXXXX". */
5
+ measurementId: string;
6
+ /** GA4 API secret (create one in GA4 → Data Streams → Measurement Protocol API secrets). */
7
+ apiSecret: string;
8
+ }
9
+ export declare class FirebaseAnalyticsAdapter implements AnalyticsServiceAdapter {
10
+ private readonly config;
11
+ readonly providerId = "firebase-analytics";
12
+ constructor(config: FirebaseAnalyticsConfig);
13
+ track(event: string, properties: Record<string, JsonValue>, context: AnalyticsContext): void;
14
+ }
@@ -0,0 +1,27 @@
1
+ const COLLECT_URL = "https://www.google-analytics.com/mp/collect";
2
+ export class FirebaseAnalyticsAdapter {
3
+ config;
4
+ providerId = "firebase-analytics";
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ track(event, properties, context) {
9
+ const params = {
10
+ session_id: context.sessionId,
11
+ platform: context.platform,
12
+ app_version: context.appVersion,
13
+ ...properties,
14
+ };
15
+ void fetch(`${COLLECT_URL}?measurement_id=${encodeURIComponent(this.config.measurementId)}&api_secret=${encodeURIComponent(this.config.apiSecret)}`, {
16
+ method: "POST",
17
+ headers: { "content-type": "application/json" },
18
+ body: JSON.stringify({
19
+ client_id: context.playerId,
20
+ user_id: context.playerId,
21
+ events: [{ name: event.slice(0, 40), params }],
22
+ }),
23
+ keepalive: true,
24
+ });
25
+ }
26
+ }
27
+ //# sourceMappingURL=firebase-analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebase-analytics.js","sourceRoot":"","sources":["../../src/service-adapters/firebase-analytics.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,GAAG,6CAA6C,CAAC;AAElE,MAAM,OAAO,wBAAwB;IAGN;IAFpB,UAAU,GAAG,oBAAoB,CAAC;IAE3C,YAA6B,MAA+B;QAA/B,WAAM,GAAN,MAAM,CAAyB;IAAG,CAAC;IAEhE,KAAK,CAAC,KAAa,EAAE,UAAqC,EAAE,OAAyB;QACnF,MAAM,MAAM,GAA8B;YACxC,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,WAAW,EAAE,OAAO,CAAC,UAAU;YAC/B,GAAG,UAAU;SACd,CAAC;QAEF,KAAK,KAAK,CACR,GAAG,WAAW,mBAAmB,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,eAAe,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EACxI;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,SAAS,EAAE,OAAO,CAAC,QAAQ;gBAC3B,OAAO,EAAE,OAAO,CAAC,QAAQ;gBACzB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;aAC/C,CAAC;YACF,SAAS,EAAE,IAAI;SAChB,CACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import type { AuthServiceAdapter, AuthSignInResult } from "../adapters/service-adapter.js";
2
+ import type { Platform } from "@playporter/core";
3
+ export interface FirebaseAuthConfig {
4
+ apiKey: string;
5
+ projectId: string;
6
+ }
7
+ export type FirebaseSignInCredential = {
8
+ type: "google";
9
+ idToken: string;
10
+ } | {
11
+ type: "email";
12
+ email: string;
13
+ password: string;
14
+ } | {
15
+ type: "custom";
16
+ token: string;
17
+ };
18
+ export declare class FirebaseAuthAdapter implements AuthServiceAdapter {
19
+ private readonly config;
20
+ readonly providerId = "firebase";
21
+ readonly supportedPlatforms: readonly Platform[];
22
+ constructor(config: FirebaseAuthConfig);
23
+ signIn(credential: Record<string, unknown>): Promise<AuthSignInResult>;
24
+ signOut(): Promise<void>;
25
+ }
@@ -0,0 +1,53 @@
1
+ export class FirebaseAuthAdapter {
2
+ config;
3
+ providerId = "firebase";
4
+ supportedPlatforms = ["web", "discord", "telegram", "reddit"];
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ async signIn(credential) {
9
+ const typed = credential;
10
+ let endpoint;
11
+ let body;
12
+ if (typed.type === "google") {
13
+ endpoint = `https://identitytoolkit.googleapis.com/v1/accounts:signInWithIdp?key=${this.config.apiKey}`;
14
+ body = {
15
+ postBody: `id_token=${typed.idToken}&providerId=google.com`,
16
+ requestUri: globalThis.location?.origin ?? "https://localhost",
17
+ returnIdpCredential: true,
18
+ returnSecureToken: true,
19
+ };
20
+ }
21
+ else if (typed.type === "email") {
22
+ endpoint = `https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=${this.config.apiKey}`;
23
+ body = { email: typed.email, password: typed.password, returnSecureToken: true };
24
+ }
25
+ else if (typed.type === "custom") {
26
+ endpoint = `https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken?key=${this.config.apiKey}`;
27
+ body = { token: typed.token, returnSecureToken: true };
28
+ }
29
+ else {
30
+ throw new Error(`FirebaseAuthAdapter: unsupported sign-in type "${typed.type}".`);
31
+ }
32
+ const response = await fetch(endpoint, {
33
+ method: "POST",
34
+ headers: { "content-type": "application/json" },
35
+ body: JSON.stringify(body),
36
+ });
37
+ if (!response.ok) {
38
+ const err = await response.json().catch(() => ({}));
39
+ throw new Error(`Firebase sign-in failed: ${err.error?.message ?? response.statusText}`);
40
+ }
41
+ const data = await response.json();
42
+ return {
43
+ providerId: "firebase",
44
+ externalUserId: data.localId,
45
+ token: data.idToken,
46
+ profile: { displayName: data.displayName ?? null, avatarUrl: data.photoUrl ?? null },
47
+ };
48
+ }
49
+ async signOut() {
50
+ // Firebase REST API is stateless; revoke on your server if needed.
51
+ }
52
+ }
53
+ //# sourceMappingURL=firebase-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebase-auth.js","sourceRoot":"","sources":["../../src/service-adapters/firebase-auth.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,mBAAmB;IAID;IAHpB,UAAU,GAAG,UAAU,CAAC;IACxB,kBAAkB,GAAwB,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE5F,YAA6B,MAA0B;QAA1B,WAAM,GAAN,MAAM,CAAoB;IAAG,CAAC;IAE3D,KAAK,CAAC,MAAM,CAAC,UAAmC;QAC9C,MAAM,KAAK,GAAG,UAAsC,CAAC;QACrD,IAAI,QAAgB,CAAC;QACrB,IAAI,IAA6B,CAAC;QAElC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,QAAQ,GAAG,wEAAwE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACxG,IAAI,GAAG;gBACL,QAAQ,EAAE,YAAY,KAAK,CAAC,OAAO,wBAAwB;gBAC3D,UAAU,EAAE,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,mBAAmB;gBAC9D,mBAAmB,EAAE,IAAI;gBACzB,iBAAiB,EAAE,IAAI;aACxB,CAAC;QACJ,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAClC,QAAQ,GAAG,6EAA6E,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC7G,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;QACnF,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnC,QAAQ,GAAG,gFAAgF,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAChH,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,kDAAmD,KAA0B,CAAC,IAAI,IAAI,CAAC,CAAC;QAC1G,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACrC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAqC,CAAC;YACxF,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3F,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAK/B,CAAC;QAEF,OAAO;YACL,UAAU,EAAE,UAAU;YACtB,cAAc,EAAE,IAAI,CAAC,OAAO;YAC5B,KAAK,EAAE,IAAI,CAAC,OAAO;YACnB,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE;SACrF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO;QACX,mEAAmE;IACrE,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import type { AnalyticsServiceAdapter, AnalyticsContext } from "../adapters/service-adapter.js";
2
+ import type { JsonValue } from "@playporter/core";
3
+ export interface GameAnalyticsConfig {
4
+ gameKey: string;
5
+ secretKey: string;
6
+ /** Build version string sent with every event, e.g. "1.0.0 windows release". */
7
+ build?: string;
8
+ /** Override API base URL; defaults to the primary endpoint. */
9
+ apiUrl?: string;
10
+ }
11
+ export declare class GameAnalyticsAdapter implements AnalyticsServiceAdapter {
12
+ private readonly config;
13
+ readonly providerId = "gameanalytics";
14
+ private readonly queue;
15
+ constructor(config: GameAnalyticsConfig);
16
+ track(event: string, properties: Record<string, JsonValue>, context: AnalyticsContext): void;
17
+ flush(): Promise<void>;
18
+ private hmacSha256;
19
+ }
@@ -0,0 +1,55 @@
1
+ const API_BASE = "https://api.gameanalytics.com/v2";
2
+ const SDK_VERSION = "rest api v2";
3
+ const SESSION_NUM = Math.floor(Math.random() * 100_000);
4
+ export class GameAnalyticsAdapter {
5
+ config;
6
+ providerId = "gameanalytics";
7
+ queue = [];
8
+ constructor(config) {
9
+ this.config = config;
10
+ }
11
+ track(event, properties, context) {
12
+ this.queue.push({ event, properties, context });
13
+ if (this.queue.length >= 20)
14
+ void this.flush();
15
+ }
16
+ async flush() {
17
+ if (this.queue.length === 0)
18
+ return;
19
+ const batch = this.queue.splice(0, 50);
20
+ const events = batch.map(({ event, properties, context }) => ({
21
+ category: "design",
22
+ event_id: `PlayPorter:${event}`,
23
+ session_id: context.sessionId,
24
+ session_num: SESSION_NUM,
25
+ client_ts: Math.floor(Date.now() / 1000),
26
+ sdk_version: SDK_VERSION,
27
+ os_version: navigator.platform ?? "web",
28
+ manufacturer: "unknown",
29
+ device: navigator.userAgent.slice(0, 64),
30
+ platform: context.platform,
31
+ user_id: context.playerId,
32
+ build: this.config.build ?? context.appVersion,
33
+ ...properties,
34
+ }));
35
+ const body = JSON.stringify(events);
36
+ const hmac = await this.hmacSha256(this.config.secretKey, body);
37
+ await fetch(`${this.config.apiUrl ?? API_BASE}/${this.config.gameKey}/events`, {
38
+ method: "POST",
39
+ headers: {
40
+ "content-type": "application/json",
41
+ authorization: hmac,
42
+ },
43
+ body,
44
+ }).catch(() => {
45
+ this.queue.unshift(...batch.map((b) => b));
46
+ });
47
+ }
48
+ async hmacSha256(key, message) {
49
+ const enc = new TextEncoder();
50
+ const cryptoKey = await crypto.subtle.importKey("raw", enc.encode(key), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
51
+ const sig = await crypto.subtle.sign("HMAC", cryptoKey, enc.encode(message));
52
+ return btoa(String.fromCharCode(...new Uint8Array(sig)));
53
+ }
54
+ }
55
+ //# sourceMappingURL=gameanalytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gameanalytics.js","sourceRoot":"","sources":["../../src/service-adapters/gameanalytics.ts"],"names":[],"mappings":"AA4BA,MAAM,QAAQ,GAAG,kCAAkC,CAAC;AACpD,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC;AAExD,MAAM,OAAO,oBAAoB;IAIF;IAHpB,UAAU,GAAG,eAAe,CAAC;IACrB,KAAK,GAA+F,EAAE,CAAC;IAExH,YAA6B,MAA2B;QAA3B,WAAM,GAAN,MAAM,CAAqB;IAAG,CAAC;IAE5D,KAAK,CAAC,KAAa,EAAE,UAAqC,EAAE,OAAyB;QACnF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE;YAAE,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEvC,MAAM,MAAM,GAAc,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YACvE,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,cAAc,KAAK,EAAE;YAC/B,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,WAAW,EAAE,WAAW;YACxB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACxC,WAAW,EAAE,WAAW;YACxB,UAAU,EAAE,SAAS,CAAC,QAAQ,IAAI,KAAK;YACvC,YAAY,EAAE,SAAS;YACvB,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,OAAO,CAAC,QAAQ;YACzB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,UAAU;YAC9C,GAAG,UAAU;SACd,CAAC,CAAC,CAAC;QAEJ,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAEhE,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,SAAS,EAAE;YAC7E,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,IAAI;aACpB;YACD,IAAI;SACL,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,GAAW,EAAE,OAAe;QACnD,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAC7C,KAAK,EACL,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EACf,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EACjC,KAAK,EACL,CAAC,MAAM,CAAC,CACT,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import type { PaymentServiceAdapter, PurchaseResult } from "../adapters/service-adapter.js";
2
+ import type { JsonValue, Platform } from "@playporter/core";
3
+ export interface StripeAdapterConfig {
4
+ /**
5
+ * Your server endpoint that receives `{ sku, playerId, metadata }` and
6
+ * returns `{ url: string; sessionId: string }` (a Stripe Checkout Session).
7
+ */
8
+ checkoutEndpoint: string;
9
+ /**
10
+ * When true the current tab is redirected to Stripe Checkout.
11
+ * When false a new tab is opened (default: redirect).
12
+ */
13
+ openInNewTab?: boolean;
14
+ }
15
+ export declare class StripeAdapter implements PaymentServiceAdapter {
16
+ private readonly config;
17
+ readonly providerId = "stripe";
18
+ readonly supportedPlatforms: readonly Platform[];
19
+ constructor(config: StripeAdapterConfig);
20
+ purchase(sku: string, playerId: string, metadata?: Record<string, JsonValue>): Promise<PurchaseResult>;
21
+ }
@@ -0,0 +1,28 @@
1
+ export class StripeAdapter {
2
+ config;
3
+ providerId = "stripe";
4
+ supportedPlatforms = ["web"];
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ async purchase(sku, playerId, metadata = {}) {
9
+ const response = await fetch(this.config.checkoutEndpoint, {
10
+ method: "POST",
11
+ headers: { "content-type": "application/json" },
12
+ body: JSON.stringify({ sku, playerId, metadata }),
13
+ });
14
+ if (!response.ok) {
15
+ const err = await response.json().catch(() => ({}));
16
+ throw new Error(`Stripe checkout failed: ${err.error ?? response.statusText}`);
17
+ }
18
+ const { url, sessionId } = await response.json();
19
+ if (this.config.openInNewTab) {
20
+ window.open(url, "_blank");
21
+ }
22
+ else {
23
+ location.href = url;
24
+ }
25
+ return { status: "pending", transactionId: sessionId, sku, provider: "stripe" };
26
+ }
27
+ }
28
+ //# sourceMappingURL=stripe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe.js","sourceRoot":"","sources":["../../src/service-adapters/stripe.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,aAAa;IAIK;IAHpB,UAAU,GAAG,QAAQ,CAAC;IACtB,kBAAkB,GAAwB,CAAC,KAAK,CAAC,CAAC;IAE3D,YAA6B,MAA2B;QAA3B,WAAM,GAAN,MAAM,CAAqB;IAAG,CAAC;IAE5D,KAAK,CAAC,QAAQ,CAAC,GAAW,EAAE,QAAgB,EAAE,WAAsC,EAAE;QACpF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;YACzD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;SAClD,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAuB,CAAC;YAC1E,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,KAAK,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAwC,CAAC;QAEvF,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAC;QACtB,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAClF,CAAC;CACF"}
@@ -0,0 +1,37 @@
1
+ import type { AuthServiceAdapter, AuthSignInResult, SaveServiceAdapter } from "../adapters/service-adapter.js";
2
+ import type { JsonValue, Platform } from "@playporter/core";
3
+ export interface SupabaseConfig {
4
+ url: string;
5
+ anonKey: string;
6
+ }
7
+ export type SupabaseSignInCredential = {
8
+ type: "email";
9
+ email: string;
10
+ password: string;
11
+ } | {
12
+ type: "oauth";
13
+ provider: string;
14
+ accessToken: string;
15
+ };
16
+ export declare class SupabaseAuthAdapter implements AuthServiceAdapter {
17
+ private readonly config;
18
+ readonly providerId = "supabase";
19
+ readonly supportedPlatforms: readonly Platform[];
20
+ private accessToken;
21
+ constructor(config: SupabaseConfig);
22
+ signIn(credential: Record<string, unknown>): Promise<AuthSignInResult>;
23
+ signOut(): Promise<void>;
24
+ refreshToken(): Promise<string | null>;
25
+ }
26
+ export declare class SupabaseSaveAdapter implements SaveServiceAdapter {
27
+ private readonly config;
28
+ private readonly getToken;
29
+ private readonly table;
30
+ readonly providerId = "supabase";
31
+ constructor(config: SupabaseConfig, getToken: () => string | null, table?: string);
32
+ private get headers();
33
+ get(playerId: string, key: string): Promise<JsonValue | null>;
34
+ set(playerId: string, key: string, value: JsonValue): Promise<void>;
35
+ delete(playerId: string, key: string): Promise<void>;
36
+ list(playerId: string, prefix?: string): Promise<string[]>;
37
+ }
@@ -0,0 +1,106 @@
1
+ export class SupabaseAuthAdapter {
2
+ config;
3
+ providerId = "supabase";
4
+ supportedPlatforms = ["web", "discord", "telegram", "reddit"];
5
+ accessToken = null;
6
+ constructor(config) {
7
+ this.config = config;
8
+ }
9
+ async signIn(credential) {
10
+ const typed = credential;
11
+ let endpoint;
12
+ let body;
13
+ if (typed.type === "email") {
14
+ endpoint = `${this.config.url}/auth/v1/token?grant_type=password`;
15
+ body = { email: typed.email, password: typed.password };
16
+ }
17
+ else if (typed.type === "oauth") {
18
+ endpoint = `${this.config.url}/auth/v1/token?grant_type=id_token`;
19
+ body = { provider: typed.provider, id_token: typed.accessToken };
20
+ }
21
+ else {
22
+ throw new Error(`SupabaseAuthAdapter: unsupported type "${typed.type}".`);
23
+ }
24
+ const response = await fetch(endpoint, {
25
+ method: "POST",
26
+ headers: { "content-type": "application/json", apikey: this.config.anonKey },
27
+ body: JSON.stringify(body),
28
+ });
29
+ if (!response.ok) {
30
+ const err = await response.json().catch(() => ({}));
31
+ throw new Error(`Supabase sign-in failed: ${err.error_description ?? err.msg ?? response.statusText}`);
32
+ }
33
+ const data = await response.json();
34
+ this.accessToken = data.access_token;
35
+ return {
36
+ providerId: "supabase",
37
+ externalUserId: data.user.id,
38
+ token: data.access_token,
39
+ profile: {
40
+ displayName: data.user.user_metadata?.full_name ?? null,
41
+ avatarUrl: data.user.user_metadata?.avatar_url ?? null,
42
+ },
43
+ };
44
+ }
45
+ async signOut() {
46
+ if (!this.accessToken)
47
+ return;
48
+ await fetch(`${this.config.url}/auth/v1/logout`, {
49
+ method: "POST",
50
+ headers: { apikey: this.config.anonKey, authorization: `Bearer ${this.accessToken}` },
51
+ }).catch(() => null);
52
+ this.accessToken = null;
53
+ }
54
+ async refreshToken() {
55
+ return this.accessToken;
56
+ }
57
+ }
58
+ // ─── Saves ────────────────────────────────────────────────────────────────────
59
+ export class SupabaseSaveAdapter {
60
+ config;
61
+ getToken;
62
+ table;
63
+ providerId = "supabase";
64
+ constructor(config, getToken, table = "player_saves") {
65
+ this.config = config;
66
+ this.getToken = getToken;
67
+ this.table = table;
68
+ }
69
+ get headers() {
70
+ const token = this.getToken();
71
+ return {
72
+ "content-type": "application/json",
73
+ apikey: this.config.anonKey,
74
+ ...(token ? { authorization: `Bearer ${token}` } : {}),
75
+ };
76
+ }
77
+ async get(playerId, key) {
78
+ const url = `${this.config.url}/rest/v1/${this.table}?player_id=eq.${encodeURIComponent(playerId)}&key=eq.${encodeURIComponent(key)}&select=value&limit=1`;
79
+ const response = await fetch(url, { headers: this.headers });
80
+ if (!response.ok)
81
+ return null;
82
+ const rows = await response.json();
83
+ return rows[0]?.value ?? null;
84
+ }
85
+ async set(playerId, key, value) {
86
+ await fetch(`${this.config.url}/rest/v1/${this.table}`, {
87
+ method: "POST",
88
+ headers: { ...this.headers, prefer: "resolution=merge-duplicates" },
89
+ body: JSON.stringify({ player_id: playerId, key, value }),
90
+ });
91
+ }
92
+ async delete(playerId, key) {
93
+ await fetch(`${this.config.url}/rest/v1/${this.table}?player_id=eq.${encodeURIComponent(playerId)}&key=eq.${encodeURIComponent(key)}`, { method: "DELETE", headers: this.headers });
94
+ }
95
+ async list(playerId, prefix) {
96
+ let url = `${this.config.url}/rest/v1/${this.table}?player_id=eq.${encodeURIComponent(playerId)}&select=key`;
97
+ if (prefix)
98
+ url += `&key=like.${encodeURIComponent(`${prefix}%`)}`;
99
+ const response = await fetch(url, { headers: this.headers });
100
+ if (!response.ok)
101
+ return [];
102
+ const rows = await response.json();
103
+ return rows.map((row) => row.key);
104
+ }
105
+ }
106
+ //# sourceMappingURL=supabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.js","sourceRoot":"","sources":["../../src/service-adapters/supabase.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,mBAAmB;IAKD;IAJpB,UAAU,GAAG,UAAU,CAAC;IACxB,kBAAkB,GAAwB,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACpF,WAAW,GAAkB,IAAI,CAAC;IAE1C,YAA6B,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IAEvD,KAAK,CAAC,MAAM,CAAC,UAAmC;QAC9C,MAAM,KAAK,GAAG,UAAsC,CAAC;QACrD,IAAI,QAAgB,CAAC;QACrB,IAAI,IAA6B,CAAC;QAElC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,QAAQ,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,oCAAoC,CAAC;YAClE,IAAI,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC1D,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAClC,QAAQ,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,oCAAoC,CAAC;YAClE,IAAI,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,0CAA2C,KAA0B,CAAC,IAAI,IAAI,CAAC,CAAC;QAClG,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACrC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YAC5E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAiD,CAAC;YACpG,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,CAAC,iBAAiB,IAAI,GAAG,CAAC,GAAG,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACzG,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAG/B,CAAC;QAEF,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;QACrC,OAAO;YACL,UAAU,EAAE,UAAU;YACtB,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;YAC5B,KAAK,EAAE,IAAI,CAAC,YAAY;YACxB,OAAO,EAAE;gBACP,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,IAAI,IAAI;gBACvD,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,IAAI,IAAI;aACvD;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAC9B,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,iBAAiB,EAAE;YAC/C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE,EAAE;SACtF,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,iFAAiF;AAEjF,MAAM,OAAO,mBAAmB;IAIX;IACA;IACA;IALV,UAAU,GAAG,UAAU,CAAC;IAEjC,YACmB,MAAsB,EACtB,QAA6B,EAC7B,QAAQ,cAAc;QAFtB,WAAM,GAAN,MAAM,CAAgB;QACtB,aAAQ,GAAR,QAAQ,CAAqB;QAC7B,UAAK,GAAL,KAAK,CAAiB;IACtC,CAAC;IAEJ,IAAY,OAAO;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,OAAO;YACL,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;YAC3B,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,QAAgB,EAAE,GAAW;QACrC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,YAAY,IAAI,CAAC,KAAK,iBAAiB,kBAAkB,CAAC,QAAQ,CAAC,WAAW,kBAAkB,CAAC,GAAG,CAAC,uBAAuB,CAAC;QAC3J,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAiC,CAAC;QAClE,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,QAAgB,EAAE,GAAW,EAAE,KAAgB;QACvD,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,YAAY,IAAI,CAAC,KAAK,EAAE,EAAE;YACtD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,6BAA6B,EAAE;YACnE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;SAC1D,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,GAAW;QACxC,MAAM,KAAK,CACT,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,YAAY,IAAI,CAAC,KAAK,iBAAiB,kBAAkB,CAAC,QAAQ,CAAC,WAAW,kBAAkB,CAAC,GAAG,CAAC,EAAE,EACzH,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAC5C,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,MAAe;QAC1C,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,YAAY,IAAI,CAAC,KAAK,iBAAiB,kBAAkB,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC7G,IAAI,MAAM;YAAE,GAAG,IAAI,aAAa,kBAAkB,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC;QACnE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA4B,CAAC;QAC7D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import type { PaymentServiceAdapter, PurchaseResult } from "../adapters/service-adapter.js";
2
+ import type { JsonValue, Platform } from "@playporter/core";
3
+ export interface XsollaAdapterConfig {
4
+ /**
5
+ * Your server endpoint that receives `{ sku, playerId, metadata }` and
6
+ * returns `{ token: string }` (an Xsolla Pay Station access token).
7
+ */
8
+ tokenEndpoint: string;
9
+ /** Override Pay Station URL; defaults to the live endpoint. */
10
+ payStationUrl?: string;
11
+ /** Enable Xsolla sandbox mode. */
12
+ sandbox?: boolean;
13
+ }
14
+ export declare class XsollaAdapter implements PaymentServiceAdapter {
15
+ private readonly config;
16
+ readonly providerId = "xsolla";
17
+ readonly supportedPlatforms: readonly Platform[];
18
+ constructor(config: XsollaAdapterConfig);
19
+ purchase(sku: string, playerId: string, metadata?: Record<string, JsonValue>): Promise<PurchaseResult>;
20
+ }
@@ -0,0 +1,26 @@
1
+ const PAY_STATION_URL = "https://secure.xsolla.com/paystation4";
2
+ export class XsollaAdapter {
3
+ config;
4
+ providerId = "xsolla";
5
+ supportedPlatforms = ["web"];
6
+ constructor(config) {
7
+ this.config = config;
8
+ }
9
+ async purchase(sku, playerId, metadata = {}) {
10
+ const response = await fetch(this.config.tokenEndpoint, {
11
+ method: "POST",
12
+ headers: { "content-type": "application/json" },
13
+ body: JSON.stringify({ sku, playerId, metadata }),
14
+ });
15
+ if (!response.ok) {
16
+ const err = await response.json().catch(() => ({}));
17
+ throw new Error(`Xsolla token creation failed: ${err.error ?? response.statusText}`);
18
+ }
19
+ const { token } = await response.json();
20
+ const base = this.config.payStationUrl ?? PAY_STATION_URL;
21
+ const sandbox = this.config.sandbox ? "&sandbox=1" : "";
22
+ window.open(`${base}/?access_token=${token}${sandbox}`, "_blank");
23
+ return { status: "pending", transactionId: token, sku, provider: "xsolla" };
24
+ }
25
+ }
26
+ //# sourceMappingURL=xsolla.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xsolla.js","sourceRoot":"","sources":["../../src/service-adapters/xsolla.ts"],"names":[],"mappings":"AAeA,MAAM,eAAe,GAAG,uCAAuC,CAAC;AAEhE,MAAM,OAAO,aAAa;IAIK;IAHpB,UAAU,GAAG,QAAQ,CAAC;IACtB,kBAAkB,GAAwB,CAAC,KAAK,CAAC,CAAC;IAE3D,YAA6B,MAA2B;QAA3B,WAAM,GAAN,MAAM,CAAqB;IAAG,CAAC;IAE5D,KAAK,CAAC,QAAQ,CAAC,GAAW,EAAE,QAAgB,EAAE,WAAsC,EAAE;QACpF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;YACtD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;SAClD,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAuB,CAAC;YAC1E,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,CAAC,KAAK,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAuB,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,eAAe,CAAC;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,kBAAkB,KAAK,GAAG,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;QAElE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAC9E,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playporter/sdk",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -15,7 +15,7 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "@discord/embedded-app-sdk": "^2.4.0",
18
- "@playporter/core": "0.1.0"
18
+ "@playporter/core": "0.2.0"
19
19
  },
20
20
  "scripts": {
21
21
  "build": "tsc -p tsconfig.json",