diff --git a/VERSION.properties b/VERSION.properties index 419db72..3ec7b7e 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.2.82 -server.version=1.2.76 +client.version=1.2.83 +server.version=1.2.77 diff --git a/shine-UI/js/services/auth-service.js b/shine-UI/js/services/auth-service.js index 4c9ea18..15ce161 100644 --- a/shine-UI/js/services/auth-service.js +++ b/shine-UI/js/services/auth-service.js @@ -639,6 +639,14 @@ function normalizeMessageRefTarget(target, actionName = 'action') { }; } +function resolveLatestLineStep(message) { + const lineStep = Number(message?.lineStep); + if (Number.isFinite(lineStep) && lineStep >= 0) return lineStep; + const fallbackByVersions = Number(message?.versionsTotal); + if (Number.isFinite(fallbackByVersions) && fallbackByVersions > 0) return Math.max(0, fallbackByVersions - 1); + return null; +} + function buildBlockPreimage({ prevBlockHashHex, blockNumber, msgType, msgSubType, msgVersion = 1, bodyBytes }) { const prevHashBytes = hexToBytes(normalizeHex32(prevBlockHashHex)); const body = bodyBytes || new Uint8Array(0); @@ -1092,12 +1100,12 @@ export class AuthService { const latestMessage = Array.isArray(latestPayload?.messages) ? latestPayload.messages[0] : null; const latestBlockNumber = Number(latestMessage?.messageRef?.blockNumber); const latestBlockHash = normalizeHex32(latestMessage?.messageRef?.blockHash, ''); - const latestVersionsTotal = Number(latestMessage?.versionsTotal); + const latestLineStep = resolveLatestLineStep(latestMessage); if (Number.isFinite(latestBlockNumber) && latestBlockNumber >= 0 && latestBlockHash) { prevLineNumber = latestBlockNumber; prevLineHashHex = latestBlockHash; - thisLineNumber = Number.isFinite(latestVersionsTotal) && latestVersionsTotal > 0 - ? Math.max(0, latestVersionsTotal) + thisLineNumber = Number.isFinite(latestLineStep) + ? Math.max(0, latestLineStep + 1) : 1; } } catch { @@ -1169,12 +1177,12 @@ export class AuthService { const latestVersion = latestVersions[latestVersions.length - 1] || null; const latestBlockNumber = Number(latestVersion?.blockNumber ?? latestMessage?.messageRef?.blockNumber); const latestBlockHash = normalizeHex32(latestVersion?.blockHash ?? latestMessage?.messageRef?.blockHash, ''); - const latestVersionsTotal = Number(latestMessage?.versionsTotal); + const latestLineStep = resolveLatestLineStep(latestMessage); if (Number.isFinite(latestBlockNumber) && latestBlockNumber >= 0 && latestBlockHash) { prevLineNumber = latestBlockNumber; prevLineHashHex = latestBlockHash; - thisLineNumber = Number.isFinite(latestVersionsTotal) && latestVersionsTotal > 0 - ? Math.max(1, latestVersionsTotal) + thisLineNumber = Number.isFinite(latestLineStep) + ? Math.max(0, latestLineStep) : 1; } } catch { @@ -1497,14 +1505,13 @@ export class AuthService { const latestMessage = Array.isArray(latestPayload?.messages) ? latestPayload.messages[0] : null; const latestBlockNumber = Number(latestMessage?.messageRef?.blockNumber); const latestBlockHash = normalizeHex32(latestMessage?.messageRef?.blockHash, ''); - const latestVersionsTotal = Number(latestMessage?.versionsTotal); + const latestLineStep = resolveLatestLineStep(latestMessage); if (Number.isFinite(latestBlockNumber) && latestBlockNumber >= 0 && latestBlockHash) { prevLineNumber = latestBlockNumber; prevLineHashHex = latestBlockHash; - // В line-цепочке thisLineNumber — это номер шага линии, а не глобальный blockNumber. - // Для следующего POST берем шаг после последней известной версии сообщения. - thisLineNumber = Number.isFinite(latestVersionsTotal) && latestVersionsTotal > 0 - ? Math.max(0, latestVersionsTotal) + // Для нового POST берём следующий шаг после последнего сообщения линии. + thisLineNumber = Number.isFinite(latestLineStep) + ? Math.max(0, latestLineStep + 1) : 1; } } catch { diff --git a/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/ChannelsReadSupport.java b/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/ChannelsReadSupport.java index 476253b..b1e3fc8 100644 --- a/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/ChannelsReadSupport.java +++ b/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/ChannelsReadSupport.java @@ -179,7 +179,7 @@ final class ChannelsReadSupport { static List channelPosts(Connection c, String ownerBch, int lineCode, int limit, boolean asc) throws SQLException { String order = asc ? "ASC" : "DESC"; String sql = """ - SELECT login,bch_name,block_number,block_hash,block_bytes,to_bch_name,to_block_number,to_block_hash,msg_sub_type + SELECT login,bch_name,block_number,block_hash,block_bytes,to_bch_name,to_block_number,to_block_hash,msg_sub_type,this_line_number FROM blocks WHERE bch_name=? AND msg_type=? AND msg_sub_type IN (?, ?) AND line_code=? ORDER BY block_number @@ -204,6 +204,7 @@ final class ChannelsReadSupport { pb.toBlockNumber = (Integer) rs.getObject("to_block_number"); pb.toBlockHash = rs.getBytes("to_block_hash"); pb.msgSubType = rs.getInt("msg_sub_type"); + pb.thisLineNumber = (Integer) rs.getObject("this_line_number"); out.add(pb); } return out; @@ -513,6 +514,7 @@ final class ChannelsReadSupport { Integer toBlockNumber; byte[] toBlockHash; int msgSubType; + Integer thisLineNumber; } static final class TextInfo { diff --git a/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/Net_GetChannelMessages_Handler.java b/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/Net_GetChannelMessages_Handler.java index 42018db..2dacd60 100644 --- a/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/Net_GetChannelMessages_Handler.java +++ b/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/Net_GetChannelMessages_Handler.java @@ -100,6 +100,7 @@ public class Net_GetChannelMessages_Handler implements JsonMessageHandler { item.setMsgSubType(post.msgSubType); item.setAuthorLogin(post.login); item.setAuthorBlockchainName(post.bchName); + item.setLineStep(post.thisLineNumber); item.setTargetBlockchainName(post.toBchName); item.setTargetBlockNumber(post.toBlockNumber); item.setTargetBlockHash(ChannelsReadSupport.toHex(post.toBlockHash)); diff --git a/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/Net_GetMessageThread_Handler.java b/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/Net_GetMessageThread_Handler.java index f17eddd..066bd86 100644 --- a/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/Net_GetMessageThread_Handler.java +++ b/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/Net_GetMessageThread_Handler.java @@ -85,7 +85,7 @@ public class Net_GetMessageThread_Handler implements JsonMessageHandler { private List findReplies(Connection c, String toBchName, int toBlockNumber, byte[] toBlockHash, int limit) throws Exception { String sql = """ - SELECT login,bch_name,block_number,block_hash,block_bytes,to_bch_name,to_block_number,to_block_hash,line_code,msg_sub_type + SELECT login,bch_name,block_number,block_hash,block_bytes,to_bch_name,to_block_number,to_block_hash,line_code,msg_sub_type,this_line_number FROM blocks WHERE msg_type=1 AND msg_sub_type=? AND to_bch_name=? AND to_block_number=? AND to_block_hash=? @@ -108,7 +108,7 @@ public class Net_GetMessageThread_Handler implements JsonMessageHandler { private PostRow findByNumber(Connection c, String bchName, int blockNumber) throws Exception { String sql = """ - SELECT login,bch_name,block_number,block_hash,block_bytes,to_bch_name,to_block_number,to_block_hash,line_code,msg_sub_type + SELECT login,bch_name,block_number,block_hash,block_bytes,to_bch_name,to_block_number,to_block_hash,line_code,msg_sub_type,this_line_number FROM blocks WHERE bch_name=? AND block_number=? LIMIT 1 @@ -134,6 +134,7 @@ public class Net_GetMessageThread_Handler implements JsonMessageHandler { row.toBlockHash = rs.getBytes("to_block_hash"); row.lineCode = (Integer) rs.getObject("line_code"); row.msgSubType = rs.getInt("msg_sub_type"); + row.thisLineNumber = (Integer) rs.getObject("this_line_number"); return row; } @@ -146,6 +147,7 @@ public class Net_GetMessageThread_Handler implements JsonMessageHandler { node.setMsgSubType(row.msgSubType); node.setAuthorLogin(row.login); node.setAuthorBlockchainName(row.bchName); + node.setLineStep(row.thisLineNumber); node.setTargetBlockchainName(row.toBchName); node.setTargetBlockNumber(row.toBlockNumber); node.setTargetBlockHash(ChannelsReadSupport.toHex(row.toBlockHash)); @@ -199,7 +201,7 @@ public class Net_GetMessageThread_Handler implements JsonMessageHandler { private List findEdits(Connection c, String bch, int targetBlock, byte[] targetHash, int subType) throws Exception { String sql = """ - SELECT login,bch_name,block_number,block_hash,block_bytes,to_bch_name,to_block_number,to_block_hash,line_code,msg_sub_type + SELECT login,bch_name,block_number,block_hash,block_bytes,to_bch_name,to_block_number,to_block_hash,line_code,msg_sub_type,this_line_number FROM blocks WHERE bch_name=? AND msg_type=1 AND msg_sub_type=? AND to_block_number=? AND to_block_hash=? @@ -231,5 +233,6 @@ public class Net_GetMessageThread_Handler implements JsonMessageHandler { byte[] toBlockHash; Integer lineCode; int msgSubType; + Integer thisLineNumber; } } diff --git a/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/entyties/Net_GetChannelMessages_Response.java b/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/entyties/Net_GetChannelMessages_Response.java index 46398f5..eeb95c2 100644 --- a/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/entyties/Net_GetChannelMessages_Response.java +++ b/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/entyties/Net_GetChannelMessages_Response.java @@ -52,6 +52,7 @@ public class Net_GetChannelMessages_Response extends Net_Response { private Integer msgSubType; private String authorLogin; private String authorBlockchainName; + private Integer lineStep; private String targetBlockchainName; private Integer targetBlockNumber; private String targetBlockHash; @@ -74,6 +75,9 @@ public class Net_GetChannelMessages_Response extends Net_Response { public String getAuthorBlockchainName() { return authorBlockchainName; } public void setAuthorBlockchainName(String authorBlockchainName) { this.authorBlockchainName = authorBlockchainName; } + public Integer getLineStep() { return lineStep; } + public void setLineStep(Integer lineStep) { this.lineStep = lineStep; } + public String getTargetBlockchainName() { return targetBlockchainName; } public void setTargetBlockchainName(String targetBlockchainName) { this.targetBlockchainName = targetBlockchainName; }