SHA256
Зафиксировать все текущие изменения проекта
This commit is contained in:
@@ -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,
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user