lowlander 0.4.0 → 0.5.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.
- package/README.md +76 -22
- package/build/client/client.js +5 -0
- package/build/client/client.js.map +1 -1
- package/build/dashboard/client/main.d.ts +1 -0
- package/build/dashboard/client/main.js +623 -0
- package/build/dashboard/client/main.js.map +1 -0
- package/build/dashboard/client/shim-server.d.ts +3 -0
- package/build/dashboard/client/shim-server.js +2 -0
- package/build/dashboard/client/shim-server.js.map +1 -0
- package/build/dashboard/dashboard.html +20 -0
- package/build/dashboard/index.d.ts +18 -0
- package/build/dashboard/index.d.ts.map +1 -0
- package/build/dashboard/index.js +50 -0
- package/build/dashboard/index.js.map +1 -0
- package/build/dashboard/serve.d.ts +18 -0
- package/build/dashboard/serve.d.ts.map +1 -0
- package/build/dashboard/serve.js +53 -0
- package/build/dashboard/serve.js.map +1 -0
- package/build/dashboard/server.d.ts +82 -0
- package/build/dashboard/server.d.ts.map +1 -0
- package/build/dashboard/server.js +248 -0
- package/build/dashboard/server.js.map +1 -0
- package/build/examples/helloworld/.edinburgh/commit_worker.log +3162 -0
- package/build/examples/helloworld/.edinburgh/data.mdb +0 -0
- package/build/examples/helloworld/.edinburgh/lock.mdb +0 -0
- package/build/examples/helloworld/client/index.html +1 -1
- package/build/examples/helloworld/client/js/base.css +1 -0
- package/build/examples/helloworld/client/js/base.js +217 -71
- package/build/examples/helloworld/client/js/base.js.map +1 -1
- package/build/examples/helloworld/server/api.d.ts +4 -2
- package/build/examples/helloworld/server/api.d.ts.map +1 -1
- package/build/examples/helloworld/server/api.js +19 -8
- package/build/examples/helloworld/server/api.js.map +1 -1
- package/build/examples/helloworld/server/main.d.ts +1 -1
- package/build/examples/helloworld/server/main.d.ts.map +1 -1
- package/build/examples/helloworld/server/main.js +6 -17
- package/build/examples/helloworld/server/main.js.map +1 -1
- package/build/server/password.d.ts +10 -0
- package/build/server/password.d.ts.map +1 -0
- package/build/server/password.js +38 -0
- package/build/server/password.js.map +1 -0
- package/build/server/server.d.ts +2 -0
- package/build/server/server.d.ts.map +1 -1
- package/build/server/server.js +21 -2
- package/build/server/server.js.map +1 -1
- package/build/server/wshandler.d.ts +7 -1
- package/build/server/wshandler.d.ts.map +1 -1
- package/build/server/wshandler.js +54 -14
- package/build/server/wshandler.js.map +1 -1
- package/build/tsconfig.client.tsbuildinfo +1 -1
- package/build/tsconfig.server.tsbuildinfo +1 -1
- package/client/client.ts +6 -1
- package/dashboard/build-bundle.ts +38 -0
- package/dashboard/client/index.html +12 -0
- package/dashboard/client/main.ts +566 -0
- package/dashboard/client/shim-server.ts +5 -0
- package/dashboard/index.ts +49 -0
- package/dashboard/server.ts +255 -0
- package/package.json +22 -11
- package/server/server.ts +18 -2
- package/server/wshandler.ts +57 -13
- package/skill/SKILL.md +52 -4
- package/skill/getStreamTypesForModel.md +7 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import * as E from 'edinburgh';
|
|
2
|
+
import { timingSafeEqual } from 'crypto';
|
|
3
|
+
import { ServerProxy, getStreamTypesForModel, warpsocket } from '../server/server.js';
|
|
4
|
+
import { getMainApi, getPassword } from '../server/wshandler.js';
|
|
5
|
+
// `modelRegistry` is a documented export of edinburgh's models module but is
|
|
6
|
+
// not re-exported from the package entry. Reach it by URL relative to the
|
|
7
|
+
// resolved package main — works in both Bun (.ts) and Node (built .js).
|
|
8
|
+
const _modelsModule = await import(new URL('./models.js', import.meta.resolve('edinburgh')).href);
|
|
9
|
+
const modelRegistry = _modelsModule.modelRegistry;
|
|
10
|
+
function passwordOk(provided) {
|
|
11
|
+
const expected = getPassword();
|
|
12
|
+
if (typeof provided !== 'string' || provided.length !== expected.length)
|
|
13
|
+
return false;
|
|
14
|
+
return timingSafeEqual(Buffer.from(provided), Buffer.from(expected));
|
|
15
|
+
}
|
|
16
|
+
function describeType(type) {
|
|
17
|
+
const linked = type.getLinkedModel();
|
|
18
|
+
return {
|
|
19
|
+
kind: type.kind,
|
|
20
|
+
display: type.toString(),
|
|
21
|
+
linkedModel: linked?.tableName,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function describeIndex(index) {
|
|
25
|
+
const fields = Array.from(index._indexFields.keys());
|
|
26
|
+
return {
|
|
27
|
+
fields,
|
|
28
|
+
fieldTypes: fields.map(f => describeType(index._indexFields.get(f))),
|
|
29
|
+
computed: !!index._computeFn,
|
|
30
|
+
kind: index._getTypeName(),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function describeModel(Model) {
|
|
34
|
+
const fields = [];
|
|
35
|
+
for (const [name, cfg] of Object.entries(Model.fields)) {
|
|
36
|
+
fields.push({
|
|
37
|
+
name,
|
|
38
|
+
type: describeType(cfg.type),
|
|
39
|
+
description: cfg.description,
|
|
40
|
+
hasDefault: cfg.default !== undefined,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
const indexes = [{
|
|
44
|
+
name: '(primary)',
|
|
45
|
+
info: describeIndex(Model),
|
|
46
|
+
}];
|
|
47
|
+
for (const [name, idx] of Object.entries(Model._secondaries || {})) {
|
|
48
|
+
indexes.push({ name, info: describeIndex(idx) });
|
|
49
|
+
}
|
|
50
|
+
const streamTypes = getStreamTypesForModel(Model).map((ST) => ({
|
|
51
|
+
id: ST.id,
|
|
52
|
+
fields: ST.fields,
|
|
53
|
+
cache: ST.cache,
|
|
54
|
+
}));
|
|
55
|
+
return {
|
|
56
|
+
tableName: Model.tableName,
|
|
57
|
+
fields,
|
|
58
|
+
indexes,
|
|
59
|
+
streamTypes,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function serializeValue(v, depth = 0) {
|
|
63
|
+
if (v === null || v === undefined)
|
|
64
|
+
return v;
|
|
65
|
+
if (v instanceof E.Model) {
|
|
66
|
+
const cls = v.constructor;
|
|
67
|
+
const tn = cls.tableName || cls.name;
|
|
68
|
+
const pkBytes = v.getPrimaryKey?.();
|
|
69
|
+
const pkArr = pkBytes && cls._pkToArray ? cls._pkToArray(pkBytes) : null;
|
|
70
|
+
const pk = pkArr ? (pkArr.length === 1 ? pkArr[0] : pkArr) : null;
|
|
71
|
+
return { __ref: tn, pk };
|
|
72
|
+
}
|
|
73
|
+
if (v instanceof Uint8Array)
|
|
74
|
+
return Array.from(v.slice(0, 64)).map(b => b.toString(16).padStart(2, '0')).join('');
|
|
75
|
+
if (v instanceof Date)
|
|
76
|
+
return v.toISOString();
|
|
77
|
+
if (v instanceof Set)
|
|
78
|
+
return depth > 2 ? `Set(${v.size})` : Array.from(v).map(x => serializeValue(x, depth + 1));
|
|
79
|
+
if (Array.isArray(v))
|
|
80
|
+
return depth > 2 ? `Array(${v.length})` : v.map(x => serializeValue(x, depth + 1));
|
|
81
|
+
if (typeof v === 'object') {
|
|
82
|
+
if (depth > 2)
|
|
83
|
+
return '...';
|
|
84
|
+
const out = {};
|
|
85
|
+
for (const k of Object.keys(v))
|
|
86
|
+
out[k] = serializeValue(v[k], depth + 1);
|
|
87
|
+
return out;
|
|
88
|
+
}
|
|
89
|
+
return v;
|
|
90
|
+
}
|
|
91
|
+
function instanceToPlain(instance) {
|
|
92
|
+
const Model = instance.constructor;
|
|
93
|
+
const out = {};
|
|
94
|
+
for (const fieldName of Object.keys(Model.fields)) {
|
|
95
|
+
try {
|
|
96
|
+
out[fieldName] = serializeValue(instance[fieldName]);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
out[fieldName] = `<error: ${err?.message || err}>`;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
104
|
+
function modelByName(name) {
|
|
105
|
+
const Model = modelRegistry[name];
|
|
106
|
+
if (!Model)
|
|
107
|
+
throw new Error(`Unknown model: ${name}`);
|
|
108
|
+
return Model;
|
|
109
|
+
}
|
|
110
|
+
function findIndex(Model, indexName) {
|
|
111
|
+
if (indexName === '(primary)')
|
|
112
|
+
return Model;
|
|
113
|
+
const idx = Model._secondaries?.[indexName];
|
|
114
|
+
if (!idx)
|
|
115
|
+
throw new Error(`Unknown index ${indexName} on ${Model.tableName}`);
|
|
116
|
+
return idx;
|
|
117
|
+
}
|
|
118
|
+
// =====================================================================
|
|
119
|
+
class DashboardAPI {
|
|
120
|
+
listModels() {
|
|
121
|
+
return Object.keys(modelRegistry).sort().map(name => ({
|
|
122
|
+
tableName: name,
|
|
123
|
+
indexCount: 1 + Object.keys(modelRegistry[name]._secondaries || {}).length,
|
|
124
|
+
fieldCount: Object.keys(modelRegistry[name].fields).length,
|
|
125
|
+
streamTypeCount: getStreamTypesForModel(modelRegistry[name]).length,
|
|
126
|
+
}));
|
|
127
|
+
}
|
|
128
|
+
getModel(name) {
|
|
129
|
+
return describeModel(modelByName(name));
|
|
130
|
+
}
|
|
131
|
+
listApiMethods() {
|
|
132
|
+
const api = getMainApi();
|
|
133
|
+
if (!api)
|
|
134
|
+
return [];
|
|
135
|
+
const out = [];
|
|
136
|
+
for (const key of Object.keys(api).sort()) {
|
|
137
|
+
if (key === '_dashboard' || key.startsWith('_'))
|
|
138
|
+
continue;
|
|
139
|
+
const v = api[key];
|
|
140
|
+
out.push({ name: key, kind: typeof v === 'function' ? 'function' : 'value' });
|
|
141
|
+
}
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
getApiMethodSource(name) {
|
|
145
|
+
const api = getMainApi();
|
|
146
|
+
const fn = api && api[name];
|
|
147
|
+
if (typeof fn !== 'function')
|
|
148
|
+
return undefined;
|
|
149
|
+
try {
|
|
150
|
+
// Bundlers usually preserve enough source for a useful preview
|
|
151
|
+
const s = String(fn);
|
|
152
|
+
return s.length > 4000 ? s.slice(0, 4000) + '\n/* … truncated */' : s;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
findRecords(modelName, indexName, opts = {}) {
|
|
159
|
+
const Model = modelByName(modelName);
|
|
160
|
+
const idx = findIndex(Model, indexName);
|
|
161
|
+
const fieldNames = Array.from(idx._indexFields.keys());
|
|
162
|
+
const findOpts = {};
|
|
163
|
+
if (opts.search !== undefined && opts.search !== '') {
|
|
164
|
+
findOpts.is = opts.search;
|
|
165
|
+
}
|
|
166
|
+
if (opts.reverse)
|
|
167
|
+
findOpts.reverse = true;
|
|
168
|
+
const limit = Math.min(opts.limit ?? 10, 1000);
|
|
169
|
+
let iter;
|
|
170
|
+
try {
|
|
171
|
+
iter = idx.find(findOpts);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return { rows: [], indexFields: fieldNames, scanned: 0 };
|
|
175
|
+
}
|
|
176
|
+
const results = [];
|
|
177
|
+
let scanned = 0;
|
|
178
|
+
for (const row of iter) {
|
|
179
|
+
scanned++;
|
|
180
|
+
const plain = instanceToPlain(row);
|
|
181
|
+
const cls = row.constructor;
|
|
182
|
+
const pkBytes = row.getPrimaryKey ? row.getPrimaryKey() : null;
|
|
183
|
+
const pkArr = pkBytes && cls._pkToArray ? cls._pkToArray(pkBytes) : null;
|
|
184
|
+
const pk = pkArr ? (pkArr.length === 1 ? pkArr[0] : pkArr) : null;
|
|
185
|
+
results.push({
|
|
186
|
+
pk: serializeValue(pk),
|
|
187
|
+
values: plain,
|
|
188
|
+
});
|
|
189
|
+
if (results.length >= limit)
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
rows: results,
|
|
194
|
+
indexFields: fieldNames,
|
|
195
|
+
scanned,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
getRecord(modelName, pk) {
|
|
199
|
+
const Model = modelByName(modelName);
|
|
200
|
+
const pkArgs = Array.isArray(pk) ? pk : [pk];
|
|
201
|
+
const instance = Model.get(...pkArgs);
|
|
202
|
+
if (!instance)
|
|
203
|
+
return undefined;
|
|
204
|
+
return instanceToPlain(instance);
|
|
205
|
+
}
|
|
206
|
+
streamRecord(modelName, streamTypeId, pk) {
|
|
207
|
+
const Model = modelByName(modelName);
|
|
208
|
+
const ST = getStreamTypesForModel(Model).find((s) => s.id === streamTypeId);
|
|
209
|
+
if (!ST)
|
|
210
|
+
throw new Error(`No stream type with id ${streamTypeId} for ${modelName}`);
|
|
211
|
+
const pkArgs = Array.isArray(pk) ? pk : [pk];
|
|
212
|
+
const instance = Model.get(...pkArgs);
|
|
213
|
+
if (!instance)
|
|
214
|
+
throw new Error('Record not found');
|
|
215
|
+
return new ST(instance);
|
|
216
|
+
}
|
|
217
|
+
getDebugState(mode) {
|
|
218
|
+
return warpsocket.getDebugState(mode);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const DashboardProxyValue = 'authenticated';
|
|
222
|
+
/**
|
|
223
|
+
* RPC entry point. Re-export this from your top-level api file:
|
|
224
|
+
*
|
|
225
|
+
* ```ts
|
|
226
|
+
* export { _dashboard } from 'lowlander/dashboard';
|
|
227
|
+
* ```
|
|
228
|
+
*
|
|
229
|
+
* On first call, a password is generated (or reused from the
|
|
230
|
+
* `LOWLANDER_DASHBOARD_PASSWORD` env var) and printed to the server console.
|
|
231
|
+
*/
|
|
232
|
+
export function _dashboard(password) {
|
|
233
|
+
if (!passwordOk(password)) {
|
|
234
|
+
throw new Error('Invalid dashboard password');
|
|
235
|
+
}
|
|
236
|
+
return new ServerProxy(new DashboardAPI(), DashboardProxyValue);
|
|
237
|
+
}
|
|
238
|
+
// Convenience stream type used internally so live record viewing works
|
|
239
|
+
// for arbitrary models without the developer having to pre-create one.
|
|
240
|
+
// (Built lazily per model+selection because createStreamType is keyed on the
|
|
241
|
+
// shape of the selection.)
|
|
242
|
+
const allFieldsStreams = new Map();
|
|
243
|
+
export function _dashboardAllFieldsStream(modelName) {
|
|
244
|
+
// Currently unused; kept for future "view live" feature.
|
|
245
|
+
void allFieldsStreams;
|
|
246
|
+
void modelName;
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../dashboard/server.ts"],"names":[],"mappings":"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"}
|