@feltdb/core 0.9.1 → 0.10.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/dist/cli/commands.js +19 -21
- package/dist/cli/development-session.js +16 -0
- package/dist/cli/studio-artifact.js +33 -0
- package/dist/create/package-versions.js +1 -1
- package/dist/create/server-source/crates/feltdb/src/acceptance_tests.rs +8 -1
- package/dist/create/server-source/crates/feltdb/src/application.rs +16 -0
- package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +21 -22
- package/dist/create/server-source/crates/feltdb/src/lib.rs +451 -33
- package/dist/create/server-source/crates/feltdb/src/state_contract.rs +48 -3
- package/dist/create/server-source/crates/feltdb/src/state_model.rs +569 -4
- package/dist/create/server-source/crates/feltdb/src/state_trigger.rs +1 -0
- package/dist/create/server-source/crates/feltdb/src/versioned_object_substrate.rs +708 -0
- package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +1 -0
- package/dist/create/server-source/crates/feltdb/src/workload.rs +480 -44
- package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_evidence.rs +123 -0
- package/dist/create/server-source/crates/feltdb/tests/generalized_version_control_substrate_completion.rs +281 -0
- package/dist/create/server-source/crates/feltdb/tests/production_readiness_contract.rs +15 -3
- package/dist/create/server-source/crates/feltdb/tests/revision_retention_boundary_evidence.rs +28 -18
- package/dist/create/server-source/crates/feltdb/tests/storage_independent_versioned_object_substrate.rs +328 -0
- package/dist/create/server-source/crates/feltdb/tests/workload_envelope_contract.rs +20 -3
- package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +14 -4
- package/dist/create/server-source/crates/feltdb-server/src/backup.rs +0 -4
- package/dist/create/server-source/crates/feltdb-server/src/canonical_principals.rs +1093 -0
- package/dist/create/server-source/crates/feltdb-server/src/causal.rs +905 -144
- package/dist/create/server-source/crates/feltdb-server/src/connections.rs +9 -6
- package/dist/create/server-source/crates/feltdb-server/src/control_plane.rs +90 -0
- package/dist/create/server-source/crates/feltdb-server/src/lib.rs +1 -0
- package/dist/create/server-source/crates/feltdb-server/src/main.rs +408 -74
- package/dist/create/server-source/crates/feltdb-server/src/principals.rs +9 -501
- package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +22 -0
- package/dist/create/server-source/crates/feltdb-server/tests/principal_tenant_migration.rs +247 -0
- package/dist/db.d.ts +6 -5
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +18 -24
- package/dist/deployment.d.ts.map +1 -1
- package/dist/deployment.js +4 -2
- package/dist/embedded-transaction.d.ts.map +1 -1
- package/dist/embedded-transaction.js +4 -0
- package/dist/error-codes.d.ts +12 -0
- package/dist/error-codes.d.ts.map +1 -1
- package/dist/error-codes.js +20 -2
- package/dist/feltdb.d.ts +4 -0
- package/dist/feltdb.d.ts.map +1 -1
- package/dist/file-db.d.ts +10 -0
- package/dist/file-db.d.ts.map +1 -1
- package/dist/file-db.js +18 -0
- package/dist/http-db.d.ts +4 -0
- package/dist/http-db.d.ts.map +1 -1
- package/dist/http-db.js +73 -12
- package/dist/index-core.d.ts +1 -0
- package/dist/index-core.d.ts.map +1 -1
- package/dist/index-core.js +1 -0
- package/dist/public-contract.d.ts +112 -0
- package/dist/public-contract.d.ts.map +1 -0
- package/dist/public-contract.js +125 -0
- package/dist/studio/app.d.ts +23 -0
- package/dist/studio/app.d.ts.map +1 -1
- package/dist/studio/components/ContractInspector.d.ts +5 -0
- package/dist/studio/components/ContractInspector.d.ts.map +1 -1
- package/dist/studio/components/SettingsPanel.d.ts +4 -1
- package/dist/studio/components/SettingsPanel.d.ts.map +1 -1
- package/dist/studio/components/index.js +4 -4
- package/dist/studio/{components-CehkcX_k.js → components-CJFgdKG6.js} +322 -303
- package/dist/studio/control-plane/Data.d.ts.map +1 -1
- package/dist/studio/control-plane/Instance.d.ts +10 -0
- package/dist/studio/control-plane/Instance.d.ts.map +1 -1
- package/dist/studio/control-plane/Operations.d.ts +3 -0
- package/dist/studio/control-plane/Operations.d.ts.map +1 -1
- package/dist/studio/control-plane/State.d.ts.map +1 -1
- package/dist/studio/control-plane/index.d.ts +4 -2
- package/dist/studio/control-plane/index.d.ts.map +1 -1
- package/dist/studio/control-plane/index.js +2 -2
- package/dist/studio/control-plane-DP8ljTDO.js +3207 -0
- package/dist/studio/index.js +96 -75
- package/dist/studio/utils/api.d.ts +1 -1
- package/dist/studio/utils/api.d.ts.map +1 -1
- package/dist/studio/utils/control-plane-api.d.ts +12 -1
- package/dist/studio/utils/control-plane-api.d.ts.map +1 -1
- package/dist/studio/utils/control-plane-api.js +1 -1
- package/dist/studio/utils/index.js +16 -16
- package/dist/studio/utils/service-api.d.ts +8 -0
- package/dist/studio/utils/service-api.d.ts.map +1 -1
- package/dist/studio/utils/service-api.js +15 -12
- package/dist/studio-app/assets/{feltdb_wasm-DksXDnLa.js → feltdb_wasm-CfNb3IoF.js} +1 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-D9d3gY-E.wasm +0 -0
- package/dist/studio-app/assets/index-SDXdROi1.js +30 -0
- package/dist/studio-app/feltdb-studio.json +6 -0
- package/dist/studio-app/index.html +1 -1
- package/dist/transaction.d.ts +9 -1
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +6 -2
- package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
- package/dist/workspace/local-development-authority.d.ts +8 -0
- package/dist/workspace/local-development-authority.d.ts.map +1 -1
- package/dist/workspace/local-development-authority.js +136 -1
- package/package.json +2 -2
- package/dist/studio/control-plane-D6TT2fCQ.js +0 -3064
- package/dist/studio-app/assets/feltdb_wasm_bg-Yy4QRHJT.wasm +0 -0
- package/dist/studio-app/assets/index-CZ55nLgp.js +0 -30
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
<!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#17211b"/><title>FeltDB Studio</title> <script type="module" crossorigin src="/assets/index-
|
|
1
|
+
<!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#17211b"/><title>FeltDB Studio</title> <script type="module" crossorigin src="/assets/index-SDXdROi1.js"></script>
|
|
2
2
|
<link rel="stylesheet" crossorigin href="/assets/index-BrsF-kWL.css">
|
|
3
3
|
</head><body><div id="root"></div></body></html>
|
package/dist/transaction.d.ts
CHANGED
|
@@ -123,6 +123,12 @@ export interface AtomicTransactionResult {
|
|
|
123
123
|
operations: number;
|
|
124
124
|
stateBefore: number;
|
|
125
125
|
stateAfter: number;
|
|
126
|
+
/** Authority revision before and after this atomic commit. */
|
|
127
|
+
baseRevision: number;
|
|
128
|
+
commitRevision: number;
|
|
129
|
+
/** Stable revision and operation identities; never aliases of transactionId. */
|
|
130
|
+
revisionId: string;
|
|
131
|
+
operationIds: string[];
|
|
126
132
|
}
|
|
127
133
|
/** Staging surface for one collection inside a transaction. */
|
|
128
134
|
export interface AtomicTransactionCollection<T = unknown> {
|
|
@@ -167,7 +173,9 @@ export interface AtomicTransactionOptions {
|
|
|
167
173
|
/** Thrown when a transaction cannot be committed. Nothing was applied. */
|
|
168
174
|
export declare class AtomicTransactionError extends Error {
|
|
169
175
|
readonly transactionId: string;
|
|
170
|
-
|
|
176
|
+
readonly code?: string;
|
|
177
|
+
readonly status?: number;
|
|
178
|
+
constructor(message: string, transactionId: string, code?: string, status?: number, cause?: unknown);
|
|
171
179
|
}
|
|
172
180
|
/** Which predicate failed, and what the authority actually holds. */
|
|
173
181
|
export interface ConditionalConflictDetail {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,iCAAiC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;;;;OASG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oCAAoC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,yDAAyD;AACzD,MAAM,WAAW,sBAAsB;IACrC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,0DAA0D;AAC1D,MAAM,WAAW,iCAAiC;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,iFAAiF;IACjF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,yBAAyB;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,6BAA6B,EAAE,CAAC;IAChD,UAAU,EAAE,iCAAiC,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,iCAAiC,EAAE,CAAC;IAChD;;;;;OAKG;IACH,aAAa,CAAC,EAAE,6BAA6B,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,uBAAuB;IACtC,6EAA6E;IAC7E,aAAa,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"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"}
|
package/dist/transaction.js
CHANGED
|
@@ -25,10 +25,14 @@
|
|
|
25
25
|
/** Thrown when a transaction cannot be committed. Nothing was applied. */
|
|
26
26
|
export class AtomicTransactionError extends Error {
|
|
27
27
|
transactionId;
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
code;
|
|
29
|
+
status;
|
|
30
|
+
constructor(message, transactionId, code, status, cause) {
|
|
31
|
+
super(message, { cause });
|
|
30
32
|
this.name = 'AtomicTransactionError';
|
|
31
33
|
this.transactionId = transactionId;
|
|
34
|
+
this.code = code;
|
|
35
|
+
this.status = status;
|
|
32
36
|
}
|
|
33
37
|
}
|
|
34
38
|
/**
|
|
Binary file
|
|
@@ -11,6 +11,14 @@ export interface LocalDevelopmentAuthorityOptions {
|
|
|
11
11
|
port?: number;
|
|
12
12
|
proposalContext?: () => Promise<ProposalContext>;
|
|
13
13
|
intentObservations?: () => ObservedEvidenceInput[] | Promise<ObservedEvidenceInput[]>;
|
|
14
|
+
runtimeContext?: {
|
|
15
|
+
namespace: string;
|
|
16
|
+
runtime: string;
|
|
17
|
+
storage: string;
|
|
18
|
+
distributed: boolean;
|
|
19
|
+
applicationLifecycle: string;
|
|
20
|
+
applicationUrl?: string;
|
|
21
|
+
};
|
|
14
22
|
}
|
|
15
23
|
/** Start the durable, unauthenticated loopback authority used by `feltdb dev`. */
|
|
16
24
|
export declare function startLocalDevelopmentAuthority(options: LocalDevelopmentAuthorityOptions): Promise<LocalDevelopmentAuthority>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-development-authority.d.ts","sourceRoot":"","sources":["../../src/workspace/local-development-authority.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwD,KAAK,eAAe,EAAsB,MAAM,gBAAgB,CAAC;AAEhI,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE7E,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;IACjD,kBAAkB,CAAC,EAAE,MAAM,qBAAqB,EAAE,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"local-development-authority.d.ts","sourceRoot":"","sources":["../../src/workspace/local-development-authority.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwD,KAAK,eAAe,EAAsB,MAAM,gBAAgB,CAAC;AAEhI,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE7E,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;IACjD,kBAAkB,CAAC,EAAE,MAAM,qBAAqB,EAAE,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IACtF,cAAc,CAAC,EAAE;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,OAAO,CAAC;QACrB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAeD,kFAAkF;AAClF,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,gCAAgC,GACxC,OAAO,CAAC,yBAAyB,CAAC,CA6QpC"}
|
|
@@ -3,6 +3,18 @@ import path from 'node:path';
|
|
|
3
3
|
import { FileJsDb } from '../file-db.js';
|
|
4
4
|
import { FELTDB_CONVERGENCE_COLLECTION, FeltDBProposalService } from '../proposal.js';
|
|
5
5
|
import { IntentService } from '../intent.js';
|
|
6
|
+
const DEVELOPMENT_CONTROL_PLANE_CAPABILITIES = {
|
|
7
|
+
contract: 'feltdb.control-plane.capabilities',
|
|
8
|
+
version: 1,
|
|
9
|
+
capabilities: [
|
|
10
|
+
{ id: 'overview.instance', area: 'overview', title: 'Development authority overview', status: 'available', surface: ['GET /v1/control-plane/overview'], note: '' },
|
|
11
|
+
{ id: 'data.collections.list', area: 'data', title: 'List declared collections', status: 'available', surface: ['GET /v1/application/schema'], note: '' },
|
|
12
|
+
{ id: 'data.schema.inspect', area: 'data', title: 'Inspect the application schema', status: 'available', surface: ['GET /v1/application/schema'], note: '' },
|
|
13
|
+
{ id: 'data.records.browse', area: 'data', title: 'Browse records', status: 'available', surface: ['GET /v1/data/{collection}'], note: '' },
|
|
14
|
+
{ id: 'provenance.transactions', area: 'operations', title: 'Recent attributed transactions', status: 'unsupported', surface: [], note: 'Transaction observability is not available from the lightweight development authority.' },
|
|
15
|
+
{ id: 'replication.health', area: 'replication', title: 'Replication health', status: 'unsupported', surface: [], note: 'Replication health is not available from the lightweight development authority.' },
|
|
16
|
+
],
|
|
17
|
+
};
|
|
6
18
|
/** Start the durable, unauthenticated loopback authority used by `feltdb dev`. */
|
|
7
19
|
export async function startLocalDevelopmentAuthority(options) {
|
|
8
20
|
const host = options.host || '127.0.0.1';
|
|
@@ -25,6 +37,7 @@ export async function startLocalDevelopmentAuthority(options) {
|
|
|
25
37
|
const proposalService = options.proposalContext ? new FeltDBProposalService(store, options.proposalContext, proposalAuthorityToken) : undefined;
|
|
26
38
|
const intentService = proposalService && options.proposalContext ? new IntentService(store, options.proposalContext, proposalService, options.intentObservations) : undefined;
|
|
27
39
|
const streams = new Set();
|
|
40
|
+
let endpoint = '';
|
|
28
41
|
const server = http.createServer(async (request, response) => {
|
|
29
42
|
try {
|
|
30
43
|
response.setHeader('Access-Control-Allow-Origin', '*');
|
|
@@ -54,6 +67,124 @@ export async function startLocalDevelopmentAuthority(options) {
|
|
|
54
67
|
request.once('close', () => streams.delete(response));
|
|
55
68
|
return;
|
|
56
69
|
}
|
|
70
|
+
if (request.method === 'GET' && pathname === '/v1/application/schema') {
|
|
71
|
+
if (!options.proposalContext) {
|
|
72
|
+
json(response, 503, { code: 'application_contract_unavailable', message: 'The development application contract is unavailable.' });
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const { snapshot } = await options.proposalContext();
|
|
76
|
+
const collections = snapshot.schema.map(collection => {
|
|
77
|
+
const direct = collection.fields.flatMap(field => field.reference ? [{
|
|
78
|
+
name: field.name,
|
|
79
|
+
source_collection: collection.name,
|
|
80
|
+
target_collection: field.reference,
|
|
81
|
+
cardinality: 'one',
|
|
82
|
+
foreign_field: field.name,
|
|
83
|
+
}] : []);
|
|
84
|
+
const reverse = snapshot.schema.flatMap(source => source.fields.flatMap(field => field.reference === collection.name ? [{
|
|
85
|
+
name: `${source.name}_${field.name}`,
|
|
86
|
+
source_collection: source.name,
|
|
87
|
+
target_collection: collection.name,
|
|
88
|
+
cardinality: 'many',
|
|
89
|
+
foreign_field: field.name,
|
|
90
|
+
}] : []));
|
|
91
|
+
return { collection: collection.name, description: '', fields: collection.fields, relationships: [...direct, ...reverse] };
|
|
92
|
+
});
|
|
93
|
+
json(response, 200, {
|
|
94
|
+
application: snapshot.application,
|
|
95
|
+
contract_version: snapshot.contract_version,
|
|
96
|
+
collections,
|
|
97
|
+
capabilities: snapshot.capabilities,
|
|
98
|
+
workflows: snapshot.workflows,
|
|
99
|
+
agents: snapshot.agents,
|
|
100
|
+
policies: snapshot.policies,
|
|
101
|
+
});
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (request.method === 'GET' && pathname === '/v1/control-plane/capabilities') {
|
|
105
|
+
json(response, 200, DEVELOPMENT_CONTROL_PLANE_CAPABILITIES);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (request.method === 'GET' && pathname === '/v1/control-plane/overview') {
|
|
109
|
+
const context = options.runtimeContext;
|
|
110
|
+
const authorityState = db.authorityStateSummary();
|
|
111
|
+
json(response, 200, {
|
|
112
|
+
instance: {
|
|
113
|
+
instance_id: db.instance_id(),
|
|
114
|
+
namespace: context?.namespace ?? 'default',
|
|
115
|
+
runtime: context?.runtime ?? 'node',
|
|
116
|
+
storage: context?.storage ?? 'durable',
|
|
117
|
+
distributed: context?.distributed ?? false,
|
|
118
|
+
application_lifecycle: context?.applicationLifecycle ?? 'attached',
|
|
119
|
+
application_url: context?.applicationUrl ?? null,
|
|
120
|
+
},
|
|
121
|
+
authority: {
|
|
122
|
+
kind: 'local-development',
|
|
123
|
+
advertise_url: endpoint,
|
|
124
|
+
state_version: authorityState.current_sequence,
|
|
125
|
+
},
|
|
126
|
+
authority_state: authorityState,
|
|
127
|
+
storage: {
|
|
128
|
+
records: authorityState.records,
|
|
129
|
+
collections: authorityState.collections,
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const dataMatch = pathname.match(/^\/v1\/data\/([^/]+)$/);
|
|
135
|
+
if (request.method === 'GET' && dataMatch) {
|
|
136
|
+
if (!options.proposalContext) {
|
|
137
|
+
json(response, 503, { code: 'application_contract_unavailable', message: 'The development application contract is unavailable.' });
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const { snapshot } = await options.proposalContext();
|
|
141
|
+
const collection = decodeURIComponent(dataMatch[1]);
|
|
142
|
+
if (!snapshot.schema.some(value => value.name === collection)) {
|
|
143
|
+
json(response, 404, { code: 'collection_not_found', message: `Collection ${collection} is not declared by this application.` });
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const requestedLimit = Number(requestUrl.searchParams.get('limit') || 50);
|
|
147
|
+
if (!Number.isInteger(requestedLimit) || requestedLimit < 1) {
|
|
148
|
+
json(response, 422, { code: 'invalid_limit', message: 'limit must be a positive integer.' });
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const limit = Math.min(requestedLimit, 100);
|
|
152
|
+
const stateVersion = db.get_sequence();
|
|
153
|
+
let offset = 0;
|
|
154
|
+
const cursor = requestUrl.searchParams.get('cursor');
|
|
155
|
+
if (cursor) {
|
|
156
|
+
try {
|
|
157
|
+
const decoded = JSON.parse(Buffer.from(cursor, 'base64url').toString('utf8'));
|
|
158
|
+
if (decoded.v !== 1 || decoded.collection !== collection || decoded.state !== stateVersion
|
|
159
|
+
|| !Number.isInteger(decoded.offset) || (decoded.offset ?? -1) < 0)
|
|
160
|
+
throw new Error('invalid cursor');
|
|
161
|
+
offset = decoded.offset;
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
json(response, 422, { code: 'invalid_cursor', message: 'The cursor is invalid, stale, or belongs to another collection.' });
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const result = db.query(collection);
|
|
169
|
+
if (!result.success) {
|
|
170
|
+
json(response, 500, { code: 'authority_read_failed', message: result.error });
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const records = JSON.parse(result.data || '[]')
|
|
174
|
+
.sort((left, right) => String(left.id ?? JSON.stringify(left)).localeCompare(String(right.id ?? JSON.stringify(right))));
|
|
175
|
+
const page = records.slice(offset, offset + limit);
|
|
176
|
+
const nextOffset = offset + page.length;
|
|
177
|
+
const nextCursor = nextOffset < records.length
|
|
178
|
+
? Buffer.from(JSON.stringify({ v: 1, collection, state: stateVersion, offset: nextOffset })).toString('base64url')
|
|
179
|
+
: null;
|
|
180
|
+
json(response, 200, {
|
|
181
|
+
collection,
|
|
182
|
+
records: page,
|
|
183
|
+
pagination: { limit, nextCursor },
|
|
184
|
+
state_version: stateVersion,
|
|
185
|
+
});
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
57
188
|
const previewSimulationMatch = pathname.match(/^\/v1\/previews\/([^/]+)\/simulate$/);
|
|
58
189
|
if (previewSimulationMatch) {
|
|
59
190
|
if (!proposalService) {
|
|
@@ -290,8 +421,12 @@ export async function startLocalDevelopmentAuthority(options) {
|
|
|
290
421
|
server.once('error', reject);
|
|
291
422
|
server.listen(port, host, resolve);
|
|
292
423
|
});
|
|
424
|
+
const address = server.address();
|
|
425
|
+
if (!address || typeof address === 'string')
|
|
426
|
+
throw new Error('Development authority did not expose a TCP address');
|
|
427
|
+
endpoint = `http://${host}:${address.port}`;
|
|
293
428
|
return {
|
|
294
|
-
endpoint
|
|
429
|
+
endpoint,
|
|
295
430
|
proposalAuthorityToken,
|
|
296
431
|
close: () => new Promise((resolve, reject) => {
|
|
297
432
|
for (const stream of streams)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@feltdb/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "FeltDB Core - Application-facing database with Browser, Local, and Server runtimes. Durable state, reactive APIs.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"scripts": {
|
|
64
64
|
"build": "rm -rf dist && tsc && node ../../tools/stage-core-wasm.mjs && npm run build --workspace @feltdb/react && npm run build --workspace @feltdb/migration-sherpa && npm run build --workspace @feltdb/studio && npm run build --workspace @feltdb/cli && npm run build --workspace create-feltdb && node ../../tools/assemble-core-sdk.mjs",
|
|
65
65
|
"test": "node ../../test-runner.ts",
|
|
66
|
-
"test:workspace-e2e": "node --test test/workspace-connection.e2e.test.mjs",
|
|
66
|
+
"test:workspace-e2e": "node --test test/workspace-connection.e2e.test.mjs test/local-development-authority-read-contract.test.mjs",
|
|
67
67
|
"type-check": "tsc --noEmit"
|
|
68
68
|
},
|
|
69
69
|
"keywords": [
|