Skip to content

Commit 6cb37f3

Browse files
fix(core): pass enforceStrictCapabilities as getter; document registerCapabilities/extension ordering
ExtensionHandle now reads enforceStrictCapabilities via a getter (matching the existing _getPeerExtensionSettings pattern), so a future setter on the host would be observed. JSDoc on extension() notes that a later registerCapabilities({extensions:{id:...}}) overwrites the wire value while handle.settings reflects the original call.
1 parent 63335f1 commit 6cb37f3

4 files changed

Lines changed: 14 additions & 6 deletions

File tree

packages/client/src/client/client.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,10 @@ export class Client extends Protocol<ClientContext> {
320320
* during `initialize`. Must be called before {@linkcode connect}. After connecting,
321321
* {@linkcode ExtensionHandle.getPeerSettings | handle.getPeerSettings()} returns the server's
322322
* `capabilities.extensions[id]` blob (validated against `peerSchema` if provided).
323+
*
324+
* Note: a later {@linkcode registerCapabilities} call that includes `extensions[id]` will
325+
* overwrite the wire value declared here; the returned handle's `settings` reflects what
326+
* was passed to this call, not subsequent overwrites.
323327
*/
324328
public extension<L extends JSONObject>(id: string, settings: L): ExtensionHandle<L, JSONObject, ClientContext>;
325329
public extension<L extends JSONObject, P extends AnySchema>(
@@ -344,7 +348,7 @@ export class Client extends Protocol<ClientContext> {
344348
id,
345349
settings,
346350
() => this._serverCapabilities?.extensions?.[id],
347-
this._enforceStrictCapabilities,
351+
() => this._enforceStrictCapabilities,
348352
opts?.peerSchema
349353
);
350354
}

packages/core/src/shared/extensionHandle.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export class ExtensionHandle<Local extends JSONObject, Peer = JSONObject, Contex
6767
/** The local settings object advertised in `capabilities.extensions[id]`. */
6868
public readonly settings: Local,
6969
private readonly _getPeerExtensionSettings: () => JSONObject | undefined,
70-
private readonly _enforceStrictCapabilities: boolean,
70+
private readonly _getEnforceStrictCapabilities: () => boolean,
7171
private readonly _peerSchema?: AnySchema
7272
) {}
7373

@@ -150,7 +150,7 @@ export class ExtensionHandle<Local extends JSONObject, Peer = JSONObject, Contex
150150
}
151151

152152
private _assertPeerCapability(method: string): void {
153-
if (this._enforceStrictCapabilities && this._getPeerExtensionSettings() === undefined) {
153+
if (this._getEnforceStrictCapabilities() && this._getPeerExtensionSettings() === undefined) {
154154
throw new SdkError(
155155
SdkErrorCode.CapabilityNotSupported,
156156
`Peer does not support extension "${this.id}" (required for ${method})`

packages/core/test/shared/extensionHandle.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ function makeHandle(opts: { peer?: JSONObject | undefined; strict?: boolean; pee
3333
'io.example/ui',
3434
{ local: true },
3535
() => opts.peer,
36-
opts.strict ?? false,
36+
() => opts.strict ?? false,
3737
opts.peerSchema
3838
);
3939
return { host, handle };
@@ -70,7 +70,7 @@ describe('ExtensionHandle.getPeerSettings', () => {
7070
let peer: JSONObject | undefined;
7171
const getter = vi.fn(() => peer);
7272
const host = makeMockHost() as unknown as ExtensionHost<BaseContext>;
73-
const handle = new ExtensionHandle(host, 'io.example/ui', {}, getter, false);
73+
const handle = new ExtensionHandle(host, 'io.example/ui', {}, getter, () => false);
7474

7575
expect(handle.getPeerSettings()).toBeUndefined();
7676
peer = { v: 1 };

packages/server/src/server/server.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,10 @@ export class Server extends Protocol<ServerContext> {
234234
* in the `initialize` result. Must be called before {@linkcode connect}. After connecting,
235235
* {@linkcode ExtensionHandle.getPeerSettings | handle.getPeerSettings()} returns the client's
236236
* `capabilities.extensions[id]` blob (validated against `peerSchema` if provided).
237+
*
238+
* Note: a later {@linkcode registerCapabilities} call that includes `extensions[id]` will
239+
* overwrite the wire value declared here; the returned handle's `settings` reflects what
240+
* was passed to this call, not subsequent overwrites.
237241
*/
238242
public extension<L extends JSONObject>(id: string, settings: L): ExtensionHandle<L, JSONObject, ServerContext>;
239243
public extension<L extends JSONObject, P extends AnySchema>(
@@ -258,7 +262,7 @@ export class Server extends Protocol<ServerContext> {
258262
id,
259263
settings,
260264
() => this._clientCapabilities?.extensions?.[id],
261-
this._enforceStrictCapabilities,
265+
() => this._enforceStrictCapabilities,
262266
opts?.peerSchema
263267
);
264268
}

0 commit comments

Comments
 (0)