@casual-simulation/aux-records 3.7.0 → 3.7.1-alpha.17809973136
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/MemoryStore.d.ts +2 -1
- package/MemoryStore.js +30 -0
- package/MemoryStore.js.map +1 -1
- package/PolicyController.d.ts +27 -0
- package/PolicyController.js +2 -1
- package/PolicyController.js.map +1 -1
- package/PolicyStore.d.ts +13 -0
- package/PolicyStore.js +16 -0
- package/PolicyStore.js.map +1 -1
- package/RecordsController.d.ts +0 -5
- package/RecordsServer.d.ts +61 -5
- package/RecordsServer.js +61 -3
- package/RecordsServer.js.map +1 -1
- package/ServerConfig.d.ts +413 -0
- package/ServerConfig.js +32 -0
- package/ServerConfig.js.map +1 -1
- package/SubscriptionConfigBuilder.d.ts +4 -1
- package/SubscriptionConfigBuilder.js +14 -0
- package/SubscriptionConfigBuilder.js.map +1 -1
- package/SubscriptionConfiguration.d.ts +287 -0
- package/SubscriptionConfiguration.js +41 -0
- package/SubscriptionConfiguration.js.map +1 -1
- package/crud/CrudRecordsController.d.ts +19 -2
- package/crud/CrudRecordsController.js +13 -6
- package/crud/CrudRecordsController.js.map +1 -1
- package/crud/CrudRecordsControllerTests.d.ts +3 -3
- package/crud/CrudRecordsControllerTests.js +15 -4
- package/crud/CrudRecordsControllerTests.js.map +1 -1
- package/database/DatabaseInterface.d.ts +103 -0
- package/database/DatabaseInterface.js +19 -0
- package/database/DatabaseInterface.js.map +1 -0
- package/database/DatabaseRecordsController.d.ts +92 -0
- package/database/DatabaseRecordsController.js +167 -0
- package/database/DatabaseRecordsController.js.map +1 -0
- package/database/DatabaseRecordsStore.d.ts +40 -0
- package/database/DatabaseRecordsStore.js +2 -0
- package/database/DatabaseRecordsStore.js.map +1 -0
- package/database/DatabaseUtils.d.ts +12 -0
- package/database/DatabaseUtils.js +33 -0
- package/database/DatabaseUtils.js.map +1 -0
- package/database/MemoryDatabaseInterface.d.ts +14 -0
- package/database/MemoryDatabaseInterface.js +119 -0
- package/database/MemoryDatabaseInterface.js.map +1 -0
- package/database/MemoryDatabaseRecordsStore.d.ts +10 -0
- package/database/MemoryDatabaseRecordsStore.js +38 -0
- package/database/MemoryDatabaseRecordsStore.js.map +1 -0
- package/database/SqliteDatabaseInterface.d.ts +16 -0
- package/database/SqliteDatabaseInterface.js +135 -0
- package/database/SqliteDatabaseInterface.js.map +1 -0
- package/database/TursoDatabaseInterface.d.ts +31 -0
- package/database/TursoDatabaseInterface.js +221 -0
- package/database/TursoDatabaseInterface.js.map +1 -0
- package/database/index.d.ts +7 -0
- package/database/index.js +24 -0
- package/database/index.js.map +1 -0
- package/package.json +6 -4
- package/packages/PackageRecordsController.d.ts +3 -2
- package/packages/PackageRecordsController.js +30 -1
- package/packages/PackageRecordsController.js.map +1 -1
- package/search/SearchRecordsController.d.ts +6 -6
- package/search/SearchRecordsController.js.map +1 -1
- package/webhooks/WebhookRecordsController.d.ts +3 -1
- package/webhooks/WebhookRecordsController.js +21 -19
- package/webhooks/WebhookRecordsController.js.map +1 -1
- package/websockets/InstRecordsStore.d.ts +7 -0
- package/websockets/SplitInstRecordsStore.d.ts +1 -0
- package/websockets/SplitInstRecordsStore.js +3 -0
- package/websockets/SplitInstRecordsStore.js.map +1 -1
- package/websockets/WebsocketController.d.ts +1 -1
- package/websockets/WebsocketController.js +45 -29
- 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":"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"}
|
|
@@ -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.
|
|
3
|
+
"version": "3.7.1-alpha.17809973136",
|
|
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.
|
|
41
|
+
"@casual-simulation/aux-common": "^3.7.1-alpha.17809973136",
|
|
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.
|
|
45
|
+
"@casual-simulation/timesync": "^3.7.1-alpha.17809973136",
|
|
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": "
|
|
70
|
+
"gitHead": "354e44de04bd26e9f898a4e893b704f4fe6d02e8"
|
|
69
71
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
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
|
|
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":"
|
|
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?:
|
|
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
|
/**
|