Зафиксировать все текущие изменения проекта

This commit is contained in:
AidarKC
2026-06-04 22:27:09 +04:00
parent 624557ebfd
commit 60049442f1
9 changed files with 1526 additions and 182 deletions
@@ -22,7 +22,11 @@ const BLOCK_TYPE_DEVICE_KEY = 2;
const BLOCK_TYPE_BLOCKCHAIN_REGISTRY = 3;
const BLOCK_TYPE_SERVER_PROFILE = 30;
const BLOCK_TYPE_ACCESS_SERVERS = 40;
const BLOCK_TYPE_SESSIONS = 55;
const BLOCK_TYPE_TRUSTED_STATE = 50;
const SESSIONS_MODE_MIXED = 1;
const SESSION_TYPE_USER = 1;
const SESSION_TYPE_SUBSERVER = 100;
let solanaLibPromise = null;
function loadSolanaLib() {
@@ -72,6 +76,18 @@ function pushVecStrU32(buf, values) {
for (const value of arr) pushStrU32(buf, value);
}
function pushSessionRecordsU32(buf, sessions) {
const arr = Array.isArray(sessions) ? sessions : [];
pushU32LE(buf, arr.length);
for (const session of arr) {
buf.push(Number(session?.sessionType || 0) & 0xff);
buf.push(Number(session?.sessionVersion || 0) & 0xff);
pushStrU32(buf, String(session?.sessionName || ''));
const key = session?.sessionPubKey32 || new Uint8Array(32);
for (const x of key) buf.push(x);
}
}
function makeReader(bytes) {
let offset = 0;
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
@@ -178,6 +194,8 @@ function serializeCreateUserPdaArgs(args) {
pushStrU32(buf, args.serverAddress);
pushVecStrU32(buf, args.syncServers);
pushVecStrU32(buf, args.accessServers);
buf.push(Number(args.sessionsMode || SESSIONS_MODE_MIXED) & 0xff);
pushSessionRecordsU32(buf, args.sessions);
buf.push(Number(args.trustedCount || 0) & 0xff);
pushVecU8(buf, args.rootSignature64);
return new Uint8Array(buf);
@@ -207,6 +225,8 @@ function serializeUpdateUserPdaArgs(args) {
pushStrU32(buf, args.serverAddress);
pushVecStrU32(buf, args.syncServers);
pushVecStrU32(buf, args.accessServers);
buf.push(Number(args.sessionsMode || SESSIONS_MODE_MIXED) & 0xff);
pushSessionRecordsU32(buf, args.sessions);
buf.push(Number(args.trustedCount || 0) & 0xff);
pushVecU8(buf, args.rootSignature64);
return new Uint8Array(buf);
@@ -250,6 +270,8 @@ function createPdaState({
serverAddress,
syncServers,
accessServers,
sessionsMode,
sessions,
trustedCount,
}) {
const serverProfile = isServer ? {
@@ -275,6 +297,13 @@ function createPdaState({
serverAddress: serverProfile?.serverAddress ?? '',
syncServers: serverProfile?.syncServers ? [...serverProfile.syncServers] : [],
accessServers: Array.isArray(accessServers) ? [...accessServers] : [],
sessionsMode: Number(sessionsMode || SESSIONS_MODE_MIXED) & 0xff,
sessions: Array.isArray(sessions) ? sessions.map((x) => ({
sessionType: Number(x?.sessionType || 0) & 0xff,
sessionVersion: Number(x?.sessionVersion || 0) & 0xff,
sessionName: String(x?.sessionName || ''),
sessionPubKey32: x?.sessionPubKey32 instanceof Uint8Array ? x.sessionPubKey32 : new Uint8Array(x?.sessionPubKey32 || 32),
})) : [],
trustedCount: Number(trustedCount || 0) & 0xff,
};
}
@@ -326,6 +355,8 @@ export function parseShineUserPda(dataBytes) {
let serverAddress = '';
let syncServers = [];
let accessServers = [];
let sessionsMode = SESSIONS_MODE_MIXED;
let sessions = [];
let trustedCount = 0;
for (let i = 0; i < blocksCount; i += 1) {
@@ -387,6 +418,20 @@ export function parseShineUserPda(dataBytes) {
for (let j = 0; j < accessCount; j += 1) accessServers.push(reader.readStrU8());
continue;
}
if (blockType === BLOCK_TYPE_SESSIONS) {
sessionsMode = reader.readU8();
const sessionsCount = reader.readU8();
sessions = [];
for (let j = 0; j < sessionsCount; j += 1) {
sessions.push({
sessionType: reader.readU8(),
sessionVersion: reader.readU8(),
sessionName: reader.readStrU8(),
sessionPubKey32: reader.readBytes(32),
});
}
continue;
}
if (blockType === BLOCK_TYPE_TRUSTED_STATE) {
trustedCount = reader.readU8();
continue;
@@ -415,6 +460,8 @@ export function parseShineUserPda(dataBytes) {
serverAddress,
syncServers,
accessServers,
sessionsMode,
sessions,
trustedCount,
});
@@ -442,6 +489,8 @@ export function serializeUnsignedRecordFromState(stateLike) {
serverAddress: stateLike.serverAddress ?? stateLike.serverProfile?.serverAddress,
syncServers: stateLike.syncServers ?? stateLike.serverProfile?.syncServers,
accessServers: stateLike.accessServers,
sessionsMode: stateLike.sessionsMode,
sessions: stateLike.sessions,
trustedCount: stateLike.trustedCount,
});
@@ -481,6 +530,13 @@ export function serializeUnsignedRecordFromState(stateLike) {
buf.push(BLOCK_TYPE_ACCESS_SERVERS, 0, state.accessServers.length & 0xff);
for (const loginValue of state.accessServers) pushStrU8(buf, loginValue);
buf.push(BLOCK_TYPE_SESSIONS, 0, state.sessionsMode & 0xff, state.sessions.length & 0xff);
for (const session of state.sessions) {
buf.push(session.sessionType & 0xff, session.sessionVersion & 0xff);
pushStrU8(buf, session.sessionName);
for (const x of session.sessionPubKey32) buf.push(x);
}
buf.push(BLOCK_TYPE_TRUSTED_STATE, 0, state.trustedCount & 0xff);
const recordLen = buf.length + 64;
@@ -655,6 +711,8 @@ async function createShineUserPdaOnSolana({
serverAddress,
syncServers,
accessServers,
sessionsMode: SESSIONS_MODE_MIXED,
sessions: [],
trustedCount: 0,
});
@@ -680,6 +738,8 @@ async function createShineUserPdaOnSolana({
serverAddress: isServer ? serverAddress : '',
syncServers: isServer ? syncServers : [],
accessServers,
sessionsMode: SESSIONS_MODE_MIXED,
sessions: [],
trustedCount: 0,
rootSignature64: rootSig64,
});
@@ -858,6 +918,8 @@ export async function updateShineUserPdaOnSolana({
serverAddress: nextServerProfile?.serverAddress ?? '',
syncServers: nextServerProfile?.syncServers ?? [],
accessServers: accessServers == null ? current.accessServers : accessServers,
sessionsMode: current.sessionsMode,
sessions: current.sessions,
trustedCount: trustedCount == null ? current.trustedCount : trustedCount,
});
@@ -887,6 +949,8 @@ export async function updateShineUserPdaOnSolana({
serverAddress: nextState.serverAddress,
syncServers: nextState.syncServers,
accessServers: nextState.accessServers,
sessionsMode: nextState.sessionsMode,
sessions: nextState.sessions,
trustedCount: nextState.trustedCount,
rootSignature64: rootSig64,
});