Skip to content

Commit 5aed7ce

Browse files
committed
renaming
1 parent e52613d commit 5aed7ce

File tree

1 file changed

+40
-28
lines changed

1 file changed

+40
-28
lines changed

packages/proxy/lib/http/util/service-worker-rewriter.ts

+40-28
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* @returns the rewritten service worker
77
*/
88
export const rewriteServiceWorker = (body: Buffer) => {
9-
function __cypressCreateListenerFunction (listener) {
9+
function __cypressWrapListener (listener: Function) {
1010
return (event) => {
1111
// we want to override the respondWith method so we can track if it was called
1212
// to determine if the service worker handled the request
@@ -28,50 +28,60 @@ export const rewriteServiceWorker = (body: Buffer) => {
2828
}
2929
}
3030

31-
function __cypressOverwriteAddRemoveEventListener () {
32-
const _listeners = new WeakMap()
33-
const _capturedListeners = new WeakMap()
34-
const _handleEvents = new WeakMap()
31+
function __cypressOverwriteAddRemoveEventListeners () {
32+
const _nonCaptureListenersMap = new WeakMap<EventListenerOrEventListenerObject, EventListenerOrEventListenerObject>()
33+
const _captureListenersMap = new WeakMap<EventListenerOrEventListenerObject, EventListenerOrEventListenerObject>()
34+
const _handleEventsMap = new WeakMap<Object, EventListenerOrEventListenerObject>()
3535

36-
const canWrapListener = (listener) => {
36+
// A listener is considered valid if it is a function, an object with a handleEvent method, or an object (the handleEvent function could be added later)
37+
const isValidListener = (listener: EventListenerOrEventListenerObject) => {
3738
return typeof listener === 'function' || listener?.handleEvent || typeof listener === 'object'
3839
}
3940

41+
// Get the capture value from the options
42+
const getCaptureValue = (options?: boolean | AddEventListenerOptions) => {
43+
return typeof options === 'boolean' ? options : options?.capture
44+
}
45+
4046
const oldAddEventListener = self.addEventListener
4147

42-
// Overwrite the addEventListener method so we can
43-
// determine if the service worker handled the request
48+
// Overwrite the addEventListener method so we can determine if the service worker handled the request
49+
// https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
4450
self.addEventListener = (type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions) => {
45-
if (type === 'fetch' && canWrapListener(listener)) {
51+
if (type === 'fetch' && isValidListener(listener)) {
4652
let newListener
4753

4854
// If the listener is a function, we can just wrap it
4955
// If the listener is an object with a handleEvent method, we can wrap that method
5056
// Otherwise, we need to wrap the listener in a proxy so we can track and wrap the handleEvent function
5157
if (typeof listener === 'function') {
52-
newListener = __cypressCreateListenerFunction(listener)
58+
newListener = __cypressWrapListener(listener)
5359
} else if (listener?.handleEvent) {
54-
newListener = __cypressCreateListenerFunction(listener.handleEvent)
60+
newListener = __cypressWrapListener(listener.handleEvent)
5561
listener.handleEvent = newListener
5662
} else {
63+
// since the handleEvent function is being lazily created, we need to use a proxy to wrap it
5764
newListener = new Proxy(listener, {
5865
get (target, key) {
5966
if (key === 'handleEvent') {
60-
if (!_handleEvents.has(target)) {
61-
_handleEvents.set(target, __cypressCreateListenerFunction(target.handleEvent))
67+
const values = _handleEventsMap.get(target)
68+
69+
if (!values) {
70+
// TODO: also check if the handleEvent function has changed
71+
_handleEventsMap.set(target, __cypressWrapListener(target.handleEvent))
6272
}
6373

64-
return _handleEvents.get(target)
74+
return _handleEventsMap.get(target)
6575
}
6676

6777
return Reflect.get(target, key)
6878
},
6979
})
7080
}
7181

72-
const capture = typeof options === 'boolean' ? options : options?.capture
73-
74-
capture ? _capturedListeners.set(listener, newListener) : _listeners.set(listener, newListener)
82+
// get the capture value so we know which map to add the listener to
83+
// so we can then remove the listener later if requested
84+
getCaptureValue(options) ? _captureListenersMap.set(listener, newListener) : _nonCaptureListenersMap.set(listener, newListener)
7585

7686
return oldAddEventListener(type, newListener, options)
7787
}
@@ -81,20 +91,22 @@ export const rewriteServiceWorker = (body: Buffer) => {
8191

8292
const oldRemoveEventListener = self.removeEventListener
8393

84-
// Overwrite the removeEventListener method so we can
85-
// remove the listener from the map
94+
// Overwrite the removeEventListener method so we can remove the listener from the map
95+
// https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener
8696
self.removeEventListener = (type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions) => {
87-
if (type === 'fetch' && canWrapListener(listener)) {
88-
const capture = typeof options === 'boolean' ? options : options?.capture
89-
const newListener = capture ? _capturedListeners.get(listener) : _listeners.get(listener)
97+
if (type === 'fetch' && isValidListener(listener)) {
98+
// get the capture value so we know which map to remove the listener from
99+
const capture = getCaptureValue(options)
100+
const newListener = capture ? _captureListenersMap.get(listener) : _nonCaptureListenersMap.get(listener)
90101

91-
capture ? _capturedListeners.delete(listener) : _listeners.delete(listener)
102+
capture ? _captureListenersMap.delete(listener) : _nonCaptureListenersMap.delete(listener)
92103

104+
// If the listener is an object with a handleEvent method, we need to remove the wrapped function
93105
if (typeof listener === 'object' && typeof listener.handleEvent === 'function') {
94-
_handleEvents.delete(listener)
106+
_handleEventsMap.delete(listener)
95107
}
96108

97-
return oldRemoveEventListener(type, newListener, options)
109+
return oldRemoveEventListener(type, newListener!, options)
98110
}
99111

100112
return oldRemoveEventListener(type, listener, options)
@@ -126,7 +138,7 @@ export const rewriteServiceWorker = (body: Buffer) => {
126138
let newHandler
127139

128140
if (value) {
129-
newHandler = __cypressCreateListenerFunction(value)
141+
newHandler = __cypressWrapListener(value)
130142
}
131143

132144
originalPropertyDescriptor.set?.call(this, newHandler)
@@ -136,8 +148,8 @@ export const rewriteServiceWorker = (body: Buffer) => {
136148
}
137149

138150
const updatedBody = `
139-
${__cypressCreateListenerFunction};
140-
(${__cypressOverwriteAddRemoveEventListener})();
151+
${__cypressWrapListener};
152+
(${__cypressOverwriteAddRemoveEventListeners})();
141153
(${__cypressOverwriteOnfetch})();
142154
${body}`
143155

0 commit comments

Comments
 (0)