at path:
ROOT
/
evenement.tar
run:
R
W
Run
.well-known
DIR
2024-07-18 07:32:21
R
W
Run
adstesting
DIR
2026-05-07 07:41:07
R
W
Run
androidfamilylocator
DIR
2026-05-07 07:41:18
R
W
Run
axelonyticslostphonefinder
DIR
2026-05-07 07:41:02
R
W
Run
axelonyticsmobiletracker
DIR
2026-05-07 07:41:18
R
W
Run
axelonyticsparentlink
DIR
2026-05-07 07:41:07
R
W
Run
callforhelp
DIR
2026-05-07 07:40:54
R
W
Run
carmanagement
DIR
2026-05-07 07:40:52
R
W
Run
devicetrackerplus
DIR
2026-05-07 07:41:03
R
W
Run
docspot
DIR
2026-05-07 07:40:54
R
W
Run
eventhybrid
DIR
2026-05-07 07:41:03
R
W
Run
excusefinder
DIR
2026-05-07 07:41:18
R
W
Run
findlostphonerapid
DIR
2026-05-07 07:41:18
R
W
Run
findmykids
DIR
2026-05-07 07:41:02
R
W
Run
foodproducts
DIR
2026-05-07 07:41:20
R
W
Run
halalfoodscanner
DIR
2026-05-07 07:41:02
R
W
Run
home
DIR
2023-09-05 11:51:03
R
W
Run
innovagictechnologies
DIR
2026-05-07 07:41:18
R
W
Run
innovagicwebsite
DIR
2026-05-07 07:41:18
R
W
Run
khalis
DIR
2026-05-07 07:40:54
R
W
Run
lastpassmanager
DIR
2026-05-07 07:41:01
R
W
Run
lostphonerainbow
DIR
2026-05-07 07:41:03
R
W
Run
lostphonetrack
DIR
2026-05-07 07:41:02
R
W
Run
lyricstudio
DIR
2026-05-07 07:40:54
R
W
Run
muffinbreak
DIR
2026-05-07 07:41:02
R
W
Run
numanarshad
DIR
2026-05-07 07:41:18
R
W
Run
offlinephonetrack
DIR
2026-05-07 07:41:01
R
W
Run
parentalcontrol
DIR
2026-05-07 07:41:02
R
W
Run
pushnoti
DIR
2026-05-07 07:41:02
R
W
Run
pushnotification
DIR
2026-05-07 07:41:07
R
W
Run
remotemouse
DIR
2026-05-07 07:40:54
R
W
Run
scrum
DIR
2026-05-07 07:40:59
R
W
Run
scrumapp
DIR
2026-05-07 07:41:20
R
W
Run
scrumhrmanagement
DIR
2026-05-07 07:41:03
R
W
Run
scrumlive
DIR
2026-05-07 07:41:02
R
W
Run
seminarhub
DIR
2026-05-07 07:41:03
R
W
Run
seventyfivechallenges
DIR
2026-05-07 07:41:06
R
W
Run
shaheer
DIR
2026-05-07 07:41:07
R
W
Run
smartswitchphone
DIR
2026-05-07 07:41:02
R
W
Run
trackviewblue
DIR
2026-05-07 07:40:52
R
W
Run
trackviewnewapp
DIR
2026-05-07 07:41:18
R
W
Run
virtualstudygroup
DIR
2026-05-07 07:41:03
R
W
Run
vkonnect
DIR
2026-05-07 07:41:06
R
W
Run
warrantyapp
DIR
2026-05-07 07:40:52
R
W
Run
wp-admin
DIR
2026-05-07 07:41:02
R
W
Run
wp-content
DIR
2026-05-07 07:40:54
R
W
Run
wp-includes
DIR
2026-05-07 07:41:18
R
W
Run
zengo
DIR
2026-05-07 07:41:18
R
W
Run
.Archive.tar
4.5 KB
2026-05-07 12:05:59
R
W
Run
Delete
Rename
.Archive.tar.gz
656 By
2026-05-07 12:05:59
R
W
Run
Delete
Rename
.Archive.zip
1.53 KB
2026-05-07 12:04:14
R
W
Run
Delete
Rename
.Sent.zip
673 By
2026-05-07 12:04:07
R
W
Run
Delete
Rename
.Trash.tar
3 KB
2026-05-07 12:05:16
R
W
Run
Delete
Rename
.Trash.tar.gz
339 By
2026-05-07 12:05:16
R
W
Run
Delete
Rename
.Trash.zip
673 By
2026-05-07 12:05:00
R
W
Run
Delete
Rename
.bash_profile.bash_profile.tar.gz
253 By
2026-05-07 11:08:49
R
W
Run
Delete
Rename
.bash_profile.tar
2 KB
2026-05-07 11:08:49
R
W
Run
Delete
Rename
.cache.tar
2.66 MB
2026-05-07 11:07:01
R
W
Run
Delete
Rename
.cache.tar.gz
1.03 MB
2026-05-07 11:07:02
R
W
Run
Delete
Rename
.cache.zip
2.62 MB
2026-05-07 11:06:11
R
W
Run
Delete
Rename
.caldav.tar
10 KB
2026-05-07 11:06:11
R
W
Run
Delete
Rename
.caldav.tar.gz
1.17 KB
2026-05-07 11:06:11
R
W
Run
Delete
Rename
.caldav.zip
4.17 KB
2026-05-07 11:05:50
R
W
Run
Delete
Rename
.channels.zip
4.34 KB
2026-05-07 12:05:08
R
W
Run
Delete
Rename
.composer.zip
320 By
2026-05-07 11:06:59
R
W
Run
Delete
Rename
.config.zip
124.06 MB
2026-05-07 11:06:08
R
W
Run
Delete
Rename
.gnupg.zip
8.08 KB
2026-05-07 11:06:45
R
W
Run
Delete
Rename
.htaccess
2.08 KB
2026-05-06 07:15:54
R
W
Run
Delete
Rename
.htaccess.htaccess.tar.gz
961 By
2026-05-07 10:04:13
R
W
Run
Delete
Rename
.htaccess.tar
4 KB
2026-05-07 10:04:13
R
W
Run
Delete
Rename
.local.tar
2 KB
2026-05-07 12:04:52
R
W
Run
Delete
Rename
.local.tar.gz
119 By
2026-05-07 12:04:52
R
W
Run
Delete
Rename
.local.zip
195 By
2026-05-07 12:04:19
R
W
Run
Delete
Rename
.lock.lock.tar.gz
107 By
2026-05-07 12:03:30
R
W
Run
Delete
Rename
.lock.tar
1.5 KB
2026-05-07 12:03:30
R
W
Run
Delete
Rename
.php.error.log.php.error.log.tar.gz
1.62 KB
2026-05-07 12:06:08
R
W
Run
Delete
Rename
.php.error.log.tar
25 KB
2026-05-07 12:06:08
R
W
Run
Delete
Rename
.razor.tar
37 KB
2026-05-07 11:06:41
R
W
Run
Delete
Rename
.razor.tar.gz
4.75 KB
2026-05-07 11:06:41
R
W
Run
Delete
Rename
.razor.zip
32.15 KB
2026-05-07 11:05:57
R
W
Run
Delete
Rename
.scrummanager@toptrendingappstudio_com.tar
758.5 KB
2026-05-07 12:07:38
R
W
Run
Delete
Rename
.scrummanager@toptrendingappstudio_com.tar.gz
299.44 KB
2026-05-07 12:07:39
R
W
Run
Delete
Rename
.scrummanager@toptrendingappstudio_com.zip
704.09 KB
2026-05-07 12:08:06
R
W
Run
Delete
Rename
.spamassassin.zip
62.23 KB
2026-05-07 11:06:46
R
W
Run
Delete
Rename
.spamassassinboxenable.spamassassinboxenable.tar.gz
117 By
2026-05-07 12:13:18
R
W
Run
Delete
Rename
.spamassassinboxenable.tar
1.5 KB
2026-05-07 12:13:18
R
W
Run
Delete
Rename
.spamassassinenable.spamassassinenable.tar.gz
114 By
2026-05-07 11:08:47
R
W
Run
Delete
Rename
.spamassassinenable.tar
1.5 KB
2026-05-07 11:08:47
R
W
Run
Delete
Rename
.ssh.tar
6.5 KB
2026-05-07 11:06:10
R
W
Run
Delete
Rename
.ssh.tar.gz
1.93 KB
2026-05-07 11:06:10
R
W
Run
Delete
Rename
.ssh.zip
3.18 KB
2026-05-07 11:05:49
R
W
Run
Delete
Rename
.subaccounts.tar
17.5 KB
2026-05-07 11:06:41
R
W
Run
Delete
Rename
.subaccounts.tar.gz
495 By
2026-05-07 11:06:41
R
W
Run
Delete
Rename
.subaccounts.zip
16.16 KB
2026-05-07 11:06:13
R
W
Run
Delete
Rename
.user.ini.tar
2.5 KB
2026-05-07 11:08:46
R
W
Run
Delete
Rename
.user.ini.user.ini.tar.gz
463 By
2026-05-07 11:08:46
R
W
Run
Delete
Rename
.wget-hsts.tar
2 KB
2026-05-07 11:06:06
R
W
Run
Delete
Rename
.wget-hsts.wget-hsts.tar.gz
270 By
2026-05-07 11:06:06
R
W
Run
Delete
Rename
.wp-cli.tar
2 KB
2026-05-07 11:06:04
R
W
Run
Delete
Rename
.wp-cli.tar.gz
125 By
2026-05-07 11:06:04
R
W
Run
Delete
Rename
.wp-cli.zip
209 By
2026-05-07 11:05:25
R
W
Run
Delete
Rename
.wp-toolkit-identifier.tar
2.5 KB
2026-05-07 11:08:50
R
W
Run
Delete
Rename
.wp-toolkit-identifier.wp-toolkit-identifier.tar.gz
669 By
2026-05-07 11:08:50
R
W
Run
Delete
Rename
115743369141451647082_scaled_uu ju jj.jpg.jpg.tar.gz
7.56 KB
2026-05-07 12:07:15
R
W
Run
Delete
Rename
115743369141451647082_scaled_uu ju jj.jpg.tar
9.5 KB
2026-05-07 12:07:15
R
W
Run
Delete
Rename
14_1000016331.jpg.jpg.tar.gz
413.83 KB
2026-05-07 12:06:07
R
W
Run
Delete
Rename
14_1000016331.jpg.tar
454.5 KB
2026-05-07 12:06:07
R
W
Run
Delete
Rename
3_1000016296.jpg.jpg.tar.gz
514.67 KB
2026-05-07 12:06:48
R
W
Run
Delete
Rename
3_1000016296.jpg.tar
552.5 KB
2026-05-07 12:06:48
R
W
Run
Delete
Rename
66.php.php.tar.gz
679.9 KB
2026-05-07 10:03:53
R
W
Run
Delete
Rename
66.php.tar
1.18 MB
2026-05-07 10:03:53
R
W
Run
Delete
Rename
666.php.php.tar.gz
24.71 KB
2026-05-07 10:03:52
R
W
Run
Delete
Rename
666.php.tar
80.5 KB
2026-05-07 10:03:52
R
W
Run
Delete
Rename
8.php
15.05 KB
2026-05-07 07:39:38
R
W
Run
Delete
Rename
8.php.php.tar.gz
4.68 KB
2026-05-07 10:03:14
R
W
Run
Delete
Rename
8.php.tar
17 KB
2026-05-07 10:03:14
R
W
Run
Delete
Rename
a.php.php.tar.gz
242 By
2026-05-07 12:05:14
R
W
Run
Delete
Rename
a.php.tar
2 KB
2026-05-07 12:05:14
R
W
Run
Delete
Rename
access-logs.tar
63.59 MB
2026-05-07 11:08:45
R
W
Run
Delete
Rename
access-logs.tar.gz
3.1 MB
2026-05-07 11:08:47
R
W
Run
Delete
Rename
awstats.tar
1.5 GB
2026-05-07 12:13:37
R
W
Run
Delete
Rename
awstats.tar.gz
109.24 MB
2026-05-07 12:14:37
R
W
Run
Delete
Rename
bayes_toks.tar
49.5 KB
2026-05-07 12:13:29
R
W
Run
Delete
Rename
bayes_toks.tar.gz
14.93 KB
2026-05-07 12:13:29
R
W
Run
Delete
Rename
bin.tar
5.68 MB
2026-05-07 12:11:50
R
W
Run
Delete
Rename
bin.tar.gz
1.21 MB
2026-05-07 11:07:03
R
W
Run
Delete
Rename
bin.zip
5.4 MB
2026-05-07 12:10:49
R
W
Run
Delete
Rename
cache.tar
2 KB
2026-05-07 12:05:54
R
W
Run
Delete
Rename
cache.tar.gz
104 By
2026-05-07 12:05:54
R
W
Run
Delete
Rename
cacheid.tar
2 KB
2026-05-07 12:05:20
R
W
Run
Delete
Rename
cacheid.tar.gz
120 By
2026-05-07 12:05:20
R
W
Run
Delete
Rename
caches.tar
59 KB
2026-05-07 12:13:18
R
W
Run
Delete
Rename
caches.tar.gz
11.1 KB
2026-05-07 12:13:18
R
W
Run
Delete
Rename
cboden.tar
224.5 KB
2026-05-07 12:12:50
R
W
Run
Delete
Rename
cboden.tar.gz
36.15 KB
2026-05-07 12:12:50
R
W
Run
Delete
Rename
cboden.zip
177.43 KB
2026-05-07 12:11:46
R
W
Run
Delete
Rename
citycam.tar
58.72 MB
2026-05-07 12:05:19
R
W
Run
Delete
Rename
citycam.tar.gz
58.29 MB
2026-05-07 12:05:22
R
W
Run
Delete
Rename
citycam.zip
58.7 MB
2026-05-07 12:05:03
R
W
Run
Delete
Rename
composer.json.json.tar.gz
337 By
2026-05-07 11:08:32
R
W
Run
Delete
Rename
composer.json.tar
2 KB
2026-05-07 11:08:32
R
W
Run
Delete
Rename
composer.lock.lock.tar.gz
9.36 KB
2026-05-07 11:08:37
R
W
Run
Delete
Rename
composer.lock.tar
84 KB
2026-05-07 11:08:37
R
W
Run
Delete
Rename
composer.tar
5.42 MB
2026-05-07 12:12:34
R
W
Run
Delete
Rename
composer.tar.gz
543.1 KB
2026-05-07 11:08:54
R
W
Run
Delete
Rename
composer.zip
2.77 MB
2026-05-07 12:12:21
R
W
Run
Delete
Rename
deletegoogleaccount_php.php.php.tar.gz
627 By
2026-05-07 12:06:23
R
W
Run
Delete
Rename
deletegoogleaccount_php.php.tar
3 KB
2026-05-07 12:06:23
R
W
Run
Delete
Rename
doctrine.tar
15.5 KB
2026-05-07 12:12:31
R
W
Run
Delete
Rename
doctrine.tar.gz
3.64 KB
2026-05-07 12:12:31
R
W
Run
Delete
Rename
doctrine.zip
11.38 KB
2026-05-07 12:12:50
R
W
Run
Delete
Rename
dompdf.tar
9.11 MB
2026-05-07 12:12:17
R
W
Run
Delete
Rename
dompdf.tar.gz
3.63 MB
2026-05-07 12:12:17
R
W
Run
Delete
Rename
dompdf.zip
9.03 MB
2026-05-07 12:11:51
R
W
Run
Delete
Rename
dovecot-acl-list.tar
1.5 KB
2026-05-07 12:06:12
R
W
Run
Delete
Rename
dovecot-acl-list.tar.gz
113 By
2026-05-07 12:06:12
R
W
Run
Delete
Rename
dovecot.list.index.log.list.index.log.tar.gz
1.48 KB
2026-05-07 12:06:53
R
W
Run
Delete
Rename
dovecot.list.index.log.tar
9 KB
2026-05-07 12:06:53
R
W
Run
Delete
Rename
egulias.zip
268.99 KB
2026-05-07 12:12:33
R
W
Run
Delete
Rename
error_log
1.23 KB
2026-05-07 14:52:10
R
W
Run
Delete
Rename
error_log.tar
4 KB
2026-05-07 12:12:40
R
W
Run
Delete
Rename
error_log.tar.gz
1.92 KB
2026-05-07 10:03:53
R
W
Run
Delete
Rename
etc.tar
24.04 MB
2026-05-07 11:06:41
R
W
Run
Delete
Rename
etc.tar.gz
795.71 KB
2026-05-07 11:06:42
R
W
Run
Delete
Rename
etc.zip
24.01 MB
2026-05-07 11:05:58
R
W
Run
Delete
Rename
evenement.tar
58.5 KB
2026-05-07 12:12:36
R
W
Run
Delete
Rename
evenement.tar.gz
8.91 KB
2026-05-07 12:12:36
R
W
Run
Delete
Rename
evenement.zip
43.7 KB
2026-05-07 12:12:22
R
W
Run
Delete
Rename
getData.php.php.tar.gz
504 By
2026-05-07 12:06:09
R
W
Run
Delete
Rename
getData.php.tar
2.5 KB
2026-05-07 12:06:09
R
W
Run
Delete
Rename
get_all_contests.php.3.php.3.tar.gz
730 By
2026-05-07 12:06:14
R
W
Run
Delete
Rename
get_all_contests.php.3.tar
3 KB
2026-05-07 12:06:14
R
W
Run
Delete
Rename
gpg.conf.conf.tar.gz
3.31 KB
2026-05-07 12:06:12
R
W
Run
Delete
Rename
gpg.conf.tar
9 KB
2026-05-07 12:06:12
R
W
Run
Delete
Rename
hmsc.so.so.tar.gz
1.33 MB
2026-05-07 12:06:01
R
W
Run
Delete
Rename
hmsc.so.tar
2.96 MB
2026-05-07 12:06:01
R
W
Run
Delete
Rename
icals.zip
3.18 KB
2026-05-07 12:12:34
R
W
Run
Delete
Rename
images.tar
241.5 KB
2026-05-07 12:13:18
R
W
Run
Delete
Rename
images.tar.gz
239.71 KB
2026-05-07 12:05:23
R
W
Run
Delete
Rename
index.php.php.tar.gz
2.05 KB
2026-05-07 11:08:28
R
W
Run
Delete
Rename
index.php.tar
11.5 KB
2026-05-07 11:08:28
R
W
Run
Delete
Rename
keys.tar
108.5 KB
2026-05-07 12:05:44
R
W
Run
Delete
Rename
keys.tar.gz
52.97 KB
2026-05-07 12:05:45
R
W
Run
Delete
Rename
laminas.zip
171.21 KB
2026-05-07 12:12:40
R
W
Run
Delete
Rename
logs.tar
86.31 MB
2026-05-07 11:06:12
R
W
Run
Delete
Rename
logs.tar.gz
34.76 MB
2026-05-07 11:06:14
R
W
Run
Delete
Rename
logs.zip
86.15 MB
2026-05-07 11:05:51
R
W
Run
Delete
Rename
mailbox_format.cpanel.cpanel.tar.gz
130 By
2026-05-07 12:06:14
R
W
Run
Delete
Rename
mailbox_format.cpanel.tar
2 KB
2026-05-07 12:06:14
R
W
Run
Delete
Rename
maildirsize.tar
6 KB
2026-05-07 12:06:10
R
W
Run
Delete
Rename
maildirsize.tar.gz
1.19 KB
2026-05-07 12:06:10
R
W
Run
Delete
Rename
new.tar
22.98 MB
2026-05-07 12:05:44
R
W
Run
Delete
Rename
new.tar.gz
1.37 MB
2026-05-07 12:05:45
R
W
Run
Delete
Rename
nvdata.zip
5 KB
2026-05-07 12:12:31
R
W
Run
Delete
Rename
p.php.php.tar.gz
307 By
2026-05-07 12:05:08
R
W
Run
Delete
Rename
p.php.tar
2 KB
2026-05-07 12:05:08
R
W
Run
Delete
Rename
phenx.tar
647.5 KB
2026-05-07 12:12:33
R
W
Run
Delete
Rename
phenx.tar.gz
117.8 KB
2026-05-07 12:12:33
R
W
Run
Delete
Rename
phenx.zip
590.77 KB
2026-05-07 12:12:18
R
W
Run
Delete
Rename
php-cli.tar
2 KB
2026-05-07 11:06:07
R
W
Run
Delete
Rename
php-cli.tar.gz
111 By
2026-05-07 11:06:07
R
W
Run
Delete
Rename
php-cli.zip
169 By
2026-05-07 11:05:47
R
W
Run
Delete
Rename
php.ini.swp.ini.swp.tar.gz
3.56 KB
2026-05-07 12:11:16
R
W
Run
Delete
Rename
php.ini.swp.tar
17.5 KB
2026-05-07 12:11:16
R
W
Run
Delete
Rename
php.tar
12 KB
2026-05-07 11:14:27
R
W
Run
Delete
Rename
php.tar.gz
983 By
2026-05-07 11:06:57
R
W
Run
Delete
Rename
php.zip
4.72 KB
2026-05-07 11:15:10
R
W
Run
Delete
Rename
phpoffice.tar
1.82 MB
2026-05-07 12:12:41
R
W
Run
Delete
Rename
phpoffice.tar.gz
263.76 KB
2026-05-07 12:12:41
R
W
Run
Delete
Rename
phpoffice.zip
1.62 MB
2026-05-07 12:12:38
R
W
Run
Delete
Rename
prepend.txt.tar
121.1 MB
2026-05-07 12:06:14
R
W
Run
Delete
Rename
prepend.txt.txt.tar.gz
12.71 MB
2026-05-07 12:06:21
R
W
Run
Delete
Rename
psr.zip
59.33 KB
2026-05-07 12:11:48
R
W
Run
Delete
Rename
public_ftp.zip
975.85 MB
2026-05-07 11:06:47
R
W
Run
Delete
Rename
public_html.tar
977.12 MB
2026-05-07 12:06:28
R
W
Run
Delete
Rename
public_html.tar.gz
32 KB
2026-05-07 12:06:52
R
W
Run
Delete
Rename
ralouphie.tar
8.5 KB
2026-05-07 12:12:37
R
W
Run
Delete
Rename
ralouphie.tar.gz
1.88 KB
2026-05-07 12:12:37
R
W
Run
Delete
Rename
ralouphie.zip
4.84 KB
2026-05-07 12:12:24
R
W
Run
Delete
Rename
ratchet.zip
140.66 KB
2026-05-07 12:12:21
R
W
Run
Delete
Rename
react.zip
731.88 KB
2026-05-07 12:12:22
R
W
Run
Delete
Rename
robots.txt
2.34 KB
2026-05-07 07:32:42
R
W
Run
Delete
Rename
robots.txt.tar
4 KB
2026-05-07 10:03:14
R
W
Run
Delete
Rename
robots.txt.txt.tar.gz
322 By
2026-05-07 10:03:14
R
W
Run
Delete
Rename
roundcube.tar
9.5 KB
2026-05-07 12:05:24
R
W
Run
Delete
Rename
roundcube.tar.gz
1.55 KB
2026-05-07 12:05:24
R
W
Run
Delete
Rename
saveData.php.php.tar.gz
445 By
2026-05-07 12:06:09
R
W
Run
Delete
Rename
saveData.php.tar
2.5 KB
2026-05-07 12:06:09
R
W
Run
Delete
Rename
save_admin_details.php.php.tar.gz
779 By
2026-05-07 12:06:15
R
W
Run
Delete
Rename
save_admin_details.php.tar
4 KB
2026-05-07 12:06:15
R
W
Run
Delete
Rename
scrum_toptrendingappstudio_com.php.error.log.php.error.log.tar.gz
125.37 KB
2026-05-07 12:08:05
R
W
Run
Delete
Rename
scrum_toptrendingappstudio_com.php.error.log.tar
1.9 MB
2026-05-07 12:08:04
R
W
Run
Delete
Rename
server.c302.cloudmark.com.conf.tar
2.5 KB
2026-05-07 12:13:48
R
W
Run
Delete
Rename
share.zip
183 By
2026-05-07 12:05:55
R
W
Run
Delete
Rename
ssl.zip
717.75 KB
2026-05-07 11:06:08
R
W
Run
Delete
Rename
storage.sqlite.sqlite.tar.gz
521 By
2026-05-07 12:06:07
R
W
Run
Delete
Rename
storage.sqlite.tar
17.5 KB
2026-05-07 12:06:07
R
W
Run
Delete
Rename
swiftmailer.zip
717.46 KB
2026-05-07 12:12:38
R
W
Run
Delete
Rename
symfony.zip
2.79 MB
2026-05-07 12:14:18
R
W
Run
Delete
Rename
toptrendingappst.rcube.db.1771972649.rcube.db.1771972649.tar.gz
12.34 KB
2026-05-07 12:08:05
R
W
Run
Delete
Rename
toptrendingappst.rcube.db.1771972649.tar
457.5 KB
2026-05-07 12:08:05
R
W
Run
Delete
Rename
toptrendingappst.zip
3.87 KB
2026-05-07 12:13:19
R
W
Run
Delete
Rename
userAudio_30.3gp.3gp.tar.gz
22.83 KB
2026-05-07 12:06:14
R
W
Run
Delete
Rename
userAudio_30.3gp.tar
31 KB
2026-05-07 12:06:14
R
W
Run
Delete
Rename
userAudio_99.3gp.3gp.tar.gz
612 By
2026-05-07 12:06:15
R
W
Run
Delete
Rename
userAudio_99.3gp.tar
12.5 KB
2026-05-07 12:06:15
R
W
Run
Delete
Rename
vendor.tar
2.53 MB
2026-05-07 12:12:37
R
W
Run
Delete
Rename
vendor.tar.gz
475.53 KB
2026-05-07 12:12:38
R
W
Run
Delete
Rename
vendor.zip
2.13 MB
2026-05-07 12:12:37
R
W
Run
Delete
Rename
webalizer.tar
450.43 MB
2026-05-07 12:12:19
R
W
Run
Delete
Rename
www.tar
117.38 MB
2026-05-07 11:06:08
R
W
Run
Delete
Rename
www.tar.gz
39.75 MB
2026-05-07 11:06:12
R
W
Run
Delete
Rename
www.zip
3.54 MB
2026-05-07 11:05:46
R
W
Run
Delete
Rename
error_log
up
📄
evenement.tar
Save
evenement/tests/Evenement/Tests/EventEmitterTest.php 0000664 00000030637 15177100663 0016731 0 ustar 00 <?php declare(strict_types=1); /* * This file is part of Evenement. * * (c) Igor Wiedler <igor@wiedler.ch> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Evenement\Tests; use Evenement\EventEmitter; use InvalidArgumentException; use PHPUnit\Framework\TestCase; class EventEmitterTest extends TestCase { private $emitter; public function setUp() { $this->emitter = new EventEmitter(); } public function testAddListenerWithLambda() { $this->emitter->on('foo', function () {}); } public function testAddListenerWithMethod() { $listener = new Listener(); $this->emitter->on('foo', [$listener, 'onFoo']); } public function testAddListenerWithStaticMethod() { $this->emitter->on('bar', ['Evenement\Tests\Listener', 'onBar']); } public function testAddListenerWithInvalidListener() { try { $this->emitter->on('foo', 'not a callable'); $this->fail(); } catch (\Exception $e) { } catch (\TypeError $e) { } } public function testOnce() { $listenerCalled = 0; $this->emitter->once('foo', function () use (&$listenerCalled) { $listenerCalled++; }); $this->assertSame(0, $listenerCalled); $this->emitter->emit('foo'); $this->assertSame(1, $listenerCalled); $this->emitter->emit('foo'); $this->assertSame(1, $listenerCalled); } public function testOnceWithArguments() { $capturedArgs = []; $this->emitter->once('foo', function ($a, $b) use (&$capturedArgs) { $capturedArgs = array($a, $b); }); $this->emitter->emit('foo', array('a', 'b')); $this->assertSame(array('a', 'b'), $capturedArgs); } public function testEmitWithoutArguments() { $listenerCalled = false; $this->emitter->on('foo', function () use (&$listenerCalled) { $listenerCalled = true; }); $this->assertSame(false, $listenerCalled); $this->emitter->emit('foo'); $this->assertSame(true, $listenerCalled); } public function testEmitWithOneArgument() { $test = $this; $listenerCalled = false; $this->emitter->on('foo', function ($value) use (&$listenerCalled, $test) { $listenerCalled = true; $test->assertSame('bar', $value); }); $this->assertSame(false, $listenerCalled); $this->emitter->emit('foo', ['bar']); $this->assertSame(true, $listenerCalled); } public function testEmitWithTwoArguments() { $test = $this; $listenerCalled = false; $this->emitter->on('foo', function ($arg1, $arg2) use (&$listenerCalled, $test) { $listenerCalled = true; $test->assertSame('bar', $arg1); $test->assertSame('baz', $arg2); }); $this->assertSame(false, $listenerCalled); $this->emitter->emit('foo', ['bar', 'baz']); $this->assertSame(true, $listenerCalled); } public function testEmitWithNoListeners() { $this->emitter->emit('foo'); $this->emitter->emit('foo', ['bar']); $this->emitter->emit('foo', ['bar', 'baz']); } public function testEmitWithTwoListeners() { $listenersCalled = 0; $this->emitter->on('foo', function () use (&$listenersCalled) { $listenersCalled++; }); $this->emitter->on('foo', function () use (&$listenersCalled) { $listenersCalled++; }); $this->assertSame(0, $listenersCalled); $this->emitter->emit('foo'); $this->assertSame(2, $listenersCalled); } public function testRemoveListenerMatching() { $listenersCalled = 0; $listener = function () use (&$listenersCalled) { $listenersCalled++; }; $this->emitter->on('foo', $listener); $this->emitter->removeListener('foo', $listener); $this->assertSame(0, $listenersCalled); $this->emitter->emit('foo'); $this->assertSame(0, $listenersCalled); } public function testRemoveListenerNotMatching() { $listenersCalled = 0; $listener = function () use (&$listenersCalled) { $listenersCalled++; }; $this->emitter->on('foo', $listener); $this->emitter->removeListener('bar', $listener); $this->assertSame(0, $listenersCalled); $this->emitter->emit('foo'); $this->assertSame(1, $listenersCalled); } public function testRemoveAllListenersMatching() { $listenersCalled = 0; $this->emitter->on('foo', function () use (&$listenersCalled) { $listenersCalled++; }); $this->emitter->removeAllListeners('foo'); $this->assertSame(0, $listenersCalled); $this->emitter->emit('foo'); $this->assertSame(0, $listenersCalled); } public function testRemoveAllListenersNotMatching() { $listenersCalled = 0; $this->emitter->on('foo', function () use (&$listenersCalled) { $listenersCalled++; }); $this->emitter->removeAllListeners('bar'); $this->assertSame(0, $listenersCalled); $this->emitter->emit('foo'); $this->assertSame(1, $listenersCalled); } public function testRemoveAllListenersWithoutArguments() { $listenersCalled = 0; $this->emitter->on('foo', function () use (&$listenersCalled) { $listenersCalled++; }); $this->emitter->on('bar', function () use (&$listenersCalled) { $listenersCalled++; }); $this->emitter->removeAllListeners(); $this->assertSame(0, $listenersCalled); $this->emitter->emit('foo'); $this->emitter->emit('bar'); $this->assertSame(0, $listenersCalled); } public function testCallablesClosure() { $calledWith = null; $this->emitter->on('foo', function ($data) use (&$calledWith) { $calledWith = $data; }); $this->emitter->emit('foo', ['bar']); self::assertSame('bar', $calledWith); } public function testCallablesClass() { $listener = new Listener(); $this->emitter->on('foo', [$listener, 'onFoo']); $this->emitter->emit('foo', ['bar']); self::assertSame(['bar'], $listener->getData()); } public function testCallablesClassInvoke() { $listener = new Listener(); $this->emitter->on('foo', $listener); $this->emitter->emit('foo', ['bar']); self::assertSame(['bar'], $listener->getMagicData()); } public function testCallablesStaticClass() { $this->emitter->on('foo', '\Evenement\Tests\Listener::onBar'); $this->emitter->emit('foo', ['bar']); self::assertSame(['bar'], Listener::getStaticData()); } public function testCallablesFunction() { $this->emitter->on('foo', '\Evenement\Tests\setGlobalTestData'); $this->emitter->emit('foo', ['bar']); self::assertSame('bar', $GLOBALS['evenement-evenement-test-data']); unset($GLOBALS['evenement-evenement-test-data']); } public function testListeners() { $onA = function () {}; $onB = function () {}; $onC = function () {}; $onceA = function () {}; $onceB = function () {}; $onceC = function () {}; self::assertCount(0, $this->emitter->listeners('event')); $this->emitter->on('event', $onA); self::assertCount(1, $this->emitter->listeners('event')); self::assertSame([$onA], $this->emitter->listeners('event')); $this->emitter->once('event', $onceA); self::assertCount(2, $this->emitter->listeners('event')); self::assertSame([$onA, $onceA], $this->emitter->listeners('event')); $this->emitter->once('event', $onceB); self::assertCount(3, $this->emitter->listeners('event')); self::assertSame([$onA, $onceA, $onceB], $this->emitter->listeners('event')); $this->emitter->on('event', $onB); self::assertCount(4, $this->emitter->listeners('event')); self::assertSame([$onA, $onB, $onceA, $onceB], $this->emitter->listeners('event')); $this->emitter->removeListener('event', $onceA); self::assertCount(3, $this->emitter->listeners('event')); self::assertSame([$onA, $onB, $onceB], $this->emitter->listeners('event')); $this->emitter->once('event', $onceC); self::assertCount(4, $this->emitter->listeners('event')); self::assertSame([$onA, $onB, $onceB, $onceC], $this->emitter->listeners('event')); $this->emitter->on('event', $onC); self::assertCount(5, $this->emitter->listeners('event')); self::assertSame([$onA, $onB, $onC, $onceB, $onceC], $this->emitter->listeners('event')); $this->emitter->once('event', $onceA); self::assertCount(6, $this->emitter->listeners('event')); self::assertSame([$onA, $onB, $onC, $onceB, $onceC, $onceA], $this->emitter->listeners('event')); $this->emitter->removeListener('event', $onB); self::assertCount(5, $this->emitter->listeners('event')); self::assertSame([$onA, $onC, $onceB, $onceC, $onceA], $this->emitter->listeners('event')); $this->emitter->emit('event'); self::assertCount(2, $this->emitter->listeners('event')); self::assertSame([$onA, $onC], $this->emitter->listeners('event')); } public function testOnceCallIsNotRemovedWhenWorkingOverOnceListeners() { $aCalled = false; $aCallable = function () use (&$aCalled) { $aCalled = true; }; $bCalled = false; $bCallable = function () use (&$bCalled, $aCallable) { $bCalled = true; $this->emitter->once('event', $aCallable); }; $this->emitter->once('event', $bCallable); self::assertFalse($aCalled); self::assertFalse($bCalled); $this->emitter->emit('event'); self::assertFalse($aCalled); self::assertTrue($bCalled); $this->emitter->emit('event'); self::assertTrue($aCalled); self::assertTrue($bCalled); } public function testEventNameMustBeStringOn() { self::expectException(InvalidArgumentException::class); self::expectExceptionMessage('event name must not be null'); $this->emitter->on(null, function () {}); } public function testEventNameMustBeStringOnce() { self::expectException(InvalidArgumentException::class); self::expectExceptionMessage('event name must not be null'); $this->emitter->once(null, function () {}); } public function testEventNameMustBeStringRemoveListener() { self::expectException(InvalidArgumentException::class); self::expectExceptionMessage('event name must not be null'); $this->emitter->removeListener(null, function () {}); } public function testEventNameMustBeStringEmit() { self::expectException(InvalidArgumentException::class); self::expectExceptionMessage('event name must not be null'); $this->emitter->emit(null); } public function testListenersGetAll() { $a = function () {}; $b = function () {}; $c = function () {}; $d = function () {}; $this->emitter->once('event2', $c); $this->emitter->on('event', $a); $this->emitter->once('event', $b); $this->emitter->on('event', $c); $this->emitter->once('event', $d); self::assertSame( [ 'event' => [ $a, $c, $b, $d, ], 'event2' => [ $c, ], ], $this->emitter->listeners() ); } public function testOnceNestedCallRegression() { $first = 0; $second = 0; $this->emitter->once('event', function () use (&$first, &$second) { $first++; $this->emitter->once('event', function () use (&$second) { $second++; }); $this->emitter->emit('event'); }); $this->emitter->emit('event'); self::assertSame(1, $first); self::assertSame(1, $second); } } evenement/tests/Evenement/Tests/Listener.php 0000664 00000001557 15177100664 0015243 0 ustar 00 <?php declare(strict_types=1); /* * This file is part of Evenement. * * (c) Igor Wiedler <igor@wiedler.ch> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Evenement\Tests; class Listener { private $data = []; private $magicData = []; private static $staticData = []; public function onFoo($data) { $this->data[] = $data; } public function __invoke($data) { $this->magicData[] = $data; } public static function onBar($data) { self::$staticData[] = $data; } public function getData() { return $this->data; } public function getMagicData() { return $this->magicData; } public static function getStaticData() { return self::$staticData; } } evenement/tests/Evenement/Tests/functions.php 0000664 00000000557 15177100664 0015465 0 ustar 00 <?php declare(strict_types=1); /* * This file is part of Evenement. * * (c) Igor Wiedler <igor@wiedler.ch> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Evenement\Tests; function setGlobalTestData($data) { $GLOBALS['evenement-evenement-test-data'] = $data; } evenement/examples/error_log 0000644 00000007160 15177100664 0012300 0 ustar 00 [05-May-2026 16:13:49 UTC] PHP Warning: require(/home/toptrendingappst/vendor/evenement/evenement/examples/../vendor/autoload.php): Failed to open stream: No such file or directory in /home/toptrendingappst/vendor/evenement/evenement/examples/benchmark-emit-no-arguments.php on line 16 [05-May-2026 16:13:49 UTC] PHP Fatal error: Uncaught Error: Failed opening required '/home/toptrendingappst/vendor/evenement/evenement/examples/../vendor/autoload.php' (include_path='.:/opt/cpanel/ea-php81/root/usr/share/pear') in /home/toptrendingappst/vendor/evenement/evenement/examples/benchmark-emit-no-arguments.php:16 Stack trace: #0 {main} thrown in /home/toptrendingappst/vendor/evenement/evenement/examples/benchmark-emit-no-arguments.php on line 16 [05-May-2026 16:13:50 UTC] PHP Warning: require(/home/toptrendingappst/vendor/evenement/evenement/examples/../vendor/autoload.php): Failed to open stream: No such file or directory in /home/toptrendingappst/vendor/evenement/evenement/examples/benchmark-emit-once.php on line 18 [05-May-2026 16:13:50 UTC] PHP Fatal error: Uncaught Error: Failed opening required '/home/toptrendingappst/vendor/evenement/evenement/examples/../vendor/autoload.php' (include_path='.:/opt/cpanel/ea-php81/root/usr/share/pear') in /home/toptrendingappst/vendor/evenement/evenement/examples/benchmark-emit-once.php:18 Stack trace: #0 {main} thrown in /home/toptrendingappst/vendor/evenement/evenement/examples/benchmark-emit-once.php on line 18 [05-May-2026 16:13:50 UTC] PHP Warning: require(/home/toptrendingappst/vendor/evenement/evenement/examples/../vendor/autoload.php): Failed to open stream: No such file or directory in /home/toptrendingappst/vendor/evenement/evenement/examples/benchmark-remove-listener-once.php on line 18 [05-May-2026 16:13:50 UTC] PHP Fatal error: Uncaught Error: Failed opening required '/home/toptrendingappst/vendor/evenement/evenement/examples/../vendor/autoload.php' (include_path='.:/opt/cpanel/ea-php81/root/usr/share/pear') in /home/toptrendingappst/vendor/evenement/evenement/examples/benchmark-remove-listener-once.php:18 Stack trace: #0 {main} thrown in /home/toptrendingappst/vendor/evenement/evenement/examples/benchmark-remove-listener-once.php on line 18 [05-May-2026 16:13:51 UTC] PHP Warning: require(/home/toptrendingappst/vendor/evenement/evenement/examples/../vendor/autoload.php): Failed to open stream: No such file or directory in /home/toptrendingappst/vendor/evenement/evenement/examples/benchmark-emit-one-argument.php on line 16 [05-May-2026 16:13:51 UTC] PHP Fatal error: Uncaught Error: Failed opening required '/home/toptrendingappst/vendor/evenement/evenement/examples/../vendor/autoload.php' (include_path='.:/opt/cpanel/ea-php81/root/usr/share/pear') in /home/toptrendingappst/vendor/evenement/evenement/examples/benchmark-emit-one-argument.php:16 Stack trace: #0 {main} thrown in /home/toptrendingappst/vendor/evenement/evenement/examples/benchmark-emit-one-argument.php on line 16 [05-May-2026 16:13:53 UTC] PHP Warning: require(/home/toptrendingappst/vendor/evenement/evenement/examples/../vendor/autoload.php): Failed to open stream: No such file or directory in /home/toptrendingappst/vendor/evenement/evenement/examples/benchmark-emit.php on line 16 [05-May-2026 16:13:53 UTC] PHP Fatal error: Uncaught Error: Failed opening required '/home/toptrendingappst/vendor/evenement/evenement/examples/../vendor/autoload.php' (include_path='.:/opt/cpanel/ea-php81/root/usr/share/pear') in /home/toptrendingappst/vendor/evenement/evenement/examples/benchmark-emit.php:16 Stack trace: #0 {main} thrown in /home/toptrendingappst/vendor/evenement/evenement/examples/benchmark-emit.php on line 16 evenement/examples/benchmark-emit-one-argument.php 0000664 00000001224 15177100664 0016356 0 ustar 00 <?php declare(strict_types=1); /* * This file is part of Evenement. * * (c) Igor Wiedler <igor@wiedler.ch> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ const ITERATIONS = 10000000; use Evenement\EventEmitter; require __DIR__.'/../vendor/autoload.php'; $emitter = new EventEmitter(); $emitter->on('event', function ($a) {}); $start = microtime(true); for ($i = 0; $i < ITERATIONS; $i++) { $emitter->emit('event', [1]); } $time = microtime(true) - $start; echo 'Emitting ', number_format(ITERATIONS), ' events took: ', number_format($time, 2), 's', PHP_EOL; evenement/examples/benchmark-emit-no-arguments.php 0000664 00000001215 15177100664 0016374 0 ustar 00 <?php declare(strict_types=1); /* * This file is part of Evenement. * * (c) Igor Wiedler <igor@wiedler.ch> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ const ITERATIONS = 10000000; use Evenement\EventEmitter; require __DIR__.'/../vendor/autoload.php'; $emitter = new EventEmitter(); $emitter->on('event', function () {}); $start = microtime(true); for ($i = 0; $i < ITERATIONS; $i++) { $emitter->emit('event'); } $time = microtime(true) - $start; echo 'Emitting ', number_format(ITERATIONS), ' events took: ', number_format($time, 2), 's', PHP_EOL; evenement/examples/benchmark-emit-once.php 0000664 00000001331 15177100664 0014700 0 ustar 00 <?php declare(strict_types=1); /* * This file is part of Evenement. * * (c) Igor Wiedler <igor@wiedler.ch> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ ini_set('memory_limit', '512M'); const ITERATIONS = 100000; use Evenement\EventEmitter; require __DIR__.'/../vendor/autoload.php'; $emitter = new EventEmitter(); for ($i = 0; $i < ITERATIONS; $i++) { $emitter->once('event', function ($a, $b, $c) {}); } $start = microtime(true); $emitter->emit('event', [1, 2, 3]); $time = microtime(true) - $start; echo 'Emitting one event to ', number_format(ITERATIONS), ' once listeners took: ', number_format($time, 2), 's', PHP_EOL; evenement/examples/benchmark-emit.php 0000664 00000001242 15177100664 0013757 0 ustar 00 <?php declare(strict_types=1); /* * This file is part of Evenement. * * (c) Igor Wiedler <igor@wiedler.ch> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ const ITERATIONS = 10000000; use Evenement\EventEmitter; require __DIR__.'/../vendor/autoload.php'; $emitter = new EventEmitter(); $emitter->on('event', function ($a, $b, $c) {}); $start = microtime(true); for ($i = 0; $i < ITERATIONS; $i++) { $emitter->emit('event', [1, 2, 3]); } $time = microtime(true) - $start; echo 'Emitting ', number_format(ITERATIONS), ' events took: ', number_format($time, 2), 's', PHP_EOL; evenement/examples/benchmark-remove-listener-once.php 0000664 00000001775 15177100664 0017076 0 ustar 00 <?php declare(strict_types=1); /* * This file is part of Evenement. * * (c) Igor Wiedler <igor@wiedler.ch> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ ini_set('memory_limit', '512M'); const ITERATIONS = 100000; use Evenement\EventEmitter; require __DIR__.'/../vendor/autoload.php'; $emitter = new EventEmitter(); $listeners = []; for ($i = 0; $i < ITERATIONS; $i++) { $listeners[] = function ($a, $b, $c) {}; } $start = microtime(true); foreach ($listeners as $listener) { $emitter->once('event', $listener); } $time = microtime(true) - $start; echo 'Adding ', number_format(ITERATIONS), ' once listeners took: ', number_format($time, 2), 's', PHP_EOL; $start = microtime(true); foreach ($listeners as $listener) { $emitter->removeListener('event', $listener); } $time = microtime(true) - $start; echo 'Removing ', number_format(ITERATIONS), ' once listeners took: ', number_format($time, 2), 's', PHP_EOL; evenement/src/Evenement/error_log 0000644 00000000272 15177100664 0013174 0 ustar 00 [06-May-2026 01:04:51 UTC] PHP Fatal error: Trait "Evenement\EventEmitterTrait" not found in /home/toptrendingappst/vendor/evenement/evenement/src/Evenement/EventEmitter.php on line 14 evenement/src/Evenement/EventEmitter.php 0000664 00000000537 15177100664 0014411 0 ustar 00 <?php declare(strict_types=1); /* * This file is part of Evenement. * * (c) Igor Wiedler <igor@wiedler.ch> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Evenement; class EventEmitter implements EventEmitterInterface { use EventEmitterTrait; } evenement/src/Evenement/EventEmitterTrait.php 0000664 00000007521 15177100664 0015415 0 ustar 00 <?php declare(strict_types=1); /* * This file is part of Evenement. * * (c) Igor Wiedler <igor@wiedler.ch> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Evenement; use InvalidArgumentException; trait EventEmitterTrait { protected $listeners = []; protected $onceListeners = []; public function on($event, callable $listener) { if ($event === null) { throw new InvalidArgumentException('event name must not be null'); } if (!isset($this->listeners[$event])) { $this->listeners[$event] = []; } $this->listeners[$event][] = $listener; return $this; } public function once($event, callable $listener) { if ($event === null) { throw new InvalidArgumentException('event name must not be null'); } if (!isset($this->onceListeners[$event])) { $this->onceListeners[$event] = []; } $this->onceListeners[$event][] = $listener; return $this; } public function removeListener($event, callable $listener) { if ($event === null) { throw new InvalidArgumentException('event name must not be null'); } if (isset($this->listeners[$event])) { $index = \array_search($listener, $this->listeners[$event], true); if (false !== $index) { unset($this->listeners[$event][$index]); if (\count($this->listeners[$event]) === 0) { unset($this->listeners[$event]); } } } if (isset($this->onceListeners[$event])) { $index = \array_search($listener, $this->onceListeners[$event], true); if (false !== $index) { unset($this->onceListeners[$event][$index]); if (\count($this->onceListeners[$event]) === 0) { unset($this->onceListeners[$event]); } } } } public function removeAllListeners($event = null) { if ($event !== null) { unset($this->listeners[$event]); } else { $this->listeners = []; } if ($event !== null) { unset($this->onceListeners[$event]); } else { $this->onceListeners = []; } } public function listeners($event = null): array { if ($event === null) { $events = []; $eventNames = \array_unique( \array_merge(\array_keys($this->listeners), \array_keys($this->onceListeners)) ); foreach ($eventNames as $eventName) { $events[$eventName] = \array_merge( isset($this->listeners[$eventName]) ? $this->listeners[$eventName] : [], isset($this->onceListeners[$eventName]) ? $this->onceListeners[$eventName] : [] ); } return $events; } return \array_merge( isset($this->listeners[$event]) ? $this->listeners[$event] : [], isset($this->onceListeners[$event]) ? $this->onceListeners[$event] : [] ); } public function emit($event, array $arguments = []) { if ($event === null) { throw new InvalidArgumentException('event name must not be null'); } if (isset($this->listeners[$event])) { foreach ($this->listeners[$event] as $listener) { $listener(...$arguments); } } if (isset($this->onceListeners[$event])) { $listeners = $this->onceListeners[$event]; unset($this->onceListeners[$event]); foreach ($listeners as $listener) { $listener(...$arguments); } } } } evenement/src/Evenement/EventEmitterInterface.php 0000664 00000001170 15177100664 0016224 0 ustar 00 <?php declare(strict_types=1); /* * This file is part of Evenement. * * (c) Igor Wiedler <igor@wiedler.ch> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Evenement; interface EventEmitterInterface { public function on($event, callable $listener); public function once($event, callable $listener); public function removeListener($event, callable $listener); public function removeAllListeners($event = null); public function listeners($event = null); public function emit($event, array $arguments = []); } evenement/doc/02-plugin-system.md 0000664 00000010714 15177100664 0012674 0 ustar 00 # Example: Plugin system In this example I will show you how to create a generic plugin system with événement where plugins can alter the behaviour of the app. The app is a blog. Boring, I know. By using the EventEmitter it will be easy to extend this blog with additional functionality without modifying the core system. The blog is quite basic. Users are able to create blog posts when they log in. The users are stored in a static config file, so there is no sign up process. Once logged in they get a "new post" link which gives them a form where they can create a new blog post with plain HTML. That will store the post in a document database. The index lists all blog post titles by date descending. Clicking on the post title will take you to the full post. ## Plugin structure The goal of the plugin system is to allow features to be added to the blog without modifying any core files of the blog. The plugins are managed through a config file, `plugins.json`. This JSON file contains a JSON-encoded list of class-names for plugin classes. This allows you to enable and disable plugins in a central location. The initial `plugins.json` is just an empty array: ```json [] ``` A plugin class must implement the `PluginInterface`: ```php interface PluginInterface { function attachEvents(EventEmitterInterface $emitter); } ``` The `attachEvents` method allows the plugin to attach any events to the emitter. For example: ```php class FooPlugin implements PluginInterface { public function attachEvents(EventEmitterInterface $emitter) { $emitter->on('foo', function () { echo 'bar!'; }); } } ``` The blog system creates an emitter instance and loads the plugins: ```php $emitter = new EventEmitter(); $pluginClasses = json_decode(file_get_contents('plugins.json'), true); foreach ($pluginClasses as $pluginClass) { $plugin = new $pluginClass(); $pluginClass->attachEvents($emitter); } ``` This is the base system. There are no plugins yet, and there are no events yet either. That's because I don't know which extension points will be needed. I will add them on demand. ## Feature: Markdown Writing blog posts in HTML sucks! Wouldn't it be great if I could write them in a nice format such as markdown, and have that be converted to HTML for me? This feature will need two extension points. I need to be able to mark posts as markdown, and I need to be able to hook into the rendering of the post body and convert it from markdown to HTML. So the blog needs two new events: `post.create` and `post.render`. In the code that creates the post, I'll insert the `post.create` event: ```php class PostEvent { public $post; public function __construct(array $post) { $this->post = $post; } } $post = createPostFromRequest($_POST); $event = new PostEvent($post); $emitter->emit('post.create', [$event]); $post = $event->post; $db->save('post', $post); ``` This shows that you can wrap a value in an event object to make it mutable, allowing listeners to change it. The same thing for the `post.render` event: ```php public function renderPostBody(array $post) { $emitter = $this->emitter; $event = new PostEvent($post); $emitter->emit('post.render', [$event]); $post = $event->post; return $post['body']; } <h1><?= $post['title'] %></h1> <p><?= renderPostBody($post) %></p> ``` Ok, the events are in place. It's time to create the first plugin, woohoo! I will call this the `MarkdownPlugin`, so here's `plugins.json`: ```json [ "MarkdownPlugin" ] ``` The `MarkdownPlugin` class will be autoloaded, so I don't have to worry about including any files. I just have to worry about implementing the plugin class. The `markdown` function represents a markdown to HTML converter. ```php class MarkdownPlugin implements PluginInterface { public function attachEvents(EventEmitterInterface $emitter) { $emitter->on('post.create', function (PostEvent $event) { $event->post['format'] = 'markdown'; }); $emitter->on('post.render', function (PostEvent $event) { if (isset($event->post['format']) && 'markdown' === $event->post['format']) { $event->post['body'] = markdown($event->post['body']); } }); } } ``` There you go, the blog now renders posts as markdown. But all of the previous posts before the addition of the markdown plugin are still rendered correctly as raw HTML. ## Feature: Comments TODO ## Feature: Comment spam control TODO evenement/doc/00-intro.md 0000664 00000002412 15177100664 0011201 0 ustar 00 # Introduction Événement is is French and means "event". The événement library aims to provide a simple way of subscribing to events and notifying those subscribers whenever an event occurs. The API that it exposes is almost a direct port of the EventEmitter API found in node.js. It also includes an "EventEmitter". There are some minor differences however. The EventEmitter is an implementation of the publish-subscribe pattern, which is a generalized version of the observer pattern. The observer pattern specifies an observable subject, which observers can register themselves to. Once something interesting happens, the subject notifies its observers. Pub/sub takes the same idea but encapsulates the observation logic inside a separate object which manages all of its subscribers or listeners. Subscribers are bound to an event name, and will only receive notifications of the events they subscribed to. **TLDR: What does evenement do, in short? It provides a mapping from event names to a list of listener functions and triggers each listener for a given event when it is emitted.** Why do we do this, you ask? To achieve decoupling. It allows you to design a system where the core will emit events, and modules are able to subscribe to these events. And respond to them. evenement/doc/01-api.md 0000664 00000004273 15177100664 0010627 0 ustar 00 # API The API that événement exposes is defined by the `Evenement\EventEmitterInterface`. The interface is useful if you want to define an interface that extends the emitter and implicitly defines certain events to be emitted, or if you want to type hint an `EventEmitter` to be passed to a method without coupling to the specific implementation. ## on($event, callable $listener) Allows you to subscribe to an event. Example: ```php $emitter->on('user.created', function (User $user) use ($logger) { $logger->log(sprintf("User '%s' was created.", $user->getLogin())); }); ``` Since the listener can be any callable, you could also use an instance method instead of the anonymous function: ```php $loggerSubscriber = new LoggerSubscriber($logger); $emitter->on('user.created', array($loggerSubscriber, 'onUserCreated')); ``` This has the benefit that listener does not even need to know that the emitter exists. You can also accept more than one parameter for the listener: ```php $emitter->on('numbers_added', function ($result, $a, $b) {}); ``` ## once($event, callable $listener) Convenience method that adds a listener which is guaranteed to only be called once. Example: ```php $conn->once('connected', function () use ($conn, $data) { $conn->send($data); }); ``` ## emit($event, array $arguments = []) Emit an event, which will call all listeners. Example: ```php $conn->emit('data', [$data]); ``` The second argument to emit is an array of listener arguments. This is how you specify more args: ```php $result = $a + $b; $emitter->emit('numbers_added', [$result, $a, $b]); ``` ## listeners($event) Allows you to inspect the listeners attached to an event. Particularly useful to check if there are any listeners at all. Example: ```php $e = new \RuntimeException('Everything is broken!'); if (0 === count($emitter->listeners('error'))) { throw $e; } ``` ## removeListener($event, callable $listener) Remove a specific listener for a specific event. ## removeAllListeners($event = null) Remove all listeners for a specific event or all listeners all together. This is useful for long-running processes, where you want to remove listeners in order to allow them to get garbage collected. evenement/CHANGELOG.md 0000664 00000002734 15177100664 0010362 0 ustar 00 CHANGELOG ========= * v3.0.1 (2017-07-23) * Resolved regression introduced in once listeners in v3.0.0 [#49](https://github.com/igorw/evenement/pull/49) * v3.0.0 (2017-07-23) * Passing null as event name throw exception [#46](https://github.com/igorw/evenement/pull/46), and [#47](https://github.com/igorw/evenement/pull/47) * Performance improvements [#39](https://github.com/igorw/evenement/pull/39), and [#45](https://github.com/igorw/evenement/pull/45) * Remove once listeners [#44](https://github.com/igorw/evenement/pull/44), [#45](https://github.com/igorw/evenement/pull/45) * v2.1.0 (2017-07-17) * Chaining for "on" method [#30](https://github.com/igorw/evenement/pull/30) * Unit tests (on Travis) improvements [#33](https://github.com/igorw/evenement/pull/33), [#36](https://github.com/igorw/evenement/pull/36), and [#37](https://github.com/igorw/evenement/pull/37) * Benchmarks added [#35](https://github.com/igorw/evenement/pull/35), and [#40](https://github.com/igorw/evenement/pull/40) * Minor performance improvements [#42](https://github.com/igorw/evenement/pull/42), and [#38](https://github.com/igorw/evenement/pull/38) * v2.0.0 (2012-11-02) * Require PHP >=5.4.0 * Added EventEmitterTrait * Removed EventEmitter2 * v1.1.0 (2017-07-17) * Chaining for "on" method [#29](https://github.com/igorw/evenement/pull/29) * Minor performance improvements [#43](https://github.com/igorw/evenement/pull/43) * v1.0.0 (2012-05-30) * Inital stable release evenement/phpunit.xml.dist 0000664 00000001177 15177100664 0011724 0 ustar 00 <?xml version="1.0" encoding="UTF-8"?> <phpunit backupGlobals="false" backupStaticAttributes="false" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" syntaxCheck="false" > <testsuites> <testsuite name="Evenement Test Suite"> <directory>./tests/Evenement/</directory> </testsuite> </testsuites> <filter> <whitelist> <directory>./src/</directory> </whitelist> </filter> </phpunit> evenement/LICENSE 0000664 00000002040 15177100664 0007544 0 ustar 00 Copyright (c) 2011 Igor Wiedler 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. evenement/README.md 0000664 00000003114 15177100664 0010021 0 ustar 00 # Événement Événement is a very simple event dispatching library for PHP. It has the same design goals as [Silex](http://silex-project.org) and [Pimple](http://pimple-project.org), to empower the user while staying concise and simple. It is very strongly inspired by the EventEmitter API found in [node.js](http://nodejs.org). [](http://travis-ci.org/igorw/evenement) ## Fetch The recommended way to install Événement is [through composer](http://getcomposer.org). Just create a composer.json file for your project: ```JSON { "require": { "evenement/evenement": "^3.0 || ^2.0" } } ``` **Note:** The `3.x` version of Événement requires PHP 7 and the `2.x` version requires PHP 5.4. If you are using PHP 5.3, please use the `1.x` version: ```JSON { "require": { "evenement/evenement": "^1.0" } } ``` And run these two commands to install it: $ curl -s http://getcomposer.org/installer | php $ php composer.phar install Now you can add the autoloader, and you will have access to the library: ```php <?php require 'vendor/autoload.php'; ``` ## Usage ### Creating an Emitter ```php <?php $emitter = new Evenement\EventEmitter(); ``` ### Adding Listeners ```php <?php $emitter->on('user.created', function (User $user) use ($logger) { $logger->log(sprintf("User '%s' was created.", $user->getLogin())); }); ``` ### Emitting Events ```php <?php $emitter->emit('user.created', [$user]); ``` Tests ----- $ ./vendor/bin/phpunit License ------- MIT, see LICENSE. evenement/.travis.yml 0000664 00000001001 15177100664 0010644 0 ustar 00 language: php php: - 7.0 - 7.1 - hhvm - nightly matrix: allow_failures: - php: hhvm - php: nightly before_script: - wget http://getcomposer.org/composer.phar - php composer.phar install script: - ./vendor/bin/phpunit --coverage-text - php -n examples/benchmark-emit-no-arguments.php - php -n examples/benchmark-emit-one-argument.php - php -n examples/benchmark-emit.php - php -n examples/benchmark-emit-once.php - php -n examples/benchmark-remove-listener-once.php evenement/.gitignore 0000664 00000000025 15177100664 0010530 0 ustar 00 composer.lock vendor evenement/composer.json 0000664 00000001226 15177100664 0011266 0 ustar 00 { "name": "evenement/evenement", "description": "Événement is a very simple event dispatching library for PHP", "keywords": ["event-dispatcher", "event-emitter"], "license": "MIT", "authors": [ { "name": "Igor Wiedler", "email": "igor@wiedler.ch" } ], "require": { "php": ">=7.0" }, "require-dev": { "phpunit/phpunit": "^6.0" }, "autoload": { "psr-0": { "Evenement": "src" } }, "autoload-dev": { "psr-0": { "Evenement": "tests" }, "files": ["tests/Evenement/Tests/functions.php"] } }