dritan-sdk 0.1.2 → 0.3.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -2
- package/dist/index.cjs +14 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -2
- package/dist/index.d.ts +11 -2
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/package.json +12 -2
package/README.md
CHANGED
|
@@ -59,6 +59,15 @@ const agg = await client.getTokenAggregated("So111111111111111111111111111111111
|
|
|
59
59
|
console.log(agg.price.priceUsd, agg.metadata?.name, agg.risk?.top10, agg.bondingCurvePercent);
|
|
60
60
|
```
|
|
61
61
|
|
|
62
|
+
### Deployer stats
|
|
63
|
+
|
|
64
|
+
Given a token mint, returns the deployer/creator wallet along with how many tokens they've launched that have completed bonding (often called "graduated").
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
const stats = await client.getDeployerStats("So11111111111111111111111111111111111111112");
|
|
68
|
+
console.log(stats.deployer, stats.bonded, stats.nonBonded);
|
|
69
|
+
```
|
|
70
|
+
|
|
62
71
|
## Swap
|
|
63
72
|
|
|
64
73
|
Dritan can build an unsigned swap transaction (base64) for you to sign, then you broadcast the signed transaction.
|
|
@@ -88,10 +97,10 @@ console.log(sent.signature);
|
|
|
88
97
|
|
|
89
98
|
## Websocket streams
|
|
90
99
|
|
|
91
|
-
Connect to a dex stream (for example `pumpamm
|
|
100
|
+
Connect to a dex stream (for example `pumpamm` (PumpSwap), `pumpfun` (Pump.fun), `moonit` (Moonit), `launchlab` (Raydium LaunchLab), `amm`, `cpmm`, `clmm`, `orca` (Orca Whirlpools), `dbc` (Meteora DBC), `dlmm`, `damm2`, `damm1`).
|
|
92
101
|
|
|
93
102
|
```ts
|
|
94
|
-
const stream = client.streamDex("
|
|
103
|
+
const stream = client.streamDex("amm", {
|
|
95
104
|
onMessage: (event) => {
|
|
96
105
|
// `event` is parsed JSON when possible, otherwise raw string.
|
|
97
106
|
console.log(event);
|
package/dist/index.cjs
CHANGED
|
@@ -130,6 +130,20 @@ var DritanClient = class {
|
|
|
130
130
|
bondingCurvePercent: raw?.bondingCurvePercent === void 0 ? null : raw?.bondingCurvePercent ?? null
|
|
131
131
|
};
|
|
132
132
|
}
|
|
133
|
+
async getDeployerStats(mint) {
|
|
134
|
+
const url = buildUrl(this.baseUrl, `/token/deployer-stats/${encodeURIComponent(mint)}`);
|
|
135
|
+
const res = await this.fetchImpl(url, {
|
|
136
|
+
method: "GET",
|
|
137
|
+
headers: {
|
|
138
|
+
"x-api-key": this.apiKey
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
if (!res.ok) {
|
|
142
|
+
const text = await res.text().catch(() => "");
|
|
143
|
+
throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);
|
|
144
|
+
}
|
|
145
|
+
return await res.json();
|
|
146
|
+
}
|
|
133
147
|
async buildSwap(body) {
|
|
134
148
|
const url = buildUrl(this.baseUrl, "/swap/build");
|
|
135
149
|
const res = await this.fetchImpl(url, {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["WebSocketImpl"],"mappings":"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","file":"index.cjs","sourcesContent":["import WebSocketImpl from \"isomorphic-ws\";\n\nexport type DritanClientOptions = {\n apiKey: string;\n baseUrl?: string;\n wsBaseUrl?: string;\n fetch?: typeof fetch;\n WebSocket?: typeof WebSocketImpl;\n};\n\nexport type KnownDexStream =\n | \"pumpamm\"\n | \"pumpfun\"\n | \"launchlab\"\n | \"dlmm\"\n | \"damm2\"\n | \"damm1\"\n | \"dbc\";\n\nexport type MeteoraThsClientOptions = {\n baseUrl?: string;\n fetch?: typeof fetch;\n};\n\nexport type TokenPriceResponse = {\n mint: string;\n dex: string;\n priceUsd: number;\n marketCap: number | null;\n liquiditySol: number | null;\n};\n\nexport type TokenMetadataResponse = {\n mint: string;\n programId: string;\n name: string;\n symbol: string;\n uri: string;\n decimals: number;\n supply: string;\n};\n\nexport type RiskGroup = {\n count: number;\n totalPercentage: number;\n};\n\nexport type TokenRiskResponse = {\n mint: string;\n globalFeesPaid: number;\n bundlers: RiskGroup;\n insiders: RiskGroup;\n snipers: RiskGroup;\n top10: number;\n devPercentage: number | null;\n};\n\nexport type TokenFirstBuyersResponse = {\n mint: string;\n buyers: unknown;\n};\n\nexport type TokenAggregatedResponse = {\n mint: string;\n price: TokenPriceResponse;\n metadata: TokenMetadataResponse | null;\n risk: TokenRiskResponse | null;\n bondingCurvePercent: number | null;\n};\n\nexport type DritanStreamOptions = {\n query?: Record<string, string | number | boolean | undefined | null>;\n /**\n * When true, includes the api key as `?apiKey=...` in the websocket URL.\n * This is required when using native browser websockets (custom headers are not supported).\n */\n sendApiKeyInQuery?: boolean;\n onOpen?: () => void;\n onClose?: (ev: CloseEvent) => void;\n onError?: (ev: Event) => void;\n onMessage?: (data: unknown) => void;\n};\n\nexport type DritanStreamHandle = {\n socket: WebSocket;\n close: () => void;\n};\n\nexport type SwapBuildRequest = {\n userPublicKey: string;\n inputMint: string;\n outputMint: string;\n amount: number | string;\n slippageBps?: number;\n swapType?: string;\n feeWallet?: string;\n feeBps?: number;\n feePercent?: number;\n};\n\nexport type SwapBuildFees = {\n platformFeeBps: number;\n platformFeeLamports: number;\n userFeeBps: number;\n userFeeLamports: number;\n tipLamports: number;\n};\n\nexport type SwapBuildResponse = {\n transactionBase64: string;\n fees: SwapBuildFees;\n quote: unknown;\n};\n\nexport type SwapBroadcastResponse = {\n signature: string;\n};\n\nexport type ThsTotals = {\n buys: number;\n sells: number;\n};\n\nexport type ThsResponse = {\n wallet: string;\n score: number;\n realizedPnLUsd: number;\n realizedPnLWeightedUsd: number;\n totals: ThsTotals;\n analyzedTxns: number;\n matchedTxCount: number;\n unmatchedTxCount: number;\n avgHoldTimeDays: number;\n avgHoldTimeHours: number;\n avgHoldTimeMinutes: number;\n avgHoldTimeSeconds: number;\n avgHoldTimePretty: string;\n};\n\nfunction buildUrl(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/+$/, \"\")}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`;\n}\n\nfunction buildWsUrl(\n wsBaseUrl: string,\n path: string,\n query?: Record<string, string | number | boolean | undefined | null>\n): string {\n const url = new URL(buildUrl(wsBaseUrl, path));\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\nfunction safeJsonParse(payload: string): unknown {\n try {\n return JSON.parse(payload) as unknown;\n } catch {\n return payload;\n }\n}\n\nfunction isNodeRuntime(): boolean {\n return (\n typeof process !== \"undefined\" &&\n typeof (process as any).versions?.node === \"string\"\n );\n}\n\nfunction messageToString(data: unknown): string | null {\n if (typeof data === \"string\") return data;\n\n // ws (node) can emit Buffer\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(data)) {\n return data.toString(\"utf8\");\n }\n\n // browser ws can emit ArrayBuffer\n if (data instanceof ArrayBuffer) {\n return new TextDecoder().decode(new Uint8Array(data));\n }\n\n return null;\n}\n\nexport class DritanClient {\n readonly apiKey: string;\n readonly baseUrl: string;\n readonly wsBaseUrl: string;\n private readonly fetchImpl: typeof fetch;\n private readonly WebSocketCtor: typeof WebSocketImpl;\n\n constructor(options: DritanClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? \"https://us-east.dritan.dev\";\n this.wsBaseUrl = options.wsBaseUrl ?? \"wss://us-east.dritan.dev\";\n this.fetchImpl = options.fetch ?? fetch;\n this.WebSocketCtor = options.WebSocket ?? WebSocketImpl;\n }\n\n async getTokenPrice(mint: string): Promise<TokenPriceResponse> {\n const url = buildUrl(this.baseUrl, `/token/price/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenPriceResponse;\n }\n\n async getTokenMetadata(mint: string): Promise<TokenMetadataResponse> {\n const url = buildUrl(this.baseUrl, `/token/metadata/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenMetadataResponse;\n }\n\n async getTokenRisk(mint: string): Promise<TokenRiskResponse> {\n const url = buildUrl(this.baseUrl, `/token/risk/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenRiskResponse;\n }\n\n async getFirstBuyers(mint: string): Promise<TokenFirstBuyersResponse> {\n const url = buildUrl(this.baseUrl, `/token/first-buyers/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenFirstBuyersResponse;\n }\n\n async getTokenAggregated(mint: string): Promise<TokenAggregatedResponse> {\n const url = buildUrl(this.baseUrl, `/token/aggregated/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n const raw = (await res.json()) as any;\n return {\n mint: String(raw?.mint ?? mint),\n price: raw?.price as TokenPriceResponse,\n metadata: raw?.metadata ?? null,\n risk: raw?.risk ?? null,\n bondingCurvePercent:\n raw?.bondingCurvePercent === undefined ? null : (raw?.bondingCurvePercent ?? null)\n };\n }\n\n async buildSwap(body: SwapBuildRequest): Promise<SwapBuildResponse> {\n const url = buildUrl(this.baseUrl, \"/swap/build\");\n const res = await this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify(body ?? {})\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as SwapBuildResponse;\n }\n\n async broadcastSwap(signedTransactionBase64: string): Promise<SwapBroadcastResponse> {\n const url = buildUrl(this.baseUrl, \"/swap/broadcast\");\n const res = await this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify({ signedTransactionBase64 })\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as SwapBroadcastResponse;\n }\n\n streamDex(dex: KnownDexStream, options?: DritanStreamOptions): DritanStreamHandle;\n streamDex(dex: string, options?: DritanStreamOptions): DritanStreamHandle;\n streamDex(dex: string, options: DritanStreamOptions = {}): DritanStreamHandle {\n const shouldSendKeyInQuery = options.sendApiKeyInQuery ?? !isNodeRuntime();\n const query = { ...(options.query ?? {}) } as Record<\n string,\n string | number | boolean | undefined | null\n >;\n if (shouldSendKeyInQuery && query.apiKey == null) {\n query.apiKey = this.apiKey;\n }\n\n const url = buildWsUrl(this.wsBaseUrl, `/${dex}`, query);\n const ws = shouldSendKeyInQuery\n ? new this.WebSocketCtor(url)\n : new this.WebSocketCtor(\n url,\n {\n headers: {\n \"x-api-key\": this.apiKey\n }\n } as any\n );\n\n ws.onopen = () => options.onOpen?.();\n ws.onclose = (ev: any) => options.onClose?.(ev as CloseEvent);\n ws.onerror = (ev: any) => options.onError?.(ev as Event);\n ws.onmessage = (msg: any) => {\n const raw = messageToString(msg.data);\n const data = raw ? safeJsonParse(raw) : msg.data;\n options.onMessage?.(data);\n };\n\n return {\n socket: ws as unknown as WebSocket,\n close: () => ws.close()\n };\n }\n}\n\nexport const createClient = (options: DritanClientOptions) => new DritanClient(options);\n\nexport class MeteoraThsClient {\n readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: MeteoraThsClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? \"https://ths.dritan.dev\";\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n async health(): Promise<boolean> {\n const url = buildUrl(this.baseUrl, \"/health\");\n const res = await this.fetchImpl(url, { method: \"GET\" });\n return res.ok;\n }\n\n async getThsScore(\n wallet: string,\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}`));\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), { method: \"GET\" });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n\n async getThsScoreForTokens(\n wallet: string,\n tokenMints: string[],\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}/tokens`));\n for (const mint of tokenMints ?? []) {\n url.searchParams.append(\"tokenMints\", mint);\n }\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), { method: \"GET\" });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n\n async postThsScoreForTokens(\n wallet: string,\n tokenMints: string[],\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}/tokens`));\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ tokenMints: tokenMints ?? [] })\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n}\n\nexport const createMeteoraThsClient = (options?: MeteoraThsClientOptions) =>\n new MeteoraThsClient(options);\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["WebSocketImpl"],"mappings":"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","file":"index.cjs","sourcesContent":["import WebSocketImpl from \"isomorphic-ws\";\n\nexport type DritanClientOptions = {\n apiKey: string;\n baseUrl?: string;\n wsBaseUrl?: string;\n fetch?: typeof fetch;\n WebSocket?: typeof WebSocketImpl;\n};\n\nexport type KnownDexStream =\n | \"pumpamm\"\n | \"pumpfun\"\n | \"moonit\"\n | \"launchlab\"\n | \"amm\"\n | \"cpmm\"\n | \"clmm\"\n | \"orca\"\n | \"dlmm\"\n | \"damm2\"\n | \"damm1\"\n | \"dbc\";\n\nexport type MeteoraThsClientOptions = {\n baseUrl?: string;\n fetch?: typeof fetch;\n};\n\nexport type TokenPriceResponse = {\n mint: string;\n dex: string;\n priceUsd: number;\n marketCap: number | null;\n liquiditySol: number | null;\n};\n\nexport type TokenMetadataResponse = {\n mint: string;\n programId: string;\n name: string;\n symbol: string;\n uri: string;\n decimals: number;\n supply: string;\n};\n\nexport type RiskGroup = {\n count: number;\n totalPercentage: number;\n};\n\nexport type TokenRiskResponse = {\n mint: string;\n globalFeesPaid: number;\n bundlers: RiskGroup;\n insiders: RiskGroup;\n snipers: RiskGroup;\n top10: number;\n devPercentage: number | null;\n};\n\nexport type TokenFirstBuyersResponse = {\n mint: string;\n buyers: unknown;\n};\n\nexport type TokenAggregatedResponse = {\n mint: string;\n price: TokenPriceResponse;\n metadata: TokenMetadataResponse | null;\n risk: TokenRiskResponse | null;\n bondingCurvePercent: number | null;\n};\n\nexport type TokenDeployerStatsResponse = {\n mint: string;\n deployer: string;\n total: number;\n deployed: number;\n bonded: number;\n nonBonded: number;\n};\n\nexport type DritanStreamOptions = {\n query?: Record<string, string | number | boolean | undefined | null>;\n /**\n * When true, includes the api key as `?apiKey=...` in the websocket URL.\n * This is required when using native browser websockets (custom headers are not supported).\n */\n sendApiKeyInQuery?: boolean;\n onOpen?: () => void;\n onClose?: (ev: CloseEvent) => void;\n onError?: (ev: Event) => void;\n onMessage?: (data: unknown) => void;\n};\n\nexport type DritanStreamHandle = {\n socket: WebSocket;\n close: () => void;\n};\n\nexport type SwapBuildRequest = {\n userPublicKey: string;\n inputMint: string;\n outputMint: string;\n amount: number | string;\n slippageBps?: number;\n swapType?: string;\n feeWallet?: string;\n feeBps?: number;\n feePercent?: number;\n};\n\nexport type SwapBuildFees = {\n platformFeeBps: number;\n platformFeeLamports: number;\n userFeeBps: number;\n userFeeLamports: number;\n tipLamports: number;\n};\n\nexport type SwapBuildResponse = {\n transactionBase64: string;\n fees: SwapBuildFees;\n quote: unknown;\n};\n\nexport type SwapBroadcastResponse = {\n signature: string;\n};\n\nexport type ThsTotals = {\n buys: number;\n sells: number;\n};\n\nexport type ThsResponse = {\n wallet: string;\n score: number;\n realizedPnLUsd: number;\n realizedPnLWeightedUsd: number;\n totals: ThsTotals;\n analyzedTxns: number;\n matchedTxCount: number;\n unmatchedTxCount: number;\n avgHoldTimeDays: number;\n avgHoldTimeHours: number;\n avgHoldTimeMinutes: number;\n avgHoldTimeSeconds: number;\n avgHoldTimePretty: string;\n};\n\nfunction buildUrl(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/+$/, \"\")}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`;\n}\n\nfunction buildWsUrl(\n wsBaseUrl: string,\n path: string,\n query?: Record<string, string | number | boolean | undefined | null>\n): string {\n const url = new URL(buildUrl(wsBaseUrl, path));\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\nfunction safeJsonParse(payload: string): unknown {\n try {\n return JSON.parse(payload) as unknown;\n } catch {\n return payload;\n }\n}\n\nfunction isNodeRuntime(): boolean {\n return (\n typeof process !== \"undefined\" &&\n typeof (process as any).versions?.node === \"string\"\n );\n}\n\nfunction messageToString(data: unknown): string | null {\n if (typeof data === \"string\") return data;\n\n // ws (node) can emit Buffer\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(data)) {\n return data.toString(\"utf8\");\n }\n\n // browser ws can emit ArrayBuffer\n if (data instanceof ArrayBuffer) {\n return new TextDecoder().decode(new Uint8Array(data));\n }\n\n return null;\n}\n\nexport class DritanClient {\n readonly apiKey: string;\n readonly baseUrl: string;\n readonly wsBaseUrl: string;\n private readonly fetchImpl: typeof fetch;\n private readonly WebSocketCtor: typeof WebSocketImpl;\n\n constructor(options: DritanClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? \"https://us-east.dritan.dev\";\n this.wsBaseUrl = options.wsBaseUrl ?? \"wss://us-east.dritan.dev\";\n this.fetchImpl = options.fetch ?? fetch;\n this.WebSocketCtor = options.WebSocket ?? WebSocketImpl;\n }\n\n async getTokenPrice(mint: string): Promise<TokenPriceResponse> {\n const url = buildUrl(this.baseUrl, `/token/price/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenPriceResponse;\n }\n\n async getTokenMetadata(mint: string): Promise<TokenMetadataResponse> {\n const url = buildUrl(this.baseUrl, `/token/metadata/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenMetadataResponse;\n }\n\n async getTokenRisk(mint: string): Promise<TokenRiskResponse> {\n const url = buildUrl(this.baseUrl, `/token/risk/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenRiskResponse;\n }\n\n async getFirstBuyers(mint: string): Promise<TokenFirstBuyersResponse> {\n const url = buildUrl(this.baseUrl, `/token/first-buyers/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenFirstBuyersResponse;\n }\n\n async getTokenAggregated(mint: string): Promise<TokenAggregatedResponse> {\n const url = buildUrl(this.baseUrl, `/token/aggregated/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n const raw = (await res.json()) as any;\n return {\n mint: String(raw?.mint ?? mint),\n price: raw?.price as TokenPriceResponse,\n metadata: raw?.metadata ?? null,\n risk: raw?.risk ?? null,\n bondingCurvePercent:\n raw?.bondingCurvePercent === undefined ? null : (raw?.bondingCurvePercent ?? null)\n };\n }\n\n async getDeployerStats(mint: string): Promise<TokenDeployerStatsResponse> {\n const url = buildUrl(this.baseUrl, `/token/deployer-stats/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenDeployerStatsResponse;\n }\n\n async buildSwap(body: SwapBuildRequest): Promise<SwapBuildResponse> {\n const url = buildUrl(this.baseUrl, \"/swap/build\");\n const res = await this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify(body ?? {})\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as SwapBuildResponse;\n }\n\n async broadcastSwap(signedTransactionBase64: string): Promise<SwapBroadcastResponse> {\n const url = buildUrl(this.baseUrl, \"/swap/broadcast\");\n const res = await this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify({ signedTransactionBase64 })\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as SwapBroadcastResponse;\n }\n\n streamDex(dex: KnownDexStream, options?: DritanStreamOptions): DritanStreamHandle;\n streamDex(dex: string, options?: DritanStreamOptions): DritanStreamHandle;\n streamDex(dex: string, options: DritanStreamOptions = {}): DritanStreamHandle {\n const shouldSendKeyInQuery = options.sendApiKeyInQuery ?? !isNodeRuntime();\n const query = { ...(options.query ?? {}) } as Record<\n string,\n string | number | boolean | undefined | null\n >;\n if (shouldSendKeyInQuery && query.apiKey == null) {\n query.apiKey = this.apiKey;\n }\n\n const url = buildWsUrl(this.wsBaseUrl, `/${dex}`, query);\n const ws = shouldSendKeyInQuery\n ? new this.WebSocketCtor(url)\n : new this.WebSocketCtor(\n url,\n {\n headers: {\n \"x-api-key\": this.apiKey\n }\n } as any\n );\n\n ws.onopen = () => options.onOpen?.();\n ws.onclose = (ev: any) => options.onClose?.(ev as CloseEvent);\n ws.onerror = (ev: any) => options.onError?.(ev as Event);\n ws.onmessage = (msg: any) => {\n const raw = messageToString(msg.data);\n const data = raw ? safeJsonParse(raw) : msg.data;\n options.onMessage?.(data);\n };\n\n return {\n socket: ws as unknown as WebSocket,\n close: () => ws.close()\n };\n }\n}\n\nexport const createClient = (options: DritanClientOptions) => new DritanClient(options);\n\nexport class MeteoraThsClient {\n readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: MeteoraThsClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? \"https://ths.dritan.dev\";\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n async health(): Promise<boolean> {\n const url = buildUrl(this.baseUrl, \"/health\");\n const res = await this.fetchImpl(url, { method: \"GET\" });\n return res.ok;\n }\n\n async getThsScore(\n wallet: string,\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}`));\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), { method: \"GET\" });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n\n async getThsScoreForTokens(\n wallet: string,\n tokenMints: string[],\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}/tokens`));\n for (const mint of tokenMints ?? []) {\n url.searchParams.append(\"tokenMints\", mint);\n }\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), { method: \"GET\" });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n\n async postThsScoreForTokens(\n wallet: string,\n tokenMints: string[],\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}/tokens`));\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ tokenMints: tokenMints ?? [] })\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n}\n\nexport const createMeteoraThsClient = (options?: MeteoraThsClientOptions) =>\n new MeteoraThsClient(options);\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -7,7 +7,7 @@ type DritanClientOptions = {
|
|
|
7
7
|
fetch?: typeof fetch;
|
|
8
8
|
WebSocket?: typeof WebSocketImpl;
|
|
9
9
|
};
|
|
10
|
-
type KnownDexStream = "pumpamm" | "pumpfun" | "launchlab" | "dlmm" | "damm2" | "damm1" | "dbc";
|
|
10
|
+
type KnownDexStream = "pumpamm" | "pumpfun" | "moonit" | "launchlab" | "amm" | "cpmm" | "clmm" | "orca" | "dlmm" | "damm2" | "damm1" | "dbc";
|
|
11
11
|
type MeteoraThsClientOptions = {
|
|
12
12
|
baseUrl?: string;
|
|
13
13
|
fetch?: typeof fetch;
|
|
@@ -52,6 +52,14 @@ type TokenAggregatedResponse = {
|
|
|
52
52
|
risk: TokenRiskResponse | null;
|
|
53
53
|
bondingCurvePercent: number | null;
|
|
54
54
|
};
|
|
55
|
+
type TokenDeployerStatsResponse = {
|
|
56
|
+
mint: string;
|
|
57
|
+
deployer: string;
|
|
58
|
+
total: number;
|
|
59
|
+
deployed: number;
|
|
60
|
+
bonded: number;
|
|
61
|
+
nonBonded: number;
|
|
62
|
+
};
|
|
55
63
|
type DritanStreamOptions = {
|
|
56
64
|
query?: Record<string, string | number | boolean | undefined | null>;
|
|
57
65
|
/**
|
|
@@ -125,6 +133,7 @@ declare class DritanClient {
|
|
|
125
133
|
getTokenRisk(mint: string): Promise<TokenRiskResponse>;
|
|
126
134
|
getFirstBuyers(mint: string): Promise<TokenFirstBuyersResponse>;
|
|
127
135
|
getTokenAggregated(mint: string): Promise<TokenAggregatedResponse>;
|
|
136
|
+
getDeployerStats(mint: string): Promise<TokenDeployerStatsResponse>;
|
|
128
137
|
buildSwap(body: SwapBuildRequest): Promise<SwapBuildResponse>;
|
|
129
138
|
broadcastSwap(signedTransactionBase64: string): Promise<SwapBroadcastResponse>;
|
|
130
139
|
streamDex(dex: KnownDexStream, options?: DritanStreamOptions): DritanStreamHandle;
|
|
@@ -151,4 +160,4 @@ declare class MeteoraThsClient {
|
|
|
151
160
|
}
|
|
152
161
|
declare const createMeteoraThsClient: (options?: MeteoraThsClientOptions) => MeteoraThsClient;
|
|
153
162
|
|
|
154
|
-
export { DritanClient, type DritanClientOptions, type DritanStreamHandle, type DritanStreamOptions, type KnownDexStream, MeteoraThsClient, type MeteoraThsClientOptions, type RiskGroup, type SwapBroadcastResponse, type SwapBuildFees, type SwapBuildRequest, type SwapBuildResponse, type ThsResponse, type ThsTotals, type TokenAggregatedResponse, type TokenFirstBuyersResponse, type TokenMetadataResponse, type TokenPriceResponse, type TokenRiskResponse, createClient, createMeteoraThsClient };
|
|
163
|
+
export { DritanClient, type DritanClientOptions, type DritanStreamHandle, type DritanStreamOptions, type KnownDexStream, MeteoraThsClient, type MeteoraThsClientOptions, type RiskGroup, type SwapBroadcastResponse, type SwapBuildFees, type SwapBuildRequest, type SwapBuildResponse, type ThsResponse, type ThsTotals, type TokenAggregatedResponse, type TokenDeployerStatsResponse, type TokenFirstBuyersResponse, type TokenMetadataResponse, type TokenPriceResponse, type TokenRiskResponse, createClient, createMeteoraThsClient };
|
package/dist/index.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ type DritanClientOptions = {
|
|
|
7
7
|
fetch?: typeof fetch;
|
|
8
8
|
WebSocket?: typeof WebSocketImpl;
|
|
9
9
|
};
|
|
10
|
-
type KnownDexStream = "pumpamm" | "pumpfun" | "launchlab" | "dlmm" | "damm2" | "damm1" | "dbc";
|
|
10
|
+
type KnownDexStream = "pumpamm" | "pumpfun" | "moonit" | "launchlab" | "amm" | "cpmm" | "clmm" | "orca" | "dlmm" | "damm2" | "damm1" | "dbc";
|
|
11
11
|
type MeteoraThsClientOptions = {
|
|
12
12
|
baseUrl?: string;
|
|
13
13
|
fetch?: typeof fetch;
|
|
@@ -52,6 +52,14 @@ type TokenAggregatedResponse = {
|
|
|
52
52
|
risk: TokenRiskResponse | null;
|
|
53
53
|
bondingCurvePercent: number | null;
|
|
54
54
|
};
|
|
55
|
+
type TokenDeployerStatsResponse = {
|
|
56
|
+
mint: string;
|
|
57
|
+
deployer: string;
|
|
58
|
+
total: number;
|
|
59
|
+
deployed: number;
|
|
60
|
+
bonded: number;
|
|
61
|
+
nonBonded: number;
|
|
62
|
+
};
|
|
55
63
|
type DritanStreamOptions = {
|
|
56
64
|
query?: Record<string, string | number | boolean | undefined | null>;
|
|
57
65
|
/**
|
|
@@ -125,6 +133,7 @@ declare class DritanClient {
|
|
|
125
133
|
getTokenRisk(mint: string): Promise<TokenRiskResponse>;
|
|
126
134
|
getFirstBuyers(mint: string): Promise<TokenFirstBuyersResponse>;
|
|
127
135
|
getTokenAggregated(mint: string): Promise<TokenAggregatedResponse>;
|
|
136
|
+
getDeployerStats(mint: string): Promise<TokenDeployerStatsResponse>;
|
|
128
137
|
buildSwap(body: SwapBuildRequest): Promise<SwapBuildResponse>;
|
|
129
138
|
broadcastSwap(signedTransactionBase64: string): Promise<SwapBroadcastResponse>;
|
|
130
139
|
streamDex(dex: KnownDexStream, options?: DritanStreamOptions): DritanStreamHandle;
|
|
@@ -151,4 +160,4 @@ declare class MeteoraThsClient {
|
|
|
151
160
|
}
|
|
152
161
|
declare const createMeteoraThsClient: (options?: MeteoraThsClientOptions) => MeteoraThsClient;
|
|
153
162
|
|
|
154
|
-
export { DritanClient, type DritanClientOptions, type DritanStreamHandle, type DritanStreamOptions, type KnownDexStream, MeteoraThsClient, type MeteoraThsClientOptions, type RiskGroup, type SwapBroadcastResponse, type SwapBuildFees, type SwapBuildRequest, type SwapBuildResponse, type ThsResponse, type ThsTotals, type TokenAggregatedResponse, type TokenFirstBuyersResponse, type TokenMetadataResponse, type TokenPriceResponse, type TokenRiskResponse, createClient, createMeteoraThsClient };
|
|
163
|
+
export { DritanClient, type DritanClientOptions, type DritanStreamHandle, type DritanStreamOptions, type KnownDexStream, MeteoraThsClient, type MeteoraThsClientOptions, type RiskGroup, type SwapBroadcastResponse, type SwapBuildFees, type SwapBuildRequest, type SwapBuildResponse, type ThsResponse, type ThsTotals, type TokenAggregatedResponse, type TokenDeployerStatsResponse, type TokenFirstBuyersResponse, type TokenMetadataResponse, type TokenPriceResponse, type TokenRiskResponse, createClient, createMeteoraThsClient };
|
package/dist/index.js
CHANGED
|
@@ -124,6 +124,20 @@ var DritanClient = class {
|
|
|
124
124
|
bondingCurvePercent: raw?.bondingCurvePercent === void 0 ? null : raw?.bondingCurvePercent ?? null
|
|
125
125
|
};
|
|
126
126
|
}
|
|
127
|
+
async getDeployerStats(mint) {
|
|
128
|
+
const url = buildUrl(this.baseUrl, `/token/deployer-stats/${encodeURIComponent(mint)}`);
|
|
129
|
+
const res = await this.fetchImpl(url, {
|
|
130
|
+
method: "GET",
|
|
131
|
+
headers: {
|
|
132
|
+
"x-api-key": this.apiKey
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
if (!res.ok) {
|
|
136
|
+
const text = await res.text().catch(() => "");
|
|
137
|
+
throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);
|
|
138
|
+
}
|
|
139
|
+
return await res.json();
|
|
140
|
+
}
|
|
127
141
|
async buildSwap(body) {
|
|
128
142
|
const url = buildUrl(this.baseUrl, "/swap/build");
|
|
129
143
|
const res = await this.fetchImpl(url, {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import WebSocketImpl from \"isomorphic-ws\";\n\nexport type DritanClientOptions = {\n apiKey: string;\n baseUrl?: string;\n wsBaseUrl?: string;\n fetch?: typeof fetch;\n WebSocket?: typeof WebSocketImpl;\n};\n\nexport type KnownDexStream =\n | \"pumpamm\"\n | \"pumpfun\"\n | \"launchlab\"\n | \"dlmm\"\n | \"damm2\"\n | \"damm1\"\n | \"dbc\";\n\nexport type MeteoraThsClientOptions = {\n baseUrl?: string;\n fetch?: typeof fetch;\n};\n\nexport type TokenPriceResponse = {\n mint: string;\n dex: string;\n priceUsd: number;\n marketCap: number | null;\n liquiditySol: number | null;\n};\n\nexport type TokenMetadataResponse = {\n mint: string;\n programId: string;\n name: string;\n symbol: string;\n uri: string;\n decimals: number;\n supply: string;\n};\n\nexport type RiskGroup = {\n count: number;\n totalPercentage: number;\n};\n\nexport type TokenRiskResponse = {\n mint: string;\n globalFeesPaid: number;\n bundlers: RiskGroup;\n insiders: RiskGroup;\n snipers: RiskGroup;\n top10: number;\n devPercentage: number | null;\n};\n\nexport type TokenFirstBuyersResponse = {\n mint: string;\n buyers: unknown;\n};\n\nexport type TokenAggregatedResponse = {\n mint: string;\n price: TokenPriceResponse;\n metadata: TokenMetadataResponse | null;\n risk: TokenRiskResponse | null;\n bondingCurvePercent: number | null;\n};\n\nexport type DritanStreamOptions = {\n query?: Record<string, string | number | boolean | undefined | null>;\n /**\n * When true, includes the api key as `?apiKey=...` in the websocket URL.\n * This is required when using native browser websockets (custom headers are not supported).\n */\n sendApiKeyInQuery?: boolean;\n onOpen?: () => void;\n onClose?: (ev: CloseEvent) => void;\n onError?: (ev: Event) => void;\n onMessage?: (data: unknown) => void;\n};\n\nexport type DritanStreamHandle = {\n socket: WebSocket;\n close: () => void;\n};\n\nexport type SwapBuildRequest = {\n userPublicKey: string;\n inputMint: string;\n outputMint: string;\n amount: number | string;\n slippageBps?: number;\n swapType?: string;\n feeWallet?: string;\n feeBps?: number;\n feePercent?: number;\n};\n\nexport type SwapBuildFees = {\n platformFeeBps: number;\n platformFeeLamports: number;\n userFeeBps: number;\n userFeeLamports: number;\n tipLamports: number;\n};\n\nexport type SwapBuildResponse = {\n transactionBase64: string;\n fees: SwapBuildFees;\n quote: unknown;\n};\n\nexport type SwapBroadcastResponse = {\n signature: string;\n};\n\nexport type ThsTotals = {\n buys: number;\n sells: number;\n};\n\nexport type ThsResponse = {\n wallet: string;\n score: number;\n realizedPnLUsd: number;\n realizedPnLWeightedUsd: number;\n totals: ThsTotals;\n analyzedTxns: number;\n matchedTxCount: number;\n unmatchedTxCount: number;\n avgHoldTimeDays: number;\n avgHoldTimeHours: number;\n avgHoldTimeMinutes: number;\n avgHoldTimeSeconds: number;\n avgHoldTimePretty: string;\n};\n\nfunction buildUrl(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/+$/, \"\")}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`;\n}\n\nfunction buildWsUrl(\n wsBaseUrl: string,\n path: string,\n query?: Record<string, string | number | boolean | undefined | null>\n): string {\n const url = new URL(buildUrl(wsBaseUrl, path));\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\nfunction safeJsonParse(payload: string): unknown {\n try {\n return JSON.parse(payload) as unknown;\n } catch {\n return payload;\n }\n}\n\nfunction isNodeRuntime(): boolean {\n return (\n typeof process !== \"undefined\" &&\n typeof (process as any).versions?.node === \"string\"\n );\n}\n\nfunction messageToString(data: unknown): string | null {\n if (typeof data === \"string\") return data;\n\n // ws (node) can emit Buffer\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(data)) {\n return data.toString(\"utf8\");\n }\n\n // browser ws can emit ArrayBuffer\n if (data instanceof ArrayBuffer) {\n return new TextDecoder().decode(new Uint8Array(data));\n }\n\n return null;\n}\n\nexport class DritanClient {\n readonly apiKey: string;\n readonly baseUrl: string;\n readonly wsBaseUrl: string;\n private readonly fetchImpl: typeof fetch;\n private readonly WebSocketCtor: typeof WebSocketImpl;\n\n constructor(options: DritanClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? \"https://us-east.dritan.dev\";\n this.wsBaseUrl = options.wsBaseUrl ?? \"wss://us-east.dritan.dev\";\n this.fetchImpl = options.fetch ?? fetch;\n this.WebSocketCtor = options.WebSocket ?? WebSocketImpl;\n }\n\n async getTokenPrice(mint: string): Promise<TokenPriceResponse> {\n const url = buildUrl(this.baseUrl, `/token/price/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenPriceResponse;\n }\n\n async getTokenMetadata(mint: string): Promise<TokenMetadataResponse> {\n const url = buildUrl(this.baseUrl, `/token/metadata/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenMetadataResponse;\n }\n\n async getTokenRisk(mint: string): Promise<TokenRiskResponse> {\n const url = buildUrl(this.baseUrl, `/token/risk/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenRiskResponse;\n }\n\n async getFirstBuyers(mint: string): Promise<TokenFirstBuyersResponse> {\n const url = buildUrl(this.baseUrl, `/token/first-buyers/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenFirstBuyersResponse;\n }\n\n async getTokenAggregated(mint: string): Promise<TokenAggregatedResponse> {\n const url = buildUrl(this.baseUrl, `/token/aggregated/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n const raw = (await res.json()) as any;\n return {\n mint: String(raw?.mint ?? mint),\n price: raw?.price as TokenPriceResponse,\n metadata: raw?.metadata ?? null,\n risk: raw?.risk ?? null,\n bondingCurvePercent:\n raw?.bondingCurvePercent === undefined ? null : (raw?.bondingCurvePercent ?? null)\n };\n }\n\n async buildSwap(body: SwapBuildRequest): Promise<SwapBuildResponse> {\n const url = buildUrl(this.baseUrl, \"/swap/build\");\n const res = await this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify(body ?? {})\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as SwapBuildResponse;\n }\n\n async broadcastSwap(signedTransactionBase64: string): Promise<SwapBroadcastResponse> {\n const url = buildUrl(this.baseUrl, \"/swap/broadcast\");\n const res = await this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify({ signedTransactionBase64 })\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as SwapBroadcastResponse;\n }\n\n streamDex(dex: KnownDexStream, options?: DritanStreamOptions): DritanStreamHandle;\n streamDex(dex: string, options?: DritanStreamOptions): DritanStreamHandle;\n streamDex(dex: string, options: DritanStreamOptions = {}): DritanStreamHandle {\n const shouldSendKeyInQuery = options.sendApiKeyInQuery ?? !isNodeRuntime();\n const query = { ...(options.query ?? {}) } as Record<\n string,\n string | number | boolean | undefined | null\n >;\n if (shouldSendKeyInQuery && query.apiKey == null) {\n query.apiKey = this.apiKey;\n }\n\n const url = buildWsUrl(this.wsBaseUrl, `/${dex}`, query);\n const ws = shouldSendKeyInQuery\n ? new this.WebSocketCtor(url)\n : new this.WebSocketCtor(\n url,\n {\n headers: {\n \"x-api-key\": this.apiKey\n }\n } as any\n );\n\n ws.onopen = () => options.onOpen?.();\n ws.onclose = (ev: any) => options.onClose?.(ev as CloseEvent);\n ws.onerror = (ev: any) => options.onError?.(ev as Event);\n ws.onmessage = (msg: any) => {\n const raw = messageToString(msg.data);\n const data = raw ? safeJsonParse(raw) : msg.data;\n options.onMessage?.(data);\n };\n\n return {\n socket: ws as unknown as WebSocket,\n close: () => ws.close()\n };\n }\n}\n\nexport const createClient = (options: DritanClientOptions) => new DritanClient(options);\n\nexport class MeteoraThsClient {\n readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: MeteoraThsClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? \"https://ths.dritan.dev\";\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n async health(): Promise<boolean> {\n const url = buildUrl(this.baseUrl, \"/health\");\n const res = await this.fetchImpl(url, { method: \"GET\" });\n return res.ok;\n }\n\n async getThsScore(\n wallet: string,\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}`));\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), { method: \"GET\" });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n\n async getThsScoreForTokens(\n wallet: string,\n tokenMints: string[],\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}/tokens`));\n for (const mint of tokenMints ?? []) {\n url.searchParams.append(\"tokenMints\", mint);\n }\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), { method: \"GET\" });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n\n async postThsScoreForTokens(\n wallet: string,\n tokenMints: string[],\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}/tokens`));\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ tokenMints: tokenMints ?? [] })\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n}\n\nexport const createMeteoraThsClient = (options?: MeteoraThsClientOptions) =>\n new MeteoraThsClient(options);\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import WebSocketImpl from \"isomorphic-ws\";\n\nexport type DritanClientOptions = {\n apiKey: string;\n baseUrl?: string;\n wsBaseUrl?: string;\n fetch?: typeof fetch;\n WebSocket?: typeof WebSocketImpl;\n};\n\nexport type KnownDexStream =\n | \"pumpamm\"\n | \"pumpfun\"\n | \"moonit\"\n | \"launchlab\"\n | \"amm\"\n | \"cpmm\"\n | \"clmm\"\n | \"orca\"\n | \"dlmm\"\n | \"damm2\"\n | \"damm1\"\n | \"dbc\";\n\nexport type MeteoraThsClientOptions = {\n baseUrl?: string;\n fetch?: typeof fetch;\n};\n\nexport type TokenPriceResponse = {\n mint: string;\n dex: string;\n priceUsd: number;\n marketCap: number | null;\n liquiditySol: number | null;\n};\n\nexport type TokenMetadataResponse = {\n mint: string;\n programId: string;\n name: string;\n symbol: string;\n uri: string;\n decimals: number;\n supply: string;\n};\n\nexport type RiskGroup = {\n count: number;\n totalPercentage: number;\n};\n\nexport type TokenRiskResponse = {\n mint: string;\n globalFeesPaid: number;\n bundlers: RiskGroup;\n insiders: RiskGroup;\n snipers: RiskGroup;\n top10: number;\n devPercentage: number | null;\n};\n\nexport type TokenFirstBuyersResponse = {\n mint: string;\n buyers: unknown;\n};\n\nexport type TokenAggregatedResponse = {\n mint: string;\n price: TokenPriceResponse;\n metadata: TokenMetadataResponse | null;\n risk: TokenRiskResponse | null;\n bondingCurvePercent: number | null;\n};\n\nexport type TokenDeployerStatsResponse = {\n mint: string;\n deployer: string;\n total: number;\n deployed: number;\n bonded: number;\n nonBonded: number;\n};\n\nexport type DritanStreamOptions = {\n query?: Record<string, string | number | boolean | undefined | null>;\n /**\n * When true, includes the api key as `?apiKey=...` in the websocket URL.\n * This is required when using native browser websockets (custom headers are not supported).\n */\n sendApiKeyInQuery?: boolean;\n onOpen?: () => void;\n onClose?: (ev: CloseEvent) => void;\n onError?: (ev: Event) => void;\n onMessage?: (data: unknown) => void;\n};\n\nexport type DritanStreamHandle = {\n socket: WebSocket;\n close: () => void;\n};\n\nexport type SwapBuildRequest = {\n userPublicKey: string;\n inputMint: string;\n outputMint: string;\n amount: number | string;\n slippageBps?: number;\n swapType?: string;\n feeWallet?: string;\n feeBps?: number;\n feePercent?: number;\n};\n\nexport type SwapBuildFees = {\n platformFeeBps: number;\n platformFeeLamports: number;\n userFeeBps: number;\n userFeeLamports: number;\n tipLamports: number;\n};\n\nexport type SwapBuildResponse = {\n transactionBase64: string;\n fees: SwapBuildFees;\n quote: unknown;\n};\n\nexport type SwapBroadcastResponse = {\n signature: string;\n};\n\nexport type ThsTotals = {\n buys: number;\n sells: number;\n};\n\nexport type ThsResponse = {\n wallet: string;\n score: number;\n realizedPnLUsd: number;\n realizedPnLWeightedUsd: number;\n totals: ThsTotals;\n analyzedTxns: number;\n matchedTxCount: number;\n unmatchedTxCount: number;\n avgHoldTimeDays: number;\n avgHoldTimeHours: number;\n avgHoldTimeMinutes: number;\n avgHoldTimeSeconds: number;\n avgHoldTimePretty: string;\n};\n\nfunction buildUrl(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/+$/, \"\")}${path.startsWith(\"/\") ? \"\" : \"/\"}${path}`;\n}\n\nfunction buildWsUrl(\n wsBaseUrl: string,\n path: string,\n query?: Record<string, string | number | boolean | undefined | null>\n): string {\n const url = new URL(buildUrl(wsBaseUrl, path));\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n url.searchParams.set(k, String(v));\n }\n }\n return url.toString();\n}\n\nfunction safeJsonParse(payload: string): unknown {\n try {\n return JSON.parse(payload) as unknown;\n } catch {\n return payload;\n }\n}\n\nfunction isNodeRuntime(): boolean {\n return (\n typeof process !== \"undefined\" &&\n typeof (process as any).versions?.node === \"string\"\n );\n}\n\nfunction messageToString(data: unknown): string | null {\n if (typeof data === \"string\") return data;\n\n // ws (node) can emit Buffer\n if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(data)) {\n return data.toString(\"utf8\");\n }\n\n // browser ws can emit ArrayBuffer\n if (data instanceof ArrayBuffer) {\n return new TextDecoder().decode(new Uint8Array(data));\n }\n\n return null;\n}\n\nexport class DritanClient {\n readonly apiKey: string;\n readonly baseUrl: string;\n readonly wsBaseUrl: string;\n private readonly fetchImpl: typeof fetch;\n private readonly WebSocketCtor: typeof WebSocketImpl;\n\n constructor(options: DritanClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? \"https://us-east.dritan.dev\";\n this.wsBaseUrl = options.wsBaseUrl ?? \"wss://us-east.dritan.dev\";\n this.fetchImpl = options.fetch ?? fetch;\n this.WebSocketCtor = options.WebSocket ?? WebSocketImpl;\n }\n\n async getTokenPrice(mint: string): Promise<TokenPriceResponse> {\n const url = buildUrl(this.baseUrl, `/token/price/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenPriceResponse;\n }\n\n async getTokenMetadata(mint: string): Promise<TokenMetadataResponse> {\n const url = buildUrl(this.baseUrl, `/token/metadata/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenMetadataResponse;\n }\n\n async getTokenRisk(mint: string): Promise<TokenRiskResponse> {\n const url = buildUrl(this.baseUrl, `/token/risk/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenRiskResponse;\n }\n\n async getFirstBuyers(mint: string): Promise<TokenFirstBuyersResponse> {\n const url = buildUrl(this.baseUrl, `/token/first-buyers/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenFirstBuyersResponse;\n }\n\n async getTokenAggregated(mint: string): Promise<TokenAggregatedResponse> {\n const url = buildUrl(this.baseUrl, `/token/aggregated/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n const raw = (await res.json()) as any;\n return {\n mint: String(raw?.mint ?? mint),\n price: raw?.price as TokenPriceResponse,\n metadata: raw?.metadata ?? null,\n risk: raw?.risk ?? null,\n bondingCurvePercent:\n raw?.bondingCurvePercent === undefined ? null : (raw?.bondingCurvePercent ?? null)\n };\n }\n\n async getDeployerStats(mint: string): Promise<TokenDeployerStatsResponse> {\n const url = buildUrl(this.baseUrl, `/token/deployer-stats/${encodeURIComponent(mint)}`);\n const res = await this.fetchImpl(url, {\n method: \"GET\",\n headers: {\n \"x-api-key\": this.apiKey\n }\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as TokenDeployerStatsResponse;\n }\n\n async buildSwap(body: SwapBuildRequest): Promise<SwapBuildResponse> {\n const url = buildUrl(this.baseUrl, \"/swap/build\");\n const res = await this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify(body ?? {})\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as SwapBuildResponse;\n }\n\n async broadcastSwap(signedTransactionBase64: string): Promise<SwapBroadcastResponse> {\n const url = buildUrl(this.baseUrl, \"/swap/broadcast\");\n const res = await this.fetchImpl(url, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"content-type\": \"application/json\"\n },\n body: JSON.stringify({ signedTransactionBase64 })\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Dritan request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as SwapBroadcastResponse;\n }\n\n streamDex(dex: KnownDexStream, options?: DritanStreamOptions): DritanStreamHandle;\n streamDex(dex: string, options?: DritanStreamOptions): DritanStreamHandle;\n streamDex(dex: string, options: DritanStreamOptions = {}): DritanStreamHandle {\n const shouldSendKeyInQuery = options.sendApiKeyInQuery ?? !isNodeRuntime();\n const query = { ...(options.query ?? {}) } as Record<\n string,\n string | number | boolean | undefined | null\n >;\n if (shouldSendKeyInQuery && query.apiKey == null) {\n query.apiKey = this.apiKey;\n }\n\n const url = buildWsUrl(this.wsBaseUrl, `/${dex}`, query);\n const ws = shouldSendKeyInQuery\n ? new this.WebSocketCtor(url)\n : new this.WebSocketCtor(\n url,\n {\n headers: {\n \"x-api-key\": this.apiKey\n }\n } as any\n );\n\n ws.onopen = () => options.onOpen?.();\n ws.onclose = (ev: any) => options.onClose?.(ev as CloseEvent);\n ws.onerror = (ev: any) => options.onError?.(ev as Event);\n ws.onmessage = (msg: any) => {\n const raw = messageToString(msg.data);\n const data = raw ? safeJsonParse(raw) : msg.data;\n options.onMessage?.(data);\n };\n\n return {\n socket: ws as unknown as WebSocket,\n close: () => ws.close()\n };\n }\n}\n\nexport const createClient = (options: DritanClientOptions) => new DritanClient(options);\n\nexport class MeteoraThsClient {\n readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: MeteoraThsClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? \"https://ths.dritan.dev\";\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n async health(): Promise<boolean> {\n const url = buildUrl(this.baseUrl, \"/health\");\n const res = await this.fetchImpl(url, { method: \"GET\" });\n return res.ok;\n }\n\n async getThsScore(\n wallet: string,\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}`));\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), { method: \"GET\" });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n\n async getThsScoreForTokens(\n wallet: string,\n tokenMints: string[],\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}/tokens`));\n for (const mint of tokenMints ?? []) {\n url.searchParams.append(\"tokenMints\", mint);\n }\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), { method: \"GET\" });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n\n async postThsScoreForTokens(\n wallet: string,\n tokenMints: string[],\n options: { debug?: boolean; breakdown?: boolean } = {}\n ): Promise<ThsResponse> {\n const url = new URL(buildUrl(this.baseUrl, `/ths/${encodeURIComponent(wallet)}/tokens`));\n if (options.debug) url.searchParams.set(\"debug\", \"1\");\n if (options.breakdown) url.searchParams.set(\"breakdown\", \"1\");\n\n const res = await this.fetchImpl(url.toString(), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ tokenMints: tokenMints ?? [] })\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`Meteora THS request failed (${res.status}): ${text || res.statusText}`);\n }\n\n return (await res.json()) as ThsResponse;\n }\n}\n\nexport const createMeteoraThsClient = (options?: MeteoraThsClientOptions) =>\n new MeteoraThsClient(options);\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dritan-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.10",
|
|
4
4
|
"description": "TypeScript SDK for the Dritan data plane REST API and websocket streams.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -30,14 +30,24 @@
|
|
|
30
30
|
"build": "tsup",
|
|
31
31
|
"dev": "tsup --watch",
|
|
32
32
|
"lint": "tsc -p tsconfig.json --noEmit",
|
|
33
|
-
"prepublishOnly": "npm run build"
|
|
33
|
+
"prepublishOnly": "npm run build",
|
|
34
|
+
"release": "semantic-release"
|
|
34
35
|
},
|
|
35
36
|
"dependencies": {
|
|
36
37
|
"isomorphic-ws": "^5.0.0",
|
|
37
38
|
"ws": "^8.19.0"
|
|
38
39
|
},
|
|
39
40
|
"devDependencies": {
|
|
41
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
42
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
43
|
+
"@semantic-release/exec": "^7.1.0",
|
|
44
|
+
"@semantic-release/git": "^10.0.1",
|
|
45
|
+
"@semantic-release/github": "^11.0.6",
|
|
46
|
+
"@semantic-release/npm": "^12.0.2",
|
|
47
|
+
"@semantic-release/release-notes-generator": "^14.1.0",
|
|
40
48
|
"@types/node": "^22.14.0",
|
|
49
|
+
"conventional-changelog-conventionalcommits": "^9.1.0",
|
|
50
|
+
"semantic-release": "^24.2.9",
|
|
41
51
|
"tsup": "^8.0.2",
|
|
42
52
|
"typescript": "^5.8.2"
|
|
43
53
|
},
|