@tinybirdco/sdk 0.0.19 → 0.0.20
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 +47 -0
- package/dist/api/api.d.ts +89 -0
- package/dist/api/api.d.ts.map +1 -0
- package/dist/api/api.js +218 -0
- package/dist/api/api.js.map +1 -0
- package/dist/api/api.test.d.ts +2 -0
- package/dist/api/api.test.d.ts.map +1 -0
- package/dist/api/api.test.js +226 -0
- package/dist/api/api.test.js.map +1 -0
- package/dist/client/base.d.ts +3 -17
- package/dist/client/base.d.ts.map +1 -1
- package/dist/client/base.js +31 -153
- package/dist/client/base.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +7 -2
- package/src/api/api.test.ts +295 -0
- package/src/api/api.ts +345 -0
- package/src/client/base.ts +34 -181
- package/src/index.ts +14 -0
package/README.md
CHANGED
|
@@ -175,6 +175,53 @@ const result = await tinybird.query.topPages({
|
|
|
175
175
|
// result.data is fully typed: { pathname: string, views: bigint }[]
|
|
176
176
|
```
|
|
177
177
|
|
|
178
|
+
## Public Tinybird API (Optional)
|
|
179
|
+
|
|
180
|
+
If you want a low-level API wrapper that is decoupled from the typed client layer,
|
|
181
|
+
you can use `createTinybirdApi()` directly with just `baseUrl` and `token`:
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
import { createTinybirdApi } from "@tinybirdco/sdk";
|
|
185
|
+
|
|
186
|
+
const api = createTinybirdApi({
|
|
187
|
+
baseUrl: "https://api.tinybird.co",
|
|
188
|
+
token: process.env.TINYBIRD_TOKEN!,
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
// Query endpoint pipe (with optional type parameters)
|
|
192
|
+
interface TopPagesRow { pathname: string; visits: number }
|
|
193
|
+
interface TopPagesParams { start_date: string; end_date: string; limit?: number }
|
|
194
|
+
|
|
195
|
+
const topPages = await api.query<TopPagesRow, TopPagesParams>("top_pages", {
|
|
196
|
+
start_date: "2024-01-01",
|
|
197
|
+
end_date: "2024-01-31",
|
|
198
|
+
limit: 5,
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
// Ingest one row into datasource (with optional type parameter)
|
|
202
|
+
interface EventRow { timestamp: Date; event_name: string; pathname: string }
|
|
203
|
+
|
|
204
|
+
await api.ingest<EventRow>("events", {
|
|
205
|
+
timestamp: new Date(),
|
|
206
|
+
event_name: "page_view",
|
|
207
|
+
pathname: "/home",
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
// Execute raw SQL (with optional type parameter)
|
|
211
|
+
interface CountResult { total: number }
|
|
212
|
+
|
|
213
|
+
const sqlResult = await api.sql<CountResult>("SELECT count() AS total FROM events");
|
|
214
|
+
|
|
215
|
+
// Optional per-request token override
|
|
216
|
+
await api.request("/v1/workspace", {
|
|
217
|
+
token: process.env.TINYBIRD_BRANCH_TOKEN,
|
|
218
|
+
});
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
This Tinybird API is standalone and can be used without `createClient()` or `createTinybirdClient()`.
|
|
222
|
+
It is intended for cases where you want a simple public API that remains
|
|
223
|
+
decoupled from the higher-level typed client APIs.
|
|
224
|
+
|
|
178
225
|
## CLI Commands
|
|
179
226
|
|
|
180
227
|
### `npx tinybird init`
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { IngestOptions, IngestResult, QueryOptions, QueryResult, TinybirdErrorResponse } from "../client/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Public, decoupled Tinybird API wrapper configuration
|
|
4
|
+
*/
|
|
5
|
+
export interface TinybirdApiConfig {
|
|
6
|
+
/** Tinybird API base URL (e.g. https://api.tinybird.co) */
|
|
7
|
+
baseUrl: string;
|
|
8
|
+
/** Tinybird token used for Authorization bearer header */
|
|
9
|
+
token: string;
|
|
10
|
+
/** Custom fetch implementation (optional) */
|
|
11
|
+
fetch?: typeof fetch;
|
|
12
|
+
/** Default timeout in milliseconds (optional) */
|
|
13
|
+
timeout?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Request options for the API layer
|
|
17
|
+
*/
|
|
18
|
+
export interface TinybirdApiRequestInit extends RequestInit {
|
|
19
|
+
/** Optional token override for a specific request */
|
|
20
|
+
token?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface TinybirdApiQueryOptions extends QueryOptions {
|
|
23
|
+
/** Optional token override for this request */
|
|
24
|
+
token?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface TinybirdApiIngestOptions extends IngestOptions {
|
|
27
|
+
/** Optional token override for this request */
|
|
28
|
+
token?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Error thrown by TinybirdApi when a response is not OK
|
|
32
|
+
*/
|
|
33
|
+
export declare class TinybirdApiError extends Error {
|
|
34
|
+
readonly statusCode: number;
|
|
35
|
+
readonly responseBody?: string;
|
|
36
|
+
readonly response?: TinybirdErrorResponse;
|
|
37
|
+
constructor(message: string, statusCode: number, responseBody?: string, response?: TinybirdErrorResponse);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Low-level Tinybird API wrapper.
|
|
41
|
+
*
|
|
42
|
+
* This layer is intentionally decoupled from the typed TinybirdClient layer
|
|
43
|
+
* so it can be used standalone with just baseUrl + token.
|
|
44
|
+
*/
|
|
45
|
+
export declare class TinybirdApi {
|
|
46
|
+
private readonly config;
|
|
47
|
+
private readonly baseUrl;
|
|
48
|
+
private readonly defaultToken;
|
|
49
|
+
private readonly fetchFn;
|
|
50
|
+
constructor(config: TinybirdApiConfig);
|
|
51
|
+
/**
|
|
52
|
+
* Execute a request against Tinybird API.
|
|
53
|
+
*/
|
|
54
|
+
request(path: string, init?: TinybirdApiRequestInit): Promise<Response>;
|
|
55
|
+
/**
|
|
56
|
+
* Execute a request and parse JSON response.
|
|
57
|
+
*/
|
|
58
|
+
requestJson<T = unknown>(path: string, init?: TinybirdApiRequestInit): Promise<T>;
|
|
59
|
+
/**
|
|
60
|
+
* Query a Tinybird endpoint
|
|
61
|
+
*/
|
|
62
|
+
query<T = unknown, P extends Record<string, unknown> = Record<string, unknown>>(endpointName: string, params?: P, options?: TinybirdApiQueryOptions): Promise<QueryResult<T>>;
|
|
63
|
+
/**
|
|
64
|
+
* Ingest a single row into a datasource
|
|
65
|
+
*/
|
|
66
|
+
ingest<T extends Record<string, unknown>>(datasourceName: string, event: T, options?: TinybirdApiIngestOptions): Promise<IngestResult>;
|
|
67
|
+
/**
|
|
68
|
+
* Ingest a batch of rows into a datasource
|
|
69
|
+
*/
|
|
70
|
+
ingestBatch<T extends Record<string, unknown>>(datasourceName: string, events: T[], options?: TinybirdApiIngestOptions): Promise<IngestResult>;
|
|
71
|
+
/**
|
|
72
|
+
* Execute raw SQL against Tinybird
|
|
73
|
+
*/
|
|
74
|
+
sql<T = unknown>(sql: string, options?: TinybirdApiQueryOptions): Promise<QueryResult<T>>;
|
|
75
|
+
private createAbortSignal;
|
|
76
|
+
private serializeEvent;
|
|
77
|
+
private serializeValue;
|
|
78
|
+
private handleErrorResponse;
|
|
79
|
+
private resolveUrl;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Create a decoupled Tinybird API wrapper.
|
|
83
|
+
*/
|
|
84
|
+
export declare function createTinybirdApi(config: TinybirdApiConfig): TinybirdApi;
|
|
85
|
+
/**
|
|
86
|
+
* Alias for teams that prefer "wrapper" naming.
|
|
87
|
+
*/
|
|
88
|
+
export declare const createTinybirdApiWrapper: typeof createTinybirdApi;
|
|
89
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api/api.ts"],"names":[],"mappings":"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"}
|
package/dist/api/api.js
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { createTinybirdFetcher } from "./fetcher.js";
|
|
2
|
+
const DEFAULT_TIMEOUT = 30000;
|
|
3
|
+
/**
|
|
4
|
+
* Error thrown by TinybirdApi when a response is not OK
|
|
5
|
+
*/
|
|
6
|
+
export class TinybirdApiError extends Error {
|
|
7
|
+
statusCode;
|
|
8
|
+
responseBody;
|
|
9
|
+
response;
|
|
10
|
+
constructor(message, statusCode, responseBody, response) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = "TinybirdApiError";
|
|
13
|
+
this.statusCode = statusCode;
|
|
14
|
+
this.responseBody = responseBody;
|
|
15
|
+
this.response = response;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Low-level Tinybird API wrapper.
|
|
20
|
+
*
|
|
21
|
+
* This layer is intentionally decoupled from the typed TinybirdClient layer
|
|
22
|
+
* so it can be used standalone with just baseUrl + token.
|
|
23
|
+
*/
|
|
24
|
+
export class TinybirdApi {
|
|
25
|
+
config;
|
|
26
|
+
baseUrl;
|
|
27
|
+
defaultToken;
|
|
28
|
+
fetchFn;
|
|
29
|
+
constructor(config) {
|
|
30
|
+
if (!config.baseUrl) {
|
|
31
|
+
throw new Error("baseUrl is required");
|
|
32
|
+
}
|
|
33
|
+
if (!config.token) {
|
|
34
|
+
throw new Error("token is required");
|
|
35
|
+
}
|
|
36
|
+
this.config = config;
|
|
37
|
+
this.baseUrl = config.baseUrl.replace(/\/$/, "");
|
|
38
|
+
this.defaultToken = config.token;
|
|
39
|
+
this.fetchFn = createTinybirdFetcher(config.fetch ?? globalThis.fetch);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Execute a request against Tinybird API.
|
|
43
|
+
*/
|
|
44
|
+
request(path, init = {}) {
|
|
45
|
+
const { token, headers, ...requestInit } = init;
|
|
46
|
+
const authToken = token ?? this.defaultToken;
|
|
47
|
+
const requestHeaders = new Headers(headers);
|
|
48
|
+
if (!requestHeaders.has("Authorization")) {
|
|
49
|
+
requestHeaders.set("Authorization", `Bearer ${authToken}`);
|
|
50
|
+
}
|
|
51
|
+
return this.fetchFn(this.resolveUrl(path), {
|
|
52
|
+
...requestInit,
|
|
53
|
+
headers: requestHeaders,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Execute a request and parse JSON response.
|
|
58
|
+
*/
|
|
59
|
+
async requestJson(path, init = {}) {
|
|
60
|
+
const response = await this.request(path, init);
|
|
61
|
+
if (!response.ok) {
|
|
62
|
+
await this.handleErrorResponse(response);
|
|
63
|
+
}
|
|
64
|
+
return (await response.json());
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Query a Tinybird endpoint
|
|
68
|
+
*/
|
|
69
|
+
async query(endpointName, params = {}, options = {}) {
|
|
70
|
+
const url = new URL(`/v0/pipes/${endpointName}.json`, `${this.baseUrl}/`);
|
|
71
|
+
for (const [key, value] of Object.entries(params)) {
|
|
72
|
+
if (value === undefined || value === null) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (Array.isArray(value)) {
|
|
76
|
+
for (const item of value) {
|
|
77
|
+
url.searchParams.append(key, String(item));
|
|
78
|
+
}
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (value instanceof Date) {
|
|
82
|
+
url.searchParams.set(key, value.toISOString());
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
url.searchParams.set(key, String(value));
|
|
86
|
+
}
|
|
87
|
+
const response = await this.request(url.toString(), {
|
|
88
|
+
method: "GET",
|
|
89
|
+
token: options.token,
|
|
90
|
+
signal: this.createAbortSignal(options.timeout, options.signal),
|
|
91
|
+
});
|
|
92
|
+
if (!response.ok) {
|
|
93
|
+
await this.handleErrorResponse(response);
|
|
94
|
+
}
|
|
95
|
+
return (await response.json());
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Ingest a single row into a datasource
|
|
99
|
+
*/
|
|
100
|
+
async ingest(datasourceName, event, options = {}) {
|
|
101
|
+
return this.ingestBatch(datasourceName, [event], options);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Ingest a batch of rows into a datasource
|
|
105
|
+
*/
|
|
106
|
+
async ingestBatch(datasourceName, events, options = {}) {
|
|
107
|
+
if (events.length === 0) {
|
|
108
|
+
return { successful_rows: 0, quarantined_rows: 0 };
|
|
109
|
+
}
|
|
110
|
+
const url = new URL("/v0/events", `${this.baseUrl}/`);
|
|
111
|
+
url.searchParams.set("name", datasourceName);
|
|
112
|
+
if (options.wait !== false) {
|
|
113
|
+
url.searchParams.set("wait", "true");
|
|
114
|
+
}
|
|
115
|
+
const ndjson = events
|
|
116
|
+
.map((event) => JSON.stringify(this.serializeEvent(event)))
|
|
117
|
+
.join("\n");
|
|
118
|
+
const response = await this.request(url.toString(), {
|
|
119
|
+
method: "POST",
|
|
120
|
+
token: options.token,
|
|
121
|
+
headers: {
|
|
122
|
+
"Content-Type": "application/x-ndjson",
|
|
123
|
+
},
|
|
124
|
+
body: ndjson,
|
|
125
|
+
signal: this.createAbortSignal(options.timeout, options.signal),
|
|
126
|
+
});
|
|
127
|
+
if (!response.ok) {
|
|
128
|
+
await this.handleErrorResponse(response);
|
|
129
|
+
}
|
|
130
|
+
return (await response.json());
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Execute raw SQL against Tinybird
|
|
134
|
+
*/
|
|
135
|
+
async sql(sql, options = {}) {
|
|
136
|
+
const response = await this.request("/v0/sql", {
|
|
137
|
+
method: "POST",
|
|
138
|
+
token: options.token,
|
|
139
|
+
headers: {
|
|
140
|
+
"Content-Type": "text/plain",
|
|
141
|
+
},
|
|
142
|
+
body: sql,
|
|
143
|
+
signal: this.createAbortSignal(options.timeout, options.signal),
|
|
144
|
+
});
|
|
145
|
+
if (!response.ok) {
|
|
146
|
+
await this.handleErrorResponse(response);
|
|
147
|
+
}
|
|
148
|
+
return (await response.json());
|
|
149
|
+
}
|
|
150
|
+
createAbortSignal(timeout, existingSignal) {
|
|
151
|
+
const timeoutMs = timeout ?? this.config.timeout ?? DEFAULT_TIMEOUT;
|
|
152
|
+
if (!timeoutMs && !existingSignal) {
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
if (!timeoutMs && existingSignal) {
|
|
156
|
+
return existingSignal;
|
|
157
|
+
}
|
|
158
|
+
const timeoutSignal = AbortSignal.timeout(timeoutMs);
|
|
159
|
+
if (!existingSignal) {
|
|
160
|
+
return timeoutSignal;
|
|
161
|
+
}
|
|
162
|
+
return AbortSignal.any([timeoutSignal, existingSignal]);
|
|
163
|
+
}
|
|
164
|
+
serializeEvent(event) {
|
|
165
|
+
const serialized = {};
|
|
166
|
+
for (const [key, value] of Object.entries(event)) {
|
|
167
|
+
serialized[key] = this.serializeValue(value);
|
|
168
|
+
}
|
|
169
|
+
return serialized;
|
|
170
|
+
}
|
|
171
|
+
serializeValue(value) {
|
|
172
|
+
if (value instanceof Date) {
|
|
173
|
+
return value.toISOString();
|
|
174
|
+
}
|
|
175
|
+
if (value instanceof Map) {
|
|
176
|
+
return Object.fromEntries(value);
|
|
177
|
+
}
|
|
178
|
+
if (typeof value === "bigint") {
|
|
179
|
+
return value.toString();
|
|
180
|
+
}
|
|
181
|
+
if (Array.isArray(value)) {
|
|
182
|
+
return value.map((item) => this.serializeValue(item));
|
|
183
|
+
}
|
|
184
|
+
if (typeof value === "object" && value !== null) {
|
|
185
|
+
return this.serializeEvent(value);
|
|
186
|
+
}
|
|
187
|
+
return value;
|
|
188
|
+
}
|
|
189
|
+
async handleErrorResponse(response) {
|
|
190
|
+
const rawBody = await response.text();
|
|
191
|
+
let errorResponse;
|
|
192
|
+
try {
|
|
193
|
+
errorResponse = JSON.parse(rawBody);
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
// ignore parse error and keep raw body
|
|
197
|
+
}
|
|
198
|
+
const message = errorResponse?.error ??
|
|
199
|
+
(rawBody
|
|
200
|
+
? `Request failed with status ${response.status}: ${rawBody}`
|
|
201
|
+
: `Request failed with status ${response.status}`);
|
|
202
|
+
throw new TinybirdApiError(message, response.status, rawBody || undefined, errorResponse);
|
|
203
|
+
}
|
|
204
|
+
resolveUrl(path) {
|
|
205
|
+
return new URL(path, `${this.baseUrl}/`).toString();
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Create a decoupled Tinybird API wrapper.
|
|
210
|
+
*/
|
|
211
|
+
export function createTinybirdApi(config) {
|
|
212
|
+
return new TinybirdApi(config);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Alias for teams that prefer "wrapper" naming.
|
|
216
|
+
*/
|
|
217
|
+
export const createTinybirdApiWrapper = createTinybirdApi;
|
|
218
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/api/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.test.d.ts","sourceRoot":"","sources":["../../src/api/api.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { afterAll, afterEach, beforeAll, describe, expect, it } from "vitest";
|
|
2
|
+
import { setupServer } from "msw/node";
|
|
3
|
+
import { http, HttpResponse } from "msw";
|
|
4
|
+
import { createTinybirdApi } from "./api.js";
|
|
5
|
+
import { TINYBIRD_FROM_PARAM } from "./fetcher.js";
|
|
6
|
+
import { BASE_URL } from "../test/handlers.js";
|
|
7
|
+
const server = setupServer();
|
|
8
|
+
beforeAll(() => server.listen({ onUnhandledRequest: "error" }));
|
|
9
|
+
afterEach(() => server.resetHandlers());
|
|
10
|
+
afterAll(() => server.close());
|
|
11
|
+
describe("TinybirdApi", () => {
|
|
12
|
+
it("sends authorization header and from=ts-sdk param", async () => {
|
|
13
|
+
let authorizationHeader = null;
|
|
14
|
+
let fromParam = null;
|
|
15
|
+
server.use(http.get(`${BASE_URL}/v1/workspace`, ({ request }) => {
|
|
16
|
+
authorizationHeader = request.headers.get("Authorization");
|
|
17
|
+
const url = new URL(request.url);
|
|
18
|
+
fromParam = url.searchParams.get("from");
|
|
19
|
+
return HttpResponse.json({ ok: true });
|
|
20
|
+
}));
|
|
21
|
+
const api = createTinybirdApi({
|
|
22
|
+
baseUrl: BASE_URL,
|
|
23
|
+
token: "p.default-token",
|
|
24
|
+
});
|
|
25
|
+
await api.request("/v1/workspace");
|
|
26
|
+
expect(authorizationHeader).toBe("Bearer p.default-token");
|
|
27
|
+
expect(fromParam).toBe(TINYBIRD_FROM_PARAM);
|
|
28
|
+
});
|
|
29
|
+
it("resolves relative paths and preserves query params", async () => {
|
|
30
|
+
let fooParam = null;
|
|
31
|
+
let fromParam = null;
|
|
32
|
+
server.use(http.get(`${BASE_URL}/v1/build`, ({ request }) => {
|
|
33
|
+
const url = new URL(request.url);
|
|
34
|
+
fooParam = url.searchParams.get("foo");
|
|
35
|
+
fromParam = url.searchParams.get("from");
|
|
36
|
+
return HttpResponse.json({ ok: true });
|
|
37
|
+
}));
|
|
38
|
+
const api = createTinybirdApi({
|
|
39
|
+
baseUrl: `${BASE_URL}/`,
|
|
40
|
+
token: "p.default-token",
|
|
41
|
+
});
|
|
42
|
+
await api.request("v1/build?foo=bar");
|
|
43
|
+
expect(fooParam).toBe("bar");
|
|
44
|
+
expect(fromParam).toBe(TINYBIRD_FROM_PARAM);
|
|
45
|
+
});
|
|
46
|
+
it("allows per-request token override", async () => {
|
|
47
|
+
let authorizationHeader = null;
|
|
48
|
+
server.use(http.get(`${BASE_URL}/v1/workspace`, ({ request }) => {
|
|
49
|
+
authorizationHeader = request.headers.get("Authorization");
|
|
50
|
+
return HttpResponse.json({ ok: true });
|
|
51
|
+
}));
|
|
52
|
+
const api = createTinybirdApi({
|
|
53
|
+
baseUrl: BASE_URL,
|
|
54
|
+
token: "p.default-token",
|
|
55
|
+
});
|
|
56
|
+
await api.request("/v1/workspace", { token: "p.override-token" });
|
|
57
|
+
expect(authorizationHeader).toBe("Bearer p.override-token");
|
|
58
|
+
});
|
|
59
|
+
it("queries endpoint params via tinybirdApi.query", async () => {
|
|
60
|
+
let fromParam = null;
|
|
61
|
+
let startDateParam = null;
|
|
62
|
+
let limitParam = null;
|
|
63
|
+
let tagsParams = [];
|
|
64
|
+
server.use(http.get(`${BASE_URL}/v0/pipes/top_pages.json`, ({ request }) => {
|
|
65
|
+
const url = new URL(request.url);
|
|
66
|
+
fromParam = url.searchParams.get("from");
|
|
67
|
+
startDateParam = url.searchParams.get("start_date");
|
|
68
|
+
limitParam = url.searchParams.get("limit");
|
|
69
|
+
tagsParams = url.searchParams.getAll("tags");
|
|
70
|
+
return HttpResponse.json({
|
|
71
|
+
data: [{ pathname: "/", views: 1 }],
|
|
72
|
+
meta: [
|
|
73
|
+
{ name: "pathname", type: "String" },
|
|
74
|
+
{ name: "views", type: "UInt64" },
|
|
75
|
+
],
|
|
76
|
+
rows: 1,
|
|
77
|
+
statistics: {
|
|
78
|
+
elapsed: 0.001,
|
|
79
|
+
rows_read: 1,
|
|
80
|
+
bytes_read: 10,
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
}));
|
|
84
|
+
const api = createTinybirdApi({
|
|
85
|
+
baseUrl: BASE_URL,
|
|
86
|
+
token: "p.default-token",
|
|
87
|
+
});
|
|
88
|
+
const result = await api.query("top_pages", {
|
|
89
|
+
start_date: new Date("2024-01-01T00:00:00.000Z"),
|
|
90
|
+
limit: 5,
|
|
91
|
+
tags: ["a", "b"],
|
|
92
|
+
});
|
|
93
|
+
expect(result.rows).toBe(1);
|
|
94
|
+
expect(result.data[0]).toEqual({ pathname: "/", views: 1 });
|
|
95
|
+
expect(fromParam).toBe(TINYBIRD_FROM_PARAM);
|
|
96
|
+
expect(startDateParam).toBe("2024-01-01T00:00:00.000Z");
|
|
97
|
+
expect(limitParam).toBe("5");
|
|
98
|
+
expect(tagsParams).toEqual(["a", "b"]);
|
|
99
|
+
});
|
|
100
|
+
it("ingests rows via tinybirdApi.ingest", async () => {
|
|
101
|
+
let datasourceName = null;
|
|
102
|
+
let waitParam = null;
|
|
103
|
+
let fromParam = null;
|
|
104
|
+
let contentType = null;
|
|
105
|
+
let parsedBody = null;
|
|
106
|
+
server.use(http.post(`${BASE_URL}/v0/events`, async ({ request }) => {
|
|
107
|
+
const url = new URL(request.url);
|
|
108
|
+
datasourceName = url.searchParams.get("name");
|
|
109
|
+
waitParam = url.searchParams.get("wait");
|
|
110
|
+
fromParam = url.searchParams.get("from");
|
|
111
|
+
contentType = request.headers.get("content-type");
|
|
112
|
+
const rawBody = await request.text();
|
|
113
|
+
parsedBody = JSON.parse(rawBody);
|
|
114
|
+
return HttpResponse.json({
|
|
115
|
+
successful_rows: 1,
|
|
116
|
+
quarantined_rows: 0,
|
|
117
|
+
});
|
|
118
|
+
}));
|
|
119
|
+
const api = createTinybirdApi({
|
|
120
|
+
baseUrl: BASE_URL,
|
|
121
|
+
token: "p.default-token",
|
|
122
|
+
});
|
|
123
|
+
const result = await api.ingest("events", {
|
|
124
|
+
timestamp: new Date("2024-01-01T00:00:00.000Z"),
|
|
125
|
+
count: 10n,
|
|
126
|
+
payload: new Map([["k", "v"]]),
|
|
127
|
+
nested: {
|
|
128
|
+
when: new Date("2024-01-02T00:00:00.000Z"),
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
expect(result).toEqual({ successful_rows: 1, quarantined_rows: 0 });
|
|
132
|
+
expect(datasourceName).toBe("events");
|
|
133
|
+
expect(waitParam).toBe("true");
|
|
134
|
+
expect(fromParam).toBe(TINYBIRD_FROM_PARAM);
|
|
135
|
+
expect(contentType).toBe("application/x-ndjson");
|
|
136
|
+
expect(parsedBody).toEqual({
|
|
137
|
+
timestamp: "2024-01-01T00:00:00.000Z",
|
|
138
|
+
count: "10",
|
|
139
|
+
payload: { k: "v" },
|
|
140
|
+
nested: { when: "2024-01-02T00:00:00.000Z" },
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
it("executes raw SQL via tinybirdApi.sql", async () => {
|
|
144
|
+
let rawSql = null;
|
|
145
|
+
let contentType = null;
|
|
146
|
+
server.use(http.post(`${BASE_URL}/v0/sql`, async ({ request }) => {
|
|
147
|
+
contentType = request.headers.get("content-type");
|
|
148
|
+
rawSql = await request.text();
|
|
149
|
+
return HttpResponse.json({
|
|
150
|
+
data: [{ value: 1 }],
|
|
151
|
+
meta: [{ name: "value", type: "UInt8" }],
|
|
152
|
+
rows: 1,
|
|
153
|
+
statistics: {
|
|
154
|
+
elapsed: 0.001,
|
|
155
|
+
rows_read: 1,
|
|
156
|
+
bytes_read: 1,
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
}));
|
|
160
|
+
const api = createTinybirdApi({
|
|
161
|
+
baseUrl: BASE_URL,
|
|
162
|
+
token: "p.default-token",
|
|
163
|
+
});
|
|
164
|
+
const result = await api.sql("SELECT 1 AS value");
|
|
165
|
+
expect(result.data[0]?.value).toBe(1);
|
|
166
|
+
expect(contentType).toBe("text/plain");
|
|
167
|
+
expect(rawSql).toBe("SELECT 1 AS value");
|
|
168
|
+
});
|
|
169
|
+
it("returns zero counts for empty ingest batches", async () => {
|
|
170
|
+
const api = createTinybirdApi({
|
|
171
|
+
baseUrl: BASE_URL,
|
|
172
|
+
token: "p.default-token",
|
|
173
|
+
});
|
|
174
|
+
const result = await api.ingestBatch("events", []);
|
|
175
|
+
expect(result).toEqual({ successful_rows: 0, quarantined_rows: 0 });
|
|
176
|
+
});
|
|
177
|
+
it("parses JSON responses", async () => {
|
|
178
|
+
server.use(http.get(`${BASE_URL}/v1/workspace`, () => {
|
|
179
|
+
return HttpResponse.json({ id: "ws_123", name: "main" });
|
|
180
|
+
}));
|
|
181
|
+
const api = createTinybirdApi({
|
|
182
|
+
baseUrl: BASE_URL,
|
|
183
|
+
token: "p.default-token",
|
|
184
|
+
});
|
|
185
|
+
const result = await api.requestJson("/v1/workspace");
|
|
186
|
+
expect(result.id).toBe("ws_123");
|
|
187
|
+
expect(result.name).toBe("main");
|
|
188
|
+
});
|
|
189
|
+
it("throws TinybirdApiError for non-OK responses", async () => {
|
|
190
|
+
server.use(http.get(`${BASE_URL}/v1/workspace`, () => {
|
|
191
|
+
return new HttpResponse("Unauthorized", { status: 401 });
|
|
192
|
+
}));
|
|
193
|
+
const api = createTinybirdApi({
|
|
194
|
+
baseUrl: BASE_URL,
|
|
195
|
+
token: "p.default-token",
|
|
196
|
+
});
|
|
197
|
+
await expect(api.requestJson("/v1/workspace")).rejects.toMatchObject({
|
|
198
|
+
name: "TinybirdApiError",
|
|
199
|
+
statusCode: 401,
|
|
200
|
+
responseBody: "Unauthorized",
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
it("throws TinybirdApiError with parsed API details", async () => {
|
|
204
|
+
server.use(http.get(`${BASE_URL}/v0/pipes/broken.json`, () => {
|
|
205
|
+
return HttpResponse.json({
|
|
206
|
+
error: "Invalid query",
|
|
207
|
+
status: 400,
|
|
208
|
+
documentation: "https://www.tinybird.co/docs",
|
|
209
|
+
}, { status: 400 });
|
|
210
|
+
}));
|
|
211
|
+
const api = createTinybirdApi({
|
|
212
|
+
baseUrl: BASE_URL,
|
|
213
|
+
token: "p.default-token",
|
|
214
|
+
});
|
|
215
|
+
await expect(api.query("broken")).rejects.toMatchObject({
|
|
216
|
+
name: "TinybirdApiError",
|
|
217
|
+
statusCode: 400,
|
|
218
|
+
message: "Invalid query",
|
|
219
|
+
response: {
|
|
220
|
+
error: "Invalid query",
|
|
221
|
+
status: 400,
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
//# sourceMappingURL=api.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.test.js","sourceRoot":"","sources":["../../src/api/api.test.ts"],"names":[],"mappings":"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"}
|
package/dist/client/base.d.ts
CHANGED
|
@@ -32,7 +32,7 @@ import type { ClientConfig, QueryResult, IngestResult, QueryOptions, IngestOptio
|
|
|
32
32
|
*/
|
|
33
33
|
export declare class TinybirdClient {
|
|
34
34
|
private readonly config;
|
|
35
|
-
private readonly
|
|
35
|
+
private readonly apisByToken;
|
|
36
36
|
private tokenPromise;
|
|
37
37
|
private resolvedToken;
|
|
38
38
|
constructor(config: ClientConfig);
|
|
@@ -79,22 +79,8 @@ export declare class TinybirdClient {
|
|
|
79
79
|
* @returns Query result
|
|
80
80
|
*/
|
|
81
81
|
sql<T = unknown>(sql: string, options?: QueryOptions): Promise<QueryResult<T>>;
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
*/
|
|
85
|
-
private serializeEvent;
|
|
86
|
-
/**
|
|
87
|
-
* Create an AbortSignal with timeout
|
|
88
|
-
*/
|
|
89
|
-
private createAbortSignal;
|
|
90
|
-
/**
|
|
91
|
-
* Handle error responses from the API
|
|
92
|
-
*/
|
|
93
|
-
private handleErrorResponse;
|
|
94
|
-
/**
|
|
95
|
-
* Internal fetch wrapper
|
|
96
|
-
*/
|
|
97
|
-
private fetch;
|
|
82
|
+
private getApi;
|
|
83
|
+
private rethrowApiError;
|
|
98
84
|
}
|
|
99
85
|
/**
|
|
100
86
|
* Create a Tinybird client
|