@uns-kit/core 2.0.67 → 2.0.69

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 CHANGED
@@ -124,6 +124,34 @@ const batchHistory = await client.history([
124
124
  console.log(batchHistory?.byTopic);
125
125
  ```
126
126
 
127
+ ## Sub-Asset Publishing
128
+
129
+ Sub-assets use the same publish fields as normal assets. Set `topic` to the full
130
+ parent asset path and set `asset` to the leaf sub-asset:
131
+
132
+ ```ts
133
+ await proxy.publishMqttMessage({
134
+ topic: "sij/acroni/jek/pp/",
135
+ asset: "furnace-1",
136
+ objectType: "material",
137
+ objectId: "main",
138
+ attributes: {
139
+ attribute: "daily-production",
140
+ data: {
141
+ time: new Date().toISOString(),
142
+ value: 42,
143
+ uom: "t",
144
+ },
145
+ },
146
+ });
147
+ ```
148
+
149
+ This publishes
150
+ `sij/acroni/jek/pp/furnace-1/material/main/daily-production`. Consumers that
151
+ persist the existing QuestDB identity columns should store
152
+ `topic = "sij/acroni/jek/pp"` and `asset = "furnace-1"`. Do not use `dataGroup`
153
+ for sub-asset hierarchy; it is storage/routing metadata.
154
+
127
155
  ## Validity / Liveliness
128
156
 
129
157
  UNS attributes can declare how the controller decides whether they are live or stale; in most apps this is primarily used to drive UI liveliness/activity indicators. In app-level modeling we use two modes only:
@@ -1 +1 @@
1
- {"version":3,"file":"auth-client.d.ts","sourceRoot":"","sources":["../../../src/tools/auth/auth-client.ts"],"names":[],"mappings":"AAUA;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,KAAK,CAAgB;IAE7B,OAAO;WAMM,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC;IAQpC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAyCvC,OAAO,CAAC,MAAM,CAAC,SAAS;IAWxB,OAAO,CAAC,MAAM,CAAC,QAAQ;mBAOF,gBAAgB;IAWrC,OAAO,CAAC,MAAM,CAAC,oBAAoB;YAWrB,KAAK;YAmBL,OAAO;YAmBP,aAAa;CAI5B"}
1
+ {"version":3,"file":"auth-client.d.ts","sourceRoot":"","sources":["../../../src/tools/auth/auth-client.ts"],"names":[],"mappings":"AAUA;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,KAAK,CAAgB;IAE7B,OAAO;WAMM,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC;IAQpC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAyCvC,OAAO,CAAC,MAAM,CAAC,SAAS;IAWxB,OAAO,CAAC,MAAM,CAAC,QAAQ;mBAOF,gBAAgB;IAWrC,OAAO,CAAC,MAAM,CAAC,oBAAoB;YAWrB,KAAK;YAmBL,OAAO;YAwBP,aAAa;CAI5B"}
@@ -89,7 +89,7 @@ export class AuthClient {
89
89
  const getSetCookie = typeof anyHeaders.getSetCookie === "function" ? anyHeaders.getSetCookie.bind(anyHeaders) : null;
90
90
  const candidates = getSetCookie ? getSetCookie() : (resp.headers.get("set-cookie") ? [resp.headers.get("set-cookie")] : []);
91
91
  for (const header of candidates) {
92
- const match = header.match(/(?:^|;\s*)RefreshToken=([^;]+)/i);
92
+ const match = header.match(/(?:^|;\s*)(?:RefreshToken|rt)=([^;]+)/i);
93
93
  if (match)
94
94
  return match[1];
95
95
  }
@@ -114,21 +114,25 @@ export class AuthClient {
114
114
  }
115
115
  async refresh(refreshToken) {
116
116
  const url = AuthClient.endpoint(this.restBase, "auth/refresh");
117
- const resp = await AuthClient.fetchWithTimeout(url, {
118
- method: "POST",
119
- headers: {
120
- // server expects cookie RefreshToken
121
- "Cookie": `RefreshToken=${refreshToken}`,
122
- },
123
- }, 8_000);
124
- if (!resp.ok) {
125
- throw new Error(`Refresh failed: ${resp.status} ${resp.statusText}`);
117
+ let lastError;
118
+ for (const cookieName of ["RefreshToken", "rt"]) {
119
+ const resp = await AuthClient.fetchWithTimeout(url, {
120
+ method: "POST",
121
+ headers: {
122
+ "Cookie": `${cookieName}=${refreshToken}`,
123
+ },
124
+ }, 8_000);
125
+ if (!resp.ok) {
126
+ lastError = new Error(`Refresh failed: ${resp.status} ${resp.statusText}`);
127
+ continue;
128
+ }
129
+ const data = (await resp.json());
130
+ const newRefreshToken = AuthClient.extractRefreshCookie(resp) || refreshToken;
131
+ if (!data?.accessToken)
132
+ throw new Error("Refresh response missing accessToken");
133
+ return { accessToken: data.accessToken, refreshToken: newRefreshToken };
126
134
  }
127
- const data = (await resp.json());
128
- const newRefreshToken = AuthClient.extractRefreshCookie(resp) || refreshToken;
129
- if (!data?.accessToken)
130
- throw new Error("Refresh response missing accessToken");
131
- return { accessToken: data.accessToken, refreshToken: newRefreshToken };
135
+ throw lastError ?? new Error("Refresh failed.");
132
136
  }
133
137
  async persistTokens(accessToken, refreshToken) {
134
138
  await this.store.set("accessToken", accessToken);
@@ -1 +1 @@
1
- {"version":3,"file":"auth-client.js","sourceRoot":"","sources":["../../../src/tools/auth/auth-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { ConfigFile } from \"../../config-file.js\";\nimport { SecureStoreFactory, ISecureStore } from \"./secure-store.js\";\nimport jwt from \"jsonwebtoken\";\n\r\nconst cfg = await ConfigFile.loadConfig();\r\n\r\ntype LoginResponse = {\r\n accessToken: string;\r\n};\r\n\r\n/**\r\n * AuthClient handles acquiring and refreshing JWT access tokens\r\n * using the configured REST base URL.\r\n */\r\nexport class AuthClient {\r\n private readonly restBase: string;\r\n private readonly namespace: string;\r\n private store!: ISecureStore;\r\n\r\n private constructor(restBase: string) {\r\n this.restBase = restBase.replace(/\\/$/, \"\");\r\n // namespace store by rest base to allow multiple environments\r\n this.namespace = `uns-auth:${this.restBase}`;\r\n }\r\n\r\n static async create(): Promise<AuthClient> {\r\n const restBase: string = cfg?.uns?.rest;\r\n if (!restBase) throw new Error(\"config.uns.rest is not set\");\r\n const client = new AuthClient(restBase);\r\n client.store = await SecureStoreFactory.create(client.namespace);\r\n return client;\r\n }\r\n\r\n async getAccessToken(): Promise<string> {\n const accessToken = await this.store.get(\"accessToken\");\n const refreshToken = await this.store.get(\"refreshToken\");\n\r\n if (accessToken && !AuthClient.isExpired(accessToken)) {\r\n return accessToken;\r\n }\r\n\r\n // Try refresh if we have refresh token\r\n if (refreshToken) {\r\n try {\r\n const refreshed = await this.refresh(refreshToken);\r\n await this.persistTokens(refreshed.accessToken, refreshed.refreshToken);\r\n return refreshed.accessToken;\r\n } catch {\r\n // ignore, fallback to login\r\n }\r\n }\r\n\r\n // First try to get email and password from config\r\n const configEmail = cfg?.uns?.email;\n const configPassword = cfg?.uns?.password;\n if (typeof configEmail === \"string\" && typeof configPassword === \"string\") {\n try {\n const loggedIn = await this.login(configEmail, configPassword);\n await this.persistTokens(loggedIn.accessToken, loggedIn.refreshToken);\n return loggedIn.accessToken;\n } catch (error) {\n throw new Error(\n `Authentication failed using config.json credentials from uns.email/uns.password: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n\n throw new Error(\n \"No access token available. AuthClient reads config.json and expected valid uns.email and uns.password.\",\n );\n }\n\n private static isExpired(token: string, skewSeconds = 30): boolean {\n try {\r\n const decoded: any = jwt.decode(token);\r\n if (!decoded || typeof decoded !== \"object\" || !decoded.exp) return true;\r\n const now = Math.floor(Date.now() / 1000);\r\n return decoded.exp <= now + skewSeconds;\r\n } catch {\r\n return true;\r\n }\r\n }\r\n\r\n private static endpoint(base: string, tail: string): string {\r\n // base ends without trailing slash; tail must not start with slash\r\n const b = base.replace(/\\/$/, \"\");\r\n const t = tail.replace(/^\\//, \"\");\r\n return `${b}/${t}`;\r\n }\r\n\r\n private static async fetchWithTimeout(url: string, init: RequestInit = {}, timeoutMs = 10_000): Promise<Response> {\r\n const controller = new AbortController();\r\n const id = setTimeout(() => controller.abort(), timeoutMs);\r\n try {\r\n const resp = await fetch(url, { ...init, signal: controller.signal });\r\n return resp;\r\n } finally {\r\n clearTimeout(id);\r\n }\r\n }\r\n\r\n private static extractRefreshCookie(resp: Response): string | null {\r\n const anyHeaders: any = resp.headers as any;\r\n const getSetCookie = typeof anyHeaders.getSetCookie === \"function\" ? anyHeaders.getSetCookie.bind(anyHeaders) : null;\r\n const candidates: string[] = getSetCookie ? getSetCookie() : (resp.headers.get(\"set-cookie\") ? [resp.headers.get(\"set-cookie\") as string] : []);\r\n for (const header of candidates) {\r\n const match = header.match(/(?:^|;\\s*)RefreshToken=([^;]+)/i);\r\n if (match) return match[1];\r\n }\r\n return null;\r\n }\r\n\r\n private async login(email: string, password: string): Promise<{ accessToken: string; refreshToken: string; }> {\r\n const url = AuthClient.endpoint(this.restBase, \"auth/login\");\r\n const resp = await AuthClient.fetchWithTimeout(url, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ email, password }),\r\n }, 12_000);\r\n\r\n if (!resp.ok) {\r\n throw new Error(`Login failed: ${resp.status} ${resp.statusText}`);\r\n }\r\n const data = (await resp.json()) as LoginResponse;\r\n const refreshToken = AuthClient.extractRefreshCookie(resp);\r\n if (!data?.accessToken || !refreshToken) {\r\n throw new Error(\"Login response missing tokens\");\r\n }\r\n return { accessToken: data.accessToken, refreshToken };\r\n }\r\n\r\n private async refresh(refreshToken: string): Promise<{ accessToken: string; refreshToken: string; }> {\r\n const url = AuthClient.endpoint(this.restBase, \"auth/refresh\");\r\n const resp = await AuthClient.fetchWithTimeout(url, {\r\n method: \"POST\",\r\n headers: {\r\n // server expects cookie RefreshToken\r\n \"Cookie\": `RefreshToken=${refreshToken}`,\r\n },\r\n }, 8_000);\r\n\r\n if (!resp.ok) {\r\n throw new Error(`Refresh failed: ${resp.status} ${resp.statusText}`);\r\n }\r\n const data = (await resp.json()) as LoginResponse;\r\n const newRefreshToken = AuthClient.extractRefreshCookie(resp) || refreshToken;\r\n if (!data?.accessToken) throw new Error(\"Refresh response missing accessToken\");\r\n return { accessToken: data.accessToken, refreshToken: newRefreshToken };\r\n }\r\n\r\n private async persistTokens(accessToken: string, refreshToken: string): Promise<void> {\r\n await this.store.set(\"accessToken\", accessToken);\r\n await this.store.set(\"refreshToken\", refreshToken);\r\n }\r\n}\n"]}
1
+ {"version":3,"file":"auth-client.js","sourceRoot":"","sources":["../../../src/tools/auth/auth-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { ConfigFile } from \"../../config-file.js\";\nimport { SecureStoreFactory, ISecureStore } from \"./secure-store.js\";\nimport jwt from \"jsonwebtoken\";\n\r\nconst cfg = await ConfigFile.loadConfig();\r\n\r\ntype LoginResponse = {\r\n accessToken: string;\r\n};\r\n\r\n/**\r\n * AuthClient handles acquiring and refreshing JWT access tokens\r\n * using the configured REST base URL.\r\n */\r\nexport class AuthClient {\r\n private readonly restBase: string;\r\n private readonly namespace: string;\r\n private store!: ISecureStore;\r\n\r\n private constructor(restBase: string) {\r\n this.restBase = restBase.replace(/\\/$/, \"\");\r\n // namespace store by rest base to allow multiple environments\r\n this.namespace = `uns-auth:${this.restBase}`;\r\n }\r\n\r\n static async create(): Promise<AuthClient> {\r\n const restBase: string = cfg?.uns?.rest;\r\n if (!restBase) throw new Error(\"config.uns.rest is not set\");\r\n const client = new AuthClient(restBase);\r\n client.store = await SecureStoreFactory.create(client.namespace);\r\n return client;\r\n }\r\n\r\n async getAccessToken(): Promise<string> {\n const accessToken = await this.store.get(\"accessToken\");\n const refreshToken = await this.store.get(\"refreshToken\");\n\r\n if (accessToken && !AuthClient.isExpired(accessToken)) {\r\n return accessToken;\r\n }\r\n\r\n // Try refresh if we have refresh token\r\n if (refreshToken) {\r\n try {\r\n const refreshed = await this.refresh(refreshToken);\r\n await this.persistTokens(refreshed.accessToken, refreshed.refreshToken);\r\n return refreshed.accessToken;\r\n } catch {\r\n // ignore, fallback to login\r\n }\r\n }\r\n\r\n // First try to get email and password from config\r\n const configEmail = cfg?.uns?.email;\n const configPassword = cfg?.uns?.password;\n if (typeof configEmail === \"string\" && typeof configPassword === \"string\") {\n try {\n const loggedIn = await this.login(configEmail, configPassword);\n await this.persistTokens(loggedIn.accessToken, loggedIn.refreshToken);\n return loggedIn.accessToken;\n } catch (error) {\n throw new Error(\n `Authentication failed using config.json credentials from uns.email/uns.password: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n }\n\n throw new Error(\n \"No access token available. AuthClient reads config.json and expected valid uns.email and uns.password.\",\n );\n }\n\n private static isExpired(token: string, skewSeconds = 30): boolean {\n try {\r\n const decoded: any = jwt.decode(token);\r\n if (!decoded || typeof decoded !== \"object\" || !decoded.exp) return true;\r\n const now = Math.floor(Date.now() / 1000);\r\n return decoded.exp <= now + skewSeconds;\r\n } catch {\r\n return true;\r\n }\r\n }\r\n\r\n private static endpoint(base: string, tail: string): string {\r\n // base ends without trailing slash; tail must not start with slash\r\n const b = base.replace(/\\/$/, \"\");\r\n const t = tail.replace(/^\\//, \"\");\r\n return `${b}/${t}`;\r\n }\r\n\r\n private static async fetchWithTimeout(url: string, init: RequestInit = {}, timeoutMs = 10_000): Promise<Response> {\r\n const controller = new AbortController();\r\n const id = setTimeout(() => controller.abort(), timeoutMs);\r\n try {\r\n const resp = await fetch(url, { ...init, signal: controller.signal });\r\n return resp;\r\n } finally {\r\n clearTimeout(id);\r\n }\r\n }\r\n\r\n private static extractRefreshCookie(resp: Response): string | null {\r\n const anyHeaders: any = resp.headers as any;\r\n const getSetCookie = typeof anyHeaders.getSetCookie === \"function\" ? anyHeaders.getSetCookie.bind(anyHeaders) : null;\n const candidates: string[] = getSetCookie ? getSetCookie() : (resp.headers.get(\"set-cookie\") ? [resp.headers.get(\"set-cookie\") as string] : []);\n for (const header of candidates) {\n const match = header.match(/(?:^|;\\s*)(?:RefreshToken|rt)=([^;]+)/i);\n if (match) return match[1];\n }\n return null;\n }\n\r\n private async login(email: string, password: string): Promise<{ accessToken: string; refreshToken: string; }> {\r\n const url = AuthClient.endpoint(this.restBase, \"auth/login\");\r\n const resp = await AuthClient.fetchWithTimeout(url, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ email, password }),\r\n }, 12_000);\r\n\r\n if (!resp.ok) {\r\n throw new Error(`Login failed: ${resp.status} ${resp.statusText}`);\r\n }\r\n const data = (await resp.json()) as LoginResponse;\r\n const refreshToken = AuthClient.extractRefreshCookie(resp);\r\n if (!data?.accessToken || !refreshToken) {\r\n throw new Error(\"Login response missing tokens\");\r\n }\r\n return { accessToken: data.accessToken, refreshToken };\r\n }\r\n\r\n private async refresh(refreshToken: string): Promise<{ accessToken: string; refreshToken: string; }> {\n const url = AuthClient.endpoint(this.restBase, \"auth/refresh\");\n let lastError: Error | undefined;\n for (const cookieName of [\"RefreshToken\", \"rt\"]) {\n const resp = await AuthClient.fetchWithTimeout(url, {\n method: \"POST\",\n headers: {\n \"Cookie\": `${cookieName}=${refreshToken}`,\n },\n }, 8_000);\n\n if (!resp.ok) {\n lastError = new Error(`Refresh failed: ${resp.status} ${resp.statusText}`);\n continue;\n }\n const data = (await resp.json()) as LoginResponse;\n const newRefreshToken = AuthClient.extractRefreshCookie(resp) || refreshToken;\n if (!data?.accessToken) throw new Error(\"Refresh response missing accessToken\");\n return { accessToken: data.accessToken, refreshToken: newRefreshToken };\n }\n\n throw lastError ?? new Error(\"Refresh failed.\");\n }\n\r\n private async persistTokens(accessToken: string, refreshToken: string): Promise<void> {\r\n await this.store.set(\"accessToken\", accessToken);\r\n await this.store.set(\"refreshToken\", refreshToken);\r\n }\r\n}\n"]}
@@ -105,7 +105,7 @@ export declare class UnsClient {
105
105
  private readonly apiUrl;
106
106
  private readonly timeoutMs;
107
107
  private readonly authClient?;
108
- private accessToken?;
108
+ private manualAccessToken?;
109
109
  constructor(baseUrl: string, options?: UnsClientOptions);
110
110
  setToken(token?: string): void;
111
111
  ensureToken(): Promise<string | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"datahub-client.d.ts","sourceRoot":"","sources":["../../../src/tools/datahub/datahub-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"datahub-client.d.ts","sourceRoot":"","sources":["../../../src/tools/datahub/datahub-client.ts"],"names":[],"mappings":"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"}
@@ -144,7 +144,7 @@ export class UnsClient {
144
144
  apiUrl;
145
145
  timeoutMs;
146
146
  authClient;
147
- accessToken;
147
+ manualAccessToken;
148
148
  constructor(baseUrl, options = {}) {
149
149
  const apiBasePath = UnsClient.normalizeBasePath(options.apiBasePath ?? "/api");
150
150
  const strippedBase = baseUrl.replace(/\/$/, "");
@@ -159,19 +159,17 @@ export class UnsClient {
159
159
  this.apiBasePath = apiBasePath;
160
160
  this.timeoutMs = options.timeoutMs ?? 10_000;
161
161
  this.authClient = options.authClient;
162
- this.accessToken = options.token;
162
+ this.manualAccessToken = options.token;
163
163
  }
164
164
  setToken(token) {
165
- this.accessToken = token;
165
+ this.manualAccessToken = token;
166
166
  }
167
167
  async ensureToken() {
168
- if (this.accessToken)
169
- return this.accessToken;
168
+ if (this.manualAccessToken)
169
+ return this.manualAccessToken;
170
170
  if (!this.authClient)
171
171
  return undefined;
172
- const token = await this.authClient.getAccessToken();
173
- this.accessToken = token;
174
- return token;
172
+ return this.authClient.getAccessToken();
175
173
  }
176
174
  async get(endpoint, params, options = {}) {
177
175
  const authorize = options.authorize ?? true;
@@ -1 +1 @@
1
- {"version":3,"file":"datahub-client.js","sourceRoot":"","sources":["../../../src/tools/datahub/datahub-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { AuthClient } from \"../auth/auth-client.js\";\r\n\r\nexport type LastValuePayload = {\n topic: string;\n value: unknown;\n values?: Record<string, unknown> | null;\n uom?: string | null;\r\n timestamp?: string | null;\r\n dataGroup?: string | null;\r\n ageMs?: number | null;\r\n source: string;\n};\n\nexport type CatchAllTimeField = \"auto\" | \"timestamp\" | \"interval\";\nexport type CatchAllAggregate = \"avg\" | \"min\" | \"max\" | \"last\" | \"sum\" | \"count\";\n\nexport type RangeQueryOptions = {\n table?: string;\n from?: string;\n to?: string;\n timeField?: CatchAllTimeField;\n limit?: number;\n maxPoints?: number;\n bucketMs?: number;\n aggregate?: CatchAllAggregate;\n column?: string;\n summaryOnly?: boolean;\n dedupe?: boolean;\n};\n\nexport type RangeColumn = {\n name: string;\n type?: string;\n};\n\nexport type RangeStats = Record<string, unknown> & {\n raw?: {\n columns?: RangeColumn[];\n };\n};\n\nexport type RangePayload<Row extends unknown[] = unknown[]> = {\n data: Row[];\n stats?: RangeStats | null;\n};\n\nexport type BatchRangeTopicPayload<Row extends unknown[] = unknown[]> = {\n topic: string;\n error?: string | null;\n data: Row[];\n stats?: RangeStats | null;\n};\n\nexport type BatchRangeResponsePayload<Row extends unknown[] = unknown[]> = {\n results: BatchRangeTopicPayload<Row>[];\n stats?: Record<string, unknown> | null;\n};\n\nexport class RangeResult<Row extends unknown[] = unknown[]> {\n readonly data: Row[];\n readonly stats?: RangeStats | null;\n\n constructor(payload: RangePayload<Row>) {\n this.data = payload.data;\n this.stats = payload.stats ?? null;\n }\n\n static fromMapping<Row extends unknown[] = unknown[]>(value: Record<string, unknown>): RangeResult<Row> {\n return new RangeResult<Row>({\n data: Array.isArray(value.data) ? (value.data.filter(Array.isArray) as Row[]) : [],\n stats: value.stats && typeof value.stats === \"object\" && !Array.isArray(value.stats) ? (value.stats as RangeStats) : null,\n });\n }\n\n get columns(): RangeColumn[] {\n const columns = this.stats?.raw?.columns;\n return Array.isArray(columns) ? columns : [];\n }\n\n toRecords(): Array<Record<string, unknown>> {\n const columns = this.columns;\n if (!columns.length) {\n return this.data.map((row) => Object.fromEntries(row.map((value, index) => [String(index), value])));\n }\n return this.data.map((row) =>\n Object.fromEntries(row.map((value, index) => [columns[index]?.name ?? String(index), value])),\n );\n }\n\n toObject(): RangePayload<Row> {\n return {\n data: this.data,\n stats: this.stats ?? null,\n };\n }\n}\n\nexport class BatchRangeTopicResult<Row extends unknown[] = unknown[]> extends RangeResult<Row> {\n readonly topic: string;\n readonly error?: string | null;\n\n constructor(payload: BatchRangeTopicPayload<Row>) {\n super({\n data: payload.data ?? [],\n stats: payload.stats ?? null,\n });\n this.topic = payload.topic;\n this.error = payload.error ?? null;\n }\n\n static fromMapping<Row extends unknown[] = unknown[]>(value: Record<string, unknown>): BatchRangeTopicResult<Row> {\n return new BatchRangeTopicResult<Row>({\n topic: typeof value.topic === \"string\" ? value.topic : \"\",\n error: typeof value.error === \"string\" ? value.error : null,\n data: Array.isArray(value.data) ? (value.data.filter(Array.isArray) as Row[]) : [],\n stats: value.stats && typeof value.stats === \"object\" && !Array.isArray(value.stats) ? (value.stats as RangeStats) : null,\n });\n }\n\n override toObject(): BatchRangeTopicPayload<Row> {\n return {\n topic: this.topic,\n error: this.error ?? null,\n data: this.data,\n stats: this.stats ?? null,\n };\n }\n}\n\nexport class BatchRangeResponse<Row extends unknown[] = unknown[]> {\n readonly results: BatchRangeTopicResult<Row>[];\n readonly stats?: Record<string, unknown> | null;\n\n constructor(payload: BatchRangeResponsePayload<Row>) {\n this.results = payload.results.map((item) => new BatchRangeTopicResult<Row>(item));\n this.stats = payload.stats ?? null;\n }\n\n static fromMapping<Row extends unknown[] = unknown[]>(value: Record<string, unknown>): BatchRangeResponse<Row> {\n const rawResults = Array.isArray(value.results)\n ? value.results.filter((item): item is Record<string, unknown> => !!item && typeof item === \"object\" && !Array.isArray(item))\n : [];\n return new BatchRangeResponse<Row>({\n results: rawResults.map((item) => BatchRangeTopicResult.fromMapping<Row>(item).toObject()),\n stats: value.stats && typeof value.stats === \"object\" && !Array.isArray(value.stats) ? (value.stats as Record<string, unknown>) : null,\n });\n }\n\n get byTopic(): Record<string, BatchRangeTopicPayload<Row>> {\n return Object.fromEntries(this.results.map((result) => [result.topic, result.toObject()]));\n }\n\n toObject(): BatchRangeResponsePayload<Row> {\n return {\n results: this.results.map((result) => result.toObject()),\n stats: this.stats ?? null,\n };\n }\n}\n\r\nexport class LastValueResult {\r\n readonly topic: string;\r\n readonly value: unknown;\r\n readonly values?: Record<string, unknown> | null;\r\n readonly uom?: string | null;\r\n readonly timestamp?: string | null;\r\n readonly dataGroup?: string | null;\r\n readonly ageMs?: number | null;\r\n readonly source: string;\r\n\r\n constructor(payload: LastValuePayload) {\r\n this.topic = payload.topic;\r\n this.value = payload.value;\r\n this.values = payload.values ?? null;\r\n this.uom = payload.uom ?? null;\r\n this.timestamp = payload.timestamp ?? null;\r\n this.dataGroup = payload.dataGroup ?? null;\r\n this.ageMs = payload.ageMs ?? null;\r\n this.source = payload.source;\r\n }\r\n\r\n static fromMapping(value: Record<string, unknown>): LastValueResult {\r\n const rawValues = value.values;\r\n return new LastValueResult({\r\n topic: typeof value.topic === \"string\" ? value.topic : \"\",\r\n value: value.value,\r\n values: rawValues && typeof rawValues === \"object\" && !Array.isArray(rawValues) ? (rawValues as Record<string, unknown>) : null,\r\n uom: typeof value.uom === \"string\" ? value.uom : null,\r\n timestamp: typeof value.timestamp === \"string\" ? value.timestamp : null,\r\n dataGroup: typeof value.dataGroup === \"string\" ? value.dataGroup : null,\r\n ageMs: typeof value.ageMs === \"number\" ? value.ageMs : null,\r\n source: typeof value.source === \"string\" ? value.source : \"miss\",\r\n });\r\n }\r\n\r\n get hit(): boolean {\r\n return this.source === \"cache\";\r\n }\r\n\r\n toObject(): LastValuePayload {\r\n return {\r\n topic: this.topic,\r\n value: this.value,\r\n values: this.values ?? null,\r\n uom: this.uom ?? null,\r\n timestamp: this.timestamp ?? null,\r\n dataGroup: this.dataGroup ?? null,\r\n ageMs: this.ageMs ?? null,\r\n source: this.source,\r\n };\r\n }\r\n}\r\n\r\nexport class ClientError extends Error {\r\n readonly statusCode?: number;\r\n\r\n constructor(message: string, statusCode?: number) {\r\n super(message);\r\n this.statusCode = statusCode;\r\n }\r\n}\r\n\r\nexport type UnsClientOptions = {\n apiBasePath?: string;\r\n token?: string;\r\n timeoutMs?: number;\r\n authClient?: AuthClient;\r\n};\n\nexport type RequestOptions = {\n baseUrl?: string;\n authorize?: boolean;\n};\n\nexport class UnsClient {\n private readonly apiBasePath: string;\r\n private readonly baseUrl: string;\r\n private readonly apiUrl: string;\r\n private readonly timeoutMs: number;\r\n private readonly authClient?: AuthClient;\r\n private accessToken?: string;\r\n\r\n constructor(baseUrl: string, options: UnsClientOptions = {}) {\r\n const apiBasePath = UnsClient.normalizeBasePath(options.apiBasePath ?? \"/api\");\r\n const strippedBase = baseUrl.replace(/\\/$/, \"\");\r\n if (apiBasePath && strippedBase.endsWith(apiBasePath)) {\r\n this.apiUrl = strippedBase;\r\n this.baseUrl = strippedBase.slice(0, -apiBasePath.length).replace(/\\/$/, \"\");\r\n } else {\r\n this.baseUrl = strippedBase;\r\n this.apiUrl = `${strippedBase}${apiBasePath}`;\r\n }\r\n this.apiBasePath = apiBasePath;\r\n this.timeoutMs = options.timeoutMs ?? 10_000;\r\n this.authClient = options.authClient;\r\n this.accessToken = options.token;\r\n }\r\n\r\n setToken(token?: string): void {\r\n this.accessToken = token;\r\n }\r\n\r\n async ensureToken(): Promise<string | undefined> {\r\n if (this.accessToken) return this.accessToken;\r\n if (!this.authClient) return undefined;\r\n const token = await this.authClient.getAccessToken();\r\n this.accessToken = token;\r\n return token;\r\n }\r\n\r\n async get(endpoint: string, params?: Record<string, string | number | boolean>, options: RequestOptions = {}): Promise<Response> {\n const authorize = options.authorize ?? true;\n const token = authorize ? await this.ensureToken() : undefined;\n const search = params ? `?${new URLSearchParams(this.stringifyQueryParams(params))}` : \"\";\n return this.request(\"GET\", `${this.buildUrl(endpoint, options.baseUrl)}${search}`, undefined, token);\n }\n\n async getData(\n endpoint: string,\n params?: Record<string, string | number | boolean>,\n options: RequestOptions = {},\n ): Promise<Response> {\n return this.get(endpoint, params, options);\n }\n\n async post(endpoint: string, body?: Record<string, unknown>, options: RequestOptions = {}): Promise<Record<string, unknown>> {\n const authorize = options.authorize ?? true;\n const token = authorize ? await this.ensureToken() : undefined;\n return this.requestJson(\"POST\", this.buildUrl(endpoint, options.baseUrl), body ?? {}, token);\n }\r\n\r\n async lastValue(topics: string | string[], options: { token?: string } = {}): Promise<Record<string, LastValuePayload> | null> {\n const topicList = Array.isArray(topics) ? topics : [topics];\r\n if (!topicList.length) {\r\n throw new Error(\"topics must contain at least one topic.\");\r\n }\r\n if (topicList.length > 500) {\r\n throw new Error(\"Maximum 500 topics per request.\");\r\n }\n const token = options.token ?? (await this.ensureToken());\n try {\n const payload = await this.requestJson(\"POST\", this.buildUrl(\"catchall/batch/last\"), { topics: topicList }, token);\n const rawResults = payload.results;\n if (!Array.isArray(rawResults)) {\n throw new ClientError(\"Last-value response did not include a results array.\");\n }\r\n const results = rawResults\r\n .filter((item): item is Record<string, unknown> => !!item && typeof item === \"object\" && !Array.isArray(item))\r\n .map((item) => LastValueResult.fromMapping(item));\r\n return Object.fromEntries(results.map((result) => [result.topic, result.toObject()]));\r\n } catch (error) {\r\n if (error instanceof ClientError && error.statusCode === 404) {\r\n return null;\r\n }\n throw error;\n }\n }\n\n async getAttributeData<Row extends unknown[] = unknown[]>(\n topicPath: string,\n options: RangeQueryOptions & { token?: string } = {},\n ): Promise<RangeResult<Row> | null> {\n const token = options.token ?? (await this.ensureToken());\n const { token: _token, ...query } = options;\n try {\n const payload = await this.requestJson(\n \"GET\",\n this.buildUrl(`catchall/${encodeURIComponent(topicPath)}`) + this.buildQuerySuffix(query),\n undefined,\n token,\n );\n return RangeResult.fromMapping<Row>(payload);\n } catch (error) {\n if (error instanceof ClientError && error.statusCode === 404) {\n return null;\n }\n throw error;\n }\n }\n\n async history<Row extends unknown[] = unknown[]>(\n topics: string | string[],\n options: RangeQueryOptions & { token?: string } = {},\n ): Promise<BatchRangeResponse<Row> | null> {\n const topicList = Array.isArray(topics) ? topics : [topics];\n if (!topicList.length) {\n throw new Error(\"topics must contain at least one topic.\");\n }\n if (topicList.length > 500) {\n throw new Error(\"Maximum 500 topics per request.\");\n }\n const token = options.token ?? (await this.ensureToken());\n const { token: _token, ...body } = options;\n try {\n const payload = await this.requestJson(\n \"POST\",\n this.buildUrl(\"catchall/batch/range\"),\n { topics: topicList, ...body },\n token,\n );\n const rawResults = payload.results;\n if (!Array.isArray(rawResults)) {\n throw new ClientError(\"Batch-range response did not include a results array.\");\n }\n return BatchRangeResponse.fromMapping<Row>(payload);\n } catch (error) {\n if (error instanceof ClientError && error.statusCode === 404) {\n return null;\n }\n throw error;\n }\n }\n\n private async requestJson(\n method: \"GET\" | \"POST\",\n url: string,\n body?: Record<string, unknown>,\n token?: string,\n ): Promise<Record<string, unknown>> {\n try {\n const resp = await this.request(method, url, body, token);\n const text = await resp.text();\n if (!text) return {};\n const parsed = JSON.parse(text);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new ClientError(\"UNS response must be a JSON object.\");\r\n }\r\n return parsed as Record<string, unknown>;\r\n } catch (error: any) {\r\n if (error instanceof ClientError) {\r\n throw error;\r\n }\r\n if (error?.name === \"AbortError\") {\n throw new ClientError(\"UNS request timed out.\");\n }\n throw new ClientError(`UNS request failed: ${error?.message ?? String(error)}`);\n }\n }\n\n private async request(\n method: \"GET\" | \"POST\",\n url: string,\n body?: Record<string, unknown>,\n token?: string,\n ): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const resp = await fetch(url, {\n method,\n headers: {\n \"Accept\": \"*/*\",\n ...(body ? { \"Content-Type\": \"application/json\" } : {}),\n ...(token ? { \"Authorization\": `Bearer ${token}` } : {}),\n },\n ...(body ? { body: JSON.stringify(body) } : {}),\n signal: controller.signal,\n });\n if (!resp.ok) {\n const text = await resp.text();\n throw new ClientError(\n `UNS request failed with HTTP ${resp.status}: ${text || resp.statusText}`,\n resp.status,\n );\n }\n return resp;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private buildUrl(endpoint: string, baseUrl?: string): string {\n if (endpoint.startsWith(\"http://\") || endpoint.startsWith(\"https://\")) {\r\n return endpoint;\r\n }\r\n const root = (baseUrl ?? this.apiUrl).replace(/\\/$/, \"\");\r\n let path = endpoint.startsWith(\"/\") ? endpoint : `/${endpoint}`;\r\n if (!baseUrl && this.apiBasePath && (path === this.apiBasePath || path.startsWith(`${this.apiBasePath}/`))) {\r\n path = path.slice(this.apiBasePath.length) || \"/\";\r\n }\r\n return `${root}${path}`;\r\n }\r\n\r\n private stringifyQueryParams(params: Record<string, string | number | boolean>): Record<string, string> {\n return Object.fromEntries(Object.entries(params).map(([key, value]) => [key, String(value)]));\n }\n\n private buildQuerySuffix(params: Record<string, unknown>): string {\n const filteredEntries = Object.entries(params).filter(([, value]) => value !== undefined && value !== null);\n if (!filteredEntries.length) {\n return \"\";\n }\n const search = new URLSearchParams(\n Object.fromEntries(filteredEntries.map(([key, value]) => [key, String(value)])),\n );\n return `?${search.toString()}`;\n }\n\r\n private static normalizeBasePath(value: string): string {\r\n const stripped = value.trim();\r\n if (!stripped) return \"\";\r\n return stripped.startsWith(\"/\") ? stripped : `/${stripped}`;\r\n }\r\n}\r\n\r\n"]}
1
+ {"version":3,"file":"datahub-client.js","sourceRoot":"","sources":["../../../src/tools/datahub/datahub-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { AuthClient } from \"../auth/auth-client.js\";\r\n\r\nexport type LastValuePayload = {\n topic: string;\n value: unknown;\n values?: Record<string, unknown> | null;\n uom?: string | null;\r\n timestamp?: string | null;\r\n dataGroup?: string | null;\r\n ageMs?: number | null;\r\n source: string;\n};\n\nexport type CatchAllTimeField = \"auto\" | \"timestamp\" | \"interval\";\nexport type CatchAllAggregate = \"avg\" | \"min\" | \"max\" | \"last\" | \"sum\" | \"count\";\n\nexport type RangeQueryOptions = {\n table?: string;\n from?: string;\n to?: string;\n timeField?: CatchAllTimeField;\n limit?: number;\n maxPoints?: number;\n bucketMs?: number;\n aggregate?: CatchAllAggregate;\n column?: string;\n summaryOnly?: boolean;\n dedupe?: boolean;\n};\n\nexport type RangeColumn = {\n name: string;\n type?: string;\n};\n\nexport type RangeStats = Record<string, unknown> & {\n raw?: {\n columns?: RangeColumn[];\n };\n};\n\nexport type RangePayload<Row extends unknown[] = unknown[]> = {\n data: Row[];\n stats?: RangeStats | null;\n};\n\nexport type BatchRangeTopicPayload<Row extends unknown[] = unknown[]> = {\n topic: string;\n error?: string | null;\n data: Row[];\n stats?: RangeStats | null;\n};\n\nexport type BatchRangeResponsePayload<Row extends unknown[] = unknown[]> = {\n results: BatchRangeTopicPayload<Row>[];\n stats?: Record<string, unknown> | null;\n};\n\nexport class RangeResult<Row extends unknown[] = unknown[]> {\n readonly data: Row[];\n readonly stats?: RangeStats | null;\n\n constructor(payload: RangePayload<Row>) {\n this.data = payload.data;\n this.stats = payload.stats ?? null;\n }\n\n static fromMapping<Row extends unknown[] = unknown[]>(value: Record<string, unknown>): RangeResult<Row> {\n return new RangeResult<Row>({\n data: Array.isArray(value.data) ? (value.data.filter(Array.isArray) as Row[]) : [],\n stats: value.stats && typeof value.stats === \"object\" && !Array.isArray(value.stats) ? (value.stats as RangeStats) : null,\n });\n }\n\n get columns(): RangeColumn[] {\n const columns = this.stats?.raw?.columns;\n return Array.isArray(columns) ? columns : [];\n }\n\n toRecords(): Array<Record<string, unknown>> {\n const columns = this.columns;\n if (!columns.length) {\n return this.data.map((row) => Object.fromEntries(row.map((value, index) => [String(index), value])));\n }\n return this.data.map((row) =>\n Object.fromEntries(row.map((value, index) => [columns[index]?.name ?? String(index), value])),\n );\n }\n\n toObject(): RangePayload<Row> {\n return {\n data: this.data,\n stats: this.stats ?? null,\n };\n }\n}\n\nexport class BatchRangeTopicResult<Row extends unknown[] = unknown[]> extends RangeResult<Row> {\n readonly topic: string;\n readonly error?: string | null;\n\n constructor(payload: BatchRangeTopicPayload<Row>) {\n super({\n data: payload.data ?? [],\n stats: payload.stats ?? null,\n });\n this.topic = payload.topic;\n this.error = payload.error ?? null;\n }\n\n static fromMapping<Row extends unknown[] = unknown[]>(value: Record<string, unknown>): BatchRangeTopicResult<Row> {\n return new BatchRangeTopicResult<Row>({\n topic: typeof value.topic === \"string\" ? value.topic : \"\",\n error: typeof value.error === \"string\" ? value.error : null,\n data: Array.isArray(value.data) ? (value.data.filter(Array.isArray) as Row[]) : [],\n stats: value.stats && typeof value.stats === \"object\" && !Array.isArray(value.stats) ? (value.stats as RangeStats) : null,\n });\n }\n\n override toObject(): BatchRangeTopicPayload<Row> {\n return {\n topic: this.topic,\n error: this.error ?? null,\n data: this.data,\n stats: this.stats ?? null,\n };\n }\n}\n\nexport class BatchRangeResponse<Row extends unknown[] = unknown[]> {\n readonly results: BatchRangeTopicResult<Row>[];\n readonly stats?: Record<string, unknown> | null;\n\n constructor(payload: BatchRangeResponsePayload<Row>) {\n this.results = payload.results.map((item) => new BatchRangeTopicResult<Row>(item));\n this.stats = payload.stats ?? null;\n }\n\n static fromMapping<Row extends unknown[] = unknown[]>(value: Record<string, unknown>): BatchRangeResponse<Row> {\n const rawResults = Array.isArray(value.results)\n ? value.results.filter((item): item is Record<string, unknown> => !!item && typeof item === \"object\" && !Array.isArray(item))\n : [];\n return new BatchRangeResponse<Row>({\n results: rawResults.map((item) => BatchRangeTopicResult.fromMapping<Row>(item).toObject()),\n stats: value.stats && typeof value.stats === \"object\" && !Array.isArray(value.stats) ? (value.stats as Record<string, unknown>) : null,\n });\n }\n\n get byTopic(): Record<string, BatchRangeTopicPayload<Row>> {\n return Object.fromEntries(this.results.map((result) => [result.topic, result.toObject()]));\n }\n\n toObject(): BatchRangeResponsePayload<Row> {\n return {\n results: this.results.map((result) => result.toObject()),\n stats: this.stats ?? null,\n };\n }\n}\n\r\nexport class LastValueResult {\r\n readonly topic: string;\r\n readonly value: unknown;\r\n readonly values?: Record<string, unknown> | null;\r\n readonly uom?: string | null;\r\n readonly timestamp?: string | null;\r\n readonly dataGroup?: string | null;\r\n readonly ageMs?: number | null;\r\n readonly source: string;\r\n\r\n constructor(payload: LastValuePayload) {\r\n this.topic = payload.topic;\r\n this.value = payload.value;\r\n this.values = payload.values ?? null;\r\n this.uom = payload.uom ?? null;\r\n this.timestamp = payload.timestamp ?? null;\r\n this.dataGroup = payload.dataGroup ?? null;\r\n this.ageMs = payload.ageMs ?? null;\r\n this.source = payload.source;\r\n }\r\n\r\n static fromMapping(value: Record<string, unknown>): LastValueResult {\r\n const rawValues = value.values;\r\n return new LastValueResult({\r\n topic: typeof value.topic === \"string\" ? value.topic : \"\",\r\n value: value.value,\r\n values: rawValues && typeof rawValues === \"object\" && !Array.isArray(rawValues) ? (rawValues as Record<string, unknown>) : null,\r\n uom: typeof value.uom === \"string\" ? value.uom : null,\r\n timestamp: typeof value.timestamp === \"string\" ? value.timestamp : null,\r\n dataGroup: typeof value.dataGroup === \"string\" ? value.dataGroup : null,\r\n ageMs: typeof value.ageMs === \"number\" ? value.ageMs : null,\r\n source: typeof value.source === \"string\" ? value.source : \"miss\",\r\n });\r\n }\r\n\r\n get hit(): boolean {\r\n return this.source === \"cache\";\r\n }\r\n\r\n toObject(): LastValuePayload {\r\n return {\r\n topic: this.topic,\r\n value: this.value,\r\n values: this.values ?? null,\r\n uom: this.uom ?? null,\r\n timestamp: this.timestamp ?? null,\r\n dataGroup: this.dataGroup ?? null,\r\n ageMs: this.ageMs ?? null,\r\n source: this.source,\r\n };\r\n }\r\n}\r\n\r\nexport class ClientError extends Error {\r\n readonly statusCode?: number;\r\n\r\n constructor(message: string, statusCode?: number) {\r\n super(message);\r\n this.statusCode = statusCode;\r\n }\r\n}\r\n\r\nexport type UnsClientOptions = {\n apiBasePath?: string;\r\n token?: string;\r\n timeoutMs?: number;\r\n authClient?: AuthClient;\r\n};\n\nexport type RequestOptions = {\n baseUrl?: string;\n authorize?: boolean;\n};\n\nexport class UnsClient {\n private readonly apiBasePath: string;\r\n private readonly baseUrl: string;\r\n private readonly apiUrl: string;\r\n private readonly timeoutMs: number;\r\n private readonly authClient?: AuthClient;\r\n private manualAccessToken?: string;\n\r\n constructor(baseUrl: string, options: UnsClientOptions = {}) {\r\n const apiBasePath = UnsClient.normalizeBasePath(options.apiBasePath ?? \"/api\");\r\n const strippedBase = baseUrl.replace(/\\/$/, \"\");\r\n if (apiBasePath && strippedBase.endsWith(apiBasePath)) {\r\n this.apiUrl = strippedBase;\r\n this.baseUrl = strippedBase.slice(0, -apiBasePath.length).replace(/\\/$/, \"\");\r\n } else {\r\n this.baseUrl = strippedBase;\r\n this.apiUrl = `${strippedBase}${apiBasePath}`;\r\n }\r\n this.apiBasePath = apiBasePath;\r\n this.timeoutMs = options.timeoutMs ?? 10_000;\r\n this.authClient = options.authClient;\r\n this.manualAccessToken = options.token;\n }\r\n\r\n setToken(token?: string): void {\r\n this.manualAccessToken = token;\n }\r\n\r\n async ensureToken(): Promise<string | undefined> {\r\n if (this.manualAccessToken) return this.manualAccessToken;\n if (!this.authClient) return undefined;\n return this.authClient.getAccessToken();\n }\n\r\n async get(endpoint: string, params?: Record<string, string | number | boolean>, options: RequestOptions = {}): Promise<Response> {\n const authorize = options.authorize ?? true;\n const token = authorize ? await this.ensureToken() : undefined;\n const search = params ? `?${new URLSearchParams(this.stringifyQueryParams(params))}` : \"\";\n return this.request(\"GET\", `${this.buildUrl(endpoint, options.baseUrl)}${search}`, undefined, token);\n }\n\n async getData(\n endpoint: string,\n params?: Record<string, string | number | boolean>,\n options: RequestOptions = {},\n ): Promise<Response> {\n return this.get(endpoint, params, options);\n }\n\n async post(endpoint: string, body?: Record<string, unknown>, options: RequestOptions = {}): Promise<Record<string, unknown>> {\n const authorize = options.authorize ?? true;\n const token = authorize ? await this.ensureToken() : undefined;\n return this.requestJson(\"POST\", this.buildUrl(endpoint, options.baseUrl), body ?? {}, token);\n }\r\n\r\n async lastValue(topics: string | string[], options: { token?: string } = {}): Promise<Record<string, LastValuePayload> | null> {\n const topicList = Array.isArray(topics) ? topics : [topics];\r\n if (!topicList.length) {\r\n throw new Error(\"topics must contain at least one topic.\");\r\n }\r\n if (topicList.length > 500) {\r\n throw new Error(\"Maximum 500 topics per request.\");\r\n }\n const token = options.token ?? (await this.ensureToken());\n try {\n const payload = await this.requestJson(\"POST\", this.buildUrl(\"catchall/batch/last\"), { topics: topicList }, token);\n const rawResults = payload.results;\n if (!Array.isArray(rawResults)) {\n throw new ClientError(\"Last-value response did not include a results array.\");\n }\r\n const results = rawResults\r\n .filter((item): item is Record<string, unknown> => !!item && typeof item === \"object\" && !Array.isArray(item))\r\n .map((item) => LastValueResult.fromMapping(item));\r\n return Object.fromEntries(results.map((result) => [result.topic, result.toObject()]));\r\n } catch (error) {\r\n if (error instanceof ClientError && error.statusCode === 404) {\r\n return null;\r\n }\n throw error;\n }\n }\n\n async getAttributeData<Row extends unknown[] = unknown[]>(\n topicPath: string,\n options: RangeQueryOptions & { token?: string } = {},\n ): Promise<RangeResult<Row> | null> {\n const token = options.token ?? (await this.ensureToken());\n const { token: _token, ...query } = options;\n try {\n const payload = await this.requestJson(\n \"GET\",\n this.buildUrl(`catchall/${encodeURIComponent(topicPath)}`) + this.buildQuerySuffix(query),\n undefined,\n token,\n );\n return RangeResult.fromMapping<Row>(payload);\n } catch (error) {\n if (error instanceof ClientError && error.statusCode === 404) {\n return null;\n }\n throw error;\n }\n }\n\n async history<Row extends unknown[] = unknown[]>(\n topics: string | string[],\n options: RangeQueryOptions & { token?: string } = {},\n ): Promise<BatchRangeResponse<Row> | null> {\n const topicList = Array.isArray(topics) ? topics : [topics];\n if (!topicList.length) {\n throw new Error(\"topics must contain at least one topic.\");\n }\n if (topicList.length > 500) {\n throw new Error(\"Maximum 500 topics per request.\");\n }\n const token = options.token ?? (await this.ensureToken());\n const { token: _token, ...body } = options;\n try {\n const payload = await this.requestJson(\n \"POST\",\n this.buildUrl(\"catchall/batch/range\"),\n { topics: topicList, ...body },\n token,\n );\n const rawResults = payload.results;\n if (!Array.isArray(rawResults)) {\n throw new ClientError(\"Batch-range response did not include a results array.\");\n }\n return BatchRangeResponse.fromMapping<Row>(payload);\n } catch (error) {\n if (error instanceof ClientError && error.statusCode === 404) {\n return null;\n }\n throw error;\n }\n }\n\n private async requestJson(\n method: \"GET\" | \"POST\",\n url: string,\n body?: Record<string, unknown>,\n token?: string,\n ): Promise<Record<string, unknown>> {\n try {\n const resp = await this.request(method, url, body, token);\n const text = await resp.text();\n if (!text) return {};\n const parsed = JSON.parse(text);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new ClientError(\"UNS response must be a JSON object.\");\r\n }\r\n return parsed as Record<string, unknown>;\r\n } catch (error: any) {\r\n if (error instanceof ClientError) {\r\n throw error;\r\n }\r\n if (error?.name === \"AbortError\") {\n throw new ClientError(\"UNS request timed out.\");\n }\n throw new ClientError(`UNS request failed: ${error?.message ?? String(error)}`);\n }\n }\n\n private async request(\n method: \"GET\" | \"POST\",\n url: string,\n body?: Record<string, unknown>,\n token?: string,\n ): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const resp = await fetch(url, {\n method,\n headers: {\n \"Accept\": \"*/*\",\n ...(body ? { \"Content-Type\": \"application/json\" } : {}),\n ...(token ? { \"Authorization\": `Bearer ${token}` } : {}),\n },\n ...(body ? { body: JSON.stringify(body) } : {}),\n signal: controller.signal,\n });\n if (!resp.ok) {\n const text = await resp.text();\n throw new ClientError(\n `UNS request failed with HTTP ${resp.status}: ${text || resp.statusText}`,\n resp.status,\n );\n }\n return resp;\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private buildUrl(endpoint: string, baseUrl?: string): string {\n if (endpoint.startsWith(\"http://\") || endpoint.startsWith(\"https://\")) {\r\n return endpoint;\r\n }\r\n const root = (baseUrl ?? this.apiUrl).replace(/\\/$/, \"\");\r\n let path = endpoint.startsWith(\"/\") ? endpoint : `/${endpoint}`;\r\n if (!baseUrl && this.apiBasePath && (path === this.apiBasePath || path.startsWith(`${this.apiBasePath}/`))) {\r\n path = path.slice(this.apiBasePath.length) || \"/\";\r\n }\r\n return `${root}${path}`;\r\n }\r\n\r\n private stringifyQueryParams(params: Record<string, string | number | boolean>): Record<string, string> {\n return Object.fromEntries(Object.entries(params).map(([key, value]) => [key, String(value)]));\n }\n\n private buildQuerySuffix(params: Record<string, unknown>): string {\n const filteredEntries = Object.entries(params).filter(([, value]) => value !== undefined && value !== null);\n if (!filteredEntries.length) {\n return \"\";\n }\n const search = new URLSearchParams(\n Object.fromEntries(filteredEntries.map(([key, value]) => [key, String(value)])),\n );\n return `?${search.toString()}`;\n }\n\r\n private static normalizeBasePath(value: string): string {\r\n const stripped = value.trim();\r\n if (!stripped) return \"\";\r\n return stripped.startsWith(\"/\") ? stripped : `/${stripped}`;\r\n }\r\n}\r\n\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uns-kit/core",
3
- "version": "2.0.67",
3
+ "version": "2.0.69",
4
4
  "description": "Core utilities and runtime building blocks for UNS-based realtime transformers.",
5
5
  "type": "module",
6
6
  "license": "MIT",