@feltdb/core 0.12.2 → 0.15.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/agent-runtime.d.ts +64 -2
- package/dist/agent-runtime.d.ts.map +1 -1
- package/dist/agent-runtime.js +121 -11
- package/dist/agent-state.d.ts +48 -0
- package/dist/agent-state.d.ts.map +1 -1
- package/dist/agent-state.js +174 -12
- package/dist/agent.d.ts +10 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +10 -1
- package/dist/build-identity.json +4 -4
- package/dist/cli/commands.js +34 -7
- package/dist/cli/workspace-integration.js +8 -0
- package/dist/collection.d.ts +3 -1
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +30 -8
- package/dist/create/build-identity.json +4 -4
- package/dist/create/cli.js +47 -38
- package/dist/create/create.js +21 -8
- package/dist/create/package-versions.js +1 -1
- package/dist/create/server-source/Cargo.lock +6 -6
- package/dist/create/server-source/Cargo.toml +1 -1
- package/dist/create/server-source/crates/feltdb/src/lib.rs +126 -35
- package/dist/create/server-source/crates/feltdb/src/state_contract.rs +162 -53
- package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +341 -2
- package/dist/create/server-source/crates/feltdb/src/workload.rs +2094 -126
- package/dist/create/server-source/crates/feltdb/tests/production_readiness_contract.rs +18 -12
- package/dist/create/server-source/crates/feltdb/tests/workload_envelope_contract.rs +17 -5
- package/dist/create/server-source/crates/feltdb-client/Cargo.toml +1 -1
- package/dist/create/server-source/crates/feltdb-server/Cargo.toml +1 -1
- package/dist/create/server-source/crates/feltdb-server/README.md +6 -1
- package/dist/create/server-source/crates/feltdb-server/src/agent_execution.rs +511 -0
- package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +9 -1
- package/dist/create/server-source/crates/feltdb-server/src/auth.rs +113 -25
- package/dist/create/server-source/crates/feltdb-server/src/backup.rs +4 -0
- package/dist/create/server-source/crates/feltdb-server/src/console_accounts.rs +1009 -0
- package/dist/create/server-source/crates/feltdb-server/src/control_authorization.rs +441 -0
- package/dist/create/server-source/crates/feltdb-server/src/identity.rs +68 -6
- package/dist/create/server-source/crates/feltdb-server/src/key_management.rs +355 -23
- package/dist/create/server-source/crates/feltdb-server/src/lib.rs +4 -0
- package/dist/create/server-source/crates/feltdb-server/src/main.rs +1740 -236
- package/dist/create/server-source/crates/feltdb-server/src/redaction.rs +208 -0
- package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +198 -19
- package/dist/create/server-source/crates/feltdb-server/tests/transaction_precondition_contract.rs +403 -0
- package/dist/create/setup-summary.js +40 -0
- package/dist/db.d.ts +91 -10
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +170 -31
- package/dist/deployment.d.ts +19 -0
- package/dist/deployment.d.ts.map +1 -1
- package/dist/deployment.js +38 -2
- package/dist/development-runtime-bridge.d.ts +20 -0
- package/dist/development-runtime-bridge.d.ts.map +1 -1
- package/dist/development-runtime-bridge.js +61 -12
- package/dist/embedded-query.d.ts.map +1 -1
- package/dist/embedded-query.js +5 -4
- package/dist/embedded-transaction.d.ts +8 -4
- package/dist/embedded-transaction.d.ts.map +1 -1
- package/dist/embedded-transaction.js +55 -19
- package/dist/error-codes.d.ts +31 -2
- package/dist/error-codes.d.ts.map +1 -1
- package/dist/error-codes.js +41 -2
- package/dist/feltdb.d.ts +7 -0
- package/dist/feltdb.d.ts.map +1 -1
- package/dist/file-db.d.ts +27 -0
- package/dist/file-db.d.ts.map +1 -1
- package/dist/file-db.js +145 -7
- package/dist/http-client.d.ts +11 -3
- package/dist/http-client.d.ts.map +1 -1
- package/dist/http-client.js +27 -14
- package/dist/http-db.d.ts +40 -1
- package/dist/http-db.d.ts.map +1 -1
- package/dist/http-db.js +285 -58
- package/dist/index.js +1 -1
- package/dist/local-state-lock.d.ts +34 -0
- package/dist/local-state-lock.d.ts.map +1 -0
- package/dist/local-state-lock.js +225 -0
- package/dist/reactive-graph.d.ts +0 -3
- package/dist/reactive-graph.d.ts.map +1 -1
- package/dist/reactive-graph.js +11 -1
- package/dist/runtime-registry.d.ts +7 -2
- package/dist/runtime-registry.d.ts.map +1 -1
- package/dist/runtime-registry.js +2 -2
- package/dist/studio/{KeyManagementPanel-D5FMvvU9.js → KeyManagementPanel-skUNnKRw.js} +36 -29
- package/dist/studio/app.d.ts +8 -1
- package/dist/studio/app.d.ts.map +1 -1
- package/dist/studio/components/KeyManagementPanel.d.ts.map +1 -1
- package/dist/studio/components/KeyManagementPanel.js +1 -1
- package/dist/studio/components/index.js +2 -2
- package/dist/studio/{components-B4eKIUN5.js → components-CJmzntBi.js} +8 -7
- package/dist/studio/control-plane/Data.d.ts.map +1 -1
- package/dist/studio/control-plane/Instance.d.ts +4 -1
- package/dist/studio/control-plane/Instance.d.ts.map +1 -1
- package/dist/studio/control-plane/Operations.d.ts +4 -1
- package/dist/studio/control-plane/Operations.d.ts.map +1 -1
- package/dist/studio/control-plane/index.js +2 -2
- package/dist/studio/control-plane/primitives.d.ts +16 -0
- package/dist/studio/control-plane/primitives.d.ts.map +1 -1
- package/dist/studio/{control-plane-fxMcJn74.js → control-plane-CaBA7Rgv.js} +448 -424
- package/dist/studio/index.d.ts +1 -0
- package/dist/studio/index.d.ts.map +1 -1
- package/dist/studio/index.js +384 -247
- package/dist/studio/navigation.d.ts +57 -0
- package/dist/studio/navigation.d.ts.map +1 -0
- package/dist/studio/studio.css +1 -1
- package/dist/studio/utils/control-plane-api.d.ts +2 -0
- package/dist/studio/utils/control-plane-api.d.ts.map +1 -1
- package/dist/studio/utils/control-plane-api.js +5 -1
- package/dist/studio-app/assets/{feltdb_wasm-BatwwogY.js → feltdb_wasm-BjM1ylL3.js} +1 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-TseJn2Ax.wasm +0 -0
- package/dist/studio-app/assets/index-1wd0uKua.js +30 -0
- package/dist/studio-app/assets/{index-CiC8VY-a.css → index-vi21oEQa.css} +1 -1
- package/dist/studio-app/index.html +2 -2
- package/dist/transaction.d.ts +27 -11
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +20 -14
- package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
- package/dist/wasm/package.json +1 -1
- package/dist/workload.d.ts +31 -3
- package/dist/workload.d.ts.map +1 -1
- package/dist/workload.js +28 -3
- package/dist/workspace/local-development-authority.d.ts +19 -0
- package/dist/workspace/local-development-authority.d.ts.map +1 -1
- package/dist/workspace/local-development-authority.js +335 -15
- package/package.json +1 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-BX0newOr.wasm +0 -0
- package/dist/studio-app/assets/index-DoVvbIay.js +0 -30
package/dist/file-db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-db.d.ts","sourceRoot":"","sources":["../src/file-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EACV,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,EAG1B,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"file-db.d.ts","sourceRoot":"","sources":["../src/file-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EACV,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,EAG1B,MAAM,0BAA0B,CAAC;AAclC,OAAO,KAAK,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAcpI,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,yEAAyE;AACzE,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C;;;;;;;;GAQG;AACH,qBAAa,6BAA8B,SAAQ,KAAK;IAG1C,QAAQ,CAAC,SAAS,EAAE,MAAM;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM;IAF9D,QAAQ,CAAC,IAAI,gCAAgC;gBAExB,SAAS,EAAE,MAAM,EAAW,KAAK,EAAE,MAAM;CAS/D;AACD,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAa5F,UAAU,QAAQ;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,aAAa;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE;AAsFrK,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE;QACX;;;;WAIG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;QACzB,0EAA0E;QAC1E,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB;;;;WAIG;QACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;KACjC,CAAC;IACF,mFAAmF;IACnF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;IACxD,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,OAAO,GAAG;QAAE,QAAQ,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,cAAc,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CAClF;AAgBD,qBAAa,QAAS,YAAW,IAAI;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAC3C,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IACjE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsB;IAClD,OAAO,CAAC,eAAe,CAAM;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuD;IAClF,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,gBAAgB,CAA6B;IACrD,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,WAAW,CAAC;gBAE5B,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB;IA2DvD;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,aAAa;IAYrB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,eAAe;IAavB;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAgGxB,OAAO,CAAC,KAAK;IAcb,4EAA4E;IAC5E,OAAO,CAAC,WAAW;IA0BnB;;;;;;;;OAQG;IACH,OAAO,CAAC,OAAO;IAWf,iFAAiF;IACjF,OAAO,CAAC,WAAW;IAoDnB;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAS7B,wDAAwD;IACxD,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,UAAU;IAqBlB,iEAAiE;IACjE,OAAO,CAAC,QAAQ;IAKhB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,OAAO;IA6Df,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,aAAa;IAMrB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,aAAa;IA4FrB,OAAO,CAAC,aAAa;IAYrB;;;OAGG;IACH,OAAO,IAAI,iBAAiB;IAK5B,8DAA8D;IAC9D,kBAAkB,IAAI,iBAAiB;IAkBvC;;;;OAIG;IACH,mBAAmB,CAAC,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,kBAAkB;IAQ1E,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,gBAAgB;YAWV,gBAAgB;IAiC9B,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,gBAAgB;IAgBxB;;;;;;;;;OASG;IACH;;;;;OAKG;IACG,UAAU,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAYpE,kBAAkB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAiD7F,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ;IAc5C,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ;IAa5C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ;IAQ1B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ;IAa7B,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ;IAS7B,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,qBAAqB;;;IAK/E,aAAa,CAAC,KAAK,EAAE,qBAAqB;IAK1C,eAAe,IAAI,IAAI;IAMvB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ;IAIpD,UAAU,IAAI,QAAQ;IAItB,SAAS,IAAI,QAAQ;IAkBrB,QAAQ,IAAI,QAAQ;IAIpB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ;IASvC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ;IAS1C,2BAA2B,IAAI,QAAQ;IAIvC,oBAAoB,IAAI,QAAQ;IAIhC,WAAW,IAAI,MAAM;IAIrB,YAAY,IAAI,MAAM;IAKtB;;;;OAIG;IACH,SAAS,IAAI,mBAAmB;IAUhC,YAAY;IAKZ,gEAAgE;IAChE,qBAAqB,IAAI;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,KAAK,CAAC;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC7D;IAkBD,iBAAiB,CAAC,aAAa,EAAE,MAAM;IAKvC,uBAAuB,CAAC,UAAU,EAAE,aAAa,EAAE;;;;IA4C7C,gBAAgB,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB7E,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAqCtF,cAAc,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAkEjF,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC;IA2FxF,GAAG,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAsGzQ,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,MAAM,CAAC,MAAM;IAIf,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IA0CxF,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAsB9D,OAAO,CAAC,cAAc;IAatB,KAAK,IAAI,IAAI;CAMd"}
|
package/dist/file-db.js
CHANGED
|
@@ -2,9 +2,11 @@ import { validateOperationAdmissionInput, operationsConflict, generateOperationI
|
|
|
2
2
|
import { FeltDBErrorCode, FeltDBServiceError } from './error-codes.js';
|
|
3
3
|
import * as nodeFs from 'fs';
|
|
4
4
|
import * as nodePath from 'path';
|
|
5
|
+
import { createHash as nodeCreateHash } from 'crypto';
|
|
5
6
|
import { TransactionIdConflictError, TransactionIdUnverifiableError, normaliseReadSet } from './transaction.js';
|
|
6
7
|
import { decideTransaction, readBasisToken, scanRows, embeddedDuplicate, embeddedResult, prepareTransaction, refusalError, } from './embedded-transaction.js';
|
|
7
8
|
import { EmbeddedQueryEngine } from './embedded-query.js';
|
|
9
|
+
import { LOCAL_STATE_LOCK_FILE, acquireLocalStateLock } from './local-state-lock.js';
|
|
8
10
|
import { encodeRecord, scanJournal, JournalCorruptionError, PersistenceProfiler, } from './file-journal.js';
|
|
9
11
|
export { JournalCorruptionError } from './file-journal.js';
|
|
10
12
|
/** The newest local file snapshot format this build reads and writes. */
|
|
@@ -71,6 +73,9 @@ export class FileJsDb {
|
|
|
71
73
|
profiler;
|
|
72
74
|
compaction;
|
|
73
75
|
compactionScheduled = false;
|
|
76
|
+
releaseOwnerLock = null;
|
|
77
|
+
/** How this handle opened its directory. */
|
|
78
|
+
access;
|
|
74
79
|
constructor(path, options = {}) {
|
|
75
80
|
const nodePath = getPathSync();
|
|
76
81
|
const nodeFs = getFsSync();
|
|
@@ -96,13 +101,43 @@ export class FileJsDb {
|
|
|
96
101
|
}
|
|
97
102
|
// Generate stable instance ID based on path
|
|
98
103
|
this.origin = `file:${this.dataPath}`;
|
|
99
|
-
|
|
100
|
-
this.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
this.
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
this.access = options.access ?? 'shared';
|
|
105
|
+
if (this.access !== 'shared' && this.access !== 'exclusive') {
|
|
106
|
+
throw new Error(`access must be 'shared' or 'exclusive', not ${String(options.access)}`);
|
|
107
|
+
}
|
|
108
|
+
if (this.access === 'exclusive') {
|
|
109
|
+
this.releaseOwnerLock = acquireLocalStateLock(this.dataPath);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
this.assertNotHeldExclusively(nodePath.join(this.dataPath, LOCAL_STATE_LOCK_FILE));
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
// Clean up any stale locks from previous crashes on startup
|
|
116
|
+
this.cleanupStaleLock();
|
|
117
|
+
// Load or initialize state
|
|
118
|
+
this.state = this.initializeState();
|
|
119
|
+
this.loadDurableState();
|
|
120
|
+
this.queryEngine = new EmbeddedQueryEngine(() => Object.entries(this.state.rows));
|
|
121
|
+
this.indexedSequence = this.state.sequence;
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
this.releaseOwnerLock?.();
|
|
125
|
+
this.releaseOwnerLock = null;
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* A shared open still respects an exclusive owner in another process: a
|
|
131
|
+
* process that asked for exclusive access must not find a second writer.
|
|
132
|
+
* Probing takes no lock of its own.
|
|
133
|
+
*/
|
|
134
|
+
assertNotHeldExclusively(lockPath) {
|
|
135
|
+
const nodeFs = getFsSync();
|
|
136
|
+
if (!nodeFs.existsSync(lockPath))
|
|
137
|
+
return;
|
|
138
|
+
// acquire-then-release judges liveness and recovers a stale lock exactly
|
|
139
|
+
// as an exclusive open would; it refuses when a live process holds it.
|
|
140
|
+
acquireLocalStateLock(this.dataPath)();
|
|
106
141
|
}
|
|
107
142
|
/* ------------------------------------------------------------------------
|
|
108
143
|
* Durable layout
|
|
@@ -1442,8 +1477,111 @@ export class FileJsDb {
|
|
|
1442
1477
|
console.log(`[CAS-${casId}] lock released, EXIT`);
|
|
1443
1478
|
}
|
|
1444
1479
|
}
|
|
1480
|
+
/* ------------------------------------------------------------------------
|
|
1481
|
+
* Content store
|
|
1482
|
+
*
|
|
1483
|
+
* Immutable bytes addressed by SHA-256, under `<state dir>/content/<hash>`:
|
|
1484
|
+
* the same contract as the server's `PUT /content` / `GET /content/{hash}`.
|
|
1485
|
+
* A blob is written to a temporary file, fsynced, renamed into place, and
|
|
1486
|
+
* the directory fsynced, so it is durable before `storeContent` returns and
|
|
1487
|
+
* never visible half-written. Every read is re-hashed; bytes that no longer
|
|
1488
|
+
* match their address are refused, never returned. Content is not indexed
|
|
1489
|
+
* state and is never deleted by FeltDB.
|
|
1490
|
+
* ---------------------------------------------------------------------- */
|
|
1491
|
+
contentDirectory() {
|
|
1492
|
+
return getPathSync().join(this.dataPath, 'content');
|
|
1493
|
+
}
|
|
1494
|
+
static sha256(bytes) {
|
|
1495
|
+
return nodeCreateHash('sha256').update(bytes).digest('hex');
|
|
1496
|
+
}
|
|
1497
|
+
async storeContent(content) {
|
|
1498
|
+
if (!(content instanceof Uint8Array)) {
|
|
1499
|
+
throw new FeltDBServiceError('INVALID_REQUEST: content must be a Uint8Array', FeltDBErrorCode.INVALID_REQUEST);
|
|
1500
|
+
}
|
|
1501
|
+
if (content.byteLength === 0) {
|
|
1502
|
+
throw new FeltDBServiceError('INVALID_REQUEST: content body must not be empty', FeltDBErrorCode.INVALID_REQUEST);
|
|
1503
|
+
}
|
|
1504
|
+
const nodeFs = getFsSync();
|
|
1505
|
+
const nodePath = getPathSync();
|
|
1506
|
+
const bytes = Buffer.from(content.buffer, content.byteOffset, content.byteLength);
|
|
1507
|
+
const hash = FileJsDb.sha256(bytes);
|
|
1508
|
+
const directory = this.contentDirectory();
|
|
1509
|
+
const target = nodePath.join(directory, hash);
|
|
1510
|
+
if (!nodeFs.existsSync(directory)) {
|
|
1511
|
+
nodeFs.mkdirSync(directory, { recursive: true });
|
|
1512
|
+
this.fsyncDirectory(this.dataPath);
|
|
1513
|
+
}
|
|
1514
|
+
try {
|
|
1515
|
+
const existing = nodeFs.readFileSync(target);
|
|
1516
|
+
if (FileJsDb.sha256(existing) === hash)
|
|
1517
|
+
return { hash, bytes: bytes.length, ref: `sha256:${hash}` };
|
|
1518
|
+
// A damaged copy is replaced by the verified bytes now in hand.
|
|
1519
|
+
}
|
|
1520
|
+
catch (error) {
|
|
1521
|
+
if (!isMissing(error))
|
|
1522
|
+
throw error;
|
|
1523
|
+
}
|
|
1524
|
+
const temporary = nodePath.join(directory, `.${hash}.tmp-${process.pid}-${Math.random().toString(36).slice(2)}`);
|
|
1525
|
+
const fd = nodeFs.openSync(temporary, 'wx', 0o600);
|
|
1526
|
+
try {
|
|
1527
|
+
writeFully(fd, bytes, 0);
|
|
1528
|
+
nodeFs.fsyncSync(fd);
|
|
1529
|
+
}
|
|
1530
|
+
finally {
|
|
1531
|
+
nodeFs.closeSync(fd);
|
|
1532
|
+
}
|
|
1533
|
+
try {
|
|
1534
|
+
nodeFs.renameSync(temporary, target);
|
|
1535
|
+
}
|
|
1536
|
+
catch (error) {
|
|
1537
|
+
try {
|
|
1538
|
+
nodeFs.unlinkSync(temporary);
|
|
1539
|
+
}
|
|
1540
|
+
catch { /* best effort */ }
|
|
1541
|
+
throw error;
|
|
1542
|
+
}
|
|
1543
|
+
this.fsyncDirectory(directory);
|
|
1544
|
+
return { hash, bytes: bytes.length, ref: `sha256:${hash}` };
|
|
1545
|
+
}
|
|
1546
|
+
async acquireContent(hash) {
|
|
1547
|
+
// The bare lowercase hex digest, exactly as the server's GET /content/{hash} takes it.
|
|
1548
|
+
const address = hash;
|
|
1549
|
+
if (typeof address !== 'string' || !/^[0-9a-f]{64}$/.test(address)) {
|
|
1550
|
+
throw new FeltDBServiceError('INVALID_REQUEST: invalid sha256 content hash', FeltDBErrorCode.INVALID_REQUEST);
|
|
1551
|
+
}
|
|
1552
|
+
let bytes;
|
|
1553
|
+
try {
|
|
1554
|
+
bytes = getFsSync().readFileSync(getPathSync().join(this.contentDirectory(), address));
|
|
1555
|
+
}
|
|
1556
|
+
catch (error) {
|
|
1557
|
+
if (isMissing(error))
|
|
1558
|
+
return null;
|
|
1559
|
+
throw error;
|
|
1560
|
+
}
|
|
1561
|
+
if (FileJsDb.sha256(bytes) !== address) {
|
|
1562
|
+
throw new FeltDBServiceError(`CONTENT_INTEGRITY_FAILURE: stored content ${address} failed verification; it was not returned`, FeltDBErrorCode.CONTENT_INTEGRITY_FAILURE);
|
|
1563
|
+
}
|
|
1564
|
+
return new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
1565
|
+
}
|
|
1566
|
+
fsyncDirectory(directory) {
|
|
1567
|
+
const nodeFs = getFsSync();
|
|
1568
|
+
let fd;
|
|
1569
|
+
try {
|
|
1570
|
+
fd = nodeFs.openSync(directory, 'r');
|
|
1571
|
+
nodeFs.fsyncSync(fd);
|
|
1572
|
+
}
|
|
1573
|
+
catch {
|
|
1574
|
+
// Some platforms cannot fsync a directory; the rename is still atomic.
|
|
1575
|
+
}
|
|
1576
|
+
finally {
|
|
1577
|
+
if (fd !== undefined)
|
|
1578
|
+
nodeFs.closeSync(fd);
|
|
1579
|
+
}
|
|
1580
|
+
}
|
|
1445
1581
|
close() {
|
|
1446
1582
|
// Mutations are durable before they return. Closing a stale handle must
|
|
1447
1583
|
// never rewrite authority state produced by another process.
|
|
1584
|
+
this.releaseOwnerLock?.();
|
|
1585
|
+
this.releaseOwnerLock = null;
|
|
1448
1586
|
}
|
|
1449
1587
|
}
|
package/dist/http-client.d.ts
CHANGED
|
@@ -10,6 +10,8 @@ import type { ConvergenceResult } from './convergence.js';
|
|
|
10
10
|
import type { ImplementationPlan, Intent, IntentEvent, IntentExecutionResult } from './intent.js';
|
|
11
11
|
import type { CanonicalQuery, QueryResult, TransactionResult } from './state-contract.js';
|
|
12
12
|
import { type DiscoveryState } from './managed-recovery.js';
|
|
13
|
+
import { FeltDBServiceError } from './error-codes.js';
|
|
14
|
+
import type { ConditionalConflictDetail } from './transaction.js';
|
|
13
15
|
export interface ClientOptions {
|
|
14
16
|
url: string;
|
|
15
17
|
token: string;
|
|
@@ -23,12 +25,18 @@ export interface ServiceApiErrorBody {
|
|
|
23
25
|
error?: string;
|
|
24
26
|
message?: string;
|
|
25
27
|
request_id?: string;
|
|
28
|
+
failure?: ConditionalConflictDetail;
|
|
26
29
|
}
|
|
27
|
-
|
|
30
|
+
/**
|
|
31
|
+
* A Service API failure: a `FeltDBServiceError` with the authority's stable
|
|
32
|
+
* `code`, its HTTP `status` (0 when no answer arrived) and, for a refused
|
|
33
|
+
* transaction, the structured precondition `failure`.
|
|
34
|
+
*/
|
|
35
|
+
export declare class FeltDBServiceApiError extends FeltDBServiceError {
|
|
36
|
+
readonly failure?: ConditionalConflictDetail | undefined;
|
|
37
|
+
constructor(code: string, message: string, status: number, requestId?: string, failure?: ConditionalConflictDetail | undefined);
|
|
28
38
|
readonly code: string;
|
|
29
39
|
readonly status: number;
|
|
30
|
-
readonly requestId?: string | undefined;
|
|
31
|
-
constructor(code: string, message: string, status: number, requestId?: string | undefined);
|
|
32
40
|
}
|
|
33
41
|
export interface ApplicationInspection {
|
|
34
42
|
application_id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACjJ,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACjJ,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAClG,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC1F,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAmB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAAG,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,yBAAyB,CAAA;CAAE;AAClJ;;;;GAIG;AACH,qBAAa,qBAAsB,SAAQ,kBAAkB;IACoB,QAAQ,CAAC,OAAO,CAAC,EAAE,yBAAyB;gBAA/G,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAW,OAAO,CAAC,EAAE,yBAAyB,YAAA;IAI3H,SAAiB,IAAI,EAAE,MAAM,CAAC;IAC9B,SAAiB,MAAM,EAAE,MAAM,CAAC;CACjC;AACD,MAAM,WAAW,qBAAqB;IAAG,cAAc,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE;AACrO,MAAM,WAAW,2BAA2B;IAAG,WAAW,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,aAAa,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,CAAA;CAAE;AACpS,MAAM,WAAW,cAAc,CAAC,CAAC;IAAI,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,CAAC,EAAE,CAAC;IAAC,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE;AACxJ,MAAM,WAAW,gBAAgB,CAAC,CAAC;IAAI,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC;IAAC,aAAa,EAAE,OAAO,EAAE,CAAA;CAAE;AAEhG,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;IAClD,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmC;gBAErD,OAAO,EAAE,aAAa;IAWlC,OAAO,CAAC,OAAO;YAQD,OAAO;IA8BrB,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,SAAS;IAKjB;;;;;;;;;OASG;YACW,cAAc;IAQ5B,wCAAwC;IACxC,aAAa,IAAI,cAAc;IAI/B,qEAAqE;IACrE,QAAQ,CAAC,WAAW;;;MAGlB;IAEF,+EAA+E;IAC/E,QAAQ,CAAC,IAAI;eACJ,CAAC,wCAAwC,MAAM,YAAW;YAAE,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;SAAE;cAEhI,CAAC,wCAAwC,MAAM,MAAM,MAAM;MAEjE;IAEF,yFAAyF;IACzF,QAAQ,CAAC,KAAK;gBACE,CAAC,mCAAmC,cAAc;mCAC/B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;2BACL,MAAM;;MACzD;IAEF,kEAAkE;IAClE,QAAQ,CAAC,YAAY;oBACP,MAAM,SAAS,OAAO;MAClC;IAEF,qEAAqE;IACrE,QAAQ,CAAC,OAAO;8BACQ,MAAM;;qBACO,MAAM,EAAE;;kBAClC,MAAM;4BACI,MAAM;mBACf,MAAM;uBACF,MAAM;sBACP,MAAM;oBAA2B,WAAW,EAAE;;MAC3D;IAEF,oFAAoF;IACpF,QAAQ,CAAC,SAAS;2BACG;YAAE,kBAAkB,EAAE,MAAM,CAAC;YAAC,cAAc,EAAE,MAAM,CAAC;YAAC,aAAa,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;YAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;YAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,WAAW,CAAC,EAAE;gBAAE,KAAK,EAAE,KAAK,CAAC;oBAAE,IAAI,EAAE,MAAM,CAAC;oBAAC,MAAM,EAAE,MAAM,CAAA;iBAAE,CAAC,CAAA;aAAE,CAAC;YAAC,aAAa,CAAC,EAAE,wBAAwB,CAAC;YAAC,aAAa,CAAC,EAAE,MAAM,CAAC;YAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;SAAE;yBAE/Y;YAAE,MAAM,CAAC,EAAE,cAAc,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE;uBAAoC,oBAAoB,EAAE;wBAAc;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;aAAE;;kBACtL,MAAM;sBACF,MAAM;oBAA4B,mBAAmB,EAAE;;qBACxD,MAAM,wBAAwB,MAAM;uBAClC,MAAM,qBAAqB,OAAO;4BAC7B,MAAM;6BACL,MAAM;sBACb,CAAC,uCAAuC,MAAM,cAAc,MAAM,YAAW;YAAE,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE;qCACjG,MAAM,SAAS,MAAM;wBAAgC,MAAM;mBAAS,MAAM;oBAAU,WAAW;mCAAyB,MAAM;mBAAS,MAAM,EAAE;;sBAC9J,MAAM;qBACP,MAAM,WAAW,MAAM;0BAClB,MAAM;yBAAgC,iBAAiB,EAAE;;gCACnD,MAAM,UAAU,iBAAiB;MACzD;CAEH;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CAEjE"}
|
package/dist/http-client.js
CHANGED
|
@@ -5,15 +5,18 @@
|
|
|
5
5
|
* For applications that only need HTTP access without the full core framework.
|
|
6
6
|
*/
|
|
7
7
|
import { SingleFlightValue } from './managed-recovery.js';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
8
|
+
import { FeltDBErrorCode, FeltDBServiceError } from './error-codes.js';
|
|
9
|
+
/**
|
|
10
|
+
* A Service API failure: a `FeltDBServiceError` with the authority's stable
|
|
11
|
+
* `code`, its HTTP `status` (0 when no answer arrived) and, for a refused
|
|
12
|
+
* transaction, the structured precondition `failure`.
|
|
13
|
+
*/
|
|
14
|
+
export class FeltDBServiceApiError extends FeltDBServiceError {
|
|
15
|
+
failure;
|
|
16
|
+
constructor(code, message, status, requestId, failure) {
|
|
17
|
+
super(message, code, requestId, status);
|
|
18
|
+
this.failure = failure;
|
|
19
|
+
this.name = 'FeltDBServiceApiError';
|
|
17
20
|
}
|
|
18
21
|
}
|
|
19
22
|
export class FeltDBClient {
|
|
@@ -44,10 +47,20 @@ export class FeltDBClient {
|
|
|
44
47
|
};
|
|
45
48
|
}
|
|
46
49
|
async request(path, init = {}) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
let response;
|
|
51
|
+
try {
|
|
52
|
+
response = await this.fetcher(`${this.url}${path}`, {
|
|
53
|
+
...init,
|
|
54
|
+
headers: { ...this.headers(init.body !== undefined), ...init.headers },
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
// No answer arrived. A write may have reached the authority and
|
|
59
|
+
// committed, so it is outcome-unknown, never a refusal: retry it only
|
|
60
|
+
// with the same transaction id. A read is simply unavailable.
|
|
61
|
+
const mutating = !['GET', 'HEAD', 'OPTIONS'].includes((init.method ?? 'GET').toUpperCase());
|
|
62
|
+
throw new FeltDBServiceApiError(mutating ? FeltDBErrorCode.COMMIT_OUTCOME_UNKNOWN : FeltDBErrorCode.SERVICE_UNAVAILABLE, error instanceof Error ? error.message : String(error), 0);
|
|
63
|
+
}
|
|
51
64
|
if (!response.ok) {
|
|
52
65
|
let message = `FeltDB request failed: HTTP ${response.status}`;
|
|
53
66
|
let body = {};
|
|
@@ -57,7 +70,7 @@ export class FeltDBClient {
|
|
|
57
70
|
catch { /* non-JSON error */ }
|
|
58
71
|
if (body.message || body.error)
|
|
59
72
|
message = body.message || body.error || message;
|
|
60
|
-
throw new FeltDBServiceApiError(body.code || body.error || 'REQUEST_FAILED', message, response.status, body.request_id);
|
|
73
|
+
throw new FeltDBServiceApiError(body.code || body.error || 'REQUEST_FAILED', message, response.status, body.request_id, body.failure);
|
|
61
74
|
}
|
|
62
75
|
return (response.status === 204 ? undefined : response.json());
|
|
63
76
|
}
|
package/dist/http-db.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { SemanticQueryClause, SemanticQueryResult } from './semantic-decision.js';
|
|
2
2
|
import type { JsDb } from './feltdb.js';
|
|
3
3
|
import type { FreshnessCapability, Revision } from './freshness.js';
|
|
4
|
+
import { FeltDBServiceError } from './error-codes.js';
|
|
4
5
|
import type { AuthorityScope } from './authority-scope.js';
|
|
5
6
|
import type { DecisionTransportExecutionRequest, DecisionTransportExecutionResponse } from './semantic-decision.js';
|
|
6
7
|
import { type TransactionReadBasis, type TransactionReadSet } from './transaction.js';
|
|
@@ -9,10 +10,14 @@ interface JsResult {
|
|
|
9
10
|
success: boolean;
|
|
10
11
|
data?: string;
|
|
11
12
|
error?: string;
|
|
13
|
+
/** The typed failure behind `error`: the authority's code, status, request id and body. */
|
|
14
|
+
cause?: FeltDBServiceError;
|
|
12
15
|
}
|
|
13
16
|
interface HttpRuntimeOptions {
|
|
14
17
|
url: string;
|
|
15
18
|
token?: string;
|
|
19
|
+
/** Operator consoles only; see `server.operatorConsole` on `createFeltDB`. */
|
|
20
|
+
allowServiceKeyInBrowser?: boolean;
|
|
16
21
|
applicationId?: string;
|
|
17
22
|
environment?: string;
|
|
18
23
|
/**
|
|
@@ -118,6 +123,9 @@ export declare class HttpJsDb implements JsDb {
|
|
|
118
123
|
private nextRetryAt?;
|
|
119
124
|
private streamFailures;
|
|
120
125
|
private authorityFailures;
|
|
126
|
+
/** One entry per subscription, so the same callback subscribed twice is two subscriptions. */
|
|
127
|
+
private readonly changeListeners;
|
|
128
|
+
private changeStream?;
|
|
121
129
|
constructor(options: HttpRuntimeOptions);
|
|
122
130
|
/**
|
|
123
131
|
* The operational view: connected, recovering, or unable to proceed.
|
|
@@ -132,6 +140,8 @@ export declare class HttpJsDb implements JsDb {
|
|
|
132
140
|
private recordFailure;
|
|
133
141
|
private recordSuccess;
|
|
134
142
|
private headers;
|
|
143
|
+
/** Where this client's requests go, for actionable failure messages. */
|
|
144
|
+
private context;
|
|
135
145
|
private updateToken;
|
|
136
146
|
private waitForAuthChange;
|
|
137
147
|
auth_request<T extends {
|
|
@@ -157,6 +167,11 @@ export declare class HttpJsDb implements JsDb {
|
|
|
157
167
|
private revisionId;
|
|
158
168
|
/** Discovery state for tests and diagnostics; never used to make decisions. */
|
|
159
169
|
revisionState(): ManagedClientHealth['revision_state'];
|
|
170
|
+
/**
|
|
171
|
+
* A canonical *read* (`/query`, `/transactions/read-basis`). It is a POST
|
|
172
|
+
* only because its request has a body; an interrupted read changed nothing,
|
|
173
|
+
* so it is `SERVICE_UNAVAILABLE`, never `COMMIT_OUTCOME_UNKNOWN`.
|
|
174
|
+
*/
|
|
160
175
|
private canonical;
|
|
161
176
|
private transactionDocument;
|
|
162
177
|
private canonicalTransaction;
|
|
@@ -275,7 +290,15 @@ export declare class HttpJsDb implements JsDb {
|
|
|
275
290
|
}>;
|
|
276
291
|
acquireContent(hash: string): Promise<Uint8Array | null>;
|
|
277
292
|
command(path: string, body: unknown): Promise<any>;
|
|
278
|
-
|
|
293
|
+
/**
|
|
294
|
+
* One request to the canonical application service. A request without a
|
|
295
|
+
* body-carrying method is a read; a POST is treated as a mutation unless the
|
|
296
|
+
* caller declares it a read (`{ read: true }`), because only a mutation can
|
|
297
|
+
* leave an uncertain commit behind.
|
|
298
|
+
*/
|
|
299
|
+
application_request<T>(path: string, init?: RequestInit, options?: {
|
|
300
|
+
read?: boolean;
|
|
301
|
+
}): Promise<T>;
|
|
279
302
|
/** Canonical HTTP adapter used by the typed public substrate contract. */
|
|
280
303
|
public_request<T>(path: string, init?: RequestInit): Promise<T>;
|
|
281
304
|
execute_semantic_decision(request: DecisionTransportExecutionRequest): Promise<DecisionTransportExecutionResponse>;
|
|
@@ -288,9 +311,25 @@ export declare class HttpJsDb implements JsDb {
|
|
|
288
311
|
* a timer that wakes up after the caller has unsubscribed and opens a new
|
|
289
312
|
* connection to an authority nobody is listening to.
|
|
290
313
|
*/
|
|
314
|
+
/**
|
|
315
|
+
* One event stream per client, shared by every subscriber.
|
|
316
|
+
*
|
|
317
|
+
* A browser holds at most six HTTP/1.1 connections to one host, and an event
|
|
318
|
+
* stream holds its connection for as long as it is open. A stream per live
|
|
319
|
+
* collection therefore lets an application with six live collections occupy
|
|
320
|
+
* every connection to its authority, after which each other request — the
|
|
321
|
+
* next write included — waits forever. Subscribers are fanned out here
|
|
322
|
+
* instead, and the stream closes with the last of them.
|
|
323
|
+
*/
|
|
291
324
|
subscribe_changes(callback: (collection: string) => void): () => void;
|
|
292
325
|
private consumeEvents;
|
|
326
|
+
/** A refused response as a failed `JsResult` carrying the typed refusal. */
|
|
293
327
|
private failure;
|
|
328
|
+
/**
|
|
329
|
+
* The authority's refusal, typed: its stable `code` (or one derived from the
|
|
330
|
+
* status when the body carries none), status, request id and body.
|
|
331
|
+
*/
|
|
332
|
+
private refusal;
|
|
294
333
|
get_capability_records(capability: string): Promise<JsResult>;
|
|
295
334
|
execute_op(): JsResult;
|
|
296
335
|
sync_info(): JsResult;
|
package/dist/http-db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-db.d.ts","sourceRoot":"","sources":["../src/http-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"http-db.d.ts","sourceRoot":"","sources":["../src/http-db.ts"],"names":[],"mappings":"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"}
|