first commit
This commit is contained in:
		
							
								
								
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										7
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
										Normal 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"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										39
									
								
								include/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								include/README
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										21
									
								
								kicad/.gitignore
									
									
									
									
										vendored
									
									
										Normal 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
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										9807
									
								
								kicad/3dshapes/wemos_d1_mini.3dshapes/FreeCAD/SLW-108-01-G-S.stp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9807
									
								
								kicad/3dshapes/wemos_d1_mini.3dshapes/FreeCAD/SLW-108-01-G-S.stp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										15271
									
								
								kicad/3dshapes/wemos_d1_mini.3dshapes/FreeCAD/TSW-108-05-G-S.stp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15271
									
								
								kicad/3dshapes/wemos_d1_mini.3dshapes/FreeCAD/TSW-108-05-G-S.stp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										15328
									
								
								kicad/3dshapes/wemos_d1_mini.3dshapes/FreeCAD/molex-usb-1050170001.stp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15328
									
								
								kicad/3dshapes/wemos_d1_mini.3dshapes/FreeCAD/molex-usb-1050170001.stp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										2793
									
								
								kicad/3dshapes/wemos_d1_mini.3dshapes/SLW-108-01-G-S.wrl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2793
									
								
								kicad/3dshapes/wemos_d1_mini.3dshapes/SLW-108-01-G-S.wrl
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										9707
									
								
								kicad/3dshapes/wemos_d1_mini.3dshapes/TSW-108-05-G-S.wrl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9707
									
								
								kicad/3dshapes/wemos_d1_mini.3dshapes/TSW-108-05-G-S.wrl
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										36454
									
								
								kicad/3dshapes/wemos_d1_mini.3dshapes/d1_mini_shield.wrl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36454
									
								
								kicad/3dshapes/wemos_d1_mini.3dshapes/d1_mini_shield.wrl
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								kicad/3dshapes/wemos_d1_mini.3dshapes/wemos d1 mini.stl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								kicad/3dshapes/wemos_d1_mini.3dshapes/wemos d1 mini.stl
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										201
									
								
								kicad/LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										201
									
								
								kicad/LICENSE
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										16
									
								
								kicad/README.md
									
									
									
									
									
										Normal 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:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										83056
									
								
								kicad/fp-info-cache
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83056
									
								
								kicad/fp-info-cache
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										3
									
								
								kicad/fp-lib-table
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								kicad/fp-lib-table
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										291
									
								
								kicad/kicad-cache.lib
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										106
									
								
								kicad/kicad.kicad_pcb
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										30
									
								
								kicad/kicad.pro
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										422
									
								
								kicad/kicad.sch
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										422
									
								
								kicad/kicad.sch-bak
									
									
									
									
									
										Normal 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
 | 
				
			||||||
							
								
								
									
										29
									
								
								kicad/libraries/fp-info-cache
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								kicad/libraries/fp-info-cache
									
									
									
									
									
										Normal 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
 | 
				
			||||||
							
								
								
									
										3
									
								
								kicad/libraries/fp-lib-table
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								kicad/libraries/fp-lib-table
									
									
									
									
									
										Normal 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 ""))
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
							
								
								
									
										3
									
								
								kicad/libraries/sym-lib-table
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								kicad/libraries/sym-lib-table
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					(sym_lib_table
 | 
				
			||||||
 | 
					  (lib (name wemos_mini)(type Legacy)(uri ${KIPRJMOD}/wemos_mini.lib)(options "")(descr ""))
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
							
								
								
									
										9
									
								
								kicad/libraries/wemos_mini.dcm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								kicad/libraries/wemos_mini.dcm
									
									
									
									
									
										Normal 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
 | 
				
			||||||
							
								
								
									
										32
									
								
								kicad/libraries/wemos_mini.lib
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								kicad/libraries/wemos_mini.lib
									
									
									
									
									
										Normal 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
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								kicad/meta/illustration1.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								kicad/meta/illustration1.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 91 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								kicad/meta/illustration2.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								kicad/meta/illustration2.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 81 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								kicad/meta/illustration3.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								kicad/meta/illustration3.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 91 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								kicad/meta/illustration4.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								kicad/meta/illustration4.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 102 KiB  | 
@ -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))
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
@ -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))
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
@ -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))
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
@ -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
									
								
							
							
						
						
									
										3
									
								
								kicad/sym-lib-table
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										46
									
								
								lib/README
									
									
									
									
									
										Normal 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
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								mock_ws_server/mock_server.zip
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								mock_ws_server/mock_server.zip
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										28
									
								
								mock_ws_server/node_modules/.package-lock.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								mock_ws_server/node_modules/.package-lock.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										19
									
								
								mock_ws_server/node_modules/ws/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										493
									
								
								mock_ws_server/node_modules/ws/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,493 @@
 | 
				
			|||||||
 | 
					# ws: a Node.js WebSocket library
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[](https://www.npmjs.com/package/ws)
 | 
				
			||||||
 | 
					[](https://github.com/websockets/ws/actions?query=workflow%3ACI+branch%3Amaster)
 | 
				
			||||||
 | 
					[](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
									
								
							
							
						
						
									
										8
									
								
								mock_ws_server/node_modules/ws/browser.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										13
									
								
								mock_ws_server/node_modules/ws/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										126
									
								
								mock_ws_server/node_modules/ws/lib/buffer-util.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										12
									
								
								mock_ws_server/node_modules/ws/lib/constants.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										266
									
								
								mock_ws_server/node_modules/ws/lib/event-target.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										203
									
								
								mock_ws_server/node_modules/ws/lib/extension.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										55
									
								
								mock_ws_server/node_modules/ws/lib/limiter.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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;
 | 
				
			||||||
							
								
								
									
										511
									
								
								mock_ws_server/node_modules/ws/lib/permessage-deflate.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										511
									
								
								mock_ws_server/node_modules/ws/lib/permessage-deflate.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										612
									
								
								mock_ws_server/node_modules/ws/lib/receiver.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										422
									
								
								mock_ws_server/node_modules/ws/lib/sender.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										180
									
								
								mock_ws_server/node_modules/ws/lib/stream.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										62
									
								
								mock_ws_server/node_modules/ws/lib/subprotocol.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										124
									
								
								mock_ws_server/node_modules/ws/lib/validation.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										485
									
								
								mock_ws_server/node_modules/ws/lib/websocket-server.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										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
									
								
							
							
						
						
									
										61
									
								
								mock_ws_server/node_modules/ws/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										8
									
								
								mock_ws_server/node_modules/ws/wrapper.mjs
									
									
									
										generated
									
									
										vendored
									
									
										Normal 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
									
								
							
							
						
						
									
										43
									
								
								mock_ws_server/package-lock.json
									
									
									
										generated
									
									
									
										Normal 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": {}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										15
									
								
								mock_ws_server/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								mock_ws_server/package.json
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										35
									
								
								mock_ws_server/server.js
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										21
									
								
								platformio.ini
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										33
									
								
								src/main.cpp
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										11
									
								
								test/README
									
									
									
									
									
										Normal 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
 | 
				
			||||||
		Reference in New Issue
	
	Block a user