@casual-simulation/aux-records 3.7.0 → 3.7.1-alpha.17585632798

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 (71) hide show
  1. package/MemoryStore.d.ts +2 -1
  2. package/MemoryStore.js +30 -0
  3. package/MemoryStore.js.map +1 -1
  4. package/PolicyController.d.ts +27 -0
  5. package/PolicyController.js +2 -1
  6. package/PolicyController.js.map +1 -1
  7. package/PolicyStore.d.ts +13 -0
  8. package/PolicyStore.js +16 -0
  9. package/PolicyStore.js.map +1 -1
  10. package/RecordsController.d.ts +0 -5
  11. package/RecordsServer.d.ts +61 -5
  12. package/RecordsServer.js +61 -3
  13. package/RecordsServer.js.map +1 -1
  14. package/ServerConfig.d.ts +413 -0
  15. package/ServerConfig.js +32 -0
  16. package/ServerConfig.js.map +1 -1
  17. package/SubscriptionConfigBuilder.d.ts +4 -1
  18. package/SubscriptionConfigBuilder.js +14 -0
  19. package/SubscriptionConfigBuilder.js.map +1 -1
  20. package/SubscriptionConfiguration.d.ts +287 -0
  21. package/SubscriptionConfiguration.js +41 -0
  22. package/SubscriptionConfiguration.js.map +1 -1
  23. package/crud/CrudRecordsController.d.ts +19 -2
  24. package/crud/CrudRecordsController.js +13 -6
  25. package/crud/CrudRecordsController.js.map +1 -1
  26. package/crud/CrudRecordsControllerTests.d.ts +3 -3
  27. package/crud/CrudRecordsControllerTests.js +15 -4
  28. package/crud/CrudRecordsControllerTests.js.map +1 -1
  29. package/database/DatabaseInterface.d.ts +103 -0
  30. package/database/DatabaseInterface.js +19 -0
  31. package/database/DatabaseInterface.js.map +1 -0
  32. package/database/DatabaseRecordsController.d.ts +92 -0
  33. package/database/DatabaseRecordsController.js +167 -0
  34. package/database/DatabaseRecordsController.js.map +1 -0
  35. package/database/DatabaseRecordsStore.d.ts +40 -0
  36. package/database/DatabaseRecordsStore.js +2 -0
  37. package/database/DatabaseRecordsStore.js.map +1 -0
  38. package/database/DatabaseUtils.d.ts +12 -0
  39. package/database/DatabaseUtils.js +33 -0
  40. package/database/DatabaseUtils.js.map +1 -0
  41. package/database/MemoryDatabaseInterface.d.ts +14 -0
  42. package/database/MemoryDatabaseInterface.js +119 -0
  43. package/database/MemoryDatabaseInterface.js.map +1 -0
  44. package/database/MemoryDatabaseRecordsStore.d.ts +10 -0
  45. package/database/MemoryDatabaseRecordsStore.js +38 -0
  46. package/database/MemoryDatabaseRecordsStore.js.map +1 -0
  47. package/database/SqliteDatabaseInterface.d.ts +16 -0
  48. package/database/SqliteDatabaseInterface.js +135 -0
  49. package/database/SqliteDatabaseInterface.js.map +1 -0
  50. package/database/TursoDatabaseInterface.d.ts +31 -0
  51. package/database/TursoDatabaseInterface.js +221 -0
  52. package/database/TursoDatabaseInterface.js.map +1 -0
  53. package/database/index.d.ts +7 -0
  54. package/database/index.js +24 -0
  55. package/database/index.js.map +1 -0
  56. package/package.json +6 -4
  57. package/packages/PackageRecordsController.d.ts +3 -2
  58. package/packages/PackageRecordsController.js +30 -1
  59. package/packages/PackageRecordsController.js.map +1 -1
  60. package/search/SearchRecordsController.d.ts +6 -6
  61. package/search/SearchRecordsController.js.map +1 -1
  62. package/webhooks/WebhookRecordsController.d.ts +3 -1
  63. package/webhooks/WebhookRecordsController.js +21 -19
  64. package/webhooks/WebhookRecordsController.js.map +1 -1
  65. package/websockets/InstRecordsStore.d.ts +7 -0
  66. package/websockets/SplitInstRecordsStore.d.ts +1 -0
  67. package/websockets/SplitInstRecordsStore.js +3 -0
  68. package/websockets/SplitInstRecordsStore.js.map +1 -1
  69. package/websockets/WebsocketController.d.ts +1 -1
  70. package/websockets/WebsocketController.js +45 -29
  71. package/websockets/WebsocketController.js.map +1 -1
@@ -0,0 +1,135 @@
1
+ /* CasualOS is a set of web-based tools designed to facilitate the creation of real-time, multi-user, context-aware interactive experiences.
2
+ *
3
+ * Copyright (c) 2019-2025 Casual Simulation, Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as
7
+ * published by the Free Software Foundation, either version 3 of the
8
+ * License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU Affero General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
19
+ if (kind === "m") throw new TypeError("Private method is not writable");
20
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
21
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
22
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
23
+ };
24
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
25
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
26
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
27
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
28
+ };
29
+ var _SqliteDatabaseInterface_encryptionKey;
30
+ import { failure, success, } from '@casual-simulation/aux-common';
31
+ import BetterSQLite3 from 'libsql';
32
+ import path from 'node:path';
33
+ import { rm } from 'node:fs/promises';
34
+ import { existsSync } from 'node:fs';
35
+ /**
36
+ * Defines a database interface that uses in-memory SQLite databases.
37
+ */
38
+ export class SqliteDatabaseInterface {
39
+ constructor(folder, encryptionKey = null) {
40
+ _SqliteDatabaseInterface_encryptionKey.set(this, null);
41
+ this._folderPath = folder;
42
+ __classPrivateFieldSet(this, _SqliteDatabaseInterface_encryptionKey, encryptionKey, "f");
43
+ }
44
+ async createDatabase(databaseName, options) {
45
+ const fullPath = this._getDatabasePath(databaseName);
46
+ return success({
47
+ filePath: fullPath,
48
+ });
49
+ }
50
+ _getDatabasePath(databaseName) {
51
+ const sanitized = sanitizeDatabaseName(databaseName);
52
+ return path.resolve(this._folderPath, `${sanitized}.sqlite.db`);
53
+ }
54
+ async deleteDatabase(databaseName) {
55
+ const fullPath = this._getDatabasePath(databaseName);
56
+ if (existsSync(fullPath)) {
57
+ await rm(fullPath, {
58
+ force: true,
59
+ });
60
+ }
61
+ return success();
62
+ }
63
+ async query(database, statements, readonly, automaticTransaction) {
64
+ var _a;
65
+ const options = {
66
+ readonly,
67
+ encryptionKey: (_a = __classPrivateFieldGet(this, _SqliteDatabaseInterface_encryptionKey, "f")) !== null && _a !== void 0 ? _a : undefined,
68
+ };
69
+ const db = new BetterSQLite3(database.filePath, options);
70
+ try {
71
+ const results = [];
72
+ let hasTransaction = false;
73
+ if (automaticTransaction) {
74
+ db.exec('BEGIN;');
75
+ hasTransaction = true;
76
+ }
77
+ for (let s of statements) {
78
+ const q = db.prepare(s.query);
79
+ if (q.reader) {
80
+ q.raw(true);
81
+ const columns = q.columns();
82
+ const rows = q.all(s.params);
83
+ results.push({
84
+ columns: columns.map((c) => c.name),
85
+ rows,
86
+ affectedRowCount: 0,
87
+ });
88
+ }
89
+ else {
90
+ if (readonly && !q.readonly) {
91
+ if (hasTransaction) {
92
+ db.exec('ROLLBACK;');
93
+ }
94
+ return failure({
95
+ errorCode: 'invalid_request',
96
+ errorMessage: 'Queries that modify data are not allowed in read-only mode.',
97
+ });
98
+ }
99
+ const result = q.run(s.params);
100
+ results.push({
101
+ columns: [],
102
+ rows: [],
103
+ affectedRowCount: result.changes,
104
+ lastInsertId: result.lastInsertRowid ||
105
+ undefined,
106
+ });
107
+ }
108
+ }
109
+ if (hasTransaction) {
110
+ db.exec('COMMIT;');
111
+ }
112
+ return success(results);
113
+ }
114
+ catch (err) {
115
+ if (err instanceof BetterSQLite3.SqliteError) {
116
+ return failure({
117
+ errorCode: 'invalid_request',
118
+ errorMessage: err.message,
119
+ });
120
+ }
121
+ else {
122
+ throw err;
123
+ }
124
+ }
125
+ finally {
126
+ db.close();
127
+ }
128
+ }
129
+ dispose() { }
130
+ }
131
+ _SqliteDatabaseInterface_encryptionKey = new WeakMap();
132
+ function sanitizeDatabaseName(name) {
133
+ return name.replace(/[^a-zA-Z0-9_-]/g, '_');
134
+ }
135
+ //# sourceMappingURL=SqliteDatabaseInterface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqliteDatabaseInterface.js","sourceRoot":"","sources":["SqliteDatabaseInterface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type Result, type SimpleError } from '@casual-simulation/aux-common';
2
+ import type { CreateDatabaseOptions, DatabaseInterface, DatabaseStatement, QueryResult, TursoDatabase } from './DatabaseInterface';
3
+ export interface TursoDatabaseInterfaceOptions {
4
+ /**
5
+ * The auth token to use to authenticate to the API.
6
+ */
7
+ authToken: string;
8
+ /**
9
+ * The organization that operations should be performed in.
10
+ */
11
+ organizationSlug: string;
12
+ /**
13
+ * The name of the group that new databases should be created in.
14
+ */
15
+ groupName: string;
16
+ }
17
+ /**
18
+ * Defines a database interface that uses databases hosted on turso.tech.
19
+ */
20
+ export declare class TursoDatabaseInterface implements DatabaseInterface<TursoDatabase> {
21
+ private _organizationSlug;
22
+ private _groupName;
23
+ private _authToken;
24
+ private _headers;
25
+ constructor(options: TursoDatabaseInterfaceOptions);
26
+ createDatabase(databaseName: string, options: CreateDatabaseOptions): Promise<Result<TursoDatabase, SimpleError>>;
27
+ deleteDatabase(databaseName: string): Promise<Result<void, SimpleError>>;
28
+ query(database: TursoDatabase, statements: DatabaseStatement[], readonly: boolean, automaticTransaction: boolean): Promise<Result<QueryResult[], SimpleError>>;
29
+ dispose(): void;
30
+ }
31
+ //# sourceMappingURL=TursoDatabaseInterface.d.ts.map
@@ -0,0 +1,221 @@
1
+ /* CasualOS is a set of web-based tools designed to facilitate the creation of real-time, multi-user, context-aware interactive experiences.
2
+ *
3
+ * Copyright (c) 2019-2025 Casual Simulation, Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as
7
+ * published by the Free Software Foundation, either version 3 of the
8
+ * License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU Affero General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ import { failure, success, } from '@casual-simulation/aux-common';
25
+ import { traced } from '../tracing/TracingDecorators';
26
+ import { z } from 'zod';
27
+ import { createClient, LibsqlError } from '@libsql/client';
28
+ const TRACE_NAME = 'TursoDatabaseInterface';
29
+ const createDatabaseSchema = z.object({
30
+ database: z.object({
31
+ Hostname: z.string().min(1),
32
+ DbId: z.string().min(1),
33
+ }),
34
+ });
35
+ const createAuthTokenSchema = z.object({
36
+ jwt: z.string().min(1),
37
+ });
38
+ /**
39
+ * Defines a database interface that uses databases hosted on turso.tech.
40
+ */
41
+ export class TursoDatabaseInterface {
42
+ constructor(options) {
43
+ this._organizationSlug = options.organizationSlug;
44
+ this._groupName = options.groupName;
45
+ this._authToken = options.authToken;
46
+ this._headers = {
47
+ 'Content-Type': 'application/json',
48
+ Authorization: `Bearer ${this._authToken}`,
49
+ };
50
+ }
51
+ async createDatabase(databaseName, options) {
52
+ console.log(`[${TRACE_NAME}] Creating database:`, databaseName, options);
53
+ const createUrl = new URL(`https://api.turso.tech/v1/organizations/${encodeURIComponent(this._organizationSlug)}/databases`);
54
+ const body = {
55
+ group: this._groupName,
56
+ name: databaseName,
57
+ };
58
+ if (options.maxSizeBytes) {
59
+ body.size_limit = options.maxSizeBytes;
60
+ }
61
+ const result = await fetch(createUrl, {
62
+ method: 'POST',
63
+ body: JSON.stringify(body),
64
+ headers: this._headers,
65
+ });
66
+ if (!result.ok) {
67
+ console.error('Failed to create database:', result.status, await result.text());
68
+ return failure({
69
+ errorCode: 'server_error',
70
+ errorMessage: `A server error occurred while creating the database.`,
71
+ });
72
+ }
73
+ const data = await result.json();
74
+ const parsed = createDatabaseSchema.safeParse(data);
75
+ if (parsed.success === false) {
76
+ console.error('Failed to parse create database response:', parsed.error);
77
+ return failure({
78
+ errorCode: 'server_error',
79
+ errorMessage: `A server error occurred while creating the database.`,
80
+ });
81
+ }
82
+ const databaseHostname = parsed.data.database.Hostname;
83
+ const databaseId = parsed.data.database.DbId;
84
+ // https://api.turso.tech/v1/organizations/{organizationSlug}/databases/{databaseName}/auth/tokens
85
+ const createAuthTokenUrl = new URL(`https://api.turso.tech/v1/organizations/${encodeURIComponent(this._organizationSlug)}/databases/${encodeURIComponent(databaseName)}/auth/tokens`);
86
+ const readTokenUrl = new URL(createAuthTokenUrl);
87
+ readTokenUrl.searchParams.set('authorization', 'read-only');
88
+ const writeTokenUrl = new URL(createAuthTokenUrl);
89
+ writeTokenUrl.searchParams.set('authorization', 'full-access');
90
+ const [readTokenResult, fullAccessResult] = await Promise.all([
91
+ fetch(readTokenUrl, {
92
+ method: 'POST',
93
+ headers: this._headers,
94
+ }),
95
+ fetch(writeTokenUrl, {
96
+ method: 'POST',
97
+ headers: this._headers,
98
+ }),
99
+ ]);
100
+ if (!readTokenResult.ok) {
101
+ console.error('Failed to create read token:', readTokenResult.status, await readTokenResult.text());
102
+ return failure({
103
+ errorCode: 'server_error',
104
+ errorMessage: `A server error occurred while creating the database.`,
105
+ });
106
+ }
107
+ if (!fullAccessResult.ok) {
108
+ console.error('Failed to create full access token:', fullAccessResult.status, await fullAccessResult.text());
109
+ return failure({
110
+ errorCode: 'server_error',
111
+ errorMessage: `A server error occurred while creating the database.`,
112
+ });
113
+ }
114
+ const readTokenData = await readTokenResult.json();
115
+ const fullAccessData = await fullAccessResult.json();
116
+ const parsedReadToken = createAuthTokenSchema.safeParse(readTokenData);
117
+ const parsedFullAccessToken = createAuthTokenSchema.safeParse(fullAccessData);
118
+ if (parsedReadToken.success === false) {
119
+ console.error('Failed to parse create read token response:', parsedReadToken.error);
120
+ return failure({
121
+ errorCode: 'server_error',
122
+ errorMessage: `A server error occurred while creating the database.`,
123
+ });
124
+ }
125
+ if (parsedFullAccessToken.success === false) {
126
+ console.error('Failed to parse create full access token response:', parsedFullAccessToken.error);
127
+ return failure({
128
+ errorCode: 'server_error',
129
+ errorMessage: `A server error occurred while creating the database.`,
130
+ });
131
+ }
132
+ console.log(`[${TRACE_NAME}] Database created:`, databaseName);
133
+ const database = {
134
+ name: databaseName,
135
+ databaseHostname: databaseHostname,
136
+ databaseId: databaseId,
137
+ tursoDatabaseReadToken: parsedReadToken.data.jwt,
138
+ tursoDatabaseWriteToken: parsedFullAccessToken.data.jwt,
139
+ };
140
+ return success(database);
141
+ }
142
+ async deleteDatabase(databaseName) {
143
+ console.log(`[${TRACE_NAME}] Deleting database:`, databaseName);
144
+ const deleteUrl = new URL(`https://api.turso.tech/v1/organizations/${encodeURIComponent(this._organizationSlug)}/databases/${encodeURIComponent(databaseName)}`);
145
+ const result = await fetch(deleteUrl, {
146
+ method: 'DELETE',
147
+ headers: this._headers,
148
+ });
149
+ if (!result.ok) {
150
+ console.error('Failed to delete database:', result.status, await result.text());
151
+ return failure({
152
+ errorCode: 'server_error',
153
+ errorMessage: `A server error occurred while deleting the database.`,
154
+ });
155
+ }
156
+ console.log(`[${TRACE_NAME}] Database deleted:`, databaseName);
157
+ return success();
158
+ }
159
+ async query(database, statements, readonly, automaticTransaction) {
160
+ if (!automaticTransaction) {
161
+ return failure({
162
+ errorCode: 'invalid_request',
163
+ errorMessage: 'Only automatic transactions are supported for Turso-hosted databases.',
164
+ });
165
+ }
166
+ const client = createClient({
167
+ url: `libsql://${database.databaseHostname}`,
168
+ authToken: readonly
169
+ ? database.tursoDatabaseReadToken
170
+ : database.tursoDatabaseWriteToken,
171
+ concurrency: 1,
172
+ });
173
+ try {
174
+ const results = await client.batch(statements.map((s) => ({
175
+ sql: s.query,
176
+ args: s.params,
177
+ })), readonly ? 'read' : 'write');
178
+ return success(results.map((r) => ({
179
+ columns: r.columns,
180
+ rows: r.rows.map((r) => {
181
+ const row = new Array(r.length);
182
+ for (let i = 0; i < r.length; i++) {
183
+ row[i] = r[i];
184
+ }
185
+ return row;
186
+ }),
187
+ affectedRowCount: r.rowsAffected,
188
+ lastInsertId: r.lastInsertRowid !== null &&
189
+ r.lastInsertRowid !== undefined
190
+ ? Number(r.lastInsertRowid)
191
+ : undefined,
192
+ })));
193
+ }
194
+ catch (err) {
195
+ if (err instanceof LibsqlError) {
196
+ console.error(`[${TRACE_NAME}] LibSQL query error:`, err);
197
+ return failure({
198
+ errorCode: 'invalid_request',
199
+ errorMessage: err.message,
200
+ });
201
+ }
202
+ else {
203
+ throw err;
204
+ }
205
+ }
206
+ finally {
207
+ client.close();
208
+ }
209
+ }
210
+ dispose() { }
211
+ }
212
+ __decorate([
213
+ traced(TRACE_NAME)
214
+ ], TursoDatabaseInterface.prototype, "createDatabase", null);
215
+ __decorate([
216
+ traced(TRACE_NAME)
217
+ ], TursoDatabaseInterface.prototype, "deleteDatabase", null);
218
+ __decorate([
219
+ traced(TRACE_NAME)
220
+ ], TursoDatabaseInterface.prototype, "query", null);
221
+ //# sourceMappingURL=TursoDatabaseInterface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TursoDatabaseInterface.js","sourceRoot":"","sources":["TursoDatabaseInterface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;;;;;;;AAEH,OAAO,EACH,OAAO,EACP,OAAO,GAGV,MAAM,+BAA+B,CAAC;AAQvC,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE3D,MAAM,UAAU,GAAG,wBAAwB,CAAC;AAE5C,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KAC1B,CAAC;CACL,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACzB,CAAC,CAAC;AAmBH;;GAEG;AACH,MAAM,OAAO,sBAAsB;IAQ/B,YAAY,OAAsC;QAC9C,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QAClD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;QACpC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;QAEpC,IAAI,CAAC,QAAQ,GAAG;YACZ,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,IAAI,CAAC,UAAU,EAAE;SAC7C,CAAC;IACN,CAAC;IAGK,AAAN,KAAK,CAAC,cAAc,CAChB,YAAoB,EACpB,OAA8B;QAE9B,OAAO,CAAC,GAAG,CACP,IAAI,UAAU,sBAAsB,EACpC,YAAY,EACZ,OAAO,CACV,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,GAAG,CACrB,2CAA2C,kBAAkB,CACzD,IAAI,CAAC,iBAAiB,CACzB,YAAY,CAChB,CAAC;QACF,MAAM,IAAI,GAAQ;YACd,KAAK,EAAE,IAAI,CAAC,UAAU;YACtB,IAAI,EAAE,YAAY;SACrB,CAAC;QAEF,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;QAC3C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YAClC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,OAAO,EAAE,IAAI,CAAC,QAAQ;SACzB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACT,4BAA4B,EAC5B,MAAM,CAAC,MAAM,EACb,MAAM,MAAM,CAAC,IAAI,EAAE,CACtB,CAAC;YACF,OAAO,OAAO,CAAC;gBACX,SAAS,EAAE,cAAc;gBACzB,YAAY,EAAE,sDAAsD;aACvE,CAAC,CAAC;QACP,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAEjC,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CACT,2CAA2C,EAC3C,MAAM,CAAC,KAAK,CACf,CAAC;YACF,OAAO,OAAO,CAAC;gBACX,SAAS,EAAE,cAAc;gBACzB,YAAY,EAAE,sDAAsD;aACvE,CAAC,CAAC;QACP,CAAC;QAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACvD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAE7C,kGAAkG;QAClG,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAC9B,2CAA2C,kBAAkB,CACzD,IAAI,CAAC,iBAAiB,CACzB,cAAc,kBAAkB,CAAC,YAAY,CAAC,cAAc,CAChE,CAAC;QAEF,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC;QACjD,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAE5D,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAClD,aAAa,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;QAE/D,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC1D,KAAK,CAAC,YAAY,EAAE;gBAChB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,QAAQ;aACzB,CAAC;YACF,KAAK,CAAC,aAAa,EAAE;gBACjB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,QAAQ;aACzB,CAAC;SACL,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CACT,8BAA8B,EAC9B,eAAe,CAAC,MAAM,EACtB,MAAM,eAAe,CAAC,IAAI,EAAE,CAC/B,CAAC;YACF,OAAO,OAAO,CAAC;gBACX,SAAS,EAAE,cAAc;gBACzB,YAAY,EAAE,sDAAsD;aACvE,CAAC,CAAC;QACP,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,EAAE,EAAE,CAAC;YACvB,OAAO,CAAC,KAAK,CACT,qCAAqC,EACrC,gBAAgB,CAAC,MAAM,EACvB,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAChC,CAAC;YACF,OAAO,OAAO,CAAC;gBACX,SAAS,EAAE,cAAc;gBACzB,YAAY,EAAE,sDAAsD;aACvE,CAAC,CAAC;QACP,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC;QACnD,MAAM,cAAc,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,CAAC;QACrD,MAAM,eAAe,GAAG,qBAAqB,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACvE,MAAM,qBAAqB,GACvB,qBAAqB,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAEpD,IAAI,eAAe,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACpC,OAAO,CAAC,KAAK,CACT,6CAA6C,EAC7C,eAAe,CAAC,KAAK,CACxB,CAAC;YACF,OAAO,OAAO,CAAC;gBACX,SAAS,EAAE,cAAc;gBACzB,YAAY,EAAE,sDAAsD;aACvE,CAAC,CAAC;QACP,CAAC;QAED,IAAI,qBAAqB,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC1C,OAAO,CAAC,KAAK,CACT,oDAAoD,EACpD,qBAAqB,CAAC,KAAK,CAC9B,CAAC;YACF,OAAO,OAAO,CAAC;gBACX,SAAS,EAAE,cAAc;gBACzB,YAAY,EAAE,sDAAsD;aACvE,CAAC,CAAC;QACP,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,UAAU,qBAAqB,EAAE,YAAY,CAAC,CAAC;QAE/D,MAAM,QAAQ,GAAkB;YAC5B,IAAI,EAAE,YAAY;YAClB,gBAAgB,EAAE,gBAAgB;YAClC,UAAU,EAAE,UAAU;YACtB,sBAAsB,EAAE,eAAe,CAAC,IAAI,CAAC,GAAG;YAChD,uBAAuB,EAAE,qBAAqB,CAAC,IAAI,CAAC,GAAG;SAC1D,CAAC;QAEF,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAGK,AAAN,KAAK,CAAC,cAAc,CAChB,YAAoB;QAEpB,OAAO,CAAC,GAAG,CAAC,IAAI,UAAU,sBAAsB,EAAE,YAAY,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,IAAI,GAAG,CACrB,2CAA2C,kBAAkB,CACzD,IAAI,CAAC,iBAAiB,CACzB,cAAc,kBAAkB,CAAC,YAAY,CAAC,EAAE,CACpD,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YAClC,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,IAAI,CAAC,QAAQ;SACzB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACT,4BAA4B,EAC5B,MAAM,CAAC,MAAM,EACb,MAAM,MAAM,CAAC,IAAI,EAAE,CACtB,CAAC;YACF,OAAO,OAAO,CAAC;gBACX,SAAS,EAAE,cAAc;gBACzB,YAAY,EAAE,sDAAsD;aACvE,CAAC,CAAC;QACP,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,UAAU,qBAAqB,EAAE,YAAY,CAAC,CAAC;QAE/D,OAAO,OAAO,EAAE,CAAC;IACrB,CAAC;IAGK,AAAN,KAAK,CAAC,KAAK,CACP,QAAuB,EACvB,UAA+B,EAC/B,QAAiB,EACjB,oBAA6B;QAE7B,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACxB,OAAO,OAAO,CAAC;gBACX,SAAS,EAAE,iBAAiB;gBAC5B,YAAY,EACR,uEAAuE;aAC9E,CAAC,CAAC;QACP,CAAC;QAED,MAAM,MAAM,GAAG,YAAY,CAAC;YACxB,GAAG,EAAE,YAAY,QAAQ,CAAC,gBAAgB,EAAE;YAC5C,SAAS,EAAE,QAAQ;gBACf,CAAC,CAAC,QAAQ,CAAC,sBAAsB;gBACjC,CAAC,CAAC,QAAQ,CAAC,uBAAuB;YACtC,WAAW,EAAE,CAAC;SACjB,CAAC,CAAC;QAEH,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAC9B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnB,GAAG,EAAE,CAAC,CAAC,KAAK;gBACZ,IAAI,EAAE,CAAC,CAAC,MAAe;aAC1B,CAAC,CAAC,EACH,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAC9B,CAAC;YAEF,OAAO,OAAO,CACV,OAAO,CAAC,GAAG,CACP,CAAC,CAAC,EAAE,EAAE,CACF,CAAC;gBACG,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACnB,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;oBAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBAChC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;oBACD,OAAO,GAAG,CAAC;gBACf,CAAC,CAAC;gBACF,gBAAgB,EAAE,CAAC,CAAC,YAAY;gBAChC,YAAY,EACR,CAAC,CAAC,eAAe,KAAK,IAAI;oBAC1B,CAAC,CAAC,eAAe,KAAK,SAAS;oBAC3B,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC;oBAC3B,CAAC,CAAC,SAAS;aACC,CAAA,CAC/B,CACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;gBAC7B,OAAO,CAAC,KAAK,CAAC,IAAI,UAAU,uBAAuB,EAAE,GAAG,CAAC,CAAC;gBAC1D,OAAO,OAAO,CAAC;oBACX,SAAS,EAAE,iBAAiB;oBAC5B,YAAY,EAAE,GAAG,CAAC,OAAO;iBAC5B,CAAC,CAAC;YACP,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG,CAAC;YACd,CAAC;QACL,CAAC;gBAAS,CAAC;YACP,MAAM,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;IACL,CAAC;IAED,OAAO,KAAI,CAAC;CACf;AAxPS;IADL,MAAM,CAAC,UAAU,CAAC;4DAiJlB;AAGK;IADL,MAAM,CAAC,UAAU,CAAC;4DA+BlB;AAGK;IADL,MAAM,CAAC,UAAU,CAAC;mDAkElB"}
@@ -0,0 +1,7 @@
1
+ export * from './DatabaseRecordsStore';
2
+ export * from './DatabaseRecordsController';
3
+ export * from './MemoryDatabaseRecordsStore';
4
+ export * from './DatabaseInterface';
5
+ export * from './SqliteDatabaseInterface';
6
+ export * from './TursoDatabaseInterface';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,24 @@
1
+ /* CasualOS is a set of web-based tools designed to facilitate the creation of real-time, multi-user, context-aware interactive experiences.
2
+ *
3
+ * Copyright (c) 2019-2025 Casual Simulation, Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as
7
+ * published by the Free Software Foundation, either version 3 of the
8
+ * License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU Affero General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ export * from './DatabaseRecordsStore';
19
+ export * from './DatabaseRecordsController';
20
+ export * from './MemoryDatabaseRecordsStore';
21
+ export * from './DatabaseInterface';
22
+ export * from './SqliteDatabaseInterface';
23
+ export * from './TursoDatabaseInterface';
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@casual-simulation/aux-records",
3
- "version": "3.7.0",
3
+ "version": "3.7.1-alpha.17585632798",
4
4
  "description": "Helpers and managers used by the CasualOS records system.",
5
5
  "keywords": [],
6
6
  "author": "Casual Simulation, Inc.",
@@ -38,12 +38,13 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "@anthropic-ai/sdk": "0.24.3",
41
- "@casual-simulation/aux-common": "^3.7.0",
41
+ "@casual-simulation/aux-common": "^3.7.1-alpha.17585632798",
42
42
  "@casual-simulation/crypto": "^3.5.0",
43
43
  "@casual-simulation/fast-json-stable-stringify": "^3.5.0",
44
44
  "@casual-simulation/rate-limit-redis": "^3.4.0",
45
- "@casual-simulation/timesync": "^3.7.0",
45
+ "@casual-simulation/timesync": "^3.7.1-alpha.17585632798",
46
46
  "@google/generative-ai": "0.11.3",
47
+ "@libsql/client": "^0.15.14",
47
48
  "@opentelemetry/api": "^1.9.0",
48
49
  "@opentelemetry/resources": "^1.25.1",
49
50
  "@opentelemetry/semantic-conventions": "^1.25.1",
@@ -54,6 +55,7 @@
54
55
  "es-toolkit": "1.39.10",
55
56
  "hash.js": "1.1.7",
56
57
  "jose": "5.4.0",
58
+ "libsql": "^0.5.20",
57
59
  "livekit-server-sdk": "2.7.2",
58
60
  "luxon": "3.4.4",
59
61
  "mime": "2.4.6",
@@ -65,5 +67,5 @@
65
67
  "yjs": "13.6.8",
66
68
  "zod": "3.22.4"
67
69
  },
68
- "gitHead": "d4436ee3adb292c986779e358d1987405424b3be"
70
+ "gitHead": "ba5ff68160476c7738ed151f19780d72db073410"
69
71
  }
@@ -1,4 +1,4 @@
1
- import type { ActionKinds } from '@casual-simulation/aux-common';
1
+ import { type ActionKinds, type Result, type SimpleError } from '@casual-simulation/aux-common';
2
2
  import type { AuthorizationContext, AuthorizeUserAndInstancesSuccess, AuthorizeUserAndInstancesForResourcesSuccess } from '../PolicyController';
3
3
  import type { CrudRecordsConfiguration, CheckSubscriptionMetricsFailure, CheckSubscriptionMetricsSuccess } from '../crud';
4
4
  import { CrudRecordsController } from '../crud';
@@ -15,7 +15,8 @@ export type PackageRecordInput = Omit<PackageRecord, 'id'>;
15
15
  */
16
16
  export declare class PackageRecordsController extends CrudRecordsController<PackageRecordInput, PackageRecord, PackageRecordsStore> {
17
17
  constructor(config: PackageRecordsConfiguration);
18
- protected _checkSubscriptionMetrics(action: ActionKinds, context: AuthorizationContext, authorization: AuthorizeUserAndInstancesSuccess | AuthorizeUserAndInstancesForResourcesSuccess, item?: PackageRecord): Promise<PackageRecordsSubscriptionMetricsResult>;
18
+ protected _transformInputItem(item: PackageRecordInput, existingItem: PackageRecord, action: ActionKinds, context: AuthorizationContext, authorization: AuthorizeUserAndInstancesSuccess | AuthorizeUserAndInstancesForResourcesSuccess, metrics: CheckSubscriptionMetricsSuccess): Promise<Result<PackageRecord, SimpleError>>;
19
+ protected _checkSubscriptionMetrics(action: ActionKinds, context: AuthorizationContext, authorization: AuthorizeUserAndInstancesSuccess | AuthorizeUserAndInstancesForResourcesSuccess, item?: PackageRecordInput): Promise<PackageRecordsSubscriptionMetricsResult>;
19
20
  }
20
21
  export type PackageRecordsSubscriptionMetricsResult = PackageRecordsSubscriptionMetricsSuccess | CheckSubscriptionMetricsFailure;
21
22
  export interface PackageRecordsSubscriptionMetricsSuccess extends CheckSubscriptionMetricsSuccess {
@@ -1,3 +1,21 @@
1
+ /* CasualOS is a set of web-based tools designed to facilitate the creation of real-time, multi-user, context-aware interactive experiences.
2
+ *
3
+ * Copyright (c) 2019-2025 Casual Simulation, Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as
7
+ * published by the Free Software Foundation, either version 3 of the
8
+ * License, or (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU Affero General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License
16
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
17
+ */
18
+ import { success, } from '@casual-simulation/aux-common';
1
19
  import { CrudRecordsController } from '../crud';
2
20
  import { getPackageFeatures } from '../SubscriptionConfiguration';
3
21
  import { v7 as uuid } from 'uuid';
@@ -13,6 +31,18 @@ export class PackageRecordsController extends CrudRecordsController {
13
31
  resourceKind: 'package',
14
32
  });
15
33
  }
34
+ async _transformInputItem(item, existingItem, action, context, authorization, metrics) {
35
+ if (action === 'create') {
36
+ return success({
37
+ ...item,
38
+ id: uuid(),
39
+ });
40
+ }
41
+ return success({
42
+ ...existingItem,
43
+ markers: item.markers,
44
+ });
45
+ }
16
46
  async _checkSubscriptionMetrics(action, context, authorization, item) {
17
47
  const config = await this.config.getSubscriptionConfiguration();
18
48
  const metrics = await this.store.getSubscriptionMetrics({
@@ -36,7 +66,6 @@ export class PackageRecordsController extends CrudRecordsController {
36
66
  errorMessage: 'The maximum number of package items has been reached for your subscription.',
37
67
  };
38
68
  }
39
- item.id = uuid();
40
69
  }
41
70
  return {
42
71
  success: true,
@@ -1 +1 @@
1
- {"version":3,"file":"PackageRecordsController.js","sourceRoot":"","sources":["PackageRecordsController.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAUhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAElC,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAa9C;;GAEG;AACH,MAAM,OAAO,wBAAyB,SAAQ,qBAI7C;IACG,YAAY,MAAmC;QAC3C,KAAK,CAAC;YACF,GAAG,MAAM;YACT,IAAI,EAAE,0BAA0B;YAChC,YAAY,EAAE,SAAS;SAC1B,CAAC,CAAC;IACP,CAAC;IAES,KAAK,CAAC,yBAAyB,CACrC,MAAmB,EACnB,OAA6B,EAC7B,aAEkD,EAClD,IAAoB;QAEpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC;QAChE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC;YACpD,OAAO,EAAE,OAAO,CAAC,aAAa;YAC9B,QAAQ,EAAE,OAAO,CAAC,cAAc;SACnC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,kBAAkB,CAC/B,MAAM,EACN,OAAO,CAAC,kBAAkB,EAC1B,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,gBAAgB,EACxB,OAAO,CAAC,oBAAoB,EAC5B,OAAO,CAAC,kBAAkB,CAC7B,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,gBAAgB;gBAC3B,YAAY,EAAE,iDAAiD;aAClE,CAAC;QACN,CAAC;QAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACtB,IACI,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ;gBACrC,OAAO,CAAC,UAAU,IAAI,QAAQ,CAAC,QAAQ,EACzC,CAAC;gBACC,OAAO;oBACH,OAAO,EAAE,KAAK;oBACd,SAAS,EAAE,4BAA4B;oBACvC,YAAY,EACR,6EAA6E;iBACpF,CAAC;YACN,CAAC;YAED,IAAK,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC;QACtB,CAAC;QAED,OAAO;YACH,OAAO,EAAE,IAAI;YACb,MAAM;YACN,OAAO;YACP,QAAQ;SACX,CAAC;IACN,CAAC;CACJ"}
1
+ {"version":3,"file":"PackageRecordsController.js","sourceRoot":"","sources":["PackageRecordsController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EACH,OAAO,GAIV,MAAM,+BAA+B,CAAC;AAYvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAUhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAElC,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAa9C;;GAEG;AACH,MAAM,OAAO,wBAAyB,SAAQ,qBAI7C;IACG,YAAY,MAAmC;QAC3C,KAAK,CAAC;YACF,GAAG,MAAM;YACT,IAAI,EAAE,0BAA0B;YAChC,YAAY,EAAE,SAAS;SAC1B,CAAC,CAAC;IACP,CAAC;IAES,KAAK,CAAC,mBAAmB,CAC/B,IAAwB,EACxB,YAA2B,EAC3B,MAAmB,EACnB,OAA6B,EAC7B,aAEkD,EAClD,OAAwC;QAExC,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,OAAO,CAAC;gBACX,GAAG,IAAI;gBACP,EAAE,EAAE,IAAI,EAAE;aACb,CAAC,CAAC;QACP,CAAC;QAED,OAAO,OAAO,CAAC;YACX,GAAG,YAAY;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;SACxB,CAAC,CAAC;IACP,CAAC;IAES,KAAK,CAAC,yBAAyB,CACrC,MAAmB,EACnB,OAA6B,EAC7B,aAEkD,EAClD,IAAyB;QAEzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC;QAChE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC;YACpD,OAAO,EAAE,OAAO,CAAC,aAAa;YAC9B,QAAQ,EAAE,OAAO,CAAC,cAAc;SACnC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,kBAAkB,CAC/B,MAAM,EACN,OAAO,CAAC,kBAAkB,EAC1B,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,gBAAgB,EACxB,OAAO,CAAC,oBAAoB,EAC5B,OAAO,CAAC,kBAAkB,CAC7B,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,gBAAgB;gBAC3B,YAAY,EAAE,iDAAiD;aAClE,CAAC;QACN,CAAC;QAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACtB,IACI,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ;gBACrC,OAAO,CAAC,UAAU,IAAI,QAAQ,CAAC,QAAQ,EACzC,CAAC;gBACC,OAAO;oBACH,OAAO,EAAE,KAAK;oBACd,SAAS,EAAE,4BAA4B;oBACvC,YAAY,EACR,6EAA6E;iBACpF,CAAC;YACN,CAAC;QACL,CAAC;QAED,OAAO;YACH,OAAO,EAAE,IAAI;YACb,MAAM;YACN,OAAO;YACP,QAAQ;SACX,CAAC;IACN,CAAC;CACJ"}
@@ -38,7 +38,7 @@ export declare class SearchRecordsController extends CrudRecordsController<Searc
38
38
  search(request: SearchRequest): Promise<SearchResult>;
39
39
  protected _convertItemToResult(item: SearchRecord, context: AuthorizationContext, action: ActionKinds): Promise<SearchRecordOutput>;
40
40
  protected _transformInputItem(item: SearchRecordInput, existingItem: SearchRecord, action: ActionKinds, context: AuthorizationContext, authorization: AuthorizeUserAndInstancesSuccess | AuthorizeUserAndInstancesForResourcesSuccess): Promise<Result<SearchRecord, SimpleError>>;
41
- protected _checkSubscriptionMetrics(action: ActionKinds, context: AuthorizationContext, authorization: AuthorizeUserAndInstancesSuccess | AuthorizeUserAndInstancesForResourcesSuccess, item?: SearchRecord): Promise<SearchRecordsSubscriptionMetricsResult>;
41
+ protected _checkSubscriptionMetrics(action: ActionKinds, context: AuthorizationContext, authorization: AuthorizeUserAndInstancesSuccess | AuthorizeUserAndInstancesForResourcesSuccess, item?: SearchRecordInput): Promise<SearchRecordsSubscriptionMetricsResult>;
42
42
  }
43
43
  export type SearchRecordsSubscriptionMetricsResult = SearchRecordsSubscriptionMetricsSuccess | CheckSubscriptionMetricsFailure;
44
44
  export interface SearchRecordsSubscriptionMetricsSuccess extends CheckSubscriptionMetricsSuccess {
@@ -314,23 +314,23 @@ export interface SearchCollectionSchemaField extends Omit<SearchCollectionField,
314
314
  export declare const SEARCH_DOCUMENT_SCHEMA: z.ZodEffects<z.ZodObject<{
315
315
  recordName: z.ZodNullable<z.ZodOptional<z.ZodString>>;
316
316
  address: z.ZodNullable<z.ZodOptional<z.ZodString>>;
317
- resourceKind: z.ZodNullable<z.ZodOptional<z.ZodEnum<["data", "file", "event", "marker", "role", "inst", "loom", "ai.sloyd", "ai.hume", "ai.openai.realtime", "webhook", "notification", "package", "package.version", "search"]>>>;
317
+ resourceKind: z.ZodNullable<z.ZodOptional<z.ZodEnum<["data", "file", "event", "marker", "role", "inst", "loom", "ai.sloyd", "ai.hume", "ai.openai.realtime", "webhook", "notification", "package", "package.version", "search", "database"]>>>;
318
318
  }, "strip", z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodArray<z.ZodString, "many">, z.ZodArray<z.ZodNumber, "many">, z.ZodArray<z.ZodBoolean, "many">, z.ZodEffects<z.ZodObject<{}, "strip", z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, z.objectOutputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">, z.objectInputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">>, z.objectOutputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">, z.objectInputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">>]>, z.objectOutputType<{
319
319
  recordName: z.ZodNullable<z.ZodOptional<z.ZodString>>;
320
320
  address: z.ZodNullable<z.ZodOptional<z.ZodString>>;
321
- resourceKind: z.ZodNullable<z.ZodOptional<z.ZodEnum<["data", "file", "event", "marker", "role", "inst", "loom", "ai.sloyd", "ai.hume", "ai.openai.realtime", "webhook", "notification", "package", "package.version", "search"]>>>;
321
+ resourceKind: z.ZodNullable<z.ZodOptional<z.ZodEnum<["data", "file", "event", "marker", "role", "inst", "loom", "ai.sloyd", "ai.hume", "ai.openai.realtime", "webhook", "notification", "package", "package.version", "search", "database"]>>>;
322
322
  }, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodArray<z.ZodString, "many">, z.ZodArray<z.ZodNumber, "many">, z.ZodArray<z.ZodBoolean, "many">, z.ZodEffects<z.ZodObject<{}, "strip", z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, z.objectOutputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">, z.objectInputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">>, z.objectOutputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">, z.objectInputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">>]>, "strip">, z.objectInputType<{
323
323
  recordName: z.ZodNullable<z.ZodOptional<z.ZodString>>;
324
324
  address: z.ZodNullable<z.ZodOptional<z.ZodString>>;
325
- resourceKind: z.ZodNullable<z.ZodOptional<z.ZodEnum<["data", "file", "event", "marker", "role", "inst", "loom", "ai.sloyd", "ai.hume", "ai.openai.realtime", "webhook", "notification", "package", "package.version", "search"]>>>;
325
+ resourceKind: z.ZodNullable<z.ZodOptional<z.ZodEnum<["data", "file", "event", "marker", "role", "inst", "loom", "ai.sloyd", "ai.hume", "ai.openai.realtime", "webhook", "notification", "package", "package.version", "search", "database"]>>>;
326
326
  }, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodArray<z.ZodString, "many">, z.ZodArray<z.ZodNumber, "many">, z.ZodArray<z.ZodBoolean, "many">, z.ZodEffects<z.ZodObject<{}, "strip", z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, z.objectOutputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">, z.objectInputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">>, z.objectOutputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">, z.objectInputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">>]>, "strip">>, z.objectOutputType<{
327
327
  recordName: z.ZodNullable<z.ZodOptional<z.ZodString>>;
328
328
  address: z.ZodNullable<z.ZodOptional<z.ZodString>>;
329
- resourceKind: z.ZodNullable<z.ZodOptional<z.ZodEnum<["data", "file", "event", "marker", "role", "inst", "loom", "ai.sloyd", "ai.hume", "ai.openai.realtime", "webhook", "notification", "package", "package.version", "search"]>>>;
329
+ resourceKind: z.ZodNullable<z.ZodOptional<z.ZodEnum<["data", "file", "event", "marker", "role", "inst", "loom", "ai.sloyd", "ai.hume", "ai.openai.realtime", "webhook", "notification", "package", "package.version", "search", "database"]>>>;
330
330
  }, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodArray<z.ZodString, "many">, z.ZodArray<z.ZodNumber, "many">, z.ZodArray<z.ZodBoolean, "many">, z.ZodEffects<z.ZodObject<{}, "strip", z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, z.objectOutputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">, z.objectInputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">>, z.objectOutputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">, z.objectInputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">>]>, "strip">, z.objectInputType<{
331
331
  recordName: z.ZodNullable<z.ZodOptional<z.ZodString>>;
332
332
  address: z.ZodNullable<z.ZodOptional<z.ZodString>>;
333
- resourceKind: z.ZodNullable<z.ZodOptional<z.ZodEnum<["data", "file", "event", "marker", "role", "inst", "loom", "ai.sloyd", "ai.hume", "ai.openai.realtime", "webhook", "notification", "package", "package.version", "search"]>>>;
333
+ resourceKind: z.ZodNullable<z.ZodOptional<z.ZodEnum<["data", "file", "event", "marker", "role", "inst", "loom", "ai.sloyd", "ai.hume", "ai.openai.realtime", "webhook", "notification", "package", "package.version", "search", "database"]>>>;
334
334
  }, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodArray<z.ZodString, "many">, z.ZodArray<z.ZodNumber, "many">, z.ZodArray<z.ZodBoolean, "many">, z.ZodEffects<z.ZodObject<{}, "strip", z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, z.objectOutputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">, z.objectInputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">>, z.objectOutputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">, z.objectInputType<{}, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "strip">>]>, "strip">>;
335
335
  export interface SearchRecordInput extends Omit<SearchRecord, 'collectionName' | 'searchApiKey'> {
336
336
  /**