Skip to content

Commit

Permalink
format
Browse files Browse the repository at this point in the history
  • Loading branch information
emilwidlund committed Feb 8, 2025
1 parent f798821 commit ec871d6
Show file tree
Hide file tree
Showing 8 changed files with 202 additions and 206 deletions.
2 changes: 1 addition & 1 deletion packages/adapter-utils/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export * from "./webhooks/webhooks";
export * from "./entitlement/entitlement";
export * from './usage/usage'
export * from "./usage/usage";
16 changes: 8 additions & 8 deletions packages/adapter-utils/src/usage/core.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
export type Transformer<T> = (ctx: T) => Promise<void>;

export class UsageEngine<T> {
transformers: Transformer<T>[] = [];
transformers: Transformer<T>[] = [];

public pipe(transformer: Transformer<T>) {
this.transformers.push(transformer);
public pipe(transformer: Transformer<T>) {
this.transformers.push(transformer);

return this;
}
return this;
}

public async run(ctx: T) {
await Promise.all(this.transformers.map((transformer) => transformer(ctx)));
}
public async run(ctx: T) {
await Promise.all(this.transformers.map((transformer) => transformer(ctx)));
}
}
94 changes: 47 additions & 47 deletions packages/adapter-utils/src/usage/meter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,63 +2,63 @@ import { Polar } from "@polar-sh/sdk";
import { UsageEngine } from "./core";

export interface UsageMeterConfig {
accessToken?: string;
server?: "sandbox" | "production";
accessToken?: string;
server?: "sandbox" | "production";
}

export interface UsageMeterContext<
TUsage extends Record<string, number> = Record<string, number>,
TRequest = unknown,
TUsage extends Record<string, number> = Record<string, number>,
TRequest = unknown,
> {
customerId: string;
usage: TUsage;
req: TRequest;
customerId: string;
usage: TUsage;
req: TRequest;
}

export class UsageMeter<
TContext extends UsageMeterContext = UsageMeterContext,
TContext extends UsageMeterContext = UsageMeterContext,
> extends UsageEngine<TContext> {
private polarClient: Polar;
private polarClient: Polar;

constructor(config?: UsageMeterConfig) {
super();
constructor(config?: UsageMeterConfig) {
super();

this.polarClient = new Polar({
accessToken: config?.accessToken,
server: config?.server,
});
}
this.polarClient = new Polar({
accessToken: config?.accessToken,
server: config?.server,
});
}

public async ingest({
metadata,
meter,
customerId,
}: {
metadata: Record<string, number>;
meter: string;
customerId: string;
}) {
await this.polarClient.events.ingest({
events: [
{
customerId,
name: meter,
metadata,
},
],
});
}
public async ingest({
metadata,
meter,
customerId,
}: {
metadata: Record<string, number>;
meter: string;
customerId: string;
}) {
await this.polarClient.events.ingest({
events: [
{
customerId,
name: meter,
metadata,
},
],
});
}

public meter(
meter: string,
transformer: (ctx: TContext) => Record<string, number>,
) {
return this.pipe(async (ctx) => {
await this.ingest({
meter,
metadata: transformer(ctx),
customerId: ctx.customerId,
});
});
}
public meter(
meter: string,
transformer: (ctx: TContext) => Record<string, number>,
) {
return this.pipe(async (ctx) => {
await this.ingest({
meter,
metadata: transformer(ctx),
customerId: ctx.customerId,
});
});
}
}
159 changes: 79 additions & 80 deletions packages/adapter-utils/src/usage/usage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,91 +3,90 @@ import { UsageMeter, UsageMeterConfig, type UsageMeterContext } from "./meter";
export * from "./meter";

type Handler<TRequest, TResponse> = (
req: TRequest,
res: TResponse,
req: TRequest,
res: TResponse,
) => Promise<TResponse>;

export type UsageStrategy<TRequest, TUsageContext, TStrategyClient> = (
req: TRequest,
meterHandler: (context: TUsageContext) => Promise<void>,
getCustomerId: (req: TRequest) => Promise<string> | string | undefined,
req: TRequest,
meterHandler: (context: TUsageContext) => Promise<void>,
getCustomerId: (req: TRequest) => Promise<string> | string | undefined,
) => TStrategyClient;

export class Usage<
TRequest,
TResponse,
TContext extends UsageMeterContext = UsageMeterContext,
TStrategyClient = never,
TRequest,
TResponse,
TContext extends UsageMeterContext = UsageMeterContext,
TStrategyClient = never,
> {
private usageMeter: UsageMeter<TContext>;
private getCustomerId?: (
req: TRequest,
) => Promise<string> | string | undefined;
private strategyHandler?: UsageStrategy<TRequest, TContext, TStrategyClient>;

constructor(config?: UsageMeterConfig) {
this.usageMeter = new UsageMeter(config);
}

private createMeterHandler() {
return async (context: TContext) => {
await this.usageMeter.run(context);
};
}

public customer(callback: (req: TRequest) => Promise<string> | string) {
this.getCustomerId = callback;

return this;
}

public strategy<
TStrategyContext extends UsageMeterContext,
TNewStrategyClient,
>(handler: UsageStrategy<TRequest, TStrategyContext, TNewStrategyClient>) {
this.strategyHandler = handler as any;
return this as unknown as Usage<
TRequest,
TResponse,
TStrategyContext,
TNewStrategyClient
>;
}

public meter(
meter: string,
transformer: (ctx: TContext) => Record<string, number>,
) {
this.usageMeter.meter(meter, transformer);

return this;
}

public handler<TResponse>(
callback: (
req: TRequest,
res: TResponse,
strategyClient: TStrategyClient,
) => Promise<TResponse> | TResponse,
): Handler<TRequest, TResponse> {
return async (req: TRequest, res: TResponse) => {
if (!this.strategyHandler) {
throw new Error("Strategy handler is not set");
}

if (!this.getCustomerId) {
throw new Error("Customer ID resolver is not set");
}

const meterHandler = this.createMeterHandler();
const strategyClient = this.strategyHandler(
req,
meterHandler,
this.getCustomerId,
);

return callback(req, res, strategyClient);
};
}
private usageMeter: UsageMeter<TContext>;
private getCustomerId?: (
req: TRequest,
) => Promise<string> | string | undefined;
private strategyHandler?: UsageStrategy<TRequest, TContext, TStrategyClient>;

constructor(config?: UsageMeterConfig) {
this.usageMeter = new UsageMeter(config);
}

private createMeterHandler() {
return async (context: TContext) => {
await this.usageMeter.run(context);
};
}

public customer(callback: (req: TRequest) => Promise<string> | string) {
this.getCustomerId = callback;

return this;
}

public strategy<
TStrategyContext extends UsageMeterContext,
TNewStrategyClient,
>(handler: UsageStrategy<TRequest, TStrategyContext, TNewStrategyClient>) {
this.strategyHandler = handler as any;
return this as unknown as Usage<
TRequest,
TResponse,
TStrategyContext,
TNewStrategyClient
>;
}

public meter(
meter: string,
transformer: (ctx: TContext) => Record<string, number>,
) {
this.usageMeter.meter(meter, transformer);

return this;
}

public handler<TResponse>(
callback: (
req: TRequest,
res: TResponse,
strategyClient: TStrategyClient,
) => Promise<TResponse> | TResponse,
): Handler<TRequest, TResponse> {
return async (req: TRequest, res: TResponse) => {
if (!this.strategyHandler) {
throw new Error("Strategy handler is not set");
}

if (!this.getCustomerId) {
throw new Error("Customer ID resolver is not set");
}

const meterHandler = this.createMeterHandler();
const strategyClient = this.strategyHandler(
req,
meterHandler,
this.getCustomerId,
);

return callback(req, res, strategyClient);
};
}
}

5 changes: 1 addition & 4 deletions packages/adapter-utils/src/webhooks/webhooks.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
import {
Entitlements,
EntitlementStrategy,
} from "../entitlement/entitlement";
import { Entitlements, EntitlementStrategy } from "../entitlement/entitlement";
import { handleWebhookPayload } from "./webhooks";
import { describe, expect, it, vi } from "vitest";

Expand Down
2 changes: 1 addition & 1 deletion packages/adapter-utils/src/webhooks/webhooks.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { validateEvent } from "@polar-sh/sdk/webhooks";
import type { WebhookBenefitCreatedPayload } from '@polar-sh/sdk/models/components/webhookbenefitcreatedpayload';
import type { WebhookBenefitCreatedPayload } from "@polar-sh/sdk/models/components/webhookbenefitcreatedpayload";
import type { WebhookBenefitGrantCreatedPayload } from "@polar-sh/sdk/models/components/webhookbenefitgrantcreatedpayload";
import type { WebhookBenefitGrantRevokedPayload } from "@polar-sh/sdk/models/components/webhookbenefitgrantrevokedpayload";
import type { WebhookBenefitGrantUpdatedPayload } from "@polar-sh/sdk/models/components/webhookbenefitgrantupdatedpayload";
Expand Down
2 changes: 1 addition & 1 deletion packages/strategies/src/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export * from "./usage/LLMStrategy/LLMStrategy";
export * from "./usage/LLMStrategy/LLMStrategy";
Loading

0 comments on commit ec871d6

Please sign in to comment.