@dvina/billing-sdk 0.0.1

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,133 @@
1
+ import { AddSeatsMutationVariables, ChangeBillingCycleMutationVariables, CreateCheckoutSessionMutationVariables, DowngradePlanMutationVariables, EntitlementDetail, EntitlementTier, PlanQueryVariables, RemoveSeatsMutationVariables, UpgradePlanMutationVariables } from '../generated/sdk';
2
+ import type { BillingClientConfig, SubscriptionStream } from './types';
3
+ export declare class DvinaBillingSDK {
4
+ private readonly endpoint;
5
+ private httpClient;
6
+ private sdk;
7
+ private authToken?;
8
+ private readonly transport;
9
+ private readonly subscriptionStreams;
10
+ constructor(config: BillingClientConfig);
11
+ setToken(token: string | undefined): this;
12
+ get plans(): {
13
+ list: () => Promise<{
14
+ id: string;
15
+ name: string;
16
+ tier?: EntitlementTier | null | undefined;
17
+ features?: any;
18
+ prices: {
19
+ id: string;
20
+ currency: string;
21
+ amount?: number | null | undefined;
22
+ interval?: import("../generated/sdk").PriceInterval | null | undefined;
23
+ }[];
24
+ entitlements: {
25
+ canAddUser: boolean;
26
+ minUsers?: number | null | undefined;
27
+ team: boolean;
28
+ capacity?: number | null | undefined;
29
+ sourceTypes?: string[] | null | undefined;
30
+ softTokenUsageLimit?: number | null | undefined;
31
+ hardTokenUsageLimit?: number | null | undefined;
32
+ softWebSearchLimit?: number | null | undefined;
33
+ hardWebSearchLimit?: number | null | undefined;
34
+ canAddReport: boolean;
35
+ canUseApi: boolean;
36
+ maxStructuredSize?: number | null | undefined;
37
+ maxUnstructuredSize?: number | null | undefined;
38
+ };
39
+ }[]>;
40
+ get: (variables: PlanQueryVariables) => Promise<{
41
+ id: string;
42
+ name: string;
43
+ tier?: EntitlementTier | null | undefined;
44
+ features?: any;
45
+ prices: {
46
+ id: string;
47
+ currency: string;
48
+ amount?: number | null | undefined;
49
+ interval?: import("../generated/sdk").PriceInterval | null | undefined;
50
+ }[];
51
+ entitlements: {
52
+ canAddUser: boolean;
53
+ minUsers?: number | null | undefined;
54
+ team: boolean;
55
+ capacity?: number | null | undefined;
56
+ sourceTypes?: string[] | null | undefined;
57
+ softTokenUsageLimit?: number | null | undefined;
58
+ hardTokenUsageLimit?: number | null | undefined;
59
+ softWebSearchLimit?: number | null | undefined;
60
+ hardWebSearchLimit?: number | null | undefined;
61
+ canAddReport: boolean;
62
+ canUseApi: boolean;
63
+ maxStructuredSize?: number | null | undefined;
64
+ maxUnstructuredSize?: number | null | undefined;
65
+ };
66
+ } | null | undefined>;
67
+ entitlements: () => Promise<Record<EntitlementTier, EntitlementDetail>>;
68
+ tierOrders: () => Promise<any>;
69
+ };
70
+ get subscription(): {
71
+ get: () => Promise<{
72
+ tier: EntitlementTier;
73
+ provider?: import("../generated/sdk").SubscriptionProvider | null | undefined;
74
+ cycle?: import("../generated/sdk").SubscriptionCycle | null | undefined;
75
+ seats: number;
76
+ cancelAtPeriodEnd?: boolean | null | undefined;
77
+ currentPeriodEnd?: any;
78
+ scheduledChange?: {
79
+ effectiveDate: any;
80
+ newTier?: EntitlementTier | null | undefined;
81
+ newSeats?: number | null | undefined;
82
+ newCycle?: import("../generated/sdk").SubscriptionCycle | null | undefined;
83
+ } | null | undefined;
84
+ }>;
85
+ updates: SubscriptionStream<{
86
+ tier: EntitlementTier;
87
+ provider?: import("../generated/sdk").SubscriptionProvider | null | undefined;
88
+ cycle?: import("../generated/sdk").SubscriptionCycle | null | undefined;
89
+ seats: number;
90
+ cancelAtPeriodEnd?: boolean | null | undefined;
91
+ currentPeriodEnd?: any;
92
+ scheduledChange?: {
93
+ effectiveDate: any;
94
+ newTier?: EntitlementTier | null | undefined;
95
+ newSeats?: number | null | undefined;
96
+ newCycle?: import("../generated/sdk").SubscriptionCycle | null | undefined;
97
+ } | null | undefined;
98
+ }>;
99
+ entitlements: () => Promise<{
100
+ canAddUser: boolean;
101
+ minUsers?: number | null | undefined;
102
+ team: boolean;
103
+ capacity?: number | null | undefined;
104
+ sourceTypes?: string[] | null | undefined;
105
+ softTokenUsageLimit?: number | null | undefined;
106
+ hardTokenUsageLimit?: number | null | undefined;
107
+ softWebSearchLimit?: number | null | undefined;
108
+ hardWebSearchLimit?: number | null | undefined;
109
+ canAddReport: boolean;
110
+ canUseApi: boolean;
111
+ maxStructuredSize?: number | null | undefined;
112
+ maxUnstructuredSize?: number | null | undefined;
113
+ }>;
114
+ upgrade: (variables: UpgradePlanMutationVariables) => Promise<boolean>;
115
+ downgrade: (variables: DowngradePlanMutationVariables) => Promise<boolean>;
116
+ changeBillingCycle: (variables: ChangeBillingCycleMutationVariables) => Promise<boolean>;
117
+ cancel: () => Promise<boolean>;
118
+ reactivate: () => Promise<boolean>;
119
+ releaseSchedule: () => Promise<boolean>;
120
+ };
121
+ get seats(): {
122
+ add: (variables: AddSeatsMutationVariables) => Promise<boolean>;
123
+ remove: (variables: RemoveSeatsMutationVariables) => Promise<boolean>;
124
+ };
125
+ get checkout(): {
126
+ createSession: (variables: CreateCheckoutSessionMutationVariables) => Promise<{
127
+ url: string;
128
+ }>;
129
+ };
130
+ }
131
+ export default DvinaBillingSDK;
132
+ export type { BillingClientConfig, SubscriptionStreamOptions, SubscriptionSink, SubscriptionStream } from './types';
133
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AACA,OAAO,EACN,yBAAyB,EACzB,mCAAmC,EACnC,sCAAsC,EACtC,8BAA8B,EAC9B,iBAAiB,EACjB,eAAe,EAEf,kBAAkB,EAClB,4BAA4B,EAI5B,4BAA4B,EAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAIvE,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwB;IAClD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAElC;gBAEU,MAAM,EAAE,mBAAmB;IAiBvC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS;IAelC,IAAI,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAMgB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAIjB,QAAQ,OAAO,eAAe,EAAE,iBAAiB,CAAC,CAAC;;MAS5E;IAGD,IAAI,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAWa,4BAA4B;+BAI1B,8BAA8B;wCAIrB,mCAAmC;;;;MAiB1E;IAGD,IAAI,KAAK;yBAEgB,yBAAyB;4BAItB,4BAA4B;MAKvD;IAGD,IAAI,QAAQ;mCAEuB,sCAAsC;;;MAKxE;CACD;AAED,eAAe,eAAe,CAAC;AAE/B,YAAY,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DvinaBillingSDK = void 0;
4
+ const graphql_request_1 = require("graphql-request");
5
+ const sdk_1 = require("../generated/sdk");
6
+ const transport_1 = require("./subscription/transport");
7
+ const stream_1 = require("./subscription/stream");
8
+ class DvinaBillingSDK {
9
+ constructor(config) {
10
+ this.endpoint = config.endpoint;
11
+ this.httpClient = new graphql_request_1.GraphQLClient(this.endpoint);
12
+ this.sdk = (0, sdk_1.getSdk)(this.httpClient);
13
+ this.transport = new transport_1.SubscriptionTransport({
14
+ endpoint: this.endpoint,
15
+ getAuthorization: () => (this.authToken ? `Bearer ${this.authToken}` : undefined),
16
+ });
17
+ this.subscriptionStreams = {
18
+ updates: (0, stream_1.createSubscriptionStream)(this.transport, sdk_1.SubscriptionUpdatesDocument, (data) => data.subscription ?? undefined),
19
+ };
20
+ }
21
+ setToken(token) {
22
+ this.authToken = token || undefined;
23
+ if (token) {
24
+ this.httpClient.setHeader('Authorization', `Bearer ${token}`);
25
+ }
26
+ else {
27
+ this.httpClient = new graphql_request_1.GraphQLClient(this.endpoint);
28
+ this.sdk = (0, sdk_1.getSdk)(this.httpClient);
29
+ }
30
+ this.transport.reset();
31
+ return this;
32
+ }
33
+ get plans() {
34
+ return {
35
+ list: async () => {
36
+ const result = await this.sdk.Plans();
37
+ return result.plans;
38
+ },
39
+ get: async (variables) => {
40
+ const result = await this.sdk.Plan(variables);
41
+ return result.plan;
42
+ },
43
+ entitlements: async () => {
44
+ const result = await this.sdk.Entitlements();
45
+ return result.entitlements;
46
+ },
47
+ tierOrders: async () => {
48
+ const result = await this.sdk.TierOrders();
49
+ return result.tierOrders;
50
+ },
51
+ };
52
+ }
53
+ get subscription() {
54
+ return {
55
+ get: async () => {
56
+ const result = await this.sdk.Subscription();
57
+ return result.subscription;
58
+ },
59
+ updates: this.subscriptionStreams.updates,
60
+ entitlements: async () => {
61
+ const result = await this.sdk.SubscriptionEntitlements();
62
+ return result.subscriptionEntitlements;
63
+ },
64
+ upgrade: async (variables) => {
65
+ const result = await this.sdk.UpgradePlan(variables);
66
+ return result.upgradePlan;
67
+ },
68
+ downgrade: async (variables) => {
69
+ const result = await this.sdk.DowngradePlan(variables);
70
+ return result.downgradePlan;
71
+ },
72
+ changeBillingCycle: async (variables) => {
73
+ const result = await this.sdk.ChangeBillingCycle(variables);
74
+ return result.changeBillingCycle;
75
+ },
76
+ cancel: async () => {
77
+ const result = await this.sdk.CancelSubscription();
78
+ return result.cancelSubscription;
79
+ },
80
+ reactivate: async () => {
81
+ const result = await this.sdk.ReactivateSubscription();
82
+ return result.reactivateSubscription;
83
+ },
84
+ releaseSchedule: async () => {
85
+ const result = await this.sdk.ReleaseSchedule();
86
+ return result.releaseSchedule;
87
+ },
88
+ };
89
+ }
90
+ get seats() {
91
+ return {
92
+ add: async (variables) => {
93
+ const result = await this.sdk.AddSeats(variables);
94
+ return result.addSeats;
95
+ },
96
+ remove: async (variables) => {
97
+ const result = await this.sdk.RemoveSeats(variables);
98
+ return result.removeSeats;
99
+ },
100
+ };
101
+ }
102
+ get checkout() {
103
+ return {
104
+ createSession: async (variables) => {
105
+ const result = await this.sdk.CreateCheckoutSession(variables);
106
+ return result.createCheckoutSession;
107
+ },
108
+ };
109
+ }
110
+ }
111
+ exports.DvinaBillingSDK = DvinaBillingSDK;
112
+ exports.default = DvinaBillingSDK;
113
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { DocumentNode } from 'graphql';
2
+ import type { SubscriptionStream } from '../types';
3
+ import type { SubscriptionTransport } from './transport';
4
+ export declare function createSubscriptionStream<TData, TValue>(transport: SubscriptionTransport, document: DocumentNode, extractValue: (data: TData) => TValue | undefined): SubscriptionStream<TValue>;
5
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../../src/client/subscription/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAA+C,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAChG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EACrD,SAAS,EAAE,qBAAqB,EAChC,QAAQ,EAAE,YAAY,EACtB,YAAY,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,GAAG,SAAS,GAC/C,kBAAkB,CAAC,MAAM,CAAC,CAqC5B"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSubscriptionStream = void 0;
4
+ function createSubscriptionStream(transport, document, extractValue) {
5
+ const subscribe = (sink, options) => transport.subscribe(document, {
6
+ next: (result) => {
7
+ if (result.errors?.length) {
8
+ sink.error?.(result.errors);
9
+ return;
10
+ }
11
+ const value = result.data ? extractValue(result.data) : undefined;
12
+ if (value !== undefined) {
13
+ sink.next(value);
14
+ }
15
+ },
16
+ error: (error) => {
17
+ sink.error?.(error);
18
+ },
19
+ complete: () => {
20
+ sink.complete?.();
21
+ },
22
+ }, options);
23
+ const iterable = (options) => createAsyncIterator(subscribe, options);
24
+ return {
25
+ subscribe,
26
+ iterable,
27
+ asyncIterator: iterable,
28
+ };
29
+ }
30
+ exports.createSubscriptionStream = createSubscriptionStream;
31
+ function createAsyncIterator(subscribeFn, options) {
32
+ const pullQueue = [];
33
+ const pushQueue = [];
34
+ let listening = true;
35
+ let error;
36
+ let cleanup = null;
37
+ const runCleanup = async () => {
38
+ if (!cleanup)
39
+ return;
40
+ const toRun = cleanup;
41
+ cleanup = null;
42
+ const result = toRun();
43
+ if (result instanceof Promise) {
44
+ await result;
45
+ }
46
+ };
47
+ const stopListening = () => {
48
+ if (!listening)
49
+ return;
50
+ listening = false;
51
+ pushQueue.length = 0;
52
+ while (pullQueue.length > 0) {
53
+ const entry = pullQueue.shift();
54
+ entry?.resolve({ value: undefined, done: true });
55
+ }
56
+ };
57
+ const rejectPending = (reason) => {
58
+ while (pullQueue.length > 0) {
59
+ const entry = pullQueue.shift();
60
+ entry?.reject(reason);
61
+ }
62
+ };
63
+ cleanup = subscribeFn({
64
+ next: (value) => {
65
+ if (!listening)
66
+ return;
67
+ if (pullQueue.length > 0) {
68
+ const entry = pullQueue.shift();
69
+ entry?.resolve({ value, done: false });
70
+ }
71
+ else {
72
+ pushQueue.push(value);
73
+ }
74
+ },
75
+ error: (err) => {
76
+ error = err ?? new Error('Subscription stream failed.');
77
+ rejectPending(error);
78
+ stopListening();
79
+ void runCleanup();
80
+ },
81
+ complete: () => {
82
+ stopListening();
83
+ void runCleanup();
84
+ },
85
+ }, options);
86
+ const iterator = {
87
+ next: () => {
88
+ if (error) {
89
+ const err = error;
90
+ error = undefined;
91
+ return Promise.reject(err);
92
+ }
93
+ if (pushQueue.length > 0) {
94
+ const value = pushQueue.shift();
95
+ return Promise.resolve({ value, done: false });
96
+ }
97
+ if (!listening) {
98
+ return Promise.resolve({ value: undefined, done: true });
99
+ }
100
+ return new Promise((resolve, reject) => {
101
+ pullQueue.push({ resolve, reject });
102
+ });
103
+ },
104
+ return: async () => {
105
+ stopListening();
106
+ await runCleanup();
107
+ return { value: undefined, done: true };
108
+ },
109
+ throw: async (err) => {
110
+ error = err ?? new Error('Subscription stream aborted.');
111
+ rejectPending(error);
112
+ await runCleanup();
113
+ return Promise.reject(error);
114
+ },
115
+ [Symbol.asyncIterator]() {
116
+ return this;
117
+ },
118
+ };
119
+ return iterator;
120
+ }
121
+ //# sourceMappingURL=stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../src/client/subscription/stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { FormattedExecutionResult } from 'graphql-ws';
2
+ import type { DocumentNode } from 'graphql';
3
+ export type SubscriptionCleanup = () => void | Promise<void>;
4
+ export interface SubscriptionHandlers<TData> {
5
+ next: (result: FormattedExecutionResult<TData>) => void;
6
+ error?: (error: unknown) => void;
7
+ complete?: () => void;
8
+ }
9
+ export interface SubscriptionTransportOptions {
10
+ endpoint: string;
11
+ getAuthorization: () => string | undefined;
12
+ }
13
+ export declare class SubscriptionTransport {
14
+ private readonly options;
15
+ private client?;
16
+ constructor(options: SubscriptionTransportOptions);
17
+ subscribe<TData>(document: DocumentNode, handlers: SubscriptionHandlers<TData>, options?: {
18
+ signal?: AbortSignal;
19
+ }): SubscriptionCleanup;
20
+ reset(): void;
21
+ private ensureClient;
22
+ private buildConnectionParams;
23
+ }
24
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/client/subscription/transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA6B,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEtF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,MAAM,mBAAmB,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE7D,MAAM,WAAW,oBAAoB,CAAC,KAAK;IAC1C,IAAI,EAAE,CAAC,MAAM,EAAE,wBAAwB,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;IACxD,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED,qBAAa,qBAAqB;IAGrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,MAAM,CAAC,CAAkB;gBAEJ,OAAO,EAAE,4BAA4B;IAElE,SAAS,CAAC,KAAK,EACd,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,oBAAoB,CAAC,KAAK,CAAC,EACrC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAChC,mBAAmB;IActB,KAAK;IAOL,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,qBAAqB;CAQ7B"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SubscriptionTransport = void 0;
4
+ const graphql_ws_1 = require("graphql-ws");
5
+ const graphql_1 = require("graphql");
6
+ class SubscriptionTransport {
7
+ constructor(options) {
8
+ this.options = options;
9
+ }
10
+ subscribe(document, handlers, options) {
11
+ const client = this.ensureClient();
12
+ const cleanup = client.subscribe({ query: (0, graphql_1.print)(document) }, {
13
+ next: handlers.next,
14
+ error: handlers.error ?? (() => { }),
15
+ complete: handlers.complete ?? (() => { }),
16
+ });
17
+ return attachSignal(cleanup, options?.signal);
18
+ }
19
+ reset() {
20
+ if (this.client) {
21
+ void this.client.dispose();
22
+ this.client = undefined;
23
+ }
24
+ }
25
+ ensureClient() {
26
+ if (!this.client) {
27
+ this.client = (0, graphql_ws_1.createClient)({
28
+ url: resolveWebSocketUrl(this.options.endpoint),
29
+ lazy: true,
30
+ connectionParams: () => this.buildConnectionParams(),
31
+ });
32
+ }
33
+ return this.client;
34
+ }
35
+ buildConnectionParams() {
36
+ const authorization = this.options.getAuthorization();
37
+ if (!authorization) {
38
+ return undefined;
39
+ }
40
+ return { Authorization: authorization };
41
+ }
42
+ }
43
+ exports.SubscriptionTransport = SubscriptionTransport;
44
+ function resolveWebSocketUrl(endpoint) {
45
+ const url = new URL(endpoint);
46
+ if (url.protocol === 'http:') {
47
+ url.protocol = 'ws:';
48
+ }
49
+ else if (url.protocol === 'https:') {
50
+ url.protocol = 'wss:';
51
+ }
52
+ else if (url.protocol !== 'ws:' && url.protocol !== 'wss:') {
53
+ throw new Error(`Unsupported endpoint protocol "${url.protocol}" for subscriptions.`);
54
+ }
55
+ return url.toString();
56
+ }
57
+ function attachSignal(cleanup, signal) {
58
+ if (!signal) {
59
+ return cleanup;
60
+ }
61
+ let disposed = false;
62
+ const wrappedCleanup = () => {
63
+ if (disposed) {
64
+ return undefined;
65
+ }
66
+ disposed = true;
67
+ signal.removeEventListener('abort', abortListener);
68
+ return cleanup();
69
+ };
70
+ const abortListener = () => {
71
+ void wrappedCleanup();
72
+ };
73
+ if (signal.aborted) {
74
+ void wrappedCleanup();
75
+ return wrappedCleanup;
76
+ }
77
+ signal.addEventListener('abort', abortListener, { once: true });
78
+ return wrappedCleanup;
79
+ }
80
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/client/subscription/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface BillingClientConfig {
2
+ endpoint: string;
3
+ }
4
+ export interface SubscriptionStreamOptions {
5
+ signal?: AbortSignal;
6
+ }
7
+ export interface SubscriptionSink<T> {
8
+ next(value: T): void;
9
+ error?: (error: unknown) => void;
10
+ complete?: () => void;
11
+ }
12
+ export interface SubscriptionStream<T> {
13
+ subscribe(sink: SubscriptionSink<T>, options?: SubscriptionStreamOptions): () => void | Promise<void>;
14
+ iterable(options?: SubscriptionStreamOptions): AsyncIterableIterator<T>;
15
+ asyncIterator(options?: SubscriptionStreamOptions): AsyncIterableIterator<T>;
16
+ }
17
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACzC,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACpC,SAAS,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,yBAAyB,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtG,QAAQ,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACxE,aAAa,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC;CAC7E"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":""}