2
0
mirror of https://github.com/esiur/esiur-js.git synced 2025-05-05 20:12:59 +00:00
This commit is contained in:
Ahmed Zamil 2020-11-15 04:26:20 +03:00
parent a00b366d30
commit ec143272ae
20 changed files with 263 additions and 9499 deletions

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2017-2020 Esyur
Copyright (c) 2017-2020 Esiur
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@ -1,4 +1,4 @@
# Esyur.JS
Esyur Library for Javascript
# Esiur.JS
Esiur Library for Javascript
# Usage

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
exports.printMsg = function() {
console.log("Esyur");
console.log("Esiur");
}
module.exports = { wh };

4
package-lock.json generated
View File

@ -1,6 +1,6 @@
{
"name": "esyur",
"version": "1.4.5",
"name": "Esiur",
"version": "1.5.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View File

@ -1,23 +1,23 @@
{
"name": "esyur",
"version": "1.4.8",
"name": "esiur",
"version": "1.5.0",
"description": "Distributed Object Framework",
"main": "esyur.js",
"main": "esiur.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"babel": "./node_modules/.bin/babel src -d build",
"build": "browserify src/esyur.js -t babelify --outfile build/esyur.js"
"build": "browserify src/esiur.js -t babelify --outfile build/esiur.js"
},
"repository": {
"type": "git",
"url": "git+https://github.com/esyur/esyur-js.git"
"url": "git+https://github.com/esiur/esiur-js.git"
},
"author": "Ahmed Zamil",
"license": "MIT",
"bugs": {
"url": "https://github.com/esyur/esyur-js/issues"
"url": "https://github.com/esiur/esiur-js/issues"
},
"homepage": "https://github.com/esyur/esyur-js#readme",
"homepage": "https://github.com/esiur/esiur-js#readme",
"dependencies": {
"@babel/polyfill": "^7.8.3",
"@babel/runtime": "^7.8.4",

View File

@ -2,7 +2,7 @@ export default //const ExceptionCode =
{
HostNotReachable: 0,
AccessDenied: 1,
UserNotFound: 2,
UserOrTokenNotFound: 2,
ChallengeFailed: 3,
ResourceNotFound: 4,
AttachDenied: 5,
@ -28,5 +28,6 @@ export default //const ExceptionCode =
MethodNotFound: 25,
PropertyNotFound: 26,
SetPropertyDenied: 27,
ReadOnlyProperty: 28
ReadOnlyProperty: 28,
GeneralFailure: 29,
};

View File

@ -112,6 +112,31 @@ export default class BinaryList
break;
case DataType.UInt8Array:
ars.push(this.list[i].value);
break;
case DataType.UInt16Array:
ars.push(DC.uint16ArrayToBytes(this.list[i].value));
break;
case DataType.UInt32Array:
ars.push(DC.uint32ArrayToBytes(this.list[i].value));
break;
case DataType.Int16Array:
ars.push(DC.int16ArrayToBytes(this.list[i].value));
break;
case DataType.Int32Array:
ars.push(DC.int32ArrayToBytes(this.list[i].value));
break;
case DataType.Float32Array:
ars.push(DC.float32ArrayToBytes(this.list[i].value));
break;
case DataType.Float64Array:
ars.push(DC.float64ArrayToBytes(this.list[i].value));
break;
//case DataType.Resource:
// ars.push(DC.uint32ToBytes(this.list[i].value.instance.id));
@ -127,7 +152,7 @@ export default class BinaryList
var length = 0;
ars.forEach(function(a){
length += a.length;
length += a.length ;//?? a.byteLength;
});
var rt = new Uint8Array(length);
@ -135,7 +160,7 @@ export default class BinaryList
var offset = 0;
for(var i = 0; i < ars.length; i++) {
rt.set(ars[i], offset);
offset+=ars[i].length;
offset+=ars[i].length;// ?? ars[i].byteLength;
}
return rt;

View File

@ -835,6 +835,18 @@ static getDataType(value, connection) {
|| value instanceof ArrayBuffer) {
return DataType.UInt8Array;
}
else if (value instanceof Uint16Array)
return DataType.UInt16Array;
else if (value instanceof Uint32Array)
return DataType.UInt32Array;
else if (value instanceof Int16Array)
return DataType.Int16Array;
else if (value instanceof Int32Array)
return DataType.Int32Array;
else if (value instanceof Float32Array)
return DataType.Float32Array;
else if (value instanceof Float64Array)
return DataType.Float64Array;
else if (value instanceof Number) {
// JS numbers are always 64-bit float
return DataType.Float64;

View File

@ -172,6 +172,71 @@ export default class DC extends Uint8Array
return list.toArray();
}
static uint16ArrayToBytes(values)
{
var rt = new DC(values.length * 2);
for(var i = 0; i < values.length; i++)
rt.setUint16(i * 2, values[i]);
return rt;
}
static int16ArrayToBytes(values)
{
var rt = new DC(values.length * 2);
for(var i = 0; i < values.length; i++)
rt.setInt16(i * 2, values[i]);
return rt;
}
static uint32ArrayToBytes(values)
{
var rt = new DC(values.length * 4);
for(var i = 0; i < values.length; i++)
rt.setUint32(i * 4, values[i]);
return rt;
}
static int32ArrayToBytes(values)
{
var rt = new DC(values.length * 4);
for(var i = 0; i < values.length; i++)
rt.setInt32(i * 4, values[i]);
return rt;
}
static int64ArrayToBytes(values)
{
var rt = new DC(values.length * 8);
for(var i = 0; i < values.length; i++)
rt.setInt64(i * 8, values[i]);
return rt;
}
static uint64ArrayToBytes(values)
{
var rt = new DC(values.length * 8);
for(var i = 0; i < values.length; i++)
rt.setUint64(i * 8, values[i]);
return rt;
}
static float32ArrayToBytes(values)
{
var rt = new DC(values.length * 4);
for(var i = 0; i < values.length; i++)
rt.setFloat32(i * 4, values[i]);
return rt;
}
static float64ArrayToBytes(values)
{
var rt = new DC(values.length * 8);
for(var i = 0; i < values.length; i++)
rt.setFloat64(i * 8, values[i]);
return rt;
}
append(src, offset, length)
{
if (!(src instanceof DC))
@ -304,6 +369,16 @@ export default class DC extends Uint8Array
return rt;
}
paste(offset, length, elementSize, func)
{
let rt = new dstType(length / elementSize);
let d = 0, end = offset + length;
for (let i = offset; i < end; i += elementSize)
rt[d++] = func.call(this, i);
return rt;
}
getInt16Array(offset, length)
{
return this.copy(offset, length, 2, this.getInt16, Int16Array);

View File

@ -122,6 +122,47 @@ export default class KeyList
this.values.splice(index, 1);
}
clear()
{
while(this.length > 0)
this.removeAt(0);
}
filter(selector)
{
if (selector instanceof Function){
return this.values.filter(selector);
}
else
{
let match = function(small, big)
{
if (small == big)
{
return true;
}
else if (typeof small == "object" && typeof big == "object" && small != null && big != null)
{
if (small.constructor.name == "Object")
{
for(var i in small)
if (!match(small[i], big[i]))
return false;
return true;
}
else
{
return false;
}
}
else
return false;
};
return this.values.filter((x) => match(selector, x));
}
}
get length()
{
return this.keys.length;

View File

@ -28,6 +28,14 @@
export default class Structure
{
toPairs() {
var rt = [];
for (var i in this)
if (!(this[i] instanceof Function))
rt.push({ key: i, value: this[i]});
return rt;
}
getKeys() {
var rt = [];
for (var i in this)

View File

@ -46,7 +46,7 @@ import IIPAuthPacket from "../Packets/IIPAuthPacket.js";
import IIPPacket from "../Packets/IIPPacket.js";
import IIPAuthPacketAction from "../Packets/IIPAuthPacketAction.js";
import IIPAuthPacketCommand from "../Packets/IIPAuthPacketCommand.js";
import IIPAuthPacketMethod from "../Packets/IIPAuthPacketMethod.js";
import AuthenticationMethod from "../../Security/Authority/AuthenticationMethod.js";
import IIPPacketAction from "../Packets/IIPPacketAction.js";
import IIPPacketCommand from "../Packets/IIPPacketCommand.js";
@ -68,6 +68,7 @@ import { ResourceTrigger } from '../../Resource/IResource.js';
import Ruling from '../../Security/Permissions/Ruling.js';
import ActionType from '../../Security/Permissions/ActionType.js';
import AsyncException from '../../Core/AsyncException.js';
export default class DistributedConnection extends IStore {
@ -372,7 +373,7 @@ export default class DistributedConnection extends IStore {
}
} catch (ex) {
console.log("Esyur Error ", ex);
console.log("Esiur Error ", ex);
}
}
}
@ -390,8 +391,8 @@ export default class DistributedConnection extends IStore {
if (this.session.localAuthentication.type == AuthenticationType.Host) {
if (authPacket.command == IIPAuthPacketCommand.Declare) {
if (authPacket.remoteMethod == IIPAuthPacketMethod.credentials
&& authPacket.localMethod == IIPAuthPacketMethod.None) {
if (authPacket.remoteMethod == AuthenticationMethod.credentials
&& authPacket.localMethod == AuthenticationMethod.None) {
this.session.remoteAuthentication.username = authPacket.remoteUsername;
this.remoteNonce = authPacket.remoteNonce;
this.domain = authPacket.domain;
@ -449,11 +450,7 @@ export default class DistributedConnection extends IStore {
// send our hash
//var localHash = new DC(sha256.arrayBuffer(BL().addUint8Array(this.localPassword)
// .addUint8Array(this.localNonce)
// .addUint8Array(this.remoteNonce).toArray()));
var localHash = SHA256.compute(BL().addUint8Array(this.localPassword)
var localHash = SHA256.compute(BL().addUint8Array(this.localPasswordOrToken)
.addUint8Array(this.localNonce)
.addUint8Array(this.remoteNonce).toDC());
@ -461,15 +458,10 @@ export default class DistributedConnection extends IStore {
}
else if (authPacket.command == IIPAuthPacketCommand.Action) {
if (authPacket.action == IIPAuthPacketAction.AuthenticateHash) {
// check if the server knows my password
//var remoteHash = new DC(sha256.arrayBuffer(BL().addUint8Array(this.remoteNonce)
// .addUint8Array(this.localNonce)
// .addUint8Array(this.localPassword).toArray()
//));
var remoteHash = SHA256.compute(BL().addUint8Array(this.remoteNonce)
.addUint8Array(this.localNonce)
.addUint8Array(this.localPassword).toDC());
.addUint8Array(this.localPasswordOrToken).toDC());
if (remoteHash.sequenceEqual(authPacket.hash)) {
@ -527,10 +519,18 @@ export default class DistributedConnection extends IStore {
this.ready = false;
this.readyToEstablish = false;
this.requests.values.forEach((x) => x.triggerError(AsyncException(ErrorType.Management, 0, "Connection closed")));
this.resourceRequests.values.forEach((x) => x.triggerError(new AsyncException(ErrorType.Management, 0, "Connection closed")));
this.templateRequests.values.forEach((x) => x.triggerError(new AsyncException(ErrorType.Management, 0, "Connection closed")));
this.resources.values.forEach((x) => x.suspend());
try
{
this.requests.values.forEach((x) => x.triggerError(new AsyncException(ErrorType.Management, 0, "Connection closed")));
this.resourceRequests.values.forEach((x) => x.triggerError(new AsyncException(ErrorType.Management, 0, "Connection closed")));
this.templateRequests.values.forEach((x) => x.triggerError(new AsyncException(ErrorType.Management, 0, "Connection closed")));
}
catch(ex)
{
// unhandled error
}
this.resources.values.forEach((x) => x._suspend());
this.requests.clear();
this.resourceRequests.clear();
@ -597,6 +597,8 @@ export default class DistributedConnection extends IStore {
checkInterval = 30,
connectionTimeout = 600,
revivingTime = 120,
tokenIndex = 0,
token = null,
debug = false } = this.instance.attributes.toObject();
@ -605,27 +607,40 @@ export default class DistributedConnection extends IStore {
this.connectionTimeout = connectionTimeout * 1000; // 10 minutes (4 pings failed)
this.revivingTime = revivingTime * 1000; // 2 minutes
var pw = DC.stringToBytes(password);
var host = this.instance.name.split(':');
var address = host[0];
var port = parseInt(host[1]);
return this.connect(secure, address, port, username, pw, domain);
if (token != null)
{
var tk = DC.stringToBytes(token);
return this.connect(secure, AuthenticationMethod.token, address, port, null, tokenIndex, tk, domain);
}
else
{
var pw = DC.stringToBytes(password);
return this.connect(secure, AuthenticationMethod.credentials, address, port, username, null, pw, domain);
}
}
return new AsyncReply(true);
}
connect(secure, hostname, port, username, password, domain) {
connect(secure, method, hostname, port, username, tokenIndex, passwordOrToken, domain) {
this.openReply = new AsyncReply();
if (secure !== undefined) {
this.session.localAuthentication.method = method;
this.session.localAuthentication.tokenIndex = tokenIndex;
this.session.localAuthentication.domain = domain;
this.session.localAuthentication.username = username;
this.localPassword = password;
this.localPasswordOrToken = passwordOrToken;
//this.url = `ws${secure ? 's' : ''}://${this.instance.name}`;
this.url = `ws${secure ? 's' : ''}://${hostname}:${port}`;
@ -806,6 +821,7 @@ export default class DistributedConnection extends IStore {
}
IIPReplyInvoke(callbackId, result) {
var req = this.requests.item(callbackId);
if (req != null) {
@ -820,7 +836,7 @@ export default class DistributedConnection extends IStore {
IIPReportError(callbackId, errorType, errorCode, errorMessage) {
var req = this.requests.item(callbackId);
if (request != null)
if (req != null)
{
this.requests.remove(callbackId);
req.triggerError(errorType, errorCode, errorMessage);
@ -872,7 +888,7 @@ export default class DistributedConnection extends IStore {
item.trigger(new DistributedResourceQueueItem(r, DistributedResourceQueueItemType.Propery, args, index));
}).error(function (ex) {
self.queue.remove(item);
console.log("Esyur Property Error", ex);
console.log("Esiur Property Error", ex);
});
});
}
@ -896,7 +912,7 @@ export default class DistributedConnection extends IStore {
}).error(function (ex) {
self.queue.remove(item);
console.log("Esyur Event Error", ex);
console.log("Esiur Event Error", ex);
});
});
}

View File

@ -79,13 +79,20 @@ export default class DistributedResource extends IResource
{
if (this._p.attached)
{
console.log("Already attached.");
return false;
}
else
{
this._p.attached = true;
this._p.suspended = false;
for(var i = 0; i < properties.length; i++)
this._p.properties = [];
for(let i = 0; i < properties.length; i++)
{
this.instance.setAge(i, properties[i].age);
this.instance.setModificationDate(i, properties[i].date);
@ -93,7 +100,6 @@ export default class DistributedResource extends IResource
}
this._p.attached = true;
var self = this;
@ -210,6 +216,12 @@ export default class DistributedResource extends IResource
_set(index, value)
{
if (!this._p.attached)
{
console.log("What ?");
return;
}
if (this._p.neglect)
return;

View File

@ -29,7 +29,7 @@
import IIPAuthPacketCommand from "./IIPAuthPacketCommand.js";
import IIPAuthPacketAction from "./IIPAuthPacketAction.js";
import IIPAuthPacketMethod from "./IIPAuthPacketMethod.js";
import AuthenticationMethod from "../../Security/Authority/AuthenticationMethod.js";
export default class IIPAuthPacket
{
@ -138,9 +138,9 @@ export default class IIPAuthPacket
offset += domainLength;
if (this.remoteMethod == IIPAuthPacketMethod.Credentials)
if (this.remoteMethod == AuthenticationMethod.Credentials)
{
if (this.localMethod == IIPAuthPacketMethod.None)
if (this.localMethod == AuthenticationMethod.None)
{
if (this.notEnough(offset, ends, 33))
return -this.dataLengthNeeded;
@ -160,6 +160,21 @@ export default class IIPAuthPacket
offset += length;
}
}
else if (this.remoteMethod == AuthenticationMethod.Token)
{
if (this.localMethod == AuthenticationMethod.None)
{
if (this.notEnough(offset, ends, 40))
return -this.dataLengthNeeded;
this.remoteNonce = data.clip(offset, 32);
offset += 32;
this.remoteTokenIndex = data.getUint64(offset);
offset += 8;
}
}
if (encrypt)
{
@ -188,9 +203,10 @@ export default class IIPAuthPacket
return -this.dataLengthNeeded;
if (this.remoteMethod == IIPAuthPacketMethod.Credentials)
if (this.remoteMethod == AuthenticationMethod.Credentials
|| this.remoteMethod == AuthenticationMethod.Token)
{
if (this.localMethod == IIPAuthPacketMethod.None)
if (this.localMethod == AuthenticationMethod.None)
{
if (this.notEnough(offset, ends, 32))
return -this.dataLengthNeeded;

View File

@ -54,7 +54,7 @@ export default class IResource extends IDestructible
static getTemplate()
{
return {
namespace: "Esyur",
namespace: "Esiur",
properties: [],
functions: [],
events: []

View File

@ -31,6 +31,8 @@ export default class Authentication
{
constructor(type)
{
this.method = 0;
this.tokenIndex = 0;
this.type = type;
this.state = 0;
this.domain = null;

View File

@ -1,4 +1,4 @@
export default //const IIPAuthPacketMethod =
export default
{
None: 0,
Certificate: 1,

View File

@ -55,7 +55,7 @@
<script src="/iui-js/iui.js"></script>
<script src="viewers/Esyur.Stores.MemoryStore.js"></script>
<script src="viewers/Esiur.Stores.MemoryStore.js"></script>
<script src="js/browser.js"></script>
<script src="js/app.js"></script>

View File

@ -1,4 +1,4 @@
class Esyur_Stores_MemoryStore extends IUIWidget
class Esiur_Stores_MemoryStore extends IUIWidget
{
constuctor()
{
@ -6,4 +6,4 @@ class Esyur_Stores_MemoryStore extends IUIWidget
}
}
IUI.module("Esyur.Stores.MemoryStore", Esyur_Stores_MemoryStore);
IUI.module("Esiur.Stores.MemoryStore", Esiur_Stores_MemoryStore);