first commit

This commit is contained in:
Tim Korjakow 2021-11-15 15:19:03 +01:00
commit f741bdf838
68 changed files with 193486 additions and 0 deletions

7
.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch
/build

7
.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,7 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"platformio.platformio-ide"
]
}

0
README.md Normal file
View File

39
include/README Normal file
View File

@ -0,0 +1,39 @@
This directory is intended for project header files.
A header file is a file containing C declarations and macro definitions
to be shared between several project source files. You request the use of a
header file in your project source file (C, C++, etc) located in `src` folder
by including it, with the C preprocessing directive `#include'.
```src/main.c
#include "header.h"
int main (void)
{
...
}
```
Including a header file produces the same results as copying the header file
into each source file that needs it. Such copying would be time-consuming
and error-prone. With a header file, the related declarations appear
in only one place. If they need to be changed, they can be changed in one
place, and programs that include the header file will automatically use the
new version when next recompiled. The header file eliminates the labor of
finding and changing all the copies as well as the risk that a failure to
find one copy will result in inconsistencies within a program.
In C, the usual convention is to give header files names that end with `.h'.
It is most portable to use only letters, digits, dashes, and underscores in
header file names, and at most one dot.
Read more about using header files in official GCC documentation:
* Include Syntax
* Include Operation
* Once-Only Headers
* Computed Includes
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html

21
kicad/.gitignore vendored Normal file
View File

@ -0,0 +1,21 @@
# For PCBs designed using KiCad: http://www.kicad-pcb.org/
# Temporary files
*.000
*.bak
*.bck
*.kicad_pcb-bak
*~
_autosave-*
*.tmp
*.fcstd1
# Netlist files (exported from Eeschema)
*.net
# Autorouter files (exported from Pcbnew)
.dsn
# Exported BOM files
*.xml
*.csv

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

201
kicad/LICENSE Normal file
View File

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

16
kicad/README.md Normal file
View File

@ -0,0 +1,16 @@
wemos-d1-mini-kicad
==============
KiCAD
* library,
* footprint and
* 3D shape
of the WeMos D1 mini board.
The library provides several footprints and shape alignments:
![butler 3d view](https://github.com/rubienr/wemos-d1-mini-kicad/blob/master/meta/illustration1.png)
![butler 3d view](https://github.com/rubienr/wemos-d1-mini-kicad/blob/master/meta/illustration2.png)
![butler 3d view](https://github.com/rubienr/wemos-d1-mini-kicad/blob/master/meta/illustration3.png)
![butler 3d view](https://github.com/rubienr/wemos-d1-mini-kicad/blob/master/meta/illustration4.png)

83056
kicad/fp-info-cache Normal file

File diff suppressed because it is too large Load Diff

3
kicad/fp-lib-table Normal file
View File

@ -0,0 +1,3 @@
(fp_lib_table
(lib (name D1_Mini)(type KiCad)(uri /home/fe/korjakow/Projects/radiator_test_bench/kicad/modules/wemos-d1-mini.pretty)(options "")(descr ""))
)

291
kicad/kicad-cache.lib Normal file
View File

@ -0,0 +1,291 @@
EESchema-LIBRARY Version 2.4
#encoding utf-8
#
# 4xxx_IEEE_4066
#
DEF 4xxx_IEEE_4066 U 0 30 Y Y 4 F N
F0 "U" 100 200 50 H V C CNN
F1 "4xxx_IEEE_4066" 200 -200 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
ALIAS 4066
DRAW
S -200 200 200 -200 0 1 0 N
X Vdd 14 0 200 0 D 50 50 0 1 W N
X Vss 7 0 -200 0 U 50 50 0 1 W N
X I/O 1 -500 100 300 R 50 50 1 1 P
X ON 13 -500 -100 300 R 50 50 1 1 I
X O/I 2 500 0 300 L 50 50 1 1 P
X O/I 3 500 0 300 L 50 50 2 1 P
X I/O 4 -500 100 300 R 50 50 2 1 P
X ON 5 -500 -100 300 R 50 50 2 1 I
X ON 6 -500 -100 300 R 50 50 3 1 I
X I/O 8 -500 100 300 R 50 50 3 1 P
X O/I 9 500 0 300 L 50 50 3 1 P
X O/I 10 500 0 300 L 50 50 4 1 P
X I/O 11 -500 100 300 R 50 50 4 1 P
X ON 12 -500 -100 300 R 50 50 4 1 I
ENDDRAW
ENDDEF
#
# Connector_Generic_Conn_01x02
#
DEF Connector_Generic_Conn_01x02 J 0 40 Y N 1 F N
F0 "J" 0 100 50 H V C CNN
F1 "Connector_Generic_Conn_01x02" 0 -200 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Connector*:*_1x??_*
$ENDFPLIST
DRAW
S -50 -95 0 -105 1 1 6 N
S -50 5 0 -5 1 1 6 N
S -50 50 50 -150 1 1 10 f
X Pin_1 1 -200 0 150 R 50 50 1 1 P
X Pin_2 2 -200 -100 150 R 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Connector_Generic_Conn_01x04
#
DEF Connector_Generic_Conn_01x04 J 0 40 Y N 1 F N
F0 "J" 0 200 50 H V C CNN
F1 "Connector_Generic_Conn_01x04" 0 -300 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
Connector*:*_1x??_*
$ENDFPLIST
DRAW
S -50 -195 0 -205 1 1 6 N
S -50 -95 0 -105 1 1 6 N
S -50 5 0 -5 1 1 6 N
S -50 105 0 95 1 1 6 N
S -50 150 50 -250 1 1 10 f
X Pin_1 1 -200 100 150 R 50 50 1 1 P
X Pin_2 2 -200 0 150 R 50 50 1 1 P
X Pin_3 3 -200 -100 150 R 50 50 1 1 P
X Pin_4 4 -200 -200 150 R 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_C
#
DEF Device_C C 0 10 N Y 1 F N
F0 "C" 25 100 50 H V L CNN
F1 "Device_C" 25 -100 50 H V L CNN
F2 "" 38 -150 50 H I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
C_*
$ENDFPLIST
DRAW
P 2 0 1 20 -80 -30 80 -30 N
P 2 0 1 20 -80 30 80 30 N
X ~ 1 0 150 110 D 50 50 1 1 P
X ~ 2 0 -150 110 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_R
#
DEF Device_R R 0 0 N Y 1 F N
F0 "R" 80 0 50 V V C CNN
F1 "Device_R" 0 0 50 V V C CNN
F2 "" -70 0 50 V I C CNN
F3 "" 0 0 50 H I C CNN
$FPLIST
R_*
$ENDFPLIST
DRAW
S -40 -100 40 100 0 1 10 N
X ~ 1 0 150 50 D 50 50 1 1 P
X ~ 2 0 -150 50 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# Device_Thermistor_NTC
#
DEF Device_Thermistor_NTC TH 0 0 N Y 1 F N
F0 "TH" -175 0 50 V V C CNN
F1 "Device_Thermistor_NTC" 125 0 50 V V C CNN
F2 "" 0 50 50 H I C CNN
F3 "" 0 50 50 H I C CNN
$FPLIST
*NTC*
*Thermistor*
PIN?ARRAY*
bornier*
*Terminal?Block*
R_*
$ENDFPLIST
DRAW
A -126 88 7 -265 818 0 1 0 N -120 85 -125 95
A -110 85 10 1800 -900 0 1 0 N -120 85 -110 75
A -110 85 10 -900 0 0 1 0 N -110 75 -100 85
A -110 110 10 0 900 0 1 0 N -100 110 -110 120
A -110 110 10 900 1800 0 1 0 N -110 120 -120 110
A -110 110 10 1800 -900 0 1 0 N -120 110 -110 100
A -104 119 20 -1075 -253 0 1 0 N -110 100 -85 110
S -40 100 40 -100 0 1 10 N
P 2 0 1 0 -100 85 -100 110 N
P 4 0 1 0 -70 100 -70 60 70 -60 70 -100 N
P 6 0 1 0 -100 -145 -100 -55 -110 -85 -90 -85 -100 -55 -100 -65 F
P 6 0 1 0 -70 -55 -70 -145 -80 -115 -60 -115 -70 -145 -70 -135 F
X ~ 1 0 150 50 D 50 50 1 1 P
X ~ 2 0 -150 50 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# MCU_Module_WeMos_D1_mini
#
DEF MCU_Module_WeMos_D1_mini U 0 20 Y Y 1 F N
F0 "U" 150 750 50 H V L CNN
F1 "MCU_Module_WeMos_D1_mini" 50 -750 50 H V L CNN
F2 "Module:WEMOS_D1_mini_light" 0 -1150 50 H I C CNN
F3 "" -1850 -1150 50 H I C CNN
$FPLIST
WEMOS*D1*mini*
$ENDFPLIST
DRAW
S -300 700 300 -700 1 1 10 f
X ~RST 1 -400 400 100 R 50 50 1 1 I
X GND 10 0 -800 100 U 50 50 1 1 W
X D4 11 400 0 100 L 50 50 1 1 B
X D3 12 400 100 100 L 50 50 1 1 B
X SDA/D2 13 400 200 100 L 50 50 1 1 B
X SCL/D1 14 400 300 100 L 50 50 1 1 B
X RX 15 -400 100 100 R 50 50 1 1 I
X TX 16 -400 0 100 R 50 50 1 1 O
X A0 2 400 500 100 L 50 50 1 1 I
X D0 3 400 400 100 L 50 50 1 1 B
X SCK/D5 4 400 -100 100 L 50 50 1 1 B
X MISO/D6 5 400 -200 100 L 50 50 1 1 B
X MOSI/D7 6 400 -300 100 L 50 50 1 1 B
X CS/D8 7 400 -400 100 L 50 50 1 1 B
X 3V3 8 100 800 100 D 50 50 1 1 w
X 5V 9 -100 800 100 D 50 50 1 1 W
ENDDRAW
ENDDEF
#
# Regulator_Linear_L7805
#
DEF Regulator_Linear_L7805 U 0 10 Y Y 1 F N
F0 "U" -150 125 50 H V C CNN
F1 "Regulator_Linear_L7805" 0 125 50 H V L CNN
F2 "" 25 -150 50 H I L CIN
F3 "" 0 -50 50 H I C CNN
ALIAS L7806 L7808 L7885 L7809 L7812 L7815 L7818 L7824
$FPLIST
TO?252*
TO?263*
TO?220*
$ENDFPLIST
DRAW
S -200 75 200 -200 0 1 10 f
X IN 1 -300 0 100 R 50 50 1 1 W
X GND 2 0 -300 100 U 50 50 1 1 W
X OUT 3 300 0 100 L 50 50 1 1 w
ENDDRAW
ENDDEF
#
# Sensor_Pressure_40PC015G
#
DEF Sensor_Pressure_40PC015G U 0 20 Y Y 1 F N
F0 "U" -400 250 50 H V L CNN
F1 "Sensor_Pressure_40PC015G" 250 250 50 H V C CNN
F2 "" 100 0 50 H I C CNN
F3 "" 100 0 50 H I C CNN
ALIAS 40PC100G 40PC150G 40PC250G
DRAW
C -230 60 103 0 1 20 N
S 300 200 -400 -200 0 1 10 f
P 2 0 1 10 -280 10 -180 110 N
P 2 0 1 20 -230 -50 -230 -150 N
P 4 0 1 10 -180 110 -190 70 -220 100 -180 110 F
X Vcc 1 0 300 100 D 50 50 1 1 W
X GND 2 0 -300 100 U 50 50 1 1 W
X Vout 3 400 0 100 L 50 50 1 1 O
X NC 4 -300 -200 100 U 50 50 1 1 N N
X NC 5 -200 -200 100 U 50 50 1 1 N N
X NC 6 -100 -200 100 U 50 50 1 1 N N
ENDDRAW
ENDDEF
#
# Transistor_FET_IRLZ34N
#
DEF Transistor_FET_IRLZ34N Q 0 20 Y N 1 F N
F0 "Q" 250 75 50 H V L CNN
F1 "Transistor_FET_IRLZ34N" 250 0 50 H V L CNN
F2 "Package_TO_SOT_THT:TO-220-3_Vertical" 250 -75 50 H I L CIN
F3 "" 0 0 50 H I L CNN
ALIAS IRF3205 IRF540N IRF740 IRLB8721PBF IRLZ34N IRLZ44N VNP10N07 IPP060N06N
$FPLIST
TO?220*
$ENDFPLIST
DRAW
C 65 0 110 0 1 10 N
C 100 -70 10 0 1 0 F
C 100 70 10 0 1 0 F
P 2 0 1 0 10 0 -100 0 N
P 2 0 1 10 10 75 10 -75 N
P 2 0 1 10 30 -50 30 -90 N
P 2 0 1 10 30 20 30 -20 N
P 2 0 1 10 30 90 30 50 N
P 2 0 1 0 100 100 100 70 N
P 3 0 1 0 100 -100 100 0 30 0 N
P 4 0 1 0 30 -70 130 -70 130 70 30 70 N
P 4 0 1 0 40 0 80 15 80 -15 40 0 F
P 4 0 1 0 110 20 115 15 145 15 150 10 N
P 4 0 1 0 130 15 115 -10 145 -10 130 15 N
X G 1 -200 0 100 R 50 50 1 1 I
X D 2 100 200 100 D 50 50 1 1 P
X S 3 100 -200 100 U 50 50 1 1 P
ENDDRAW
ENDDEF
#
# power_+12V
#
DEF power_+12V #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -150 50 H I C CNN
F1 "power_+12V" 0 140 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
P 2 0 1 0 -30 50 0 100 N
P 2 0 1 0 0 0 0 100 N
P 2 0 1 0 0 100 30 50 N
X +12V 1 0 0 0 U 50 50 1 1 W N
ENDDRAW
ENDDEF
#
# power_GND
#
DEF power_GND #PWR 0 0 Y Y 1 F P
F0 "#PWR" 0 -250 50 H I C CNN
F1 "power_GND" 0 -150 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
P 6 0 1 0 0 0 0 -50 50 -50 0 -100 -50 -50 0 -50 N
X GND 1 0 0 0 D 50 50 1 1 W N
ENDDRAW
ENDDEF
#
# pspice_DIODE
#
DEF pspice_DIODE D 0 40 Y N 1 F N
F0 "D" 0 150 50 H V C CNN
F1 "pspice_DIODE" 0 -175 50 H V C CNN
F2 "" 0 0 50 H I C CNN
F3 "" 0 0 50 H I C CNN
DRAW
P 2 0 1 0 75 100 75 -100 N
P 3 0 1 0 -75 100 -75 -100 75 0 F
X K 1 -200 0 150 R 50 50 1 1 I
X A 2 200 0 150 L 50 50 1 1 I
ENDDRAW
ENDDEF
#
#End Library

106
kicad/kicad.kicad_pcb Normal file
View File

@ -0,0 +1,106 @@
(kicad_pcb (version 20170123) (host pcbnew "(2017-07-16 revision e797af331)-master")
(general
(thickness 1.6)
(drawings 4)
(tracks 0)
(zones 0)
(modules 0)
(nets 1)
)
(page A4)
(layers
(0 F.Cu signal)
(31 B.Cu signal)
(32 B.Adhes user)
(33 F.Adhes user)
(34 B.Paste user)
(35 F.Paste user)
(36 B.SilkS user)
(37 F.SilkS user)
(38 B.Mask user)
(39 F.Mask user)
(40 Dwgs.User user)
(41 Cmts.User user)
(42 Eco1.User user)
(43 Eco2.User user)
(44 Edge.Cuts user)
(45 Margin user)
(46 B.CrtYd user)
(47 F.CrtYd user)
(48 B.Fab user)
(49 F.Fab user)
)
(setup
(last_trace_width 0.25)
(trace_clearance 0.2)
(zone_clearance 0.508)
(zone_45_only no)
(trace_min 0.2)
(segment_width 0.2)
(edge_width 0.15)
(via_size 0.8)
(via_drill 0.4)
(via_min_size 0.4)
(via_min_drill 0.3)
(uvia_size 0.3)
(uvia_drill 0.1)
(uvias_allowed no)
(uvia_min_size 0.2)
(uvia_min_drill 0.1)
(pcb_text_width 0.3)
(pcb_text_size 1.5 1.5)
(mod_edge_width 0.15)
(mod_text_size 1 1)
(mod_text_width 0.15)
(pad_size 1.524 1.524)
(pad_drill 0.762)
(pad_to_mask_clearance 0.2)
(aux_axis_origin 0 0)
(grid_origin 55 145)
(visible_elements FFFFFF7F)
(pcbplotparams
(layerselection 0x00030_ffffffff)
(usegerberextensions false)
(excludeedgelayer true)
(linewidth 0.100000)
(plotframeref false)
(viasonmask false)
(mode 1)
(useauxorigin false)
(hpglpennumber 1)
(hpglpenspeed 20)
(hpglpendiameter 15)
(psnegative false)
(psa4output false)
(plotreference true)
(plotvalue true)
(plotinvisibletext false)
(padsonsilk false)
(subtractmaskfromsilk false)
(outputformat 1)
(mirror false)
(drillshape 0)
(scaleselection 1)
(outputdirectory ""))
)
(net 0 "")
(net_class Default "This is the default net class."
(clearance 0.2)
(trace_width 0.25)
(via_dia 0.8)
(via_drill 0.4)
(uvia_dia 0.3)
(uvia_drill 0.1)
)
(gr_line (start 55 145) (end 214.85 145) (angle 90) (layer Edge.Cuts) (width 0.15))
(gr_line (start 55 45.15) (end 55 145) (angle 90) (layer Edge.Cuts) (width 0.15))
(gr_line (start 214.84 45.15) (end 55 45.15) (angle 90) (layer Edge.Cuts) (width 0.15))
(gr_line (start 214.85 145) (end 214.85 45.15) (angle 90) (layer Edge.Cuts) (width 0.15))
)

30
kicad/kicad.pro Normal file
View File

@ -0,0 +1,30 @@
update=Sun 23 Jul 2017 01:54:40 PM PDT
version=1
last_client=kicad
[pcbnew]
version=1
LastNetListRead=
UseCmpFile=1
PadDrill=0.600000000000
PadDrillOvalY=0.600000000000
PadSizeH=1.500000000000
PadSizeV=1.500000000000
PcbTextSizeV=1.500000000000
PcbTextSizeH=1.500000000000
PcbTextThickness=0.300000000000
ModuleTextSizeV=1.000000000000
ModuleTextSizeH=1.000000000000
ModuleTextSizeThickness=0.150000000000
SolderMaskClearance=0.000000000000
SolderMaskMinWidth=0.000000000000
DrawSegmentWidth=0.200000000000
BoardOutlineThickness=0.100000000000
ModuleOutlineThickness=0.150000000000
[cvpcb]
version=1
NetIExt=net
[eeschema]
version=1
LibDir=
[general]
version=1

422
kicad/kicad.sch Normal file
View File

@ -0,0 +1,422 @@
EESchema Schematic File Version 4
EELAYER 30 0
EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title ""
Date ""
Rev ""
Comp ""
Comment1 ""
Comment2 ""
Comment3 ""
Comment4 ""
$EndDescr
$Comp
L Device:Thermistor_NTC TH2
U 1 1 61917553
P 8050 1200
F 0 "TH2" V 7760 1200 50 0000 C CNN
F 1 "Thermistor_NTC" V 7851 1200 50 0000 C CNN
F 2 "" H 8050 1250 50 0001 C CNN
F 3 "~" H 8050 1250 50 0001 C CNN
1 8050 1200
0 1 1 0
$EndComp
$Comp
L Sensor_Pressure:40PC015G U3
U 1 1 6191A270
P 8750 1200
F 0 "U3" V 8183 1200 50 0000 C CNN
F 1 "40PC015G" V 8274 1200 50 0000 C CNN
F 2 "" H 8850 1200 50 0001 C CNN
F 3 "http://www.honeywellscportal.com//index.php?ci_id=138832" H 8850 1200 50 0001 C CNN
1 8750 1200
0 1 1 0
$EndComp
$Comp
L Sensor_Pressure:40PC015G U4
U 1 1 6191AF10
P 9450 1200
F 0 "U4" V 8883 1200 50 0000 C CNN
F 1 "40PC015G" V 8974 1200 50 0000 C CNN
F 2 "" H 9550 1200 50 0001 C CNN
F 3 "http://www.honeywellscportal.com//index.php?ci_id=138832" H 9550 1200 50 0001 C CNN
1 9450 1200
0 1 1 0
$EndComp
Wire Wire Line
5900 2650 5900 2350
Wire Wire Line
9750 1200 9750 2350
Wire Wire Line
9150 1200 9150 4250
Connection ~ 9050 2350
Wire Wire Line
9050 2350 9750 2350
Connection ~ 8450 4250
Wire Wire Line
8450 4250 9150 4250
$Comp
L Device:R R2
U 1 1 6192ED09
P 7650 1200
F 0 "R2" V 7443 1200 50 0000 C CNN
F 1 "1k" V 7534 1200 50 0000 C CNN
F 2 "" V 7580 1200 50 0001 C CNN
F 3 "~" H 7650 1200 50 0001 C CNN
1 7650 1200
0 1 1 0
$EndComp
Wire Wire Line
7800 1200 7850 1200
Wire Wire Line
7500 1200 7500 4250
Connection ~ 7500 4250
Wire Wire Line
7500 4250 8450 4250
Wire Wire Line
8200 1200 8200 2350
Connection ~ 8200 2350
Wire Wire Line
8200 2350 9050 2350
Wire Wire Line
5550 2350 5600 2350
Connection ~ 5900 2350
Wire Wire Line
5250 2650 5250 4250
$Comp
L Connector_Generic:Conn_01x04 J2
U 1 1 6193F984
P 10400 3150
F 0 "J2" H 10480 3142 50 0000 L CNN
F 1 "BMP390" H 10480 3051 50 0000 L CNN
F 2 "" H 10400 3150 50 0001 C CNN
F 3 "~" H 10400 3150 50 0001 C CNN
1 10400 3150
1 0 0 -1
$EndComp
Wire Wire Line
10200 3050 10200 2350
Wire Wire Line
10200 2350 9750 2350
Connection ~ 9750 2350
Wire Wire Line
10200 3350 10200 4250
Wire Wire Line
10200 4250 9150 4250
Connection ~ 9150 4250
Wire Wire Line
6950 1200 7000 1200
$Comp
L Device:R R1
U 1 1 61932105
P 6800 1200
F 0 "R1" V 6593 1200 50 0000 C CNN
F 1 "1k" V 6684 1200 50 0000 C CNN
F 2 "" V 6730 1200 50 0001 C CNN
F 3 "~" H 6800 1200 50 0001 C CNN
1 6800 1200
0 1 1 0
$EndComp
$Comp
L Device:Thermistor_NTC TH1
U 1 1 619320FF
P 7200 1200
F 0 "TH1" V 6910 1200 50 0000 C CNN
F 1 "Thermistor_NTC" V 7001 1200 50 0000 C CNN
F 2 "" H 7200 1250 50 0001 C CNN
F 3 "~" H 7200 1250 50 0001 C CNN
1 7200 1200
0 1 1 0
$EndComp
Wire Wire Line
7350 1200 7350 2350
Connection ~ 7350 2350
Wire Wire Line
7350 2350 8200 2350
Connection ~ 6650 4250
Wire Wire Line
6650 4250 7500 4250
Wire Wire Line
5900 2350 7350 2350
$Comp
L Connector_Generic:Conn_01x02 J1
U 1 1 6194A4E6
P 4800 2750
F 0 "J1" H 4880 2742 50 0000 L CNN
F 1 "Fan Connector" H 4880 2651 50 0000 L CNN
F 2 "" H 4800 2750 50 0001 C CNN
F 3 "~" H 4800 2750 50 0001 C CNN
1 4800 2750
1 0 0 -1
$EndComp
$Comp
L Transistor_FET:IRLZ34N Q1
U 1 1 6194679D
P 4700 3050
F 0 "Q1" H 4905 3096 50 0000 L CNN
F 1 "IRLZ34N" H 4905 3005 50 0000 L CNN
F 2 "Package_TO_SOT_THT:TO-220-3_Vertical" H 4950 2975 50 0001 L CIN
F 3 "http://www.infineon.com/dgdl/irlz34npbf.pdf?fileId=5546d462533600a40153567206892720" H 4700 3050 50 0001 L CNN
1 4700 3050
-1 0 0 -1
$EndComp
$Comp
L power:GND #PWR0102
U 1 1 6193E56A
P 4150 3800
F 0 "#PWR0102" H 4150 3550 50 0001 C CNN
F 1 "GND" V 4155 3672 50 0000 R CNN
F 2 "" H 4150 3800 50 0001 C CNN
F 3 "" H 4150 3800 50 0001 C CNN
1 4150 3800
0 1 1 0
$EndComp
$Comp
L power:+12V #PWR0101
U 1 1 6193C6AC
P 4150 3600
F 0 "#PWR0101" H 4150 3450 50 0001 C CNN
F 1 "+12V" V 4165 3728 50 0000 L CNN
F 2 "" H 4150 3600 50 0001 C CNN
F 3 "" H 4150 3600 50 0001 C CNN
1 4150 3600
0 -1 -1 0
$EndComp
Wire Wire Line
4150 3800 4150 4250
Wire Wire Line
4150 2350 4150 3600
Connection ~ 5250 4250
Wire Wire Line
5000 4600 6550 4600
Wire Wire Line
6550 4600 6550 3050
$Comp
L Device:R R3
U 1 1 6196384E
P 5000 3500
F 0 "R3" H 5070 3546 50 0000 L CNN
F 1 "R" H 5070 3455 50 0000 L CNN
F 2 "" V 4930 3500 50 0001 C CNN
F 3 "~" H 5000 3500 50 0001 C CNN
1 5000 3500
1 0 0 -1
$EndComp
Wire Wire Line
5000 3650 5000 4600
$Comp
L Device:C C2
U 1 1 61965BDB
P 5600 2500
F 0 "C2" H 5715 2546 50 0000 L CNN
F 1 "10 uF" H 5715 2455 50 0000 L CNN
F 2 "" H 5638 2350 50 0001 C CNN
F 3 "~" H 5600 2500 50 0001 C CNN
1 5600 2500
1 0 0 -1
$EndComp
Connection ~ 5600 2350
Wire Wire Line
5600 2350 5900 2350
Wire Wire Line
5600 2650 5250 2650
Connection ~ 5250 2650
$Comp
L Regulator_Linear:L7805 U1
U 1 1 61922AD0
P 5250 2350
F 0 "U1" H 5250 2592 50 0000 C CNN
F 1 "L7805CV" H 5250 2501 50 0000 C CNN
F 2 "" H 5275 2200 50 0001 L CIN
F 3 "http://www.st.com/content/ccc/resource/technical/document/datasheet/41/4f/b3/b0/12/d4/47/88/CD00000444.pdf/files/CD00000444.pdf/jcr:content/translations/en.CD00000444.pdf" H 5250 2300 50 0001 C CNN
1 5250 2350
1 0 0 -1
$EndComp
Wire Wire Line
4850 2650 5250 2650
Wire Wire Line
4850 2350 4950 2350
Connection ~ 4850 2350
$Comp
L Device:C C1
U 1 1 619663DC
P 4850 2500
F 0 "C1" H 4965 2546 50 0000 L CNN
F 1 "10 uF" H 4965 2455 50 0000 L CNN
F 2 "" H 4888 2350 50 0001 C CNN
F 3 "~" H 4850 2500 50 0001 C CNN
1 4850 2500
1 0 0 -1
$EndComp
Wire Wire Line
4150 2350 4600 2350
$Comp
L pspice:DIODE D1
U 1 1 6196CF65
P 4600 2550
F 0 "D1" V 4554 2678 50 0000 L CNN
F 1 "DIODE" V 4645 2678 50 0000 L CNN
F 2 "" H 4600 2550 50 0001 C CNN
F 3 "~" H 4600 2550 50 0001 C CNN
1 4600 2550
0 1 1 0
$EndComp
Connection ~ 4600 2350
Wire Wire Line
4600 2350 4850 2350
Wire Wire Line
4150 4250 4600 4250
Wire Wire Line
4600 3250 4600 4250
Connection ~ 4600 4250
Wire Wire Line
4600 4250 5250 4250
Wire Wire Line
9050 1200 9050 2350
Wire Wire Line
8450 1200 8450 4250
$Comp
L 4xxx_IEEE:4066 U5
U 1 1 619811A6
P 7000 1700
F 0 "U5" V 7046 1447 50 0000 R CNN
F 1 "4066" V 6955 1447 50 0000 R CNN
F 2 "" H 7000 1700 50 0001 C CNN
F 3 "" H 7000 1700 50 0001 C CNN
1 7000 1700
0 -1 -1 0
$EndComp
Connection ~ 7000 1200
Wire Wire Line
7000 1200 7050 1200
$Comp
L 4xxx_IEEE:4066 U5
U 2 1 61982506
P 7850 1700
F 0 "U5" V 7896 1447 50 0000 R CNN
F 1 "4066" V 7805 1447 50 0000 R CNN
F 2 "" H 7850 1700 50 0001 C CNN
F 3 "" H 7850 1700 50 0001 C CNN
2 7850 1700
0 -1 -1 0
$EndComp
Connection ~ 7850 1200
Wire Wire Line
7850 1200 7900 1200
$Comp
L 4xxx_IEEE:4066 U5
U 3 1 619835E1
P 8750 2100
F 0 "U5" V 8796 1847 50 0000 R CNN
F 1 "4066" V 8705 1847 50 0000 R CNN
F 2 "" H 8750 2100 50 0001 C CNN
F 3 "" H 8750 2100 50 0001 C CNN
3 8750 2100
0 -1 -1 0
$EndComp
$Comp
L 4xxx_IEEE:4066 U5
U 4 1 619843D1
P 9450 2100
F 0 "U5" V 9496 1847 50 0000 R CNN
F 1 "4066" V 9405 1847 50 0000 R CNN
F 2 "" H 9450 2100 50 0001 C CNN
F 3 "" H 9450 2100 50 0001 C CNN
4 9450 2100
0 -1 -1 0
$EndComp
Wire Wire Line
9350 2950 9350 2600
Wire Wire Line
8650 2600 8650 2950
Connection ~ 8650 2950
Wire Wire Line
8650 2950 9350 2950
Wire Wire Line
7750 2200 7750 2950
Connection ~ 7750 2950
Wire Wire Line
7750 2950 8650 2950
Wire Wire Line
6900 2200 6900 2950
Wire Wire Line
6900 2950 7750 2950
Wire Wire Line
7100 3350 7100 2200
Wire Wire Line
7950 3450 7950 2200
Wire Wire Line
8850 3550 8850 2600
Wire Wire Line
9550 3650 9550 2600
Wire Wire Line
5000 3350 5000 3050
Wire Wire Line
5000 3050 4900 3050
$Comp
L Device:R R5
U 1 1 61991434
P 6750 2950
F 0 "R5" V 6543 2950 50 0000 C CNN
F 1 "1k" V 6634 2950 50 0000 C CNN
F 2 "" V 6680 2950 50 0001 C CNN
F 3 "~" H 6750 2950 50 0001 C CNN
1 6750 2950
0 1 1 0
$EndComp
Connection ~ 6900 2950
Wire Wire Line
6650 1200 6650 4250
Wire Wire Line
5250 4250 6000 4250
Wire Wire Line
6000 4250 6600 4250
Connection ~ 6000 4250
Wire Wire Line
6400 3650 9550 3650
Wire Wire Line
6400 3550 8850 3550
Wire Wire Line
6400 3450 7950 3450
Wire Wire Line
6400 3350 7100 3350
Wire Wire Line
6400 3150 10200 3150
Wire Wire Line
6550 3050 6400 3050
$Comp
L MCU_Module:WeMos_D1_mini U2
U 1 1 619143D2
P 6000 3450
F 0 "U2" H 6000 2561 50 0000 C CNN
F 1 "WeMos_D1_mini" H 6000 2470 50 0000 C CNN
F 2 "Module:WEMOS_D1_mini_light" H 6000 2300 50 0001 C CNN
F 3 "https://wiki.wemos.cc/products:d1:d1_mini#documentation" H 4150 2300 50 0001 C CNN
1 6000 3450
1 0 0 -1
$EndComp
Wire Wire Line
6400 3250 10200 3250
$Comp
L Device:R R4
U 1 1 6199266A
P 6600 4100
F 0 "R4" H 6670 4146 50 0000 L CNN
F 1 "2k" H 6670 4055 50 0000 L CNN
F 2 "" V 6530 4100 50 0001 C CNN
F 3 "~" H 6600 4100 50 0001 C CNN
1 6600 4100
1 0 0 -1
$EndComp
Connection ~ 6600 4250
Wire Wire Line
6600 4250 6650 4250
Wire Wire Line
6600 2950 6400 2950
Wire Wire Line
6600 3950 6600 2950
Connection ~ 6600 2950
$EndSCHEMATC

422
kicad/kicad.sch-bak Normal file
View File

@ -0,0 +1,422 @@
EESchema Schematic File Version 4
EELAYER 30 0
EELAYER END
$Descr A4 11693 8268
encoding utf-8
Sheet 1 1
Title ""
Date ""
Rev ""
Comp ""
Comment1 ""
Comment2 ""
Comment3 ""
Comment4 ""
$EndDescr
$Comp
L Device:Thermistor_NTC TH2
U 1 1 61917553
P 8050 1200
F 0 "TH2" V 7760 1200 50 0000 C CNN
F 1 "Thermistor_NTC" V 7851 1200 50 0000 C CNN
F 2 "" H 8050 1250 50 0001 C CNN
F 3 "~" H 8050 1250 50 0001 C CNN
1 8050 1200
0 1 1 0
$EndComp
$Comp
L Sensor_Pressure:40PC015G U3
U 1 1 6191A270
P 8750 1200
F 0 "U3" V 8183 1200 50 0000 C CNN
F 1 "40PC015G" V 8274 1200 50 0000 C CNN
F 2 "" H 8850 1200 50 0001 C CNN
F 3 "http://www.honeywellscportal.com//index.php?ci_id=138832" H 8850 1200 50 0001 C CNN
1 8750 1200
0 1 1 0
$EndComp
$Comp
L Sensor_Pressure:40PC015G U4
U 1 1 6191AF10
P 9450 1200
F 0 "U4" V 8883 1200 50 0000 C CNN
F 1 "40PC015G" V 8974 1200 50 0000 C CNN
F 2 "" H 9550 1200 50 0001 C CNN
F 3 "http://www.honeywellscportal.com//index.php?ci_id=138832" H 9550 1200 50 0001 C CNN
1 9450 1200
0 1 1 0
$EndComp
Wire Wire Line
5900 2650 5900 2350
Wire Wire Line
9750 1200 9750 2350
Wire Wire Line
9150 1200 9150 4250
Connection ~ 9050 2350
Wire Wire Line
9050 2350 9750 2350
Connection ~ 8450 4250
Wire Wire Line
8450 4250 9150 4250
$Comp
L Device:R R2
U 1 1 6192ED09
P 7650 1200
F 0 "R2" V 7443 1200 50 0000 C CNN
F 1 "1k" V 7534 1200 50 0000 C CNN
F 2 "" V 7580 1200 50 0001 C CNN
F 3 "~" H 7650 1200 50 0001 C CNN
1 7650 1200
0 1 1 0
$EndComp
Wire Wire Line
7800 1200 7850 1200
Wire Wire Line
7500 1200 7500 4250
Connection ~ 7500 4250
Wire Wire Line
7500 4250 8450 4250
Wire Wire Line
8200 1200 8200 2350
Connection ~ 8200 2350
Wire Wire Line
8200 2350 9050 2350
Wire Wire Line
5550 2350 5600 2350
Connection ~ 5900 2350
Wire Wire Line
5250 2650 5250 4250
$Comp
L Connector_Generic:Conn_01x04 J2
U 1 1 6193F984
P 10400 3150
F 0 "J2" H 10480 3142 50 0000 L CNN
F 1 "BMP390" H 10480 3051 50 0000 L CNN
F 2 "" H 10400 3150 50 0001 C CNN
F 3 "~" H 10400 3150 50 0001 C CNN
1 10400 3150
1 0 0 -1
$EndComp
Wire Wire Line
10200 3050 10200 2350
Wire Wire Line
10200 2350 9750 2350
Connection ~ 9750 2350
Wire Wire Line
10200 3350 10200 4250
Wire Wire Line
10200 4250 9150 4250
Connection ~ 9150 4250
Wire Wire Line
6950 1200 7000 1200
$Comp
L Device:R R1
U 1 1 61932105
P 6800 1200
F 0 "R1" V 6593 1200 50 0000 C CNN
F 1 "1k" V 6684 1200 50 0000 C CNN
F 2 "" V 6730 1200 50 0001 C CNN
F 3 "~" H 6800 1200 50 0001 C CNN
1 6800 1200
0 1 1 0
$EndComp
$Comp
L Device:Thermistor_NTC TH1
U 1 1 619320FF
P 7200 1200
F 0 "TH1" V 6910 1200 50 0000 C CNN
F 1 "Thermistor_NTC" V 7001 1200 50 0000 C CNN
F 2 "" H 7200 1250 50 0001 C CNN
F 3 "~" H 7200 1250 50 0001 C CNN
1 7200 1200
0 1 1 0
$EndComp
Wire Wire Line
7350 1200 7350 2350
Connection ~ 7350 2350
Wire Wire Line
7350 2350 8200 2350
Connection ~ 6650 4250
Wire Wire Line
6650 4250 7500 4250
Wire Wire Line
5900 2350 7350 2350
$Comp
L Connector_Generic:Conn_01x02 J1
U 1 1 6194A4E6
P 4800 2750
F 0 "J1" H 4880 2742 50 0000 L CNN
F 1 "Fan Connector" H 4880 2651 50 0000 L CNN
F 2 "" H 4800 2750 50 0001 C CNN
F 3 "~" H 4800 2750 50 0001 C CNN
1 4800 2750
1 0 0 -1
$EndComp
$Comp
L Transistor_FET:IRLZ34N Q1
U 1 1 6194679D
P 4700 3050
F 0 "Q1" H 4905 3096 50 0000 L CNN
F 1 "IRLZ34N" H 4905 3005 50 0000 L CNN
F 2 "Package_TO_SOT_THT:TO-220-3_Vertical" H 4950 2975 50 0001 L CIN
F 3 "http://www.infineon.com/dgdl/irlz34npbf.pdf?fileId=5546d462533600a40153567206892720" H 4700 3050 50 0001 L CNN
1 4700 3050
-1 0 0 -1
$EndComp
$Comp
L power:GND #PWR0102
U 1 1 6193E56A
P 4150 3800
F 0 "#PWR0102" H 4150 3550 50 0001 C CNN
F 1 "GND" V 4155 3672 50 0000 R CNN
F 2 "" H 4150 3800 50 0001 C CNN
F 3 "" H 4150 3800 50 0001 C CNN
1 4150 3800
0 1 1 0
$EndComp
$Comp
L power:+12V #PWR0101
U 1 1 6193C6AC
P 4150 3600
F 0 "#PWR0101" H 4150 3450 50 0001 C CNN
F 1 "+12V" V 4165 3728 50 0000 L CNN
F 2 "" H 4150 3600 50 0001 C CNN
F 3 "" H 4150 3600 50 0001 C CNN
1 4150 3600
0 -1 -1 0
$EndComp
Wire Wire Line
4150 3800 4150 4250
Wire Wire Line
4150 2350 4150 3600
Connection ~ 5250 4250
Wire Wire Line
5000 4600 6550 4600
Wire Wire Line
6550 4600 6550 3050
$Comp
L Device:R R3
U 1 1 6196384E
P 5000 3500
F 0 "R3" H 5070 3546 50 0000 L CNN
F 1 "R" H 5070 3455 50 0000 L CNN
F 2 "" V 4930 3500 50 0001 C CNN
F 3 "~" H 5000 3500 50 0001 C CNN
1 5000 3500
1 0 0 -1
$EndComp
Wire Wire Line
5000 3650 5000 4600
$Comp
L Device:C C2
U 1 1 61965BDB
P 5600 2500
F 0 "C2" H 5715 2546 50 0000 L CNN
F 1 "10 uF" H 5715 2455 50 0000 L CNN
F 2 "" H 5638 2350 50 0001 C CNN
F 3 "~" H 5600 2500 50 0001 C CNN
1 5600 2500
1 0 0 -1
$EndComp
Connection ~ 5600 2350
Wire Wire Line
5600 2350 5900 2350
Wire Wire Line
5600 2650 5250 2650
Connection ~ 5250 2650
$Comp
L Regulator_Linear:L7805 U1
U 1 1 61922AD0
P 5250 2350
F 0 "U1" H 5250 2592 50 0000 C CNN
F 1 "L7805CV" H 5250 2501 50 0000 C CNN
F 2 "" H 5275 2200 50 0001 L CIN
F 3 "http://www.st.com/content/ccc/resource/technical/document/datasheet/41/4f/b3/b0/12/d4/47/88/CD00000444.pdf/files/CD00000444.pdf/jcr:content/translations/en.CD00000444.pdf" H 5250 2300 50 0001 C CNN
1 5250 2350
1 0 0 -1
$EndComp
Wire Wire Line
4850 2650 5250 2650
Wire Wire Line
4850 2350 4950 2350
Connection ~ 4850 2350
$Comp
L Device:C C1
U 1 1 619663DC
P 4850 2500
F 0 "C1" H 4965 2546 50 0000 L CNN
F 1 "10 uF" H 4965 2455 50 0000 L CNN
F 2 "" H 4888 2350 50 0001 C CNN
F 3 "~" H 4850 2500 50 0001 C CNN
1 4850 2500
1 0 0 -1
$EndComp
Wire Wire Line
4150 2350 4600 2350
$Comp
L pspice:DIODE D1
U 1 1 6196CF65
P 4600 2550
F 0 "D1" V 4554 2678 50 0000 L CNN
F 1 "DIODE" V 4645 2678 50 0000 L CNN
F 2 "" H 4600 2550 50 0001 C CNN
F 3 "~" H 4600 2550 50 0001 C CNN
1 4600 2550
0 1 1 0
$EndComp
Connection ~ 4600 2350
Wire Wire Line
4600 2350 4850 2350
Wire Wire Line
4150 4250 4600 4250
Wire Wire Line
4600 3250 4600 4250
Connection ~ 4600 4250
Wire Wire Line
4600 4250 5250 4250
Wire Wire Line
9050 1200 9050 2350
Wire Wire Line
8450 1200 8450 4250
$Comp
L 4xxx_IEEE:4066 U5
U 1 1 619811A6
P 7000 1700
F 0 "U5" V 7046 1447 50 0000 R CNN
F 1 "4066" V 6955 1447 50 0000 R CNN
F 2 "" H 7000 1700 50 0001 C CNN
F 3 "" H 7000 1700 50 0001 C CNN
1 7000 1700
0 -1 -1 0
$EndComp
Connection ~ 7000 1200
Wire Wire Line
7000 1200 7050 1200
$Comp
L 4xxx_IEEE:4066 U5
U 2 1 61982506
P 7850 1700
F 0 "U5" V 7896 1447 50 0000 R CNN
F 1 "4066" V 7805 1447 50 0000 R CNN
F 2 "" H 7850 1700 50 0001 C CNN
F 3 "" H 7850 1700 50 0001 C CNN
2 7850 1700
0 -1 -1 0
$EndComp
Connection ~ 7850 1200
Wire Wire Line
7850 1200 7900 1200
$Comp
L 4xxx_IEEE:4066 U5
U 3 1 619835E1
P 8750 2100
F 0 "U5" V 8796 1847 50 0000 R CNN
F 1 "4066" V 8705 1847 50 0000 R CNN
F 2 "" H 8750 2100 50 0001 C CNN
F 3 "" H 8750 2100 50 0001 C CNN
3 8750 2100
0 -1 -1 0
$EndComp
$Comp
L 4xxx_IEEE:4066 U5
U 4 1 619843D1
P 9450 2100
F 0 "U5" V 9496 1847 50 0000 R CNN
F 1 "4066" V 9405 1847 50 0000 R CNN
F 2 "" H 9450 2100 50 0001 C CNN
F 3 "" H 9450 2100 50 0001 C CNN
4 9450 2100
0 -1 -1 0
$EndComp
Wire Wire Line
9350 2950 9350 2600
Wire Wire Line
8650 2600 8650 2950
Connection ~ 8650 2950
Wire Wire Line
8650 2950 9350 2950
Wire Wire Line
7750 2200 7750 2950
Connection ~ 7750 2950
Wire Wire Line
7750 2950 8650 2950
Wire Wire Line
6900 2200 6900 2950
Wire Wire Line
6900 2950 7750 2950
Wire Wire Line
7100 3350 7100 2200
Wire Wire Line
7950 3450 7950 2200
Wire Wire Line
8850 3550 8850 2600
Wire Wire Line
9550 3650 9550 2600
Wire Wire Line
5000 3350 5000 3050
Wire Wire Line
5000 3050 4900 3050
$Comp
L Device:R R5
U 1 1 61991434
P 6750 2950
F 0 "R5" V 6543 2950 50 0000 C CNN
F 1 "1k" V 6634 2950 50 0000 C CNN
F 2 "" V 6680 2950 50 0001 C CNN
F 3 "~" H 6750 2950 50 0001 C CNN
1 6750 2950
0 1 1 0
$EndComp
Connection ~ 6900 2950
Wire Wire Line
6650 1200 6650 4250
Wire Wire Line
5250 4250 6000 4250
Wire Wire Line
6000 4250 6600 4250
Connection ~ 6000 4250
Wire Wire Line
6400 3650 9550 3650
Wire Wire Line
6400 3550 8850 3550
Wire Wire Line
6400 3450 7950 3450
Wire Wire Line
6400 3350 7100 3350
Wire Wire Line
6400 3150 10200 3150
Wire Wire Line
6550 3050 6400 3050
$Comp
L MCU_Module:WeMos_D1_mini U2
U 1 1 619143D2
P 6000 3450
F 0 "U2" H 6000 2561 50 0000 C CNN
F 1 "WeMos_D1_mini" H 6000 2470 50 0000 C CNN
F 2 "Module:WEMOS_D1_mini_light" H 6000 2300 50 0001 C CNN
F 3 "https://wiki.wemos.cc/products:d1:d1_mini#documentation" H 4150 2300 50 0001 C CNN
1 6000 3450
1 0 0 -1
$EndComp
Wire Wire Line
6400 3250 10200 3250
$Comp
L Device:R R4
U 1 1 6199266A
P 6600 4100
F 0 "R4" H 6670 4146 50 0000 L CNN
F 1 "2k" H 6670 4055 50 0000 L CNN
F 2 "" V 6530 4100 50 0001 C CNN
F 3 "~" H 6600 4100 50 0001 C CNN
1 6600 4100
1 0 0 -1
$EndComp
Connection ~ 6600 4250
Wire Wire Line
6600 4250 6650 4250
Wire Wire Line
6600 2950 6400 2950
Wire Wire Line
6600 3950 6600 2950
Connection ~ 6600 2950
$EndSCHEMATC

View File

@ -0,0 +1,29 @@
6360511949996
wemos-d1-mini
wemos-d1-mini-connectors-only
0
16
16
wemos-d1-mini
wemos-d1-mini-embedded
0
16
16
wemos-d1-mini
wemos-d1-mini-with-pin-header
0
16
16
wemos-d1-mini
wemos-d1-mini-with-pin-header-and-connector
0
16
16

View File

@ -0,0 +1,3 @@
(fp_lib_table
(lib (name wemos-d1-mini)(type KiCad)(uri /mnt/old-system/data/git/wemos-d1-mini-kicad/modules/wemos-d1-mini.pretty)(options "")(descr ""))
)

View File

@ -0,0 +1,3 @@
(sym_lib_table
(lib (name wemos_mini)(type Legacy)(uri ${KIPRJMOD}/wemos_mini.lib)(options "")(descr ""))
)

View File

@ -0,0 +1,9 @@
EESchema-DOCLIB Version 2.0
#
$CMP WeMos_D1_mini
D WeMos D1 mini
K esp8266, wemos
F http://www.wemos.cc/Products/d1_mini.html
$ENDCMP
#
#End Doc Library

View File

@ -0,0 +1,32 @@
EESchema-LIBRARY Version 2.4
#encoding utf-8
#
# WeMos_D1_mini
#
DEF WeMos_D1_mini U 0 40 Y Y 1 F N
F0 "U" 0 500 60 H V C CNN
F1 "WeMos_D1_mini" 0 -500 60 H V C CNN
F2 "" 550 -700 60 H V C CNN
F3 "" 550 -700 60 H V C CNN
DRAW
S -300 450 300 -550 0 1 0 N
X Rst 1 -500 350 200 R 50 50 1 1 B
X GND 10 500 -250 200 L 50 50 1 1 W
X D4 11 500 -150 200 L 50 50 1 1 B
X D3 12 500 -50 200 L 50 50 1 1 B
X D2 13 500 50 200 L 50 50 1 1 B
X D1 14 500 150 200 L 50 50 1 1 B
X Rx 15 500 250 200 L 50 50 1 1 B
X Tx 16 500 350 200 L 50 50 1 1 B
X A0 2 -500 250 200 R 50 50 1 1 B
X D0 3 -500 150 200 R 50 50 1 1 B
X D5 4 -500 50 200 R 50 50 1 1 B
X D6 5 -500 -50 200 R 50 50 1 1 B
X D7 6 -500 -150 200 R 50 50 1 1 B
X D8 7 -500 -250 200 R 50 50 1 1 B
X 3.3V 8 -500 -350 200 R 50 50 1 1 w
X 5V 9 500 -350 200 L 50 50 1 1 W
ENDDRAW
ENDDEF
#
#End Library

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

View File

@ -0,0 +1,67 @@
(module wemos-d1-mini-connectors-only (layer F.Cu) (tedit 5EC77245)
(fp_text reference REF** (at -19.3 0 90) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value Wemos-D1-mini (at 0 0) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -18.3 13.33) (end 14.78 13.33) (layer F.SilkS) (width 0.15))
(fp_line (start 16.78 11.33) (end 16.78 -11.33) (layer F.SilkS) (width 0.15))
(fp_line (start 14.78 -13.33) (end -11.3 -13.33) (layer F.SilkS) (width 0.15))
(fp_line (start -18.3 -11.18) (end -18.3 -3.32) (layer F.SilkS) (width 0.15))
(fp_line (start -18.3 -3.32) (end -17.3 -3.32) (layer F.SilkS) (width 0.15))
(fp_line (start -17.3 -3.32) (end -17.3 4.9) (layer F.SilkS) (width 0.15))
(fp_line (start -17.3 4.9) (end -18.3 4.9) (layer F.SilkS) (width 0.15))
(fp_line (start -18.3 4.9) (end -18.3 13.329999) (layer F.SilkS) (width 0.15))
(fp_line (start -11.48 -13.5) (end 14.85 -13.5) (layer F.CrtYd) (width 0.05))
(fp_line (start 16.94 -11.5) (end 16.94 11.5) (layer F.CrtYd) (width 0.05))
(fp_line (start 14.94 13.5) (end -18.46 13.5) (layer F.CrtYd) (width 0.05))
(fp_line (start -18.46 13.5) (end -18.46 -11.33) (layer F.CrtYd) (width 0.05))
(fp_arc (start 14.78 -11.33) (end 14.78 -13.33) (angle 90) (layer F.SilkS) (width 0.15))
(fp_arc (start 14.78 11.33) (end 16.78 11.33) (angle 90) (layer F.SilkS) (width 0.15))
(fp_arc (start 14.94 11.5) (end 16.94 11.5) (angle 90) (layer F.CrtYd) (width 0.05))
(fp_arc (start 14.94 -11.5) (end 14.85 -13.5) (angle 92.57657183) (layer F.CrtYd) (width 0.05))
(fp_line (start -18.3 -11.18) (end -12.3 -11.18) (layer F.SilkS) (width 0.15))
(fp_arc (start -12.3 -12.18) (end -11.3 -12.18) (angle 90) (layer F.SilkS) (width 0.15))
(fp_line (start -11.3 -12.17) (end -11.3 -13.33) (layer F.SilkS) (width 0.15))
(fp_line (start -11.3 -13.33) (end -11.3 -13.33) (layer F.SilkS) (width 0.15))
(fp_line (start -11.48 -13.5) (end -11.48 -12.33) (layer F.CrtYd) (width 0.05))
(fp_line (start -18.46 -11.33) (end -12.48 -11.33) (layer F.CrtYd) (width 0.05))
(fp_arc (start -12.48 -12.33) (end -11.48 -12.33) (angle 90) (layer F.CrtYd) (width 0.05))
(pad 8 thru_hole circle (at -8.89 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 9 thru_hole circle (at -8.89 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 7 thru_hole circle (at -6.35 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 10 thru_hole circle (at -6.35 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 6 thru_hole circle (at -3.81 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 11 thru_hole circle (at -3.81 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 5 thru_hole circle (at -1.27 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 12 thru_hole circle (at -1.27 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 4 thru_hole circle (at 1.27 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 13 thru_hole circle (at 1.27 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 3 thru_hole circle (at 3.81 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 14 thru_hole circle (at 3.81 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 2 thru_hole circle (at 6.35 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 15 thru_hole circle (at 6.35 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 1 thru_hole circle (at 8.89 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 16 thru_hole circle (at 8.89 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(model ${KIPRJMOD}/3dshapes/wemos_d1_mini.3dshapes/SLW-108-01-G-S.wrl
(offset (xyz 0 -11.39999982878918 0))
(scale (xyz 0.3937 0.3937 0.3937))
(rotate (xyz -90 0 0))
)
(model ${KIPRJMOD}/3dshapes/wemos_d1_mini.3dshapes/SLW-108-01-G-S.wrl
(offset (xyz 0 11.39999982878918 0))
(scale (xyz 0.3937 0.3937 0.3937))
(rotate (xyz -90 0 0))
)
(model ${KIPRJMOD}/3dshapes/wemos_d1_mini.3dshapes/TSW-108-05-G-S.wrl
(offset (xyz 0 -11.39999982878918 7.299999890364999))
(scale (xyz 0.3937 0.3937 0.3937))
(rotate (xyz 90 0 0))
)
(model ${KIPRJMOD}/3dshapes/wemos_d1_mini.3dshapes/TSW-108-05-G-S.wrl
(offset (xyz 0 11.39999982878918 7.299999890364999))
(scale (xyz 0.3937 0.3937 0.3937))
(rotate (xyz 90 0 0))
)
)

View File

@ -0,0 +1,58 @@
(module wemos-d1-mini-embedded (layer F.Cu) (tedit 5EC77280)
(fp_text reference REF** (at 20.32 -8.89 90) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value Wemos-D1-mini (at 20.32 0 90) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -11.43 -14.605) (end 15.24 -14.605) (layer F.SilkS) (width 0.15))
(fp_line (start 18.415 -11.43) (end 18.415 11.43) (layer F.SilkS) (width 0.15))
(fp_line (start 15.24 14.605) (end -18.415 14.605) (layer F.SilkS) (width 0.15))
(fp_line (start -18.415 14.605) (end -18.415 18.415) (layer F.SilkS) (width 0.15))
(fp_line (start -18.415 18.415) (end 19.05 18.415) (layer F.SilkS) (width 0.15))
(fp_line (start 19.05 18.415) (end 19.05 -18.415) (layer F.SilkS) (width 0.15))
(fp_line (start 19.05 -18.415) (end -11.43 -18.415) (layer F.SilkS) (width 0.15))
(fp_line (start -11.43 -18.415) (end -18.415 -18.415) (layer F.SilkS) (width 0.15))
(fp_line (start -18.415 -18.415) (end -18.415 -12.7) (layer F.SilkS) (width 0.15))
(fp_line (start -18.415 -12.7) (end -13.97 -12.7) (layer F.SilkS) (width 0.15))
(fp_line (start -12.7 -13.97) (end -12.7 -14.605) (layer F.SilkS) (width 0.15))
(fp_line (start -12.7 -14.605) (end -11.43 -14.605) (layer F.SilkS) (width 0.15))
(fp_line (start -11.43 -14.605) (end -11.43 -14.605) (layer F.SilkS) (width 0.15))
(fp_arc (start 15.24 11.43) (end 18.415 11.43) (angle 90) (layer F.SilkS) (width 0.15))
(fp_arc (start 15.24 -11.43) (end 15.24 -14.605) (angle 90) (layer F.SilkS) (width 0.15))
(fp_arc (start -13.97 -13.97) (end -12.7 -13.97) (angle 90) (layer F.SilkS) (width 0.15))
(fp_line (start -18.542 -18.542) (end 19.177 -18.542) (layer F.CrtYd) (width 0.05))
(fp_line (start 19.177 -18.542) (end 19.177 18.542) (layer F.CrtYd) (width 0.05))
(fp_line (start 19.177 18.542) (end -18.542 18.542) (layer F.CrtYd) (width 0.05))
(fp_line (start -18.542 18.542) (end -18.542 14.478) (layer F.CrtYd) (width 0.05))
(fp_line (start -18.542 14.478) (end 15.24 14.478) (layer F.CrtYd) (width 0.05))
(fp_line (start 18.288 11.43) (end 18.288 -11.43) (layer F.CrtYd) (width 0.05))
(fp_line (start 15.24 -14.478) (end -12.573 -14.478) (layer F.CrtYd) (width 0.05))
(fp_line (start -12.573 -14.478) (end -12.573 -13.97) (layer F.CrtYd) (width 0.05))
(fp_line (start -13.843 -12.573) (end -18.542 -12.573) (layer F.CrtYd) (width 0.05))
(fp_line (start -18.542 -12.573) (end -18.542 -18.542) (layer F.CrtYd) (width 0.05))
(fp_arc (start 15.24 -11.43) (end 15.24 -14.478) (angle 90) (layer F.CrtYd) (width 0.05))
(fp_arc (start 15.24 11.43) (end 18.288 11.43) (angle 90) (layer F.CrtYd) (width 0.05))
(fp_arc (start -13.97 -13.97) (end -12.573 -13.97) (angle 84.3) (layer F.CrtYd) (width 0.05))
(pad 8 thru_hole circle (at -8.89 -16.51) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 9 thru_hole circle (at -8.89 16.51) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 7 thru_hole circle (at -6.35 -16.51) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 10 thru_hole circle (at -6.35 16.51) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 6 thru_hole circle (at -3.81 -16.51) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 11 thru_hole circle (at -3.81 16.51) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 5 thru_hole circle (at -1.27 -16.51) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 12 thru_hole circle (at -1.27 16.51) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 4 thru_hole circle (at 1.27 -16.51) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 13 thru_hole circle (at 1.27 16.51) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 3 thru_hole circle (at 3.81 -16.51) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 14 thru_hole circle (at 3.81 16.51) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 2 thru_hole circle (at 6.35 -16.51) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 15 thru_hole circle (at 6.35 16.51) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 1 thru_hole circle (at 8.89 -16.51) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 16 thru_hole circle (at 8.89 16.51) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(model ${KIPRJMOD}/3dshapes/wemos_d1_mini.3dshapes/d1_mini_shield.wrl
(offset (xyz -17.89999973116897 -12.79999980776329 0.09999999849815071))
(scale (xyz 0.3937 0.3937 0.3937))
(rotate (xyz 0 180 90))
)
)

View File

@ -0,0 +1,72 @@
(module wemos-d1-mini-with-pin-header-and-connector (layer F.Cu) (tedit 5EC77306)
(fp_text reference REF** (at -19.3 0 90) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value Wemos-D1-mini (at 0 0) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -18.3 13.33) (end 14.78 13.33) (layer F.SilkS) (width 0.15))
(fp_line (start 16.78 11.33) (end 16.78 -11.33) (layer F.SilkS) (width 0.15))
(fp_line (start 14.78 -13.33) (end -11.3 -13.33) (layer F.SilkS) (width 0.15))
(fp_line (start -18.3 -11.18) (end -18.3 -3.32) (layer F.SilkS) (width 0.15))
(fp_line (start -18.3 -3.32) (end -17.3 -3.32) (layer F.SilkS) (width 0.15))
(fp_line (start -17.3 -3.32) (end -17.3 4.9) (layer F.SilkS) (width 0.15))
(fp_line (start -17.3 4.9) (end -18.3 4.9) (layer F.SilkS) (width 0.15))
(fp_line (start -18.3 4.9) (end -18.3 13.329999) (layer F.SilkS) (width 0.15))
(fp_line (start -11.48 -13.5) (end 14.85 -13.5) (layer F.CrtYd) (width 0.05))
(fp_line (start 16.94 -11.5) (end 16.94 11.5) (layer F.CrtYd) (width 0.05))
(fp_line (start 14.94 13.5) (end -18.46 13.5) (layer F.CrtYd) (width 0.05))
(fp_line (start -18.46 13.5) (end -18.46 -11.33) (layer F.CrtYd) (width 0.05))
(fp_arc (start 14.78 -11.33) (end 14.78 -13.33) (angle 90) (layer F.SilkS) (width 0.15))
(fp_arc (start 14.78 11.33) (end 16.78 11.33) (angle 90) (layer F.SilkS) (width 0.15))
(fp_arc (start 14.94 11.5) (end 16.94 11.5) (angle 90) (layer F.CrtYd) (width 0.05))
(fp_arc (start 14.94 -11.5) (end 14.85 -13.5) (angle 92.57657183) (layer F.CrtYd) (width 0.05))
(fp_line (start -18.3 -11.18) (end -12.3 -11.18) (layer F.SilkS) (width 0.15))
(fp_arc (start -12.3 -12.18) (end -11.3 -12.18) (angle 90) (layer F.SilkS) (width 0.15))
(fp_line (start -11.3 -12.17) (end -11.3 -13.33) (layer F.SilkS) (width 0.15))
(fp_line (start -11.3 -13.33) (end -11.3 -13.33) (layer F.SilkS) (width 0.15))
(fp_line (start -11.48 -13.5) (end -11.48 -12.33) (layer F.CrtYd) (width 0.05))
(fp_line (start -18.46 -11.33) (end -12.48 -11.33) (layer F.CrtYd) (width 0.05))
(fp_arc (start -12.48 -12.33) (end -11.48 -12.33) (angle 90) (layer F.CrtYd) (width 0.05))
(pad 8 thru_hole circle (at -8.89 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 9 thru_hole circle (at -8.89 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 7 thru_hole circle (at -6.35 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 10 thru_hole circle (at -6.35 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 6 thru_hole circle (at -3.81 -11.43 90) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 11 thru_hole circle (at -3.81 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 5 thru_hole circle (at -1.27 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 12 thru_hole circle (at -1.27 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 4 thru_hole circle (at 1.27 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 13 thru_hole circle (at 1.27 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 3 thru_hole circle (at 3.81 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 14 thru_hole circle (at 3.81 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 2 thru_hole circle (at 6.35 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 15 thru_hole circle (at 6.35 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 1 thru_hole circle (at 8.89 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 16 thru_hole circle (at 8.89 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(model ${KIPRJMOD}/3dshapes/wemos_d1_mini.3dshapes/d1_mini_shield.wrl
(offset (xyz -17.89999973116897 -12.79999980776329 8.39999987384466))
(scale (xyz 0.3937 0.3937 0.3937))
(rotate (xyz 0 180 90))
)
(model ${KIPRJMOD}/3dshapes/wemos_d1_mini.3dshapes/SLW-108-01-G-S.wrl
(offset (xyz 0 -11.39999982878918 0))
(scale (xyz 0.3937 0.3937 0.3937))
(rotate (xyz -90 0 0))
)
(model ${KIPRJMOD}/3dshapes/wemos_d1_mini.3dshapes/SLW-108-01-G-S.wrl
(offset (xyz 0 11.39999982878918 0))
(scale (xyz 0.3937 0.3937 0.3937))
(rotate (xyz -90 0 0))
)
(model ${KIPRJMOD}/3dshapes/wemos_d1_mini.3dshapes/TSW-108-05-G-S.wrl
(offset (xyz 0 -11.39999982878918 7.299999890364999))
(scale (xyz 0.3937 0.3937 0.3937))
(rotate (xyz 90 0 0))
)
(model ${KIPRJMOD}/3dshapes/wemos_d1_mini.3dshapes/TSW-108-05-G-S.wrl
(offset (xyz 0 11.39999982878918 7.299999890364999))
(scale (xyz 0.3937 0.3937 0.3937))
(rotate (xyz 90 0 0))
)
)

View File

@ -0,0 +1,62 @@
(module wemos-d1-mini-with-pin-header (layer F.Cu) (tedit 5EC772B1)
(fp_text reference REF** (at -19.3 0 90) (layer F.SilkS)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_text value Wemos-D1-mini (at 0 0) (layer F.Fab)
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_line (start -18.3 13.33) (end 14.78 13.33) (layer F.SilkS) (width 0.15))
(fp_line (start 16.78 11.33) (end 16.78 -11.33) (layer F.SilkS) (width 0.15))
(fp_line (start 14.78 -13.33) (end -11.3 -13.33) (layer F.SilkS) (width 0.15))
(fp_line (start -18.3 -11.18) (end -18.3 -3.32) (layer F.SilkS) (width 0.15))
(fp_line (start -18.3 -3.32) (end -17.3 -3.32) (layer F.SilkS) (width 0.15))
(fp_line (start -17.3 -3.32) (end -17.3 4.9) (layer F.SilkS) (width 0.15))
(fp_line (start -17.3 4.9) (end -18.3 4.9) (layer F.SilkS) (width 0.15))
(fp_line (start -18.3 4.9) (end -18.3 13.329999) (layer F.SilkS) (width 0.15))
(fp_line (start -11.48 -13.5) (end 14.85 -13.5) (layer F.CrtYd) (width 0.05))
(fp_line (start 16.94 -11.5) (end 16.94 11.5) (layer F.CrtYd) (width 0.05))
(fp_line (start 14.94 13.5) (end -18.46 13.5) (layer F.CrtYd) (width 0.05))
(fp_line (start -18.46 13.5) (end -18.46 -11.33) (layer F.CrtYd) (width 0.05))
(fp_arc (start 14.78 -11.33) (end 14.78 -13.33) (angle 90) (layer F.SilkS) (width 0.15))
(fp_arc (start 14.78 11.33) (end 16.78 11.33) (angle 90) (layer F.SilkS) (width 0.15))
(fp_arc (start 14.94 11.5) (end 16.94 11.5) (angle 90) (layer F.CrtYd) (width 0.05))
(fp_arc (start 14.94 -11.5) (end 14.85 -13.5) (angle 92.57657183) (layer F.CrtYd) (width 0.05))
(fp_line (start -18.3 -11.18) (end -12.3 -11.18) (layer F.SilkS) (width 0.15))
(fp_arc (start -12.3 -12.18) (end -11.3 -12.18) (angle 90) (layer F.SilkS) (width 0.15))
(fp_line (start -11.3 -12.17) (end -11.3 -13.33) (layer F.SilkS) (width 0.15))
(fp_line (start -11.3 -13.33) (end -11.3 -13.33) (layer F.SilkS) (width 0.15))
(fp_line (start -11.48 -13.5) (end -11.48 -12.33) (layer F.CrtYd) (width 0.05))
(fp_line (start -18.46 -11.33) (end -12.48 -11.33) (layer F.CrtYd) (width 0.05))
(fp_arc (start -12.48 -12.33) (end -11.48 -12.33) (angle 90) (layer F.CrtYd) (width 0.05))
(pad 8 thru_hole circle (at -8.89 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 9 thru_hole circle (at -8.89 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 7 thru_hole circle (at -6.35 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 10 thru_hole circle (at -6.35 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 6 thru_hole circle (at -3.81 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 11 thru_hole circle (at -3.81 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 5 thru_hole circle (at -1.27 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 12 thru_hole circle (at -1.27 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 4 thru_hole circle (at 1.27 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 13 thru_hole circle (at 1.27 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 3 thru_hole circle (at 3.81 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 14 thru_hole circle (at 3.81 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 2 thru_hole circle (at 6.35 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 15 thru_hole circle (at 6.35 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 1 thru_hole circle (at 8.89 -11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(pad 16 thru_hole circle (at 8.89 11.43) (size 1.8 1.8) (drill 1.016) (layers *.Cu *.Mask))
(model ${KIPRJMOD}/3dshapes/wemos_d1_mini.3dshapes/d1_mini_shield.wrl
(offset (xyz -17.89999973116897 -12.79999980776329 5.099999923405687))
(scale (xyz 0.3937 0.3937 0.3937))
(rotate (xyz 0 180 90))
)
(model ${KIPRJMOD}/3dshapes/wemos_d1_mini.3dshapes/TSW-108-05-G-S.wrl
(offset (xyz 0 -11.39999982878918 2.599999960951919))
(scale (xyz 0.3937 0.3937 0.3937))
(rotate (xyz 90 0 0))
)
(model ${KIPRJMOD}/3dshapes/wemos_d1_mini.3dshapes/TSW-108-05-G-S.wrl
(offset (xyz 0 11.39999982878918 2.599999960951919))
(scale (xyz 0.3937 0.3937 0.3937))
(rotate (xyz 90 0 0))
)
)

3
kicad/sym-lib-table Normal file
View File

@ -0,0 +1,3 @@
(sym_lib_table
(lib (name D1_Mini)(type Legacy)(uri /home/fe/korjakow/Projects/radiator_test_bench/kicad/libraries/wemos_mini.lib)(options "")(descr ""))
)

46
lib/README Normal file
View File

@ -0,0 +1,46 @@
This directory is intended for project specific (private) libraries.
PlatformIO will compile them to static libraries and link into executable file.
The source code of each library should be placed in a an own separate directory
("lib/your_library_name/[here are source files]").
For example, see a structure of the following two libraries `Foo` and `Bar`:
|--lib
| |
| |--Bar
| | |--docs
| | |--examples
| | |--src
| | |- Bar.c
| | |- Bar.h
| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
| |
| |--Foo
| | |- Foo.c
| | |- Foo.h
| |
| |- README --> THIS FILE
|
|- platformio.ini
|--src
|- main.c
and a contents of `src/main.c`:
```
#include <Foo.h>
#include <Bar.h>
int main (void)
{
...
}
```
PlatformIO Library Dependency Finder will find automatically dependent
libraries scanning project source files.
More information about PlatformIO Library Dependency Finder
- https://docs.platformio.org/page/librarymanager/ldf.html

Binary file not shown.

28
mock_ws_server/node_modules/.package-lock.json generated vendored Normal file
View File

@ -0,0 +1,28 @@
{
"name": "mock_ws_server",
"version": "1.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"node_modules/ws": {
"version": "8.2.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
"integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": "^5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
}
}
}

19
mock_ws_server/node_modules/ws/LICENSE generated vendored Normal file
View File

@ -0,0 +1,19 @@
Copyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

493
mock_ws_server/node_modules/ws/README.md generated vendored Normal file
View File

@ -0,0 +1,493 @@
# ws: a Node.js WebSocket library
[![Version npm](https://img.shields.io/npm/v/ws.svg?logo=npm)](https://www.npmjs.com/package/ws)
[![CI](https://img.shields.io/github/workflow/status/websockets/ws/CI/master?label=CI&logo=github)](https://github.com/websockets/ws/actions?query=workflow%3ACI+branch%3Amaster)
[![Coverage Status](https://img.shields.io/coveralls/websockets/ws/master.svg?logo=coveralls)](https://coveralls.io/github/websockets/ws)
ws is a simple to use, blazing fast, and thoroughly tested WebSocket client and
server implementation.
Passes the quite extensive Autobahn test suite: [server][server-report],
[client][client-report].
**Note**: This module does not work in the browser. The client in the docs is a
reference to a back end with the role of a client in the WebSocket
communication. Browser clients must use the native
[`WebSocket`](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket)
object. To make the same code work seamlessly on Node.js and the browser, you
can use one of the many wrappers available on npm, like
[isomorphic-ws](https://github.com/heineiuo/isomorphic-ws).
## Table of Contents
- [Protocol support](#protocol-support)
- [Installing](#installing)
- [Opt-in for performance](#opt-in-for-performance)
- [API docs](#api-docs)
- [WebSocket compression](#websocket-compression)
- [Usage examples](#usage-examples)
- [Sending and receiving text data](#sending-and-receiving-text-data)
- [Sending binary data](#sending-binary-data)
- [Simple server](#simple-server)
- [External HTTP/S server](#external-https-server)
- [Multiple servers sharing a single HTTP/S server](#multiple-servers-sharing-a-single-https-server)
- [Client authentication](#client-authentication)
- [Server broadcast](#server-broadcast)
- [echo.websocket.org demo](#echowebsocketorg-demo)
- [Use the Node.js streams API](#use-the-nodejs-streams-api)
- [Other examples](#other-examples)
- [FAQ](#faq)
- [How to get the IP address of the client?](#how-to-get-the-ip-address-of-the-client)
- [How to detect and close broken connections?](#how-to-detect-and-close-broken-connections)
- [How to connect via a proxy?](#how-to-connect-via-a-proxy)
- [Changelog](#changelog)
- [License](#license)
## Protocol support
- **HyBi drafts 07-12** (Use the option `protocolVersion: 8`)
- **HyBi drafts 13-17** (Current default, alternatively option
`protocolVersion: 13`)
## Installing
```
npm install ws
```
### Opt-in for performance
There are 2 optional modules that can be installed along side with the ws
module. These modules are binary addons which improve certain operations.
Prebuilt binaries are available for the most popular platforms so you don't
necessarily need to have a C++ compiler installed on your machine.
- `npm install --save-optional bufferutil`: Allows to efficiently perform
operations such as masking and unmasking the data payload of the WebSocket
frames.
- `npm install --save-optional utf-8-validate`: Allows to efficiently check if a
message contains valid UTF-8.
## API docs
See [`/doc/ws.md`](./doc/ws.md) for Node.js-like documentation of ws classes and
utility functions.
## WebSocket compression
ws supports the [permessage-deflate extension][permessage-deflate] which enables
the client and server to negotiate a compression algorithm and its parameters,
and then selectively apply it to the data payloads of each WebSocket message.
The extension is disabled by default on the server and enabled by default on the
client. It adds a significant overhead in terms of performance and memory
consumption so we suggest to enable it only if it is really needed.
Note that Node.js has a variety of issues with high-performance compression,
where increased concurrency, especially on Linux, can lead to [catastrophic
memory fragmentation][node-zlib-bug] and slow performance. If you intend to use
permessage-deflate in production, it is worthwhile to set up a test
representative of your workload and ensure Node.js/zlib will handle it with
acceptable performance and memory usage.
Tuning of permessage-deflate can be done via the options defined below. You can
also use `zlibDeflateOptions` and `zlibInflateOptions`, which is passed directly
into the creation of [raw deflate/inflate streams][node-zlib-deflaterawdocs].
See [the docs][ws-server-options] for more options.
```js
import WebSocket, { WebSocketServer } from 'ws';
const wss = new WebSocketServer({
port: 8080,
perMessageDeflate: {
zlibDeflateOptions: {
// See zlib defaults.
chunkSize: 1024,
memLevel: 7,
level: 3
},
zlibInflateOptions: {
chunkSize: 10 * 1024
},
// Other options settable:
clientNoContextTakeover: true, // Defaults to negotiated value.
serverNoContextTakeover: true, // Defaults to negotiated value.
serverMaxWindowBits: 10, // Defaults to negotiated value.
// Below options specified as default values.
concurrencyLimit: 10, // Limits zlib concurrency for perf.
threshold: 1024 // Size (in bytes) below which messages
// should not be compressed if context takeover is disabled.
}
});
```
The client will only use the extension if it is supported and enabled on the
server. To always disable the extension on the client set the
`perMessageDeflate` option to `false`.
```js
import WebSocket from 'ws';
const ws = new WebSocket('ws://www.host.com/path', {
perMessageDeflate: false
});
```
## Usage examples
### Sending and receiving text data
```js
import WebSocket from 'ws';
const ws = new WebSocket('ws://www.host.com/path');
ws.on('open', function open() {
ws.send('something');
});
ws.on('message', function incoming(message) {
console.log('received: %s', message);
});
```
### Sending binary data
```js
import WebSocket from 'ws';
const ws = new WebSocket('ws://www.host.com/path');
ws.on('open', function open() {
const array = new Float32Array(5);
for (var i = 0; i < array.length; ++i) {
array[i] = i / 2;
}
ws.send(array);
});
```
### Simple server
```js
import { WebSocketServer } from 'ws';
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
console.log('received: %s', message);
});
ws.send('something');
});
```
### External HTTP/S server
```js
import { createServer } from 'https';
import { readFileSync } from 'fs';
import { WebSocketServer } from 'ws';
const server = createServer({
cert: readFileSync('/path/to/cert.pem'),
key: readFileSync('/path/to/key.pem')
});
const wss = new WebSocketServer({ server });
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
console.log('received: %s', message);
});
ws.send('something');
});
server.listen(8080);
```
### Multiple servers sharing a single HTTP/S server
```js
import { createServer } from 'http';
import { parse } from 'url';
import { WebSocketServer } from 'ws';
const server = createServer();
const wss1 = new WebSocketServer({ noServer: true });
const wss2 = new WebSocketServer({ noServer: true });
wss1.on('connection', function connection(ws) {
// ...
});
wss2.on('connection', function connection(ws) {
// ...
});
server.on('upgrade', function upgrade(request, socket, head) {
const { pathname } = parse(request.url);
if (pathname === '/foo') {
wss1.handleUpgrade(request, socket, head, function done(ws) {
wss1.emit('connection', ws, request);
});
} else if (pathname === '/bar') {
wss2.handleUpgrade(request, socket, head, function done(ws) {
wss2.emit('connection', ws, request);
});
} else {
socket.destroy();
}
});
server.listen(8080);
```
### Client authentication
```js
import WebSocket from 'ws';
import { createServer } from 'http';
const server = createServer();
const wss = new WebSocketServer({ noServer: true });
wss.on('connection', function connection(ws, request, client) {
ws.on('message', function message(msg) {
console.log(`Received message ${msg} from user ${client}`);
});
});
server.on('upgrade', function upgrade(request, socket, head) {
// This function is not defined on purpose. Implement it with your own logic.
authenticate(request, (err, client) => {
if (err || !client) {
socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
socket.destroy();
return;
}
wss.handleUpgrade(request, socket, head, function done(ws) {
wss.emit('connection', ws, request, client);
});
});
});
server.listen(8080);
```
Also see the provided [example][session-parse-example] using `express-session`.
### Server broadcast
A client WebSocket broadcasting to all connected WebSocket clients, including
itself.
```js
import WebSocket, { WebSocketServer } from 'ws';
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(data, isBinary) {
wss.clients.forEach(function each(client) {
if (client.readyState === WebSocket.OPEN) {
client.send(data, { binary: isBinary });
}
});
});
});
```
A client WebSocket broadcasting to every other connected WebSocket clients,
excluding itself.
```js
import WebSocket, { WebSocketServer } from 'ws';
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(data, isBinary) {
wss.clients.forEach(function each(client) {
if (client !== ws && client.readyState === WebSocket.OPEN) {
client.send(data, { binary: isBinary });
}
});
});
});
```
### echo.websocket.org demo
```js
import WebSocket from 'ws';
const ws = new WebSocket('wss://echo.websocket.org/', {
origin: 'https://websocket.org'
});
ws.on('open', function open() {
console.log('connected');
ws.send(Date.now());
});
ws.on('close', function close() {
console.log('disconnected');
});
ws.on('message', function incoming(data) {
console.log(`Roundtrip time: ${Date.now() - data} ms`);
setTimeout(function timeout() {
ws.send(Date.now());
}, 500);
});
```
### Use the Node.js streams API
```js
import WebSocket, { createWebSocketStream } from 'ws';
const ws = new WebSocket('wss://echo.websocket.org/', {
origin: 'https://websocket.org'
});
const duplex = createWebSocketStream(ws, { encoding: 'utf8' });
duplex.pipe(process.stdout);
process.stdin.pipe(duplex);
```
### Other examples
For a full example with a browser client communicating with a ws server, see the
examples folder.
Otherwise, see the test cases.
## FAQ
### How to get the IP address of the client?
The remote IP address can be obtained from the raw socket.
```js
import { WebSocketServer } from 'ws';
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', function connection(ws, req) {
const ip = req.socket.remoteAddress;
});
```
When the server runs behind a proxy like NGINX, the de-facto standard is to use
the `X-Forwarded-For` header.
```js
wss.on('connection', function connection(ws, req) {
const ip = req.headers['x-forwarded-for'].split(',')[0].trim();
});
```
### How to detect and close broken connections?
Sometimes the link between the server and the client can be interrupted in a way
that keeps both the server and the client unaware of the broken state of the
connection (e.g. when pulling the cord).
In these cases ping messages can be used as a means to verify that the remote
endpoint is still responsive.
```js
import { WebSocketServer } from 'ws';
function heartbeat() {
this.isAlive = true;
}
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', function connection(ws) {
ws.isAlive = true;
ws.on('pong', heartbeat);
});
const interval = setInterval(function ping() {
wss.clients.forEach(function each(ws) {
if (ws.isAlive === false) return ws.terminate();
ws.isAlive = false;
ws.ping();
});
}, 30000);
wss.on('close', function close() {
clearInterval(interval);
});
```
Pong messages are automatically sent in response to ping messages as required by
the spec.
Just like the server example above your clients might as well lose connection
without knowing it. You might want to add a ping listener on your clients to
prevent that. A simple implementation would be:
```js
import WebSocket from 'ws';
function heartbeat() {
clearTimeout(this.pingTimeout);
// Use `WebSocket#terminate()`, which immediately destroys the connection,
// instead of `WebSocket#close()`, which waits for the close timer.
// Delay should be equal to the interval at which your server
// sends out pings plus a conservative assumption of the latency.
this.pingTimeout = setTimeout(() => {
this.terminate();
}, 30000 + 1000);
}
const client = new WebSocket('wss://echo.websocket.org/');
client.on('open', heartbeat);
client.on('ping', heartbeat);
client.on('close', function clear() {
clearTimeout(this.pingTimeout);
});
```
### How to connect via a proxy?
Use a custom `http.Agent` implementation like [https-proxy-agent][] or
[socks-proxy-agent][].
## Changelog
We're using the GitHub [releases][changelog] for changelog entries.
## License
[MIT](LICENSE)
[changelog]: https://github.com/websockets/ws/releases
[client-report]: http://websockets.github.io/ws/autobahn/clients/
[https-proxy-agent]: https://github.com/TooTallNate/node-https-proxy-agent
[node-zlib-bug]: https://github.com/nodejs/node/issues/8871
[node-zlib-deflaterawdocs]:
https://nodejs.org/api/zlib.html#zlib_zlib_createdeflateraw_options
[permessage-deflate]: https://tools.ietf.org/html/rfc7692
[server-report]: http://websockets.github.io/ws/autobahn/servers/
[session-parse-example]: ./examples/express-session-parse
[socks-proxy-agent]: https://github.com/TooTallNate/node-socks-proxy-agent
[ws-server-options]:
https://github.com/websockets/ws/blob/master/doc/ws.md#new-websocketserveroptions-callback

8
mock_ws_server/node_modules/ws/browser.js generated vendored Normal file
View File

@ -0,0 +1,8 @@
'use strict';
module.exports = function () {
throw new Error(
'ws does not work in the browser. Browser clients must use the native ' +
'WebSocket object'
);
};

13
mock_ws_server/node_modules/ws/index.js generated vendored Normal file
View File

@ -0,0 +1,13 @@
'use strict';
const WebSocket = require('./lib/websocket');
WebSocket.createWebSocketStream = require('./lib/stream');
WebSocket.Server = require('./lib/websocket-server');
WebSocket.Receiver = require('./lib/receiver');
WebSocket.Sender = require('./lib/sender');
WebSocket.WebSocket = WebSocket;
WebSocket.WebSocketServer = WebSocket.Server;
module.exports = WebSocket;

126
mock_ws_server/node_modules/ws/lib/buffer-util.js generated vendored Normal file
View File

@ -0,0 +1,126 @@
'use strict';
const { EMPTY_BUFFER } = require('./constants');
/**
* Merges an array of buffers into a new buffer.
*
* @param {Buffer[]} list The array of buffers to concat
* @param {Number} totalLength The total length of buffers in the list
* @return {Buffer} The resulting buffer
* @public
*/
function concat(list, totalLength) {
if (list.length === 0) return EMPTY_BUFFER;
if (list.length === 1) return list[0];
const target = Buffer.allocUnsafe(totalLength);
let offset = 0;
for (let i = 0; i < list.length; i++) {
const buf = list[i];
target.set(buf, offset);
offset += buf.length;
}
if (offset < totalLength) return target.slice(0, offset);
return target;
}
/**
* Masks a buffer using the given mask.
*
* @param {Buffer} source The buffer to mask
* @param {Buffer} mask The mask to use
* @param {Buffer} output The buffer where to store the result
* @param {Number} offset The offset at which to start writing
* @param {Number} length The number of bytes to mask.
* @public
*/
function _mask(source, mask, output, offset, length) {
for (let i = 0; i < length; i++) {
output[offset + i] = source[i] ^ mask[i & 3];
}
}
/**
* Unmasks a buffer using the given mask.
*
* @param {Buffer} buffer The buffer to unmask
* @param {Buffer} mask The mask to use
* @public
*/
function _unmask(buffer, mask) {
for (let i = 0; i < buffer.length; i++) {
buffer[i] ^= mask[i & 3];
}
}
/**
* Converts a buffer to an `ArrayBuffer`.
*
* @param {Buffer} buf The buffer to convert
* @return {ArrayBuffer} Converted buffer
* @public
*/
function toArrayBuffer(buf) {
if (buf.byteLength === buf.buffer.byteLength) {
return buf.buffer;
}
return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
}
/**
* Converts `data` to a `Buffer`.
*
* @param {*} data The data to convert
* @return {Buffer} The buffer
* @throws {TypeError}
* @public
*/
function toBuffer(data) {
toBuffer.readOnly = true;
if (Buffer.isBuffer(data)) return data;
let buf;
if (data instanceof ArrayBuffer) {
buf = Buffer.from(data);
} else if (ArrayBuffer.isView(data)) {
buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength);
} else {
buf = Buffer.from(data);
toBuffer.readOnly = false;
}
return buf;
}
try {
const bufferUtil = require('bufferutil');
module.exports = {
concat,
mask(source, mask, output, offset, length) {
if (length < 48) _mask(source, mask, output, offset, length);
else bufferUtil.mask(source, mask, output, offset, length);
},
toArrayBuffer,
toBuffer,
unmask(buffer, mask) {
if (buffer.length < 32) _unmask(buffer, mask);
else bufferUtil.unmask(buffer, mask);
}
};
} catch (e) /* istanbul ignore next */ {
module.exports = {
concat,
mask: _mask,
toArrayBuffer,
toBuffer,
unmask: _unmask
};
}

12
mock_ws_server/node_modules/ws/lib/constants.js generated vendored Normal file
View File

@ -0,0 +1,12 @@
'use strict';
module.exports = {
BINARY_TYPES: ['nodebuffer', 'arraybuffer', 'fragments'],
EMPTY_BUFFER: Buffer.alloc(0),
GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',
kForOnEventAttribute: Symbol('kIsForOnEventAttribute'),
kListener: Symbol('kListener'),
kStatusCode: Symbol('status-code'),
kWebSocket: Symbol('websocket'),
NOOP: () => {}
};

266
mock_ws_server/node_modules/ws/lib/event-target.js generated vendored Normal file
View File

@ -0,0 +1,266 @@
'use strict';
const { kForOnEventAttribute, kListener } = require('./constants');
const kCode = Symbol('kCode');
const kData = Symbol('kData');
const kError = Symbol('kError');
const kMessage = Symbol('kMessage');
const kReason = Symbol('kReason');
const kTarget = Symbol('kTarget');
const kType = Symbol('kType');
const kWasClean = Symbol('kWasClean');
/**
* Class representing an event.
*/
class Event {
/**
* Create a new `Event`.
*
* @param {String} type The name of the event
* @throws {TypeError} If the `type` argument is not specified
*/
constructor(type) {
this[kTarget] = null;
this[kType] = type;
}
/**
* @type {*}
*/
get target() {
return this[kTarget];
}
/**
* @type {String}
*/
get type() {
return this[kType];
}
}
Object.defineProperty(Event.prototype, 'target', { enumerable: true });
Object.defineProperty(Event.prototype, 'type', { enumerable: true });
/**
* Class representing a close event.
*
* @extends Event
*/
class CloseEvent extends Event {
/**
* Create a new `CloseEvent`.
*
* @param {String} type The name of the event
* @param {Object} [options] A dictionary object that allows for setting
* attributes via object members of the same name
* @param {Number} [options.code=0] The status code explaining why the
* connection was closed
* @param {String} [options.reason=''] A human-readable string explaining why
* the connection was closed
* @param {Boolean} [options.wasClean=false] Indicates whether or not the
* connection was cleanly closed
*/
constructor(type, options = {}) {
super(type);
this[kCode] = options.code === undefined ? 0 : options.code;
this[kReason] = options.reason === undefined ? '' : options.reason;
this[kWasClean] = options.wasClean === undefined ? false : options.wasClean;
}
/**
* @type {Number}
*/
get code() {
return this[kCode];
}
/**
* @type {String}
*/
get reason() {
return this[kReason];
}
/**
* @type {Boolean}
*/
get wasClean() {
return this[kWasClean];
}
}
Object.defineProperty(CloseEvent.prototype, 'code', { enumerable: true });
Object.defineProperty(CloseEvent.prototype, 'reason', { enumerable: true });
Object.defineProperty(CloseEvent.prototype, 'wasClean', { enumerable: true });
/**
* Class representing an error event.
*
* @extends Event
*/
class ErrorEvent extends Event {
/**
* Create a new `ErrorEvent`.
*
* @param {String} type The name of the event
* @param {Object} [options] A dictionary object that allows for setting
* attributes via object members of the same name
* @param {*} [options.error=null] The error that generated this event
* @param {String} [options.message=''] The error message
*/
constructor(type, options = {}) {
super(type);
this[kError] = options.error === undefined ? null : options.error;
this[kMessage] = options.message === undefined ? '' : options.message;
}
/**
* @type {*}
*/
get error() {
return this[kError];
}
/**
* @type {String}
*/
get message() {
return this[kMessage];
}
}
Object.defineProperty(ErrorEvent.prototype, 'error', { enumerable: true });
Object.defineProperty(ErrorEvent.prototype, 'message', { enumerable: true });
/**
* Class representing a message event.
*
* @extends Event
*/
class MessageEvent extends Event {
/**
* Create a new `MessageEvent`.
*
* @param {String} type The name of the event
* @param {Object} [options] A dictionary object that allows for setting
* attributes via object members of the same name
* @param {*} [options.data=null] The message content
*/
constructor(type, options = {}) {
super(type);
this[kData] = options.data === undefined ? null : options.data;
}
/**
* @type {*}
*/
get data() {
return this[kData];
}
}
Object.defineProperty(MessageEvent.prototype, 'data', { enumerable: true });
/**
* This provides methods for emulating the `EventTarget` interface. It's not
* meant to be used directly.
*
* @mixin
*/
const EventTarget = {
/**
* Register an event listener.
*
* @param {String} type A string representing the event type to listen for
* @param {Function} listener The listener to add
* @param {Object} [options] An options object specifies characteristics about
* the event listener
* @param {Boolean} [options.once=false] A `Boolean` indicating that the
* listener should be invoked at most once after being added. If `true`,
* the listener would be automatically removed when invoked.
* @public
*/
addEventListener(type, listener, options = {}) {
let wrapper;
if (type === 'message') {
wrapper = function onMessage(data, isBinary) {
const event = new MessageEvent('message', {
data: isBinary ? data : data.toString()
});
event[kTarget] = this;
listener.call(this, event);
};
} else if (type === 'close') {
wrapper = function onClose(code, message) {
const event = new CloseEvent('close', {
code,
reason: message.toString(),
wasClean: this._closeFrameReceived && this._closeFrameSent
});
event[kTarget] = this;
listener.call(this, event);
};
} else if (type === 'error') {
wrapper = function onError(error) {
const event = new ErrorEvent('error', {
error,
message: error.message
});
event[kTarget] = this;
listener.call(this, event);
};
} else if (type === 'open') {
wrapper = function onOpen() {
const event = new Event('open');
event[kTarget] = this;
listener.call(this, event);
};
} else {
return;
}
wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute];
wrapper[kListener] = listener;
if (options.once) {
this.once(type, wrapper);
} else {
this.on(type, wrapper);
}
},
/**
* Remove an event listener.
*
* @param {String} type A string representing the event type to remove
* @param {Function} handler The listener to remove
* @public
*/
removeEventListener(type, handler) {
for (const listener of this.listeners(type)) {
if (listener[kListener] === handler && !listener[kForOnEventAttribute]) {
this.removeListener(type, listener);
break;
}
}
}
};
module.exports = {
CloseEvent,
ErrorEvent,
Event,
EventTarget,
MessageEvent
};

203
mock_ws_server/node_modules/ws/lib/extension.js generated vendored Normal file
View File

@ -0,0 +1,203 @@
'use strict';
const { tokenChars } = require('./validation');
/**
* Adds an offer to the map of extension offers or a parameter to the map of
* parameters.
*
* @param {Object} dest The map of extension offers or parameters
* @param {String} name The extension or parameter name
* @param {(Object|Boolean|String)} elem The extension parameters or the
* parameter value
* @private
*/
function push(dest, name, elem) {
if (dest[name] === undefined) dest[name] = [elem];
else dest[name].push(elem);
}
/**
* Parses the `Sec-WebSocket-Extensions` header into an object.
*
* @param {String} header The field value of the header
* @return {Object} The parsed object
* @public
*/
function parse(header) {
const offers = Object.create(null);
let params = Object.create(null);
let mustUnescape = false;
let isEscaping = false;
let inQuotes = false;
let extensionName;
let paramName;
let start = -1;
let code = -1;
let end = -1;
let i = 0;
for (; i < header.length; i++) {
code = header.charCodeAt(i);
if (extensionName === undefined) {
if (end === -1 && tokenChars[code] === 1) {
if (start === -1) start = i;
} else if (
i !== 0 &&
(code === 0x20 /* ' ' */ || code === 0x09) /* '\t' */
) {
if (end === -1 && start !== -1) end = i;
} else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) {
if (start === -1) {
throw new SyntaxError(`Unexpected character at index ${i}`);
}
if (end === -1) end = i;
const name = header.slice(start, end);
if (code === 0x2c) {
push(offers, name, params);
params = Object.create(null);
} else {
extensionName = name;
}
start = end = -1;
} else {
throw new SyntaxError(`Unexpected character at index ${i}`);
}
} else if (paramName === undefined) {
if (end === -1 && tokenChars[code] === 1) {
if (start === -1) start = i;
} else if (code === 0x20 || code === 0x09) {
if (end === -1 && start !== -1) end = i;
} else if (code === 0x3b || code === 0x2c) {
if (start === -1) {
throw new SyntaxError(`Unexpected character at index ${i}`);
}
if (end === -1) end = i;
push(params, header.slice(start, end), true);
if (code === 0x2c) {
push(offers, extensionName, params);
params = Object.create(null);
extensionName = undefined;
}
start = end = -1;
} else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {
paramName = header.slice(start, i);
start = end = -1;
} else {
throw new SyntaxError(`Unexpected character at index ${i}`);
}
} else {
//
// The value of a quoted-string after unescaping must conform to the
// token ABNF, so only token characters are valid.
// Ref: https://tools.ietf.org/html/rfc6455#section-9.1
//
if (isEscaping) {
if (tokenChars[code] !== 1) {
throw new SyntaxError(`Unexpected character at index ${i}`);
}
if (start === -1) start = i;
else if (!mustUnescape) mustUnescape = true;
isEscaping = false;
} else if (inQuotes) {
if (tokenChars[code] === 1) {
if (start === -1) start = i;
} else if (code === 0x22 /* '"' */ && start !== -1) {
inQuotes = false;
end = i;
} else if (code === 0x5c /* '\' */) {
isEscaping = true;
} else {
throw new SyntaxError(`Unexpected character at index ${i}`);
}
} else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {
inQuotes = true;
} else if (end === -1 && tokenChars[code] === 1) {
if (start === -1) start = i;
} else if (start !== -1 && (code === 0x20 || code === 0x09)) {
if (end === -1) end = i;
} else if (code === 0x3b || code === 0x2c) {
if (start === -1) {
throw new SyntaxError(`Unexpected character at index ${i}`);
}
if (end === -1) end = i;
let value = header.slice(start, end);
if (mustUnescape) {
value = value.replace(/\\/g, '');
mustUnescape = false;
}
push(params, paramName, value);
if (code === 0x2c) {
push(offers, extensionName, params);
params = Object.create(null);
extensionName = undefined;
}
paramName = undefined;
start = end = -1;
} else {
throw new SyntaxError(`Unexpected character at index ${i}`);
}
}
}
if (start === -1 || inQuotes || code === 0x20 || code === 0x09) {
throw new SyntaxError('Unexpected end of input');
}
if (end === -1) end = i;
const token = header.slice(start, end);
if (extensionName === undefined) {
push(offers, token, params);
} else {
if (paramName === undefined) {
push(params, token, true);
} else if (mustUnescape) {
push(params, paramName, token.replace(/\\/g, ''));
} else {
push(params, paramName, token);
}
push(offers, extensionName, params);
}
return offers;
}
/**
* Builds the `Sec-WebSocket-Extensions` header field value.
*
* @param {Object} extensions The map of extensions and parameters to format
* @return {String} A string representing the given object
* @public
*/
function format(extensions) {
return Object.keys(extensions)
.map((extension) => {
let configurations = extensions[extension];
if (!Array.isArray(configurations)) configurations = [configurations];
return configurations
.map((params) => {
return [extension]
.concat(
Object.keys(params).map((k) => {
let values = params[k];
if (!Array.isArray(values)) values = [values];
return values
.map((v) => (v === true ? k : `${k}=${v}`))
.join('; ');
})
)
.join('; ');
})
.join(', ');
})
.join(', ');
}
module.exports = { format, parse };

55
mock_ws_server/node_modules/ws/lib/limiter.js generated vendored Normal file
View File

@ -0,0 +1,55 @@
'use strict';
const kDone = Symbol('kDone');
const kRun = Symbol('kRun');
/**
* A very simple job queue with adjustable concurrency. Adapted from
* https://github.com/STRML/async-limiter
*/
class Limiter {
/**
* Creates a new `Limiter`.
*
* @param {Number} [concurrency=Infinity] The maximum number of jobs allowed
* to run concurrently
*/
constructor(concurrency) {
this[kDone] = () => {
this.pending--;
this[kRun]();
};
this.concurrency = concurrency || Infinity;
this.jobs = [];
this.pending = 0;
}
/**
* Adds a job to the queue.
*
* @param {Function} job The job to run
* @public
*/
add(job) {
this.jobs.push(job);
this[kRun]();
}
/**
* Removes a job from the queue and runs it if possible.
*
* @private
*/
[kRun]() {
if (this.pending === this.concurrency) return;
if (this.jobs.length) {
const job = this.jobs.shift();
this.pending++;
job(this[kDone]);
}
}
}
module.exports = Limiter;

View File

@ -0,0 +1,511 @@
'use strict';
const zlib = require('zlib');
const bufferUtil = require('./buffer-util');
const Limiter = require('./limiter');
const { kStatusCode } = require('./constants');
const TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);
const kPerMessageDeflate = Symbol('permessage-deflate');
const kTotalLength = Symbol('total-length');
const kCallback = Symbol('callback');
const kBuffers = Symbol('buffers');
const kError = Symbol('error');
//
// We limit zlib concurrency, which prevents severe memory fragmentation
// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913
// and https://github.com/websockets/ws/issues/1202
//
// Intentionally global; it's the global thread pool that's an issue.
//
let zlibLimiter;
/**
* permessage-deflate implementation.
*/
class PerMessageDeflate {
/**
* Creates a PerMessageDeflate instance.
*
* @param {Object} [options] Configuration options
* @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support
* for, or request, a custom client window size
* @param {Boolean} [options.clientNoContextTakeover=false] Advertise/
* acknowledge disabling of client context takeover
* @param {Number} [options.concurrencyLimit=10] The number of concurrent
* calls to zlib
* @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the
* use of a custom server window size
* @param {Boolean} [options.serverNoContextTakeover=false] Request/accept
* disabling of server context takeover
* @param {Number} [options.threshold=1024] Size (in bytes) below which
* messages should not be compressed if context takeover is disabled
* @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on
* deflate
* @param {Object} [options.zlibInflateOptions] Options to pass to zlib on
* inflate
* @param {Boolean} [isServer=false] Create the instance in either server or
* client mode
* @param {Number} [maxPayload=0] The maximum allowed message length
*/
constructor(options, isServer, maxPayload) {
this._maxPayload = maxPayload | 0;
this._options = options || {};
this._threshold =
this._options.threshold !== undefined ? this._options.threshold : 1024;
this._isServer = !!isServer;
this._deflate = null;
this._inflate = null;
this.params = null;
if (!zlibLimiter) {
const concurrency =
this._options.concurrencyLimit !== undefined
? this._options.concurrencyLimit
: 10;
zlibLimiter = new Limiter(concurrency);
}
}
/**
* @type {String}
*/
static get extensionName() {
return 'permessage-deflate';
}
/**
* Create an extension negotiation offer.
*
* @return {Object} Extension parameters
* @public
*/
offer() {
const params = {};
if (this._options.serverNoContextTakeover) {
params.server_no_context_takeover = true;
}
if (this._options.clientNoContextTakeover) {
params.client_no_context_takeover = true;
}
if (this._options.serverMaxWindowBits) {
params.server_max_window_bits = this._options.serverMaxWindowBits;
}
if (this._options.clientMaxWindowBits) {
params.client_max_window_bits = this._options.clientMaxWindowBits;
} else if (this._options.clientMaxWindowBits == null) {
params.client_max_window_bits = true;
}
return params;
}
/**
* Accept an extension negotiation offer/response.
*
* @param {Array} configurations The extension negotiation offers/reponse
* @return {Object} Accepted configuration
* @public
*/
accept(configurations) {
configurations = this.normalizeParams(configurations);
this.params = this._isServer
? this.acceptAsServer(configurations)
: this.acceptAsClient(configurations);
return this.params;
}
/**
* Releases all resources used by the extension.
*
* @public
*/
cleanup() {
if (this._inflate) {
this._inflate.close();
this._inflate = null;
}
if (this._deflate) {
const callback = this._deflate[kCallback];
this._deflate.close();
this._deflate = null;
if (callback) {
callback(
new Error(
'The deflate stream was closed while data was being processed'
)
);
}
}
}
/**
* Accept an extension negotiation offer.
*
* @param {Array} offers The extension negotiation offers
* @return {Object} Accepted configuration
* @private
*/
acceptAsServer(offers) {
const opts = this._options;
const accepted = offers.find((params) => {
if (
(opts.serverNoContextTakeover === false &&
params.server_no_context_takeover) ||
(params.server_max_window_bits &&
(opts.serverMaxWindowBits === false ||
(typeof opts.serverMaxWindowBits === 'number' &&
opts.serverMaxWindowBits > params.server_max_window_bits))) ||
(typeof opts.clientMaxWindowBits === 'number' &&
!params.client_max_window_bits)
) {
return false;
}
return true;
});
if (!accepted) {
throw new Error('None of the extension offers can be accepted');
}
if (opts.serverNoContextTakeover) {
accepted.server_no_context_takeover = true;
}
if (opts.clientNoContextTakeover) {
accepted.client_no_context_takeover = true;
}
if (typeof opts.serverMaxWindowBits === 'number') {
accepted.server_max_window_bits = opts.serverMaxWindowBits;
}
if (typeof opts.clientMaxWindowBits === 'number') {
accepted.client_max_window_bits = opts.clientMaxWindowBits;
} else if (
accepted.client_max_window_bits === true ||
opts.clientMaxWindowBits === false
) {
delete accepted.client_max_window_bits;
}
return accepted;
}
/**
* Accept the extension negotiation response.
*
* @param {Array} response The extension negotiation response
* @return {Object} Accepted configuration
* @private
*/
acceptAsClient(response) {
const params = response[0];
if (
this._options.clientNoContextTakeover === false &&
params.client_no_context_takeover
) {
throw new Error('Unexpected parameter "client_no_context_takeover"');
}
if (!params.client_max_window_bits) {
if (typeof this._options.clientMaxWindowBits === 'number') {
params.client_max_window_bits = this._options.clientMaxWindowBits;
}
} else if (
this._options.clientMaxWindowBits === false ||
(typeof this._options.clientMaxWindowBits === 'number' &&
params.client_max_window_bits > this._options.clientMaxWindowBits)
) {
throw new Error(
'Unexpected or invalid parameter "client_max_window_bits"'
);
}
return params;
}
/**
* Normalize parameters.
*
* @param {Array} configurations The extension negotiation offers/reponse
* @return {Array} The offers/response with normalized parameters
* @private
*/
normalizeParams(configurations) {
configurations.forEach((params) => {
Object.keys(params).forEach((key) => {
let value = params[key];
if (value.length > 1) {
throw new Error(`Parameter "${key}" must have only a single value`);
}
value = value[0];
if (key === 'client_max_window_bits') {
if (value !== true) {
const num = +value;
if (!Number.isInteger(num) || num < 8 || num > 15) {
throw new TypeError(
`Invalid value for parameter "${key}": ${value}`
);
}
value = num;
} else if (!this._isServer) {
throw new TypeError(
`Invalid value for parameter "${key}": ${value}`
);
}
} else if (key === 'server_max_window_bits') {
const num = +value;
if (!Number.isInteger(num) || num < 8 || num > 15) {
throw new TypeError(
`Invalid value for parameter "${key}": ${value}`
);
}
value = num;
} else if (
key === 'client_no_context_takeover' ||
key === 'server_no_context_takeover'
) {
if (value !== true) {
throw new TypeError(
`Invalid value for parameter "${key}": ${value}`
);
}
} else {
throw new Error(`Unknown parameter "${key}"`);
}
params[key] = value;
});
});
return configurations;
}
/**
* Decompress data. Concurrency limited.
*
* @param {Buffer} data Compressed data
* @param {Boolean} fin Specifies whether or not this is the last fragment
* @param {Function} callback Callback
* @public
*/
decompress(data, fin, callback) {
zlibLimiter.add((done) => {
this._decompress(data, fin, (err, result) => {
done();
callback(err, result);
});
});
}
/**
* Compress data. Concurrency limited.
*
* @param {Buffer} data Data to compress
* @param {Boolean} fin Specifies whether or not this is the last fragment
* @param {Function} callback Callback
* @public
*/
compress(data, fin, callback) {
zlibLimiter.add((done) => {
this._compress(data, fin, (err, result) => {
done();
callback(err, result);
});
});
}
/**
* Decompress data.
*
* @param {Buffer} data Compressed data
* @param {Boolean} fin Specifies whether or not this is the last fragment
* @param {Function} callback Callback
* @private
*/
_decompress(data, fin, callback) {
const endpoint = this._isServer ? 'client' : 'server';
if (!this._inflate) {
const key = `${endpoint}_max_window_bits`;
const windowBits =
typeof this.params[key] !== 'number'
? zlib.Z_DEFAULT_WINDOWBITS
: this.params[key];
this._inflate = zlib.createInflateRaw({
...this._options.zlibInflateOptions,
windowBits
});
this._inflate[kPerMessageDeflate] = this;
this._inflate[kTotalLength] = 0;
this._inflate[kBuffers] = [];
this._inflate.on('error', inflateOnError);
this._inflate.on('data', inflateOnData);
}
this._inflate[kCallback] = callback;
this._inflate.write(data);
if (fin) this._inflate.write(TRAILER);
this._inflate.flush(() => {
const err = this._inflate[kError];
if (err) {
this._inflate.close();
this._inflate = null;
callback(err);
return;
}
const data = bufferUtil.concat(
this._inflate[kBuffers],
this._inflate[kTotalLength]
);
if (this._inflate._readableState.endEmitted) {
this._inflate.close();
this._inflate = null;
} else {
this._inflate[kTotalLength] = 0;
this._inflate[kBuffers] = [];
if (fin && this.params[`${endpoint}_no_context_takeover`]) {
this._inflate.reset();
}
}
callback(null, data);
});
}
/**
* Compress data.
*
* @param {Buffer} data Data to compress
* @param {Boolean} fin Specifies whether or not this is the last fragment
* @param {Function} callback Callback
* @private
*/
_compress(data, fin, callback) {
const endpoint = this._isServer ? 'server' : 'client';
if (!this._deflate) {
const key = `${endpoint}_max_window_bits`;
const windowBits =
typeof this.params[key] !== 'number'
? zlib.Z_DEFAULT_WINDOWBITS
: this.params[key];
this._deflate = zlib.createDeflateRaw({
...this._options.zlibDeflateOptions,
windowBits
});
this._deflate[kTotalLength] = 0;
this._deflate[kBuffers] = [];
this._deflate.on('data', deflateOnData);
}
this._deflate[kCallback] = callback;
this._deflate.write(data);
this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {
if (!this._deflate) {
//
// The deflate stream was closed while data was being processed.
//
return;
}
let data = bufferUtil.concat(
this._deflate[kBuffers],
this._deflate[kTotalLength]
);
if (fin) data = data.slice(0, data.length - 4);
//
// Ensure that the callback will not be called again in
// `PerMessageDeflate#cleanup()`.
//
this._deflate[kCallback] = null;
this._deflate[kTotalLength] = 0;
this._deflate[kBuffers] = [];
if (fin && this.params[`${endpoint}_no_context_takeover`]) {
this._deflate.reset();
}
callback(null, data);
});
}
}
module.exports = PerMessageDeflate;
/**
* The listener of the `zlib.DeflateRaw` stream `'data'` event.
*
* @param {Buffer} chunk A chunk of data
* @private
*/
function deflateOnData(chunk) {
this[kBuffers].push(chunk);
this[kTotalLength] += chunk.length;
}
/**
* The listener of the `zlib.InflateRaw` stream `'data'` event.
*
* @param {Buffer} chunk A chunk of data
* @private
*/
function inflateOnData(chunk) {
this[kTotalLength] += chunk.length;
if (
this[kPerMessageDeflate]._maxPayload < 1 ||
this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload
) {
this[kBuffers].push(chunk);
return;
}
this[kError] = new RangeError('Max payload size exceeded');
this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';
this[kError][kStatusCode] = 1009;
this.removeListener('data', inflateOnData);
this.reset();
}
/**
* The listener of the `zlib.InflateRaw` stream `'error'` event.
*
* @param {Error} err The emitted error
* @private
*/
function inflateOnError(err) {
//
// There is no need to call `Zlib#close()` as the handle is automatically
// closed when an error is emitted.
//
this[kPerMessageDeflate]._inflate = null;
err[kStatusCode] = 1007;
this[kCallback](err);
}

612
mock_ws_server/node_modules/ws/lib/receiver.js generated vendored Normal file
View File

@ -0,0 +1,612 @@
'use strict';
const { Writable } = require('stream');
const PerMessageDeflate = require('./permessage-deflate');
const {
BINARY_TYPES,
EMPTY_BUFFER,
kStatusCode,
kWebSocket
} = require('./constants');
const { concat, toArrayBuffer, unmask } = require('./buffer-util');
const { isValidStatusCode, isValidUTF8 } = require('./validation');
const GET_INFO = 0;
const GET_PAYLOAD_LENGTH_16 = 1;
const GET_PAYLOAD_LENGTH_64 = 2;
const GET_MASK = 3;
const GET_DATA = 4;
const INFLATING = 5;
/**
* HyBi Receiver implementation.
*
* @extends Writable
*/
class Receiver extends Writable {
/**
* Creates a Receiver instance.
*
* @param {Object} [options] Options object
* @param {String} [options.binaryType=nodebuffer] The type for binary data
* @param {Object} [options.extensions] An object containing the negotiated
* extensions
* @param {Boolean} [options.isServer=false] Specifies whether to operate in
* client or server mode
* @param {Number} [options.maxPayload=0] The maximum allowed message length
* @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or
* not to skip UTF-8 validation for text and close messages
*/
constructor(options = {}) {
super();
this._binaryType = options.binaryType || BINARY_TYPES[0];
this._extensions = options.extensions || {};
this._isServer = !!options.isServer;
this._maxPayload = options.maxPayload | 0;
this._skipUTF8Validation = !!options.skipUTF8Validation;
this[kWebSocket] = undefined;
this._bufferedBytes = 0;
this._buffers = [];
this._compressed = false;
this._payloadLength = 0;
this._mask = undefined;
this._fragmented = 0;
this._masked = false;
this._fin = false;
this._opcode = 0;
this._totalPayloadLength = 0;
this._messageLength = 0;
this._fragments = [];
this._state = GET_INFO;
this._loop = false;
}
/**
* Implements `Writable.prototype._write()`.
*
* @param {Buffer} chunk The chunk of data to write
* @param {String} encoding The character encoding of `chunk`
* @param {Function} cb Callback
* @private
*/
_write(chunk, encoding, cb) {
if (this._opcode === 0x08 && this._state == GET_INFO) return cb();
this._bufferedBytes += chunk.length;
this._buffers.push(chunk);
this.startLoop(cb);
}
/**
* Consumes `n` bytes from the buffered data.
*
* @param {Number} n The number of bytes to consume
* @return {Buffer} The consumed bytes
* @private
*/
consume(n) {
this._bufferedBytes -= n;
if (n === this._buffers[0].length) return this._buffers.shift();
if (n < this._buffers[0].length) {
const buf = this._buffers[0];
this._buffers[0] = buf.slice(n);
return buf.slice(0, n);
}
const dst = Buffer.allocUnsafe(n);
do {
const buf = this._buffers[0];
const offset = dst.length - n;
if (n >= buf.length) {
dst.set(this._buffers.shift(), offset);
} else {
dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);
this._buffers[0] = buf.slice(n);
}
n -= buf.length;
} while (n > 0);
return dst;
}
/**
* Starts the parsing loop.
*
* @param {Function} cb Callback
* @private
*/
startLoop(cb) {
let err;
this._loop = true;
do {
switch (this._state) {
case GET_INFO:
err = this.getInfo();
break;
case GET_PAYLOAD_LENGTH_16:
err = this.getPayloadLength16();
break;
case GET_PAYLOAD_LENGTH_64:
err = this.getPayloadLength64();
break;
case GET_MASK:
this.getMask();
break;
case GET_DATA:
err = this.getData(cb);
break;
default:
// `INFLATING`
this._loop = false;
return;
}
} while (this._loop);
cb(err);
}
/**
* Reads the first two bytes of a frame.
*
* @return {(RangeError|undefined)} A possible error
* @private
*/
getInfo() {
if (this._bufferedBytes < 2) {
this._loop = false;
return;
}
const buf = this.consume(2);
if ((buf[0] & 0x30) !== 0x00) {
this._loop = false;
return error(
RangeError,
'RSV2 and RSV3 must be clear',
true,
1002,
'WS_ERR_UNEXPECTED_RSV_2_3'
);
}
const compressed = (buf[0] & 0x40) === 0x40;
if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {
this._loop = false;
return error(
RangeError,
'RSV1 must be clear',
true,
1002,
'WS_ERR_UNEXPECTED_RSV_1'
);
}
this._fin = (buf[0] & 0x80) === 0x80;
this._opcode = buf[0] & 0x0f;
this._payloadLength = buf[1] & 0x7f;
if (this._opcode === 0x00) {
if (compressed) {
this._loop = false;
return error(
RangeError,
'RSV1 must be clear',
true,
1002,
'WS_ERR_UNEXPECTED_RSV_1'
);
}
if (!this._fragmented) {
this._loop = false;
return error(
RangeError,
'invalid opcode 0',
true,
1002,
'WS_ERR_INVALID_OPCODE'
);
}
this._opcode = this._fragmented;
} else if (this._opcode === 0x01 || this._opcode === 0x02) {
if (this._fragmented) {
this._loop = false;
return error(
RangeError,
`invalid opcode ${this._opcode}`,
true,
1002,
'WS_ERR_INVALID_OPCODE'
);
}
this._compressed = compressed;
} else if (this._opcode > 0x07 && this._opcode < 0x0b) {
if (!this._fin) {
this._loop = false;
return error(
RangeError,
'FIN must be set',
true,
1002,
'WS_ERR_EXPECTED_FIN'
);
}
if (compressed) {
this._loop = false;
return error(
RangeError,
'RSV1 must be clear',
true,
1002,
'WS_ERR_UNEXPECTED_RSV_1'
);
}
if (this._payloadLength > 0x7d) {
this._loop = false;
return error(
RangeError,
`invalid payload length ${this._payloadLength}`,
true,
1002,
'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'
);
}
} else {
this._loop = false;
return error(
RangeError,
`invalid opcode ${this._opcode}`,
true,
1002,
'WS_ERR_INVALID_OPCODE'
);
}
if (!this._fin && !this._fragmented) this._fragmented = this._opcode;
this._masked = (buf[1] & 0x80) === 0x80;
if (this._isServer) {
if (!this._masked) {
this._loop = false;
return error(
RangeError,
'MASK must be set',
true,
1002,
'WS_ERR_EXPECTED_MASK'
);
}
} else if (this._masked) {
this._loop = false;
return error(
RangeError,
'MASK must be clear',
true,
1002,
'WS_ERR_UNEXPECTED_MASK'
);
}
if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;
else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;
else return this.haveLength();
}
/**
* Gets extended payload length (7+16).
*
* @return {(RangeError|undefined)} A possible error
* @private
*/
getPayloadLength16() {
if (this._bufferedBytes < 2) {
this._loop = false;
return;
}
this._payloadLength = this.consume(2).readUInt16BE(0);
return this.haveLength();
}
/**
* Gets extended payload length (7+64).
*
* @return {(RangeError|undefined)} A possible error
* @private
*/
getPayloadLength64() {
if (this._bufferedBytes < 8) {
this._loop = false;
return;
}
const buf = this.consume(8);
const num = buf.readUInt32BE(0);
//
// The maximum safe integer in JavaScript is 2^53 - 1. An error is returned
// if payload length is greater than this number.
//
if (num > Math.pow(2, 53 - 32) - 1) {
this._loop = false;
return error(
RangeError,
'Unsupported WebSocket frame: payload length > 2^53 - 1',
false,
1009,
'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'
);
}
this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);
return this.haveLength();
}
/**
* Payload length has been read.
*
* @return {(RangeError|undefined)} A possible error
* @private
*/
haveLength() {
if (this._payloadLength && this._opcode < 0x08) {
this._totalPayloadLength += this._payloadLength;
if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {
this._loop = false;
return error(
RangeError,
'Max payload size exceeded',
false,
1009,
'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'
);
}
}
if (this._masked) this._state = GET_MASK;
else this._state = GET_DATA;
}
/**
* Reads mask bytes.
*
* @private
*/
getMask() {
if (this._bufferedBytes < 4) {
this._loop = false;
return;
}
this._mask = this.consume(4);
this._state = GET_DATA;
}
/**
* Reads data bytes.
*
* @param {Function} cb Callback
* @return {(Error|RangeError|undefined)} A possible error
* @private
*/
getData(cb) {
let data = EMPTY_BUFFER;
if (this._payloadLength) {
if (this._bufferedBytes < this._payloadLength) {
this._loop = false;
return;
}
data = this.consume(this._payloadLength);
if (this._masked) unmask(data, this._mask);
}
if (this._opcode > 0x07) return this.controlMessage(data);
if (this._compressed) {
this._state = INFLATING;
this.decompress(data, cb);
return;
}
if (data.length) {
//
// This message is not compressed so its length is the sum of the payload
// length of all fragments.
//
this._messageLength = this._totalPayloadLength;
this._fragments.push(data);
}
return this.dataMessage();
}
/**
* Decompresses data.
*
* @param {Buffer} data Compressed data
* @param {Function} cb Callback
* @private
*/
decompress(data, cb) {
const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];
perMessageDeflate.decompress(data, this._fin, (err, buf) => {
if (err) return cb(err);
if (buf.length) {
this._messageLength += buf.length;
if (this._messageLength > this._maxPayload && this._maxPayload > 0) {
return cb(
error(
RangeError,
'Max payload size exceeded',
false,
1009,
'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'
)
);
}
this._fragments.push(buf);
}
const er = this.dataMessage();
if (er) return cb(er);
this.startLoop(cb);
});
}
/**
* Handles a data message.
*
* @return {(Error|undefined)} A possible error
* @private
*/
dataMessage() {
if (this._fin) {
const messageLength = this._messageLength;
const fragments = this._fragments;
this._totalPayloadLength = 0;
this._messageLength = 0;
this._fragmented = 0;
this._fragments = [];
if (this._opcode === 2) {
let data;
if (this._binaryType === 'nodebuffer') {
data = concat(fragments, messageLength);
} else if (this._binaryType === 'arraybuffer') {
data = toArrayBuffer(concat(fragments, messageLength));
} else {
data = fragments;
}
this.emit('message', data, true);
} else {
const buf = concat(fragments, messageLength);
if (!this._skipUTF8Validation && !isValidUTF8(buf)) {
this._loop = false;
return error(
Error,
'invalid UTF-8 sequence',
true,
1007,
'WS_ERR_INVALID_UTF8'
);
}
this.emit('message', buf, false);
}
}
this._state = GET_INFO;
}
/**
* Handles a control message.
*
* @param {Buffer} data Data to handle
* @return {(Error|RangeError|undefined)} A possible error
* @private
*/
controlMessage(data) {
if (this._opcode === 0x08) {
this._loop = false;
if (data.length === 0) {
this.emit('conclude', 1005, EMPTY_BUFFER);
this.end();
} else if (data.length === 1) {
return error(
RangeError,
'invalid payload length 1',
true,
1002,
'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'
);
} else {
const code = data.readUInt16BE(0);
if (!isValidStatusCode(code)) {
return error(
RangeError,
`invalid status code ${code}`,
true,
1002,
'WS_ERR_INVALID_CLOSE_CODE'
);
}
const buf = data.slice(2);
if (!this._skipUTF8Validation && !isValidUTF8(buf)) {
return error(
Error,
'invalid UTF-8 sequence',
true,
1007,
'WS_ERR_INVALID_UTF8'
);
}
this.emit('conclude', code, buf);
this.end();
}
} else if (this._opcode === 0x09) {
this.emit('ping', data);
} else {
this.emit('pong', data);
}
this._state = GET_INFO;
}
}
module.exports = Receiver;
/**
* Builds an error object.
*
* @param {function(new:Error|RangeError)} ErrorCtor The error constructor
* @param {String} message The error message
* @param {Boolean} prefix Specifies whether or not to add a default prefix to
* `message`
* @param {Number} statusCode The status code
* @param {String} errorCode The exposed error code
* @return {(Error|RangeError)} The error
* @private
*/
function error(ErrorCtor, message, prefix, statusCode, errorCode) {
const err = new ErrorCtor(
prefix ? `Invalid WebSocket frame: ${message}` : message
);
Error.captureStackTrace(err, error);
err.code = errorCode;
err[kStatusCode] = statusCode;
return err;
}

422
mock_ws_server/node_modules/ws/lib/sender.js generated vendored Normal file
View File

@ -0,0 +1,422 @@
/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^net|tls$" }] */
'use strict';
const net = require('net');
const tls = require('tls');
const { randomFillSync } = require('crypto');
const PerMessageDeflate = require('./permessage-deflate');
const { EMPTY_BUFFER } = require('./constants');
const { isValidStatusCode } = require('./validation');
const { mask: applyMask, toBuffer } = require('./buffer-util');
const mask = Buffer.alloc(4);
/**
* HyBi Sender implementation.
*/
class Sender {
/**
* Creates a Sender instance.
*
* @param {(net.Socket|tls.Socket)} socket The connection socket
* @param {Object} [extensions] An object containing the negotiated extensions
*/
constructor(socket, extensions) {
this._extensions = extensions || {};
this._socket = socket;
this._firstFragment = true;
this._compress = false;
this._bufferedBytes = 0;
this._deflating = false;
this._queue = [];
}
/**
* Frames a piece of data according to the HyBi WebSocket protocol.
*
* @param {Buffer} data The data to frame
* @param {Object} options Options object
* @param {Boolean} [options.fin=false] Specifies whether or not to set the
* FIN bit
* @param {Boolean} [options.mask=false] Specifies whether or not to mask
* `data`
* @param {Number} options.opcode The opcode
* @param {Boolean} [options.readOnly=false] Specifies whether `data` can be
* modified
* @param {Boolean} [options.rsv1=false] Specifies whether or not to set the
* RSV1 bit
* @return {Buffer[]} The framed data as a list of `Buffer` instances
* @public
*/
static frame(data, options) {
const merge = options.mask && options.readOnly;
let offset = options.mask ? 6 : 2;
let payloadLength = data.length;
if (data.length >= 65536) {
offset += 8;
payloadLength = 127;
} else if (data.length > 125) {
offset += 2;
payloadLength = 126;
}
const target = Buffer.allocUnsafe(merge ? data.length + offset : offset);
target[0] = options.fin ? options.opcode | 0x80 : options.opcode;
if (options.rsv1) target[0] |= 0x40;
target[1] = payloadLength;
if (payloadLength === 126) {
target.writeUInt16BE(data.length, 2);
} else if (payloadLength === 127) {
target.writeUInt32BE(0, 2);
target.writeUInt32BE(data.length, 6);
}
if (!options.mask) return [target, data];
randomFillSync(mask, 0, 4);
target[1] |= 0x80;
target[offset - 4] = mask[0];
target[offset - 3] = mask[1];
target[offset - 2] = mask[2];
target[offset - 1] = mask[3];
if (merge) {
applyMask(data, mask, target, offset, data.length);
return [target];
}
applyMask(data, mask, data, 0, data.length);
return [target, data];
}
/**
* Sends a close message to the other peer.
*
* @param {Number} [code] The status code component of the body
* @param {(String|Buffer)} [data] The message component of the body
* @param {Boolean} [mask=false] Specifies whether or not to mask the message
* @param {Function} [cb] Callback
* @public
*/
close(code, data, mask, cb) {
let buf;
if (code === undefined) {
buf = EMPTY_BUFFER;
} else if (typeof code !== 'number' || !isValidStatusCode(code)) {
throw new TypeError('First argument must be a valid error code number');
} else if (data === undefined || !data.length) {
buf = Buffer.allocUnsafe(2);
buf.writeUInt16BE(code, 0);
} else {
const length = Buffer.byteLength(data);
if (length > 123) {
throw new RangeError('The message must not be greater than 123 bytes');
}
buf = Buffer.allocUnsafe(2 + length);
buf.writeUInt16BE(code, 0);
if (typeof data === 'string') {
buf.write(data, 2);
} else {
buf.set(data, 2);
}
}
if (this._deflating) {
this.enqueue([this.doClose, buf, mask, cb]);
} else {
this.doClose(buf, mask, cb);
}
}
/**
* Frames and sends a close message.
*
* @param {Buffer} data The message to send
* @param {Boolean} [mask=false] Specifies whether or not to mask `data`
* @param {Function} [cb] Callback
* @private
*/
doClose(data, mask, cb) {
this.sendFrame(
Sender.frame(data, {
fin: true,
rsv1: false,
opcode: 0x08,
mask,
readOnly: false
}),
cb
);
}
/**
* Sends a ping message to the other peer.
*
* @param {*} data The message to send
* @param {Boolean} [mask=false] Specifies whether or not to mask `data`
* @param {Function} [cb] Callback
* @public
*/
ping(data, mask, cb) {
const buf = toBuffer(data);
if (buf.length > 125) {
throw new RangeError('The data size must not be greater than 125 bytes');
}
if (this._deflating) {
this.enqueue([this.doPing, buf, mask, toBuffer.readOnly, cb]);
} else {
this.doPing(buf, mask, toBuffer.readOnly, cb);
}
}
/**
* Frames and sends a ping message.
*
* @param {Buffer} data The message to send
* @param {Boolean} [mask=false] Specifies whether or not to mask `data`
* @param {Boolean} [readOnly=false] Specifies whether `data` can be modified
* @param {Function} [cb] Callback
* @private
*/
doPing(data, mask, readOnly, cb) {
this.sendFrame(
Sender.frame(data, {
fin: true,
rsv1: false,
opcode: 0x09,
mask,
readOnly
}),
cb
);
}
/**
* Sends a pong message to the other peer.
*
* @param {*} data The message to send
* @param {Boolean} [mask=false] Specifies whether or not to mask `data`
* @param {Function} [cb] Callback
* @public
*/
pong(data, mask, cb) {
const buf = toBuffer(data);
if (buf.length > 125) {
throw new RangeError('The data size must not be greater than 125 bytes');
}
if (this._deflating) {
this.enqueue([this.doPong, buf, mask, toBuffer.readOnly, cb]);
} else {
this.doPong(buf, mask, toBuffer.readOnly, cb);
}
}
/**
* Frames and sends a pong message.
*
* @param {Buffer} data The message to send
* @param {Boolean} [mask=false] Specifies whether or not to mask `data`
* @param {Boolean} [readOnly=false] Specifies whether `data` can be modified
* @param {Function} [cb] Callback
* @private
*/
doPong(data, mask, readOnly, cb) {
this.sendFrame(
Sender.frame(data, {
fin: true,
rsv1: false,
opcode: 0x0a,
mask,
readOnly
}),
cb
);
}
/**
* Sends a data message to the other peer.
*
* @param {*} data The message to send
* @param {Object} options Options object
* @param {Boolean} [options.binary=false] Specifies whether `data` is binary
* or text
* @param {Boolean} [options.compress=false] Specifies whether or not to
* compress `data`
* @param {Boolean} [options.fin=false] Specifies whether the fragment is the
* last one
* @param {Boolean} [options.mask=false] Specifies whether or not to mask
* `data`
* @param {Function} [cb] Callback
* @public
*/
send(data, options, cb) {
const buf = toBuffer(data);
const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];
let opcode = options.binary ? 2 : 1;
let rsv1 = options.compress;
if (this._firstFragment) {
this._firstFragment = false;
if (
rsv1 &&
perMessageDeflate &&
perMessageDeflate.params[
perMessageDeflate._isServer
? 'server_no_context_takeover'
: 'client_no_context_takeover'
]
) {
rsv1 = buf.length >= perMessageDeflate._threshold;
}
this._compress = rsv1;
} else {
rsv1 = false;
opcode = 0;
}
if (options.fin) this._firstFragment = true;
if (perMessageDeflate) {
const opts = {
fin: options.fin,
rsv1,
opcode,
mask: options.mask,
readOnly: toBuffer.readOnly
};
if (this._deflating) {
this.enqueue([this.dispatch, buf, this._compress, opts, cb]);
} else {
this.dispatch(buf, this._compress, opts, cb);
}
} else {
this.sendFrame(
Sender.frame(buf, {
fin: options.fin,
rsv1: false,
opcode,
mask: options.mask,
readOnly: toBuffer.readOnly
}),
cb
);
}
}
/**
* Dispatches a data message.
*
* @param {Buffer} data The message to send
* @param {Boolean} [compress=false] Specifies whether or not to compress
* `data`
* @param {Object} options Options object
* @param {Number} options.opcode The opcode
* @param {Boolean} [options.fin=false] Specifies whether or not to set the
* FIN bit
* @param {Boolean} [options.mask=false] Specifies whether or not to mask
* `data`
* @param {Boolean} [options.readOnly=false] Specifies whether `data` can be
* modified
* @param {Boolean} [options.rsv1=false] Specifies whether or not to set the
* RSV1 bit
* @param {Function} [cb] Callback
* @private
*/
dispatch(data, compress, options, cb) {
if (!compress) {
this.sendFrame(Sender.frame(data, options), cb);
return;
}
const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];
this._bufferedBytes += data.length;
this._deflating = true;
perMessageDeflate.compress(data, options.fin, (_, buf) => {
if (this._socket.destroyed) {
const err = new Error(
'The socket was closed while data was being compressed'
);
if (typeof cb === 'function') cb(err);
for (let i = 0; i < this._queue.length; i++) {
const callback = this._queue[i][4];
if (typeof callback === 'function') callback(err);
}
return;
}
this._bufferedBytes -= data.length;
this._deflating = false;
options.readOnly = false;
this.sendFrame(Sender.frame(buf, options), cb);
this.dequeue();
});
}
/**
* Executes queued send operations.
*
* @private
*/
dequeue() {
while (!this._deflating && this._queue.length) {
const params = this._queue.shift();
this._bufferedBytes -= params[1].length;
Reflect.apply(params[0], this, params.slice(1));
}
}
/**
* Enqueues a send operation.
*
* @param {Array} params Send operation parameters.
* @private
*/
enqueue(params) {
this._bufferedBytes += params[1].length;
this._queue.push(params);
}
/**
* Sends a frame.
*
* @param {Buffer[]} list The frame to send
* @param {Function} [cb] Callback
* @private
*/
sendFrame(list, cb) {
if (list.length === 2) {
this._socket.cork();
this._socket.write(list[0]);
this._socket.write(list[1], cb);
this._socket.uncork();
} else {
this._socket.write(list[0], cb);
}
}
}
module.exports = Sender;

180
mock_ws_server/node_modules/ws/lib/stream.js generated vendored Normal file
View File

@ -0,0 +1,180 @@
'use strict';
const { Duplex } = require('stream');
/**
* Emits the `'close'` event on a stream.
*
* @param {Duplex} stream The stream.
* @private
*/
function emitClose(stream) {
stream.emit('close');
}
/**
* The listener of the `'end'` event.
*
* @private
*/
function duplexOnEnd() {
if (!this.destroyed && this._writableState.finished) {
this.destroy();
}
}
/**
* The listener of the `'error'` event.
*
* @param {Error} err The error
* @private
*/
function duplexOnError(err) {
this.removeListener('error', duplexOnError);
this.destroy();
if (this.listenerCount('error') === 0) {
// Do not suppress the throwing behavior.
this.emit('error', err);
}
}
/**
* Wraps a `WebSocket` in a duplex stream.
*
* @param {WebSocket} ws The `WebSocket` to wrap
* @param {Object} [options] The options for the `Duplex` constructor
* @return {Duplex} The duplex stream
* @public
*/
function createWebSocketStream(ws, options) {
let resumeOnReceiverDrain = true;
let terminateOnDestroy = true;
function receiverOnDrain() {
if (resumeOnReceiverDrain) ws._socket.resume();
}
if (ws.readyState === ws.CONNECTING) {
ws.once('open', function open() {
ws._receiver.removeAllListeners('drain');
ws._receiver.on('drain', receiverOnDrain);
});
} else {
ws._receiver.removeAllListeners('drain');
ws._receiver.on('drain', receiverOnDrain);
}
const duplex = new Duplex({
...options,
autoDestroy: false,
emitClose: false,
objectMode: false,
writableObjectMode: false
});
ws.on('message', function message(msg, isBinary) {
const data =
!isBinary && duplex._readableState.objectMode ? msg.toString() : msg;
if (!duplex.push(data)) {
resumeOnReceiverDrain = false;
ws._socket.pause();
}
});
ws.once('error', function error(err) {
if (duplex.destroyed) return;
// Prevent `ws.terminate()` from being called by `duplex._destroy()`.
//
// - If the `'error'` event is emitted before the `'open'` event, then
// `ws.terminate()` is a noop as no socket is assigned.
// - Otherwise, the error is re-emitted by the listener of the `'error'`
// event of the `Receiver` object. The listener already closes the
// connection by calling `ws.close()`. This allows a close frame to be
// sent to the other peer. If `ws.terminate()` is called right after this,
// then the close frame might not be sent.
terminateOnDestroy = false;
duplex.destroy(err);
});
ws.once('close', function close() {
if (duplex.destroyed) return;
duplex.push(null);
});
duplex._destroy = function (err, callback) {
if (ws.readyState === ws.CLOSED) {
callback(err);
process.nextTick(emitClose, duplex);
return;
}
let called = false;
ws.once('error', function error(err) {
called = true;
callback(err);
});
ws.once('close', function close() {
if (!called) callback(err);
process.nextTick(emitClose, duplex);
});
if (terminateOnDestroy) ws.terminate();
};
duplex._final = function (callback) {
if (ws.readyState === ws.CONNECTING) {
ws.once('open', function open() {
duplex._final(callback);
});
return;
}
// If the value of the `_socket` property is `null` it means that `ws` is a
// client websocket and the handshake failed. In fact, when this happens, a
// socket is never assigned to the websocket. Wait for the `'error'` event
// that will be emitted by the websocket.
if (ws._socket === null) return;
if (ws._socket._writableState.finished) {
callback();
if (duplex._readableState.endEmitted) duplex.destroy();
} else {
ws._socket.once('finish', function finish() {
// `duplex` is not destroyed here because the `'end'` event will be
// emitted on `duplex` after this `'finish'` event. The EOF signaling
// `null` chunk is, in fact, pushed when the websocket emits `'close'`.
callback();
});
ws.close();
}
};
duplex._read = function () {
if (ws.readyState === ws.OPEN && !resumeOnReceiverDrain) {
resumeOnReceiverDrain = true;
if (!ws._receiver._writableState.needDrain) ws._socket.resume();
}
};
duplex._write = function (chunk, encoding, callback) {
if (ws.readyState === ws.CONNECTING) {
ws.once('open', function open() {
duplex._write(chunk, encoding, callback);
});
return;
}
ws.send(chunk, callback);
};
duplex.on('end', duplexOnEnd);
duplex.on('error', duplexOnError);
return duplex;
}
module.exports = createWebSocketStream;

62
mock_ws_server/node_modules/ws/lib/subprotocol.js generated vendored Normal file
View File

@ -0,0 +1,62 @@
'use strict';
const { tokenChars } = require('./validation');
/**
* Parses the `Sec-WebSocket-Protocol` header into a set of subprotocol names.
*
* @param {String} header The field value of the header
* @return {Set} The subprotocol names
* @public
*/
function parse(header) {
const protocols = new Set();
let start = -1;
let end = -1;
let i = 0;
for (i; i < header.length; i++) {
const code = header.charCodeAt(i);
if (end === -1 && tokenChars[code] === 1) {
if (start === -1) start = i;
} else if (
i !== 0 &&
(code === 0x20 /* ' ' */ || code === 0x09) /* '\t' */
) {
if (end === -1 && start !== -1) end = i;
} else if (code === 0x2c /* ',' */) {
if (start === -1) {
throw new SyntaxError(`Unexpected character at index ${i}`);
}
if (end === -1) end = i;
const protocol = header.slice(start, end);
if (protocols.has(protocol)) {
throw new SyntaxError(`The "${protocol}" subprotocol is duplicated`);
}
protocols.add(protocol);
start = end = -1;
} else {
throw new SyntaxError(`Unexpected character at index ${i}`);
}
}
if (start === -1 || end !== -1) {
throw new SyntaxError('Unexpected end of input');
}
const protocol = header.slice(start, i);
if (protocols.has(protocol)) {
throw new SyntaxError(`The "${protocol}" subprotocol is duplicated`);
}
protocols.add(protocol);
return protocols;
}
module.exports = { parse };

124
mock_ws_server/node_modules/ws/lib/validation.js generated vendored Normal file
View File

@ -0,0 +1,124 @@
'use strict';
//
// Allowed token characters:
//
// '!', '#', '$', '%', '&', ''', '*', '+', '-',
// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'
//
// tokenChars[32] === 0 // ' '
// tokenChars[33] === 1 // '!'
// tokenChars[34] === 0 // '"'
// ...
//
// prettier-ignore
const tokenChars = [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31
0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63
0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127
];
/**
* Checks if a status code is allowed in a close frame.
*
* @param {Number} code The status code
* @return {Boolean} `true` if the status code is valid, else `false`
* @public
*/
function isValidStatusCode(code) {
return (
(code >= 1000 &&
code <= 1014 &&
code !== 1004 &&
code !== 1005 &&
code !== 1006) ||
(code >= 3000 && code <= 4999)
);
}
/**
* Checks if a given buffer contains only correct UTF-8.
* Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by
* Markus Kuhn.
*
* @param {Buffer} buf The buffer to check
* @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`
* @public
*/
function _isValidUTF8(buf) {
const len = buf.length;
let i = 0;
while (i < len) {
if ((buf[i] & 0x80) === 0) {
// 0xxxxxxx
i++;
} else if ((buf[i] & 0xe0) === 0xc0) {
// 110xxxxx 10xxxxxx
if (
i + 1 === len ||
(buf[i + 1] & 0xc0) !== 0x80 ||
(buf[i] & 0xfe) === 0xc0 // Overlong
) {
return false;
}
i += 2;
} else if ((buf[i] & 0xf0) === 0xe0) {
// 1110xxxx 10xxxxxx 10xxxxxx
if (
i + 2 >= len ||
(buf[i + 1] & 0xc0) !== 0x80 ||
(buf[i + 2] & 0xc0) !== 0x80 ||
(buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong
(buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)
) {
return false;
}
i += 3;
} else if ((buf[i] & 0xf8) === 0xf0) {
// 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
if (
i + 3 >= len ||
(buf[i + 1] & 0xc0) !== 0x80 ||
(buf[i + 2] & 0xc0) !== 0x80 ||
(buf[i + 3] & 0xc0) !== 0x80 ||
(buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong
(buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||
buf[i] > 0xf4 // > U+10FFFF
) {
return false;
}
i += 4;
} else {
return false;
}
}
return true;
}
try {
const isValidUTF8 = require('utf-8-validate');
module.exports = {
isValidStatusCode,
isValidUTF8(buf) {
return buf.length < 150 ? _isValidUTF8(buf) : isValidUTF8(buf);
},
tokenChars
};
} catch (e) /* istanbul ignore next */ {
module.exports = {
isValidStatusCode,
isValidUTF8: _isValidUTF8,
tokenChars
};
}

485
mock_ws_server/node_modules/ws/lib/websocket-server.js generated vendored Normal file
View File

@ -0,0 +1,485 @@
/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^net|tls|https$" }] */
'use strict';
const EventEmitter = require('events');
const http = require('http');
const https = require('https');
const net = require('net');
const tls = require('tls');
const { createHash } = require('crypto');
const extension = require('./extension');
const PerMessageDeflate = require('./permessage-deflate');
const subprotocol = require('./subprotocol');
const WebSocket = require('./websocket');
const { GUID, kWebSocket } = require('./constants');
const keyRegex = /^[+/0-9A-Za-z]{22}==$/;
const RUNNING = 0;
const CLOSING = 1;
const CLOSED = 2;
/**
* Class representing a WebSocket server.
*
* @extends EventEmitter
*/
class WebSocketServer extends EventEmitter {
/**
* Create a `WebSocketServer` instance.
*
* @param {Object} options Configuration options
* @param {Number} [options.backlog=511] The maximum length of the queue of
* pending connections
* @param {Boolean} [options.clientTracking=true] Specifies whether or not to
* track clients
* @param {Function} [options.handleProtocols] A hook to handle protocols
* @param {String} [options.host] The hostname where to bind the server
* @param {Number} [options.maxPayload=104857600] The maximum allowed message
* size
* @param {Boolean} [options.noServer=false] Enable no server mode
* @param {String} [options.path] Accept only connections matching this path
* @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable
* permessage-deflate
* @param {Number} [options.port] The port where to bind the server
* @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S
* server to use
* @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or
* not to skip UTF-8 validation for text and close messages
* @param {Function} [options.verifyClient] A hook to reject connections
* @param {Function} [callback] A listener for the `listening` event
*/
constructor(options, callback) {
super();
options = {
maxPayload: 100 * 1024 * 1024,
skipUTF8Validation: false,
perMessageDeflate: false,
handleProtocols: null,
clientTracking: true,
verifyClient: null,
noServer: false,
backlog: null, // use default (511 as implemented in net.js)
server: null,
host: null,
path: null,
port: null,
...options
};
if (
(options.port == null && !options.server && !options.noServer) ||
(options.port != null && (options.server || options.noServer)) ||
(options.server && options.noServer)
) {
throw new TypeError(
'One and only one of the "port", "server", or "noServer" options ' +
'must be specified'
);
}
if (options.port != null) {
this._server = http.createServer((req, res) => {
const body = http.STATUS_CODES[426];
res.writeHead(426, {
'Content-Length': body.length,
'Content-Type': 'text/plain'
});
res.end(body);
});
this._server.listen(
options.port,
options.host,
options.backlog,
callback
);
} else if (options.server) {
this._server = options.server;
}
if (this._server) {
const emitConnection = this.emit.bind(this, 'connection');
this._removeListeners = addListeners(this._server, {
listening: this.emit.bind(this, 'listening'),
error: this.emit.bind(this, 'error'),
upgrade: (req, socket, head) => {
this.handleUpgrade(req, socket, head, emitConnection);
}
});
}
if (options.perMessageDeflate === true) options.perMessageDeflate = {};
if (options.clientTracking) {
this.clients = new Set();
this._shouldEmitClose = false;
}
this.options = options;
this._state = RUNNING;
}
/**
* Returns the bound address, the address family name, and port of the server
* as reported by the operating system if listening on an IP socket.
* If the server is listening on a pipe or UNIX domain socket, the name is
* returned as a string.
*
* @return {(Object|String|null)} The address of the server
* @public
*/
address() {
if (this.options.noServer) {
throw new Error('The server is operating in "noServer" mode');
}
if (!this._server) return null;
return this._server.address();
}
/**
* Stop the server from accepting new connections and emit the `'close'` event
* when all existing connections are closed.
*
* @param {Function} [cb] A one-time listener for the `'close'` event
* @public
*/
close(cb) {
if (this._state === CLOSED) {
if (cb) {
this.once('close', () => {
cb(new Error('The server is not running'));
});
}
process.nextTick(emitClose, this);
return;
}
if (cb) this.once('close', cb);
if (this._state === CLOSING) return;
this._state = CLOSING;
if (this.options.noServer || this.options.server) {
if (this._server) {
this._removeListeners();
this._removeListeners = this._server = null;
}
if (this.clients) {
if (!this.clients.size) {
process.nextTick(emitClose, this);
} else {
this._shouldEmitClose = true;
}
} else {
process.nextTick(emitClose, this);
}
} else {
const server = this._server;
this._removeListeners();
this._removeListeners = this._server = null;
//
// The HTTP/S server was created internally. Close it, and rely on its
// `'close'` event.
//
server.close(() => {
emitClose(this);
});
}
}
/**
* See if a given request should be handled by this server instance.
*
* @param {http.IncomingMessage} req Request object to inspect
* @return {Boolean} `true` if the request is valid, else `false`
* @public
*/
shouldHandle(req) {
if (this.options.path) {
const index = req.url.indexOf('?');
const pathname = index !== -1 ? req.url.slice(0, index) : req.url;
if (pathname !== this.options.path) return false;
}
return true;
}
/**
* Handle a HTTP Upgrade request.
*
* @param {http.IncomingMessage} req The request object
* @param {(net.Socket|tls.Socket)} socket The network socket between the
* server and client
* @param {Buffer} head The first packet of the upgraded stream
* @param {Function} cb Callback
* @public
*/
handleUpgrade(req, socket, head, cb) {
socket.on('error', socketOnError);
const key =
req.headers['sec-websocket-key'] !== undefined
? req.headers['sec-websocket-key']
: false;
const version = +req.headers['sec-websocket-version'];
if (
req.method !== 'GET' ||
req.headers.upgrade.toLowerCase() !== 'websocket' ||
!key ||
!keyRegex.test(key) ||
(version !== 8 && version !== 13) ||
!this.shouldHandle(req)
) {
return abortHandshake(socket, 400);
}
const secWebSocketProtocol = req.headers['sec-websocket-protocol'];
let protocols = new Set();
if (secWebSocketProtocol !== undefined) {
try {
protocols = subprotocol.parse(secWebSocketProtocol);
} catch (err) {
return abortHandshake(socket, 400);
}
}
const secWebSocketExtensions = req.headers['sec-websocket-extensions'];
const extensions = {};
if (
this.options.perMessageDeflate &&
secWebSocketExtensions !== undefined
) {
const perMessageDeflate = new PerMessageDeflate(
this.options.perMessageDeflate,
true,
this.options.maxPayload
);
try {
const offers = extension.parse(secWebSocketExtensions);
if (offers[PerMessageDeflate.extensionName]) {
perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);
extensions[PerMessageDeflate.extensionName] = perMessageDeflate;
}
} catch (err) {
return abortHandshake(socket, 400);
}
}
//
// Optionally call external client verification handler.
//
if (this.options.verifyClient) {
const info = {
origin:
req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],
secure: !!(req.socket.authorized || req.socket.encrypted),
req
};
if (this.options.verifyClient.length === 2) {
this.options.verifyClient(info, (verified, code, message, headers) => {
if (!verified) {
return abortHandshake(socket, code || 401, message, headers);
}
this.completeUpgrade(
extensions,
key,
protocols,
req,
socket,
head,
cb
);
});
return;
}
if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);
}
this.completeUpgrade(extensions, key, protocols, req, socket, head, cb);
}
/**
* Upgrade the connection to WebSocket.
*
* @param {Object} extensions The accepted extensions
* @param {String} key The value of the `Sec-WebSocket-Key` header
* @param {Set} protocols The subprotocols
* @param {http.IncomingMessage} req The request object
* @param {(net.Socket|tls.Socket)} socket The network socket between the
* server and client
* @param {Buffer} head The first packet of the upgraded stream
* @param {Function} cb Callback
* @throws {Error} If called more than once with the same socket
* @private
*/
completeUpgrade(extensions, key, protocols, req, socket, head, cb) {
//
// Destroy the socket if the client has already sent a FIN packet.
//
if (!socket.readable || !socket.writable) return socket.destroy();
if (socket[kWebSocket]) {
throw new Error(
'server.handleUpgrade() was called more than once with the same ' +
'socket, possibly due to a misconfiguration'
);
}
if (this._state > RUNNING) return abortHandshake(socket, 503);
const digest = createHash('sha1')
.update(key + GUID)
.digest('base64');
const headers = [
'HTTP/1.1 101 Switching Protocols',
'Upgrade: websocket',
'Connection: Upgrade',
`Sec-WebSocket-Accept: ${digest}`
];
const ws = new WebSocket(null);
if (protocols.size) {
//
// Optionally call external protocol selection handler.
//
const protocol = this.options.handleProtocols
? this.options.handleProtocols(protocols, req)
: protocols.values().next().value;
if (protocol) {
headers.push(`Sec-WebSocket-Protocol: ${protocol}`);
ws._protocol = protocol;
}
}
if (extensions[PerMessageDeflate.extensionName]) {
const params = extensions[PerMessageDeflate.extensionName].params;
const value = extension.format({
[PerMessageDeflate.extensionName]: [params]
});
headers.push(`Sec-WebSocket-Extensions: ${value}`);
ws._extensions = extensions;
}
//
// Allow external modification/inspection of handshake headers.
//
this.emit('headers', headers, req);
socket.write(headers.concat('\r\n').join('\r\n'));
socket.removeListener('error', socketOnError);
ws.setSocket(socket, head, {
maxPayload: this.options.maxPayload,
skipUTF8Validation: this.options.skipUTF8Validation
});
if (this.clients) {
this.clients.add(ws);
ws.on('close', () => {
this.clients.delete(ws);
if (this._shouldEmitClose && !this.clients.size) {
process.nextTick(emitClose, this);
}
});
}
cb(ws, req);
}
}
module.exports = WebSocketServer;
/**
* Add event listeners on an `EventEmitter` using a map of <event, listener>
* pairs.
*
* @param {EventEmitter} server The event emitter
* @param {Object.<String, Function>} map The listeners to add
* @return {Function} A function that will remove the added listeners when
* called
* @private
*/
function addListeners(server, map) {
for (const event of Object.keys(map)) server.on(event, map[event]);
return function removeListeners() {
for (const event of Object.keys(map)) {
server.removeListener(event, map[event]);
}
};
}
/**
* Emit a `'close'` event on an `EventEmitter`.
*
* @param {EventEmitter} server The event emitter
* @private
*/
function emitClose(server) {
server._state = CLOSED;
server.emit('close');
}
/**
* Handle premature socket errors.
*
* @private
*/
function socketOnError() {
this.destroy();
}
/**
* Close the connection when preconditions are not fulfilled.
*
* @param {(net.Socket|tls.Socket)} socket The socket of the upgrade request
* @param {Number} code The HTTP response status code
* @param {String} [message] The HTTP response body
* @param {Object} [headers] Additional HTTP response headers
* @private
*/
function abortHandshake(socket, code, message, headers) {
if (socket.writable) {
message = message || http.STATUS_CODES[code];
headers = {
Connection: 'close',
'Content-Type': 'text/html',
'Content-Length': Buffer.byteLength(message),
...headers
};
socket.write(
`HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\r\n` +
Object.keys(headers)
.map((h) => `${h}: ${headers[h]}`)
.join('\r\n') +
'\r\n\r\n' +
message
);
}
socket.removeListener('error', socketOnError);
socket.destroy();
}

1149
mock_ws_server/node_modules/ws/lib/websocket.js generated vendored Normal file

File diff suppressed because it is too large Load Diff

61
mock_ws_server/node_modules/ws/package.json generated vendored Normal file
View File

@ -0,0 +1,61 @@
{
"name": "ws",
"version": "8.2.3",
"description": "Simple to use, blazing fast and thoroughly tested websocket client and server for Node.js",
"keywords": [
"HyBi",
"Push",
"RFC-6455",
"WebSocket",
"WebSockets",
"real-time"
],
"homepage": "https://github.com/websockets/ws",
"bugs": "https://github.com/websockets/ws/issues",
"repository": "websockets/ws",
"author": "Einar Otto Stangvik <einaros@gmail.com> (http://2x.io)",
"license": "MIT",
"main": "index.js",
"exports": {
"import": "./wrapper.mjs",
"require": "./index.js"
},
"browser": "browser.js",
"engines": {
"node": ">=10.0.0"
},
"files": [
"browser.js",
"index.js",
"lib/*.js",
"wrapper.mjs"
],
"scripts": {
"test": "nyc --reporter=lcov --reporter=text mocha --throw-deprecation test/*.test.js",
"integration": "mocha --throw-deprecation test/*.integration.js",
"lint": "eslint --ignore-path .gitignore . && prettier --check --ignore-path .gitignore \"**/*.{json,md,yaml,yml}\""
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": "^5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
},
"devDependencies": {
"benchmark": "^2.1.4",
"bufferutil": "^4.0.1",
"eslint": "^7.2.0",
"eslint-config-prettier": "^8.1.0",
"eslint-plugin-prettier": "^4.0.0",
"mocha": "^8.4.0",
"nyc": "^15.0.0",
"prettier": "^2.0.5",
"utf-8-validate": "^5.0.2"
}
}

8
mock_ws_server/node_modules/ws/wrapper.mjs generated vendored Normal file
View File

@ -0,0 +1,8 @@
import createWebSocketStream from './lib/stream.js';
import Receiver from './lib/receiver.js';
import Sender from './lib/sender.js';
import WebSocket from './lib/websocket.js';
import WebSocketServer from './lib/websocket-server.js';
export { createWebSocketStream, Receiver, Sender, WebSocket, WebSocketServer };
export default WebSocket;

43
mock_ws_server/package-lock.json generated Normal file
View File

@ -0,0 +1,43 @@
{
"name": "mock_ws_server",
"version": "1.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"ws": "^8.2.3"
}
},
"node_modules/ws": {
"version": "8.2.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
"integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": "^5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
}
},
"dependencies": {
"ws": {
"version": "8.2.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
"integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
"requires": {}
}
}
}

View File

@ -0,0 +1,15 @@
{
"name": "mock_ws_server",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"ws": "^8.2.3"
},
"type": "module"
}

35
mock_ws_server/server.js Normal file
View File

@ -0,0 +1,35 @@
import { WebSocketServer } from 'ws';
const wss = new WebSocketServer({ port: 8080 });
const delay = ms => new Promise(resolve => setTimeout(resolve, ms))
wss.on('connection', function connection(ws) {
console.log("Connection made")
ws.on('message', async function message(data) {
data = JSON.parse(data.toString())
console.log("Message received", data.toString())
if(data.topic == "start_test"){
for (var i = 0; i <= 10; i++) {
await delay(1000);
ws.send(
JSON.stringify(
{
"topic": "data",
"data" :
{
"ts": Date.now(),
"temp_before_radiator": Math.random(),
"temp_after_radiator": Math.random(),
"pressure_before_radiator": Math.random(),
"pressure_after_radiator": Math.random(),
"wind_speed": Math.random()
}
}
)
);
}
ws.send(JSON.stringify({topic: "end_test"}));
}
});
});

21
platformio.ini Normal file
View File

@ -0,0 +1,21 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:d1_mini]
platform = espressif8266
board = d1_mini
framework = arduino
monitor_speed = 115200
lib_deps =
ottowinter/ESPAsyncWebServer-esphome@^2.1.0
adafruit/Adafruit BMP3XX Library@^2.1.1
adafruit/Adafruit BusIO@^1.9.3
Wire
SPI

33
src/main.cpp Normal file
View File

@ -0,0 +1,33 @@
#include <Arduino.h>
double ohm_to_celsius(float measurement, int temp_range_step)
{
int lower_bin_edge = (int) measurement % temp_range_step;
return 0.0;
}
double floatmap(float x, float in_min, float in_max, float out_min, float out_max)
{
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
float readTemperature()
{
int temp = analogRead(A0);
float ohm = (1000.0/3.3)*temp;
return ohm;
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
int temp_range_start = 300;
int temp_range_end = -55;
int temp_range_step = 10;
float tempistor_y[35] = {519910.0, 158090.0, 71668.0, 44087.0, 27936.0, 18187.0, 12136.0, 8284.0, 5774.0, 4103.0, 2967.0, 2182.0, 1629.0, 1234.0, 946.6, 735.5, 578.1, 459.4, 368.8, 298.9, 244.4, 201.6, 167.6, 140.4, 118.5, 100.7, 86.08, 74.05, 64.08, 55.75, 48.76, 42.87, 37.86, 33.59, 29.94 };
}
void loop() {
// put your main code here, to run repeatedly:
}

11
test/README Normal file
View File

@ -0,0 +1,11 @@
This directory is intended for PlatformIO Unit Testing and project tests.
Unit Testing is a software testing method by which individual units of
source code, sets of one or more MCU program modules together with associated
control data, usage procedures, and operating procedures, are tested to
determine whether they are fit for use. Unit testing finds problems early
in the development cycle.
More information about PlatformIO Unit Testing:
- https://docs.platformio.org/page/plus/unit-testing.html