From 17ac540b1dee731f14eb2ae82ee7ba2e6f7a5b39 Mon Sep 17 00:00:00 2001 From: David Bourgeois Date: Sun, 23 Nov 2025 00:05:31 +0100 Subject: [PATCH 1/2] Fix when a node has no childs When en element of type Node has no childs, the root of the node is returned by getDirectoryAsync. This generates an infinite loop when the same function is called. By returning the element and not the root, this properly detects that there is no child and finishes that branch of the tree. --- src/client/ember-client.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/client/ember-client.ts b/src/client/ember-client.ts index 2233245..ba11693 100755 --- a/src/client/ember-client.ts +++ b/src/client/ember-client.ts @@ -264,9 +264,11 @@ export class EmberClient extends EventEmitter { throw new InvalidEmberResponseError(`getDirectory ${requestedPath}`); } } else if (node.getElementByPath(requestedPath) != null) { - this.logger?.log(ClientLogs.GETDIRECTORY_RESPONSE(node)); - if (node.isStream()) { - const streamIdentifier = (node as Parameter).streamIdentifier; + const resolved = node.getElementByPath(requestedPath)!; + this.logger?.log(ClientLogs.GETDIRECTORY_RESPONSE(resolved)); + + if (resolved.isStream && resolved.isStream()) { + const streamIdentifier = (resolved as Parameter).streamIdentifier; const streamEntry = this._streams.getEntry(streamIdentifier); if (streamEntry != null && streamEntry.value !== requestedPath) { // Duplicate Stream Entry. @@ -281,7 +283,7 @@ export class EmberClient extends EventEmitter { ); } } - return node; // make sure the info is treated before going to next request. + return resolved; // return the element, not the response root } else if (node.getElementByPath(requestedPath) != null) { } else { const nodeElements = node?.getChildren(); if (nodeElements != null && From 681749d462af489fbeaf5de3f3bf5ab4c5e1a428 Mon Sep 17 00:00:00 2001 From: David Bourgeois Date: Sun, 23 Nov 2025 01:01:12 +0100 Subject: [PATCH 2/2] Complied to the linter rule no-non-null-assertion --- src/client/ember-client.ts | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/client/ember-client.ts b/src/client/ember-client.ts index ba11693..d8f5cc6 100755 --- a/src/client/ember-client.ts +++ b/src/client/ember-client.ts @@ -264,26 +264,28 @@ export class EmberClient extends EventEmitter { throw new InvalidEmberResponseError(`getDirectory ${requestedPath}`); } } else if (node.getElementByPath(requestedPath) != null) { - const resolved = node.getElementByPath(requestedPath)!; - this.logger?.log(ClientLogs.GETDIRECTORY_RESPONSE(resolved)); - - if (resolved.isStream && resolved.isStream()) { - const streamIdentifier = (resolved as Parameter).streamIdentifier; - const streamEntry = this._streams.getEntry(streamIdentifier); - if (streamEntry != null && streamEntry.value !== requestedPath) { - // Duplicate Stream Entry. - this.logger?.log(ClientLogs.DUPLICATE_STREAM_IDENTIFIER(streamIdentifier, requestedPath, streamEntry.value)); - } else { - this.logger?.log(ClientLogs.ADDING_STREAM_IDENTIFIER(streamIdentifier, requestedPath)); - this._streams.addEntry( - new StreamEntry( - streamIdentifier, - requestedPath - ) - ); + const resolved = node.getElementByPath(requestedPath); + if (resolved != null) { + this.logger?.log(ClientLogs.GETDIRECTORY_RESPONSE(resolved)); + + if (resolved.isStream && resolved.isStream()) { + const streamIdentifier = (resolved as Parameter).streamIdentifier; + const streamEntry = this._streams.getEntry(streamIdentifier); + if (streamEntry != null && streamEntry.value !== requestedPath) { + // Duplicate Stream Entry. + this.logger?.log(ClientLogs.DUPLICATE_STREAM_IDENTIFIER(streamIdentifier, requestedPath, streamEntry.value)); + } else { + this.logger?.log(ClientLogs.ADDING_STREAM_IDENTIFIER(streamIdentifier, requestedPath)); + this._streams.addEntry( + new StreamEntry( + streamIdentifier, + requestedPath + ) + ); + } } + return resolved; // return the element, not the response root } - return resolved; // return the element, not the response root } else if (node.getElementByPath(requestedPath) != null) { } else { const nodeElements = node?.getChildren(); if (nodeElements != null &&