-
Notifications
You must be signed in to change notification settings - Fork 0
/
socket.io.js
130 lines (128 loc) · 3.47 KB
/
socket.io.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
let socket;
let currentevent;
function require(file,callback){
var head=document.getElementsByTagName("head")[0];
var script=document.createElement('script');
script.src=file;
script.type='text/javascript';
//real browsers
script.onload=callback;
//Internet explorer
script.onreadystatechange = function() {
if (this.readyState == 'complete') {
callback();
}
}
head.appendChild(script);
}
if (!Scratch.extensions.unsandboxed) {
throw new Error('This extension must run unsandboxed');
}
require("https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.7.2/socket.io.js")
function listen(){
socket.onAny((event, ...args) => {
currentevent = {
event: event,
args: args
}
console.log(`got ${event}, ${args}`);
Scratch.vm.runtime.startHats('giganttechsocketio_onEvent');
});
};
class SocketIO {
getInfo() {
return {
id: 'giganttechsocketio',
name: 'Socket.IO',
blocks: [
{
opcode: 'connect',
text: 'Connect to Socket.IO server [URL]',
blockType: Scratch.BlockType.COMMAND,
arguments: {
URL: {
type: Scratch.ArgumentType.STRING,
defaultValue: "http://localhost:3000",
}
}
},
{
opcode: 'emit',
text: 'Send event ID: [ID] Arguments: [ARGS]',
blockType: Scratch.BlockType.COMMAND,
arguments: {
ID: {
type: Scratch.ArgumentType.STRING,
defaultValue: "hello",
},
ARGS: {
type: Scratch.ArgumentType.STRING,
defaultValue: "world",
}
}
},
{
opcode: 'eventID',
text: 'Event ID',
blockType: Scratch.BlockType.REPORTER,
arguments: {
}
},
{
opcode: 'eventARGS',
text: 'Event Arguments',
blockType: Scratch.BlockType.REPORTER,
arguments: {
}
},
{
opcode: 'disconnect',
text: 'Disconnect from the current Socket.IO connection',
blockType: Scratch.BlockType.COMMAND
},
{
blockType: Scratch.BlockType.EVENT,
opcode: 'onEvent',
text: 'On Socket.IO event',
isEdgeActivated: false,
arguments: {
KEY: {
type: Scratch.ArgumentType.STRING,
defaultValue: "test"
}
}
}
]
};
}
connect (args) {
return new Promise((resolve, reject) => {
socket = io.connect(args.URL);
socket.on('connect', function() {
listen();
resolve();
});
});
}
disconnect () {
return new Promise((resolve, reject) => {
socket.disconnect();
resolve();
});
}
eventID () {
if(!currentevent) return "No Event";
return currentevent.event;
}
eventARGS () {
if(!currentevent) return "No Event";
return currentevent.args;
}
emit(args) {
return new Promise((resolve, reject) => {
socket.emit(args.ID, args.ARGS);
resolve();
});
}
}
Scratch.extensions.register(new SocketIO());