Decentralized Instant Messaging Protocol (JavaScript)
Handshake Command Protocol
0. (C-S) handshake start
(S-C) handshake again with new session
(C-S) handshake restart with new session
(S-C) handshake success
dkd . protocol . HandshakeState = Enum ( 'HandshakeState' , {
START : 0 , // C -> S, without session key(or session expired)
AGAIN : 1 , // S -> C, with new session key
RESTART : 2 , // C -> S, with new session key
SUCCESS : 3 // S -> C, handshake accepted
} ) ;
var HandshakeState = dkd . protocol . HandshakeState ;
HandshakeState . checkState = function ( title , session ) {
if ( title === 'DIM!' /* || title === 'OK!'*/ ) {
return HandshakeState . SUCCESS ;
} else if ( title === 'DIM?' ) {
return HandshakeState . AGAIN ;
} else if ( ! session ) {
return HandshakeState . START ;
} else {
return HandshakeState . RESTART ;
}
} ;
Command . HANDSHAKE = 'handshake' ;
/**
* Handshake command message: {
* type : 0x88,
* sn : 123,
*
* command : "handshake", // command name
* title : "Hello world!", // "DIM?", "DIM!"
* session : "{SESSION_KEY}" // session key
* }
*/
dkd . protocol . HandshakeCommand = Interface ( null , [ Command ] ) ;
var HandshakeCommand = dkd . protocol . HandshakeCommand ;
/**
* Get title
*
* @returns {string }
*/
HandshakeCommand . prototype . getTitle = function ( ) { } ;
/**
* Get session key
*
* @returns {string }
*/
HandshakeCommand . prototype . getSessionKey = function ( ) { } ;
/**
* Get handshake state
*
* @return {HandshakeState }
*/
HandshakeCommand . prototype . getState = function ( ) { } ;
//
// Factories
//
HandshakeCommand . start = function ( ) {
return new BaseHandshakeCommand ( 'Hello world!' , null ) ;
} ;
HandshakeCommand . restart = function ( sessionKey ) {
return new BaseHandshakeCommand ( 'Hello world!' , sessionKey ) ;
} ;
HandshakeCommand . again = function ( sessionKey ) {
return new BaseHandshakeCommand ( 'DIM?' , sessionKey ) ;
} ;
HandshakeCommand . success = function ( sessionKey ) {
return new BaseHandshakeCommand ( 'DIM!' , sessionKey ) ;
} ;
/**
* Create handshake command
*
* Usages:
* 1. new BaseHandshakeCommand(map);
* 2. new BaseHandshakeCommand(title, session);
*/
dkd . dkd . BaseHandshakeCommand = function ( ) {
var title = null ;
var session = null ;
if ( arguments . length === 2 ) {
// new BaseHandshakeCommand(title, session);
BaseCommand . call ( this , Command . HANDSHAKE ) ;
title = arguments [ 0 ] ;
session = arguments [ 1 ] ;
} else if ( typeof arguments [ 0 ] === 'string' ) {
// new BaseHandshakeCommand(title);
BaseCommand . call ( this , Command . HANDSHAKE ) ;
title = arguments [ 0 ] ;
} else {
// new BaseHandshakeCommand(map);
BaseCommand . call ( this , arguments [ 0 ] ) ;
}
if ( title ) {
this . setValue ( 'title' , title ) ;
}
if ( session ) {
this . setValue ( 'session' , session ) ;
}
} ;
var BaseHandshakeCommand = dkd . dkd . BaseHandshakeCommand ;
Class ( BaseHandshakeCommand , BaseCommand , [ HandshakeCommand ] ) ;
Implementation ( BaseHandshakeCommand , {
// Override
getTitle : function ( ) {
return this . getString ( 'title' , null ) ;
} ,
// Override
getSessionKey : function ( ) {
return this . getString ( 'session' , null ) ;
} ,
// Override
getState : function ( ) {
return HandshakeState . checkState ( this . getTitle ( ) , this . getSessionKey ( ) ) ;
}
} ) ;
/**
* Application Customized message: {
* type : i2s(0xA0),
* sn : 123,
*
* app : "{APP_ID}", // application (e.g.: "chat.dim.sechat")
* extra : info // action parameters
* }
*/
dkd . dkd . ApplicationContent = function ( ) {
var app = null ;
if ( arguments . length === 2 ) {
// new ApplicationContent(type, app);
BaseContent . call ( this , arguments [ 0 ] ) ;
app = arguments [ 1 ] ;
} else {
// new ApplicationContent(type);
// new ApplicationContent(map);
BaseContent . call ( this , arguments [ 0 ] ) ;
}
if ( app ) {
this . setValue ( 'app' , app ) ;
}
} ;
var ApplicationContent = dkd . dkd . ApplicationContent ;
Class ( ApplicationContent , BaseContent , [ AppContent ] ) ;
Implementation ( ApplicationContent , {
// Override
getApplication : function ( ) {
return this . getString ( 'app' , '' ) ;
}
} ) ;
Copyright © 2018-2025 Albert Moky