@thingd/sdk 0.70.0 → 0.72.0

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.
Files changed (73) hide show
  1. package/package.json +2 -3
  2. package/dist/client/http-thing-store.d.ts +0 -55
  3. package/dist/client/http-thing-store.d.ts.map +0 -1
  4. package/dist/client/http-thing-store.js +0 -233
  5. package/dist/client/in-memory-thing-store.d.ts +0 -41
  6. package/dist/client/in-memory-thing-store.d.ts.map +0 -1
  7. package/dist/client/in-memory-thing-store.js +0 -292
  8. package/dist/client/index.d.ts +0 -5
  9. package/dist/client/index.d.ts.map +0 -1
  10. package/dist/client/index.js +0 -3
  11. package/dist/client/thingd.d.ts +0 -24
  12. package/dist/client/thingd.d.ts.map +0 -1
  13. package/dist/client/thingd.js +0 -27
  14. package/dist/constants.d.ts +0 -2
  15. package/dist/constants.d.ts.map +0 -1
  16. package/dist/constants.js +0 -1
  17. package/dist/index.d.ts +0 -13
  18. package/dist/index.d.ts.map +0 -1
  19. package/dist/index.js +0 -11
  20. package/dist/mcp/audit.d.ts +0 -27
  21. package/dist/mcp/audit.d.ts.map +0 -1
  22. package/dist/mcp/audit.js +0 -36
  23. package/dist/mcp/config.d.ts +0 -22
  24. package/dist/mcp/config.d.ts.map +0 -1
  25. package/dist/mcp/config.js +0 -52
  26. package/dist/mcp/index.d.ts +0 -6
  27. package/dist/mcp/index.d.ts.map +0 -1
  28. package/dist/mcp/index.js +0 -5
  29. package/dist/mcp/result.d.ts +0 -3
  30. package/dist/mcp/result.d.ts.map +0 -1
  31. package/dist/mcp/result.js +0 -10
  32. package/dist/mcp/server.d.ts +0 -19
  33. package/dist/mcp/server.d.ts.map +0 -1
  34. package/dist/mcp/server.js +0 -51
  35. package/dist/mcp/tools.d.ts +0 -10
  36. package/dist/mcp/tools.d.ts.map +0 -1
  37. package/dist/mcp/tools.js +0 -1033
  38. package/dist/memory/index.d.ts +0 -7
  39. package/dist/memory/index.d.ts.map +0 -1
  40. package/dist/memory/index.js +0 -7
  41. package/dist/rest/helpers.d.ts +0 -17
  42. package/dist/rest/helpers.d.ts.map +0 -1
  43. package/dist/rest/helpers.js +0 -60
  44. package/dist/rest/index.d.ts +0 -3
  45. package/dist/rest/index.d.ts.map +0 -1
  46. package/dist/rest/index.js +0 -2
  47. package/dist/rest/server.d.ts +0 -4
  48. package/dist/rest/server.d.ts.map +0 -1
  49. package/dist/rest/server.js +0 -472
  50. package/dist/scheduler.d.ts +0 -28
  51. package/dist/scheduler.d.ts.map +0 -1
  52. package/dist/scheduler.js +0 -451
  53. package/dist/stores/cloud-thing-store.d.ts +0 -63
  54. package/dist/stores/cloud-thing-store.d.ts.map +0 -1
  55. package/dist/stores/cloud-thing-store.js +0 -396
  56. package/dist/stores/in-memory-thing-store.d.ts +0 -62
  57. package/dist/stores/in-memory-thing-store.d.ts.map +0 -1
  58. package/dist/stores/in-memory-thing-store.js +0 -709
  59. package/dist/stores/native-thing-store.d.ts +0 -62
  60. package/dist/stores/native-thing-store.d.ts.map +0 -1
  61. package/dist/stores/native-thing-store.js +0 -374
  62. package/dist/thingd.d.ts +0 -87
  63. package/dist/thingd.d.ts.map +0 -1
  64. package/dist/thingd.js +0 -236
  65. package/dist/types/index.d.ts +0 -2
  66. package/dist/types/index.d.ts.map +0 -1
  67. package/dist/types/index.js +0 -1
  68. package/dist/types.d.ts +0 -435
  69. package/dist/types.d.ts.map +0 -1
  70. package/dist/types.js +0 -1
  71. package/dist/version.d.ts +0 -6
  72. package/dist/version.d.ts.map +0 -1
  73. package/dist/version.js +0 -5
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thingd/sdk",
3
- "version": "0.70.0",
3
+ "version": "0.72.0",
4
4
  "description": "A fast object-first data engine for applications and AI agents.",
5
5
  "type": "module",
6
6
  "author": "Sayan Mohsin",
@@ -18,7 +18,6 @@
18
18
  "memory",
19
19
  "queue",
20
20
  "durable-queues",
21
- "fjall",
22
21
  "rust",
23
22
  "local-first",
24
23
  "data-engine",
@@ -72,7 +71,7 @@
72
71
  "zod": "^4.4.3"
73
72
  },
74
73
  "optionalDependencies": {
75
- "@thingd/native": "0.70.0"
74
+ "@thingd/native": "0.72.0"
76
75
  },
77
76
  "engines": {
78
77
  "node": ">=24.0.0"
@@ -1,55 +0,0 @@
1
- import type { AggregateOptions, AggregateResult, CollectionSchema, ConnectorAuth, ConnectorSchema, ConnectorSyncOptions, ConnectorSyncResult, ListEventsOptions, ListObjectsOptions, MemoryEvent, MemoryObject, MemorySearchOptions, MemorySearchResult, NlqOptions, NlqResult, QueueClaimOptions, QueueJob, QueueJobOptions, QueueJobPayload, QueueJobResult, QueueNackOptions, SchemaOptions, StoredMemoryEvent, StoredMemoryObject, ThingDeleteResult, ThingStore, TimeSeriesOptions, TimeSeriesResult, VectorSearchHit, VectorSearchOptions } from "../types.js";
2
- export type HttpThingStoreOptions = {
3
- url: string;
4
- authToken?: string;
5
- /** Cloud instance slug for multi-instance routing. Sent as X-Instance-Slug header. */
6
- instanceSlug?: string;
7
- };
8
- export declare class HttpThingStore implements ThingStore {
9
- private readonly options;
10
- static open(urlOrOptions: string | HttpThingStoreOptions): Promise<HttpThingStore>;
11
- constructor(options: HttpThingStoreOptions);
12
- private get base();
13
- private request;
14
- put(collection: string, object: MemoryObject): Promise<StoredMemoryObject>;
15
- get<T = StoredMemoryObject>(collection: string, id: string): Promise<T | null>;
16
- getBatch<T = StoredMemoryObject>(collection: string, ids: string[]): Promise<(T | null)[]>;
17
- delete(collection: string, id: string): Promise<ThingDeleteResult>;
18
- listObjects<T = StoredMemoryObject>(collection: string, options?: ListObjectsOptions): Promise<T[]>;
19
- appendEvent(stream: string, event: MemoryEvent): Promise<StoredMemoryEvent>;
20
- listEvents<T = StoredMemoryEvent>(stream?: string, options?: ListEventsOptions): Promise<T[]>;
21
- pushJob(queue: string, payload: QueueJobPayload, options?: QueueJobOptions): Promise<QueueJob>;
22
- claimJob(queue: string, options?: QueueClaimOptions): Promise<QueueJob | null>;
23
- ackJob(queue: string, jobId: string): Promise<QueueJobResult>;
24
- nackJob(queue: string, jobId: string, options?: QueueNackOptions): Promise<QueueJobResult>;
25
- listJobs(queue: string): Promise<QueueJob[]>;
26
- listDeadJobs(queue: string): Promise<QueueJob[]>;
27
- search(query: string, options?: MemorySearchOptions): Promise<MemorySearchResult[]>;
28
- vectorSearch(collection: string, queryVector: number[], options?: VectorSearchOptions): Promise<VectorSearchHit[]>;
29
- putBatch(collection: string, objects: MemoryObject[]): Promise<StoredMemoryObject[]>;
30
- deleteBatch(collection: string, ids: string[]): Promise<number>;
31
- createLink(fromRef: string, linkType: string, toRef: string, weight?: number, metadataJson?: string): Promise<import("../types.js").Link>;
32
- deleteLink(id: string): Promise<boolean>;
33
- getLink(id: string): Promise<import("../types.js").Link | null>;
34
- getNeighbors(reference: string, direction?: import("../types.js").LinkDirection, options?: import("../types.js").LinkQueryOptions): Promise<import("../types.js").Link[]>;
35
- countObjects(): Promise<number>;
36
- countObjectsInCollection(collection: string): Promise<number>;
37
- countEvents(): Promise<number>;
38
- countActiveJobs(): Promise<number>;
39
- countDeadJobs(): Promise<number>;
40
- countLinks(): Promise<number>;
41
- listCollections(): Promise<string[]>;
42
- listStreams(): Promise<string[]>;
43
- listQueues(): Promise<string[]>;
44
- createIndex(collection: string, field: string): Promise<void>;
45
- listIndexes(): Promise<Array<[string, string]>>;
46
- close(): Promise<void>;
47
- listConnectors(): Promise<string[]>;
48
- discoverConnectorSchema(type: string, query: string, auth?: ConnectorAuth): Promise<ConnectorSchema>;
49
- connectorSync(type: string, options: ConnectorSyncOptions): Promise<ConnectorSyncResult>;
50
- aggregate(collection: string, options: AggregateOptions): Promise<AggregateResult>;
51
- timeseries(collection: string, options: TimeSeriesOptions): Promise<TimeSeriesResult>;
52
- schema(collection?: string, _options?: SchemaOptions): Promise<CollectionSchema[]>;
53
- nlqQuery(question: string, options?: NlqOptions): Promise<NlqResult>;
54
- }
55
- //# sourceMappingURL=http-thing-store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http-thing-store.d.ts","sourceRoot":"","sources":["../../src/client/http-thing-store.ts"],"names":[],"mappings":"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"}
@@ -1,233 +0,0 @@
1
- export class HttpThingStore {
2
- options;
3
- static async open(urlOrOptions) {
4
- const options = typeof urlOrOptions === "string" ? { url: urlOrOptions } : urlOrOptions;
5
- return new HttpThingStore(options);
6
- }
7
- constructor(options) {
8
- this.options = options;
9
- }
10
- get base() {
11
- const base = this.options.url.replace(/\/+$/, "");
12
- return base.endsWith("/v1") ? base : `${base}/v1`;
13
- }
14
- async request(method, path, body) {
15
- const headers = {};
16
- if (body) {
17
- headers["content-type"] = "application/json";
18
- }
19
- if (this.options.authToken) {
20
- headers.authorization = `Bearer ${this.options.authToken}`;
21
- }
22
- if (this.options.instanceSlug) {
23
- headers["x-instance-slug"] = this.options.instanceSlug;
24
- }
25
- const res = await fetch(`${this.base}${path}`, {
26
- method,
27
- headers,
28
- body: body ? JSON.stringify(body) : undefined,
29
- });
30
- const json = await res.json();
31
- if (!res.ok) {
32
- const msg = json?.error?.message ?? `HTTP ${res.status}`;
33
- throw new Error(msg);
34
- }
35
- return json.data;
36
- }
37
- async put(collection, object) {
38
- return this.request("PUT", `/objects/${encodeURIComponent(collection)}/${encodeURIComponent(object.id)}`, object);
39
- }
40
- async get(collection, id) {
41
- try {
42
- return await this.request("GET", `/objects/${encodeURIComponent(collection)}/${encodeURIComponent(id)}`);
43
- }
44
- catch (err) {
45
- if (err instanceof Error && err.message.includes("404")) {
46
- return null;
47
- }
48
- throw err;
49
- }
50
- }
51
- async getBatch(collection, ids) {
52
- return this.request("GET", `/objects/batch?collection=${encodeURIComponent(collection)}`, ids);
53
- }
54
- async delete(collection, id) {
55
- const result = await this.request("DELETE", `/objects/${encodeURIComponent(collection)}/${encodeURIComponent(id)}`);
56
- return result;
57
- }
58
- async listObjects(collection, options) {
59
- const params = new URLSearchParams({ collection });
60
- if (options?.limit) {
61
- params.set("limit", String(options.limit));
62
- }
63
- if (options?.offset) {
64
- params.set("offset", String(options.offset));
65
- }
66
- if (options?.filter) {
67
- for (const [k, v] of Object.entries(options.filter)) {
68
- params.set(`filter.${k}`, String(v));
69
- }
70
- }
71
- if (options?.sortBy) {
72
- params.set("sortBy", options.sortBy.field);
73
- if (options.sortBy.direction) {
74
- params.set("sortDir", options.sortBy.direction);
75
- }
76
- }
77
- return this.request("GET", `/objects?${params}`);
78
- }
79
- async appendEvent(stream, event) {
80
- return this.request("POST", `/events/${encodeURIComponent(stream)}`, event);
81
- }
82
- async listEvents(stream, options) {
83
- const params = new URLSearchParams();
84
- if (stream) {
85
- params.set("stream", stream);
86
- }
87
- if (options?.fromSequence) {
88
- params.set("fromSequence", String(options.fromSequence));
89
- }
90
- if (options?.limit) {
91
- params.set("limit", String(options.limit));
92
- }
93
- if (options?.since) {
94
- params.set("since", options.since);
95
- }
96
- return this.request("GET", `/events?${params}`);
97
- }
98
- async pushJob(queue, payload, options = {}) {
99
- return this.request("POST", `/queues/${encodeURIComponent(queue)}/push`, {
100
- payload,
101
- ...options,
102
- });
103
- }
104
- async claimJob(queue, options = {}) {
105
- return this.request("POST", `/queues/${encodeURIComponent(queue)}/claim`, options);
106
- }
107
- async ackJob(queue, jobId) {
108
- return this.request("POST", `/queues/${encodeURIComponent(queue)}/ack`, { jobId });
109
- }
110
- async nackJob(queue, jobId, options = {}) {
111
- return this.request("POST", `/queues/${encodeURIComponent(queue)}/nack`, { jobId, ...options });
112
- }
113
- async listJobs(queue) {
114
- return this.request("GET", `/queues/${encodeURIComponent(queue)}/jobs`);
115
- }
116
- async listDeadJobs(queue) {
117
- return this.request("GET", `/queues/${encodeURIComponent(queue)}/dead`);
118
- }
119
- async search(query, options = {}) {
120
- return this.request("POST", "/search", { query, ...options });
121
- }
122
- async vectorSearch(collection, queryVector, options = {}) {
123
- return this.request("POST", "/search/vector", {
124
- collection,
125
- vector: queryVector,
126
- topK: options.topK,
127
- filter: options.filter,
128
- });
129
- }
130
- async putBatch(collection, objects) {
131
- return this.request("PUT", `/objects/batch?collection=${encodeURIComponent(collection)}`, objects);
132
- }
133
- async deleteBatch(collection, ids) {
134
- const result = await this.request("DELETE", `/objects/batch?collection=${encodeURIComponent(collection)}`, ids);
135
- return result.deleted;
136
- }
137
- async createLink(fromRef, linkType, toRef, weight, metadataJson) {
138
- return this.request("POST", "/links", { fromRef, linkType, toRef, weight, metadataJson });
139
- }
140
- async deleteLink(id) {
141
- const result = await this.request("DELETE", `/links/${encodeURIComponent(id)}`);
142
- return result.deleted;
143
- }
144
- async getLink(id) {
145
- try {
146
- return await this.request("GET", `/links/${encodeURIComponent(id)}`);
147
- }
148
- catch (err) {
149
- if (err instanceof Error && err.message.includes("404")) {
150
- return null;
151
- }
152
- throw err;
153
- }
154
- }
155
- async getNeighbors(reference, direction = "Both", options = {}) {
156
- const params = new URLSearchParams({ reference, direction });
157
- if (options.linkType) {
158
- params.set("linkType", options.linkType);
159
- }
160
- if (options.limit) {
161
- params.set("limit", String(options.limit));
162
- }
163
- return this.request("GET", `/links?${params}`);
164
- }
165
- async countObjects() {
166
- const result = await this.request("GET", "/counts/objects");
167
- return result.count;
168
- }
169
- async countObjectsInCollection(collection) {
170
- const result = await this.request("GET", `/counts/objects/${encodeURIComponent(collection)}`);
171
- return result.count;
172
- }
173
- async countEvents() {
174
- const result = await this.request("GET", "/counts/events");
175
- return result.count;
176
- }
177
- async countActiveJobs() {
178
- const res = await this.request("GET", "/health");
179
- const counts = res;
180
- return counts?.queues ?? 0;
181
- }
182
- async countDeadJobs() {
183
- return 0;
184
- }
185
- async countLinks() {
186
- const result = await this.request("GET", "/counts/links");
187
- return result.count;
188
- }
189
- async listCollections() {
190
- return this.request("GET", "/collections");
191
- }
192
- async listStreams() {
193
- return this.request("GET", "/streams");
194
- }
195
- async listQueues() {
196
- return this.request("GET", "/queues");
197
- }
198
- async createIndex(collection, field) {
199
- await this.request("POST", "/indexes", { collection, field });
200
- }
201
- async listIndexes() {
202
- return this.request("GET", "/indexes");
203
- }
204
- async close() { }
205
- async listConnectors() {
206
- return this.request("GET", "/connectors");
207
- }
208
- async discoverConnectorSchema(type, query, auth) {
209
- const body = { query };
210
- if (auth) {
211
- body.auth = auth;
212
- }
213
- return this.request("POST", `/connectors/${encodeURIComponent(type)}/schema`, body);
214
- }
215
- async connectorSync(type, options) {
216
- return this.request("POST", `/connectors/${encodeURIComponent(type)}/pull`, options);
217
- }
218
- async aggregate(collection, options) {
219
- return this.request("POST", "/aggregate", { collection, ...options });
220
- }
221
- async timeseries(collection, options) {
222
- return this.request("POST", "/aggregate/timeseries", { collection, ...options });
223
- }
224
- async schema(collection, _options) {
225
- if (collection) {
226
- return this.request("GET", `/collections/${encodeURIComponent(collection)}/schema`);
227
- }
228
- return this.request("GET", "/collections/schema");
229
- }
230
- async nlqQuery(question, options) {
231
- return this.request("POST", "/nlq", { question, ...options });
232
- }
233
- }
@@ -1,41 +0,0 @@
1
- import type { Link, LinkDirection, LinkQueryOptions, ListEventsOptions, ListObjectsOptions, MemoryEvent, MemoryObject, MemorySearchOptions, MemorySearchResult, QueueClaimOptions, QueueJob, QueueJobOptions, QueueJobPayload, QueueJobResult, QueueNackOptions, StoredMemoryEvent, StoredMemoryObject, ThingDeleteResult, ThingStore } from "../types.js";
2
- export declare class InMemoryThingStore implements ThingStore {
3
- private objects;
4
- private events;
5
- private jobs;
6
- private links;
7
- put(collection: string, object: MemoryObject): Promise<StoredMemoryObject>;
8
- get<T = StoredMemoryObject>(collection: string, id: string): Promise<T | null>;
9
- getBatch<T = StoredMemoryObject>(collection: string, ids: string[]): Promise<(T | null)[]>;
10
- delete(_collection: string, _id: string): Promise<ThingDeleteResult>;
11
- listObjects<T = StoredMemoryObject>(collection: string, options?: ListObjectsOptions): Promise<T[]>;
12
- appendEvent(stream: string, event: MemoryEvent): Promise<StoredMemoryEvent>;
13
- listEvents<T = StoredMemoryEvent>(stream?: string, options?: ListEventsOptions): Promise<T[]>;
14
- pushJob(queue: string, payload: QueueJobPayload, options?: QueueJobOptions): Promise<QueueJob>;
15
- claimJob(queue: string, options?: QueueClaimOptions): Promise<QueueJob | null>;
16
- ackJob(queue: string, jobId: string): Promise<QueueJobResult>;
17
- nackJob(queue: string, jobId: string, options?: QueueNackOptions): Promise<QueueJobResult>;
18
- listJobs(queue: string): Promise<QueueJob[]>;
19
- listDeadJobs(queue: string): Promise<QueueJob[]>;
20
- search(_query: string, _options?: MemorySearchOptions): Promise<MemorySearchResult[]>;
21
- putBatch(collection: string, objects: MemoryObject[]): Promise<StoredMemoryObject[]>;
22
- deleteBatch(collection: string, ids: string[]): Promise<number>;
23
- createLink(fromRef: string, linkType: string, toRef: string, weight?: number, metadataJson?: string): Promise<Link>;
24
- deleteLink(id: string): Promise<boolean>;
25
- getLink(id: string): Promise<Link | null>;
26
- getNeighbors(reference: string, direction?: LinkDirection, options?: LinkQueryOptions): Promise<Link[]>;
27
- countObjects(): Promise<number>;
28
- countObjectsInCollection(collection: string): Promise<number>;
29
- countEvents(): Promise<number>;
30
- countActiveJobs(): Promise<number>;
31
- countDeadJobs(): Promise<number>;
32
- countLinks(): Promise<number>;
33
- listCollections(): Promise<string[]>;
34
- listStreams(): Promise<string[]>;
35
- listQueues(): Promise<string[]>;
36
- createIndex(_collection: string, _field: string): Promise<void>;
37
- listIndexes(): Promise<Array<[string, string]>>;
38
- close(): Promise<void>;
39
- private findJob;
40
- }
41
- //# sourceMappingURL=in-memory-thing-store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"in-memory-thing-store.d.ts","sourceRoot":"","sources":["../../src/client/in-memory-thing-store.ts"],"names":[],"mappings":"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"}
@@ -1,292 +0,0 @@
1
- const DEFAULT_LEASE_MS = 30_000;
2
- function uid() {
3
- return typeof crypto !== "undefined" && typeof crypto.randomUUID === "function"
4
- ? crypto.randomUUID()
5
- : `${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
6
- }
7
- function now() {
8
- return new Date().toISOString();
9
- }
10
- export class InMemoryThingStore {
11
- objects = new Map();
12
- events = new Map();
13
- jobs = new Map();
14
- links = new Map();
15
- async put(collection, object) {
16
- const key = `${collection}:${object.id}`;
17
- const existing = this.objects.get(key);
18
- const timestamp = now();
19
- const stored = {
20
- ...object,
21
- id: object.id,
22
- collection,
23
- createdAt: existing?.data.createdAt ?? timestamp,
24
- updatedAt: timestamp,
25
- version: (existing?.data.version ?? 0) + 1,
26
- };
27
- this.objects.set(key, { collection, data: stored });
28
- return stored;
29
- }
30
- async get(collection, id) {
31
- const row = this.objects.get(`${collection}:${id}`);
32
- return row ? row.data : null;
33
- }
34
- async getBatch(collection, ids) {
35
- return Promise.all(ids.map((id) => this.get(collection, id)));
36
- }
37
- async delete(_collection, _id) {
38
- const deleted = this.objects.delete(`${_collection}:${_id}`);
39
- return { deleted };
40
- }
41
- async listObjects(collection, options) {
42
- let items = Array.from(this.objects.values())
43
- .filter((r) => r.collection === collection)
44
- .map((r) => r.data);
45
- if (options?.filter) {
46
- const filter = options.filter;
47
- items = items.filter((obj) => Object.entries(filter).every(([k, v]) => obj[k] === v));
48
- }
49
- if (options?.sortBy) {
50
- const field = options.sortBy.field === "created_at"
51
- ? "createdAt"
52
- : options.sortBy.field === "updated_at"
53
- ? "updatedAt"
54
- : options.sortBy.field;
55
- const dir = options.sortBy.direction === "desc" ? -1 : 1;
56
- items.sort((a, b) => {
57
- const va = a[field];
58
- const vb = b[field];
59
- if (va == null) {
60
- return 1;
61
- }
62
- if (vb == null) {
63
- return -1;
64
- }
65
- return va < vb ? -dir : va > vb ? dir : 0;
66
- });
67
- }
68
- if (options?.offset) {
69
- items = items.slice(options.offset);
70
- }
71
- if (options?.limit) {
72
- items = items.slice(0, options.limit);
73
- }
74
- return items;
75
- }
76
- async appendEvent(stream, event) {
77
- const streamEvents = this.events.get(stream) ?? [];
78
- const sequence = streamEvents.length + 1;
79
- const stored = {
80
- ...event,
81
- id: String(sequence),
82
- stream,
83
- sequence,
84
- createdAt: now(),
85
- };
86
- streamEvents.push(stored);
87
- this.events.set(stream, streamEvents);
88
- return stored;
89
- }
90
- async listEvents(stream, options) {
91
- let items;
92
- if (stream) {
93
- items = this.events.get(stream) ?? [];
94
- }
95
- else {
96
- items = Array.from(this.events.values()).flat();
97
- }
98
- if (options?.fromSequence) {
99
- items = items.filter((e) => e.sequence > (options.fromSequence ?? 0));
100
- }
101
- if (options?.since) {
102
- const since = options.since;
103
- items = items.filter((e) => e.createdAt >= since);
104
- }
105
- if (options?.limit) {
106
- items = items.slice(0, options.limit);
107
- }
108
- return items;
109
- }
110
- async pushJob(queue, payload, options = {}) {
111
- const timestamp = now();
112
- const job = {
113
- id: options.idempotencyKey ?? uid(),
114
- queue,
115
- payload,
116
- status: "ready",
117
- attempts: 0,
118
- maxAttempts: options.maxAttempts ?? 3,
119
- createdAt: timestamp,
120
- availableAt: new Date(Date.now() + (options.delayMs ?? 0)).toISOString(),
121
- priority: options.priority ?? 0,
122
- };
123
- const queueJobs = this.jobs.get(queue) ?? [];
124
- queueJobs.push(job);
125
- this.jobs.set(queue, queueJobs);
126
- return job;
127
- }
128
- async claimJob(queue, options = {}) {
129
- const queueJobs = this.jobs.get(queue);
130
- if (!queueJobs) {
131
- return null;
132
- }
133
- const now_ = new Date();
134
- const ready = queueJobs.filter((c) => c.status === "ready" && c.availableAt <= now_.toISOString());
135
- if (ready.length === 0) {
136
- return null;
137
- }
138
- ready.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
139
- const job = ready[0];
140
- job.status = "leased";
141
- job.attempts += 1;
142
- job.leasedAt = now_.toISOString();
143
- job.leaseExpiresAt = new Date(now_.getTime() + (options.leaseMs ?? DEFAULT_LEASE_MS)).toISOString();
144
- return job;
145
- }
146
- async ackJob(queue, jobId) {
147
- const job = this.findJob(queue, jobId);
148
- if (!job) {
149
- return { ok: false, reason: "not_found" };
150
- }
151
- if (job.status !== "leased") {
152
- return { ok: false, reason: "not_leased" };
153
- }
154
- job.status = "completed";
155
- job.completedAt = now();
156
- return { ok: true, job };
157
- }
158
- async nackJob(queue, jobId, options = {}) {
159
- const job = this.findJob(queue, jobId);
160
- if (!job) {
161
- return { ok: false, reason: "not_found" };
162
- }
163
- if (job.status !== "leased") {
164
- return { ok: false, reason: "not_leased" };
165
- }
166
- job.lastError = options.error;
167
- if (job.attempts >= job.maxAttempts) {
168
- job.status = "dead";
169
- job.deadAt = now();
170
- }
171
- else {
172
- job.status = "ready";
173
- job.availableAt = new Date(Date.now() + (options.delayMs ?? 0)).toISOString();
174
- }
175
- return { ok: true, job };
176
- }
177
- async listJobs(queue) {
178
- return this.jobs.get(queue) ?? [];
179
- }
180
- async listDeadJobs(queue) {
181
- return (this.jobs.get(queue) ?? []).filter((j) => j.status === "dead");
182
- }
183
- async search(_query, _options = {}) {
184
- return [];
185
- }
186
- async putBatch(collection, objects) {
187
- return Promise.all(objects.map((obj) => this.put(collection, obj)));
188
- }
189
- async deleteBatch(collection, ids) {
190
- let count = 0;
191
- for (const id of ids) {
192
- const result = await this.delete(collection, id);
193
- if (result.deleted) {
194
- count++;
195
- }
196
- }
197
- return count;
198
- }
199
- async createLink(fromRef, linkType, toRef, weight, metadataJson) {
200
- const link = {
201
- id: uid(),
202
- fromRef,
203
- linkType,
204
- toRef,
205
- weight,
206
- metadataJson: metadataJson ?? "{}",
207
- createdAt: now(),
208
- };
209
- this.links.set(link.id, link);
210
- return link;
211
- }
212
- async deleteLink(id) {
213
- return this.links.delete(id);
214
- }
215
- async getLink(id) {
216
- return this.links.get(id) ?? null;
217
- }
218
- async getNeighbors(reference, direction = "Both", options = {}) {
219
- let items = Array.from(this.links.values()).filter((l) => {
220
- if (direction === "Outgoing" || direction === "Both") {
221
- if (l.fromRef === reference) {
222
- return true;
223
- }
224
- }
225
- if (direction === "Incoming" || direction === "Both") {
226
- if (l.toRef === reference) {
227
- return true;
228
- }
229
- }
230
- return false;
231
- });
232
- if (options.linkType) {
233
- items = items.filter((l) => l.linkType === options.linkType);
234
- }
235
- if (options.limit) {
236
- items = items.slice(0, options.limit);
237
- }
238
- return items;
239
- }
240
- async countObjects() {
241
- return this.objects.size;
242
- }
243
- async countObjectsInCollection(collection) {
244
- let count = 0;
245
- for (const [key] of this.objects) {
246
- if (key.startsWith(`${collection}:`)) {
247
- count++;
248
- }
249
- }
250
- return count;
251
- }
252
- async countEvents() {
253
- return Array.from(this.events.values()).reduce((acc, e) => acc + e.length, 0);
254
- }
255
- async countActiveJobs() {
256
- let active = 0;
257
- for (const jobs of this.jobs.values()) {
258
- active += jobs.filter((j) => j.status === "ready" || j.status === "leased").length;
259
- }
260
- return active;
261
- }
262
- async countDeadJobs() {
263
- let dead = 0;
264
- for (const jobs of this.jobs.values()) {
265
- dead += jobs.filter((j) => j.status === "dead").length;
266
- }
267
- return dead;
268
- }
269
- async countLinks() {
270
- return this.links.size;
271
- }
272
- async listCollections() {
273
- const collections = new Set(Array.from(this.objects.values()).map((r) => r.collection));
274
- return Array.from(collections);
275
- }
276
- async listStreams() {
277
- return Array.from(this.events.keys());
278
- }
279
- async listQueues() {
280
- return Array.from(this.jobs.keys());
281
- }
282
- async createIndex(_collection, _field) {
283
- // No-op for in-memory client store
284
- }
285
- async listIndexes() {
286
- return [];
287
- }
288
- async close() { }
289
- findJob(queue, jobId) {
290
- return (this.jobs.get(queue) ?? []).find((j) => j.id === jobId);
291
- }
292
- }
@@ -1,5 +0,0 @@
1
- export type { Link, LinkDirection, LinkQueryOptions, ListEventsOptions, ListObjectsOptions, MemoryEvent, MemoryObject, MemoryQueue, MemorySearchOptions, MemorySearchResult, QueueClaimOptions, QueueJob, QueueJobOptions, QueueJobPayload, QueueJobResult, QueueJobStatus, QueueNackOptions, SortBy, SortDirection, StoredMemoryEvent, StoredMemoryObject, ThingDConnection, ThingDeleteResult, ThingStore, } from "../types.js";
2
- export { HttpThingStore, type HttpThingStoreOptions } from "./http-thing-store.js";
3
- export { InMemoryThingStore } from "./in-memory-thing-store.js";
4
- export { openThingD, type ThingDClientOptions, } from "./thingd.js";
5
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,IAAI,EACJ,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,eAAe,EACf,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,MAAM,EACN,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EACL,UAAU,EACV,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC"}