public async Task OpenDatabase(OpenDatabaseRequest request) { try { ValidateDbInput(request); var(databaseName, changeHandler) = request; if (!_ws.State.DbNameToHash.TryGetValue(databaseName, out var dbNameHash)) { dbNameHash = HmacUtils.SignString(_ws.Keys.HmacKey, databaseName); _ws.State.DbNameToHash[databaseName] = dbNameHash; } var newDatabaseParams = CreateDatabase(databaseName); await OpenDatabaseInternal(dbNameHash, changeHandler, newDatabaseParams); } catch (Exception ex) { if (!(ex is IError e)) { throw new UnknownServiceUnavailable(ex); } switch (e.Name) { case "ParamsMustBeObject": case "DatabaseAlreadyOpening": case "DatabaseNameMustBeString": case "DatabaseNameMissing": case "DatabaseNameCannotBeBlank": case "DatabaseNameTooLong": case "ChangeHandlerMissing": case "ChangeHandlerMustBeFunction": case "UserNotSignedIn": case "UserNotFound": case "TooManyRequests": case "ServiceUnavailable": throw; default: throw new UnknownServiceUnavailable(ex); } } }
private void ValidateDbInput(OpenDatabaseRequest request) { var dbName = request.DatabaseName; if (string.IsNullOrEmpty(dbName)) { throw new DatabaseNameCannotBeBlank(); } if (dbName.Length > MAX_DB_NAME_CHAR_LENGTH) { throw new DatabaseNameTooLong(MAX_DB_NAME_CHAR_LENGTH); } if (_ws.Reconnecting) { throw new Reconnecting(); } if (!_ws.Keys.Init) { throw new UserNotSignedIn(); } }