@brown-ds/distribution 0.2.25 → 0.2.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -6,5 +6,5 @@ Do NOT edit this file directly. Use it as a black box.
|
|
|
6
6
|
|
|
7
7
|
If you notice any issues with using this file, please contact the TAs.
|
|
8
8
|
*/
|
|
9
|
-
const http=require('node:http'),url=require('node:url'),log=require('../util/lo'+'g.js'),yargs=require('yargs/yarg'+'s');function setNodeConfig(){const
|
|
9
|
+
const http=require('node:http'),url=require('node:url'),log=require('../util/lo'+'g.js'),yargs=require('yargs/yarg'+'s');function setNodeConfig(){const _0x12b3a0=yargs(process['argv'])['help'](![])['version'](![])['parse']();let _0x23ca2e,_0x44bf6f,_0x58f68d;typeof _0x12b3a0['ip']==='string'&&(_0x23ca2e=_0x12b3a0['ip']);(typeof _0x12b3a0['port']==='string'||typeof _0x12b3a0['port']==='number')&&(_0x44bf6f=parseInt(String(_0x12b3a0['port']),-0xd82+-0x11d0+0x24*0xdf));(_0x12b3a0['help']===!![]||_0x12b3a0['h']===!![])&&(console['log']('Node\x20usage'+':'),console['log']('\x20\x20--ip\x20<ip'+'\x20address>\x20'+'\x20\x20\x20\x20\x20The\x20i'+'p\x20address\x20'+'to\x20bind\x20th'+'e\x20node\x20to'),console['log']('\x20\x20--port\x20<'+'port>\x20\x20\x20\x20\x20'+'\x20\x20\x20\x20\x20The\x20p'+'ort\x20to\x20bin'+'d\x20the\x20node'+'\x20to'),console['log']('\x20\x20--config'+'\x20<config>\x20'+'\x20\x20\x20\x20\x20The\x20s'+'erialized\x20'+'config\x20str'+'ing'),process['exit'](0x26c+-0xcb8+0xa4c));if(typeof _0x12b3a0['config']==='string'){let _0x2edf40=undefined;try{_0x2edf40=globalThis['distributi'+'on']['util']['deserializ'+'e'](_0x12b3a0['config']);}catch(_0x196b68){try{_0x2edf40=JSON['parse'](_0x12b3a0['config']);}catch{console['error']('Cannot\x20des'+'erialize\x20c'+'onfig\x20stri'+'ng:\x20'+_0x12b3a0['config']),process['exit'](-0x583*-0x5+-0xb76+-0x1018);}}typeof _0x2edf40?.['ip']==='string'&&(_0x23ca2e=_0x2edf40?.['ip']),typeof _0x2edf40?.['port']==='number'&&(_0x44bf6f=_0x2edf40?.['port']),typeof _0x2edf40?.['onStart']==='function'&&(_0x58f68d=_0x2edf40?.['onStart']);}return _0x23ca2e=_0x23ca2e??'127.0.0.1',_0x44bf6f=_0x44bf6f??-0x7*0x4eb+0x46*-0x85+0x4b9d,{'ip':_0x23ca2e,'port':_0x44bf6f,'onStart':_0x58f68d};}function validate(_0x4c88f5){if(_0x4c88f5['length']===0x4*-0x1f8+0x175*0xf+-0x4a9*0x3)throw new Error('No\x20body');return _0x4c88f5;}function start(_0x20e157){const _0x2f4093=http['createServ'+'er']((_0x1eba6f,_0x416fca)=>{if(_0x1eba6f['method']!=='PUT'){_0x416fca['end'](globalThis['distributi'+'on']['util']['serialize'](new Error('Method\x20not'+'\x20allowed!')));return;}const [,_0x6fdf98,_0x950986,_0x4340db]=url['parse'](_0x1eba6f['url'])['pathname']['split']('/');log('[server]\x20g'+'ot\x20request'+'\x20'+_0x6fdf98+'\x20'+_0x950986+':'+_0x4340db+'\x20from\x20'+_0x1eba6f['socket']['remoteAddr'+'ess']);const _0x3c4653=[];_0x1eba6f['on']('data',_0x39cca0=>{_0x3c4653['push'](_0x39cca0);}),_0x1eba6f['on']('end',()=>{let _0x185859;try{_0x185859=validate(Buffer['concat'](_0x3c4653)['toString']());}catch(_0x53b0ef){_0x416fca['end'](globalThis['distributi'+'on']['util']['serialize']([_0x53b0ef]));return;}const _0xf099cb=globalThis['distributi'+'on']['util']['deserializ'+'e'](_0x185859);!Array['isArray'](_0xf099cb)&&_0x416fca['end'](globalThis['distributi'+'on']['util']['serialize']([new Error('Invalid\x20ar'+'gument\x20typ'+'e,\x20expecte'+'d\x20array,\x20g'+'ot\x20'+typeof _0xf099cb)]));const _0x9b7800=_0x950986;globalThis['distributi'+'on']['local']['routes']['get']({'service':_0x950986,'gid':_0x6fdf98},(_0x45900d,_0x4af5b2)=>{if(_0x45900d){_0x416fca['end'](globalThis['distributi'+'on']['util']['serialize']([_0x45900d,null]));return;}if(!_0x4af5b2[_0x4340db]){_0x416fca['end'](globalThis['distributi'+'on']['util']['serialize']([new Error('Method\x20'+_0x4340db+('\x20not\x20found'+'\x20in\x20servic'+'e\x20')+_0x9b7800),null]));return;}log('[server]\x20\x20'+'Calling\x20se'+'rvice:\x20'+_0x9b7800+':'+_0x4340db+('\x20with\x20args'+':\x20')+JSON['stringify'](_0xf099cb));_0xf099cb['length']===0x4b*0x6e+-0x2b5+-0x1d84&&_0x4af5b2[_0x4340db]['length']===0x4a*-0x6f+-0x34*0x56+0x1*0x3191&&_0xf099cb['push'](undefined);const _0x5232b8=_0x4af5b2[_0x4340db]['bind'](_0x4af5b2),_0x15f5c3=globalThis['distributi'+'on']['util']['normalize'](_0x5232b8,_0xf099cb);try{_0x5232b8(..._0x15f5c3,(_0x159b25,_0x349259)=>_0x416fca['end'](globalThis['distributi'+'on']['util']['serialize']([_0x159b25,_0x349259])));}catch(_0x10b5c9){_0x416fca['end'](globalThis['distributi'+'on']['util']['serialize']([_0x10b5c9,null]));}});});});globalThis['distributi'+'on']['node']['server']=_0x2f4093;const _0x225567=globalThis['distributi'+'on']['node']['config'];_0x2f4093['once']('listening',()=>{log('Server\x20run'+'ning\x20at\x20ht'+'tp://'+_0x225567['ip']+':'+_0x225567['port']+'/'),_0x20e157(null);}),_0x2f4093['once']('error',_0x49cc14=>{log('Server\x20err'+'or:\x20'+_0x49cc14),_0x20e157(_0x49cc14);}),_0x2f4093['listen'](_0x225567['port'],_0x225567['ip']);}module['exports']={'start':start,'config':setNodeConfig()};
|
|
10
10
|
/* eslint-enable */
|
|
@@ -6,5 +6,5 @@ Do NOT edit this file directly. Use it as a black box.
|
|
|
6
6
|
|
|
7
7
|
If you notice any issues with using this file, please contact the TAs.
|
|
8
8
|
*/
|
|
9
|
-
const nativeFunctions={'forward':new Map(),'reverse':new Map()};function createNativeMap(){const
|
|
9
|
+
const nativeFunctions={'forward':new Map(),'reverse':new Map()};function createNativeMap(){const _0x404350=[];function _0x3f00f3(_0x5ac571,_0x269c43){if(_0x269c43===null||_0x269c43===undefined)return;if(_0x404350['indexOf'](_0x269c43)!==-(-0x10e7+0x172e+0x1*-0x646))return;_0x404350['push'](_0x269c43),Object['getOwnProp'+'ertyNames'](_0x269c43)['forEach'](_0x4e2d8a=>{if(typeof _0x269c43[_0x4e2d8a]==='function'){nativeFunctions['forward']['set'](_0x269c43[_0x4e2d8a],_0x5ac571+'.'+_0x4e2d8a),nativeFunctions['reverse']['set'](_0x5ac571+'.'+_0x4e2d8a,_0x269c43[_0x4e2d8a]);return;}typeof _0x269c43[_0x4e2d8a]==='object'&&_0x404350['indexOf'](_0x269c43[_0x4e2d8a])===-(0x3b7*-0x1+-0x115*0x6+0xa36)&&_0x3f00f3(_0x5ac571+'.'+_0x4e2d8a,_0x269c43[_0x4e2d8a]);});}for(const _0xcd95ea of require('repl')['_builtinLi'+'bs']){if(['wasi','sys','punycode','crypto']['includes'](_0xcd95ea))continue;const _0x5739bc=require(_0xcd95ea);_0x3f00f3(_0xcd95ea,_0x5739bc);}}createNativeMap();function decycleObject(_0x34e228){if(_0x34e228===null||_0x34e228===undefined)return _0x34e228;const _0x540b4e=new WeakMap();function _0x38a577(_0x78cf26,_0x1b0f00){let _0xcc04b0;if(!(typeof _0x78cf26==='object'&&!(_0x78cf26 instanceof Error)&&!(_0x78cf26 instanceof Date)&&!(_0x78cf26 instanceof Boolean)&&_0x78cf26!==null))return _0x78cf26;const _0xf3d91e=_0x540b4e['get'](_0x78cf26);if(_0xf3d91e!==undefined)return{'$reference':_0xf3d91e};return _0x540b4e['set'](_0x78cf26,_0x1b0f00),Array['isArray'](_0x78cf26)?(_0xcc04b0=[],_0x78cf26['forEach'](function(_0x32bd04,_0x8a6618){const _0x1c3add=[..._0x1b0f00,_0x8a6618];_0xcc04b0[_0x8a6618]=_0x38a577(_0x32bd04,_0x1c3add);})):(_0xcc04b0={},Object['keys'](_0x78cf26)['forEach'](_0x177fb4=>{const _0x51fc50=[..._0x1b0f00,JSON['stringify'](_0x177fb4)];_0xcc04b0[_0x177fb4]=_0x38a577(_0x78cf26[_0x177fb4],_0x51fc50);})),_0xcc04b0;}return _0x38a577(_0x34e228,[]);}function serializeBaseStructure(_0x10f456){return{'type':typeof _0x10f456,'value':_0x10f456['toString']()};}function serializeBigInt(_0xbdc724){return{'type':'bigint','value':_0xbdc724['toString']()};}function serializeUndefined(_0xb3c155){return{'type':'undefined','value':''};}function serializeObject(_0x1db01e){if(_0x1db01e===null)return{'type':'null','value':''};else{if(_0x1db01e instanceof Date)return{'type':'date','value':_0x1db01e['toJSON']()};else{if(_0x1db01e instanceof Error)return{'type':'error','value':serializeObject({'name':_0x1db01e['name'],'message':_0x1db01e['message'],'cause':_0x1db01e['cause']})};}}if(_0x1db01e['$reference']!==undefined&&Object['keys'](_0x1db01e)['length']===-0x14*-0x17+0xa*-0x1a5+-0xb*-0x155)return{'type':'reference','value':_0x1db01e['$reference']};const _0x20c2d2=Object['fromEntrie'+'s'](Object['entries'](_0x1db01e)['map'](([_0x59c0aa,_0xfb4a8e])=>[_0x59c0aa,serialize(_0xfb4a8e)]));return{'type':_0x1db01e instanceof Array?'array':'object','value':_0x20c2d2};}function serializeFunction(_0x38e653){const _0x38fb7a=nativeFunctions['forward']['get'](_0x38e653);return _0x38fb7a===undefined?{'type':'function','value':_0x38e653['toString']()}:{'type':'native','value':_0x38fb7a};}function serialize(_0x4d944c){_0x4d944c=decycleObject(_0x4d944c);let _0x449851;switch(typeof _0x4d944c){case'object':_0x449851=serializeObject(_0x4d944c);break;case'function':_0x449851=serializeFunction(_0x4d944c);break;case'undefined':_0x449851=serializeUndefined(_0x4d944c);break;case'number':case'string':case'boolean':_0x449851=serializeBaseStructure(_0x4d944c);break;case'bigint':_0x449851=serializeBigInt(_0x4d944c);break;}return JSON['stringify'](_0x449851);}function deserializeObject(_0xb07ca,_0x1d43e4){for(const [_0xa696f6,_0x4f0f65]of Object['entries'](_0xb07ca)){_0x1d43e4[_0xa696f6]=doSerialize(_0x4f0f65,_0x1d43e4);}return _0x1d43e4;}function deserializeArray(_0x46048f,_0x47c969){for(const [_0x15070e,_0x5ba4a3]of Object['entries'](_0x46048f)){_0x47c969[Number(_0x15070e)]=doSerialize(_0x5ba4a3,_0x47c969);}return _0x47c969;}function deserializeString(_0x37b705){return _0x37b705;}function deserializeNumber(_0x471aa0){return Number(_0x471aa0);}function deserializeFunction(_0x612ed7){return new Function('return\x20'+_0x612ed7)();}function deserializeError(_0x2e3adb){const _0x4f1b6c=doSerialize(_0x2e3adb),_0x5f4632=new Error(_0x4f1b6c['message'],_0x4f1b6c['cause']);return _0x5f4632;}function deserializeReference(_0x287fe9,_0x17258d){let _0x38b8a5=_0x17258d;for(const _0x22de58 of _0x287fe9){_0x38b8a5=_0x38b8a5[JSON['parse'](_0x22de58)];}return _0x38b8a5;}function deserializeNative(_0x11d654){const _0x56229e=nativeFunctions['reverse']['get'](_0x11d654);if(_0x56229e===undefined)throw Error('Function\x20n'+'ot\x20found\x20i'+'n\x20native\x20f'+'unction\x20ma'+'p');return _0x56229e;}function deserializeReferences(_0x39daf1,_0x1d28d2){if(typeof _0x39daf1!=='object'||_0x39daf1===null)return _0x39daf1;if(_0x39daf1['type']==='reference')return deserializeReference(_0x39daf1['value'],_0x1d28d2);if(Array['isArray'](_0x39daf1))for(let _0x47cbb4=-0x1ed6+0x3e7+0x563*0x5;_0x47cbb4<_0x39daf1['length'];_0x47cbb4++){_0x39daf1[_0x47cbb4]=deserializeReferences(_0x39daf1[_0x47cbb4],_0x1d28d2);}else for(const [_0xbd32ca,_0x4eef23]of Object['entries'](_0x39daf1)){_0x39daf1[_0xbd32ca]=deserializeReferences(_0x4eef23,_0x1d28d2);}return _0x39daf1;}function doSerialize(_0x3b5585,_0x588a31=null){let _0x5d5928;if(typeof _0x3b5585==='object')_0x5d5928=_0x3b5585;else{if(typeof _0x3b5585==='string')_0x5d5928=JSON['parse'](_0x3b5585);else throw new Error('Invalid\x20ar'+'gument\x20typ'+'e:\x20'+typeof _0x3b5585+'.');}_0x588a31===null&&(_0x588a31={});switch(_0x5d5928['type']){case'object':return deserializeObject(_0x5d5928['value'],{});case'array':return deserializeArray(_0x5d5928['value'],[]);case'function':return deserializeFunction(_0x5d5928['value']);case'native':return deserializeNative(_0x5d5928['value']);case'reference':return _0x5d5928;case'number':return deserializeNumber(_0x5d5928['value']);case'string':return deserializeString(_0x5d5928['value']);case'boolean':return _0x5d5928['value']==='true';case'bigint':return BigInt(_0x5d5928['value']);case'date':return new Date(_0x5d5928['value']);case'error':return deserializeError(_0x5d5928['value']);case'null':return null;case'undefined':return undefined;default:throw new Error('Invalid\x20se'+'rialized\x20o'+'bject\x20type');}}function deserialize(_0x1b2d00){if(typeof _0x1b2d00!=='string')throw new Error('Invalid\x20ar'+'gument\x20typ'+'e:\x20'+typeof _0x1b2d00+'.');const _0x17e244=doSerialize(_0x1b2d00);return deserializeReferences(_0x17e244,_0x17e244),_0x17e244;}module['exports']={'serialize':serialize,'deserialize':deserialize};
|
|
10
10
|
/* eslint-enable */
|
package/distribution.js
CHANGED
|
@@ -24,6 +24,12 @@ function bootstrap(config) {
|
|
|
24
24
|
// @ts-ignore This is the first time globalThis.distribution is being initialized, so the object does not have all the necessary properties.
|
|
25
25
|
globalThis.distribution = distribution;
|
|
26
26
|
distribution.util = require('./distribution/util/util.js');
|
|
27
|
+
|
|
28
|
+
/* __start_M3_solution__
|
|
29
|
+
distribution.util.serialize = distributionLib.util.serialize;
|
|
30
|
+
distribution.util.deserialize = distributionLib.util.deserialize;
|
|
31
|
+
__end_M3_solution__ */
|
|
32
|
+
|
|
27
33
|
// @ts-ignore node.server is lazily initialized.
|
|
28
34
|
distribution.node = require('./distribution/local/node.js');
|
|
29
35
|
distribution.local = require('./distribution/local/local.js');
|
|
@@ -37,7 +43,6 @@ function bootstrap(config) {
|
|
|
37
43
|
|
|
38
44
|
/* Overrides when missing functionality from previous milestone or extra credit is needed */
|
|
39
45
|
|
|
40
|
-
// For M3, when missing RPC, its path through routes, and status.{spawn, stop}
|
|
41
46
|
/* __start_M3_solution__
|
|
42
47
|
distribution.util.wire.createRPC = distributionLib.util.wire.createRPC;
|
|
43
48
|
distribution.local.routes = distributionLib.local.routes;
|
|
@@ -45,8 +50,6 @@ function bootstrap(config) {
|
|
|
45
50
|
distribution.local.status.stop = distributionLib.local.status.stop;
|
|
46
51
|
distribution.local.comm = distributionLib.local.comm;
|
|
47
52
|
distribution.node.start = distributionLib.node.start;
|
|
48
|
-
distribution.util.serialize = distributionLib.util.serialize;
|
|
49
|
-
distribution.util.deserialize = distributionLib.util.deserialize;
|
|
50
53
|
__end_M3_solution__ */
|
|
51
54
|
|
|
52
55
|
for (const [key, service] of Object.entries(distribution.local)) {
|
|
@@ -61,15 +64,14 @@ function bootstrap(config) {
|
|
|
61
64
|
It can either be:
|
|
62
65
|
1. The reference implementation from the library @brown-ds/distribution
|
|
63
66
|
2. Your own, local implementation
|
|
64
|
-
|
|
65
|
-
Which one to be used by the tests is determined by the "useLibrary" value in the package.json file.
|
|
67
|
+
Set "useLibrary" in package.json to true or false accordingly.
|
|
66
68
|
*/
|
|
67
69
|
// @ts-ignore JSON import resolved at runtime.
|
|
68
70
|
const {useLibrary} = require('./package.json');
|
|
69
71
|
// @ts-ignore Optional dependency for reference implementation.
|
|
70
72
|
const distribution = useLibrary ? require('@brown-ds/distribution') : bootstrap;
|
|
71
73
|
|
|
72
|
-
/* The following code is run when distribution.js is
|
|
74
|
+
/* The following code is run when distribution.js is invoked directly */
|
|
73
75
|
if (require.main === module) {
|
|
74
76
|
globalThis.distribution = distribution();
|
|
75
77
|
// __start_solution__
|
|
@@ -78,7 +80,9 @@ if (require.main === module) {
|
|
|
78
80
|
JSON.stringify(globalThis.distribution.node.config)
|
|
79
81
|
}`,
|
|
80
82
|
);
|
|
83
|
+
// __end_solution__
|
|
81
84
|
globalThis.distribution.node.start(globalThis.distribution.node.config.onStart || (() => {
|
|
85
|
+
// Start REPL for interactive use
|
|
82
86
|
const repl = require('node:repl');
|
|
83
87
|
repl.start({
|
|
84
88
|
prompt: `${globalThis.distribution.util.id.getSID(globalThis.distribution.node.config)}> `,
|
|
@@ -88,7 +92,6 @@ if (require.main === module) {
|
|
|
88
92
|
useGlobal: true,
|
|
89
93
|
});
|
|
90
94
|
}));
|
|
91
|
-
// __end_solution__
|
|
92
95
|
}
|
|
93
96
|
|
|
94
97
|
module.exports = distribution;
|