@ticketlayer/live 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.
Files changed (89) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +198 -0
  3. package/dist/auto.d.ts +31 -0
  4. package/dist/auto.d.ts.map +1 -0
  5. package/dist/auto.js +78 -0
  6. package/dist/auto.js.map +1 -0
  7. package/dist/client.d.ts +538 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +495 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/clientHeader.d.ts +4 -0
  12. package/dist/clientHeader.d.ts.map +1 -0
  13. package/dist/clientHeader.js +25 -0
  14. package/dist/clientHeader.js.map +1 -0
  15. package/dist/core/liveClient.d.ts +176 -0
  16. package/dist/core/liveClient.d.ts.map +1 -0
  17. package/dist/core/liveClient.js +372 -0
  18. package/dist/core/liveClient.js.map +1 -0
  19. package/dist/createLiveClient.d.ts +49 -0
  20. package/dist/createLiveClient.d.ts.map +1 -0
  21. package/dist/createLiveClient.js +91 -0
  22. package/dist/createLiveClient.js.map +1 -0
  23. package/dist/elements.d.ts +88 -0
  24. package/dist/elements.d.ts.map +1 -0
  25. package/dist/elements.js +165 -0
  26. package/dist/elements.js.map +1 -0
  27. package/dist/generated/types.d.ts +6110 -0
  28. package/dist/generated/types.d.ts.map +1 -0
  29. package/dist/generated/types.js +6 -0
  30. package/dist/generated/types.js.map +1 -0
  31. package/dist/index.d.ts +35 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +18 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/native/asyncStorageStorage.d.ts +24 -0
  36. package/dist/native/asyncStorageStorage.d.ts.map +1 -0
  37. package/dist/native/asyncStorageStorage.js +24 -0
  38. package/dist/native/asyncStorageStorage.js.map +1 -0
  39. package/dist/native/checkoutUrl.d.ts +85 -0
  40. package/dist/native/checkoutUrl.d.ts.map +1 -0
  41. package/dist/native/checkoutUrl.js +147 -0
  42. package/dist/native/checkoutUrl.js.map +1 -0
  43. package/dist/native/index.d.ts +119 -0
  44. package/dist/native/index.d.ts.map +1 -0
  45. package/dist/native/index.js +145 -0
  46. package/dist/native/index.js.map +1 -0
  47. package/dist/native/secureStoreStorage.d.ts +33 -0
  48. package/dist/native/secureStoreStorage.d.ts.map +1 -0
  49. package/dist/native/secureStoreStorage.js +39 -0
  50. package/dist/native/secureStoreStorage.js.map +1 -0
  51. package/dist/native/storage.d.ts +29 -0
  52. package/dist/native/storage.d.ts.map +1 -0
  53. package/dist/native/storage.js +24 -0
  54. package/dist/native/storage.js.map +1 -0
  55. package/dist/server.d.ts +95 -0
  56. package/dist/server.d.ts.map +1 -0
  57. package/dist/server.js +188 -0
  58. package/dist/server.js.map +1 -0
  59. package/dist/state/buyModal.d.ts +24 -0
  60. package/dist/state/buyModal.d.ts.map +1 -0
  61. package/dist/state/buyModal.js +56 -0
  62. package/dist/state/buyModal.js.map +1 -0
  63. package/dist/state/checkoutModal.d.ts +26 -0
  64. package/dist/state/checkoutModal.d.ts.map +1 -0
  65. package/dist/state/checkoutModal.js +126 -0
  66. package/dist/state/checkoutModal.js.map +1 -0
  67. package/dist/state/emitter.d.ts +21 -0
  68. package/dist/state/emitter.d.ts.map +1 -0
  69. package/dist/state/emitter.js +26 -0
  70. package/dist/state/emitter.js.map +1 -0
  71. package/dist/state/loadElements.d.ts +8 -0
  72. package/dist/state/loadElements.d.ts.map +1 -0
  73. package/dist/state/loadElements.js +39 -0
  74. package/dist/state/loadElements.js.map +1 -0
  75. package/dist/state/registry.d.ts +39 -0
  76. package/dist/state/registry.d.ts.map +1 -0
  77. package/dist/state/registry.js +65 -0
  78. package/dist/state/registry.js.map +1 -0
  79. package/dist/state/theme.d.ts +20 -0
  80. package/dist/state/theme.d.ts.map +1 -0
  81. package/dist/state/theme.js +47 -0
  82. package/dist/state/theme.js.map +1 -0
  83. package/dist/ticketlayer.js +5 -0
  84. package/dist/ticketlayer.js.map +7 -0
  85. package/dist/version.d.ts +7 -0
  86. package/dist/version.d.ts.map +1 -0
  87. package/dist/version.js +7 -0
  88. package/dist/version.js.map +1 -0
  89. package/package.json +80 -0
@@ -0,0 +1,91 @@
1
+ import { LiveClient } from './client.js';
2
+ import { publishClient } from './state/registry.js';
3
+ import { loadElements } from './state/loadElements.js';
4
+ import { installCheckoutModal } from './state/checkoutModal.js';
5
+ import { installBuyModal } from './state/buyModal.js';
6
+ import { createElementsConnector } from './elements.js';
7
+ import { API_DATED_VERSION } from './client.js';
8
+ import { TicketlayerLive } from './core/liveClient.js';
9
+ /**
10
+ * Browser adapter over the runtime-neutral core in ./core/liveClient.ts:
11
+ * resolves the channel from the page host, picks the session transport
12
+ * (cookie for a hosted storefront, token for embeds), publishes the client on
13
+ * `window.Ticketlayer`, applies the theme and mounts the modals. The class
14
+ * itself is re-exported here so existing imports keep working.
15
+ */
16
+ export { TicketlayerLive };
17
+ /** Resolve a hosted storefront's publishable key by domain (GET /channel). */
18
+ async function resolveChannelKey(baseUrl, domain) {
19
+ try {
20
+ const res = await fetch(`${baseUrl.replace(/\/$/, '')}/channel?domain=${encodeURIComponent(domain)}`, { headers: { accept: 'application/json' } });
21
+ if (!res.ok)
22
+ return undefined;
23
+ const json = (await res.json());
24
+ return json?.data?.publishableKey;
25
+ }
26
+ catch {
27
+ return undefined;
28
+ }
29
+ }
30
+ export async function createLiveClient(options) {
31
+ const domain = options.domain ?? (typeof window !== 'undefined' ? window.location.host : undefined);
32
+ // Resolve the channel's publishable key - the READ credential. Embeds pass it
33
+ // directly; a hosted storefront resolves it ONCE by domain and then uses it
34
+ // for all reads (no per-read domain lookup, no session). Browsing never
35
+ // creates a session - that happens lazily on the first mutation/login.
36
+ let publishableKey = options.publishableKey;
37
+ if (!publishableKey && !options.sessionToken && domain) {
38
+ publishableKey = await resolveChannelKey(options.baseUrl, domain);
39
+ }
40
+ // Transport: embed/handoff use the header (token); a hosted storefront uses
41
+ // the cookie for its (lazily-created) session.
42
+ const isEmbed = !!options.publishableKey || !!options.sessionToken;
43
+ const sessionMode = options.sessionMode ?? (isEmbed ? 'token' : 'cookie');
44
+ const client = new LiveClient({
45
+ ...options,
46
+ sessionMode,
47
+ ...(publishableKey ? { publishableKey } : {}),
48
+ });
49
+ const tl = new TicketlayerLive(client, {
50
+ sessionMode,
51
+ baseUrl: options.baseUrl,
52
+ ...(publishableKey ? { publishableKey } : {}),
53
+ ...(domain ? { domain } : {}),
54
+ });
55
+ // Publish the singleton + Elements connector so Elements bind immediately.
56
+ if (options.publish !== false && typeof window !== 'undefined') {
57
+ publishClient(tl, createElementsConnector(tl), API_DATED_VERSION);
58
+ }
59
+ // Third-party embeds: auto-open the hosted checkout iframe on checkout intents.
60
+ if (options.checkout?.mode === 'modal' && typeof window !== 'undefined') {
61
+ installCheckoutModal(tl, options.checkout);
62
+ }
63
+ // In-page buy-tickets modal (occurrence → ticket selection). Native Elements
64
+ // overlay mounted on `ui:event-modal-requested`; works on HBO and embeds. Tied
65
+ // to the published client (the one driving on-page UI), opt out via buyModal.
66
+ if (options.buyModal !== false && options.publish !== false && typeof window !== 'undefined') {
67
+ installBuyModal(tl);
68
+ }
69
+ const elementsLoad = loadElements(options).catch((err) => {
70
+ console.error('[live] Elements auto-load failed', err);
71
+ });
72
+ if (options.autoStart !== false) {
73
+ // Embed iframe resumes a handed-off session; everyone else stays
74
+ // session-less until the first mutation. Theme applies via the pk.
75
+ if (options.sessionToken) {
76
+ await tl.resume(options.sessionToken);
77
+ }
78
+ else if (sessionMode === 'cookie' && typeof window !== 'undefined') {
79
+ // Hosted browser: if a session cookie already exists (a returning visitor
80
+ // mid-purchase, or a refresh/deep-link), rehydrate its cart without
81
+ // creating a session. A brand-new visitor 401s here and stays lazy.
82
+ await tl.resumeIfExists().catch(() => undefined);
83
+ }
84
+ if (options.applyTheme !== false && typeof window !== 'undefined') {
85
+ await tl.theme.apply().catch(() => undefined);
86
+ }
87
+ }
88
+ await elementsLoad;
89
+ return tl;
90
+ }
91
+ //# sourceMappingURL=createLiveClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createLiveClient.js","sourceRoot":"","sources":["../src/createLiveClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Elements connector - adapts the stateful {@link TicketlayerLive} facade to the
3
+ * structural interface `@ticketlayer/elements` components consume.
4
+ *
5
+ * Elements never import @ticketlayer/live directly: they bind to a generic
6
+ * shape published on a window global (`setSDK(...)`), so the SDK and the
7
+ * components can ship as separate bundles (e.g. the Elements CDN build). This
8
+ * adapter is the bridge a host (HBO, a promoter site) installs:
9
+ *
10
+ * import { createLiveClient, createElementsConnector } from '@ticketlayer/live';
11
+ * import { setSDK } from '@ticketlayer/elements';
12
+ * const tl = await createLiveClient({ ... });
13
+ * setSDK(createElementsConnector(tl));
14
+ *
15
+ * Two responsibilities the components expect that the facade doesn't expose 1:1:
16
+ * - cart line items need a `categoryId` the components never pass; we resolve
17
+ * it from the ticketTypeId captured when `getTicketTypes()` was called (the
18
+ * ticket selector always loads types before adding - so the cache is warm).
19
+ * - modal verbs (`event(id).openModal()`, `checkout.openModal()`, `closeModal()`)
20
+ * are UI INTENTS: the SDK renders no UI, it relays them onto the shared bus
21
+ * (ui:event-modal-requested / ui:checkout-requested / ui:modal-close-requested)
22
+ * and the host opens the modal. Caller callbacks ride along in the payload.
23
+ */
24
+ import type { TicketlayerLive, PresaleRedemption } from './createLiveClient.js';
25
+ export interface ModalOptions {
26
+ occurrenceId?: string;
27
+ onComplete?: (order: unknown) => void;
28
+ onError?: (error: Error) => void;
29
+ onClose?: () => void;
30
+ }
31
+ export interface ElementsConnector {
32
+ getEventsManager(): {
33
+ list(options?: {
34
+ limit?: number;
35
+ category?: string;
36
+ }): Promise<{
37
+ items: unknown[];
38
+ }>;
39
+ get(eventId: string): Promise<unknown>;
40
+ getTicketTypes(eventId: string, occurrenceId: string): Promise<unknown[]>;
41
+ };
42
+ getCartManager(): {
43
+ get(): Promise<unknown>;
44
+ on(event: string, cb: (data: unknown) => void): () => void;
45
+ off(event: string, cb: (data: unknown) => void): void;
46
+ addItem(ticketTypeId: string, quantity: number, occurrenceId: string): Promise<unknown>;
47
+ addItems(items: Array<{
48
+ ticketTypeId: string;
49
+ quantity: number;
50
+ occurrenceId: string;
51
+ }>): Promise<unknown>;
52
+ removeItem(itemId: string): Promise<unknown>;
53
+ addSeat(seatId: string, ticketTypeId: string, occurrenceId: string): Promise<unknown>;
54
+ removeSeat(seatId: string, occurrenceId: string): Promise<unknown>;
55
+ };
56
+ getOrdersManager(): {
57
+ mine(): Promise<unknown>;
58
+ get(orderId: string): Promise<unknown>;
59
+ ticketPdf(orderId: string, passId: string): Promise<Blob>;
60
+ };
61
+ /** Magic-link sign-in (tl-login, tl-my-orders). Never sees a password. */
62
+ getAuthManager(): {
63
+ readonly customer: unknown | null;
64
+ readonly authenticated: boolean;
65
+ requestMagicLink(contact: {
66
+ email?: string;
67
+ phone?: string;
68
+ }): Promise<unknown>;
69
+ exchange(code: string): Promise<unknown>;
70
+ logout(): Promise<void>;
71
+ };
72
+ /** Presale / promo codes (tl-promo-code). */
73
+ getPresaleManager(): {
74
+ redeem(code: string): Promise<PresaleRedemption>;
75
+ };
76
+ on(event: string, cb: (data: unknown) => void): () => void;
77
+ off(event: string, cb: (data: unknown) => void): void;
78
+ event(eventId: string): {
79
+ openModal(options?: ModalOptions): void;
80
+ };
81
+ checkout: {
82
+ openModal(options?: ModalOptions): void;
83
+ closeModal(): void;
84
+ };
85
+ closeModal(): void;
86
+ }
87
+ export declare function createElementsConnector(tl: TicketlayerLive): ElementsConnector;
88
+ //# sourceMappingURL=elements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elements.d.ts","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Adapt the sales-surface cart view to the shape Elements consume. The sales
3
+ * view exposes `itemsSubtotal` + per-item `subtotal`; the components (tl-cart,
4
+ * badges) were written against `subtotal`/`total`/`fees` + per-item
5
+ * `totalPrice`. Add those aliases (and itemCount) without dropping the
6
+ * originals - otherwise tl-cart formats undefined → £NaN. No fees concept on
7
+ * the sales surface yet, so fees=0 and total=subtotal. Money stays minor units.
8
+ */
9
+ const withCount = (cart) => {
10
+ if (!cart || typeof cart !== 'object')
11
+ return cart;
12
+ const c = cart;
13
+ const items = (c.items ?? []).map((i) => {
14
+ const it = i;
15
+ const qty = it.quantity ?? 0;
16
+ const line = it.subtotal ?? it.unitPrice * qty;
17
+ return { ...it, totalPrice: it.totalPrice ?? line };
18
+ });
19
+ const itemCount = items.reduce((sum, i) => sum + (i.quantity ?? 0), 0);
20
+ const subtotal = c.itemsSubtotal ?? c.subtotal ?? 0;
21
+ return {
22
+ ...c,
23
+ items,
24
+ itemCount,
25
+ subtotal,
26
+ fees: c.fees ?? 0,
27
+ total: c.total ?? subtotal,
28
+ };
29
+ };
30
+ export function createElementsConnector(tl) {
31
+ // ticketTypeId → { categoryId, occurrenceId }, captured on getTicketTypes so
32
+ // addItem/addSeat can supply the categoryId the cart API requires.
33
+ const ttMeta = new Map();
34
+ const resolve = (ticketTypeId, occurrenceId) => {
35
+ const meta = ttMeta.get(ticketTypeId);
36
+ if (!meta?.categoryId) {
37
+ throw new Error(`[live] No category known for ticket type ${ticketTypeId}. ` +
38
+ `Load the occurrence's ticket types (getTicketTypes) before adding it to the cart.`);
39
+ }
40
+ return { categoryId: meta.categoryId, occurrenceId: occurrenceId || meta.occurrenceId };
41
+ };
42
+ const eventsManager = {
43
+ async list(options) {
44
+ const res = (await tl.events.list());
45
+ // Adapt the sales-surface LISTING shape to the structural shape
46
+ // tl-event-card consumes. Two shape gaps the card otherwise renders blank:
47
+ // - venue/date are flat (venueName/venueCity/nextOccurrenceAt) on the
48
+ // listing but nested (venue.{name,city} / nextOccurrence.startsAt) on
49
+ // the card.
50
+ // - the card reads `imageUrl`; the listing already carries it (surface
51
+ // explicitly rather than relying on a passthrough spread).
52
+ // A listing's own id is the channel-listing id (lst_/schl_), but cards
53
+ // navigate by EVENT id, so we surface eventId as `id`.
54
+ let items = (res?.listings ?? []).map((l) => ({
55
+ id: l.eventId ?? l.id,
56
+ name: l.name ?? '',
57
+ ...(l.shortDescription ? { shortDescription: l.shortDescription } : {}),
58
+ ...(l.imageUrl ? { imageUrl: l.imageUrl } : {}),
59
+ ...(l.venueName
60
+ ? { venue: { id: '', name: l.venueName, city: l.venueCity ?? '' } }
61
+ : {}),
62
+ ...(l.nextOccurrenceAt ? { nextOccurrence: { startsAt: l.nextOccurrenceAt } } : {}),
63
+ availabilityStatus: 'available',
64
+ }));
65
+ if (options?.limit)
66
+ items = items.slice(0, options.limit);
67
+ return { items };
68
+ },
69
+ get: (eventId) => tl.events.get(eventId),
70
+ async getTicketTypes(eventId, occurrenceId) {
71
+ const ev = (await tl.events.get(eventId));
72
+ const occ = ev?.occurrences?.find((o) => o.id === occurrenceId) ?? ev?.occurrences?.[0];
73
+ const tts = occ?.ticketTypes ?? [];
74
+ return tts.map((tt) => {
75
+ if (occ)
76
+ ttMeta.set(tt.ticketTypeId, { categoryId: tt.categoryId, occurrenceId: occ.id });
77
+ return {
78
+ id: tt.ticketTypeId,
79
+ name: tt.ticketTypeName,
80
+ description: tt.description,
81
+ price: tt.unitPrice, // minor units; components divide by 100 to display
82
+ currency: tt.currency,
83
+ categoryId: tt.categoryId,
84
+ categoryName: tt.categoryName,
85
+ // The sales surface view doesn't expose per-order limits/remaining yet;
86
+ // sensible defaults until the catalogue view carries them.
87
+ maxPerOrder: 10,
88
+ available: 999,
89
+ };
90
+ });
91
+ },
92
+ };
93
+ const cartManager = {
94
+ // Cache-first. The SDK keeps `_cart` authoritative - mutations update it and
95
+ // every `cart:updated` carries the full cart - so Elements reading the cart
96
+ // must NOT each trigger a GET. We return the cached cart and only fetch when
97
+ // nothing is cached yet. This stops the fetch storm when several cart-aware
98
+ // Elements mount, and breaks any cart:updated → get() → refresh →
99
+ // cart:updated feedback loop (which was tripping the rate limiter).
100
+ get: async () => withCount(tl.cart.current ?? (await tl.cart.refresh())),
101
+ on: (event, cb) => tl.on(event, (p) => cb(event === 'cart:updated' ? withCount(p) : p)),
102
+ off: (event, cb) => tl.off(event, cb),
103
+ addItem: async (ticketTypeId, quantity, occurrenceId) => {
104
+ const { categoryId, occurrenceId: occ } = resolve(ticketTypeId, occurrenceId);
105
+ return withCount(await tl.cart.add({ eventOccurrenceId: occ, categoryId, ticketTypeId, quantity }));
106
+ },
107
+ addItems: async (items) => {
108
+ let last = tl.cart.current;
109
+ for (const it of items)
110
+ last = await cartManager.addItem(it.ticketTypeId, it.quantity, it.occurrenceId);
111
+ return last;
112
+ },
113
+ removeItem: async (itemId) => withCount(await tl.cart.remove(itemId)),
114
+ addSeat: async (seatId, ticketTypeId, occurrenceId) => {
115
+ const { categoryId, occurrenceId: occ } = resolve(ticketTypeId, occurrenceId);
116
+ return withCount(await tl.cart.add({ eventOccurrenceId: occ, categoryId, ticketTypeId, eventLayoutSeatIds: [seatId] }));
117
+ },
118
+ removeSeat: async (_seatId, _occurrenceId) => {
119
+ // The cart line-item view doesn't expose seat ids, so seat→lineItem can't
120
+ // be mapped here yet. Seat removal flows through removeItem(itemId) until
121
+ // the view carries seat references.
122
+ console.warn('[live] removeSeat is a no-op until cart items expose seat ids; use removeItem(itemId).');
123
+ return withCount((await tl.cart.refresh()) ?? tl.cart.current);
124
+ },
125
+ };
126
+ const ordersManager = {
127
+ mine: () => tl.orders.mine(),
128
+ get: (orderId) => tl.orders.get(orderId),
129
+ ticketPdf: (orderId, passId) => tl.orders.ticketPdf(orderId, passId),
130
+ };
131
+ // Getters read the facade's session state live, so a component that asks
132
+ // after auth:changed sees the new customer without holding its own copy.
133
+ const authManager = {
134
+ get customer() {
135
+ return tl.auth.customer;
136
+ },
137
+ get authenticated() {
138
+ return tl.auth.authenticated;
139
+ },
140
+ requestMagicLink: (contact) => tl.auth.requestMagicLink(contact),
141
+ exchange: (code) => tl.auth.exchange(code),
142
+ logout: () => tl.auth.logout(),
143
+ };
144
+ const presaleManager = {
145
+ redeem: (code) => tl.presale.redeem(code),
146
+ };
147
+ return {
148
+ getEventsManager: () => eventsManager,
149
+ getCartManager: () => cartManager,
150
+ getOrdersManager: () => ordersManager,
151
+ getAuthManager: () => authManager,
152
+ getPresaleManager: () => presaleManager,
153
+ on: (event, cb) => tl.on(event, cb),
154
+ off: (event, cb) => tl.off(event, cb),
155
+ event: (eventId) => ({
156
+ openModal: (options = {}) => tl.emit('ui:event-modal-requested', { eventId, ...options }),
157
+ }),
158
+ checkout: {
159
+ openModal: (options = {}) => tl.emit('ui:checkout-requested', options),
160
+ closeModal: () => tl.emit('ui:modal-close-requested'),
161
+ },
162
+ closeModal: () => tl.emit('ui:modal-close-requested'),
163
+ };
164
+ }
165
+ //# sourceMappingURL=elements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elements.js","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"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"}