So after setting some breakpoints within processSuccessfulLogin, fetchThreadInfos, fetchServerThreadInfos, and rawThreadInfosFromServerThreadInfos found the issue.
Pretty dumb mistake on my part when implementing fetchUserIDForEthereumAddress(...). The return value should be (and is typed as) ?string... but was actually returning ?number which broke some of the comparison checks in rawThreadInfosFromServerThreadInfos. Adding the .toString() at the end fixes things up and now registration and login work fully as expected.