@secondlayer/sdk 0.3.1 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -12,6 +12,22 @@ declare abstract class BaseClient {
12
12
  static authHeaders(apiKey?: string): Record<string, string>;
13
13
  protected request<T>(method: string, path: string, body?: unknown): Promise<T>;
14
14
  }
15
+ interface DeliverySummary {
16
+ id: string;
17
+ blockHeight: number;
18
+ status: string;
19
+ statusCode: number | null;
20
+ responseTimeMs: number | null;
21
+ attempts: number;
22
+ error: string | null;
23
+ createdAt: string;
24
+ }
25
+ interface DeliveryDetail extends DeliverySummary {
26
+ payload: unknown;
27
+ }
28
+ interface DeliveriesResponse {
29
+ deliveries: DeliverySummary[];
30
+ }
15
31
  declare class Streams extends BaseClient {
16
32
  private requestWithStreamId;
17
33
  resolveStreamId(partialId: string): Promise<string>;
@@ -28,11 +44,19 @@ declare class Streams extends BaseClient {
28
44
  rotateSecret(id: string): Promise<{
29
45
  secret: string
30
46
  }>;
47
+ /** List recent deliveries for a stream. */
48
+ listDeliveries(id: string, params?: {
49
+ limit?: number
50
+ status?: string
51
+ }): Promise<DeliveriesResponse>;
52
+ /** Get a single delivery with full payload. */
53
+ getDelivery(streamId: string, deliveryId: string): Promise<DeliveryDetail>;
31
54
  pauseAll(): Promise<BulkPauseResponse>;
32
55
  resumeAll(): Promise<BulkResumeResponse>;
33
56
  }
34
57
  import { ViewSummary, ViewDetail, ViewQueryParams, ReindexResponse } from "@secondlayer/shared/schemas";
35
58
  import { DeployViewRequest, DeployViewResponse } from "@secondlayer/shared/schemas/views";
59
+ import { InferViewClient } from "@secondlayer/views";
36
60
  declare class Views extends BaseClient {
37
61
  list(): Promise<{
38
62
  data: ViewSummary[]
@@ -50,7 +74,25 @@ declare class Views extends BaseClient {
50
74
  queryTableCount(name: string, table: string, params?: ViewQueryParams): Promise<{
51
75
  count: number
52
76
  }>;
77
+ /**
78
+ * Returns a typed client for a view defined with `defineView()`.
79
+ * Row types are inferred from the view's schema literal types.
80
+ *
81
+ * @example
82
+ * ```ts
83
+ * import myView from './views/my-token-view'
84
+ * const client = sl.views.typed(myView)
85
+ * const rows = await client.transfers.findMany({ where: { sender: 'SP...' } })
86
+ * // rows: InferTableRow<typeof myView.schema.transfers>[]
87
+ * ```
88
+ */
89
+ typed<T extends {
90
+ name: string
91
+ schema: Record<string, unknown>
92
+ }>(def: T): InferViewClient<T>;
93
+ private createTableClient;
53
94
  }
95
+ import { InferViewClient as InferViewClient2 } from "@secondlayer/views";
54
96
  import { QueueStats } from "@secondlayer/shared/types";
55
97
  declare class SecondLayer extends BaseClient {
56
98
  readonly streams: Streams;
@@ -59,6 +101,24 @@ declare class SecondLayer extends BaseClient {
59
101
  getQueueStats(): Promise<QueueStats>;
60
102
  }
61
103
  /**
104
+ * Returns a typed client for a view defined with `defineView()`.
105
+ *
106
+ * Accepts a plain options object, a `SecondLayer` instance, or a `Views` instance.
107
+ *
108
+ * @example
109
+ * ```ts
110
+ * import myView from './views/my-view'
111
+ * import { getView } from '@secondlayer/sdk'
112
+ *
113
+ * const client = getView(myView, { apiKey: 'sl_...' })
114
+ * const rows = await client.transfers.findMany({ where: { sender: 'SP...' } })
115
+ * ```
116
+ */
117
+ declare function getView<T extends {
118
+ name: string
119
+ schema: Record<string, unknown>
120
+ }>(def: T, options?: Partial<SecondLayerOptions> | SecondLayer | Views): InferViewClient2<T>;
121
+ /**
62
122
  * Error thrown by {@link SecondLayer} when an API request fails.
63
123
  * Includes the HTTP status code for programmatic error handling.
64
124
  *
@@ -78,4 +138,4 @@ declare class ApiError extends Error {
78
138
  status: number;
79
139
  constructor(status: number, message: string);
80
140
  }
81
- export { Views, Streams, SecondLayerOptions, SecondLayer, ApiError };
141
+ export { getView, Views, Streams, SecondLayerOptions, SecondLayer, ApiError };
package/dist/index.js CHANGED
@@ -127,6 +127,19 @@ class Streams extends BaseClient {
127
127
  async rotateSecret(id) {
128
128
  return this.requestWithStreamId("POST", (id2) => `/api/streams/${id2}/rotate-secret`, id);
129
129
  }
130
+ async listDeliveries(id, params) {
131
+ const qs = new URLSearchParams;
132
+ if (params?.limit)
133
+ qs.set("limit", String(params.limit));
134
+ if (params?.status)
135
+ qs.set("status", params.status);
136
+ const query = qs.toString();
137
+ return this.requestWithStreamId("GET", (id2) => `/api/streams/${id2}/deliveries${query ? `?${query}` : ""}`, id);
138
+ }
139
+ async getDelivery(streamId, deliveryId) {
140
+ const fullId = await this.resolveStreamId(streamId);
141
+ return this.request("GET", `/api/streams/${fullId}/deliveries/${deliveryId}`);
142
+ }
130
143
  async pauseAll() {
131
144
  return this.request("POST", "/api/streams/pause");
132
145
  }
@@ -134,6 +147,47 @@ class Streams extends BaseClient {
134
147
  return this.request("POST", "/api/streams/resume");
135
148
  }
136
149
  }
150
+ // src/views/serialize.ts
151
+ var SYSTEM_COLUMN_MAP = {
152
+ _blockHeight: "_block_height",
153
+ _txId: "_tx_id",
154
+ _createdAt: "_created_at",
155
+ _id: "_id",
156
+ blockHeight: "_block_height",
157
+ txId: "_tx_id",
158
+ createdAt: "_created_at",
159
+ id: "_id"
160
+ };
161
+ function resolveColumn(col) {
162
+ return SYSTEM_COLUMN_MAP[col] ?? col;
163
+ }
164
+ function serializeWhere(where) {
165
+ const filters = {};
166
+ for (const [column, value] of Object.entries(where)) {
167
+ if (value === null || value === undefined)
168
+ continue;
169
+ const col = resolveColumn(column);
170
+ if (typeof value === "object" && !Array.isArray(value)) {
171
+ const ops = value;
172
+ for (const [op, opValue] of Object.entries(ops)) {
173
+ if (opValue === null || opValue === undefined)
174
+ continue;
175
+ if (op === "eq") {
176
+ filters[col] = String(opValue);
177
+ } else if (["neq", "gt", "gte", "lt", "lte"].includes(op)) {
178
+ filters[`${col}.${op}`] = String(opValue);
179
+ }
180
+ }
181
+ } else {
182
+ filters[col] = String(value);
183
+ }
184
+ }
185
+ return filters;
186
+ }
187
+ function resolveOrderByColumn(col) {
188
+ return resolveColumn(col);
189
+ }
190
+
137
191
  // src/views/client.ts
138
192
  function buildViewQueryString(params) {
139
193
  const qs = new URLSearchParams;
@@ -149,7 +203,7 @@ function buildViewQueryString(params) {
149
203
  qs.set("_fields", params.fields);
150
204
  if (params.filters) {
151
205
  for (const [key, value] of Object.entries(params.filters)) {
152
- qs.set(key, value);
206
+ qs.set(key, String(value));
153
207
  }
154
208
  }
155
209
  const str = qs.toString();
@@ -178,6 +232,45 @@ class Views extends BaseClient {
178
232
  async queryTableCount(name, table, params = {}) {
179
233
  return this.request("GET", `/api/views/${name}/${table}/count${buildViewQueryString(params)}`);
180
234
  }
235
+ typed(def) {
236
+ const result = {};
237
+ for (const tableName of Object.keys(def.schema)) {
238
+ result[tableName] = this.createTableClient(def.name, tableName);
239
+ }
240
+ return result;
241
+ }
242
+ createTableClient(viewName, tableName) {
243
+ const self = this;
244
+ return {
245
+ async findMany(options = {}) {
246
+ const filters = options.where ? serializeWhere(options.where) : undefined;
247
+ let sort;
248
+ let order;
249
+ if (options.orderBy) {
250
+ const entries = Object.entries(options.orderBy);
251
+ if (entries.length > 0) {
252
+ const [col, dir] = entries[0];
253
+ sort = resolveOrderByColumn(col);
254
+ order = dir ?? "asc";
255
+ }
256
+ }
257
+ const params = {
258
+ sort,
259
+ order,
260
+ limit: options.limit,
261
+ offset: options.offset,
262
+ fields: options.fields?.join(","),
263
+ filters
264
+ };
265
+ return self.queryTable(viewName, tableName, params);
266
+ },
267
+ async count(where) {
268
+ const filters = where ? serializeWhere(where) : undefined;
269
+ const result = await self.queryTableCount(viewName, tableName, { filters });
270
+ return result.count;
271
+ }
272
+ };
273
+ }
181
274
  }
182
275
  // src/client.ts
183
276
  class SecondLayer extends BaseClient {
@@ -193,12 +286,24 @@ class SecondLayer extends BaseClient {
193
286
  return status.queue;
194
287
  }
195
288
  }
289
+
290
+ // src/views/get-view.ts
291
+ function getView(def, options = {}) {
292
+ if (options instanceof Views) {
293
+ return options.typed(def);
294
+ }
295
+ if (options instanceof SecondLayer) {
296
+ return options.views.typed(def);
297
+ }
298
+ return new Views(options).typed(def);
299
+ }
196
300
  export {
301
+ getView,
197
302
  Views,
198
303
  Streams,
199
304
  SecondLayer,
200
305
  ApiError
201
306
  };
202
307
 
203
- //# debugId=3185A873B53583DC64756E2164756E21
308
+ //# debugId=01E631C6D382526564756E2164756E21
204
309
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,14 +1,16 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/errors.ts", "../src/base.ts", "../src/streams/client.ts", "../src/views/client.ts", "../src/client.ts"],
3
+ "sources": ["../src/errors.ts", "../src/base.ts", "../src/streams/client.ts", "../src/views/serialize.ts", "../src/views/client.ts", "../src/client.ts", "../src/views/get-view.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * Error thrown by {@link SecondLayer} when an API request fails.\n * Includes the HTTP status code for programmatic error handling.\n *\n * @example\n * ```ts\n * try {\n * await client.streams.get(\"abc123\");\n * } catch (err) {\n * if (err instanceof ApiError && err.status === 404) {\n * console.log(\"Stream not found\");\n * }\n * }\n * ```\n */\nexport class ApiError extends Error {\n constructor(\n /** HTTP status code (0 for network errors). */\n public status: number,\n message: string\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n",
6
6
  "import { ApiError } from \"./errors.ts\";\n\nexport interface SecondLayerOptions {\n /** Base URL of the Secondlayer API (trailing slashes are stripped). */\n baseUrl: string;\n /** Bearer token for authenticated requests. */\n apiKey?: string;\n}\n\nconst DEFAULT_BASE_URL = \"https://api.secondlayer.tools\";\n\nexport abstract class BaseClient {\n protected baseUrl: string;\n protected apiKey?: string;\n\n constructor(options: Partial<SecondLayerOptions> = {}) {\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.apiKey = options.apiKey;\n }\n\n static authHeaders(apiKey?: string): Record<string, string> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n }\n return headers;\n }\n\n protected async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers = BaseClient.authHeaders(this.apiKey);\n\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n } catch {\n throw new ApiError(0, `Cannot reach API at ${this.baseUrl}. Check your connection or try again.`);\n }\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new ApiError(401, \"API key invalid or expired.\");\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"Retry-After\");\n const msg = retryAfter\n ? `Rate limited. Wait ${retryAfter} seconds.`\n : \"Rate limited. Try again later.\";\n throw new ApiError(429, msg);\n }\n\n if (response.status >= 500) {\n throw new ApiError(response.status, `Server error. Try again or check status at ${this.baseUrl}/health`);\n }\n\n const errorBody = await response.text();\n let message = `HTTP ${response.status}`;\n try {\n const json = JSON.parse(errorBody);\n message = json.error || json.message || message;\n } catch {\n if (errorBody) message = errorBody;\n }\n throw new ApiError(response.status, message);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n}\n",
7
- "import type {\n CreateStream,\n UpdateStream,\n StreamResponse,\n CreateStreamResponse,\n ListStreamsResponse,\n BulkPauseResponse,\n BulkResumeResponse,\n} from \"@secondlayer/shared/schemas\";\nimport { ApiError } from \"../errors.ts\";\nimport { BaseClient } from \"../base.ts\";\n\nexport class Streams extends BaseClient {\n private async requestWithStreamId<T>(\n method: string,\n pathTemplate: (id: string) => string,\n id: string,\n body?: unknown\n ): Promise<T> {\n const fullId = await this.resolveStreamId(id);\n return this.request<T>(method, pathTemplate(fullId), body);\n }\n\n async resolveStreamId(partialId: string): Promise<string> {\n if (partialId.length === 36 && partialId.includes(\"-\")) {\n return partialId;\n }\n\n const { streams } = await this.list();\n const typedStreams = streams as { id: string }[];\n const matches = typedStreams.filter((s) => s.id.startsWith(partialId));\n\n if (matches.length === 0) {\n throw new ApiError(404, `No stream found matching \"${partialId}\"`);\n }\n if (matches.length > 1) {\n throw new ApiError(400, `Multiple streams match \"${partialId}\": ${matches.map((s) => s.id.slice(0, 8)).join(\", \")}`);\n }\n\n return matches[0]!.id;\n }\n\n async create(data: CreateStream): Promise<CreateStreamResponse> {\n return this.request<CreateStreamResponse>(\"POST\", \"/api/streams\", data);\n }\n\n async update(id: string, data: UpdateStream): Promise<StreamResponse> {\n return this.requestWithStreamId(\"PATCH\", (id) => `/api/streams/${id}`, id, data);\n }\n\n async updateByName(name: string, data: CreateStream): Promise<StreamResponse> {\n const { streams } = await this.list();\n const typedStreams = streams as { id: string; name: string }[];\n const existing = typedStreams.find((s) => s.name === name);\n if (!existing) {\n throw new ApiError(404, `Stream with name \"${name}\" not found`);\n }\n return this.update(existing.id, data);\n }\n\n async list(params?: { status?: string }): Promise<ListStreamsResponse> {\n const searchParams = new URLSearchParams();\n if (params?.status) searchParams.set(\"status\", params.status);\n const query = searchParams.toString();\n const path = query ? `/api/streams?${query}` : \"/api/streams\";\n return this.request<ListStreamsResponse>(\"GET\", path);\n }\n\n async get(id: string): Promise<StreamResponse> {\n return this.requestWithStreamId(\"GET\", (id) => `/api/streams/${id}`, id);\n }\n\n async delete(id: string): Promise<void> {\n return this.requestWithStreamId(\"DELETE\", (id) => `/api/streams/${id}`, id);\n }\n\n async enable(id: string): Promise<StreamResponse> {\n return this.requestWithStreamId(\"POST\", (id) => `/api/streams/${id}/enable`, id);\n }\n\n async disable(id: string): Promise<StreamResponse> {\n return this.requestWithStreamId(\"POST\", (id) => `/api/streams/${id}/disable`, id);\n }\n\n async rotateSecret(id: string): Promise<{ secret: string }> {\n return this.requestWithStreamId(\"POST\", (id) => `/api/streams/${id}/rotate-secret`, id);\n }\n\n async pauseAll(): Promise<BulkPauseResponse> {\n return this.request<BulkPauseResponse>(\"POST\", \"/api/streams/pause\");\n }\n\n async resumeAll(): Promise<BulkResumeResponse> {\n return this.request<BulkResumeResponse>(\"POST\", \"/api/streams/resume\");\n }\n}\n",
8
- "import type {\n ViewSummary,\n ViewDetail,\n ViewQueryParams,\n ReindexResponse,\n} from \"@secondlayer/shared/schemas\";\nimport type { DeployViewRequest, DeployViewResponse } from \"@secondlayer/shared/schemas/views\";\nimport { BaseClient } from \"../base.ts\";\n\nfunction buildViewQueryString(params: ViewQueryParams): string {\n const qs = new URLSearchParams();\n if (params.sort) qs.set(\"_sort\", params.sort);\n if (params.order) qs.set(\"_order\", params.order);\n if (params.limit !== undefined) qs.set(\"_limit\", String(params.limit));\n if (params.offset !== undefined) qs.set(\"_offset\", String(params.offset));\n if (params.fields) qs.set(\"_fields\", params.fields);\n if (params.filters) {\n for (const [key, value] of Object.entries(params.filters)) {\n qs.set(key, value);\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\nexport class Views extends BaseClient {\n async list(): Promise<{ data: ViewSummary[] }> {\n return this.request<{ data: ViewSummary[] }>(\"GET\", \"/api/views\");\n }\n\n async get(name: string): Promise<ViewDetail> {\n return this.request<ViewDetail>(\"GET\", `/api/views/${name}`);\n }\n\n async reindex(name: string, options?: { fromBlock?: number; toBlock?: number }): Promise<ReindexResponse> {\n return this.request<ReindexResponse>(\"POST\", `/api/views/${name}/reindex`, options);\n }\n\n async delete(name: string): Promise<{ message: string }> {\n return this.request<{ message: string }>(\"DELETE\", `/api/views/${name}`);\n }\n\n async deploy(data: DeployViewRequest): Promise<DeployViewResponse> {\n return this.request<DeployViewResponse>(\"POST\", \"/api/views\", data);\n }\n\n async queryTable(name: string, table: string, params: ViewQueryParams = {}): Promise<unknown[]> {\n return this.request<unknown[]>(\"GET\", `/api/views/${name}/${table}${buildViewQueryString(params)}`);\n }\n\n async queryTableCount(name: string, table: string, params: ViewQueryParams = {}): Promise<{ count: number }> {\n return this.request<{ count: number }>(\"GET\", `/api/views/${name}/${table}/count${buildViewQueryString(params)}`);\n }\n}\n",
9
- "import type { QueueStats } from \"@secondlayer/shared/types\";\nimport { BaseClient } from \"./base.ts\";\nimport type { SecondLayerOptions } from \"./base.ts\";\nimport { Streams } from \"./streams/client.ts\";\nimport { Views } from \"./views/client.ts\";\n\nexport class SecondLayer extends BaseClient {\n readonly streams: Streams;\n readonly views: Views;\n\n constructor(options: Partial<SecondLayerOptions> = {}) {\n super(options);\n this.streams = new Streams(options);\n this.views = new Views(options);\n }\n\n async getQueueStats(): Promise<QueueStats> {\n const status = await this.request<{ queue: QueueStats }>(\"GET\", \"/status\");\n return status.queue;\n }\n}\n"
7
+ "import type {\n CreateStream,\n UpdateStream,\n StreamResponse,\n CreateStreamResponse,\n ListStreamsResponse,\n BulkPauseResponse,\n BulkResumeResponse,\n} from \"@secondlayer/shared/schemas\";\nimport { ApiError } from \"../errors.ts\";\nimport { BaseClient } from \"../base.ts\";\n\nexport interface DeliverySummary {\n id: string;\n blockHeight: number;\n status: string;\n statusCode: number | null;\n responseTimeMs: number | null;\n attempts: number;\n error: string | null;\n createdAt: string;\n}\n\nexport interface DeliveryDetail extends DeliverySummary {\n payload: unknown;\n}\n\nexport interface DeliveriesResponse {\n deliveries: DeliverySummary[];\n}\n\nexport class Streams extends BaseClient {\n private async requestWithStreamId<T>(\n method: string,\n pathTemplate: (id: string) => string,\n id: string,\n body?: unknown\n ): Promise<T> {\n const fullId = await this.resolveStreamId(id);\n return this.request<T>(method, pathTemplate(fullId), body);\n }\n\n async resolveStreamId(partialId: string): Promise<string> {\n if (partialId.length === 36 && partialId.includes(\"-\")) {\n return partialId;\n }\n\n const { streams } = await this.list();\n const typedStreams = streams as { id: string }[];\n const matches = typedStreams.filter((s) => s.id.startsWith(partialId));\n\n if (matches.length === 0) {\n throw new ApiError(404, `No stream found matching \"${partialId}\"`);\n }\n if (matches.length > 1) {\n throw new ApiError(400, `Multiple streams match \"${partialId}\": ${matches.map((s) => s.id.slice(0, 8)).join(\", \")}`);\n }\n\n return matches[0]!.id;\n }\n\n async create(data: CreateStream): Promise<CreateStreamResponse> {\n return this.request<CreateStreamResponse>(\"POST\", \"/api/streams\", data);\n }\n\n async update(id: string, data: UpdateStream): Promise<StreamResponse> {\n return this.requestWithStreamId(\"PATCH\", (id) => `/api/streams/${id}`, id, data);\n }\n\n async updateByName(name: string, data: CreateStream): Promise<StreamResponse> {\n const { streams } = await this.list();\n const typedStreams = streams as { id: string; name: string }[];\n const existing = typedStreams.find((s) => s.name === name);\n if (!existing) {\n throw new ApiError(404, `Stream with name \"${name}\" not found`);\n }\n return this.update(existing.id, data);\n }\n\n async list(params?: { status?: string }): Promise<ListStreamsResponse> {\n const searchParams = new URLSearchParams();\n if (params?.status) searchParams.set(\"status\", params.status);\n const query = searchParams.toString();\n const path = query ? `/api/streams?${query}` : \"/api/streams\";\n return this.request<ListStreamsResponse>(\"GET\", path);\n }\n\n async get(id: string): Promise<StreamResponse> {\n return this.requestWithStreamId(\"GET\", (id) => `/api/streams/${id}`, id);\n }\n\n async delete(id: string): Promise<void> {\n return this.requestWithStreamId(\"DELETE\", (id) => `/api/streams/${id}`, id);\n }\n\n async enable(id: string): Promise<StreamResponse> {\n return this.requestWithStreamId(\"POST\", (id) => `/api/streams/${id}/enable`, id);\n }\n\n async disable(id: string): Promise<StreamResponse> {\n return this.requestWithStreamId(\"POST\", (id) => `/api/streams/${id}/disable`, id);\n }\n\n async rotateSecret(id: string): Promise<{ secret: string }> {\n return this.requestWithStreamId(\"POST\", (id) => `/api/streams/${id}/rotate-secret`, id);\n }\n\n // ── Deliveries ─────────────────────────────────────────────────────\n\n /** List recent deliveries for a stream. */\n async listDeliveries(id: string, params?: { limit?: number; status?: string }): Promise<DeliveriesResponse> {\n const qs = new URLSearchParams();\n if (params?.limit) qs.set(\"limit\", String(params.limit));\n if (params?.status) qs.set(\"status\", params.status);\n const query = qs.toString();\n return this.requestWithStreamId(\"GET\", (id) => `/api/streams/${id}/deliveries${query ? `?${query}` : \"\"}`, id);\n }\n\n /** Get a single delivery with full payload. */\n async getDelivery(streamId: string, deliveryId: string): Promise<DeliveryDetail> {\n const fullId = await this.resolveStreamId(streamId);\n return this.request<DeliveryDetail>(\"GET\", `/api/streams/${fullId}/deliveries/${deliveryId}`);\n }\n\n async pauseAll(): Promise<BulkPauseResponse> {\n return this.request<BulkPauseResponse>(\"POST\", \"/api/streams/pause\");\n }\n\n async resumeAll(): Promise<BulkResumeResponse> {\n return this.request<BulkResumeResponse>(\"POST\", \"/api/streams/resume\");\n }\n}\n",
8
+ "/**\n * Maps camelCase system column names (with or without `_` prefix) to the\n * actual snake_case DB column names used in query params.\n */\nconst SYSTEM_COLUMN_MAP: Record<string, string> = {\n // underscore-prefixed camelCase (canonical row shape)\n _blockHeight: \"_block_height\",\n _txId: \"_tx_id\",\n _createdAt: \"_created_at\",\n _id: \"_id\",\n // no-prefix aliases\n blockHeight: \"_block_height\",\n txId: \"_tx_id\",\n createdAt: \"_created_at\",\n id: \"_id\",\n};\n\nfunction resolveColumn(col: string): string {\n return SYSTEM_COLUMN_MAP[col] ?? col;\n}\n\n/**\n * Serializes a WhereInput object into the flat filter map expected by\n * ViewQueryParams.filters (and the REST API query string).\n *\n * Scalar values → `{ column: \"value\" }`\n * Comparison objects `{ \"column.gte\": \"100\", \"column.lt\": \"200\" }`\n * System column aliases → `blockHeight` / `_blockHeight` both → `_block_height`\n */\nexport function serializeWhere(\n where: Record<string, unknown>,\n): Record<string, string> {\n const filters: Record<string, string> = {};\n\n for (const [column, value] of Object.entries(where)) {\n if (value === null || value === undefined) continue;\n\n const col = resolveColumn(column);\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const ops = value as Record<string, unknown>;\n for (const [op, opValue] of Object.entries(ops)) {\n if (opValue === null || opValue === undefined) continue;\n if (op === \"eq\") {\n filters[col] = String(opValue);\n } else if ([\"neq\", \"gt\", \"gte\", \"lt\", \"lte\"].includes(op)) {\n filters[`${col}.${op}`] = String(opValue);\n }\n }\n } else {\n filters[col] = String(value);\n }\n }\n\n return filters;\n}\n\n/**\n * Resolves an orderBy column name (either alias or canonical) to the DB column name.\n */\nexport function resolveOrderByColumn(col: string): string {\n return resolveColumn(col);\n}\n",
9
+ "import type {\n ViewSummary,\n ViewDetail,\n ViewQueryParams,\n ReindexResponse,\n} from \"@secondlayer/shared/schemas\";\nimport type { DeployViewRequest, DeployViewResponse } from \"@secondlayer/shared/schemas/views\";\nimport type {\n InferViewClient,\n FindManyOptions,\n WhereInput,\n} from \"@secondlayer/views\";\nimport { BaseClient } from \"../base.ts\";\nimport { serializeWhere, resolveOrderByColumn } from \"./serialize.ts\";\n\nfunction buildViewQueryString(params: ViewQueryParams): string {\n const qs = new URLSearchParams();\n if (params.sort) qs.set(\"_sort\", params.sort);\n if (params.order) qs.set(\"_order\", params.order);\n if (params.limit !== undefined) qs.set(\"_limit\", String(params.limit));\n if (params.offset !== undefined) qs.set(\"_offset\", String(params.offset));\n if (params.fields) qs.set(\"_fields\", params.fields);\n if (params.filters) {\n for (const [key, value] of Object.entries(params.filters)) {\n qs.set(key, String(value));\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\nexport class Views extends BaseClient {\n async list(): Promise<{ data: ViewSummary[] }> {\n return this.request<{ data: ViewSummary[] }>(\"GET\", \"/api/views\");\n }\n\n async get(name: string): Promise<ViewDetail> {\n return this.request<ViewDetail>(\"GET\", `/api/views/${name}`);\n }\n\n async reindex(name: string, options?: { fromBlock?: number; toBlock?: number }): Promise<ReindexResponse> {\n return this.request<ReindexResponse>(\"POST\", `/api/views/${name}/reindex`, options);\n }\n\n async delete(name: string): Promise<{ message: string }> {\n return this.request<{ message: string }>(\"DELETE\", `/api/views/${name}`);\n }\n\n async deploy(data: DeployViewRequest): Promise<DeployViewResponse> {\n return this.request<DeployViewResponse>(\"POST\", \"/api/views\", data);\n }\n\n async queryTable(name: string, table: string, params: ViewQueryParams = {}): Promise<unknown[]> {\n return this.request<unknown[]>(\"GET\", `/api/views/${name}/${table}${buildViewQueryString(params)}`);\n }\n\n async queryTableCount(name: string, table: string, params: ViewQueryParams = {}): Promise<{ count: number }> {\n return this.request<{ count: number }>(\"GET\", `/api/views/${name}/${table}/count${buildViewQueryString(params)}`);\n }\n\n /**\n * Returns a typed client for a view defined with `defineView()`.\n * Row types are inferred from the view's schema literal types.\n *\n * @example\n * ```ts\n * import myView from './views/my-token-view'\n * const client = sl.views.typed(myView)\n * const rows = await client.transfers.findMany({ where: { sender: 'SP...' } })\n * // rows: InferTableRow<typeof myView.schema.transfers>[]\n * ```\n */\n typed<T extends { name: string; schema: Record<string, unknown> }>(\n def: T,\n ): InferViewClient<T> {\n const result: Record<string, unknown> = {};\n\n for (const tableName of Object.keys(def.schema)) {\n result[tableName] = this.createTableClient(def.name, tableName);\n }\n\n return result as InferViewClient<T>;\n }\n\n private createTableClient(viewName: string, tableName: string) {\n const self = this;\n\n return {\n async findMany<TRow>(options: FindManyOptions<TRow> = {}): Promise<TRow[]> {\n const filters = options.where\n ? serializeWhere(options.where as Record<string, unknown>)\n : undefined;\n\n let sort: string | undefined;\n let order: string | undefined;\n if (options.orderBy) {\n const entries = Object.entries(options.orderBy);\n if (entries.length > 0) {\n const [col, dir] = entries[0]!;\n sort = resolveOrderByColumn(col);\n order = (dir as unknown as string | undefined) ?? \"asc\";\n }\n }\n\n const params: ViewQueryParams = {\n sort,\n order,\n limit: options.limit,\n offset: options.offset,\n fields: options.fields?.join(\",\"),\n filters,\n };\n\n return self.queryTable(viewName, tableName, params) as Promise<TRow[]>;\n },\n\n async count<TRow>(where?: WhereInput<TRow>): Promise<number> {\n const filters = where\n ? serializeWhere(where as Record<string, unknown>)\n : undefined;\n\n const result = await self.queryTableCount(viewName, tableName, { filters });\n return result.count;\n },\n };\n }\n}\n",
10
+ "import type { QueueStats } from \"@secondlayer/shared/types\";\nimport { BaseClient } from \"./base.ts\";\nimport type { SecondLayerOptions } from \"./base.ts\";\nimport { Streams } from \"./streams/client.ts\";\nimport { Views } from \"./views/client.ts\";\n\nexport class SecondLayer extends BaseClient {\n readonly streams: Streams;\n readonly views: Views;\n\n constructor(options: Partial<SecondLayerOptions> = {}) {\n super(options);\n this.streams = new Streams(options);\n this.views = new Views(options);\n }\n\n async getQueueStats(): Promise<QueueStats> {\n const status = await this.request<{ queue: QueueStats }>(\"GET\", \"/status\");\n return status.queue;\n }\n}\n",
11
+ "import type { InferViewClient } from \"@secondlayer/views\";\nimport type { SecondLayerOptions } from \"../base.ts\";\nimport { SecondLayer } from \"../client.ts\";\nimport { Views } from \"./client.ts\";\n\n/**\n * Returns a typed client for a view defined with `defineView()`.\n *\n * Accepts a plain options object, a `SecondLayer` instance, or a `Views` instance.\n *\n * @example\n * ```ts\n * import myView from './views/my-view'\n * import { getView } from '@secondlayer/sdk'\n *\n * const client = getView(myView, { apiKey: 'sl_...' })\n * const rows = await client.transfers.findMany({ where: { sender: 'SP...' } })\n * ```\n */\nexport function getView<T extends { name: string; schema: Record<string, unknown> }>(\n def: T,\n options: Partial<SecondLayerOptions> | SecondLayer | Views = {},\n): InferViewClient<T> {\n if (options instanceof Views) {\n return options.typed(def);\n }\n if (options instanceof SecondLayer) {\n return options.views.typed(def);\n }\n return new Views(options).typed(def);\n}\n"
10
12
  ],
11
- "mappings": ";AAeO,MAAM,iBAAiB,MAAM;AAAA,EAGzB;AAAA,EAFT,WAAW,CAEF,QACP,SACA;AAAA,IACA,MAAM,OAAO;AAAA,IAHN;AAAA,IAIP,KAAK,OAAO;AAAA;AAEhB;;;ACfA,IAAM,mBAAmB;AAAA;AAElB,MAAe,WAAW;AAAA,EACrB;AAAA,EACA;AAAA,EAEV,WAAW,CAAC,UAAuC,CAAC,GAAG;AAAA,IACrD,KAAK,WAAW,QAAQ,WAAW,kBAAkB,QAAQ,QAAQ,EAAE;AAAA,IACvE,KAAK,SAAS,QAAQ;AAAA;AAAA,SAGjB,WAAW,CAAC,QAAyC;AAAA,IAC1D,MAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAAA,IAC7E,IAAI,QAAQ;AAAA,MACV,QAAQ,mBAAmB,UAAU;AAAA,IACvC;AAAA,IACA,OAAO;AAAA;AAAA,OAGO,QAAU,CAAC,QAAgB,MAAc,MAA4B;AAAA,IACnF,MAAM,MAAM,GAAG,KAAK,UAAU;AAAA,IAC9B,MAAM,UAAU,WAAW,YAAY,KAAK,MAAM;AAAA,IAElD,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,WAAW,MAAM,MAAM,KAAK;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,MACtC,CAAC;AAAA,MACD,MAAM;AAAA,MACN,MAAM,IAAI,SAAS,GAAG,uBAAuB,KAAK,8CAA8C;AAAA;AAAA,IAGlG,IAAI,CAAC,SAAS,IAAI;AAAA,MAChB,IAAI,SAAS,WAAW,KAAK;AAAA,QAC3B,MAAM,IAAI,SAAS,KAAK,6BAA6B;AAAA,MACvD;AAAA,MAEA,IAAI,SAAS,WAAW,KAAK;AAAA,QAC3B,MAAM,aAAa,SAAS,QAAQ,IAAI,aAAa;AAAA,QACrD,MAAM,MAAM,aACR,sBAAsB,wBACtB;AAAA,QACJ,MAAM,IAAI,SAAS,KAAK,GAAG;AAAA,MAC7B;AAAA,MAEA,IAAI,SAAS,UAAU,KAAK;AAAA,QAC1B,MAAM,IAAI,SAAS,SAAS,QAAQ,8CAA8C,KAAK,gBAAgB;AAAA,MACzG;AAAA,MAEA,MAAM,YAAY,MAAM,SAAS,KAAK;AAAA,MACtC,IAAI,UAAU,QAAQ,SAAS;AAAA,MAC/B,IAAI;AAAA,QACF,MAAM,OAAO,KAAK,MAAM,SAAS;AAAA,QACjC,UAAU,KAAK,SAAS,KAAK,WAAW;AAAA,QACxC,MAAM;AAAA,QACN,IAAI;AAAA,UAAW,UAAU;AAAA;AAAA,MAE3B,MAAM,IAAI,SAAS,SAAS,QAAQ,OAAO;AAAA,IAC7C;AAAA,IAEA,IAAI,SAAS,WAAW,KAAK;AAAA,MAC3B;AAAA,IACF;AAAA,IAEA,OAAO,SAAS,KAAK;AAAA;AAEzB;;;ACjEO,MAAM,gBAAgB,WAAW;AAAA,OACxB,oBAAsB,CAClC,QACA,cACA,IACA,MACY;AAAA,IACZ,MAAM,SAAS,MAAM,KAAK,gBAAgB,EAAE;AAAA,IAC5C,OAAO,KAAK,QAAW,QAAQ,aAAa,MAAM,GAAG,IAAI;AAAA;AAAA,OAGrD,gBAAe,CAAC,WAAoC;AAAA,IACxD,IAAI,UAAU,WAAW,MAAM,UAAU,SAAS,GAAG,GAAG;AAAA,MACtD,OAAO;AAAA,IACT;AAAA,IAEA,QAAQ,YAAY,MAAM,KAAK,KAAK;AAAA,IACpC,MAAM,eAAe;AAAA,IACrB,MAAM,UAAU,aAAa,OAAO,CAAC,MAAM,EAAE,GAAG,WAAW,SAAS,CAAC;AAAA,IAErE,IAAI,QAAQ,WAAW,GAAG;AAAA,MACxB,MAAM,IAAI,SAAS,KAAK,6BAA6B,YAAY;AAAA,IACnE;AAAA,IACA,IAAI,QAAQ,SAAS,GAAG;AAAA,MACtB,MAAM,IAAI,SAAS,KAAK,2BAA2B,eAAe,QAAQ,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG;AAAA,IACrH;AAAA,IAEA,OAAO,QAAQ,GAAI;AAAA;AAAA,OAGf,OAAM,CAAC,MAAmD;AAAA,IAC9D,OAAO,KAAK,QAA8B,QAAQ,gBAAgB,IAAI;AAAA;AAAA,OAGlE,OAAM,CAAC,IAAY,MAA6C;AAAA,IACpE,OAAO,KAAK,oBAAoB,SAAS,CAAC,QAAO,gBAAgB,OAAM,IAAI,IAAI;AAAA;AAAA,OAG3E,aAAY,CAAC,MAAc,MAA6C;AAAA,IAC5E,QAAQ,YAAY,MAAM,KAAK,KAAK;AAAA,IACpC,MAAM,eAAe;AAAA,IACrB,MAAM,WAAW,aAAa,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,IACzD,IAAI,CAAC,UAAU;AAAA,MACb,MAAM,IAAI,SAAS,KAAK,qBAAqB,iBAAiB;AAAA,IAChE;AAAA,IACA,OAAO,KAAK,OAAO,SAAS,IAAI,IAAI;AAAA;AAAA,OAGhC,KAAI,CAAC,QAA4D;AAAA,IACrE,MAAM,eAAe,IAAI;AAAA,IACzB,IAAI,QAAQ;AAAA,MAAQ,aAAa,IAAI,UAAU,OAAO,MAAM;AAAA,IAC5D,MAAM,QAAQ,aAAa,SAAS;AAAA,IACpC,MAAM,OAAO,QAAQ,gBAAgB,UAAU;AAAA,IAC/C,OAAO,KAAK,QAA6B,OAAO,IAAI;AAAA;AAAA,OAGhD,IAAG,CAAC,IAAqC;AAAA,IAC7C,OAAO,KAAK,oBAAoB,OAAO,CAAC,QAAO,gBAAgB,OAAM,EAAE;AAAA;AAAA,OAGnE,OAAM,CAAC,IAA2B;AAAA,IACtC,OAAO,KAAK,oBAAoB,UAAU,CAAC,QAAO,gBAAgB,OAAM,EAAE;AAAA;AAAA,OAGtE,OAAM,CAAC,IAAqC;AAAA,IAChD,OAAO,KAAK,oBAAoB,QAAQ,CAAC,QAAO,gBAAgB,cAAa,EAAE;AAAA;AAAA,OAG3E,QAAO,CAAC,IAAqC;AAAA,IACjD,OAAO,KAAK,oBAAoB,QAAQ,CAAC,QAAO,gBAAgB,eAAc,EAAE;AAAA;AAAA,OAG5E,aAAY,CAAC,IAAyC;AAAA,IAC1D,OAAO,KAAK,oBAAoB,QAAQ,CAAC,QAAO,gBAAgB,qBAAoB,EAAE;AAAA;AAAA,OAGlF,SAAQ,GAA+B;AAAA,IAC3C,OAAO,KAAK,QAA2B,QAAQ,oBAAoB;AAAA;AAAA,OAG/D,UAAS,GAAgC;AAAA,IAC7C,OAAO,KAAK,QAA4B,QAAQ,qBAAqB;AAAA;AAEzE;;ACtFA,SAAS,oBAAoB,CAAC,QAAiC;AAAA,EAC7D,MAAM,KAAK,IAAI;AAAA,EACf,IAAI,OAAO;AAAA,IAAM,GAAG,IAAI,SAAS,OAAO,IAAI;AAAA,EAC5C,IAAI,OAAO;AAAA,IAAO,GAAG,IAAI,UAAU,OAAO,KAAK;AAAA,EAC/C,IAAI,OAAO,UAAU;AAAA,IAAW,GAAG,IAAI,UAAU,OAAO,OAAO,KAAK,CAAC;AAAA,EACrE,IAAI,OAAO,WAAW;AAAA,IAAW,GAAG,IAAI,WAAW,OAAO,OAAO,MAAM,CAAC;AAAA,EACxE,IAAI,OAAO;AAAA,IAAQ,GAAG,IAAI,WAAW,OAAO,MAAM;AAAA,EAClD,IAAI,OAAO,SAAS;AAAA,IAClB,YAAY,KAAK,UAAU,OAAO,QAAQ,OAAO,OAAO,GAAG;AAAA,MACzD,GAAG,IAAI,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,EACA,MAAM,MAAM,GAAG,SAAS;AAAA,EACxB,OAAO,MAAM,IAAI,QAAQ;AAAA;AAAA;AAGpB,MAAM,cAAc,WAAW;AAAA,OAC9B,KAAI,GAAqC;AAAA,IAC7C,OAAO,KAAK,QAAiC,OAAO,YAAY;AAAA;AAAA,OAG5D,IAAG,CAAC,MAAmC;AAAA,IAC3C,OAAO,KAAK,QAAoB,OAAO,cAAc,MAAM;AAAA;AAAA,OAGvD,QAAO,CAAC,MAAc,SAA8E;AAAA,IACxG,OAAO,KAAK,QAAyB,QAAQ,cAAc,gBAAgB,OAAO;AAAA;AAAA,OAG9E,OAAM,CAAC,MAA4C;AAAA,IACvD,OAAO,KAAK,QAA6B,UAAU,cAAc,MAAM;AAAA;AAAA,OAGnE,OAAM,CAAC,MAAsD;AAAA,IACjE,OAAO,KAAK,QAA4B,QAAQ,cAAc,IAAI;AAAA;AAAA,OAG9D,WAAU,CAAC,MAAc,OAAe,SAA0B,CAAC,GAAuB;AAAA,IAC9F,OAAO,KAAK,QAAmB,OAAO,cAAc,QAAQ,QAAQ,qBAAqB,MAAM,GAAG;AAAA;AAAA,OAG9F,gBAAe,CAAC,MAAc,OAAe,SAA0B,CAAC,GAA+B;AAAA,IAC3G,OAAO,KAAK,QAA2B,OAAO,cAAc,QAAQ,cAAc,qBAAqB,MAAM,GAAG;AAAA;AAEpH;;AC/CO,MAAM,oBAAoB,WAAW;AAAA,EACjC;AAAA,EACA;AAAA,EAET,WAAW,CAAC,UAAuC,CAAC,GAAG;AAAA,IACrD,MAAM,OAAO;AAAA,IACb,KAAK,UAAU,IAAI,QAAQ,OAAO;AAAA,IAClC,KAAK,QAAQ,IAAI,MAAM,OAAO;AAAA;AAAA,OAG1B,cAAa,GAAwB;AAAA,IACzC,MAAM,SAAS,MAAM,KAAK,QAA+B,OAAO,SAAS;AAAA,IACzE,OAAO,OAAO;AAAA;AAElB;",
12
- "debugId": "3185A873B53583DC64756E2164756E21",
13
+ "mappings": "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",
14
+ "debugId": "01E631C6D382526564756E2164756E21",
13
15
  "names": []
14
16
  }
@@ -12,6 +12,22 @@ declare abstract class BaseClient {
12
12
  static authHeaders(apiKey?: string): Record<string, string>;
13
13
  protected request<T>(method: string, path: string, body?: unknown): Promise<T>;
14
14
  }
15
+ interface DeliverySummary {
16
+ id: string;
17
+ blockHeight: number;
18
+ status: string;
19
+ statusCode: number | null;
20
+ responseTimeMs: number | null;
21
+ attempts: number;
22
+ error: string | null;
23
+ createdAt: string;
24
+ }
25
+ interface DeliveryDetail extends DeliverySummary {
26
+ payload: unknown;
27
+ }
28
+ interface DeliveriesResponse {
29
+ deliveries: DeliverySummary[];
30
+ }
15
31
  declare class Streams extends BaseClient {
16
32
  private requestWithStreamId;
17
33
  resolveStreamId(partialId: string): Promise<string>;
@@ -28,6 +44,13 @@ declare class Streams extends BaseClient {
28
44
  rotateSecret(id: string): Promise<{
29
45
  secret: string
30
46
  }>;
47
+ /** List recent deliveries for a stream. */
48
+ listDeliveries(id: string, params?: {
49
+ limit?: number
50
+ status?: string
51
+ }): Promise<DeliveriesResponse>;
52
+ /** Get a single delivery with full payload. */
53
+ getDelivery(streamId: string, deliveryId: string): Promise<DeliveryDetail>;
31
54
  pauseAll(): Promise<BulkPauseResponse>;
32
55
  resumeAll(): Promise<BulkResumeResponse>;
33
56
  }
@@ -127,6 +127,19 @@ class Streams extends BaseClient {
127
127
  async rotateSecret(id) {
128
128
  return this.requestWithStreamId("POST", (id2) => `/api/streams/${id2}/rotate-secret`, id);
129
129
  }
130
+ async listDeliveries(id, params) {
131
+ const qs = new URLSearchParams;
132
+ if (params?.limit)
133
+ qs.set("limit", String(params.limit));
134
+ if (params?.status)
135
+ qs.set("status", params.status);
136
+ const query = qs.toString();
137
+ return this.requestWithStreamId("GET", (id2) => `/api/streams/${id2}/deliveries${query ? `?${query}` : ""}`, id);
138
+ }
139
+ async getDelivery(streamId, deliveryId) {
140
+ const fullId = await this.resolveStreamId(streamId);
141
+ return this.request("GET", `/api/streams/${fullId}/deliveries/${deliveryId}`);
142
+ }
130
143
  async pauseAll() {
131
144
  return this.request("POST", "/api/streams/pause");
132
145
  }
@@ -138,5 +151,5 @@ export {
138
151
  Streams
139
152
  };
140
153
 
141
- //# debugId=EFD3CCF7032CC87A64756E2164756E21
154
+ //# debugId=A34DBE07173BAA4E64756E2164756E21
142
155
  //# sourceMappingURL=index.js.map
@@ -4,9 +4,9 @@
4
4
  "sourcesContent": [
5
5
  "/**\n * Error thrown by {@link SecondLayer} when an API request fails.\n * Includes the HTTP status code for programmatic error handling.\n *\n * @example\n * ```ts\n * try {\n * await client.streams.get(\"abc123\");\n * } catch (err) {\n * if (err instanceof ApiError && err.status === 404) {\n * console.log(\"Stream not found\");\n * }\n * }\n * ```\n */\nexport class ApiError extends Error {\n constructor(\n /** HTTP status code (0 for network errors). */\n public status: number,\n message: string\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n",
6
6
  "import { ApiError } from \"./errors.ts\";\n\nexport interface SecondLayerOptions {\n /** Base URL of the Secondlayer API (trailing slashes are stripped). */\n baseUrl: string;\n /** Bearer token for authenticated requests. */\n apiKey?: string;\n}\n\nconst DEFAULT_BASE_URL = \"https://api.secondlayer.tools\";\n\nexport abstract class BaseClient {\n protected baseUrl: string;\n protected apiKey?: string;\n\n constructor(options: Partial<SecondLayerOptions> = {}) {\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.apiKey = options.apiKey;\n }\n\n static authHeaders(apiKey?: string): Record<string, string> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n }\n return headers;\n }\n\n protected async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers = BaseClient.authHeaders(this.apiKey);\n\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n } catch {\n throw new ApiError(0, `Cannot reach API at ${this.baseUrl}. Check your connection or try again.`);\n }\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new ApiError(401, \"API key invalid or expired.\");\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"Retry-After\");\n const msg = retryAfter\n ? `Rate limited. Wait ${retryAfter} seconds.`\n : \"Rate limited. Try again later.\";\n throw new ApiError(429, msg);\n }\n\n if (response.status >= 500) {\n throw new ApiError(response.status, `Server error. Try again or check status at ${this.baseUrl}/health`);\n }\n\n const errorBody = await response.text();\n let message = `HTTP ${response.status}`;\n try {\n const json = JSON.parse(errorBody);\n message = json.error || json.message || message;\n } catch {\n if (errorBody) message = errorBody;\n }\n throw new ApiError(response.status, message);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n}\n",
7
- "import type {\n CreateStream,\n UpdateStream,\n StreamResponse,\n CreateStreamResponse,\n ListStreamsResponse,\n BulkPauseResponse,\n BulkResumeResponse,\n} from \"@secondlayer/shared/schemas\";\nimport { ApiError } from \"../errors.ts\";\nimport { BaseClient } from \"../base.ts\";\n\nexport class Streams extends BaseClient {\n private async requestWithStreamId<T>(\n method: string,\n pathTemplate: (id: string) => string,\n id: string,\n body?: unknown\n ): Promise<T> {\n const fullId = await this.resolveStreamId(id);\n return this.request<T>(method, pathTemplate(fullId), body);\n }\n\n async resolveStreamId(partialId: string): Promise<string> {\n if (partialId.length === 36 && partialId.includes(\"-\")) {\n return partialId;\n }\n\n const { streams } = await this.list();\n const typedStreams = streams as { id: string }[];\n const matches = typedStreams.filter((s) => s.id.startsWith(partialId));\n\n if (matches.length === 0) {\n throw new ApiError(404, `No stream found matching \"${partialId}\"`);\n }\n if (matches.length > 1) {\n throw new ApiError(400, `Multiple streams match \"${partialId}\": ${matches.map((s) => s.id.slice(0, 8)).join(\", \")}`);\n }\n\n return matches[0]!.id;\n }\n\n async create(data: CreateStream): Promise<CreateStreamResponse> {\n return this.request<CreateStreamResponse>(\"POST\", \"/api/streams\", data);\n }\n\n async update(id: string, data: UpdateStream): Promise<StreamResponse> {\n return this.requestWithStreamId(\"PATCH\", (id) => `/api/streams/${id}`, id, data);\n }\n\n async updateByName(name: string, data: CreateStream): Promise<StreamResponse> {\n const { streams } = await this.list();\n const typedStreams = streams as { id: string; name: string }[];\n const existing = typedStreams.find((s) => s.name === name);\n if (!existing) {\n throw new ApiError(404, `Stream with name \"${name}\" not found`);\n }\n return this.update(existing.id, data);\n }\n\n async list(params?: { status?: string }): Promise<ListStreamsResponse> {\n const searchParams = new URLSearchParams();\n if (params?.status) searchParams.set(\"status\", params.status);\n const query = searchParams.toString();\n const path = query ? `/api/streams?${query}` : \"/api/streams\";\n return this.request<ListStreamsResponse>(\"GET\", path);\n }\n\n async get(id: string): Promise<StreamResponse> {\n return this.requestWithStreamId(\"GET\", (id) => `/api/streams/${id}`, id);\n }\n\n async delete(id: string): Promise<void> {\n return this.requestWithStreamId(\"DELETE\", (id) => `/api/streams/${id}`, id);\n }\n\n async enable(id: string): Promise<StreamResponse> {\n return this.requestWithStreamId(\"POST\", (id) => `/api/streams/${id}/enable`, id);\n }\n\n async disable(id: string): Promise<StreamResponse> {\n return this.requestWithStreamId(\"POST\", (id) => `/api/streams/${id}/disable`, id);\n }\n\n async rotateSecret(id: string): Promise<{ secret: string }> {\n return this.requestWithStreamId(\"POST\", (id) => `/api/streams/${id}/rotate-secret`, id);\n }\n\n async pauseAll(): Promise<BulkPauseResponse> {\n return this.request<BulkPauseResponse>(\"POST\", \"/api/streams/pause\");\n }\n\n async resumeAll(): Promise<BulkResumeResponse> {\n return this.request<BulkResumeResponse>(\"POST\", \"/api/streams/resume\");\n }\n}\n"
7
+ "import type {\n CreateStream,\n UpdateStream,\n StreamResponse,\n CreateStreamResponse,\n ListStreamsResponse,\n BulkPauseResponse,\n BulkResumeResponse,\n} from \"@secondlayer/shared/schemas\";\nimport { ApiError } from \"../errors.ts\";\nimport { BaseClient } from \"../base.ts\";\n\nexport interface DeliverySummary {\n id: string;\n blockHeight: number;\n status: string;\n statusCode: number | null;\n responseTimeMs: number | null;\n attempts: number;\n error: string | null;\n createdAt: string;\n}\n\nexport interface DeliveryDetail extends DeliverySummary {\n payload: unknown;\n}\n\nexport interface DeliveriesResponse {\n deliveries: DeliverySummary[];\n}\n\nexport class Streams extends BaseClient {\n private async requestWithStreamId<T>(\n method: string,\n pathTemplate: (id: string) => string,\n id: string,\n body?: unknown\n ): Promise<T> {\n const fullId = await this.resolveStreamId(id);\n return this.request<T>(method, pathTemplate(fullId), body);\n }\n\n async resolveStreamId(partialId: string): Promise<string> {\n if (partialId.length === 36 && partialId.includes(\"-\")) {\n return partialId;\n }\n\n const { streams } = await this.list();\n const typedStreams = streams as { id: string }[];\n const matches = typedStreams.filter((s) => s.id.startsWith(partialId));\n\n if (matches.length === 0) {\n throw new ApiError(404, `No stream found matching \"${partialId}\"`);\n }\n if (matches.length > 1) {\n throw new ApiError(400, `Multiple streams match \"${partialId}\": ${matches.map((s) => s.id.slice(0, 8)).join(\", \")}`);\n }\n\n return matches[0]!.id;\n }\n\n async create(data: CreateStream): Promise<CreateStreamResponse> {\n return this.request<CreateStreamResponse>(\"POST\", \"/api/streams\", data);\n }\n\n async update(id: string, data: UpdateStream): Promise<StreamResponse> {\n return this.requestWithStreamId(\"PATCH\", (id) => `/api/streams/${id}`, id, data);\n }\n\n async updateByName(name: string, data: CreateStream): Promise<StreamResponse> {\n const { streams } = await this.list();\n const typedStreams = streams as { id: string; name: string }[];\n const existing = typedStreams.find((s) => s.name === name);\n if (!existing) {\n throw new ApiError(404, `Stream with name \"${name}\" not found`);\n }\n return this.update(existing.id, data);\n }\n\n async list(params?: { status?: string }): Promise<ListStreamsResponse> {\n const searchParams = new URLSearchParams();\n if (params?.status) searchParams.set(\"status\", params.status);\n const query = searchParams.toString();\n const path = query ? `/api/streams?${query}` : \"/api/streams\";\n return this.request<ListStreamsResponse>(\"GET\", path);\n }\n\n async get(id: string): Promise<StreamResponse> {\n return this.requestWithStreamId(\"GET\", (id) => `/api/streams/${id}`, id);\n }\n\n async delete(id: string): Promise<void> {\n return this.requestWithStreamId(\"DELETE\", (id) => `/api/streams/${id}`, id);\n }\n\n async enable(id: string): Promise<StreamResponse> {\n return this.requestWithStreamId(\"POST\", (id) => `/api/streams/${id}/enable`, id);\n }\n\n async disable(id: string): Promise<StreamResponse> {\n return this.requestWithStreamId(\"POST\", (id) => `/api/streams/${id}/disable`, id);\n }\n\n async rotateSecret(id: string): Promise<{ secret: string }> {\n return this.requestWithStreamId(\"POST\", (id) => `/api/streams/${id}/rotate-secret`, id);\n }\n\n // ── Deliveries ─────────────────────────────────────────────────────\n\n /** List recent deliveries for a stream. */\n async listDeliveries(id: string, params?: { limit?: number; status?: string }): Promise<DeliveriesResponse> {\n const qs = new URLSearchParams();\n if (params?.limit) qs.set(\"limit\", String(params.limit));\n if (params?.status) qs.set(\"status\", params.status);\n const query = qs.toString();\n return this.requestWithStreamId(\"GET\", (id) => `/api/streams/${id}/deliveries${query ? `?${query}` : \"\"}`, id);\n }\n\n /** Get a single delivery with full payload. */\n async getDelivery(streamId: string, deliveryId: string): Promise<DeliveryDetail> {\n const fullId = await this.resolveStreamId(streamId);\n return this.request<DeliveryDetail>(\"GET\", `/api/streams/${fullId}/deliveries/${deliveryId}`);\n }\n\n async pauseAll(): Promise<BulkPauseResponse> {\n return this.request<BulkPauseResponse>(\"POST\", \"/api/streams/pause\");\n }\n\n async resumeAll(): Promise<BulkResumeResponse> {\n return this.request<BulkResumeResponse>(\"POST\", \"/api/streams/resume\");\n }\n}\n"
8
8
  ],
9
- "mappings": "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",
10
- "debugId": "EFD3CCF7032CC87A64756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "A34DBE07173BAA4E64756E2164756E21",
11
11
  "names": []
12
12
  }
@@ -1,5 +1,6 @@
1
1
  import { ViewSummary, ViewDetail, ViewQueryParams, ReindexResponse } from "@secondlayer/shared/schemas";
2
2
  import { DeployViewRequest, DeployViewResponse } from "@secondlayer/shared/schemas/views";
3
+ import { InferViewClient } from "@secondlayer/views";
3
4
  interface SecondLayerOptions {
4
5
  /** Base URL of the Secondlayer API (trailing slashes are stripped). */
5
6
  baseUrl: string;
@@ -30,5 +31,91 @@ declare class Views extends BaseClient {
30
31
  queryTableCount(name: string, table: string, params?: ViewQueryParams): Promise<{
31
32
  count: number
32
33
  }>;
34
+ /**
35
+ * Returns a typed client for a view defined with `defineView()`.
36
+ * Row types are inferred from the view's schema literal types.
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * import myView from './views/my-token-view'
41
+ * const client = sl.views.typed(myView)
42
+ * const rows = await client.transfers.findMany({ where: { sender: 'SP...' } })
43
+ * // rows: InferTableRow<typeof myView.schema.transfers>[]
44
+ * ```
45
+ */
46
+ typed<T extends {
47
+ name: string
48
+ schema: Record<string, unknown>
49
+ }>(def: T): InferViewClient<T>;
50
+ private createTableClient;
33
51
  }
34
- export { Views, SecondLayerOptions };
52
+ import { InferViewClient as InferViewClient2 } from "@secondlayer/views";
53
+ import { QueueStats } from "@secondlayer/shared/types";
54
+ import { CreateStream, UpdateStream, StreamResponse, CreateStreamResponse, ListStreamsResponse, BulkPauseResponse, BulkResumeResponse } from "@secondlayer/shared/schemas";
55
+ interface DeliverySummary {
56
+ id: string;
57
+ blockHeight: number;
58
+ status: string;
59
+ statusCode: number | null;
60
+ responseTimeMs: number | null;
61
+ attempts: number;
62
+ error: string | null;
63
+ createdAt: string;
64
+ }
65
+ interface DeliveryDetail extends DeliverySummary {
66
+ payload: unknown;
67
+ }
68
+ interface DeliveriesResponse {
69
+ deliveries: DeliverySummary[];
70
+ }
71
+ declare class Streams extends BaseClient {
72
+ private requestWithStreamId;
73
+ resolveStreamId(partialId: string): Promise<string>;
74
+ create(data: CreateStream): Promise<CreateStreamResponse>;
75
+ update(id: string, data: UpdateStream): Promise<StreamResponse>;
76
+ updateByName(name: string, data: CreateStream): Promise<StreamResponse>;
77
+ list(params?: {
78
+ status?: string
79
+ }): Promise<ListStreamsResponse>;
80
+ get(id: string): Promise<StreamResponse>;
81
+ delete(id: string): Promise<void>;
82
+ enable(id: string): Promise<StreamResponse>;
83
+ disable(id: string): Promise<StreamResponse>;
84
+ rotateSecret(id: string): Promise<{
85
+ secret: string
86
+ }>;
87
+ /** List recent deliveries for a stream. */
88
+ listDeliveries(id: string, params?: {
89
+ limit?: number
90
+ status?: string
91
+ }): Promise<DeliveriesResponse>;
92
+ /** Get a single delivery with full payload. */
93
+ getDelivery(streamId: string, deliveryId: string): Promise<DeliveryDetail>;
94
+ pauseAll(): Promise<BulkPauseResponse>;
95
+ resumeAll(): Promise<BulkResumeResponse>;
96
+ }
97
+ declare class SecondLayer extends BaseClient {
98
+ readonly streams: Streams;
99
+ readonly views: Views;
100
+ constructor(options?: Partial<SecondLayerOptions>);
101
+ getQueueStats(): Promise<QueueStats>;
102
+ }
103
+ /**
104
+ * Returns a typed client for a view defined with `defineView()`.
105
+ *
106
+ * Accepts a plain options object, a `SecondLayer` instance, or a `Views` instance.
107
+ *
108
+ * @example
109
+ * ```ts
110
+ * import myView from './views/my-view'
111
+ * import { getView } from '@secondlayer/sdk'
112
+ *
113
+ * const client = getView(myView, { apiKey: 'sl_...' })
114
+ * const rows = await client.transfers.findMany({ where: { sender: 'SP...' } })
115
+ * ```
116
+ */
117
+ declare function getView<T extends {
118
+ name: string
119
+ schema: Record<string, unknown>
120
+ }>(def: T, options?: Partial<SecondLayerOptions> | SecondLayer | Views): InferViewClient2<T>;
121
+ export { getView, Views, SecondLayerOptions };
@@ -68,6 +68,47 @@ class BaseClient {
68
68
  }
69
69
  }
70
70
 
71
+ // src/views/serialize.ts
72
+ var SYSTEM_COLUMN_MAP = {
73
+ _blockHeight: "_block_height",
74
+ _txId: "_tx_id",
75
+ _createdAt: "_created_at",
76
+ _id: "_id",
77
+ blockHeight: "_block_height",
78
+ txId: "_tx_id",
79
+ createdAt: "_created_at",
80
+ id: "_id"
81
+ };
82
+ function resolveColumn(col) {
83
+ return SYSTEM_COLUMN_MAP[col] ?? col;
84
+ }
85
+ function serializeWhere(where) {
86
+ const filters = {};
87
+ for (const [column, value] of Object.entries(where)) {
88
+ if (value === null || value === undefined)
89
+ continue;
90
+ const col = resolveColumn(column);
91
+ if (typeof value === "object" && !Array.isArray(value)) {
92
+ const ops = value;
93
+ for (const [op, opValue] of Object.entries(ops)) {
94
+ if (opValue === null || opValue === undefined)
95
+ continue;
96
+ if (op === "eq") {
97
+ filters[col] = String(opValue);
98
+ } else if (["neq", "gt", "gte", "lt", "lte"].includes(op)) {
99
+ filters[`${col}.${op}`] = String(opValue);
100
+ }
101
+ }
102
+ } else {
103
+ filters[col] = String(value);
104
+ }
105
+ }
106
+ return filters;
107
+ }
108
+ function resolveOrderByColumn(col) {
109
+ return resolveColumn(col);
110
+ }
111
+
71
112
  // src/views/client.ts
72
113
  function buildViewQueryString(params) {
73
114
  const qs = new URLSearchParams;
@@ -83,7 +124,7 @@ function buildViewQueryString(params) {
83
124
  qs.set("_fields", params.fields);
84
125
  if (params.filters) {
85
126
  for (const [key, value] of Object.entries(params.filters)) {
86
- qs.set(key, value);
127
+ qs.set(key, String(value));
87
128
  }
88
129
  }
89
130
  const str = qs.toString();
@@ -112,10 +153,155 @@ class Views extends BaseClient {
112
153
  async queryTableCount(name, table, params = {}) {
113
154
  return this.request("GET", `/api/views/${name}/${table}/count${buildViewQueryString(params)}`);
114
155
  }
156
+ typed(def) {
157
+ const result = {};
158
+ for (const tableName of Object.keys(def.schema)) {
159
+ result[tableName] = this.createTableClient(def.name, tableName);
160
+ }
161
+ return result;
162
+ }
163
+ createTableClient(viewName, tableName) {
164
+ const self = this;
165
+ return {
166
+ async findMany(options = {}) {
167
+ const filters = options.where ? serializeWhere(options.where) : undefined;
168
+ let sort;
169
+ let order;
170
+ if (options.orderBy) {
171
+ const entries = Object.entries(options.orderBy);
172
+ if (entries.length > 0) {
173
+ const [col, dir] = entries[0];
174
+ sort = resolveOrderByColumn(col);
175
+ order = dir ?? "asc";
176
+ }
177
+ }
178
+ const params = {
179
+ sort,
180
+ order,
181
+ limit: options.limit,
182
+ offset: options.offset,
183
+ fields: options.fields?.join(","),
184
+ filters
185
+ };
186
+ return self.queryTable(viewName, tableName, params);
187
+ },
188
+ async count(where) {
189
+ const filters = where ? serializeWhere(where) : undefined;
190
+ const result = await self.queryTableCount(viewName, tableName, { filters });
191
+ return result.count;
192
+ }
193
+ };
194
+ }
195
+ }
196
+ // src/streams/client.ts
197
+ class Streams extends BaseClient {
198
+ async requestWithStreamId(method, pathTemplate, id, body) {
199
+ const fullId = await this.resolveStreamId(id);
200
+ return this.request(method, pathTemplate(fullId), body);
201
+ }
202
+ async resolveStreamId(partialId) {
203
+ if (partialId.length === 36 && partialId.includes("-")) {
204
+ return partialId;
205
+ }
206
+ const { streams } = await this.list();
207
+ const typedStreams = streams;
208
+ const matches = typedStreams.filter((s) => s.id.startsWith(partialId));
209
+ if (matches.length === 0) {
210
+ throw new ApiError(404, `No stream found matching "${partialId}"`);
211
+ }
212
+ if (matches.length > 1) {
213
+ throw new ApiError(400, `Multiple streams match "${partialId}": ${matches.map((s) => s.id.slice(0, 8)).join(", ")}`);
214
+ }
215
+ return matches[0].id;
216
+ }
217
+ async create(data) {
218
+ return this.request("POST", "/api/streams", data);
219
+ }
220
+ async update(id, data) {
221
+ return this.requestWithStreamId("PATCH", (id2) => `/api/streams/${id2}`, id, data);
222
+ }
223
+ async updateByName(name, data) {
224
+ const { streams } = await this.list();
225
+ const typedStreams = streams;
226
+ const existing = typedStreams.find((s) => s.name === name);
227
+ if (!existing) {
228
+ throw new ApiError(404, `Stream with name "${name}" not found`);
229
+ }
230
+ return this.update(existing.id, data);
231
+ }
232
+ async list(params) {
233
+ const searchParams = new URLSearchParams;
234
+ if (params?.status)
235
+ searchParams.set("status", params.status);
236
+ const query = searchParams.toString();
237
+ const path = query ? `/api/streams?${query}` : "/api/streams";
238
+ return this.request("GET", path);
239
+ }
240
+ async get(id) {
241
+ return this.requestWithStreamId("GET", (id2) => `/api/streams/${id2}`, id);
242
+ }
243
+ async delete(id) {
244
+ return this.requestWithStreamId("DELETE", (id2) => `/api/streams/${id2}`, id);
245
+ }
246
+ async enable(id) {
247
+ return this.requestWithStreamId("POST", (id2) => `/api/streams/${id2}/enable`, id);
248
+ }
249
+ async disable(id) {
250
+ return this.requestWithStreamId("POST", (id2) => `/api/streams/${id2}/disable`, id);
251
+ }
252
+ async rotateSecret(id) {
253
+ return this.requestWithStreamId("POST", (id2) => `/api/streams/${id2}/rotate-secret`, id);
254
+ }
255
+ async listDeliveries(id, params) {
256
+ const qs = new URLSearchParams;
257
+ if (params?.limit)
258
+ qs.set("limit", String(params.limit));
259
+ if (params?.status)
260
+ qs.set("status", params.status);
261
+ const query = qs.toString();
262
+ return this.requestWithStreamId("GET", (id2) => `/api/streams/${id2}/deliveries${query ? `?${query}` : ""}`, id);
263
+ }
264
+ async getDelivery(streamId, deliveryId) {
265
+ const fullId = await this.resolveStreamId(streamId);
266
+ return this.request("GET", `/api/streams/${fullId}/deliveries/${deliveryId}`);
267
+ }
268
+ async pauseAll() {
269
+ return this.request("POST", "/api/streams/pause");
270
+ }
271
+ async resumeAll() {
272
+ return this.request("POST", "/api/streams/resume");
273
+ }
274
+ }
275
+
276
+ // src/client.ts
277
+ class SecondLayer extends BaseClient {
278
+ streams;
279
+ views;
280
+ constructor(options = {}) {
281
+ super(options);
282
+ this.streams = new Streams(options);
283
+ this.views = new Views(options);
284
+ }
285
+ async getQueueStats() {
286
+ const status = await this.request("GET", "/status");
287
+ return status.queue;
288
+ }
289
+ }
290
+
291
+ // src/views/get-view.ts
292
+ function getView(def, options = {}) {
293
+ if (options instanceof Views) {
294
+ return options.typed(def);
295
+ }
296
+ if (options instanceof SecondLayer) {
297
+ return options.views.typed(def);
298
+ }
299
+ return new Views(options).typed(def);
115
300
  }
116
301
  export {
302
+ getView,
117
303
  Views
118
304
  };
119
305
 
120
- //# debugId=5FCD78685AE9CEC764756E2164756E21
306
+ //# debugId=77950829DF762B1564756E2164756E21
121
307
  //# sourceMappingURL=index.js.map
@@ -1,12 +1,16 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/errors.ts", "../src/base.ts", "../src/views/client.ts"],
3
+ "sources": ["../src/errors.ts", "../src/base.ts", "../src/views/serialize.ts", "../src/views/client.ts", "../src/streams/client.ts", "../src/client.ts", "../src/views/get-view.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * Error thrown by {@link SecondLayer} when an API request fails.\n * Includes the HTTP status code for programmatic error handling.\n *\n * @example\n * ```ts\n * try {\n * await client.streams.get(\"abc123\");\n * } catch (err) {\n * if (err instanceof ApiError && err.status === 404) {\n * console.log(\"Stream not found\");\n * }\n * }\n * ```\n */\nexport class ApiError extends Error {\n constructor(\n /** HTTP status code (0 for network errors). */\n public status: number,\n message: string\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n}\n",
6
6
  "import { ApiError } from \"./errors.ts\";\n\nexport interface SecondLayerOptions {\n /** Base URL of the Secondlayer API (trailing slashes are stripped). */\n baseUrl: string;\n /** Bearer token for authenticated requests. */\n apiKey?: string;\n}\n\nconst DEFAULT_BASE_URL = \"https://api.secondlayer.tools\";\n\nexport abstract class BaseClient {\n protected baseUrl: string;\n protected apiKey?: string;\n\n constructor(options: Partial<SecondLayerOptions> = {}) {\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.apiKey = options.apiKey;\n }\n\n static authHeaders(apiKey?: string): Record<string, string> {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n }\n return headers;\n }\n\n protected async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers = BaseClient.authHeaders(this.apiKey);\n\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n } catch {\n throw new ApiError(0, `Cannot reach API at ${this.baseUrl}. Check your connection or try again.`);\n }\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new ApiError(401, \"API key invalid or expired.\");\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"Retry-After\");\n const msg = retryAfter\n ? `Rate limited. Wait ${retryAfter} seconds.`\n : \"Rate limited. Try again later.\";\n throw new ApiError(429, msg);\n }\n\n if (response.status >= 500) {\n throw new ApiError(response.status, `Server error. Try again or check status at ${this.baseUrl}/health`);\n }\n\n const errorBody = await response.text();\n let message = `HTTP ${response.status}`;\n try {\n const json = JSON.parse(errorBody);\n message = json.error || json.message || message;\n } catch {\n if (errorBody) message = errorBody;\n }\n throw new ApiError(response.status, message);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n return response.json() as Promise<T>;\n }\n}\n",
7
- "import type {\n ViewSummary,\n ViewDetail,\n ViewQueryParams,\n ReindexResponse,\n} from \"@secondlayer/shared/schemas\";\nimport type { DeployViewRequest, DeployViewResponse } from \"@secondlayer/shared/schemas/views\";\nimport { BaseClient } from \"../base.ts\";\n\nfunction buildViewQueryString(params: ViewQueryParams): string {\n const qs = new URLSearchParams();\n if (params.sort) qs.set(\"_sort\", params.sort);\n if (params.order) qs.set(\"_order\", params.order);\n if (params.limit !== undefined) qs.set(\"_limit\", String(params.limit));\n if (params.offset !== undefined) qs.set(\"_offset\", String(params.offset));\n if (params.fields) qs.set(\"_fields\", params.fields);\n if (params.filters) {\n for (const [key, value] of Object.entries(params.filters)) {\n qs.set(key, value);\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\nexport class Views extends BaseClient {\n async list(): Promise<{ data: ViewSummary[] }> {\n return this.request<{ data: ViewSummary[] }>(\"GET\", \"/api/views\");\n }\n\n async get(name: string): Promise<ViewDetail> {\n return this.request<ViewDetail>(\"GET\", `/api/views/${name}`);\n }\n\n async reindex(name: string, options?: { fromBlock?: number; toBlock?: number }): Promise<ReindexResponse> {\n return this.request<ReindexResponse>(\"POST\", `/api/views/${name}/reindex`, options);\n }\n\n async delete(name: string): Promise<{ message: string }> {\n return this.request<{ message: string }>(\"DELETE\", `/api/views/${name}`);\n }\n\n async deploy(data: DeployViewRequest): Promise<DeployViewResponse> {\n return this.request<DeployViewResponse>(\"POST\", \"/api/views\", data);\n }\n\n async queryTable(name: string, table: string, params: ViewQueryParams = {}): Promise<unknown[]> {\n return this.request<unknown[]>(\"GET\", `/api/views/${name}/${table}${buildViewQueryString(params)}`);\n }\n\n async queryTableCount(name: string, table: string, params: ViewQueryParams = {}): Promise<{ count: number }> {\n return this.request<{ count: number }>(\"GET\", `/api/views/${name}/${table}/count${buildViewQueryString(params)}`);\n }\n}\n"
7
+ "/**\n * Maps camelCase system column names (with or without `_` prefix) to the\n * actual snake_case DB column names used in query params.\n */\nconst SYSTEM_COLUMN_MAP: Record<string, string> = {\n // underscore-prefixed camelCase (canonical row shape)\n _blockHeight: \"_block_height\",\n _txId: \"_tx_id\",\n _createdAt: \"_created_at\",\n _id: \"_id\",\n // no-prefix aliases\n blockHeight: \"_block_height\",\n txId: \"_tx_id\",\n createdAt: \"_created_at\",\n id: \"_id\",\n};\n\nfunction resolveColumn(col: string): string {\n return SYSTEM_COLUMN_MAP[col] ?? col;\n}\n\n/**\n * Serializes a WhereInput object into the flat filter map expected by\n * ViewQueryParams.filters (and the REST API query string).\n *\n * Scalar values → `{ column: \"value\" }`\n * Comparison objects `{ \"column.gte\": \"100\", \"column.lt\": \"200\" }`\n * System column aliases → `blockHeight` / `_blockHeight` both → `_block_height`\n */\nexport function serializeWhere(\n where: Record<string, unknown>,\n): Record<string, string> {\n const filters: Record<string, string> = {};\n\n for (const [column, value] of Object.entries(where)) {\n if (value === null || value === undefined) continue;\n\n const col = resolveColumn(column);\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const ops = value as Record<string, unknown>;\n for (const [op, opValue] of Object.entries(ops)) {\n if (opValue === null || opValue === undefined) continue;\n if (op === \"eq\") {\n filters[col] = String(opValue);\n } else if ([\"neq\", \"gt\", \"gte\", \"lt\", \"lte\"].includes(op)) {\n filters[`${col}.${op}`] = String(opValue);\n }\n }\n } else {\n filters[col] = String(value);\n }\n }\n\n return filters;\n}\n\n/**\n * Resolves an orderBy column name (either alias or canonical) to the DB column name.\n */\nexport function resolveOrderByColumn(col: string): string {\n return resolveColumn(col);\n}\n",
8
+ "import type {\n ViewSummary,\n ViewDetail,\n ViewQueryParams,\n ReindexResponse,\n} from \"@secondlayer/shared/schemas\";\nimport type { DeployViewRequest, DeployViewResponse } from \"@secondlayer/shared/schemas/views\";\nimport type {\n InferViewClient,\n FindManyOptions,\n WhereInput,\n} from \"@secondlayer/views\";\nimport { BaseClient } from \"../base.ts\";\nimport { serializeWhere, resolveOrderByColumn } from \"./serialize.ts\";\n\nfunction buildViewQueryString(params: ViewQueryParams): string {\n const qs = new URLSearchParams();\n if (params.sort) qs.set(\"_sort\", params.sort);\n if (params.order) qs.set(\"_order\", params.order);\n if (params.limit !== undefined) qs.set(\"_limit\", String(params.limit));\n if (params.offset !== undefined) qs.set(\"_offset\", String(params.offset));\n if (params.fields) qs.set(\"_fields\", params.fields);\n if (params.filters) {\n for (const [key, value] of Object.entries(params.filters)) {\n qs.set(key, String(value));\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\nexport class Views extends BaseClient {\n async list(): Promise<{ data: ViewSummary[] }> {\n return this.request<{ data: ViewSummary[] }>(\"GET\", \"/api/views\");\n }\n\n async get(name: string): Promise<ViewDetail> {\n return this.request<ViewDetail>(\"GET\", `/api/views/${name}`);\n }\n\n async reindex(name: string, options?: { fromBlock?: number; toBlock?: number }): Promise<ReindexResponse> {\n return this.request<ReindexResponse>(\"POST\", `/api/views/${name}/reindex`, options);\n }\n\n async delete(name: string): Promise<{ message: string }> {\n return this.request<{ message: string }>(\"DELETE\", `/api/views/${name}`);\n }\n\n async deploy(data: DeployViewRequest): Promise<DeployViewResponse> {\n return this.request<DeployViewResponse>(\"POST\", \"/api/views\", data);\n }\n\n async queryTable(name: string, table: string, params: ViewQueryParams = {}): Promise<unknown[]> {\n return this.request<unknown[]>(\"GET\", `/api/views/${name}/${table}${buildViewQueryString(params)}`);\n }\n\n async queryTableCount(name: string, table: string, params: ViewQueryParams = {}): Promise<{ count: number }> {\n return this.request<{ count: number }>(\"GET\", `/api/views/${name}/${table}/count${buildViewQueryString(params)}`);\n }\n\n /**\n * Returns a typed client for a view defined with `defineView()`.\n * Row types are inferred from the view's schema literal types.\n *\n * @example\n * ```ts\n * import myView from './views/my-token-view'\n * const client = sl.views.typed(myView)\n * const rows = await client.transfers.findMany({ where: { sender: 'SP...' } })\n * // rows: InferTableRow<typeof myView.schema.transfers>[]\n * ```\n */\n typed<T extends { name: string; schema: Record<string, unknown> }>(\n def: T,\n ): InferViewClient<T> {\n const result: Record<string, unknown> = {};\n\n for (const tableName of Object.keys(def.schema)) {\n result[tableName] = this.createTableClient(def.name, tableName);\n }\n\n return result as InferViewClient<T>;\n }\n\n private createTableClient(viewName: string, tableName: string) {\n const self = this;\n\n return {\n async findMany<TRow>(options: FindManyOptions<TRow> = {}): Promise<TRow[]> {\n const filters = options.where\n ? serializeWhere(options.where as Record<string, unknown>)\n : undefined;\n\n let sort: string | undefined;\n let order: string | undefined;\n if (options.orderBy) {\n const entries = Object.entries(options.orderBy);\n if (entries.length > 0) {\n const [col, dir] = entries[0]!;\n sort = resolveOrderByColumn(col);\n order = (dir as unknown as string | undefined) ?? \"asc\";\n }\n }\n\n const params: ViewQueryParams = {\n sort,\n order,\n limit: options.limit,\n offset: options.offset,\n fields: options.fields?.join(\",\"),\n filters,\n };\n\n return self.queryTable(viewName, tableName, params) as Promise<TRow[]>;\n },\n\n async count<TRow>(where?: WhereInput<TRow>): Promise<number> {\n const filters = where\n ? serializeWhere(where as Record<string, unknown>)\n : undefined;\n\n const result = await self.queryTableCount(viewName, tableName, { filters });\n return result.count;\n },\n };\n }\n}\n",
9
+ "import type {\n CreateStream,\n UpdateStream,\n StreamResponse,\n CreateStreamResponse,\n ListStreamsResponse,\n BulkPauseResponse,\n BulkResumeResponse,\n} from \"@secondlayer/shared/schemas\";\nimport { ApiError } from \"../errors.ts\";\nimport { BaseClient } from \"../base.ts\";\n\nexport interface DeliverySummary {\n id: string;\n blockHeight: number;\n status: string;\n statusCode: number | null;\n responseTimeMs: number | null;\n attempts: number;\n error: string | null;\n createdAt: string;\n}\n\nexport interface DeliveryDetail extends DeliverySummary {\n payload: unknown;\n}\n\nexport interface DeliveriesResponse {\n deliveries: DeliverySummary[];\n}\n\nexport class Streams extends BaseClient {\n private async requestWithStreamId<T>(\n method: string,\n pathTemplate: (id: string) => string,\n id: string,\n body?: unknown\n ): Promise<T> {\n const fullId = await this.resolveStreamId(id);\n return this.request<T>(method, pathTemplate(fullId), body);\n }\n\n async resolveStreamId(partialId: string): Promise<string> {\n if (partialId.length === 36 && partialId.includes(\"-\")) {\n return partialId;\n }\n\n const { streams } = await this.list();\n const typedStreams = streams as { id: string }[];\n const matches = typedStreams.filter((s) => s.id.startsWith(partialId));\n\n if (matches.length === 0) {\n throw new ApiError(404, `No stream found matching \"${partialId}\"`);\n }\n if (matches.length > 1) {\n throw new ApiError(400, `Multiple streams match \"${partialId}\": ${matches.map((s) => s.id.slice(0, 8)).join(\", \")}`);\n }\n\n return matches[0]!.id;\n }\n\n async create(data: CreateStream): Promise<CreateStreamResponse> {\n return this.request<CreateStreamResponse>(\"POST\", \"/api/streams\", data);\n }\n\n async update(id: string, data: UpdateStream): Promise<StreamResponse> {\n return this.requestWithStreamId(\"PATCH\", (id) => `/api/streams/${id}`, id, data);\n }\n\n async updateByName(name: string, data: CreateStream): Promise<StreamResponse> {\n const { streams } = await this.list();\n const typedStreams = streams as { id: string; name: string }[];\n const existing = typedStreams.find((s) => s.name === name);\n if (!existing) {\n throw new ApiError(404, `Stream with name \"${name}\" not found`);\n }\n return this.update(existing.id, data);\n }\n\n async list(params?: { status?: string }): Promise<ListStreamsResponse> {\n const searchParams = new URLSearchParams();\n if (params?.status) searchParams.set(\"status\", params.status);\n const query = searchParams.toString();\n const path = query ? `/api/streams?${query}` : \"/api/streams\";\n return this.request<ListStreamsResponse>(\"GET\", path);\n }\n\n async get(id: string): Promise<StreamResponse> {\n return this.requestWithStreamId(\"GET\", (id) => `/api/streams/${id}`, id);\n }\n\n async delete(id: string): Promise<void> {\n return this.requestWithStreamId(\"DELETE\", (id) => `/api/streams/${id}`, id);\n }\n\n async enable(id: string): Promise<StreamResponse> {\n return this.requestWithStreamId(\"POST\", (id) => `/api/streams/${id}/enable`, id);\n }\n\n async disable(id: string): Promise<StreamResponse> {\n return this.requestWithStreamId(\"POST\", (id) => `/api/streams/${id}/disable`, id);\n }\n\n async rotateSecret(id: string): Promise<{ secret: string }> {\n return this.requestWithStreamId(\"POST\", (id) => `/api/streams/${id}/rotate-secret`, id);\n }\n\n // ── Deliveries ─────────────────────────────────────────────────────\n\n /** List recent deliveries for a stream. */\n async listDeliveries(id: string, params?: { limit?: number; status?: string }): Promise<DeliveriesResponse> {\n const qs = new URLSearchParams();\n if (params?.limit) qs.set(\"limit\", String(params.limit));\n if (params?.status) qs.set(\"status\", params.status);\n const query = qs.toString();\n return this.requestWithStreamId(\"GET\", (id) => `/api/streams/${id}/deliveries${query ? `?${query}` : \"\"}`, id);\n }\n\n /** Get a single delivery with full payload. */\n async getDelivery(streamId: string, deliveryId: string): Promise<DeliveryDetail> {\n const fullId = await this.resolveStreamId(streamId);\n return this.request<DeliveryDetail>(\"GET\", `/api/streams/${fullId}/deliveries/${deliveryId}`);\n }\n\n async pauseAll(): Promise<BulkPauseResponse> {\n return this.request<BulkPauseResponse>(\"POST\", \"/api/streams/pause\");\n }\n\n async resumeAll(): Promise<BulkResumeResponse> {\n return this.request<BulkResumeResponse>(\"POST\", \"/api/streams/resume\");\n }\n}\n",
10
+ "import type { QueueStats } from \"@secondlayer/shared/types\";\nimport { BaseClient } from \"./base.ts\";\nimport type { SecondLayerOptions } from \"./base.ts\";\nimport { Streams } from \"./streams/client.ts\";\nimport { Views } from \"./views/client.ts\";\n\nexport class SecondLayer extends BaseClient {\n readonly streams: Streams;\n readonly views: Views;\n\n constructor(options: Partial<SecondLayerOptions> = {}) {\n super(options);\n this.streams = new Streams(options);\n this.views = new Views(options);\n }\n\n async getQueueStats(): Promise<QueueStats> {\n const status = await this.request<{ queue: QueueStats }>(\"GET\", \"/status\");\n return status.queue;\n }\n}\n",
11
+ "import type { InferViewClient } from \"@secondlayer/views\";\nimport type { SecondLayerOptions } from \"../base.ts\";\nimport { SecondLayer } from \"../client.ts\";\nimport { Views } from \"./client.ts\";\n\n/**\n * Returns a typed client for a view defined with `defineView()`.\n *\n * Accepts a plain options object, a `SecondLayer` instance, or a `Views` instance.\n *\n * @example\n * ```ts\n * import myView from './views/my-view'\n * import { getView } from '@secondlayer/sdk'\n *\n * const client = getView(myView, { apiKey: 'sl_...' })\n * const rows = await client.transfers.findMany({ where: { sender: 'SP...' } })\n * ```\n */\nexport function getView<T extends { name: string; schema: Record<string, unknown> }>(\n def: T,\n options: Partial<SecondLayerOptions> | SecondLayer | Views = {},\n): InferViewClient<T> {\n if (options instanceof Views) {\n return options.typed(def);\n }\n if (options instanceof SecondLayer) {\n return options.views.typed(def);\n }\n return new Views(options).typed(def);\n}\n"
8
12
  ],
9
- "mappings": "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",
10
- "debugId": "5FCD78685AE9CEC764756E2164756E21",
13
+ "mappings": "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",
14
+ "debugId": "77950829DF762B1564756E2164756E21",
11
15
  "names": []
12
16
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@secondlayer/sdk",
3
- "version": "0.3.1",
3
+ "version": "0.4.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -29,7 +29,8 @@
29
29
  "prepublishOnly": "bun run build"
30
30
  },
31
31
  "dependencies": {
32
- "@secondlayer/shared": "^0.2.0"
32
+ "@secondlayer/shared": "^0.3.0",
33
+ "@secondlayer/views": "^0.2.4"
33
34
  },
34
35
  "devDependencies": {
35
36
  "@types/bun": "latest",