slidge-whatsapp 0.3.7__cp312-cp312-manylinux_2_41_aarch64.whl → 0.3.8__cp312-cp312-manylinux_2_41_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. slidge_whatsapp/config.py +7 -2
  2. slidge_whatsapp/contact.py +3 -2
  3. slidge_whatsapp/event.go +14 -9
  4. slidge_whatsapp/gateway.go +7 -1
  5. slidge_whatsapp/generated/_whatsapp.cpython-312-aarch64-linux-gnu.h +182 -178
  6. slidge_whatsapp/generated/_whatsapp.cpython-312-aarch64-linux-gnu.so +0 -0
  7. slidge_whatsapp/generated/build.py +146 -142
  8. slidge_whatsapp/generated/whatsapp.c +1456 -1376
  9. slidge_whatsapp/generated/whatsapp.go +1069 -1045
  10. slidge_whatsapp/generated/whatsapp.py +1324 -1298
  11. slidge_whatsapp/generated/whatsapp_go.h +182 -178
  12. slidge_whatsapp/go.mod +6 -6
  13. slidge_whatsapp/go.sum +12 -12
  14. slidge_whatsapp/group.py +25 -0
  15. slidge_whatsapp/session.go +69 -67
  16. slidge_whatsapp/session.py +11 -1
  17. slidge_whatsapp/vendor/github.com/coder/websocket/LICENSE.txt +13 -0
  18. slidge_whatsapp/vendor/github.com/coder/websocket/Makefile +18 -0
  19. slidge_whatsapp/vendor/github.com/coder/websocket/README.md +162 -0
  20. slidge_whatsapp/vendor/github.com/coder/websocket/accept.go +378 -0
  21. slidge_whatsapp/vendor/github.com/coder/websocket/close.go +335 -0
  22. slidge_whatsapp/vendor/github.com/coder/websocket/compress.go +234 -0
  23. slidge_whatsapp/vendor/github.com/coder/websocket/conn.go +306 -0
  24. slidge_whatsapp/vendor/github.com/coder/websocket/dial.go +347 -0
  25. slidge_whatsapp/vendor/github.com/coder/websocket/doc.go +33 -0
  26. slidge_whatsapp/vendor/github.com/coder/websocket/errors.go +8 -0
  27. slidge_whatsapp/vendor/github.com/coder/websocket/frame.go +173 -0
  28. slidge_whatsapp/vendor/github.com/coder/websocket/hijack.go +33 -0
  29. slidge_whatsapp/vendor/github.com/coder/websocket/internal/bpool/bpool.go +25 -0
  30. slidge_whatsapp/vendor/github.com/coder/websocket/internal/errd/wrap.go +14 -0
  31. slidge_whatsapp/vendor/github.com/coder/websocket/internal/util/util.go +15 -0
  32. slidge_whatsapp/vendor/github.com/coder/websocket/internal/wsjs/wsjs_js.go +169 -0
  33. slidge_whatsapp/vendor/github.com/coder/websocket/mask.go +128 -0
  34. slidge_whatsapp/vendor/github.com/coder/websocket/mask_amd64.s +127 -0
  35. slidge_whatsapp/vendor/github.com/coder/websocket/mask_arm64.s +72 -0
  36. slidge_whatsapp/vendor/github.com/coder/websocket/mask_asm.go +26 -0
  37. slidge_whatsapp/vendor/github.com/coder/websocket/mask_go.go +7 -0
  38. slidge_whatsapp/vendor/github.com/coder/websocket/netconn.go +233 -0
  39. slidge_whatsapp/vendor/github.com/coder/websocket/netconn_js.go +11 -0
  40. slidge_whatsapp/vendor/github.com/coder/websocket/netconn_notjs.go +19 -0
  41. slidge_whatsapp/vendor/github.com/coder/websocket/read.go +540 -0
  42. slidge_whatsapp/vendor/github.com/coder/websocket/stringer.go +91 -0
  43. slidge_whatsapp/vendor/github.com/coder/websocket/write.go +384 -0
  44. slidge_whatsapp/vendor/github.com/coder/websocket/ws_js.go +598 -0
  45. slidge_whatsapp/vendor/github.com/ebitengine/purego/func.go +1 -1
  46. slidge_whatsapp/vendor/github.com/ebitengine/purego/struct_amd64.go +1 -1
  47. slidge_whatsapp/vendor/github.com/ebitengine/purego/struct_arm64.go +3 -1
  48. slidge_whatsapp/vendor/github.com/ebitengine/purego/struct_loong64.go +1 -1
  49. slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/directive.go +3 -0
  50. slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/selection.go +3 -0
  51. slidge_whatsapp/vendor/github.com/vektah/gqlparser/v2/ast/value.go +4 -3
  52. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/encode.go +3 -0
  53. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate.go +18 -4
  54. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/broadcast.go +3 -3
  55. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/call.go +6 -4
  56. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/client.go +90 -80
  57. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/connectionevents.go +14 -11
  58. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download.go +4 -1
  59. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/group.go +47 -48
  60. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/handshake.go +3 -2
  61. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/internals.go +79 -75
  62. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/keepalive.go +8 -6
  63. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/mediaconn.go +1 -2
  64. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/mediaretry.go +2 -2
  65. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/message.go +42 -40
  66. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/newsletter.go +35 -32
  67. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/notification.go +2 -3
  68. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/pair-code.go +2 -4
  69. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/pair.go +19 -19
  70. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/prekeys.go +9 -8
  71. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/presence.go +9 -9
  72. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/privacysettings.go +4 -5
  73. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloAddMessage/InstamadilloAddMessage.pb.go +1 -1
  74. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeActionLog/InstamadilloCoreTypeActionLog.pb.go +1 -1
  75. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeAdminMessage/InstamadilloCoreTypeAdminMessage.pb.go +1 -1
  76. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeCollection/InstamadilloCoreTypeCollection.pb.go +1 -1
  77. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeLink/InstamadilloCoreTypeLink.pb.go +1 -1
  78. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeMedia/InstamadilloCoreTypeMedia.pb.go +1 -1
  79. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloCoreTypeText/InstamadilloCoreTypeText.pb.go +1 -1
  80. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloDeleteMessage/InstamadilloDeleteMessage.pb.go +1 -1
  81. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloSupplementMessage/InstamadilloSupplementMessage.pb.go +1 -1
  82. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloTransportPayload/InstamadilloTransportPayload.pb.go +1 -1
  83. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/instamadilloXmaContentRef/InstamadilloXmaContentRef.pb.go +1 -1
  84. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waAICommon/WAAICommon.pb.go +1145 -335
  85. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waAICommon/WAAICommon.proto +78 -0
  86. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waAdv/WAAdv.pb.go +1 -1
  87. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.pb.go +1 -1
  88. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.pb.go +1 -1
  89. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCert/WACert.pb.go +1 -1
  90. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waChatLockSettings/WAProtobufsChatLockSettings.pb.go +1 -1
  91. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.pb.go +1 -1
  92. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/WACompanionReg.pb.go +22 -4
  93. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/WACompanionReg.proto +2 -0
  94. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waConsumerApplication/WAConsumerApplication.pb.go +1 -1
  95. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.pb.go +104 -30
  96. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.proto +7 -0
  97. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.pb.go +1037 -963
  98. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.proto +15 -8
  99. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.pb.go +1 -1
  100. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waLidMigrationSyncPayload/WAWebProtobufLidMigrationSyncPayload.pb.go +1 -1
  101. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.pb.go +1 -1
  102. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.pb.go +1 -1
  103. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.pb.go +1 -1
  104. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/WAMsgTransport.pb.go +1 -1
  105. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMultiDevice/WAMultiDevice.pb.go +1 -1
  106. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waServerSync/WAServerSync.pb.go +1 -1
  107. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waStatusAttributions/WAStatusAttributions.pb.go +40 -35
  108. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waStatusAttributions/WAStatusAttributions.proto +1 -0
  109. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.pb.go +921 -653
  110. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.proto +44 -15
  111. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waUserPassword/WAProtobufsUserPassword.pb.go +1 -1
  112. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waVnameCert/WAWebProtobufsVnameCert.pb.go +1 -1
  113. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.pb.go +9 -5
  114. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.proto +1 -0
  115. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.pb.go +193 -115
  116. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.proto +9 -0
  117. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/push.go +2 -4
  118. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/receipt.go +12 -12
  119. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/request.go +25 -19
  120. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/retry.go +2 -2
  121. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/send.go +43 -27
  122. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/sendfb.go +4 -4
  123. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/socket/constants.go +1 -1
  124. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/socket/framesocket.go +43 -56
  125. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/socket/noisehandshake.go +9 -3
  126. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/socket/noisesocket.go +36 -22
  127. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/clientpayload.go +24 -4
  128. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/store.go +12 -0
  129. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/events/appstate.go +2 -1
  130. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/upload.go +1 -1
  131. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/user.go +79 -40
  132. slidge_whatsapp/vendor/golang.org/x/sys/unix/mkerrors.sh +2 -0
  133. slidge_whatsapp/vendor/golang.org/x/sys/unix/syscall_linux.go +6 -0
  134. slidge_whatsapp/vendor/golang.org/x/sys/unix/zerrors_linux.go +359 -0
  135. slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_linux.go +10 -0
  136. slidge_whatsapp/vendor/golang.org/x/sys/unix/ztypes_linux.go +31 -0
  137. slidge_whatsapp/vendor/golang.org/x/sys/windows/syscall_windows.go +15 -0
  138. slidge_whatsapp/vendor/golang.org/x/sys/windows/types_windows.go +76 -0
  139. slidge_whatsapp/vendor/golang.org/x/sys/windows/zsyscall_windows.go +37 -0
  140. slidge_whatsapp/vendor/modules.txt +12 -8
  141. {slidge_whatsapp-0.3.7.dist-info → slidge_whatsapp-0.3.8.dist-info}/METADATA +1 -1
  142. {slidge_whatsapp-0.3.7.dist-info → slidge_whatsapp-0.3.8.dist-info}/RECORD +145 -136
  143. slidge_whatsapp/vendor/github.com/gorilla/websocket/.gitignore +0 -25
  144. slidge_whatsapp/vendor/github.com/gorilla/websocket/AUTHORS +0 -9
  145. slidge_whatsapp/vendor/github.com/gorilla/websocket/LICENSE +0 -22
  146. slidge_whatsapp/vendor/github.com/gorilla/websocket/README.md +0 -33
  147. slidge_whatsapp/vendor/github.com/gorilla/websocket/client.go +0 -434
  148. slidge_whatsapp/vendor/github.com/gorilla/websocket/compression.go +0 -148
  149. slidge_whatsapp/vendor/github.com/gorilla/websocket/conn.go +0 -1238
  150. slidge_whatsapp/vendor/github.com/gorilla/websocket/doc.go +0 -227
  151. slidge_whatsapp/vendor/github.com/gorilla/websocket/join.go +0 -42
  152. slidge_whatsapp/vendor/github.com/gorilla/websocket/json.go +0 -60
  153. slidge_whatsapp/vendor/github.com/gorilla/websocket/mask.go +0 -55
  154. slidge_whatsapp/vendor/github.com/gorilla/websocket/mask_safe.go +0 -16
  155. slidge_whatsapp/vendor/github.com/gorilla/websocket/prepared.go +0 -102
  156. slidge_whatsapp/vendor/github.com/gorilla/websocket/proxy.go +0 -77
  157. slidge_whatsapp/vendor/github.com/gorilla/websocket/server.go +0 -365
  158. slidge_whatsapp/vendor/github.com/gorilla/websocket/tls_handshake.go +0 -21
  159. slidge_whatsapp/vendor/github.com/gorilla/websocket/tls_handshake_116.go +0 -21
  160. slidge_whatsapp/vendor/github.com/gorilla/websocket/util.go +0 -298
  161. slidge_whatsapp/vendor/github.com/gorilla/websocket/x_net_proxy.go +0 -473
  162. {slidge_whatsapp-0.3.7.dist-info → slidge_whatsapp-0.3.8.dist-info}/WHEEL +0 -0
  163. {slidge_whatsapp-0.3.7.dist-info → slidge_whatsapp-0.3.8.dist-info}/entry_points.txt +0 -0
  164. {slidge_whatsapp-0.3.7.dist-info → slidge_whatsapp-0.3.8.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,384 @@
1
+ //go:build !js
2
+
3
+ package websocket
4
+
5
+ import (
6
+ "bufio"
7
+ "compress/flate"
8
+ "context"
9
+ "crypto/rand"
10
+ "encoding/binary"
11
+ "errors"
12
+ "fmt"
13
+ "io"
14
+ "net"
15
+ "time"
16
+
17
+ "github.com/coder/websocket/internal/errd"
18
+ "github.com/coder/websocket/internal/util"
19
+ )
20
+
21
+ // Writer returns a writer bounded by the context that will write
22
+ // a WebSocket message of type dataType to the connection.
23
+ //
24
+ // You must close the writer once you have written the entire message.
25
+ //
26
+ // Only one writer can be open at a time, multiple calls will block until the previous writer
27
+ // is closed.
28
+ func (c *Conn) Writer(ctx context.Context, typ MessageType) (io.WriteCloser, error) {
29
+ w, err := c.writer(ctx, typ)
30
+ if err != nil {
31
+ return nil, fmt.Errorf("failed to get writer: %w", err)
32
+ }
33
+ return w, nil
34
+ }
35
+
36
+ // Write writes a message to the connection.
37
+ //
38
+ // See the Writer method if you want to stream a message.
39
+ //
40
+ // If compression is disabled or the compression threshold is not met, then it
41
+ // will write the message in a single frame.
42
+ func (c *Conn) Write(ctx context.Context, typ MessageType, p []byte) error {
43
+ _, err := c.write(ctx, typ, p)
44
+ if err != nil {
45
+ return fmt.Errorf("failed to write msg: %w", err)
46
+ }
47
+ return nil
48
+ }
49
+
50
+ type msgWriter struct {
51
+ c *Conn
52
+
53
+ mu *mu
54
+ writeMu *mu
55
+ closed bool
56
+
57
+ ctx context.Context
58
+ opcode opcode
59
+ flate bool
60
+
61
+ trimWriter *trimLastFourBytesWriter
62
+ flateWriter *flate.Writer
63
+ }
64
+
65
+ func newMsgWriter(c *Conn) *msgWriter {
66
+ mw := &msgWriter{
67
+ c: c,
68
+ mu: newMu(c),
69
+ writeMu: newMu(c),
70
+ }
71
+ return mw
72
+ }
73
+
74
+ func (mw *msgWriter) ensureFlate() {
75
+ if mw.trimWriter == nil {
76
+ mw.trimWriter = &trimLastFourBytesWriter{
77
+ w: util.WriterFunc(mw.write),
78
+ }
79
+ }
80
+
81
+ if mw.flateWriter == nil {
82
+ mw.flateWriter = getFlateWriter(mw.trimWriter)
83
+ }
84
+ mw.flate = true
85
+ }
86
+
87
+ func (mw *msgWriter) flateContextTakeover() bool {
88
+ if mw.c.client {
89
+ return !mw.c.copts.clientNoContextTakeover
90
+ }
91
+ return !mw.c.copts.serverNoContextTakeover
92
+ }
93
+
94
+ func (c *Conn) writer(ctx context.Context, typ MessageType) (io.WriteCloser, error) {
95
+ err := c.msgWriter.reset(ctx, typ)
96
+ if err != nil {
97
+ return nil, err
98
+ }
99
+ return c.msgWriter, nil
100
+ }
101
+
102
+ func (c *Conn) write(ctx context.Context, typ MessageType, p []byte) (int, error) {
103
+ mw, err := c.writer(ctx, typ)
104
+ if err != nil {
105
+ return 0, err
106
+ }
107
+
108
+ if !c.flate() {
109
+ defer c.msgWriter.mu.unlock()
110
+ return c.writeFrame(ctx, true, false, c.msgWriter.opcode, p)
111
+ }
112
+
113
+ n, err := mw.Write(p)
114
+ if err != nil {
115
+ return n, err
116
+ }
117
+
118
+ err = mw.Close()
119
+ return n, err
120
+ }
121
+
122
+ func (mw *msgWriter) reset(ctx context.Context, typ MessageType) error {
123
+ err := mw.mu.lock(ctx)
124
+ if err != nil {
125
+ return err
126
+ }
127
+
128
+ mw.ctx = ctx
129
+ mw.opcode = opcode(typ)
130
+ mw.flate = false
131
+ mw.closed = false
132
+
133
+ mw.trimWriter.reset()
134
+
135
+ return nil
136
+ }
137
+
138
+ func (mw *msgWriter) putFlateWriter() {
139
+ if mw.flateWriter != nil {
140
+ putFlateWriter(mw.flateWriter)
141
+ mw.flateWriter = nil
142
+ }
143
+ }
144
+
145
+ // Write writes the given bytes to the WebSocket connection.
146
+ func (mw *msgWriter) Write(p []byte) (_ int, err error) {
147
+ err = mw.writeMu.lock(mw.ctx)
148
+ if err != nil {
149
+ return 0, fmt.Errorf("failed to write: %w", err)
150
+ }
151
+ defer mw.writeMu.unlock()
152
+
153
+ if mw.closed {
154
+ return 0, errors.New("cannot use closed writer")
155
+ }
156
+
157
+ defer func() {
158
+ if err != nil {
159
+ err = fmt.Errorf("failed to write: %w", err)
160
+ }
161
+ }()
162
+
163
+ if mw.c.flate() {
164
+ // Only enables flate if the length crosses the
165
+ // threshold on the first frame
166
+ if mw.opcode != opContinuation && len(p) >= mw.c.flateThreshold {
167
+ mw.ensureFlate()
168
+ }
169
+ }
170
+
171
+ if mw.flate {
172
+ return mw.flateWriter.Write(p)
173
+ }
174
+
175
+ return mw.write(p)
176
+ }
177
+
178
+ func (mw *msgWriter) write(p []byte) (int, error) {
179
+ n, err := mw.c.writeFrame(mw.ctx, false, mw.flate, mw.opcode, p)
180
+ if err != nil {
181
+ return n, fmt.Errorf("failed to write data frame: %w", err)
182
+ }
183
+ mw.opcode = opContinuation
184
+ return n, nil
185
+ }
186
+
187
+ // Close flushes the frame to the connection.
188
+ func (mw *msgWriter) Close() (err error) {
189
+ defer errd.Wrap(&err, "failed to close writer")
190
+
191
+ err = mw.writeMu.lock(mw.ctx)
192
+ if err != nil {
193
+ return err
194
+ }
195
+ defer mw.writeMu.unlock()
196
+
197
+ if mw.closed {
198
+ return errors.New("writer already closed")
199
+ }
200
+ mw.closed = true
201
+
202
+ if mw.flate {
203
+ err = mw.flateWriter.Flush()
204
+ if err != nil {
205
+ return fmt.Errorf("failed to flush flate: %w", err)
206
+ }
207
+ }
208
+
209
+ _, err = mw.c.writeFrame(mw.ctx, true, mw.flate, mw.opcode, nil)
210
+ if err != nil {
211
+ return fmt.Errorf("failed to write fin frame: %w", err)
212
+ }
213
+
214
+ if mw.flate && !mw.flateContextTakeover() {
215
+ mw.putFlateWriter()
216
+ }
217
+ mw.mu.unlock()
218
+ return nil
219
+ }
220
+
221
+ func (mw *msgWriter) close() {
222
+ if mw.c.client {
223
+ mw.c.writeFrameMu.forceLock()
224
+ putBufioWriter(mw.c.bw)
225
+ }
226
+
227
+ mw.writeMu.forceLock()
228
+ mw.putFlateWriter()
229
+ }
230
+
231
+ func (c *Conn) writeControl(ctx context.Context, opcode opcode, p []byte) error {
232
+ ctx, cancel := context.WithTimeout(ctx, time.Second*5)
233
+ defer cancel()
234
+
235
+ _, err := c.writeFrame(ctx, true, false, opcode, p)
236
+ if err != nil {
237
+ return fmt.Errorf("failed to write control frame %v: %w", opcode, err)
238
+ }
239
+ return nil
240
+ }
241
+
242
+ // writeFrame handles all writes to the connection.
243
+ func (c *Conn) writeFrame(ctx context.Context, fin bool, flate bool, opcode opcode, p []byte) (_ int, err error) {
244
+ err = c.writeFrameMu.lock(ctx)
245
+ if err != nil {
246
+ return 0, err
247
+ }
248
+ defer c.writeFrameMu.unlock()
249
+
250
+ defer func() {
251
+ if c.isClosed() && opcode == opClose {
252
+ err = nil
253
+ }
254
+ if err != nil {
255
+ if ctx.Err() != nil {
256
+ err = ctx.Err()
257
+ } else if c.isClosed() {
258
+ err = net.ErrClosed
259
+ }
260
+ err = fmt.Errorf("failed to write frame: %w", err)
261
+ }
262
+ }()
263
+
264
+ c.closeStateMu.Lock()
265
+ closeSentErr := c.closeSentErr
266
+ c.closeStateMu.Unlock()
267
+ if closeSentErr != nil {
268
+ return 0, net.ErrClosed
269
+ }
270
+
271
+ select {
272
+ case <-c.closed:
273
+ return 0, net.ErrClosed
274
+ default:
275
+ }
276
+ c.setupWriteTimeout(ctx)
277
+ defer c.clearWriteTimeout()
278
+
279
+ c.writeHeader.fin = fin
280
+ c.writeHeader.opcode = opcode
281
+ c.writeHeader.payloadLength = int64(len(p))
282
+
283
+ if c.client {
284
+ c.writeHeader.masked = true
285
+ _, err = io.ReadFull(rand.Reader, c.writeHeaderBuf[:4])
286
+ if err != nil {
287
+ return 0, fmt.Errorf("failed to generate masking key: %w", err)
288
+ }
289
+ c.writeHeader.maskKey = binary.LittleEndian.Uint32(c.writeHeaderBuf[:])
290
+ }
291
+
292
+ c.writeHeader.rsv1 = false
293
+ if flate && (opcode == opText || opcode == opBinary) {
294
+ c.writeHeader.rsv1 = true
295
+ }
296
+
297
+ err = writeFrameHeader(c.writeHeader, c.bw, c.writeHeaderBuf[:])
298
+ if err != nil {
299
+ return 0, err
300
+ }
301
+
302
+ n, err := c.writeFramePayload(p)
303
+ if err != nil {
304
+ return n, err
305
+ }
306
+
307
+ if c.writeHeader.fin {
308
+ err = c.bw.Flush()
309
+ if err != nil {
310
+ return n, fmt.Errorf("failed to flush: %w", err)
311
+ }
312
+ }
313
+
314
+ if opcode == opClose {
315
+ c.closeStateMu.Lock()
316
+ c.closeSentErr = fmt.Errorf("sent close frame: %w", net.ErrClosed)
317
+ closeReceived := c.closeReceivedErr != nil
318
+ c.closeStateMu.Unlock()
319
+
320
+ if closeReceived && !c.casClosing() {
321
+ c.writeFrameMu.unlock()
322
+ _ = c.close()
323
+ }
324
+ }
325
+
326
+ return n, nil
327
+ }
328
+
329
+ func (c *Conn) writeFramePayload(p []byte) (n int, err error) {
330
+ defer errd.Wrap(&err, "failed to write frame payload")
331
+
332
+ if !c.writeHeader.masked {
333
+ return c.bw.Write(p)
334
+ }
335
+
336
+ maskKey := c.writeHeader.maskKey
337
+ for len(p) > 0 {
338
+ // If the buffer is full, we need to flush.
339
+ if c.bw.Available() == 0 {
340
+ err = c.bw.Flush()
341
+ if err != nil {
342
+ return n, err
343
+ }
344
+ }
345
+
346
+ // Start of next write in the buffer.
347
+ i := c.bw.Buffered()
348
+
349
+ j := min(len(p), c.bw.Available())
350
+
351
+ _, err := c.bw.Write(p[:j])
352
+ if err != nil {
353
+ return n, err
354
+ }
355
+
356
+ maskKey = mask(c.writeBuf[i:c.bw.Buffered()], maskKey)
357
+
358
+ p = p[j:]
359
+ n += j
360
+ }
361
+
362
+ return n, nil
363
+ }
364
+
365
+ // extractBufioWriterBuf grabs the []byte backing a *bufio.Writer
366
+ // and returns it.
367
+ func extractBufioWriterBuf(bw *bufio.Writer, w io.Writer) []byte {
368
+ var writeBuf []byte
369
+ bw.Reset(util.WriterFunc(func(p2 []byte) (int, error) {
370
+ writeBuf = p2[:cap(p2)]
371
+ return len(p2), nil
372
+ }))
373
+
374
+ bw.WriteByte(0)
375
+ bw.Flush()
376
+
377
+ bw.Reset(w)
378
+
379
+ return writeBuf
380
+ }
381
+
382
+ func (c *Conn) writeError(code StatusCode, err error) {
383
+ c.writeClose(code, err.Error())
384
+ }