@soulcraft/sdk 3.3.7 → 3.3.8

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.
@@ -33,6 +33,7 @@
33
33
  export { createSoulcraftProxy } from './namespace-proxy.js';
34
34
  export type { NamespaceTransport } from './namespace-proxy.js';
35
35
  export { createVenueProxy } from '../venue/proxy.js';
36
+ export { ReadOnlyTransport } from '../transports/read-only.js';
36
37
  export { HttpNamespaceTransport, PostMessageNamespaceTransport, HttpRpcTransport, PostMessageRpcTransport, } from '../transports/http-namespace.js';
37
38
  export type { HttpNamespaceTransportOptions } from '../transports/http-namespace.js';
38
39
  export { WsTransport } from '../transports/ws.js';
@@ -46,5 +47,5 @@ export type { SoulcraftSDK } from '../types.js';
46
47
  export type { SoulcraftNamespaces } from '../namespaces.js';
47
48
  export type { SoulcraftBrainy } from '../modules/brainy/types.js';
48
49
  export type { BrainyChangeEvent } from '../modules/brainy/events.js';
49
- export { SDKError, SDKDisconnectedError, SDKTimeoutError, SDKAuthError, SDKForbiddenError, SDKRpcError, SDKMethodNotFoundError, } from '../modules/brainy/errors.js';
50
+ export { SDKError, SDKDisconnectedError, SDKTimeoutError, SDKAuthError, SDKForbiddenError, SDKReadOnlyError, SDKRpcError, SDKMethodNotFoundError, } from '../modules/brainy/errors.js';
50
51
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAG9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGpD,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAC7B,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,iCAAiC,CAAA;AACxC,YAAY,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAA;AAGpF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAGnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAGhE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAChG,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAC5F,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,qBAAqB,EACrB,WAAW,GACZ,MAAM,0BAA0B,CAAA;AAGjC,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,YAAY,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,sBAAsB,GACvB,MAAM,6BAA6B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAG9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAG9D,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAC7B,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,iCAAiC,CAAA;AACxC,YAAY,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAA;AAGpF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAGnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAGhE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAChG,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAC5F,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,qBAAqB,EACrB,WAAW,GACZ,MAAM,0BAA0B,CAAA;AAGjC,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,YAAY,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,sBAAsB,GACvB,MAAM,6BAA6B,CAAA"}
@@ -34,6 +34,8 @@
34
34
  export { createSoulcraftProxy } from './namespace-proxy.js';
35
35
  // ── Venue proxy factory ────────────────────────────────────────────────────
36
36
  export { createVenueProxy } from '../venue/proxy.js';
37
+ // ── Read-only transport wrapper ─────────────────────────────────────────────
38
+ export { ReadOnlyTransport } from '../transports/read-only.js';
37
39
  // ── Namespace-aware transports ──────────────────────────────────────────────
38
40
  export { HttpNamespaceTransport, PostMessageNamespaceTransport, HttpRpcTransport, PostMessageRpcTransport, } from '../transports/http-namespace.js';
39
41
  // ── Real-time transports ────────────────────────────────────────────────────
@@ -43,5 +45,5 @@ export { SseTransport } from '../transports/sse.js';
43
45
  export { createYjsProvider } from '../transports/yjs-provider.js';
44
46
  // ── Hall room + pub/sub clients (browser) ───────────────────────────────────
45
47
  export { joinHallRoom, joinHallPubsub, getWhepUrl, getHlsUrl } from '../modules/hall/browser.js';
46
- export { SDKError, SDKDisconnectedError, SDKTimeoutError, SDKAuthError, SDKForbiddenError, SDKRpcError, SDKMethodNotFoundError, } from '../modules/brainy/errors.js';
48
+ export { SDKError, SDKDisconnectedError, SDKTimeoutError, SDKAuthError, SDKForbiddenError, SDKReadOnlyError, SDKRpcError, SDKMethodNotFoundError, } from '../modules/brainy/errors.js';
47
49
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,+EAA+E;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAG3D,8EAA8E;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,+EAA+E;AAC/E,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAC7B,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,iCAAiC,CAAA;AAGxC,+EAA+E;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,+EAA+E;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AAGjE,+EAA+E;AAC/E,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAgChG,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,sBAAsB,GACvB,MAAM,6BAA6B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,+EAA+E;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAG3D,8EAA8E;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,+EAA+E;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA;AAE9D,+EAA+E;AAC/E,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAC7B,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,iCAAiC,CAAA;AAGxC,+EAA+E;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,+EAA+E;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AAGjE,+EAA+E;AAC/E,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAgChG,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,sBAAsB,GACvB,MAAM,6BAA6B,CAAA"}
package/dist/index.d.ts CHANGED
@@ -16,7 +16,8 @@ export type { SoulcraftProduct } from './modules/auth/products.js';
16
16
  export type { SoulcraftBrainy } from './modules/brainy/types.js';
17
17
  export type { Entity, Relation, Result, AddParams, UpdateParams, RelateParams, FindParams, BrainyConfig, AggregateDefinition, DiagnosticsResult, MigrationResult, MigrateOptions, MigrationPreview, NounType, VerbType, BrainyChangeEvent, BrainyChangeEntity, BrainyChangeRelation, } from './modules/brainy/types.js';
18
18
  export type { CreateCapabilityTokenOptions, CapabilityTokenClaims, } from './modules/brainy/auth.js';
19
- export { SDKError, SDKDisconnectedError, SDKTimeoutError, SDKAuthError, SDKForbiddenError, SDKRpcError, SDKMethodNotFoundError, } from './modules/brainy/errors.js';
19
+ export { SDKError, SDKDisconnectedError, SDKTimeoutError, SDKAuthError, SDKForbiddenError, SDKReadOnlyError, SDKRpcError, SDKMethodNotFoundError, } from './modules/brainy/errors.js';
20
+ export { isWriteMethod, WRITE_METHODS } from './read-only.js';
20
21
  export type { VfsModule } from './modules/vfs/types.js';
21
22
  export type { VersionsModule } from './modules/versions/types.js';
22
23
  export type { HallModule, HallRoom, HallRoomHandle, HallPubsubHandle, HallRoomEvents, HallRoomHandleEvents, HallPubsubHandleEvents, HallPubsubEvents, HallConnectionOptions, HallPeerRole, ScreenShareMode, RoomOptions, ConceptInput, RecordingManifest, RoleChangedEvent, TranscriptEvent, ConceptMentionEvent, RelationProposedEvent, SpeakerChangedEvent, PeerJoinedEvent, PeerLeftEvent, PeerPromotedEvent, PeerDemotedEvent, ViewerCountEvent, ScreenShareThumbnailEvent, ChatMessage as HallChatMessage, ChatHistoryEvent, MediaInfo as HallMediaInfo, MediaReadyEvent, MediaErrorEvent, TranscodeTarget, ReplayEntry, TopicSubscribedEvent, TopicUnsubscribedEvent, TopicMessageEvent, PresenceUpdateEvent, PresenceEntry, PresenceSnapshotEvent, } from './modules/hall/types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -13,7 +13,9 @@
13
13
  */
14
14
  // createCapabilityToken and verifyCapabilityToken are server-only (node:crypto).
15
15
  // Import from @soulcraft/sdk/server.
16
- export { SDKError, SDKDisconnectedError, SDKTimeoutError, SDKAuthError, SDKForbiddenError, SDKRpcError, SDKMethodNotFoundError, } from './modules/brainy/errors.js';
16
+ export { SDKError, SDKDisconnectedError, SDKTimeoutError, SDKAuthError, SDKForbiddenError, SDKReadOnlyError, SDKRpcError, SDKMethodNotFoundError, } from './modules/brainy/errors.js';
17
+ // ── Read-only enforcement (shared registry) ─────────────────────────────────
18
+ export { isWriteMethod, WRITE_METHODS } from './read-only.js';
17
19
  // SOULCRAFT_USER_FIELDS and SOULCRAFT_SESSION_CONFIG are pure constants — safe on shared entry.
18
20
  // computeEmailHash, getAuthMode, getOIDCClientConfig use node:crypto / process.env.
19
21
  // Import those from @soulcraft/sdk/server.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA+BH,iFAAiF;AACjF,qCAAqC;AACrC,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,sBAAsB,GACvB,MAAM,4BAA4B,CAAA;AA8DnC,gGAAgG;AAChG,oFAAoF;AACpF,2CAA2C;AAC3C,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,0BAA0B,CAAA;AAejC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAoFjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA+BH,iFAAiF;AACjF,qCAAqC;AACrC,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,sBAAsB,GACvB,MAAM,4BAA4B,CAAA;AAEnC,+EAA+E;AAC/E,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AA8D7D,gGAAgG;AAChG,oFAAoF;AACpF,2CAA2C;AAC3C,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,0BAA0B,CAAA;AAejC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAoFjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAA"}
@@ -98,6 +98,35 @@ export declare class SDKForbiddenError extends SDKError {
98
98
  */
99
99
  constructor(detail?: string, cause?: unknown);
100
100
  }
101
+ /**
102
+ * Thrown when a mutation is attempted on a read-only transport.
103
+ *
104
+ * The {@link ReadOnlyTransport} wrapper blocks known write methods (create, update,
105
+ * delete, etc.) before they reach the wire. This error provides an AI-friendly
106
+ * message that can be relayed directly to the user.
107
+ *
108
+ * @example
109
+ * ```typescript
110
+ * try {
111
+ * await sdk.brainy.add({ data: { name: 'test' } })
112
+ * } catch (err) {
113
+ * if (err instanceof SDKReadOnlyError) {
114
+ * showToast(err.message) // "Cannot create entities — workspace is read-only..."
115
+ * }
116
+ * }
117
+ * ```
118
+ */
119
+ export declare class SDKReadOnlyError extends SDKError {
120
+ /** The namespace that was targeted (e.g. `'brainy'`, `'collections'`). */
121
+ readonly namespace: string;
122
+ /** The method that was blocked (e.g. `'add'`, `'writeFile'`). */
123
+ readonly method: string;
124
+ /**
125
+ * @param ns - The target namespace.
126
+ * @param method - The blocked method name.
127
+ */
128
+ constructor(ns: string, method: string);
129
+ }
101
130
  /**
102
131
  * Thrown when a remote RPC call fails on the server side.
103
132
  *
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/modules/brainy/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;GAMG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,wEAAwE;IACxE,SAAgB,IAAI,EAAE,MAAM,CAAA;IAE5B;;;;OAIG;gBACS,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAK3D;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,QAAQ;IAChD;;OAEG;gBACS,KAAK,CAAC,EAAE,OAAO;CAI5B;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,eAAgB,SAAQ,QAAQ;IAC3C,8EAA8E;IAC9E,SAAgB,MAAM,EAAE,MAAM,CAAA;IAE9B;;OAEG;gBACS,MAAM,EAAE,MAAM;CAK3B;AAED;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,QAAQ;IACxC;;;OAGG;gBACS,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,QAAQ;IAC7C;;;OAGG;gBACS,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,QAAQ;IACvC,qEAAqE;IACrE,SAAgB,UAAU,EAAE,MAAM,CAAA;IAElC;;;;OAIG;gBACS,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAKvE;AAED;;;;;GAKG;AACH,qBAAa,sBAAuB,SAAQ,QAAQ;IAClD;;OAEG;gBACS,MAAM,EAAE,MAAM;CAI3B"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/modules/brainy/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;GAMG;AACH,qBAAa,QAAS,SAAQ,KAAK;IACjC,wEAAwE;IACxE,SAAgB,IAAI,EAAE,MAAM,CAAA;IAE5B;;;;OAIG;gBACS,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAK3D;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,QAAQ;IAChD;;OAEG;gBACS,KAAK,CAAC,EAAE,OAAO;CAI5B;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,eAAgB,SAAQ,QAAQ;IAC3C,8EAA8E;IAC9E,SAAgB,MAAM,EAAE,MAAM,CAAA;IAE9B;;OAEG;gBACS,MAAM,EAAE,MAAM;CAK3B;AAED;;;;;GAKG;AACH,qBAAa,YAAa,SAAQ,QAAQ;IACxC;;;OAGG;gBACS,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,QAAQ;IAC7C;;;OAGG;gBACS,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,gBAAiB,SAAQ,QAAQ;IAC5C,0EAA0E;IAC1E,SAAgB,SAAS,EAAE,MAAM,CAAA;IACjC,iEAAiE;IACjE,SAAgB,MAAM,EAAE,MAAM,CAAA;IAE9B;;;OAGG;gBACS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAUvC;AAED;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,QAAQ;IACvC,qEAAqE;IACrE,SAAgB,UAAU,EAAE,MAAM,CAAA;IAElC;;;;OAIG;gBACS,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAKvE;AAED;;;;;GAKG;AACH,qBAAa,sBAAuB,SAAQ,QAAQ;IAClD;;OAEG;gBACS,MAAM,EAAE,MAAM;CAI3B"}
@@ -115,6 +115,41 @@ export class SDKForbiddenError extends SDKError {
115
115
  this.name = 'SDKForbiddenError';
116
116
  }
117
117
  }
118
+ /**
119
+ * Thrown when a mutation is attempted on a read-only transport.
120
+ *
121
+ * The {@link ReadOnlyTransport} wrapper blocks known write methods (create, update,
122
+ * delete, etc.) before they reach the wire. This error provides an AI-friendly
123
+ * message that can be relayed directly to the user.
124
+ *
125
+ * @example
126
+ * ```typescript
127
+ * try {
128
+ * await sdk.brainy.add({ data: { name: 'test' } })
129
+ * } catch (err) {
130
+ * if (err instanceof SDKReadOnlyError) {
131
+ * showToast(err.message) // "Cannot create entities — workspace is read-only..."
132
+ * }
133
+ * }
134
+ * ```
135
+ */
136
+ export class SDKReadOnlyError extends SDKError {
137
+ /** The namespace that was targeted (e.g. `'brainy'`, `'collections'`). */
138
+ namespace;
139
+ /** The method that was blocked (e.g. `'add'`, `'writeFile'`). */
140
+ method;
141
+ /**
142
+ * @param ns - The target namespace.
143
+ * @param method - The blocked method name.
144
+ */
145
+ constructor(ns, method) {
146
+ super('READ_ONLY', `Cannot execute ${ns}.${method} — this workspace is in read-only mode. ` +
147
+ `Enable editing from the lock icon in the toolbar to make changes.`);
148
+ this.name = 'SDKReadOnlyError';
149
+ this.namespace = ns;
150
+ this.method = method;
151
+ }
152
+ }
118
153
  /**
119
154
  * Thrown when a remote RPC call fails on the server side.
120
155
  *
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/modules/brainy/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH;;;;;;GAMG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,wEAAwE;IACxD,IAAI,CAAQ;IAE5B;;;;OAIG;IACH,YAAY,IAAY,EAAE,OAAe,EAAE,KAAe;QACxD,KAAK,CAAC,OAAO,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAC3D,IAAI,CAAC,IAAI,GAAG,UAAU,CAAA;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,oBAAqB,SAAQ,QAAQ;IAChD;;OAEG;IACH,YAAY,KAAe;QACzB,KAAK,CAAC,cAAc,EAAE,uCAAuC,EAAE,KAAK,CAAC,CAAA;QACrE,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAA;IACpC,CAAC;CACF;AAED;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAC3C,8EAA8E;IAC9D,MAAM,CAAQ;IAE9B;;OAEG;IACH,YAAY,MAAc;QACxB,KAAK,CAAC,SAAS,EAAE,yBAAyB,MAAM,kBAAkB,CAAC,CAAA;QACnE,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,YAAa,SAAQ,QAAQ;IACxC;;;OAGG;IACH,YAAY,MAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,cAAc,EAAE,+BAA+B,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAA;QAC3F,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;IAC5B,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,iBAAkB,SAAQ,QAAQ;IAC7C;;;OAGG;IACH,YAAY,MAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,WAAW,EAAE,gCAAgC,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAA;QACzF,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAA;IACjC,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,WAAY,SAAQ,QAAQ;IACvC,qEAAqE;IACrD,UAAU,CAAQ;IAElC;;;;OAIG;IACH,YAAY,UAAkB,EAAE,aAAqB,EAAE,KAAe;QACpE,KAAK,CAAC,WAAW,EAAE,sBAAsB,UAAU,KAAK,aAAa,EAAE,EAAE,KAAK,CAAC,CAAA;QAC/E,IAAI,CAAC,IAAI,GAAG,aAAa,CAAA;QACzB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,OAAO,sBAAuB,SAAQ,QAAQ;IAClD;;OAEG;IACH,YAAY,MAAc;QACxB,KAAK,CAAC,kBAAkB,EAAE,gBAAgB,MAAM,gCAAgC,CAAC,CAAA;QACjF,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAA;IACtC,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/modules/brainy/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @module read-only
3
+ * @description Shared read-only enforcement for @soulcraft/sdk.
4
+ *
5
+ * Defines the canonical registry of mutation methods per SDK namespace. Both the
6
+ * client-side {@link ReadOnlyTransport} (blocks before the wire) and the server-side
7
+ * {@link createReadOnlyAuthorize} helper (blocks after the wire) import from this
8
+ * module to guarantee the same methods are blocked on both sides.
9
+ *
10
+ * ## Architecture
11
+ *
12
+ * ```
13
+ * Browser (Workshop) Server (Venue)
14
+ * ┌─────────────────┐ ┌─────────────────┐
15
+ * │ ReadOnlyTransport│ ── wire ──▶│ authorize() │
16
+ * │ blocks before │ │ blocks after │
17
+ * │ callNs() │ │ dispatch() │
18
+ * └────────┬────────┘ └────────┬────────┘
19
+ * │ │
20
+ * └──── both use ────────────────┘
21
+ * isWriteMethod()
22
+ * from @soulcraft/sdk
23
+ * ```
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * import { isWriteMethod } from '@soulcraft/sdk'
28
+ *
29
+ * isWriteMethod('brainy', 'find') // false (read)
30
+ * isWriteMethod('brainy', 'add') // true (write)
31
+ * isWriteMethod('brainy.vfs', 'readdir') // false (read)
32
+ * isWriteMethod('brainy.vfs', 'writeFile') // true (write)
33
+ * ```
34
+ */
35
+ export { SDKReadOnlyError } from './modules/brainy/errors.js';
36
+ /**
37
+ * Known mutation methods per SDK namespace. Any `callNs(ns, method)` matching
38
+ * an entry here is considered a write operation.
39
+ *
40
+ * Methods not in this registry are considered reads — the default is "allow".
41
+ * This registry is the single source of truth for both client-side
42
+ * {@link ReadOnlyTransport} and server-side {@link createReadOnlyAuthorize}.
43
+ */
44
+ export declare const WRITE_METHODS: Readonly<Record<string, ReadonlySet<string>>>;
45
+ /**
46
+ * Check whether a namespace + method combination is a known write operation.
47
+ *
48
+ * Used by both {@link ReadOnlyTransport} (client) and
49
+ * {@link createReadOnlyAuthorize} (server) to enforce read-only mode.
50
+ *
51
+ * @param ns - The target namespace (e.g. `'brainy'`, `'brainy.vfs'`).
52
+ * @param method - The method name (e.g. `'add'`, `'readdir'`).
53
+ * @returns `true` if the method mutates data, `false` if it's a read or unknown.
54
+ */
55
+ export declare function isWriteMethod(ns: string, method: string): boolean;
56
+ //# sourceMappingURL=read-only.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-only.d.ts","sourceRoot":"","sources":["../src/read-only.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAM7D;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CA2DvE,CAAA;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAEjE"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * @module read-only
3
+ * @description Shared read-only enforcement for @soulcraft/sdk.
4
+ *
5
+ * Defines the canonical registry of mutation methods per SDK namespace. Both the
6
+ * client-side {@link ReadOnlyTransport} (blocks before the wire) and the server-side
7
+ * {@link createReadOnlyAuthorize} helper (blocks after the wire) import from this
8
+ * module to guarantee the same methods are blocked on both sides.
9
+ *
10
+ * ## Architecture
11
+ *
12
+ * ```
13
+ * Browser (Workshop) Server (Venue)
14
+ * ┌─────────────────┐ ┌─────────────────┐
15
+ * │ ReadOnlyTransport│ ── wire ──▶│ authorize() │
16
+ * │ blocks before │ │ blocks after │
17
+ * │ callNs() │ │ dispatch() │
18
+ * └────────┬────────┘ └────────┬────────┘
19
+ * │ │
20
+ * └──── both use ────────────────┘
21
+ * isWriteMethod()
22
+ * from @soulcraft/sdk
23
+ * ```
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * import { isWriteMethod } from '@soulcraft/sdk'
28
+ *
29
+ * isWriteMethod('brainy', 'find') // false (read)
30
+ * isWriteMethod('brainy', 'add') // true (write)
31
+ * isWriteMethod('brainy.vfs', 'readdir') // false (read)
32
+ * isWriteMethod('brainy.vfs', 'writeFile') // true (write)
33
+ * ```
34
+ */
35
+ // Re-export the error class for convenience
36
+ export { SDKReadOnlyError } from './modules/brainy/errors.js';
37
+ // ─────────────────────────────────────────────────────────────────────────────
38
+ // Write method registry
39
+ // ─────────────────────────────────────────────────────────────────────────────
40
+ /**
41
+ * Known mutation methods per SDK namespace. Any `callNs(ns, method)` matching
42
+ * an entry here is considered a write operation.
43
+ *
44
+ * Methods not in this registry are considered reads — the default is "allow".
45
+ * This registry is the single source of truth for both client-side
46
+ * {@link ReadOnlyTransport} and server-side {@link createReadOnlyAuthorize}.
47
+ */
48
+ export const WRITE_METHODS = {
49
+ // Brainy core — entity CRUD + relationship mutations
50
+ 'brainy': new Set([
51
+ 'add', 'update', 'remove', 'upsert', 'batch',
52
+ 'relate', 'unrelate', 'flush',
53
+ ]),
54
+ // Brainy VFS — file system mutations
55
+ 'brainy.vfs': new Set([
56
+ 'writeFile', 'deleteFile', 'mkdir', 'rename',
57
+ ]),
58
+ // Brainy versions — commit/revert
59
+ 'brainy.versions': new Set([
60
+ 'commit', 'revert', 'createBranch', 'deleteBranch', 'checkout',
61
+ ]),
62
+ // Graph — node deletion
63
+ 'graph': new Set(['deleteNode']),
64
+ // Collections — CRUD + membership
65
+ 'collections': new Set([
66
+ 'create', 'update', 'delete',
67
+ 'addMember', 'removeMember',
68
+ 'loadSampleData', 'clearSampleData',
69
+ ]),
70
+ // Annotations — CRUD
71
+ 'annotations': new Set(['create', 'update', 'delete']),
72
+ // Import — file ingestion
73
+ 'import': new Set(['uploadFiles', 'importData', 'cancel']),
74
+ // Workspace — mutations (but not reads)
75
+ 'workspace': new Set([
76
+ 'create', 'update', 'delete',
77
+ 'backup', 'restore', 'connectVenue', 'updateSettings',
78
+ ]),
79
+ // Publish — link/deploy mutations
80
+ 'publish': new Set([
81
+ 'createLink', 'deleteLink',
82
+ 'deployToVenue', 'publishToAcademy', 'to',
83
+ ]),
84
+ // Settings — key/config mutations
85
+ 'settings': new Set(['saveApiKey', 'deleteApiKey', 'updateSettings']),
86
+ // Media — upload/delete
87
+ 'media': new Set(['upload', 'delete']),
88
+ // Commerce — transactional mutations
89
+ 'commerce': new Set(['createProduct', 'checkout']),
90
+ // Certification — issuance
91
+ 'certification': new Set(['issue', 'revoke']),
92
+ // Pulse — event tracking (write-only namespace)
93
+ 'pulse': new Set(['track']),
94
+ };
95
+ /**
96
+ * Check whether a namespace + method combination is a known write operation.
97
+ *
98
+ * Used by both {@link ReadOnlyTransport} (client) and
99
+ * {@link createReadOnlyAuthorize} (server) to enforce read-only mode.
100
+ *
101
+ * @param ns - The target namespace (e.g. `'brainy'`, `'brainy.vfs'`).
102
+ * @param method - The method name (e.g. `'add'`, `'readdir'`).
103
+ * @returns `true` if the method mutates data, `false` if it's a read or unknown.
104
+ */
105
+ export function isWriteMethod(ns, method) {
106
+ return WRITE_METHODS[ns]?.has(method) === true;
107
+ }
108
+ //# sourceMappingURL=read-only.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-only.js","sourceRoot":"","sources":["../src/read-only.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,4CAA4C;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAE7D,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAkD;IAC1E,qDAAqD;IACrD,QAAQ,EAAE,IAAI,GAAG,CAAC;QAChB,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO;QAC5C,QAAQ,EAAE,UAAU,EAAE,OAAO;KAC9B,CAAC;IAEF,qCAAqC;IACrC,YAAY,EAAE,IAAI,GAAG,CAAC;QACpB,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ;KAC7C,CAAC;IAEF,kCAAkC;IAClC,iBAAiB,EAAE,IAAI,GAAG,CAAC;QACzB,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU;KAC/D,CAAC;IAEF,wBAAwB;IACxB,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;IAEhC,kCAAkC;IAClC,aAAa,EAAE,IAAI,GAAG,CAAC;QACrB,QAAQ,EAAE,QAAQ,EAAE,QAAQ;QAC5B,WAAW,EAAE,cAAc;QAC3B,gBAAgB,EAAE,iBAAiB;KACpC,CAAC;IAEF,qBAAqB;IACrB,aAAa,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEtD,0BAA0B;IAC1B,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IAE1D,wCAAwC;IACxC,WAAW,EAAE,IAAI,GAAG,CAAC;QACnB,QAAQ,EAAE,QAAQ,EAAE,QAAQ;QAC5B,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB;KACtD,CAAC;IAEF,kCAAkC;IAClC,SAAS,EAAE,IAAI,GAAG,CAAC;QACjB,YAAY,EAAE,YAAY;QAC1B,eAAe,EAAE,kBAAkB,EAAE,IAAI;KAC1C,CAAC;IAEF,kCAAkC;IAClC,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;IAErE,wBAAwB;IACxB,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEtC,qCAAqC;IACrC,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAElD,2BAA2B;IAC3B,eAAe,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE7C,gDAAgD;IAChD,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;CAC5B,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,EAAU,EAAE,MAAc;IACtD,OAAO,aAAa,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAA;AAChD,CAAC"}
@@ -56,6 +56,7 @@ export type { CreateCapabilityTokenOptions, CapabilityTokenClaims } from '../mod
56
56
  export { LocalTransport } from '../transports/local.js';
57
57
  export { createCachedDispatch, LruCacheProvider, DEFAULT_CACHEABLE_METHODS } from './rpc-cache.js';
58
58
  export type { CacheProvider, CacheEntry, RpcCacheConfig, CacheMetricsEvent } from './rpc-cache.js';
59
+ export { createReadOnlyAuthorize } from './read-only.js';
59
60
  export { createNamespaceRouter } from './namespace-router.js';
60
61
  export type { NamespaceRouterConfig, NamespaceRouter, NamespaceProvider, NamespaceProviders, RequestContext, UserContext, HandlerContext, PreAuthenticatedContext, DispatchResult, } from './namespace-router.js';
61
62
  export { createNamespaceWsHandler } from './ws-handler.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;AAG/D,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,UAAU,EACV,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,qBAAqB,EACrB,UAAU,EACV,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAC3B,YAAY,EACV,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,yBAAyB,EACzB,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,eAAe,EACf,eAAe,EACf,WAAW,EACX,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,qBAAqB,GACtB,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,gCAAgC,EAChC,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,yBAAyB,EACzB,OAAO,GACR,MAAM,uCAAuC,CAAA;AAC9C,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,4BAA4B,EAC5B,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,uCAAuC,CAAA;AAG9C,OAAO,EAAE,qCAAqC,EAAE,MAAM,wCAAwC,CAAA;AAC9F,YAAY,EACV,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,wCAAwC,CAAA;AAG/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAClE,YAAY,EACV,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,cAAc,EACd,uBAAuB,GACxB,MAAM,8BAA8B,CAAA;AAGrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,uBAAuB,EACvB,kBAAkB,EAClB,cAAc,GACf,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kCAAkC,CAAA;AAGzC,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,WAAW,EACX,mBAAmB,GACpB,MAAM,2BAA2B,CAAA;AAGlC,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,kBAAkB,GACnB,MAAM,6BAA6B,CAAA;AACpC,YAAY,EACV,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,6BAA6B,CAAA;AAGpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,YAAY,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,YAAY,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAG7E,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACjE,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACxF,YAAY,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACpG,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAGvD,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAClG,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAGlG,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAGxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,YAAY,EACV,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,cAAc,EACd,uBAAuB,EACvB,cAAc,GACf,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAC1D,YAAY,EACV,wBAAwB,EACxB,kBAAkB,EAClB,SAAS,GACV,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACnD,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAI3E,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,0BAA0B,EAC1B,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EACV,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,EAClB,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,yBAAyB,EACzB,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,0BAA0B,EAC1B,YAAY,EACZ,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,sBAAsB,GACvB,MAAM,qBAAqB,CAAA"}
@@ -54,6 +54,8 @@ export { createCapabilityToken, verifyCapabilityToken } from '../modules/brainy/
54
54
  export { LocalTransport } from '../transports/local.js';
55
55
  // ── RPC response cache ────────────────────────────────────────────────────────
56
56
  export { createCachedDispatch, LruCacheProvider, DEFAULT_CACHEABLE_METHODS } from './rpc-cache.js';
57
+ // ── Read-only enforcement (server-side) ──────────────────────────────────────
58
+ export { createReadOnlyAuthorize } from './read-only.js';
57
59
  // ── Namespace router ─────────────────────────────────────────────────────────
58
60
  export { createNamespaceRouter } from './namespace-router.js';
59
61
  // ── Namespace WebSocket handler ─────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,iFAAiF;AACjF,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAM3B,iFAAiF;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;AAE/D,gFAAgF;AAChF,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,UAAU,EACV,eAAe,GAChB,MAAM,oBAAoB,CAAA;AA4C3B,iFAAiF;AACjF,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,gCAAgC,EAChC,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,yBAAyB,EACzB,OAAO,GACR,MAAM,uCAAuC,CAAA;AAa9C,+EAA+E;AAC/E,OAAO,EAAE,qCAAqC,EAAE,MAAM,wCAAwC,CAAA;AAM9F,iFAAiF;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AASlE,iFAAiF;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAU5D,iFAAiF;AACjF,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kCAAkC,CAAA;AAEzC,gFAAgF;AAChF,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,WAAW,EACX,mBAAmB,GACpB,MAAM,2BAA2B,CAAA;AAElC,gFAAgF;AAChF,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,kBAAkB,GACnB,MAAM,6BAA6B,CAAA;AAMpC,gFAAgF;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAK7E,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAExF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEvD,iFAAiF;AACjF,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAGlG,gFAAgF;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAa7D,+EAA+E;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAO1D,+EAA+E;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAGnD,gFAAgF;AAChF,iFAAiF;AACjF,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,0BAA0B,EAC1B,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,qBAAqB,CAAA;AA4D5B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,0BAA0B,EAC1B,YAAY,EACZ,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,sBAAsB,GACvB,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,iFAAiF;AACjF,OAAO,EACL,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAM3B,iFAAiF;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;AAE/D,gFAAgF;AAChF,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,UAAU,EACV,eAAe,GAChB,MAAM,oBAAoB,CAAA;AA4C3B,iFAAiF;AACjF,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,gCAAgC,EAChC,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,yBAAyB,EACzB,OAAO,GACR,MAAM,uCAAuC,CAAA;AAa9C,+EAA+E;AAC/E,OAAO,EAAE,qCAAqC,EAAE,MAAM,wCAAwC,CAAA;AAM9F,iFAAiF;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AASlE,iFAAiF;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAU5D,iFAAiF;AACjF,OAAO,EACL,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kCAAkC,CAAA;AAEzC,gFAAgF;AAChF,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,WAAW,EACX,mBAAmB,GACpB,MAAM,2BAA2B,CAAA;AAElC,gFAAgF;AAChF,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,kBAAkB,GACnB,MAAM,6BAA6B,CAAA;AAMpC,gFAAgF;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAK7E,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAExF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEvD,iFAAiF;AACjF,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAGlG,gFAAgF;AAChF,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAExD,gFAAgF;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAa7D,+EAA+E;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAA;AAO1D,+EAA+E;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAGnD,gFAAgF;AAChF,iFAAiF;AACjF,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,0BAA0B,EAC1B,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,qBAAqB,CAAA;AA4D5B,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,0BAA0B,EAC1B,YAAY,EACZ,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,sBAAsB,GACvB,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @module server/read-only
3
+ * @description Server-side read-only enforcement for the SDK namespace router.
4
+ *
5
+ * Provides {@link createReadOnlyAuthorize} — a factory that returns an `authorize`
6
+ * callback compatible with {@link NamespaceRouterConfig}. When plugged in, it blocks
7
+ * mutation methods **after they arrive over the wire** but before they reach the
8
+ * namespace handler or Brainy instance.
9
+ *
10
+ * Uses {@link isWriteMethod} from `@soulcraft/sdk` — the same registry used by the
11
+ * client-side {@link ReadOnlyTransport}, ensuring symmetrical enforcement.
12
+ *
13
+ * ## Architecture
14
+ *
15
+ * ```
16
+ * Client (ReadOnlyTransport) Server (authorize callback)
17
+ * blocks BEFORE the wire ←→ blocks AFTER the wire
18
+ * same isWriteMethod() same isWriteMethod()
19
+ * ```
20
+ *
21
+ * @example Venue — block writes for non-owner users
22
+ * ```typescript
23
+ * import { createReadOnlyAuthorize } from '@soulcraft/sdk/server'
24
+ *
25
+ * const routerConfig = {
26
+ * authenticate: async (ctx) => { ... },
27
+ * authorize: createReadOnlyAuthorize((user) => user.readOnly === true),
28
+ * resolveBrain: async (ctx) => { ... },
29
+ * providers: { ... },
30
+ * }
31
+ * ```
32
+ *
33
+ * @example Workshop — read-only for remote workspaces
34
+ * ```typescript
35
+ * authorize: createReadOnlyAuthorize((user) => !!user.readOnly),
36
+ * ```
37
+ */
38
+ import type { UserContext } from './namespace-router.js';
39
+ /**
40
+ * Creates an `authorize` callback for {@link NamespaceRouterConfig} that blocks
41
+ * mutation methods when the user is in read-only mode.
42
+ *
43
+ * The `shouldBlock` predicate receives the authenticated {@link UserContext} and
44
+ * returns `true` to enforce read-only mode for that request. The authorize callback
45
+ * then uses {@link isWriteMethod} to check whether the targeted namespace + method
46
+ * is a mutation — if so, returns `false` (403 Forbidden).
47
+ *
48
+ * @param shouldBlock - Predicate that determines whether the user is in read-only mode.
49
+ * @returns An `authorize` function compatible with `NamespaceRouterConfig.authorize`.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * // Block when UserContext has readOnly flag
54
+ * const authorize = createReadOnlyAuthorize(user => user.readOnly === true)
55
+ *
56
+ * // Block based on role
57
+ * const authorize = createReadOnlyAuthorize(user => user.role === 'viewer')
58
+ * ```
59
+ */
60
+ export declare function createReadOnlyAuthorize(shouldBlock: (user: UserContext) => boolean): (ns: string, method: string, args: unknown[], user: UserContext) => boolean;
61
+ //# sourceMappingURL=read-only.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-only.d.ts","sourceRoot":"","sources":["../../src/server/read-only.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAExD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,GAC1C,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAK7E"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @module server/read-only
3
+ * @description Server-side read-only enforcement for the SDK namespace router.
4
+ *
5
+ * Provides {@link createReadOnlyAuthorize} — a factory that returns an `authorize`
6
+ * callback compatible with {@link NamespaceRouterConfig}. When plugged in, it blocks
7
+ * mutation methods **after they arrive over the wire** but before they reach the
8
+ * namespace handler or Brainy instance.
9
+ *
10
+ * Uses {@link isWriteMethod} from `@soulcraft/sdk` — the same registry used by the
11
+ * client-side {@link ReadOnlyTransport}, ensuring symmetrical enforcement.
12
+ *
13
+ * ## Architecture
14
+ *
15
+ * ```
16
+ * Client (ReadOnlyTransport) Server (authorize callback)
17
+ * blocks BEFORE the wire ←→ blocks AFTER the wire
18
+ * same isWriteMethod() same isWriteMethod()
19
+ * ```
20
+ *
21
+ * @example Venue — block writes for non-owner users
22
+ * ```typescript
23
+ * import { createReadOnlyAuthorize } from '@soulcraft/sdk/server'
24
+ *
25
+ * const routerConfig = {
26
+ * authenticate: async (ctx) => { ... },
27
+ * authorize: createReadOnlyAuthorize((user) => user.readOnly === true),
28
+ * resolveBrain: async (ctx) => { ... },
29
+ * providers: { ... },
30
+ * }
31
+ * ```
32
+ *
33
+ * @example Workshop — read-only for remote workspaces
34
+ * ```typescript
35
+ * authorize: createReadOnlyAuthorize((user) => !!user.readOnly),
36
+ * ```
37
+ */
38
+ import { isWriteMethod } from '../read-only.js';
39
+ /**
40
+ * Creates an `authorize` callback for {@link NamespaceRouterConfig} that blocks
41
+ * mutation methods when the user is in read-only mode.
42
+ *
43
+ * The `shouldBlock` predicate receives the authenticated {@link UserContext} and
44
+ * returns `true` to enforce read-only mode for that request. The authorize callback
45
+ * then uses {@link isWriteMethod} to check whether the targeted namespace + method
46
+ * is a mutation — if so, returns `false` (403 Forbidden).
47
+ *
48
+ * @param shouldBlock - Predicate that determines whether the user is in read-only mode.
49
+ * @returns An `authorize` function compatible with `NamespaceRouterConfig.authorize`.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * // Block when UserContext has readOnly flag
54
+ * const authorize = createReadOnlyAuthorize(user => user.readOnly === true)
55
+ *
56
+ * // Block based on role
57
+ * const authorize = createReadOnlyAuthorize(user => user.role === 'viewer')
58
+ * ```
59
+ */
60
+ export function createReadOnlyAuthorize(shouldBlock) {
61
+ return (ns, method, _args, user) => {
62
+ if (!shouldBlock(user))
63
+ return true;
64
+ return !isWriteMethod(ns, method);
65
+ };
66
+ }
67
+ //# sourceMappingURL=read-only.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-only.js","sourceRoot":"","sources":["../../src/server/read-only.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAG/C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,uBAAuB,CACrC,WAA2C;IAE3C,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACjC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QACnC,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IACnC,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * @module transports/read-only
3
+ * @description Client-side transport wrapper that blocks mutation methods in read-only mode.
4
+ *
5
+ * Wraps any {@link NamespaceTransport} and intercepts `callNs()` / `callNsStream()`
6
+ * to reject known write operations **before they hit the wire**. Read operations pass
7
+ * through unmodified to the inner transport.
8
+ *
9
+ * The `isReadOnly` callback is evaluated on every call, so the read-only state can
10
+ * change dynamically (e.g. when the user clicks "Enable Editing" in the UI).
11
+ *
12
+ * Uses {@link isWriteMethod} from `@soulcraft/sdk` — the same registry used by
13
+ * the server-side {@link createReadOnlyAuthorize} helper, ensuring symmetrical
14
+ * enforcement on both sides of the wire.
15
+ *
16
+ * @example Workshop — wrap the DelegatingTransport
17
+ * ```typescript
18
+ * import { ReadOnlyTransport } from '@soulcraft/sdk/client'
19
+ *
20
+ * const readOnlyTransport = new ReadOnlyTransport(
21
+ * delegatingTransport,
22
+ * () => window.__soulcraft_read_only === true,
23
+ * )
24
+ * const sdk = createSoulcraftProxy(readOnlyTransport)
25
+ * ```
26
+ *
27
+ * @example Venue Viewer — always read-only in Portfolio mode
28
+ * ```typescript
29
+ * const readOnlyTransport = new ReadOnlyTransport(httpTransport, () => isPortfolioMode)
30
+ * ```
31
+ */
32
+ import type { NamespaceTransport } from '../client/namespace-proxy.js';
33
+ /**
34
+ * Transport wrapper that blocks mutation methods when in read-only mode.
35
+ *
36
+ * Intercepts `callNs()` and `callNsStream()` to check whether the targeted
37
+ * namespace + method is a known write operation. If so, throws
38
+ * {@link SDKReadOnlyError} immediately — no network round-trip, no server load.
39
+ *
40
+ * Read operations and all calls when `isReadOnly()` returns `false` are
41
+ * delegated to the inner transport unchanged.
42
+ */
43
+ export declare class ReadOnlyTransport implements NamespaceTransport {
44
+ private _inner;
45
+ private _isReadOnly;
46
+ /**
47
+ * @param inner - The real transport to delegate allowed calls to.
48
+ * @param isReadOnly - Callback evaluated on every call. Return `true` to block writes.
49
+ */
50
+ constructor(inner: NamespaceTransport, isReadOnly: () => boolean);
51
+ /**
52
+ * Replace the inner transport (e.g. when upgrading from HTTP to WS).
53
+ *
54
+ * @param transport - The new inner transport.
55
+ */
56
+ setInner(transport: NamespaceTransport): void;
57
+ /**
58
+ * Get the current inner transport.
59
+ *
60
+ * @returns The wrapped transport.
61
+ */
62
+ getInner(): NamespaceTransport;
63
+ callNs(ns: string, method: string, args: unknown[]): Promise<unknown>;
64
+ callNsStream(ns: string, method: string, args: unknown[]): AsyncIterable<unknown>;
65
+ isAlive(): boolean;
66
+ close(): Promise<void>;
67
+ }
68
+ //# sourceMappingURL=read-only.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-only.d.ts","sourceRoot":"","sources":["../../src/transports/read-only.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAQtE;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,YAAW,kBAAkB;IAC1D,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,WAAW,CAAe;IAElC;;;OAGG;gBACS,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,OAAO;IAKhE;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,kBAAkB,GAAG,IAAI;IAI7C;;;;OAIG;IACH,QAAQ,IAAI,kBAAkB;IAI9B,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAOrE,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC;IAejF,OAAO,IAAI,OAAO;IAIlB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAGvB"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * @module transports/read-only
3
+ * @description Client-side transport wrapper that blocks mutation methods in read-only mode.
4
+ *
5
+ * Wraps any {@link NamespaceTransport} and intercepts `callNs()` / `callNsStream()`
6
+ * to reject known write operations **before they hit the wire**. Read operations pass
7
+ * through unmodified to the inner transport.
8
+ *
9
+ * The `isReadOnly` callback is evaluated on every call, so the read-only state can
10
+ * change dynamically (e.g. when the user clicks "Enable Editing" in the UI).
11
+ *
12
+ * Uses {@link isWriteMethod} from `@soulcraft/sdk` — the same registry used by
13
+ * the server-side {@link createReadOnlyAuthorize} helper, ensuring symmetrical
14
+ * enforcement on both sides of the wire.
15
+ *
16
+ * @example Workshop — wrap the DelegatingTransport
17
+ * ```typescript
18
+ * import { ReadOnlyTransport } from '@soulcraft/sdk/client'
19
+ *
20
+ * const readOnlyTransport = new ReadOnlyTransport(
21
+ * delegatingTransport,
22
+ * () => window.__soulcraft_read_only === true,
23
+ * )
24
+ * const sdk = createSoulcraftProxy(readOnlyTransport)
25
+ * ```
26
+ *
27
+ * @example Venue Viewer — always read-only in Portfolio mode
28
+ * ```typescript
29
+ * const readOnlyTransport = new ReadOnlyTransport(httpTransport, () => isPortfolioMode)
30
+ * ```
31
+ */
32
+ import { SDKReadOnlyError } from '../modules/brainy/errors.js';
33
+ import { isWriteMethod } from '../read-only.js';
34
+ // ─────────────────────────────────────────────────────────────────────────────
35
+ // ReadOnlyTransport
36
+ // ─────────────────────────────────────────────────────────────────────────────
37
+ /**
38
+ * Transport wrapper that blocks mutation methods when in read-only mode.
39
+ *
40
+ * Intercepts `callNs()` and `callNsStream()` to check whether the targeted
41
+ * namespace + method is a known write operation. If so, throws
42
+ * {@link SDKReadOnlyError} immediately — no network round-trip, no server load.
43
+ *
44
+ * Read operations and all calls when `isReadOnly()` returns `false` are
45
+ * delegated to the inner transport unchanged.
46
+ */
47
+ export class ReadOnlyTransport {
48
+ _inner;
49
+ _isReadOnly;
50
+ /**
51
+ * @param inner - The real transport to delegate allowed calls to.
52
+ * @param isReadOnly - Callback evaluated on every call. Return `true` to block writes.
53
+ */
54
+ constructor(inner, isReadOnly) {
55
+ this._inner = inner;
56
+ this._isReadOnly = isReadOnly;
57
+ }
58
+ /**
59
+ * Replace the inner transport (e.g. when upgrading from HTTP to WS).
60
+ *
61
+ * @param transport - The new inner transport.
62
+ */
63
+ setInner(transport) {
64
+ this._inner = transport;
65
+ }
66
+ /**
67
+ * Get the current inner transport.
68
+ *
69
+ * @returns The wrapped transport.
70
+ */
71
+ getInner() {
72
+ return this._inner;
73
+ }
74
+ callNs(ns, method, args) {
75
+ if (this._isReadOnly() && isWriteMethod(ns, method)) {
76
+ return Promise.reject(new SDKReadOnlyError(ns, method));
77
+ }
78
+ return this._inner.callNs(ns, method, args);
79
+ }
80
+ callNsStream(ns, method, args) {
81
+ if (this._isReadOnly() && isWriteMethod(ns, method)) {
82
+ return {
83
+ [Symbol.asyncIterator]() {
84
+ return {
85
+ next() {
86
+ return Promise.reject(new SDKReadOnlyError(ns, method));
87
+ },
88
+ };
89
+ },
90
+ };
91
+ }
92
+ return this._inner.callNsStream(ns, method, args);
93
+ }
94
+ isAlive() {
95
+ return this._inner.isAlive();
96
+ }
97
+ close() {
98
+ return this._inner.close();
99
+ }
100
+ }
101
+ //# sourceMappingURL=read-only.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-only.js","sourceRoot":"","sources":["../../src/transports/read-only.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF;;;;;;;;;GASG;AACH,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAoB;IAC1B,WAAW,CAAe;IAElC;;;OAGG;IACH,YAAY,KAAyB,EAAE,UAAyB;QAC9D,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAA;IAC/B,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,SAA6B;QACpC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;IACzB,CAAC;IAED;;;;OAIG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,MAAM,CAAC,EAAU,EAAE,MAAc,EAAE,IAAe;QAChD,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;YACpD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAA;QACzD,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;IAC7C,CAAC;IAED,YAAY,CAAC,EAAU,EAAE,MAAc,EAAE,IAAe;QACtD,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;YACpD,OAAO;gBACL,CAAC,MAAM,CAAC,aAAa,CAAC;oBACpB,OAAO;wBACL,IAAI;4BACF,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAA;wBACzD,CAAC;qBACF,CAAA;gBACH,CAAC;aACF,CAAA;QACH,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;IACnD,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;IAC9B,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;IAC5B,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soulcraft/sdk",
3
- "version": "3.3.7",
3
+ "version": "3.3.8",
4
4
  "description": "The unified Soulcraft platform SDK — data, auth, AI, billing, and notifications",
5
5
  "type": "module",
6
6
  "publishConfig": {