node-toypad 2.0.0
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.
- package/README.md +30 -0
- package/data/minifigs.json +77 -0
- package/data/upgrades.json +246 -0
- package/data/vehicles.json +246 -0
- package/dist/connection.d.ts +32 -0
- package/dist/connection.js +158 -0
- package/dist/constants.d.ts +30 -0
- package/dist/constants.js +44 -0
- package/dist/ids.d.ts +571 -0
- package/dist/ids.js +574 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +6 -0
- package/dist/metadata.d.ts +25 -0
- package/dist/metadata.js +70 -0
- package/dist/protocol.d.ts +35 -0
- package/dist/protocol.js +177 -0
- package/dist/tag.d.ts +10 -0
- package/dist/tag.js +96 -0
- package/dist/toypad.d.ts +81 -0
- package/dist/toypad.js +318 -0
- package/dist/upgrade-token-map.d.ts +2 -0
- package/dist/upgrade-token-map.js +199 -0
- package/dist/upgrades-data.d.ts +5105 -0
- package/dist/upgrades-data.js +6213 -0
- package/dist/upgrades.d.ts +32 -0
- package/dist/upgrades.js +225 -0
- package/dist/vehicle-map.d.ts +2 -0
- package/dist/vehicle-map.js +246 -0
- package/package.json +34 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
[
|
|
2
|
+
{ "id": 0, "name": "Empty Vehicle Tag", "world": "Unknown", "parentId": 0 },
|
|
3
|
+
{ "id": 1000, "name": "Police Car", "world": "The LEGO Movie", "parentId": 1000 },
|
|
4
|
+
{ "id": 1001, "name": "Aerial Squad Car", "world": "The LEGO Movie", "parentId": 1000 },
|
|
5
|
+
{ "id": 1002, "name": "Missile Striker", "world": "The LEGO Movie", "parentId": 1000 },
|
|
6
|
+
{ "id": 1003, "name": "Gravity Sprinter", "world": "The Simpsons", "parentId": 1003 },
|
|
7
|
+
{ "id": 1004, "name": "Street Shredder", "world": "The Simpsons", "parentId": 1003 },
|
|
8
|
+
{ "id": 1005, "name": "Sky Clobbered", "world": "The Simpsons", "parentId": 1003 },
|
|
9
|
+
{ "id": 1006, "name": "Batmobile", "world": "DC Comics", "parentId": 1006 },
|
|
10
|
+
{ "id": 1007, "name": "Batblaster", "world": "DC Comics", "parentId": 1006 },
|
|
11
|
+
{ "id": 1008, "name": "Sonic Batray", "world": "DC Comics", "parentId": 1006 },
|
|
12
|
+
{ "id": 1009, "name": "Benny's Spaceship", "world": "The LEGO Movie", "parentId": 1009 },
|
|
13
|
+
{ "id": 1010, "name": "Laser Craft", "world": "The LEGO Movie", "parentId": 1009 },
|
|
14
|
+
{ "id": 1011, "name": "Annihilator", "world": "The LEGO Movie", "parentId": 1009 },
|
|
15
|
+
{ "id": 1012, "name": "Delorean Time Machine", "world": "Back to the Future", "parentId": 1012 },
|
|
16
|
+
{ "id": 1013, "name": "Electric Time Machine", "world": "Back to the Future", "parentId": 1012 },
|
|
17
|
+
{ "id": 1014, "name": "Ultra Time Machine", "world": "Back to the Future", "parentId": 1012 },
|
|
18
|
+
{ "id": 1015, "name": "Hoverboard", "world": "Back to the Future", "parentId": 1015 },
|
|
19
|
+
{ "id": 1016, "name": "Cyclone Board", "world": "Back to the Future", "parentId": 1015 },
|
|
20
|
+
{ "id": 1017, "name": "Ultimate Hoverjet", "world": "Back to the Future", "parentId": 1015 },
|
|
21
|
+
{ "id": 1018, "name": "Eagle Interceptor", "world": "Legends of Chima", "parentId": 1018 },
|
|
22
|
+
{ "id": 1019, "name": "Eagle Sky Blazer", "world": "Legends of Chima", "parentId": 1018 },
|
|
23
|
+
{ "id": 1020, "name": "Eagle Swoop Diver", "world": "Legends of Chima", "parentId": 1018 },
|
|
24
|
+
{ "id": 1021, "name": "Swamp Skimmer", "world": "Legends of Chima", "parentId": 1021 },
|
|
25
|
+
{ "id": 1022, "name": "Cragger's Fireship", "world": "Legends of Chima", "parentId": 1021 },
|
|
26
|
+
{ "id": 1023, "name": "Croc Command Sub", "world": "Legends of Chima", "parentId": 1021 },
|
|
27
|
+
{ "id": 1024, "name": "Cyber Guard", "world": "DC Comics", "parentId": 1024 },
|
|
28
|
+
{ "id": 1025, "name": "Cyber-Wrecker", "world": "DC Comics", "parentId": 1024 },
|
|
29
|
+
{ "id": 1026, "name": "Laser Robot Walker", "world": "DC Comics", "parentId": 1024 },
|
|
30
|
+
{ "id": 1027, "name": "K-9", "world": "Doctor Who", "parentId": 1027 },
|
|
31
|
+
{ "id": 1028, "name": "K-9 Ruff Rover", "world": "Doctor Who", "parentId": 1027 },
|
|
32
|
+
{ "id": 1029, "name": "K-9 Laser Cutter", "world": "Doctor Who", "parentId": 1027 },
|
|
33
|
+
{ "id": 1030, "name": "TARDIS", "world": "Doctor Who", "parentId": 1030 },
|
|
34
|
+
{ "id": 1031, "name": "Energy-Burst TARDIS", "world": "Doctor Who", "parentId": 1030 },
|
|
35
|
+
{ "id": 1032, "name": "Laser-Pulse TARDIS", "world": "Doctor Who", "parentId": 1030 },
|
|
36
|
+
{ "id": 1033, "name": "Emmet's Excavator", "world": "The LEGO Movie", "parentId": 1033 },
|
|
37
|
+
{ "id": 1034, "name": "Destroy Dozer", "world": "The LEGO Movie", "parentId": 1033 },
|
|
38
|
+
{ "id": 1035, "name": "Construct-o-Mech", "world": "The LEGO Movie", "parentId": 1033 },
|
|
39
|
+
{ "id": 1036, "name": "Winged Monkey", "world": "Wizard of Oz", "parentId": 1036 },
|
|
40
|
+
{ "id": 1037, "name": "Battle Monkey", "world": "Wizard of Oz", "parentId": 1036 },
|
|
41
|
+
{ "id": 1038, "name": "Commander Monkey", "world": "Wizard of Oz", "parentId": 1036 },
|
|
42
|
+
{ "id": 1039, "name": "Axe Chariot", "world": "Lord of the Rings", "parentId": 1039 },
|
|
43
|
+
{ "id": 1040, "name": "Axe Hurler", "world": "Lord of the Rings", "parentId": 1039 },
|
|
44
|
+
{ "id": 1041, "name": "Soaring Chariot", "world": "Lord of the Rings", "parentId": 1039 },
|
|
45
|
+
{ "id": 1042, "name": "Shelob the Great", "world": "Lord of the Rings", "parentId": 1042 },
|
|
46
|
+
{ "id": 1043, "name": "8-Legged Stalker", "world": "Lord of the Rings", "parentId": 1042 },
|
|
47
|
+
{ "id": 1044, "name": "Poison Slinger", "world": "Lord of the Rings", "parentId": 1042 },
|
|
48
|
+
{ "id": 1045, "name": "Homer's Car", "world": "The Simpsons", "parentId": 1045 },
|
|
49
|
+
{ "id": 1046, "name": "The Homercraft", "world": "The Simpsons", "parentId": 1045 },
|
|
50
|
+
{ "id": 1047, "name": "The SubmaHomer", "world": "The Simpsons", "parentId": 1045 },
|
|
51
|
+
{ "id": 1048, "name": "Taunt-o-Vision", "world": "The Simpsons", "parentId": 1048 },
|
|
52
|
+
{ "id": 1049, "name": "Blast Cam", "world": "The Simpsons", "parentId": 1048 },
|
|
53
|
+
{ "id": 1050, "name": "The MechaHomer", "world": "The Simpsons", "parentId": 1048 },
|
|
54
|
+
{ "id": 1051, "name": "Velociraptor", "world": "Jurassic World", "parentId": 1051 },
|
|
55
|
+
{ "id": 1052, "name": "Spike Attack Raptor", "world": "Jurassic World", "parentId": 1051 },
|
|
56
|
+
{ "id": 1053, "name": "Venom Raptor", "world": "Jurassic World", "parentId": 1051 },
|
|
57
|
+
{ "id": 1054, "name": "Gyro Sphere", "world": "Jurassic World", "parentId": 1054 },
|
|
58
|
+
{ "id": 1055, "name": "Sonic Beam Gyrosphere", "world": "Jurassic World", "parentId": 1054 },
|
|
59
|
+
{ "id": 1056, "name": "Speed Boost Gyrosphere", "world": "Jurassic World", "parentId": 1054 },
|
|
60
|
+
{ "id": 1057, "name": "Clown Bike", "world": "The Simpsons", "parentId": 1057 },
|
|
61
|
+
{ "id": 1058, "name": "Cannon Bike", "world": "The Simpsons", "parentId": 1057 },
|
|
62
|
+
{ "id": 1059, "name": "Anti-Gravity Rocket Bike", "world": "The Simpsons", "parentId": 1057 },
|
|
63
|
+
{ "id": 1060, "name": "Mighty Lion Rider", "world": "Legends of Chima", "parentId": 1060 },
|
|
64
|
+
{ "id": 1061, "name": "Lion Blazer", "world": "Legends of Chima", "parentId": 1060 },
|
|
65
|
+
{ "id": 1062, "name": "Fire Lion", "world": "Legends of Chima", "parentId": 1060 },
|
|
66
|
+
{ "id": 1063, "name": "Arrow Launcher", "world": "Lord of the Rings", "parentId": 1063 },
|
|
67
|
+
{ "id": 1064, "name": "Seeking Shooter", "world": "Lord of the Rings", "parentId": 1063 },
|
|
68
|
+
{ "id": 1065, "name": "Triple Ballista", "world": "Lord of the Rings", "parentId": 1063 },
|
|
69
|
+
{ "id": 1066, "name": "Mystery Machine", "world": "Scooby-Doo", "parentId": 1066 },
|
|
70
|
+
{ "id": 1067, "name": "Mystery Tow & Go", "world": "Scooby-Doo", "parentId": 1066 },
|
|
71
|
+
{ "id": 1068, "name": "Mystery Monster", "world": "Scooby-Doo", "parentId": 1066 },
|
|
72
|
+
{ "id": 1069, "name": "Boulder Bomber", "world": "Ninjago", "parentId": 1069 },
|
|
73
|
+
{ "id": 1070, "name": "Boulder Blaster", "world": "Ninjago", "parentId": 1069 },
|
|
74
|
+
{ "id": 1071, "name": "Cyclone Jet", "world": "Ninjago", "parentId": 1069 },
|
|
75
|
+
{ "id": 1072, "name": "Stormfighter", "world": "Ninjago", "parentId": 1072 },
|
|
76
|
+
{ "id": 1073, "name": "Lightning Jet", "world": "Ninjago", "parentId": 1072 },
|
|
77
|
+
{ "id": 1074, "name": "Electro-Shooter", "world": "Ninjago", "parentId": 1072 },
|
|
78
|
+
{ "id": 1075, "name": "Blade Bike", "world": "Ninjago", "parentId": 1075 },
|
|
79
|
+
{ "id": 1076, "name": "Flying Fire Bike", "world": "Ninjago", "parentId": 1075 },
|
|
80
|
+
{ "id": 1077, "name": "Blades of Fire", "world": "Ninjago", "parentId": 1075 },
|
|
81
|
+
{ "id": 1078, "name": "Samurai Mech", "world": "Ninjago", "parentId": 1078 },
|
|
82
|
+
{ "id": 1079, "name": "Samurai Shooter", "world": "Ninjago", "parentId": 1078 },
|
|
83
|
+
{ "id": 1080, "name": "Soaring Samurai Mech", "world": "Ninjago", "parentId": 1078 },
|
|
84
|
+
{ "id": 1081, "name": "Companion Cube", "world": "Portal 2", "parentId": 1081 },
|
|
85
|
+
{ "id": 1082, "name": "Laser Deflector", "world": "Portal 2", "parentId": 1081 },
|
|
86
|
+
{ "id": 1083, "name": "Gold Heart Emitter", "world": "Portal 2", "parentId": 1081 },
|
|
87
|
+
{ "id": 1084, "name": "Sentry Turret", "world": "Portal 2", "parentId": 1084 },
|
|
88
|
+
{ "id": 1085, "name": "Turret Striker", "world": "Portal 2", "parentId": 1084 },
|
|
89
|
+
{ "id": 1086, "name": "Flying Turret Carrier", "world": "Portal 2", "parentId": 1084 },
|
|
90
|
+
{ "id": 1087, "name": "Scooby Snack", "world": "Scooby-Doo", "parentId": 1087 },
|
|
91
|
+
{ "id": 1088, "name": "Scooby Fire Snack", "world": "Scooby-Doo", "parentId": 1087 },
|
|
92
|
+
{ "id": 1089, "name": "Scooby Ghost Snack", "world": "Scooby-Doo", "parentId": 1087 },
|
|
93
|
+
{ "id": 1090, "name": "Cloud Cukoo Car", "world": "The LEGO Movie", "parentId": 1090 },
|
|
94
|
+
{ "id": 1091, "name": "X-treme Soaker", "world": "The LEGO Movie", "parentId": 1090 },
|
|
95
|
+
{ "id": 1092, "name": "Rainbow Cannon", "world": "The LEGO Movie", "parentId": 1090 },
|
|
96
|
+
{ "id": 1093, "name": "Invisible Jet", "world": "DC Comics", "parentId": 1093 },
|
|
97
|
+
{ "id": 1094, "name": "Laser Shooter", "world": "DC Comics", "parentId": 1093 },
|
|
98
|
+
{ "id": 1095, "name": "Torpedo Bomber", "world": "DC Comics", "parentId": 1093 },
|
|
99
|
+
{ "id": 1096, "name": "Ninja Copter", "world": "Ninjago", "parentId": 1096 },
|
|
100
|
+
{ "id": 1097, "name": "Glaciator", "world": "Ninjago", "parentId": 1096 },
|
|
101
|
+
{ "id": 1098, "name": "Freeze Fighter", "world": "Ninjago", "parentId": 1096 },
|
|
102
|
+
{ "id": 1099, "name": "Traveling Time Train", "world": "Back to the Future", "parentId": 1099 },
|
|
103
|
+
{ "id": 1100, "name": "Flying Time Machine", "world": "Back to the Future", "parentId": 1099 },
|
|
104
|
+
{ "id": 1101, "name": "Missile Blast Time Train", "world": "Back to the Future", "parentId": 1099 },
|
|
105
|
+
{ "id": 1102, "name": "Aqua Watercraft", "world": "DC Comics", "parentId": 1102 },
|
|
106
|
+
{ "id": 1103, "name": "Seven Seas Speeder", "world": "DC Comics", "parentId": 1102 },
|
|
107
|
+
{ "id": 1104, "name": "Trident of Fire", "world": "DC Comics", "parentId": 1102 },
|
|
108
|
+
{ "id": 1105, "name": "Drill Driver", "world": "DC Comics", "parentId": 1105 },
|
|
109
|
+
{ "id": 1106, "name": "Drill Driver 2", "world": "DC Comics", "parentId": 1105 },
|
|
110
|
+
{ "id": 1107, "name": "Drill Driver 3", "world": "DC Comics", "parentId": 1105 },
|
|
111
|
+
{ "id": 1108, "name": "Quinn-mobile", "world": "DC Comics", "parentId": 1108 },
|
|
112
|
+
{ "id": 1109, "name": "Quinn Ultra Racer", "world": "DC Comics", "parentId": 1108 },
|
|
113
|
+
{ "id": 1110, "name": "Missile Launcher", "world": "DC Comics", "parentId": 1108 },
|
|
114
|
+
{ "id": 1111, "name": "The Joker's Chopper", "world": "DC Comics", "parentId": 1111 },
|
|
115
|
+
{ "id": 1112, "name": "Mischievous Missile Blaster", "world": "DC Comics", "parentId": 1111 },
|
|
116
|
+
{ "id": 1113, "name": "The Joker’s Lock ‘n Laser Jet", "world": "DC Comics", "parentId": 1111 },
|
|
117
|
+
{ "id": 1114, "name": "Hover Pod", "world": "DC Comics", "parentId": 1114 },
|
|
118
|
+
{ "id": 1115, "name": "Hover Pod 2", "world": "DC Comics", "parentId": 1114 },
|
|
119
|
+
{ "id": 1116, "name": "Hover Pod 3", "world": "DC Comics", "parentId": 1114 },
|
|
120
|
+
{ "id": 1117, "name": "Dalek", "world": "Doctor Who", "parentId": 1117 },
|
|
121
|
+
{ "id": 1118, "name": "Fire ‘n Ride Dalek", "world": "Doctor Who", "parentId": 1117 },
|
|
122
|
+
{ "id": 1119, "name": "Silver Shooter Dalek", "world": "Doctor Who", "parentId": 1117 },
|
|
123
|
+
{ "id": 1120, "name": "Ecto-1", "world": "Ghostbusters", "parentId": 1120 },
|
|
124
|
+
{ "id": 1121, "name": "Ecto-1 Blaster", "world": "Ghostbusters", "parentId": 1120 },
|
|
125
|
+
{ "id": 1122, "name": "Ecto-1 Water Diver", "world": "Ghostbusters", "parentId": 1120 },
|
|
126
|
+
{ "id": 1123, "name": "Ghost Trap", "world": "Ghostbusters", "parentId": 1123 },
|
|
127
|
+
{ "id": 1124, "name": "Ghost Stun 'n' Trap", "world": "Ghostbusters", "parentId": 1123 },
|
|
128
|
+
{ "id": 1125, "name": "Proton Zapper", "world": "Ghostbusters", "parentId": 1123 },
|
|
129
|
+
{ "id": 1132, "name": "Lloyd's Golden Dragon", "world": "Ninjago", "parentId": 1132 },
|
|
130
|
+
{ "id": 1133, "name": "Lloyd's Golden Dragon 2", "world": "Ninjago", "parentId": 1132 },
|
|
131
|
+
{ "id": 1134, "name": "Lloyd's Golden Dragon 3", "world": "Ninjago", "parentId": 1132 },
|
|
132
|
+
{ "id": 1144, "name": "Mega Flight Dragon", "world": "Ninjago", "parentId": 1144 },
|
|
133
|
+
{ "id": 1145, "name": "Mega Flight Dragon 2", "world": "Ninjago", "parentId": 1144 },
|
|
134
|
+
{ "id": 1146, "name": "Mega Flight Dragon 3", "world": "Ninjago", "parentId": 1144 },
|
|
135
|
+
{ "id": 1155, "name": "Flying White Dragon", "world": "Ninjago", "parentId": 1155 },
|
|
136
|
+
{ "id": 1156, "name": "Golden Fire Dragon", "world": "Ninjago", "parentId": 1155 },
|
|
137
|
+
{ "id": 1157, "name": "Ultra Destruction Dragon", "world": "Ninjago", "parentId": 1155 },
|
|
138
|
+
{ "id": 1158, "name": "Arcade Machine", "world": "Midway Arcade", "parentId": 1158 },
|
|
139
|
+
{ "id": 1159, "name": "8-bit Shooter", "world": "Midway Arcade", "parentId": 1158 },
|
|
140
|
+
{ "id": 1160, "name": "The Pixelator", "world": "Midway Arcade", "parentId": 1158 },
|
|
141
|
+
{ "id": 1161, "name": "G-61555 Spy Hunter", "world": "Midway Arcade", "parentId": 1161 },
|
|
142
|
+
{ "id": 1162, "name": "The Interdiver", "world": "Midway Arcade", "parentId": 1161 },
|
|
143
|
+
{ "id": 1163, "name": "Aerial Spyhunter", "world": "Midway Arcade", "parentId": 1161 },
|
|
144
|
+
{ "id": 1164, "name": "Slime Shooter", "world": "Ghostbusters", "parentId": 1164 },
|
|
145
|
+
{ "id": 1165, "name": "Slime Exploder", "world": "Ghostbusters", "parentId": 1164 },
|
|
146
|
+
{ "id": 1166, "name": "Slime Streamer", "world": "Ghostbusters", "parentId": 1164 },
|
|
147
|
+
{ "id": 1167, "name": "Terror Dog", "world": "Ghostbusters", "parentId": 1167 },
|
|
148
|
+
{ "id": 1168, "name": "Terror Dog Destroyer", "world": "Ghostbusters", "parentId": 1167 },
|
|
149
|
+
{ "id": 1169, "name": "Soaring Terror Dog", "world": "Ghostbusters", "parentId": 1167 },
|
|
150
|
+
{ "id": 1170, "name": "Ancient War Elephant", "world": "Adventure Time", "parentId": 1170 },
|
|
151
|
+
{ "id": 1171, "name": "Cosmic Squid", "world": "Adventure Time", "parentId": 1170 },
|
|
152
|
+
{ "id": 1172, "name": "Psychic Submarine", "world": "Adventure Time", "parentId": 1170 },
|
|
153
|
+
{ "id": 1173, "name": "BMO", "world": "Adventure Time", "parentId": 1173 },
|
|
154
|
+
{ "id": 1174, "name": "DOGMO", "world": "Adventure Time", "parentId": 1173 },
|
|
155
|
+
{ "id": 1175, "name": "SNAKEMO", "world": "Adventure Time", "parentId": 1173 },
|
|
156
|
+
{ "id": 1176, "name": "Jakemobile", "world": "Adventure Time", "parentId": 1176 },
|
|
157
|
+
{ "id": 1177, "name": "Snail Dude Jake", "world": "Adventure Time", "parentId": 1176 },
|
|
158
|
+
{ "id": 1178, "name": "Hover Jake", "world": "Adventure Time", "parentId": 1176 },
|
|
159
|
+
{ "id": 1179, "name": "Lumpy Car", "world": "Adventure Time", "parentId": 1179 },
|
|
160
|
+
{ "id": 1180, "name": "Lumpy Truck", "world": "Adventure Time", "parentId": 1179 },
|
|
161
|
+
{ "id": 1181, "name": "Lumpy Land Whale", "world": "Adventure Time", "parentId": 1179 },
|
|
162
|
+
{ "id": 1182, "name": "Lunatic Amp", "world": "Adventure Time", "parentId": 1182 },
|
|
163
|
+
{ "id": 1183, "name": "Lunatic Amp 2", "world": "Adventure Time", "parentId": 1182 },
|
|
164
|
+
{ "id": 1184, "name": "Lunatic Amp 3", "world": "Adventure Time", "parentId": 1182 },
|
|
165
|
+
{ "id": 1185, "name": "B.A.'s Van", "world": "The A-Team", "parentId": 1185 },
|
|
166
|
+
{ "id": 1186, "name": "Fool Smasher", "world": "The A-Team", "parentId": 1185 },
|
|
167
|
+
{ "id": 1187, "name": "The Pain Plane", "world": "The A-Team", "parentId": 1185 },
|
|
168
|
+
{ "id": 1188, "name": "Phone Home", "world": "E.T.", "parentId": 1188 },
|
|
169
|
+
{ "id": 1189, "name": "Phone Home 2", "world": "E.T.", "parentId": 1188 },
|
|
170
|
+
{ "id": 1190, "name": "Phone Home 3", "world": "E.T.", "parentId": 1188 },
|
|
171
|
+
{ "id": 1191, "name": "Niffler", "world": "Fantastic Beasts", "parentId": 1191 },
|
|
172
|
+
{ "id": 1192, "name": "Niffler 2", "world": "Fantastic Beasts", "parentId": 1191 },
|
|
173
|
+
{ "id": 1193, "name": "Niffler 3", "world": "Fantastic Beasts", "parentId": 1191 },
|
|
174
|
+
{ "id": 1194, "name": "Swooping Evil", "world": "Fantastic Beasts", "parentId": 1194 },
|
|
175
|
+
{ "id": 1195, "name": "Swooping Evil 2", "world": "Fantastic Beasts", "parentId": 1194 },
|
|
176
|
+
{ "id": 1196, "name": "Swooping Evil 3", "world": "Fantastic Beasts", "parentId": 1194 },
|
|
177
|
+
{ "id": 1197, "name": "Ecto-1", "world": "Ghostbusters 2016", "parentId": 1197 },
|
|
178
|
+
{ "id": 1198, "name": "Ectozer", "world": "Ghostbusters 2016", "parentId": 1197 },
|
|
179
|
+
{ "id": 1199, "name": "Ecto-1 Rebuild 2", "world": "Ghostbusters 2016", "parentId": 1197 },
|
|
180
|
+
{ "id": 1200, "name": "Flash 'n' Finish", "world": "Ghostbusters 2016", "parentId": 1198 },
|
|
181
|
+
{ "id": 1201, "name": "Rampage Record Player", "world": "Gremlins", "parentId": 1201 },
|
|
182
|
+
{ "id": 1202, "name": "Stripe's Throne", "world": "Gremlins", "parentId": 1201 },
|
|
183
|
+
{ "id": 1203, "name": "R.C. Racer", "world": "Gremlins", "parentId": 1201 },
|
|
184
|
+
{ "id": 1204, "name": "Gadget-o-Matic", "world": "Gremlins", "parentId": 1204 },
|
|
185
|
+
{ "id": 1205, "name": "Scarlet Scorpion", "world": "Gremlins", "parentId": 1204 },
|
|
186
|
+
{ "id": 1206, "name": "Hogwarts Express", "world": "Harry Potter", "parentId": 1206 },
|
|
187
|
+
{ "id": 1207, "name": "Soaring Steam Plane", "world": "Harry Potter", "parentId": 1206 },
|
|
188
|
+
{ "id": 1208, "name": "Steam Warrior", "world": "Harry Potter", "parentId": 1206 },
|
|
189
|
+
{ "id": 1209, "name": "Enchanted Car", "world": "Harry Potter", "parentId": 1209 },
|
|
190
|
+
{ "id": 1210, "name": "Shark Sub", "world": "Harry Potter", "parentId": 1209 },
|
|
191
|
+
{ "id": 1211, "name": "Monstrous Mouth", "world": "Harry Potter", "parentId": 1209 },
|
|
192
|
+
{ "id": 1212, "name": "IMF Scrambler", "world": "Mission Impossible", "parentId": 1212 },
|
|
193
|
+
{ "id": 1213, "name": "Shock Cycle", "world": "Mission Impossible", "parentId": 1213 },
|
|
194
|
+
{ "id": 1214, "name": "IMF Covert Jet", "world": "Mission Impossible", "parentId": 1213 },
|
|
195
|
+
{ "id": 1215, "name": "IMF Sport Car", "world": "Mission Impossible", "parentId": 1213 },
|
|
196
|
+
{ "id": 1216, "name": "IMF Tank", "world": "Mission Impossible", "parentId": 1216 },
|
|
197
|
+
{ "id": 1217, "name": "IMF-Splorer", "world": "Mission Impossible", "parentId": 1216 },
|
|
198
|
+
{ "id": 1218, "name": "Sonic Speedster", "world": "Sonic the Hedgehog", "parentId": 1218 },
|
|
199
|
+
{ "id": 1219, "name": "Sonic Speedster 2", "world": "Sonic the Hedgehog", "parentId": 1218 },
|
|
200
|
+
{ "id": 1220, "name": "Sonic Speedster 3", "world": "Sonic the Hedgehog", "parentId": 1218 },
|
|
201
|
+
{ "id": 1221, "name": "The Tornado", "world": "Sonic the Hedgehog", "parentId": 1221 },
|
|
202
|
+
{ "id": 1222, "name": "The Tornado 1", "world": "Sonic the Hedgehog", "parentId": 1221 },
|
|
203
|
+
{ "id": 1223, "name": "The Tornado 2", "world": "Sonic the Hedgehog", "parentId": 1221 },
|
|
204
|
+
{ "id": 1224, "name": "K.I.T.T.", "world": "Knight Rider", "parentId": 1224 },
|
|
205
|
+
{ "id": 1225, "name": "K.I.T.T. Jet", "world": "Knight Rider", "parentId": 1224 },
|
|
206
|
+
{ "id": 1226, "name": "Goliath Armored Semi", "world": "Knight Rider", "parentId": 1224 },
|
|
207
|
+
{ "id": 1227, "name": "Police Helicopter", "world": "LEGO City", "parentId": 1227 },
|
|
208
|
+
{ "id": 1228, "name": "Hovercraft", "world": "LEGO City", "parentId": 1227 },
|
|
209
|
+
{ "id": 1229, "name": "Plane", "world": "LEGO City", "parentId": 1227 },
|
|
210
|
+
{ "id": 1230, "name": "Bionic Steed", "world": "LEGO Batman Movie", "parentId": 1230 },
|
|
211
|
+
{ "id": 1231, "name": "Bat Raptor", "world": "LEGO Batman Movie", "parentId": 1230 },
|
|
212
|
+
{ "id": 1232, "name": "Ultra Bat", "world": "LEGO Batman Movie", "parentId": 1230 },
|
|
213
|
+
{ "id": 1233, "name": "Bat Wing", "world": "LEGO Batman Movie", "parentId": 1233 },
|
|
214
|
+
{ "id": 1234, "name": "Black Thunder", "world": "LEGO Batman Movie", "parentId": 1233 },
|
|
215
|
+
{ "id": 1235, "name": "Bat Tank", "world": "LEGO Batman Movie", "parentId": 1233 },
|
|
216
|
+
{ "id": 1236, "name": "Skeleton Organ", "world": "The Goonies", "parentId": 1236 },
|
|
217
|
+
{ "id": 1237, "name": "Skeleton Jukebox", "world": "The Goonies", "parentId": 1236 },
|
|
218
|
+
{ "id": 1238, "name": "Skele-Turkey", "world": "The Goonies", "parentId": 1236 },
|
|
219
|
+
{ "id": 1239, "name": "Pirate Ship", "world": "The Goonies", "parentId": 1239 },
|
|
220
|
+
{ "id": 1240, "name": "Fanged Fortune", "world": "The Goonies", "parentId": 1239 },
|
|
221
|
+
{ "id": 1241, "name": "Inferno Cannon", "world": "The Goonies", "parentId": 1239 },
|
|
222
|
+
{ "id": 1242, "name": "Buckbeak", "world": "Harry Potter", "parentId": 1242 },
|
|
223
|
+
{ "id": 1243, "name": "Giant Owl", "world": "Harry Potter", "parentId": 1242 },
|
|
224
|
+
{ "id": 1244, "name": "Fierce Falcon", "world": "Harry Potter", "parentId": 1242 },
|
|
225
|
+
{ "id": 1245, "name": "Saturn's Sandworm", "world": "Beetlejuice", "parentId": 1245 },
|
|
226
|
+
{ "id": 1246, "name": "Spooky Spider", "world": "Beetlejuice", "parentId": 1245 },
|
|
227
|
+
{ "id": 1247, "name": "Haunted Vacuum", "world": "Beetlejuice", "parentId": 1245 },
|
|
228
|
+
{ "id": 1248, "name": "PPG Smartphone", "world": "Powerpuff Girls", "parentId": 1248 },
|
|
229
|
+
{ "id": 1249, "name": "PPG Hotline", "world": "Powerpuff Girls", "parentId": 1248 },
|
|
230
|
+
{ "id": 1250, "name": "Powerpuff Mag Net", "world": "Powerpuff Girls", "parentId": 1248 },
|
|
231
|
+
{ "id": 1251, "name": "Ka Pow Cannon", "world": "Powerpuff Girls", "parentId": 1250 },
|
|
232
|
+
{ "id": 1252, "name": "Slammin' Guitar", "world": "Powerpuff Girls", "parentId": 1250 },
|
|
233
|
+
{ "id": 1253, "name": "Mega Blast Bot", "world": "Powerpuff Girls", "parentId": 1253 },
|
|
234
|
+
{ "id": 1254, "name": "Octi", "world": "Powerpuff Girls", "parentId": 1254 },
|
|
235
|
+
{ "id": 1255, "name": "Super Skunk", "world": "Powerpuff Girls", "parentId": 1254 },
|
|
236
|
+
{ "id": 1256, "name": "Sonic Squid", "world": "Powerpuff Girls", "parentId": 1254 },
|
|
237
|
+
{ "id": 1257, "name": "T Car", "world": "Teen Titans Go", "parentId": 1257 },
|
|
238
|
+
{ "id": 1258, "name": "T Forklift", "world": "Teen Titans Go", "parentId": 1257 },
|
|
239
|
+
{ "id": 1259, "name": "T Plane", "world": "Teen Titans Go", "parentId": 1257 },
|
|
240
|
+
{ "id": 1260, "name": "Spellbook of Azarath", "world": "Teen Titans Go", "parentId": 1260 },
|
|
241
|
+
{ "id": 1261, "name": "Raven Wings", "world": "Teen Titans Go", "parentId": 1260 },
|
|
242
|
+
{ "id": 1262, "name": "Giant Hand", "world": "Teen Titans Go", "parentId": 1260 },
|
|
243
|
+
{ "id": 1263, "name": "Titan Robot", "world": "Teen Titans Go", "parentId": 1263 },
|
|
244
|
+
{ "id": 1264, "name": "T Rocket", "world": "Teen Titans Go", "parentId": 1263 },
|
|
245
|
+
{ "id": 1265, "name": "Robot Retriever", "world": "Teen Titans Go", "parentId": 1263 }
|
|
246
|
+
]
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
import { ToyPadCommand, ToyPadResponseMessage, ToyPadTagEvent } from "./protocol.js";
|
|
3
|
+
export interface ToyPadConnectionEvents {
|
|
4
|
+
connect: () => void;
|
|
5
|
+
event: (event: ToyPadTagEvent) => void;
|
|
6
|
+
message: (message: ToyPadResponseMessage) => void;
|
|
7
|
+
error: (error: Error) => void;
|
|
8
|
+
}
|
|
9
|
+
export declare class ToyPadConnection extends EventEmitter {
|
|
10
|
+
private device?;
|
|
11
|
+
private requestId;
|
|
12
|
+
private readonly pending;
|
|
13
|
+
private hasConnected;
|
|
14
|
+
private readonly handleDataBound;
|
|
15
|
+
private readonly handleErrorBound;
|
|
16
|
+
open(): Promise<void>;
|
|
17
|
+
request(command: ToyPadCommand, timeoutMs?: number): Promise<Buffer>;
|
|
18
|
+
close(): void;
|
|
19
|
+
private handleData;
|
|
20
|
+
private resolvePending;
|
|
21
|
+
private rejectAll;
|
|
22
|
+
private nextRequestId;
|
|
23
|
+
private writeRaw;
|
|
24
|
+
private isConnectResponse;
|
|
25
|
+
private createHidDevice;
|
|
26
|
+
}
|
|
27
|
+
export interface ToyPadConnection {
|
|
28
|
+
on<U extends keyof ToyPadConnectionEvents>(event: U, listener: ToyPadConnectionEvents[U]): this;
|
|
29
|
+
once<U extends keyof ToyPadConnectionEvents>(event: U, listener: ToyPadConnectionEvents[U]): this;
|
|
30
|
+
off<U extends keyof ToyPadConnectionEvents>(event: U, listener: ToyPadConnectionEvents[U]): this;
|
|
31
|
+
emit<U extends keyof ToyPadConnectionEvents>(event: U, ...args: Parameters<ToyPadConnectionEvents[U]>): boolean;
|
|
32
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { EventEmitter } from "events";
|
|
2
|
+
import debug from "debug";
|
|
3
|
+
import HID from "node-hid";
|
|
4
|
+
import { DEFAULT_REQUEST_TIMEOUT_MS, TOY_PAD_PRODUCT_ID, TOY_PAD_VENDOR_ID, WAKE_SEQUENCE } from "./constants.js";
|
|
5
|
+
import { decodeMessage, encodeCommand } from "./protocol.js";
|
|
6
|
+
const log = debug("node-toypad:connection");
|
|
7
|
+
const rawLog = debug("node-toypad:connection:raw");
|
|
8
|
+
export class ToyPadConnection extends EventEmitter {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments);
|
|
11
|
+
this.requestId = 0;
|
|
12
|
+
this.pending = new Map();
|
|
13
|
+
this.hasConnected = false;
|
|
14
|
+
this.handleDataBound = (data) => {
|
|
15
|
+
const buffer = Buffer.isBuffer(data) ? data : Buffer.from(data);
|
|
16
|
+
this.handleData(buffer);
|
|
17
|
+
};
|
|
18
|
+
this.handleErrorBound = (error) => {
|
|
19
|
+
log("device error: %s", error.message);
|
|
20
|
+
this.rejectAll(error);
|
|
21
|
+
this.emit("error", error);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
async open() {
|
|
25
|
+
if (this.device) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
this.hasConnected = false;
|
|
29
|
+
const hidDevice = this.createHidDevice();
|
|
30
|
+
this.device = hidDevice;
|
|
31
|
+
hidDevice.on("data", this.handleDataBound);
|
|
32
|
+
hidDevice.on("error", this.handleErrorBound);
|
|
33
|
+
this.writeRaw(WAKE_SEQUENCE);
|
|
34
|
+
}
|
|
35
|
+
async request(command, timeoutMs = DEFAULT_REQUEST_TIMEOUT_MS) {
|
|
36
|
+
if (!this.device) {
|
|
37
|
+
throw new Error("ToyPad is not connected");
|
|
38
|
+
}
|
|
39
|
+
const requestId = this.nextRequestId();
|
|
40
|
+
const encoded = encodeCommand(command, requestId);
|
|
41
|
+
rawLog("tx %s", encoded.toString("hex"));
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
const timeout = setTimeout(() => {
|
|
44
|
+
this.pending.delete(requestId);
|
|
45
|
+
reject(new Error(`ToyPad request 0x${command.id.toString(16)} timed out`));
|
|
46
|
+
}, timeoutMs);
|
|
47
|
+
this.pending.set(requestId, {
|
|
48
|
+
resolve: (payload) => {
|
|
49
|
+
clearTimeout(timeout);
|
|
50
|
+
resolve(payload);
|
|
51
|
+
},
|
|
52
|
+
reject: (error) => {
|
|
53
|
+
clearTimeout(timeout);
|
|
54
|
+
reject(error);
|
|
55
|
+
},
|
|
56
|
+
timeout
|
|
57
|
+
});
|
|
58
|
+
this.writeRaw(encoded);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
close() {
|
|
62
|
+
if (!this.device) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
this.device.removeListener("data", this.handleDataBound);
|
|
66
|
+
this.device.removeListener("error", this.handleErrorBound);
|
|
67
|
+
try {
|
|
68
|
+
this.device.close();
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
log("error closing device: %s", error instanceof Error ? error.message : String(error));
|
|
72
|
+
}
|
|
73
|
+
this.device = undefined;
|
|
74
|
+
this.rejectAll(new Error("ToyPad connection closed"));
|
|
75
|
+
this.hasConnected = false;
|
|
76
|
+
}
|
|
77
|
+
handleData(data) {
|
|
78
|
+
rawLog("rx %s", data.toString("hex"));
|
|
79
|
+
const parsed = decodeMessage(data);
|
|
80
|
+
if (!parsed) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (parsed.kind === "event") {
|
|
84
|
+
this.emit("event", parsed);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (parsed.kind === "response" && this.isConnectResponse(parsed)) {
|
|
88
|
+
this.hasConnected = true;
|
|
89
|
+
this.emit("connect");
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
this.resolvePending(parsed);
|
|
93
|
+
}
|
|
94
|
+
resolvePending(message) {
|
|
95
|
+
if (message.kind !== "response") {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const pending = this.pending.get(message.requestId);
|
|
99
|
+
if (!pending) {
|
|
100
|
+
this.emit("message", message);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
this.pending.delete(message.requestId);
|
|
104
|
+
pending.resolve(message.payload);
|
|
105
|
+
}
|
|
106
|
+
rejectAll(error) {
|
|
107
|
+
for (const [requestId, pending] of Array.from(this.pending.entries())) {
|
|
108
|
+
clearTimeout(pending.timeout);
|
|
109
|
+
pending.reject(error);
|
|
110
|
+
this.pending.delete(requestId);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
nextRequestId() {
|
|
114
|
+
this.requestId = (this.requestId + 1) & 0xff;
|
|
115
|
+
if (this.requestId === 0) {
|
|
116
|
+
this.requestId = 1;
|
|
117
|
+
}
|
|
118
|
+
return this.requestId;
|
|
119
|
+
}
|
|
120
|
+
writeRaw(buffer) {
|
|
121
|
+
if (!this.device) {
|
|
122
|
+
throw new Error("ToyPad is not connected");
|
|
123
|
+
}
|
|
124
|
+
const data = Array.from(buffer.values());
|
|
125
|
+
this.device.write(data);
|
|
126
|
+
}
|
|
127
|
+
isConnectResponse(message) {
|
|
128
|
+
return !this.hasConnected && message.payload.length >= 20;
|
|
129
|
+
}
|
|
130
|
+
createHidDevice() {
|
|
131
|
+
const devices = HID.devices().filter((device) => {
|
|
132
|
+
return device.vendorId === TOY_PAD_VENDOR_ID && device.productId === TOY_PAD_PRODUCT_ID;
|
|
133
|
+
});
|
|
134
|
+
const errors = [];
|
|
135
|
+
for (const device of devices) {
|
|
136
|
+
if (!device.path) {
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
return new HID.HID(device.path);
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
errors.push(`path ${device.path} open failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
try {
|
|
147
|
+
return new HID.HID(TOY_PAD_VENDOR_ID, TOY_PAD_PRODUCT_ID);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
errors.push(`vendor/product open failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
151
|
+
if (errors.length === 0) {
|
|
152
|
+
throw new Error("Unable to find a connected ToyPad. Ensure it is plugged in and recognized by the OS.");
|
|
153
|
+
}
|
|
154
|
+
const message = errors.join("; ") || "unknown error";
|
|
155
|
+
throw new Error(`Unable to open ToyPad HID device (${message}).`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare const TOY_PAD_VENDOR_ID = 3695;
|
|
2
|
+
export declare const TOY_PAD_PRODUCT_ID = 577;
|
|
3
|
+
export declare const PACKET_LENGTH = 32;
|
|
4
|
+
export declare const WAKE_SEQUENCE: Buffer<ArrayBuffer>;
|
|
5
|
+
export declare enum MessageType {
|
|
6
|
+
Response = 85,
|
|
7
|
+
Event = 86
|
|
8
|
+
}
|
|
9
|
+
export declare enum CommandType {
|
|
10
|
+
Action = 11
|
|
11
|
+
}
|
|
12
|
+
export declare enum RequestType {
|
|
13
|
+
SetColor = 192,
|
|
14
|
+
GetColor = 193,
|
|
15
|
+
Fade = 194,
|
|
16
|
+
Flash = 195,
|
|
17
|
+
ReadTag = 210,
|
|
18
|
+
WriteTag = 211
|
|
19
|
+
}
|
|
20
|
+
export declare enum ActionType {
|
|
21
|
+
Add = 0,
|
|
22
|
+
Remove = 1
|
|
23
|
+
}
|
|
24
|
+
export declare enum ToyPadPanel {
|
|
25
|
+
All = 0,
|
|
26
|
+
Center = 1,
|
|
27
|
+
Left = 2,
|
|
28
|
+
Right = 3
|
|
29
|
+
}
|
|
30
|
+
export declare const DEFAULT_REQUEST_TIMEOUT_MS = 5000;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export const TOY_PAD_VENDOR_ID = 0x0e6f;
|
|
2
|
+
export const TOY_PAD_PRODUCT_ID = 0x0241;
|
|
3
|
+
export const PACKET_LENGTH = 32;
|
|
4
|
+
export const WAKE_SEQUENCE = Buffer.from([
|
|
5
|
+
0x55, 0x0f, 0xb0, 0x01,
|
|
6
|
+
0x28, 0x63, 0x29, 0x20,
|
|
7
|
+
0x4c, 0x45, 0x47, 0x4f,
|
|
8
|
+
0x20, 0x32, 0x30, 0x31,
|
|
9
|
+
0x34, 0xf7, 0x00, 0x00,
|
|
10
|
+
0x00, 0x00, 0x00, 0x00,
|
|
11
|
+
0x00, 0x00, 0x00, 0x00,
|
|
12
|
+
0x00, 0x00, 0x00, 0x00
|
|
13
|
+
]);
|
|
14
|
+
export var MessageType;
|
|
15
|
+
(function (MessageType) {
|
|
16
|
+
MessageType[MessageType["Response"] = 85] = "Response";
|
|
17
|
+
MessageType[MessageType["Event"] = 86] = "Event";
|
|
18
|
+
})(MessageType || (MessageType = {}));
|
|
19
|
+
export var CommandType;
|
|
20
|
+
(function (CommandType) {
|
|
21
|
+
CommandType[CommandType["Action"] = 11] = "Action";
|
|
22
|
+
})(CommandType || (CommandType = {}));
|
|
23
|
+
export var RequestType;
|
|
24
|
+
(function (RequestType) {
|
|
25
|
+
RequestType[RequestType["SetColor"] = 192] = "SetColor";
|
|
26
|
+
RequestType[RequestType["GetColor"] = 193] = "GetColor";
|
|
27
|
+
RequestType[RequestType["Fade"] = 194] = "Fade";
|
|
28
|
+
RequestType[RequestType["Flash"] = 195] = "Flash";
|
|
29
|
+
RequestType[RequestType["ReadTag"] = 210] = "ReadTag";
|
|
30
|
+
RequestType[RequestType["WriteTag"] = 211] = "WriteTag";
|
|
31
|
+
})(RequestType || (RequestType = {}));
|
|
32
|
+
export var ActionType;
|
|
33
|
+
(function (ActionType) {
|
|
34
|
+
ActionType[ActionType["Add"] = 0] = "Add";
|
|
35
|
+
ActionType[ActionType["Remove"] = 1] = "Remove";
|
|
36
|
+
})(ActionType || (ActionType = {}));
|
|
37
|
+
export var ToyPadPanel;
|
|
38
|
+
(function (ToyPadPanel) {
|
|
39
|
+
ToyPadPanel[ToyPadPanel["All"] = 0] = "All";
|
|
40
|
+
ToyPadPanel[ToyPadPanel["Center"] = 1] = "Center";
|
|
41
|
+
ToyPadPanel[ToyPadPanel["Left"] = 2] = "Left";
|
|
42
|
+
ToyPadPanel[ToyPadPanel["Right"] = 3] = "Right";
|
|
43
|
+
})(ToyPadPanel || (ToyPadPanel = {}));
|
|
44
|
+
export const DEFAULT_REQUEST_TIMEOUT_MS = 5000;
|