741 Commits

Author SHA1 Message Date
Owncast
2c2bf2b5bb Bundle embedded web app 2024-11-25 14:10:56 +00:00
renovate[bot]
32bf67b026 chore(deps): lock file maintenance (#4035)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-25 14:05:57 +00:00
renovate[bot]
d578f01348 fix(deps): update module github.com/stretchr/testify to v1.10.0 2024-11-23 12:22:10 +00:00
renovate[bot]
8985947d7f chore(deps): update peter-evans/create-or-update-comment digest to 7157823 2024-11-20 07:57:56 +00:00
Owncast
e1acfee49d Bundle embedded web app 2024-11-18 09:18:37 +00:00
renovate[bot]
49c07594fb chore(deps): lock file maintenance (#4018)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-18 09:13:30 +00:00
dependabot[bot]
dc48e0bca7 Bump jsonpath-plus and artillery in /test/load (#4011)
Bumps [jsonpath-plus](https://github.com/s3u/JSONPath) to 10.1.0 and updates ancestor dependency [artillery](https://github.com/artilleryio/artillery). These dependencies need to be updated together.


Updates `jsonpath-plus` from 7.2.0 to 10.1.0
- [Release notes](https://github.com/s3u/JSONPath/releases)
- [Changelog](https://github.com/JSONPath-Plus/JSONPath/blob/main/CHANGES.md)
- [Commits](https://github.com/s3u/JSONPath/compare/v7.2.0...v10.1.0)

Updates `artillery` from 2.0.10 to 2.0.21
- [Release notes](https://github.com/artilleryio/artillery/releases)
- [Commits](https://github.com/artilleryio/artillery/compare/artillery-2.0.10...artillery-2.0.21)

---
updated-dependencies:
- dependency-name: jsonpath-plus
  dependency-type: indirect
- dependency-name: artillery
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-15 20:04:45 -08:00
Gabe Kangas
0b5d7c8a4d Config repository (#3988)
* WIP

* fix(test): fix ap test failing

* fix: fix unkeyed fields being used

* chore(tests): clean up browser tests by splitting out federation UI tests
2024-11-15 19:20:58 -08:00
Gabe Kangas
56d52c283c chore(tests): clean up browser tests by splitting out federation UI tests 2024-11-15 18:46:18 -08:00
Owncast
8fa2546bef Bundle embedded web app 2024-11-15 21:31:12 +00:00
Gabe Kangas
70bbcb97b8 fix(js): tweak how the vjs hook is fired and url is created 2024-11-15 13:25:06 -08:00
Owncast
d8abe74e5a Bundle embedded web app 2024-11-15 21:00:08 +00:00
Mahlangu
681111ceb2 refactor: update vjs beforeRequest to onRequest (#3945)
* refactor: update vjs onRequst to onRequest

* fix(js): update vjs to use the new onrequest hook for manipulating request uri

---------

Co-authored-by: Gabe Kangas <gabek@real-ity.com>
2024-11-15 12:55:26 -08:00
Owncast
284833d6a0 Commit updated API documentation 2024-11-15 20:24:14 +00:00
Gabe Kangas
a566b9c9f1 fix(api): define correct inbound api payloads for external requests. Fixes #3966 2024-11-15 12:22:18 -08:00
Owncast
621aebdd3c Commit updated API documentation 2024-11-14 21:44:33 +00:00
Gabe Kangas
2be188a82f Remove API from incorrectly listed as external. For #4015 2024-11-14 13:42:45 -08:00
Owncast
e17b443726 Bundle embedded web app 2024-11-14 18:41:37 +00:00
renovate[bot]
dfc934ce84 chore(deps): update dependency knip to v5.36.6 (#4013)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-14 10:36:35 -08:00
renovate[bot]
512e4dc575 fix(deps): update dependency date-fns to v4 (#4014)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-14 10:36:10 -08:00
Owncast
421cdd0693 Bundle embedded web app 2024-11-13 16:16:31 +00:00
Gabe Kangas
df06d9ad97 fix(deps): revert emoji-mart to v5.2.2 again 2024-11-13 08:10:45 -08:00
Gabe Kangas
7f42981ba7 chore(deps): add slashes to renovate config regex 2024-11-13 08:09:30 -08:00
Owncast
f3029ca782 Bundle embedded web app 2024-11-12 23:00:59 +00:00
renovate[bot]
58657804cb chore(deps): update dependency emoji-mart to v5.6.0 2024-11-12 20:44:59 +00:00
renovate[bot]
d21b10f118 fix(deps): update module github.com/twin/go-away to v1.6.14 2024-11-12 20:07:28 +00:00
renovate[bot]
ae48128441 chore(config): migrate config renovate.json (#4012)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-12 12:05:52 -08:00
Gabe Kangas
b278027b88 chore(deps): ignore golang and go-fed when updating go deps 2024-11-12 08:43:45 -08:00
renovate[bot]
f45a5b16fa fix(deps): update github.com/go-fed/activity digest to b14b50e 2024-11-12 16:28:25 +00:00
Owncast
f3d660853c Bundle embedded web app 2024-11-12 16:26:43 +00:00
Gabe Kangas
aecf7aa9bb fix(deps): do not allow statically assigned versions to auto-update. See #4010 2024-11-12 08:21:04 -08:00
Owncast
37c18ec8ab Bundle embedded web app 2024-11-12 02:11:50 +00:00
renovate[bot]
4c7ccdbbf9 chore(deps): update dependency emoji-mart to v5.6.0 2024-11-11 21:43:11 +00:00
Owncast
a20a9931f7 Bundle embedded web app 2024-11-11 21:42:28 +00:00
Gabe Kangas
b177333ec6 fix(web): hardcode emoji-mart picker version to a working version. Fixes #4010 2024-11-11 13:36:15 -08:00
Owncast
5042c7ced2 Bundle embedded web app 2024-11-11 13:02:23 +00:00
renovate[bot]
71c88c94a3 chore(deps): lock file maintenance (#4008)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-11 12:57:29 +00:00
renovate[bot]
41a6449836 chore(deps): update dependency chromatic to v11.18.0 2024-11-11 01:35:04 +00:00
Owncast
b656f88417 Bundle embedded web app 2024-11-10 22:07:19 +00:00
renovate[bot]
ee5dc3b7c8 chore(deps): update dependency chromatic to v11.17.0 2024-11-10 18:05:15 +00:00
Owncast
1476405609 Bundle embedded web app 2024-11-10 01:42:18 +00:00
renovate[bot]
7830b3765a chore(deps): update dependency emoji-mart to ~5.6.0 2024-11-09 22:24:06 +00:00
Owncast
f9f61876df Bundle embedded web app 2024-11-09 22:23:11 +00:00
Rafael Passos
17d433749c fix: registerUser request body is invalid (#4002)
I found two issues:
1. This `options` object is being passed down to fetchData,
 where it is deconstructed by the "data" attribute, not body.
2. the `data` object is being transformed into JSON downstream,
 thus the stringification done here makes for a string json object only

Signed-off-by: auyer <rafael@rcpassos.me>
2024-11-09 14:18:05 -08:00
Owncast
9989653d00 Bundle embedded web app 2024-11-09 22:13:50 +00:00
heongle
6399df7f9e fix: fix runtime caching error and adjust rules (#3970)
* fix: fix runtime caching error and adjust rules

* fix: add cache config for ts and m3u8

* revert ts and m3u8 cache config to previous behaviour

* remove unused runtime caching config

* remove all runtime caching config

---------

Co-authored-by: Gabe Kangas <gabek@real-ity.com>
2024-11-09 14:08:45 -08:00
Owncast
99acc19cee Bundle embedded web app 2024-11-09 22:03:32 +00:00
mahmed2000
eca880ac1f Replace picmo with emoji-mart (#4001)
* Add emoji-mart deps

* Change EmojiPicker to use emoji-mart

* Change ChatTextField to work with the emoji-mart data object

* Remove picmo, commit package-lock

* Fix mutant svgs having a size of 0

* Get the custom emojis to show up earlier in the picker

* Set emoji-mart to exact semver. Later versions break custom category sorting.
2024-11-09 13:58:38 -08:00
renovate[bot]
f215809f1d fix(deps): update module golang.org/x/time to v0.8.0 2024-11-09 20:12:15 +00:00
renovate[bot]
77d2bacbad fix(deps): update module golang.org/x/mod to v0.22.0 (#4006)
* fix(deps): update module golang.org/x/mod to v0.22.0

* chore: go mod tidy

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Gabe Kangas <gabek@real-ity.com>
2024-11-09 12:11:29 -08:00
renovate[bot]
1b1144c6df fix(deps): update module golang.org/x/net to v0.31.0 (#4007)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-09 15:08:38 +00:00
renovate[bot]
971e3ea092 fix(deps): update module golang.org/x/crypto to v0.29.0 (#4005)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-09 15:07:31 +00:00
Owncast
24e2552e4c Bundle embedded web app 2024-11-09 12:20:28 +00:00
renovate[bot]
56f6aa8add fix(deps): update dependency @codemirror/lang-markdown to v6.3.1 2024-11-09 10:29:09 +00:00
Owncast
de8579bcd6 Bundle embedded web app 2024-11-09 10:28:04 +00:00
renovate[bot]
56ede52346 chore(deps): update dependency knip to v5.36.3 2024-11-09 07:56:46 +00:00
Owncast
8269ae3209 Bundle embedded web app 2024-11-09 07:56:04 +00:00
renovate[bot]
674c9168ec fix(deps): update nextjs monorepo to v14.2.17 2024-11-09 04:45:09 +00:00
Owncast
801e91d2f1 Bundle embedded web app 2024-11-09 04:43:25 +00:00
renovate[bot]
1e1dc0ff49 chore(deps): update dependency cypress to v13.15.2 (#4004)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-08 20:38:38 -08:00
Owncast
fb75f1bd95 Bundle embedded web app 2024-11-09 03:24:44 +00:00
renovate[bot]
af56597341 chore(deps): update dependency mdx-mermaid to v2.0.2 2024-11-09 01:04:32 +00:00
Owncast
214c202552 Bundle embedded web app 2024-11-09 01:01:59 +00:00
renovate[bot]
ad64956027 chore(deps): update dependency @types/node to v22 (#4003)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-11-08 16:57:04 -08:00
renovate[bot]
13d2ad9079 fix(deps): update module github.com/shirou/gopsutil/v4 to v4.24.10 2024-11-08 21:35:24 +00:00
Gabe Kangas
83ef466ee1 fix(ci): check out repo if event_name is schedule 2024-11-08 13:16:13 -08:00
Owncast
a8026c13bc Bundle embedded web app 2024-11-08 19:48:39 +00:00
mahmed2000
d31d2948c3 Change websocket mock from empty object to empty class (#3998) 2024-11-08 11:43:41 -08:00
Owncast
4d68c7b561 Bundle embedded web app 2024-11-08 18:10:46 +00:00
Gabe Kangas
25cd9b6d53 fix(js): log out unused error value 2024-11-08 10:05:53 -08:00
Owncast
ecba3cc003 Bundle embedded web app 2024-11-08 09:09:49 +00:00
renovate[bot]
89dc1776d7 chore(deps): update storybook monorepo to v8.4.2 2024-11-08 07:11:30 +00:00
Owncast
97fcdfd914 Bundle embedded web app 2024-11-08 03:11:13 +00:00
renovate[bot]
0af864ea8f chore(deps): update dependency chromatic to v11.16.5 2024-11-08 01:54:42 +00:00
Owncast
121cd37c8c Bundle embedded web app 2024-11-08 01:53:07 +00:00
renovate[bot]
06c09f12de chore(deps): update typescript-eslint monorepo to v8.13.0 2024-11-07 21:26:36 +00:00
Owncast
d1117494b0 Bundle embedded web app 2024-11-07 21:24:20 +00:00
renovate[bot]
68a903b83a chore(deps): update dependency eslint-plugin-storybook to v0.11.0 2024-11-07 19:41:56 +00:00
Owncast
c8c91506cd Bundle embedded web app 2024-11-07 19:39:56 +00:00
renovate[bot]
a1a497f5c1 chore(deps): update dependency chromatic to v11.16.4 2024-11-07 16:42:28 +00:00
Owncast
219f76d891 Bundle embedded web app 2024-11-06 14:27:12 +00:00
renovate[bot]
ad9b01f442 chore(deps): update dependency @types/node to v20.17.6 2024-11-06 11:06:34 +00:00
renovate[bot]
962d03710d chore(deps): update peter-evans/create-or-update-comment digest to 213b1f9 2024-11-06 06:21:32 +00:00
dependabot[bot]
2ebc64b3b1 Bump cookie and cookie-parser in /test/load (#3996)
Bumps [cookie](https://github.com/jshttp/cookie) and [cookie-parser](https://github.com/expressjs/cookie-parser). These dependencies needed to be updated together.

Updates `cookie` from 0.4.1 to 0.7.2
- [Release notes](https://github.com/jshttp/cookie/releases)
- [Commits](https://github.com/jshttp/cookie/compare/v0.4.1...v0.7.2)

Updates `cookie-parser` from 1.4.6 to 1.4.7
- [Release notes](https://github.com/expressjs/cookie-parser/releases)
- [Changelog](https://github.com/expressjs/cookie-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/cookie-parser/compare/1.4.6...1.4.7)

---
updated-dependencies:
- dependency-name: cookie
  dependency-type: indirect
- dependency-name: cookie-parser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-11-05 16:07:43 -08:00
Owncast
5ca7249388 Bundle embedded web app 2024-11-05 13:19:38 +00:00
renovate[bot]
50a4224224 fix(deps): update dependency react-hotkeys-hook to v4.6.1 2024-11-05 11:18:07 +00:00
Owncast
ac009f574e Bundle embedded web app 2024-11-05 04:06:00 +00:00
renovate[bot]
b9d8fbffe2 chore(deps): update dependency sass to v1.80.6 2024-11-05 00:20:32 +00:00
Owncast
40b97e6bc1 Bundle embedded web app 2024-11-04 18:14:16 +00:00
renovate[bot]
134093b9d2 chore(deps): update dependency eslint-plugin-storybook to v0.10.2 2024-11-04 16:05:27 +00:00
Owncast
d123a2c020 Bundle embedded web app 2024-11-04 12:45:50 +00:00
renovate[bot]
fbd501f57e chore(deps): lock file maintenance 2024-11-04 12:40:56 +00:00
Owncast
ed7bd001ee Bundle embedded web app 2024-11-04 03:13:29 +00:00
renovate[bot]
83b3a0da5e chore(deps): update dependency @storybook/addon-styling-webpack to v1.0.1 2024-11-04 01:21:15 +00:00
Owncast
e04e079243 Bundle embedded web app 2024-11-04 01:19:34 +00:00
renovate[bot]
d4fd75b9c7 chore(deps): update dependency knip to v5.36.0 2024-11-03 21:52:49 +00:00
Owncast
6fbb3b9565 Bundle embedded web app 2024-11-03 21:51:32 +00:00
renovate[bot]
42005608fa chore(deps): update dependency @types/node to v20.17.5 2024-11-03 18:37:38 +00:00
Owncast
538ebaf7bb Bundle embedded web app 2024-11-03 16:22:21 +00:00
renovate[bot]
2be0aebd6d chore(deps): update storybook monorepo to v8.4.0 2024-11-03 13:37:37 +00:00
Owncast
fdaf25d92e Bundle embedded web app 2024-11-03 09:54:53 +00:00
renovate[bot]
5fc4e56bf9 chore(deps): update dependency @types/node to v20.17.4 2024-11-03 07:52:34 +00:00
Owncast
392e437b9a Bundle embedded web app 2024-11-02 19:28:48 +00:00
renovate[bot]
3066d6b82e chore(deps): update dependency mermaid to v11.4.0 2024-11-02 16:46:03 +00:00
Owncast
2f941be5c0 Bundle embedded web app 2024-11-02 16:44:41 +00:00
renovate[bot]
ff058ca777 chore(deps): update dependency knip to v5.34.4 2024-11-02 13:57:16 +00:00
Owncast
3f321d3a1c Bundle embedded web app 2024-11-02 09:46:18 +00:00
renovate[bot]
490c38bd31 fix(deps): update workbox monorepo to v7.3.0 2024-11-02 07:41:14 +00:00
Owncast
019cdb169c Bundle embedded web app 2024-11-02 07:40:21 +00:00
renovate[bot]
9d0c7c1edb chore(deps): update dependency chromatic to v11.16.3 2024-11-02 05:09:06 +00:00
Owncast
88a96f0eae Bundle embedded web app 2024-11-02 05:07:54 +00:00
renovate[bot]
b7d8a5ea99 chore(deps): update dependency sass to v1.80.5 2024-11-02 01:35:53 +00:00
Owncast
5d8c6348bc Bundle embedded web app 2024-11-02 01:34:40 +00:00
renovate[bot]
a934b89a53 chore(deps): update dependency knip to v5.34.3 2024-11-01 22:05:10 +00:00
Owncast
9ccf19eb64 Bundle embedded web app 2024-11-01 22:03:57 +00:00
renovate[bot]
de3eac2b2f chore(deps): update dependency @types/node to v20.17.3 2024-11-01 19:23:53 +00:00
Owncast
76abc0bbfb Bundle embedded web app 2024-11-01 19:22:57 +00:00
renovate[bot]
3bb2ba18e5 chore(deps): update typescript-eslint monorepo to v8.12.2 2024-11-01 16:18:21 +00:00
Owncast
e71144a68d Bundle embedded web app 2024-11-01 03:07:33 +00:00
renovate[bot]
7a367a933b chore(deps): update typescript-eslint monorepo to v8.12.1 2024-11-01 01:12:00 +00:00
Owncast
c1cb96fa57 Bundle embedded web app 2024-10-31 22:35:12 +00:00
renovate[bot]
28c6947a43 chore(deps): update dependency @types/node to v20.17.2 2024-10-31 20:48:45 +00:00
Owncast
00b9dec218 Bundle embedded web app 2024-10-31 05:20:24 +00:00
nekojanai
8e89dfb345 fix: username wrapping (#3975) 2024-10-30 22:13:28 -07:00
renovate[bot]
ed21911288 chore(deps): update peter-evans/create-or-update-comment digest to 6f2ce0e 2024-10-30 08:31:18 +00:00
Owncast
d9aeb32852 Bundle embedded web app 2024-10-29 06:34:21 +00:00
renovate[bot]
3262d3b875 chore(deps): update dependency eslint-plugin-jsx-a11y to v6.10.2 2024-10-29 05:04:08 +00:00
Owncast
af88ee386b Bundle embedded web app 2024-10-29 05:03:00 +00:00
dependabot[bot]
50f39284ce Bump elliptic from 6.5.7 to 6.6.0 in /web (#3990)
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.7 to 6.6.0.
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.7...v6.6.0)

---
updated-dependencies:
- dependency-name: elliptic
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-28 21:58:03 -07:00
Owncast
9c36e196b7 Bundle embedded web app 2024-10-29 02:01:49 +00:00
renovate[bot]
274c85ac2b chore(deps): lock file maintenance 2024-10-29 01:56:42 +00:00
Owncast
5eaa06cf15 Bundle embedded web app 2024-10-28 21:46:57 +00:00
renovate[bot]
86c20e0a39 chore(deps): update dependency chromatic to v11.16.1 2024-10-28 18:52:58 +00:00
Owncast
90a8ebbfa4 Bundle embedded web app 2024-10-28 18:50:58 +00:00
renovate[bot]
e995836ee4 chore(deps): update dependency @babel/core to v7.26.0 2024-10-28 15:58:07 +00:00
Owncast
fe040070de Bundle embedded web app 2024-10-28 15:56:15 +00:00
renovate[bot]
9d3290c2c1 chore(deps): update dependency @types/node to v20.17.1 2024-10-28 13:30:53 +00:00
Owncast
97880ce93e Bundle embedded web app 2024-10-28 13:29:58 +00:00
renovate[bot]
c14ec935da fix(deps): update dependency @uiw/react-codemirror to v4.23.6 2024-10-28 09:11:59 +00:00
Owncast
8a3e91fdc8 Bundle embedded web app 2024-10-28 09:10:52 +00:00
renovate[bot]
bdcb481a51 fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.23.6 2024-10-28 06:11:47 +00:00
Gabe Kangas
eed34b528e Update API gen, cleanup, add missing property to status response (#3987)
* fix(api): remove invalid tag properties from components

* chore(api): update api validation/linter to use redocly

* fix(api): add missing streamTitle property to status object. Closes #3983

* chore: add redocly config file

* Commit updated API documentation

---------

Co-authored-by: Owncast <owncast@owncast.online>
2024-10-27 15:36:31 -07:00
Owncast
5a3600e01f Bundle embedded web app 2024-10-27 21:59:35 +00:00
renovate[bot]
022e505ee0 chore(deps): update dependency cypress to v13.15.1 2024-10-27 18:32:10 +00:00
Owncast
b9733109fa Bundle embedded web app 2024-10-27 15:21:45 +00:00
renovate[bot]
3d146de750 chore(deps): update dependency knip to v5.34.0 2024-10-27 12:49:07 +00:00
Owncast
b475fbaa5d Bundle embedded web app 2024-10-27 12:47:39 +00:00
renovate[bot]
fd14133e91 chore(deps): update dependency chromatic to v11.15.0 2024-10-27 09:45:07 +00:00
Owncast
f0c07e6a7b Bundle embedded web app 2024-10-27 09:43:16 +00:00
renovate[bot]
ee568866ec chore(deps): update dependency @types/node to v20.17.0 2024-10-27 07:09:36 +00:00
Owncast
943d8efe0d Bundle embedded web app 2024-10-27 07:08:32 +00:00
renovate[bot]
c9dcc88320 fix(deps): update nextjs monorepo to v14.2.16 2024-10-27 03:49:28 +00:00
Owncast
8819cd8980 Bundle embedded web app 2024-10-27 03:47:01 +00:00
renovate[bot]
016951a3be chore(deps): update dependency sass to v1.80.4 2024-10-27 01:48:56 +00:00
Gabe Kangas
c44d56af63 fix(test): update tests to reflect the new transcoder flag 2024-10-26 15:09:47 -07:00
Owncast
5501e20e82 Bundle embedded web app 2024-10-26 22:02:48 +00:00
renovate[bot]
83c601b5c9 chore(deps): update dependency html-webpack-plugin to v5.6.3 2024-10-26 19:37:01 +00:00
Gabe Kangas
0fccaa61fe fix(video): fix nil reference exception in playback metrics. Closes #3984 2024-10-26 12:22:19 -07:00
Gabe Kangas
05545cb6da Add persistent http connection optimization. Closes #3985 2024-10-26 11:58:02 -07:00
Owncast
0e0f8d7284 Bundle embedded web app 2024-10-26 17:09:58 +00:00
renovate[bot]
734636039f chore(deps): update dependency @types/react to v18.3.12 2024-10-26 13:19:52 +00:00
Owncast
14b73706ce Bundle embedded web app 2024-10-26 13:19:09 +00:00
renovate[bot]
f2600a02fb chore(deps): update dependency @types/node to v20.16.15 2024-10-26 09:30:18 +00:00
Owncast
f7a7eed782 Bundle embedded web app 2024-10-26 09:28:17 +00:00
renovate[bot]
d2bfdab339 chore(deps): update dependency @types/jest to v29.5.14 2024-10-26 06:21:32 +00:00
Owncast
756d407ce2 Bundle embedded web app 2024-10-26 06:20:20 +00:00
renovate[bot]
ec3437f9e1 chore(deps): update dependency @types/classnames to v2.3.4 2024-10-26 03:51:01 +00:00
Owncast
8362589364 Bundle embedded web app 2024-10-26 00:20:03 +00:00
renovate[bot]
bc2f8fed9c chore(deps): update dependency eslint-plugin-react to v7.37.2 2024-10-25 23:08:42 +00:00
Owncast
959ffb58ac Bundle embedded web app 2024-10-25 18:22:32 +00:00
renovate[bot]
4ddc19f91f chore(deps): update babel monorepo to v7.25.9 2024-10-25 17:10:31 +00:00
Owncast
6ea0cb10c5 Bundle embedded web app 2024-10-25 14:35:03 +00:00
renovate[bot]
da23ee8e3e fix(deps): update dependency video.js to v8.19.1 2024-10-25 10:15:08 +00:00
Owncast
85084e4b60 Bundle embedded web app 2024-10-25 06:31:45 +00:00
renovate[bot]
4315d19daa chore(deps): update dependency @types/node to v20.16.14 2024-10-25 03:47:54 +00:00
Owncast
91efec9200 Bundle embedded web app 2024-10-25 01:55:30 +00:00
renovate[bot]
6baa2e28d7 chore(deps): update dependency chromatic to v11.14.0 2024-10-24 21:39:56 +00:00
Owncast
476be88c86 Bundle embedded web app 2024-10-24 21:37:45 +00:00
renovate[bot]
abe0c49b38 chore(deps): update typescript-eslint monorepo to v8.11.0 2024-10-24 19:31:26 +00:00
Owncast
8ca104634b Bundle embedded web app 2024-10-24 15:08:32 +00:00
renovate[bot]
06706702f8 chore(deps): update dependency eslint-plugin-storybook to v0.10.1 2024-10-24 12:25:23 +00:00
Owncast
b3c42769cb Bundle embedded web app 2024-10-24 10:20:13 +00:00
renovate[bot]
7178b3b557 chore(deps): update dependency eslint-plugin-jsx-a11y to v6.10.1 2024-10-24 08:25:23 +00:00
renovate[bot]
01dc997fb4 chore(deps): update peter-evans/create-or-update-comment digest to d5aa8cd 2024-10-23 06:20:24 +00:00
Owncast
a00e726c22 Bundle embedded web app 2024-10-22 23:34:30 +00:00
embr
2015a566cb Fix websocket reconnection (#3959)
The `onerror` event is only triggered if the buffer is full while the
socket is closed, while the `onclose` event is called for any kind of
disconnection: https://websockets.spec.whatwg.org/#closeWebSocket

Fixes: https://github.com/owncast/owncast/issues/3958

Co-authored-by: Alyssa Ross <hi@alyssa.is>
2024-10-22 16:29:46 -07:00
Owncast
45392aa5ad Bundle embedded web app 2024-10-22 07:26:31 +00:00
renovate[bot]
b07413a314 chore(deps): update dependency @types/node to v20.16.13 2024-10-22 05:17:10 +00:00
Owncast
90f6d4333c Bundle embedded web app 2024-10-22 05:15:05 +00:00
renovate[bot]
beeeaede5e chore(deps): update dependency sass to v1.80.3 2024-10-22 02:03:10 +00:00
Owncast
1c09c7c544 Bundle embedded web app 2024-10-21 19:31:41 +00:00
renovate[bot]
352df6a604 chore(deps): update dependency @mdx-js/react to v3.1.0 2024-10-21 17:02:47 +00:00
Owncast
db635a8119 Bundle embedded web app 2024-10-21 13:19:17 +00:00
renovate[bot]
1f06deb52f chore(deps): lock file maintenance 2024-10-21 13:14:19 +00:00
Owncast
29099d5d07 Bundle embedded web app 2024-10-21 04:40:48 +00:00
renovate[bot]
488b5d7d87 chore(deps): update typescript-eslint monorepo to v8.10.0 2024-10-21 00:49:11 +00:00
Owncast
1e9a34b0eb Bundle embedded web app 2024-10-21 00:47:55 +00:00
renovate[bot]
e9b778eba6 chore(deps): update dependency sass to v1.80.2 2024-10-20 22:52:56 +00:00
Owncast
51536bae82 Bundle embedded web app 2024-10-20 22:46:41 +00:00
renovate[bot]
54d8ad5acb chore(deps): update dependency mermaid to v11 (#3965)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-20 15:41:43 -07:00
Owncast
2e0e79162a Bundle embedded web app 2024-10-20 22:38:02 +00:00
renovate[bot]
0e0167d4bd fix(deps): update dependency react-virtuoso to v4.12.0 (#3968)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-20 15:32:52 -07:00
renovate[bot]
d0a1e78b69 fix(deps): update dependency react-error-boundary to v4.1.1 (#3973)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-20 15:32:28 -07:00
Owncast
fa6da3b475 Bundle embedded web app 2024-10-20 22:10:37 +00:00
renovate[bot]
87c0b88fda fix(deps): update dependency chart.js to v4.4.5 (#3974)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-20 15:05:34 -07:00
Owncast
23a91674bc Bundle embedded web app 2024-10-20 21:46:00 +00:00
renovate[bot]
9ddf99ad1a chore(deps): update dependency html-webpack-plugin to v5.6.2 2024-10-20 19:36:45 +00:00
Owncast
3dbc075f9b Bundle embedded web app 2024-10-20 19:34:57 +00:00
Gabe Kangas
4ac3068fcb fix(css): run prittier on css file 2024-10-20 12:29:36 -07:00
Owncast
c23b04c3ab Bundle embedded web app 2024-10-20 19:29:32 +00:00
Gabe Kangas
edc920f7db fix(storybook): update storybook generation templates 2024-10-20 12:23:45 -07:00
Gabe Kangas
78a7a45ff0 fix(sass): resolve sass warning by wrapping in root 2024-10-20 12:20:22 -07:00
Owncast
2e01006126 Bundle embedded web app 2024-10-20 18:47:27 +00:00
renovate[bot]
4cada70b2c chore(deps): update dependency chromatic to v11.12.6 2024-10-20 16:19:08 +00:00
Owncast
464c3154c2 Bundle embedded web app 2024-10-20 16:17:19 +00:00
renovate[bot]
dfb47b5e58 chore(deps): update typescript-eslint monorepo to v8.9.0 2024-10-20 16:12:17 +00:00
Owncast
1454ba5f2d Bundle embedded web app 2024-10-20 13:05:18 +00:00
renovate[bot]
28b6b38613 chore(deps): update dependency sass to v1.80.1 2024-10-20 10:15:04 +00:00
Owncast
8c917d29d4 Bundle embedded web app 2024-10-20 10:07:50 +00:00
renovate[bot]
940a0e2fde fix(deps): update dependency @uiw/react-codemirror to v4.23.5 2024-10-20 07:07:18 +00:00
Owncast
a4ba8827cc Bundle embedded web app 2024-10-20 07:06:07 +00:00
renovate[bot]
59fafc6fc6 fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.23.5 2024-10-20 04:20:54 +00:00
Owncast
c7b0f59e51 Bundle embedded web app 2024-10-20 04:18:44 +00:00
renovate[bot]
6c64e67af9 chore(deps): update dependency @types/node to v20.16.12 2024-10-20 01:13:19 +00:00
Owncast
889c10945b Bundle embedded web app 2024-10-20 01:05:05 +00:00
Gabe Kangas
78146f1ee3 fix(storybook): fix typography page from not rendering 2024-10-19 17:54:29 -07:00
Gabe Kangas
a747aea71c Continued WIP. Most of Storybook 8 runs. 2024-10-19 17:54:27 -07:00
Gabe Kangas
1e362d39ac chore: remove documentation that is better suited to exist elsewhere 2024-10-19 17:53:45 -07:00
mahmed2000
3d9bd9d353 Storybook 8 fixes (#3937)
* Add globs for auto-generated CSF screenshot stories to main.js

* Remove unneeded mdx files for screenshots

* Glob for stories.js instead of just js files in the doc pages directory

* Might as well update it to 8.3 while we're at it

* Update knip config file to make it happy

* Fix linter warning

---------

Co-authored-by: Gabe Kangas <gabek@real-ity.com>
2024-10-19 17:53:45 -07:00
Gabe Kangas
f424fe6dae WIP storybook upgrade 2024-10-19 17:53:42 -07:00
Owncast
d939d9f43d Bundle embedded web app 2024-10-20 00:51:07 +00:00
renovate[bot]
6295f8d1a1 chore(deps): update dependency @types/node to v20.16.12 2024-10-20 00:28:32 +00:00
Owncast
85ded31098 Bundle embedded web app 2024-10-20 00:25:38 +00:00
renovate[bot]
f8444459b8 fix(deps): update dependency chart.js to v4.4.5 2024-10-20 00:20:06 +00:00
Owncast
7b4959cc6d Bundle embedded web app 2024-10-19 22:34:30 +00:00
Gabe Kangas
df3a9424b1 fix(test): fix javascript tests not running 2024-10-19 15:28:41 -07:00
Gabe Kangas
742df5322f fix(web): specify node version to be 22.9.0 for builds 2024-10-19 11:51:23 -07:00
Gabe Kangas
e5a4404770 fix(web): isable swc features and fix build 2024-10-18 08:33:27 -07:00
renovate[bot]
39f486cd52 fix(deps): update module golang.org/x/time to v0.7.0 2024-10-16 22:20:44 +00:00
renovate[bot]
21a40540c2 fix(deps): update module golang.org/x/net to v0.30.0 2024-10-16 20:40:10 +00:00
renovate[bot]
bedbf544ff fix(deps): update module github.com/yuin/goldmark to v1.7.8 2024-10-16 16:30:07 +00:00
renovate[bot]
5ba606903c fix(deps): update module golang.org/x/crypto to v0.28.0 2024-10-16 14:18:33 +00:00
Owncast
18ce952706 Bundle embedded web app 2024-10-16 14:17:28 +00:00
renovate[bot]
0ac5937eea fix(deps): update dependency yaml to v2.6.0 2024-10-16 11:36:14 +00:00
renovate[bot]
390c51bac0 fix(deps): update module github.com/yuin/goldmark-emoji to v1.0.4 2024-10-16 06:38:44 +00:00
renovate[bot]
bbb436e971 fix(deps): update module github.com/yuin/goldmark to v1.7.7 2024-10-16 03:28:07 +00:00
renovate[bot]
c78622ada6 fix(deps): update module github.com/prometheus/client_golang to v1.20.5 2024-10-16 01:28:29 +00:00
renovate[bot]
b95a9d7b7a fix(deps): update module github.com/mattn/go-sqlite3 to v1.14.24 2024-10-15 21:51:23 +00:00
Owncast
6d37dc1e1e Bundle embedded web app 2024-10-14 09:41:19 +00:00
renovate[bot]
65c03ee57b chore(deps): lock file maintenance 2024-10-14 09:35:54 +00:00
Owncast
ec1a0c5fb3 Bundle embedded web app 2024-10-14 04:30:56 +00:00
renovate[bot]
2ff71edb76 chore(deps): update dependency sass to v1.79.5 2024-10-14 01:10:43 +00:00
Owncast
1e470e2ce1 Bundle embedded web app 2024-10-13 19:09:02 +00:00
renovate[bot]
b8f3c7ba54 chore(deps): update dependency @babel/core to v7.25.8 2024-10-13 15:14:22 +00:00
Owncast
04a079b623 Bundle embedded web app 2024-10-13 12:23:07 +00:00
renovate[bot]
d911b0a8ba chore(deps): update dependency knip to v5.33.3 2024-10-13 10:14:41 +00:00
Owncast
cc48275237 Bundle embedded web app 2024-10-13 01:09:49 +00:00
renovate[bot]
6d50f7004d chore(deps): update dependency chromatic to v11.12.5 2024-10-12 23:06:56 +00:00
Owncast
e276e42e1e Bundle embedded web app 2024-10-12 04:30:52 +00:00
renovate[bot]
0b22538af1 fix(deps): update nextjs monorepo to v14.2.15 2024-10-12 01:08:01 +00:00
Owncast
c712c5f793 Bundle embedded web app 2024-10-12 01:05:08 +00:00
renovate[bot]
5b04578765 chore(deps): update dependency typescript to v5.6.3 2024-10-11 22:29:18 +00:00
Owncast
50852921fc Bundle embedded web app 2024-10-11 22:27:54 +00:00
renovate[bot]
8a86914827 chore(deps): update dependency knip to v5.33.2 2024-10-11 19:15:38 +00:00
Eng Zer Jun
08bda166fe Replace github.com/shirou/gopsutil/v3 with v4 (#3956)
* Replace `github.com/shirou/gopsutil/v3` to v4

PR #3925 only added the new v4 dependency into our `go.mod` file. The
actual usages in the source code were not updated to use the new v4
version.

Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>

* Tidy `go.mod` correctly

One `require` section for direct dependencies; Another `require` section
for indirect dependencies.

Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>

---------

Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>
2024-10-11 12:13:33 -07:00
mahmed2000
deb938d521 Fix incorrect timestamp on Eartlhy packaged binary (#3955) 2024-10-11 08:31:44 -07:00
Owncast
eec9317b93 Bundle embedded web app 2024-10-11 06:10:53 +00:00
renovate[bot]
bb25bc9a82 chore(deps): update dependency knip to v5.33.1 2024-10-11 04:35:53 +00:00
Owncast
8f6508e7fd Bundle embedded web app 2024-10-11 04:33:36 +00:00
renovate[bot]
4ec00e9033 chore(deps): update dependency chromatic to v11.12.0 2024-10-11 02:09:29 +00:00
Owncast
384cd4b730 Bundle embedded web app 2024-10-11 02:07:13 +00:00
renovate[bot]
193edb4871 chore(deps): update dependency @types/node to v20.16.11 2024-10-10 22:30:25 +00:00
Owncast
369667e8f5 Bundle embedded web app 2024-10-10 22:28:34 +00:00
renovate[bot]
6c6f313de6 chore(deps): update typescript-eslint monorepo to v8.8.1 2024-10-10 18:28:52 +00:00
Owncast
f0323731dd Bundle embedded web app 2024-10-10 15:10:44 +00:00
mahmed2000
dd5a14cd1a Fix mistyped filter value in the admin's log table (#3952) 2024-10-10 08:05:05 -07:00
Owncast
e59285d998 Bundle embedded web app 2024-10-09 22:21:13 +00:00
s-vamshi
c528d3921f fix(web): long usernames in chat truncated (#3949) 2024-10-09 15:15:58 -07:00
renovate[bot]
c00440d918 chore(deps): update peter-evans/create-or-update-comment digest to 1b44297 2024-10-09 10:48:53 +00:00
Owncast
b35b139fbc Bundle embedded web app 2024-10-08 10:16:50 +00:00
renovate[bot]
3afe880b45 fix(deps): update dependency @uiw/react-codemirror to v4.23.5 2024-10-08 08:15:01 +00:00
Owncast
0a878401a4 Bundle embedded web app 2024-10-08 08:12:41 +00:00
renovate[bot]
71c141980a fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.23.5 2024-10-08 03:40:09 +00:00
Owncast
d33954c68d Bundle embedded web app 2024-10-07 15:17:45 +00:00
renovate[bot]
e14713631f chore(deps): lock file maintenance 2024-10-07 15:12:15 +00:00
Owncast
f45cbd421c Bundle embedded web app 2024-10-07 12:11:42 +00:00
renovate[bot]
06dcf82fe1 fix(deps): update dependency video.js to v8.18.1 2024-10-07 10:36:38 +00:00
Owncast
0812dbb1e9 Bundle embedded web app 2024-10-07 10:35:02 +00:00
renovate[bot]
e551096dd1 chore(deps): lock file maintenance 2024-10-07 10:29:17 +00:00
Gabe Kangas
8d08ae5147 chore: tweaking workflow text 2024-10-06 21:44:19 -07:00
Owncast
99652825b6 Bundle embedded web app 2024-10-07 03:35:05 +00:00
renovate[bot]
e074d3e83a chore(deps): update dependency npm to v10.9.0 2024-10-07 02:56:24 +00:00
Gabe Kangas
e5aa3c3cfb fix: remove invalid setting 2024-10-06 19:54:42 -07:00
Gabe Kangas
b55e4045c1 chore: replace old stale github app with workflow action 2024-10-06 18:12:13 -07:00
Owncast
ac3f7a2ac8 Bundle embedded web app 2024-10-06 21:07:23 +00:00
renovate[bot]
5f71210744 chore(deps): update dependency eslint-plugin-import to v2.31.0 2024-10-06 21:02:09 +00:00
Owncast
bc6f5c02cf Bundle embedded web app 2024-10-06 19:45:53 +00:00
renovate[bot]
b104d1222a fix(deps): update dependency sanitize-html to v2.13.1 2024-10-06 15:38:27 +00:00
Owncast
8b1601b76a Bundle embedded web app 2024-10-06 10:50:10 +00:00
renovate[bot]
1e86f3cd8b chore(deps): update dependency knip to v5.31.0 2024-10-06 06:16:07 +00:00
Owncast
a6ff8f14d4 Bundle embedded web app 2024-10-06 04:19:29 +00:00
renovate[bot]
ed04e2e0af fix(deps): update dependency @uiw/react-codemirror to v4.23.4 2024-10-06 00:40:19 +00:00
Owncast
cf237c2923 Bundle embedded web app 2024-10-06 00:39:08 +00:00
renovate[bot]
33807f0acc fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.23.4 2024-10-05 22:10:51 +00:00
Owncast
f439f400e2 Bundle embedded web app 2024-10-05 22:09:38 +00:00
renovate[bot]
9dc090e3dc chore(deps): update dependency @types/react to v18.3.11 2024-10-05 18:40:37 +00:00
Owncast
6c8186b995 Bundle embedded web app 2024-10-05 18:39:22 +00:00
renovate[bot]
f705c887ff chore(deps): update dependency @babel/core to v7.25.7 2024-10-05 17:06:10 +00:00
Owncast
73e9e7eb7c Bundle embedded web app 2024-10-05 17:05:25 +00:00
renovate[bot]
b8ff62d2c5 chore(deps): update dependency mermaid to v10.9.2 2024-10-05 12:43:05 +00:00
Owncast
b5dcbf5d72 Bundle embedded web app 2024-10-04 21:40:36 +00:00
renovate[bot]
f0402792d6 fix(deps): update nextjs monorepo to v14.2.14 2024-10-04 18:48:05 +00:00
Owncast
c5abe686eb Bundle embedded web app 2024-10-04 18:46:30 +00:00
renovate[bot]
61802b6008 chore(deps): update dependency eslint-plugin-react to v7.37.1 2024-10-04 16:00:20 +00:00
Owncast
e6ce12d625 Bundle embedded web app 2024-10-04 01:45:16 +00:00
renovate[bot]
6b84a5248c chore(deps): update dependency chromatic to v11.11.0 2024-10-03 21:44:24 +00:00
Owncast
b73ea79431 Bundle embedded web app 2024-10-03 21:42:58 +00:00
renovate[bot]
edcc428b3c chore(deps): update typescript-eslint monorepo to v8.8.0 2024-10-03 18:49:49 +00:00
renovate[bot]
b00c48e369 chore(deps): update peter-evans/create-or-update-comment digest to 48de637 2024-10-02 06:34:21 +00:00
Florian Greinacher
ee1dc904e1 chore: use correct manager name in Renovate config (#3943) 2024-10-01 09:16:53 -07:00
Owncast
9ce46753fc Bundle embedded web app 2024-10-01 12:13:50 +00:00
renovate[bot]
2fffd175d7 fix(deps): update dependency @codemirror/lang-markdown to v6.3.0 2024-10-01 09:07:25 +00:00
Owncast
0749708942 Bundle embedded web app 2024-10-01 06:41:12 +00:00
renovate[bot]
b7a1bc53c3 chore(deps): update dependency sass to v1.79.4 2024-10-01 03:52:57 +00:00
Owncast
43f99ae3c8 Bundle embedded web app 2024-09-30 22:30:48 +00:00
renovate[bot]
5bd79b01b2 chore(deps): update dependency @types/react to v18.3.10 2024-09-30 19:42:27 +00:00
Owncast
ad165bc76b Bundle embedded web app 2024-09-30 19:41:37 +00:00
renovate[bot]
36373a96e1 chore(deps): update dependency @types/node to v20.16.10 2024-09-30 17:00:21 +00:00
Owncast
f5ebcc76eb Bundle embedded web app 2024-09-30 11:13:57 +00:00
renovate[bot]
3eb214d842 chore(deps): lock file maintenance 2024-09-30 11:08:44 +00:00
Owncast
e1e6d18bf3 Bundle embedded web app 2024-09-30 07:55:12 +00:00
renovate[bot]
00ee31d224 chore(deps): update dependency eslint-plugin-react to v7.37.0 2024-09-30 04:16:20 +00:00
Owncast
63459b2354 Bundle embedded web app 2024-09-29 19:23:50 +00:00
renovate[bot]
656a3156f2 chore(deps): update dependency eslint-plugin-storybook to v0.9.0 2024-09-29 16:13:48 +00:00
Owncast
2447a57e00 Bundle embedded web app 2024-09-29 04:09:23 +00:00
renovate[bot]
066de108db chore(deps): update dependency @types/node to v20.16.9 2024-09-29 00:28:29 +00:00
Owncast
31a1c8b960 Bundle embedded web app 2024-09-29 00:27:49 +00:00
renovate[bot]
21ae3069e2 chore(deps): update dependency cypress to v13.15.0 2024-09-28 21:33:46 +00:00
Owncast
32d796d56c Bundle embedded web app 2024-09-28 21:32:43 +00:00
renovate[bot]
ace38e6b1e chore(deps): update dependency @types/node to v20.16.8 2024-09-28 18:35:06 +00:00
Owncast
1b0d17a602 Bundle embedded web app 2024-09-28 07:10:30 +00:00
renovate[bot]
27260122e2 chore(deps): update dependency @types/node to v20.16.7 2024-09-28 04:30:13 +00:00
Owncast
150a788fc5 Bundle embedded web app 2024-09-27 23:59:04 +00:00
renovate[bot]
0597953ea1 chore(deps): update dependency chromatic to v11.10.4 2024-09-27 21:32:15 +00:00
Owncast
a3bebd98c5 Bundle embedded web app 2024-09-27 21:31:36 +00:00
renovate[bot]
c5c1bc928b chore(deps): update dependency @types/react to v18.3.9 2024-09-27 19:51:57 +00:00
Owncast
6e7e4c9fc1 Bundle embedded web app 2024-09-27 16:22:13 +00:00
dependabot[bot]
99311911f1 Bump rollup from 2.79.1 to 2.79.2 in /web (#3939)
Bumps [rollup](https://github.com/rollup/rollup) from 2.79.1 to 2.79.2.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v2.79.1...v2.79.2)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-27 09:15:08 -07:00
Owncast
593a94131d Bundle embedded web app 2024-09-27 06:12:17 +00:00
renovate[bot]
d076fefa99 chore(deps): update typescript-eslint monorepo to v8.7.0 2024-09-27 04:56:31 +00:00
Owncast
0b9260161b Bundle embedded web app 2024-09-27 04:55:04 +00:00
renovate[bot]
dc3aafa6cc chore(deps): update dependency chromatic to v11.10.3 2024-09-27 01:40:10 +00:00
Owncast
7c6dbc94bc Bundle embedded web app 2024-09-27 01:38:30 +00:00
renovate[bot]
e5239c169b chore(deps): update dependency @types/node to v20.16.6 2024-09-26 23:50:06 +00:00
renovate[bot]
5cd4c14943 fix(deps): update module github.com/shirou/gopsutil/v3 to v4 (#3925)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-26 16:49:35 -07:00
Gabe Kangas
ef66e2c3a0 Explicitly set viewer count to 0 if offline. Closes #3830 2024-09-26 13:38:14 -07:00
Florian Greinacher
dcb0ff5f51 fix: update Alpine base image (#3938)
* fix: update Alpine base image

Alpine 3.11 is out of support since nearly a year

* chore: help Renovate detect images in  the Earthfile
2024-09-26 08:21:26 -07:00
Owncast
07b69e1795 Bundle embedded web app 2024-09-26 12:22:20 +00:00
renovate[bot]
e4cf7742d1 fix(deps): update dependency @uiw/react-codemirror to v4.23.3 2024-09-26 09:31:53 +00:00
Owncast
7de49e8605 Bundle embedded web app 2024-09-26 09:30:44 +00:00
renovate[bot]
8a2a0a1249 fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.23.3 2024-09-26 07:15:58 +00:00
renovate[bot]
2794a5d1d8 chore(deps): update peter-evans/create-or-update-comment digest to 5ddb8ea 2024-09-25 09:52:11 +00:00
Owncast
4e29efe24d Bundle embedded web app 2024-09-24 08:10:01 +00:00
renovate[bot]
c9924cdbab chore(deps): update dependency sass to v1.79.3 2024-09-24 08:04:30 +00:00
Owncast
36e1b678ce Bundle embedded web app 2024-09-23 12:39:30 +00:00
renovate[bot]
6fad3b00fa chore(deps): lock file maintenance 2024-09-23 12:34:15 +00:00
Owncast
e7760103ee Bundle embedded web app 2024-09-23 06:10:08 +00:00
renovate[bot]
63fb720955 fix(deps): update nextjs monorepo to v14.2.13 2024-09-23 03:35:45 +00:00
Owncast
43f4d680c7 Bundle embedded web app 2024-09-23 03:33:37 +00:00
renovate[bot]
2db008ad88 chore(deps): update dependency sass to v1.79.2 2024-09-23 01:35:42 +00:00
Owncast
0f4113b673 Bundle embedded web app 2024-09-22 22:02:28 +00:00
renovate[bot]
a91a5ef9e4 chore(deps): update dependency @types/react to v18.3.8 2024-09-22 19:11:41 +00:00
Owncast
cbd984282b Bundle embedded web app 2024-09-21 03:40:10 +00:00
renovate[bot]
cf61b51de7 chore(deps): update dependency sass to v1.79.1 2024-09-21 02:31:32 +00:00
Owncast
7efea74285 Bundle embedded web app 2024-09-21 02:30:11 +00:00
renovate[bot]
45d1b187b1 fix(deps): update nextjs monorepo to v14.2.12 2024-09-20 21:36:30 +00:00
Owncast
dfac42b6ad Bundle embedded web app 2024-09-20 15:59:41 +00:00
renovate[bot]
0758786790 chore(deps): update dependency @types/react to v18.3.7 2024-09-20 13:54:12 +00:00
Owncast
d72c7639f2 Bundle embedded web app 2024-09-20 09:06:53 +00:00
renovate[bot]
bd68667b00 chore(deps): update typescript-eslint monorepo to v8.6.0 2024-09-20 07:24:29 +00:00
Owncast
983db3c675 Javascript formatting autofixes 2024-09-20 03:18:25 +00:00
Aelly Alwardi
84f0dd07ae Move title up a level to allow mouse hover to show timestamp (#3926)
* Move title up a level to allow mouse hover to show timestamp

* Fix bad commit to resolve 3848

---------

Co-authored-by: Gabe Kangas <gabek@real-ity.com>
2024-09-19 20:15:49 -07:00
Owncast
ac3cc16250 Bundle embedded web app 2024-09-20 01:20:28 +00:00
renovate[bot]
e9cfa5e408 chore(deps): update dependency eslint to v8.57.1 2024-09-19 21:25:28 +00:00
Owncast
7217eaa289 Bundle embedded web app 2024-09-19 21:24:45 +00:00
renovate[bot]
b30d2de195 chore(deps): update dependency @types/prop-types to v15.7.13 2024-09-19 19:19:01 +00:00
Owncast
b2f341a3e5 Bundle embedded web app 2024-09-19 19:18:09 +00:00
renovate[bot]
30bb93ee77 chore(deps): update dependency babel-loader to v9.2.1 2024-09-19 15:15:26 +00:00
Owncast
4e53acddcf Bundle embedded web app 2024-09-19 12:29:33 +00:00
renovate[bot]
96753349bc chore(deps): update dependency @types/react to v18.3.6 2024-09-19 10:58:28 +00:00
Gabe Kangas
387dcd464d chore(go): go mod tidy 2024-09-18 19:38:11 -07:00
renovate[bot]
3cbc9ca57c chore(deps): update peter-evans/create-or-update-comment digest to 1efb899 2024-09-18 06:52:56 +00:00
renovate[bot]
6b7901c7dc fix(deps): update module golang.org/x/net to v0.29.0 2024-09-18 03:55:46 +00:00
renovate[bot]
41075416f8 fix(deps): update module golang.org/x/mod to v0.21.0 (#3928)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-17 20:52:35 -07:00
renovate[bot]
53a1e5d585 fix(deps): update module golang.org/x/crypto to v0.27.0 (#3927)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-17 20:52:19 -07:00
Gabe Kangas
3050d64909 fix(go): fix type conversion for windows 2024-09-17 19:11:16 -07:00
Gabe Kangas
99fbefd558 Remove fix flag 2024-09-17 16:44:36 -07:00
Gabe Kangas
0bca16deb6 Only write formatted files in CI when not in a PR 2024-09-17 16:39:54 -07:00
Gabe Kangas
5e5f023b8a Only try to commit formated files if running on the owncast/owncast repo 2024-09-17 16:35:36 -07:00
Owncast
02bfc6b3d9 Bundle embedded web app 2024-09-17 21:44:31 +00:00
renovate[bot]
ec975f1614 fix(deps): update fontsource monorepo to v5.1.0 2024-09-17 19:06:21 +00:00
Gabe Kangas
6d768f0b0a fix(go): fix type conversions for FreeBSD and Windows methods 2024-09-17 08:28:01 -07:00
renovate[bot]
968af5f934 chore(deps): update tj-actions/changed-files action to v45 (#3924)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Gabe Kangas <gabek@real-ity.com>
2024-09-17 08:24:24 -07:00
Gabe Kangas
7a65e6d808 fix(go): int64 -> uint64 for connection limit value 2024-09-17 08:12:09 -07:00
Owncast
6cf93b98e1 Bundle embedded web app 2024-09-17 12:19:07 +00:00
renovate[bot]
bba2f3c694 fix(deps): update dependency @codemirror/lang-css to v6.3.0 2024-09-17 10:21:29 +00:00
Owncast
aa288b910b Bundle embedded web app 2024-09-17 10:19:47 +00:00
renovate[bot]
63f52dc2eb fix(deps): update dependency ua-parser-js to v1.0.39 2024-09-17 08:06:38 +00:00
Owncast
a914603245 Bundle embedded web app 2024-09-17 08:05:33 +00:00
renovate[bot]
83acaf97ec chore(deps): update dependency typescript to v5.6.2 2024-09-17 03:22:00 +00:00
Owncast
487180785c Bundle embedded web app 2024-09-17 03:20:12 +00:00
renovate[bot]
eae90af0dd chore(deps): update dependency chromatic to v11.10.2 2024-09-17 01:09:56 +00:00
Owncast
67ee31842b Bundle embedded web app 2024-09-17 01:08:33 +00:00
renovate[bot]
f66fae7724 fix(deps): update nextjs monorepo to v14.2.11 2024-09-16 22:48:32 +00:00
Owncast
e038c65f8b Bundle embedded web app 2024-09-16 22:47:24 +00:00
renovate[bot]
d4aa54874e fix(deps): update dependency video.js to v8.17.4 2024-09-16 20:46:23 +00:00
Owncast
54f4179282 Bundle embedded web app 2024-09-16 20:45:42 +00:00
renovate[bot]
9fb4b4a749 fix(deps): update dependency react-virtuoso to v4.10.4 2024-09-16 18:54:14 +00:00
Owncast
b59d66cdf2 Bundle embedded web app 2024-09-16 18:53:12 +00:00
renovate[bot]
1660147ef3 fix(deps): update dependency react-hotkeys-hook to v4.5.1 2024-09-16 17:14:05 +00:00
Owncast
a7ca77960f Bundle embedded web app 2024-09-16 17:13:03 +00:00
renovate[bot]
ffb6b38561 fix(deps): update dependency @uiw/react-codemirror to v4.23.2 2024-09-16 13:40:39 +00:00
Owncast
18a73ed5a6 Bundle embedded web app 2024-09-16 13:39:37 +00:00
renovate[bot]
3b03b2467d chore(deps): update dependency knip to v5.30.2 2024-09-16 11:08:18 +00:00
Owncast
6fa2e3aa7a Bundle embedded web app 2024-09-16 11:07:21 +00:00
renovate[bot]
837b30fbbb fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.23.2 2024-09-16 07:06:04 +00:00
Owncast
82241ffce8 Bundle embedded web app 2024-09-16 07:05:09 +00:00
renovate[bot]
3d848f505f chore(deps): update dependency eslint-plugin-react to v7.36.1 2024-09-16 04:34:59 +00:00
Owncast
e52247e5ef Bundle embedded web app 2024-09-16 04:34:18 +00:00
renovate[bot]
ed91588ba1 chore(deps): update dependency cypress to v13.14.2 2024-09-16 00:56:10 +00:00
Owncast
6572cbab18 Bundle embedded web app 2024-09-16 00:54:36 +00:00
renovate[bot]
56af5ee111 chore(deps): update dependency @types/jest to v29.5.13 2024-09-15 21:00:16 +00:00
Owncast
c61ede6bab Bundle embedded web app 2024-09-15 20:59:43 +00:00
renovate[bot]
f6a1b1b638 chore(deps): update typescript-eslint monorepo to v8 (major) (#3887)
* chore(deps): update typescript-eslint monorepo to v8

* chore(js): fix linter errors

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Gabe Kangas <gabek@real-ity.com>
2024-09-15 13:51:33 -07:00
Owncast
86ce875da8 Bundle embedded web app 2024-09-15 20:21:26 +00:00
Gabe Kangas
3ccc92c317 chore(tests): disable no-plusplus rule in js linter 2024-09-15 13:15:19 -07:00
Owncast
b1dde41918 Bundle embedded web app 2024-09-15 19:51:13 +00:00
renovate[bot]
095b8c13fb chore(deps): update dependency knip to v5.30.1 (#3899)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-15 12:45:41 -07:00
renovate[bot]
cbc6ba47ee chore(deps): update peter-evans/create-or-update-comment digest to 00b0d20 2024-09-15 16:41:32 +00:00
Gabe Kangas
78c775747b chore(ci): specify the ref to check out 2024-09-15 09:40:52 -07:00
Owncast
065fbd03ad Bundle embedded web app 2024-09-15 16:09:42 +00:00
renovate[bot]
c01d738476 fix(deps): update module github.com/shirou/gopsutil/v3 to v4 (#3888)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Gabe Kangas <gabek@real-ity.com>
2024-09-15 08:51:10 -07:00
dependabot[bot]
73fdf2f087 Bump body-parser and express in /web (#3922)
Bumps [body-parser](https://github.com/expressjs/body-parser) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `body-parser` from 1.20.2 to 1.20.3
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/1.20.2...1.20.3)

Updates `express` from 4.19.2 to 4.21.0
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.19.2...4.21.0)

---
updated-dependencies:
- dependency-name: body-parser
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Gabe Kangas <gabek@real-ity.com>
2024-09-15 08:50:37 -07:00
dependabot[bot]
cda13d212f Bump serve-static and express in /web (#3923)
Bumps [serve-static](https://github.com/expressjs/serve-static) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `serve-static` from 1.15.0 to 1.16.2
- [Release notes](https://github.com/expressjs/serve-static/releases)
- [Changelog](https://github.com/expressjs/serve-static/blob/v1.16.2/HISTORY.md)
- [Commits](https://github.com/expressjs/serve-static/compare/v1.15.0...v1.16.2)

Updates `express` from 4.19.2 to 4.21.0
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.19.2...4.21.0)

---
updated-dependencies:
- dependency-name: serve-static
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Gabe Kangas <gabek@real-ity.com>
2024-09-15 08:49:22 -07:00
dependabot[bot]
14461c10c6 Bump send and express in /web (#3921)
Bumps [send](https://github.com/pillarjs/send) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `send` from 0.18.0 to 0.19.0
- [Release notes](https://github.com/pillarjs/send/releases)
- [Changelog](https://github.com/pillarjs/send/blob/master/HISTORY.md)
- [Commits](https://github.com/pillarjs/send/compare/0.18.0...0.19.0)

Updates `express` from 4.19.2 to 4.21.0
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.19.2...4.21.0)

---
updated-dependencies:
- dependency-name: send
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Gabe Kangas <gabek@real-ity.com>
2024-09-15 08:48:19 -07:00
renovate[bot]
0f814d2476 chore(deps): update commitlint monorepo to v19.5.0 (#3907)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-15 08:46:00 -07:00
Owncast
91f77afaf0 Bundle embedded web app 2024-09-15 15:18:15 +00:00
renovate[bot]
c4f4f00d95 chore(deps): update dependency eslint-plugin-react to v7.36.0 (#3914)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-15 08:11:57 -07:00
renovate[bot]
0a5279c92a chore(deps): update dependency sass to v1.78.0 (#3918)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-15 08:11:40 -07:00
dependabot[bot]
8b43f65904 Bump micromatch from 4.0.5 to 4.0.8 in /test/load (#3903)
Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.5 to 4.0.8.
- [Release notes](https://github.com/micromatch/micromatch/releases)
- [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/micromatch/compare/4.0.5...4.0.8)

---
updated-dependencies:
- dependency-name: micromatch
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-15 07:09:20 -07:00
Owncast
a16bedab82 Bundle embedded web app 2024-09-15 13:56:45 +00:00
renovate[bot]
41bded3a6b fix(deps): update dependency yaml to v2.5.1 (#3917)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-15 06:45:46 -07:00
renovate[bot]
150d847f7f chore(deps): update dependency @types/node to v20.16.5 (#3916)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-15 06:45:25 -07:00
renovate[bot]
6d5e1173a3 chore(deps): update dependency eslint-plugin-jsx-a11y to v6.10.0 (#3919)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-15 06:45:04 -07:00
Gabe Kangas
9b1c4128d8 chore(js): disable react/no-is-mounted rule 2024-09-15 06:44:39 -07:00
Gabe Kangas
4764e27b68 chore(tests): set older node version to work around babel issue in tests 2024-09-15 06:03:53 -07:00
Gabe Kangas
755308eca8 chore(tests): set specific node version in tests and bump Nextjs version 2024-09-15 05:52:20 -07:00
Gabe Kangas
4a317b799c Revert "chore(deps): update nextjs monorepo to v14.2.7"
This reverts commit 416462bd53.
2024-09-09 01:20:12 -04:00
Gabe Kangas
f75c4af2d8 fix(deps): update nextjs to fix babel issue breaking tests 2024-09-06 20:25:53 -07:00
renovate[bot]
5c252e05f9 chore(deps): update alpine docker tag to v3.20.3 2024-09-06 22:59:41 +00:00
Gabe Kangas
59f200c960 fix(test): run javascript tests as a part of build CI job 2024-09-05 18:13:03 -07:00
Owncast
6c9e4704cc Commit updated Storybook stories 2024-09-05 21:48:43 +00:00
Owncast
f7b61d8d9a Javascript formatting autofixes 2024-09-05 21:47:55 +00:00
zockicookie
39e77dc2cc Markdown-Editor-LineWrapping (#3908)
* Markdown-Editor-LineWrapping

* added lineWrapping to js and css editors

---------

Co-authored-by: Gabe Kangas <gabek@real-ity.com>
2024-09-05 14:45:09 -07:00
Gabe Kangas
7cdf18de99 fix(ci): add support for pull_request_target 2024-09-05 13:58:47 -07:00
Gabe Kangas
89a33ea4e3 fix(ci): split up checkout steps for push vs. pull request (#3911) 2024-09-05 13:50:59 -07:00
Gabe Kangas
90b70612c9 fix(go): update to resolve linter errors (#3913) 2024-09-05 13:41:10 -07:00
Owncast
208fafaaab Bundle embedded web app 2024-09-05 13:44:28 +00:00
renovate[bot]
8d723340fe fix(deps): update dependency react-hotkeys-hook to v4.5.1 2024-09-05 11:26:21 +00:00
Owncast
5e57bdb926 Commit screenshots 2024-09-05 04:09:17 +00:00
Owncast
46d777a46a Bundle embedded web app 2024-09-04 22:51:23 +00:00
renovate[bot]
bff66a5921 fix(deps): update dependency react-virtuoso to v4.10.2 2024-09-04 18:58:02 +00:00
Owncast
65cd387677 Bundle embedded web app 2024-09-04 18:56:50 +00:00
renovate[bot]
416462bd53 chore(deps): update nextjs monorepo to v14.2.7 2024-09-04 18:50:28 +00:00
Owncast
29a79c6fc8 Bundle embedded web app 2024-09-04 16:30:23 +00:00
renovate[bot]
ebab382da3 chore(deps): update dependency @types/node to v20.16.3 2024-09-04 13:55:51 +00:00
Owncast
58aa45e509 Bundle embedded web app 2024-09-04 13:54:24 +00:00
renovate[bot]
59f09d4260 chore(deps): lock file maintenance 2024-09-04 13:36:26 +00:00
renovate[bot]
d84e8db88c chore(deps): update dependency ts-jest to v29.2.5 2024-09-04 13:32:36 +00:00
renovate[bot]
06a8266c7c chore(deps): update peter-evans/create-or-update-comment digest to 56f64a7 2024-09-04 07:26:28 +00:00
Owncast
af785cccb5 Bundle embedded web app 2024-09-04 07:25:10 +00:00
renovate[bot]
91d63702d3 chore(deps): update dependency @types/react to v18.3.5 2024-09-04 07:16:37 +00:00
Owncast
78aec72c1f Commit screenshots 2024-09-04 04:12:27 +00:00
Owncast
9dff14d5dd Commit screenshots 2024-09-03 04:11:40 +00:00
Owncast
785064ae30 Commit screenshots 2024-09-02 04:12:31 +00:00
Owncast
4475c0caba Commit screenshots 2024-09-01 04:12:36 +00:00
Owncast
aa12e45588 Commit screenshots 2024-08-31 04:11:05 +00:00
Owncast
af130a7c47 Commit screenshots 2024-08-30 04:12:47 +00:00
Owncast
50464f35d0 Commit screenshots 2024-08-29 04:22:32 +00:00
Owncast
5b551fc293 Commit screenshots 2024-08-28 04:12:00 +00:00
renovate[bot]
ff74d6ce95 fix(deps): update module github.com/jellydator/ttlcache/v3 to v3.3.0 2024-08-27 13:00:34 +00:00
Owncast
7b98260176 Commit screenshots 2024-08-27 04:13:30 +00:00
Owncast
dcf4b716c3 Commit screenshots 2024-08-26 04:13:12 +00:00
Owncast
a28fc8411e Commit screenshots 2024-08-25 04:11:34 +00:00
Owncast
b70323fa05 Commit screenshots 2024-08-24 04:11:37 +00:00
Owncast
9c1267b39e Commit screenshots 2024-08-23 04:12:10 +00:00
Owncast
f0f9567f41 Bundle embedded web app 2024-08-22 12:20:14 +00:00
renovate[bot]
00d2ac8cb2 chore(deps): update dependency @types/node to v20.16.1 2024-08-22 06:05:45 +00:00
Owncast
deaa3754e0 Commit screenshots 2024-08-22 04:15:06 +00:00
Owncast
8d9268753b Bundle embedded web app 2024-08-22 01:14:40 +00:00
renovate[bot]
fb9594e322 chore(deps): update dependency @types/sanitize-html to v2.13.0 2024-08-21 22:06:39 +00:00
renovate[bot]
f9df95a9fe fix(deps): update module github.com/aws/aws-sdk-go to v1.55.5 (#3890)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-21 15:04:28 -07:00
Gabe Kangas
04b1b30b7d Update API tests (#3894)
* fix(test): remove done callback in tests

* fix(test): expect correct status code

* fix(test): remove logging of var
2024-08-21 14:44:09 -07:00
Gabe Kangas
545b9983f7 fix(api): return http 405 if federation is diabled 2024-08-21 14:16:55 -07:00
Owncast
7ca17eae84 Bundle embedded web app 2024-08-21 14:07:21 +00:00
renovate[bot]
b8d3da6b8a chore(deps): update dependency @types/node to v20.16.0 2024-08-21 09:40:06 +00:00
renovate[bot]
1fdedf8f5f chore(deps): update peter-evans/create-or-update-comment digest to 2830915 2024-08-21 09:38:51 +00:00
Owncast
c43bdda277 Bundle embedded web app 2024-08-21 07:48:18 +00:00
renovate[bot]
f2b78b9ca4 fix(deps): update dependency @fontsource/poppins to v5.0.15 2024-08-21 05:21:42 +00:00
Owncast
13b017e22e Commit screenshots 2024-08-21 04:12:53 +00:00
Owncast
b4896f139f Commit screenshots 2024-08-20 04:12:08 +00:00
renovate[bot]
dbcd6827b7 chore(deps): update actions/setup-node action to v4 (#3886)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-19 17:19:41 -07:00
Gabe Kangas
7084ece117 go mod tidy 2024-08-19 17:18:23 -07:00
Gabe Kangas
a8f358b2a5 Bump ffmpeg version + add support for running tests under macOS 2024-08-19 16:22:12 -07:00
Owncast
c73e106c17 Bundle embedded web app 2024-08-19 22:11:13 +00:00
renovate[bot]
cd23d7b573 chore(deps): update dependency @types/node to v20.15.0 2024-08-19 21:37:16 +00:00
renovate[bot]
2433d26445 fix(deps): update module golang.org/x/mod to v0.20.0 (#3878)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-19 14:36:04 -07:00
renovate[bot]
1bc5be6064 fix(deps): update module golang.org/x/net to v0.28.0 (#3879)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-19 14:35:32 -07:00
renovate[bot]
224fb776a6 fix(deps): update module github.com/prometheus/client_golang to v1.20.0 (#3876)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-19 13:59:17 -07:00
Owncast
e1735e0175 Bundle embedded web app 2024-08-19 20:44:59 +00:00
renovate[bot]
4a7876c4f5 fix(deps): update module github.com/shirou/gopsutil/v4 to v4.24.7 (#3875)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-19 13:09:06 -07:00
dependabot[bot]
ded6d5cb6d Bump elliptic from 6.5.6 to 6.5.7 in /web (#3881)
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.6 to 6.5.7.
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.6...v6.5.7)

---
updated-dependencies:
- dependency-name: elliptic
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-19 13:08:44 -07:00
renovate[bot]
5218e78537 fix(deps): update module golang.org/x/time to v0.6.0 (#3880)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-19 12:56:44 -07:00
Gabe Kangas
7c3d4d26df Remove done callback in tests (#3885) 2024-08-19 12:10:46 -07:00
Owncast
b9e22e4d9c Bundle embedded web app 2024-08-19 16:45:44 +00:00
renovate[bot]
8c1c95e2ef fix(deps): update dependency sharp to v0.33.5 2024-08-19 14:11:59 +00:00
Owncast
4dd00fbbcc Commit screenshots 2024-08-19 04:12:22 +00:00
Owncast
ae75d8e1b8 Bundle embedded web app 2024-08-18 22:25:13 +00:00
renovate[bot]
79cdf7299c chore(deps): update dependency mdx-mermaid to v2.0.1 2024-08-18 20:50:47 +00:00
Owncast
10b5c6d252 Bundle embedded web app 2024-08-18 20:50:10 +00:00
renovate[bot]
1b17947835 chore(deps): update dependency stylelint to v16.8.2 2024-08-18 16:20:51 +00:00
Owncast
8e26fec4ad Commit screenshots 2024-08-18 04:13:12 +00:00
Owncast
2532f3c29b Bundle embedded web app 2024-08-18 01:59:29 +00:00
renovate[bot]
235e716d78 chore(deps): update dependency chromatic to v11.7.1 2024-08-17 23:26:01 +00:00
Owncast
f66774e02b Bundle embedded web app 2024-08-17 20:28:04 +00:00
renovate[bot]
b2444a1d88 chore(deps): update dependency cypress to v13.13.3 2024-08-17 15:44:36 +00:00
Owncast
95842639b6 Bundle embedded web app 2024-08-17 11:47:48 +00:00
renovate[bot]
d1e3c3889f fix(deps): update dependency react-virtuoso to v4.10.1 2024-08-17 06:51:20 +00:00
Owncast
0dcf0f5967 Commit screenshots 2024-08-17 04:11:13 +00:00
Owncast
856564e746 Bundle embedded web app 2024-08-16 10:48:10 +00:00
renovate[bot]
af0abab590 fix(deps): update dependency react-virtuoso to v4.10.0 2024-08-16 06:47:15 +00:00
Owncast
4c078d1342 Commit screenshots 2024-08-16 04:12:39 +00:00
Owncast
7f7307a4e7 Commit screenshots 2024-08-15 04:12:34 +00:00
renovate[bot]
8cc0e5399c chore(deps): update peter-evans/create-or-update-comment digest to 0c2659f 2024-08-14 07:08:00 +00:00
Owncast
fb8627953a Commit screenshots 2024-08-14 04:11:39 +00:00
Owncast
b8bbe89a94 Bundle embedded web app 2024-08-13 14:13:42 +00:00
renovate[bot]
628c7ee717 fix(deps): update dependency video.js to v8.17.3 2024-08-13 11:53:06 +00:00
Owncast
0f525e9df7 Bundle embedded web app 2024-08-12 23:14:09 +00:00
renovate[bot]
0328e0aa11 chore(deps): update dependency @types/node to v20.14.15 2024-08-12 19:57:00 +00:00
Owncast
1251ab21a4 Bundle embedded web app 2024-08-12 17:53:29 +00:00
renovate[bot]
1862d9bdca chore(deps): lock file maintenance 2024-08-12 17:47:36 +00:00
Owncast
ae5b59d221 Bundle embedded web app 2024-08-11 11:38:48 +00:00
renovate[bot]
10bace1e7f chore(deps): update dependency knip to v5.27.2 2024-08-11 08:35:01 +00:00
Owncast
d90f5b92ec Bundle embedded web app 2024-08-10 12:26:19 +00:00
renovate[bot]
67d038ecfc chore(deps): update dependency @commitlint/cli to v19.4.0 2024-08-10 10:14:12 +00:00
Owncast
6d0d3be857 Bundle embedded web app 2024-08-10 10:12:26 +00:00
renovate[bot]
1c5c5bba57 chore(deps): update dependency knip to v5.27.1 2024-08-10 06:06:36 +00:00
Owncast
5867400af2 Commit screenshots 2024-08-08 04:16:35 +00:00
renovate[bot]
ad87eef636 chore(deps): update peter-evans/create-or-update-comment digest to 842a986 2024-08-07 08:40:58 +00:00
Owncast
8e25f49cd0 Commit screenshots 2024-08-07 04:12:55 +00:00
Owncast
63d4ddf2d0 Commit screenshots 2024-08-06 04:13:00 +00:00
Owncast
ebd74103cf Bundle embedded web app 2024-08-06 01:27:25 +00:00
renovate[bot]
8f71861db3 fix(deps): update dependency autoprefixer to v10.4.20 2024-08-05 22:05:55 +00:00
Owncast
0e273de0fc Bundle embedded web app 2024-08-05 16:48:11 +00:00
renovate[bot]
867bfa3b8b fix(deps): update dependency video.js to v8.17.2 2024-08-05 13:18:50 +00:00
Owncast
359cf9c02a Bundle embedded web app 2024-08-05 13:17:08 +00:00
renovate[bot]
76e3f9e07a chore(deps): update dependency @types/node to v20.14.14 2024-08-05 10:52:57 +00:00
Owncast
2d241508f5 Commit screenshots 2024-08-05 04:12:37 +00:00
Owncast
5dd2d27fe7 Bundle embedded web app 2024-08-05 00:47:16 +00:00
renovate[bot]
f1a37c1db3 fix(deps): update dependency react-virtuoso to v4.9.0 2024-08-04 22:45:39 +00:00
Owncast
fb8b3d174f Bundle embedded web app 2024-08-04 22:44:25 +00:00
renovate[bot]
6d43f1d6cf chore(deps): update dependency chromatic to v11.7.0 2024-08-04 20:21:46 +00:00
Owncast
d40a9ae6d7 Bundle embedded web app 2024-08-04 20:19:37 +00:00
renovate[bot]
2f04a417c8 chore(deps): update dependency ts-jest to v29.2.4 2024-08-04 15:35:28 +00:00
Owncast
dd3e364a6e Commit screenshots 2024-08-04 10:02:07 +00:00
Owncast
6db7eec41c Bundle embedded web app 2024-08-04 09:54:45 +00:00
renovate[bot]
fc76c3be7c fix(deps): update dependency @fontsource/inter to v5.0.20 2024-08-03 22:11:40 +00:00
Owncast
6edcd5df3d Bundle embedded web app 2024-08-03 22:09:49 +00:00
renovate[bot]
fb1455e468 fix(deps): update dependency react-virtuoso to v4.8.0 2024-08-03 22:02:45 +00:00
Owncast
b1899cc060 Bundle embedded web app 2024-08-03 18:20:36 +00:00
renovate[bot]
b11329564d chore(deps): update dependency cypress to v13.13.2 2024-08-03 16:19:30 +00:00
Owncast
72ee2e5cb3 Bundle embedded web app 2024-08-03 16:18:16 +00:00
renovate[bot]
ddd37ddfe2 chore(deps): update dependency chromatic to v11.6.0 2024-08-03 12:57:55 +00:00
Owncast
964ed53375 Commit screenshots 2024-08-03 04:11:35 +00:00
Owncast
411583e7af Bundle embedded web app 2024-08-02 16:35:16 +00:00
renovate[bot]
6323730a80 chore(deps): update dependency stylelint to v16.8.1 2024-08-02 12:20:56 +00:00
Owncast
f02aca5f94 Bundle embedded web app 2024-08-02 11:35:36 +00:00
renovate[bot]
8370574b14 chore(deps): update dependency @babel/core to v7.25.2 2024-08-02 06:20:05 +00:00
Owncast
05f451723a Commit screenshots 2024-08-02 04:12:24 +00:00
Owncast
ad9dd6140c Bundle embedded web app 2024-08-01 22:35:28 +00:00
renovate[bot]
6dc41de650 chore(deps): update typescript-eslint monorepo to v7.18.0 2024-08-01 18:19:46 +00:00
Owncast
d5ab817379 Bundle embedded web app 2024-08-01 18:17:55 +00:00
renovate[bot]
d787408c5f chore(deps): update dependency stylelint to v16.8.0 2024-08-01 16:21:44 +00:00
Owncast
34085cbd3f Commit screenshots 2024-08-01 04:16:38 +00:00
dependabot[bot]
950f80d7f5 Bump fast-xml-parser, @aws-sdk/credential-providers and @aws-sdk/client-cloudwatch (#3861)
Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser), [@aws-sdk/credential-providers](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/packages/credential-providers) and [@aws-sdk/client-cloudwatch](https://github.com/aws/aws-sdk-js-v3/tree/HEAD/clients/client-cloudwatch). These dependencies needed to be updated together.

Updates `fast-xml-parser` from 4.2.5 to 4.4.1
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases)
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v4.2.5...v4.4.1)

Updates `@aws-sdk/credential-providers` from 3.556.0 to 3.621.0
- [Release notes](https://github.com/aws/aws-sdk-js-v3/releases)
- [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/credential-providers/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.621.0/packages/credential-providers)

Updates `@aws-sdk/client-cloudwatch` from 3.556.0 to 3.621.0
- [Release notes](https://github.com/aws/aws-sdk-js-v3/releases)
- [Changelog](https://github.com/aws/aws-sdk-js-v3/blob/main/clients/client-cloudwatch/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-js-v3/commits/v3.621.0/clients/client-cloudwatch)

---
updated-dependencies:
- dependency-name: fast-xml-parser
  dependency-type: indirect
- dependency-name: "@aws-sdk/credential-providers"
  dependency-type: indirect
- dependency-name: "@aws-sdk/client-cloudwatch"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-31 15:18:50 -07:00
Owncast
0cd9bc7053 Bundle embedded web app 2024-07-31 16:31:02 +00:00
renovate[bot]
898a6e8744 chore(deps): update dependency @types/node to v20.14.13 2024-07-31 13:20:51 +00:00
Owncast
184c4cd382 Commit screenshots 2024-07-31 04:10:56 +00:00
Owncast
ceebf4d4e1 Commit screenshots 2024-07-30 04:11:10 +00:00
Owncast
b183e5a5ca Bundle embedded web app 2024-07-29 13:04:18 +00:00
renovate[bot]
bc05379321 fix(deps): update dependency video.js to v8.17.1 2024-07-29 11:12:12 +00:00
Owncast
147d217e1a Bundle embedded web app 2024-07-29 11:11:02 +00:00
renovate[bot]
ddd13b74f8 chore(deps): lock file maintenance 2024-07-29 11:05:12 +00:00
Owncast
bcdf45b37f Commit screenshots 2024-07-29 04:11:54 +00:00
Owncast
f14d36b5cc Bundle embedded web app 2024-07-28 10:06:47 +00:00
renovate[bot]
f81d4650fc chore(deps): update dependency @types/markdown-it to v14.1.2 2024-07-28 07:35:44 +00:00
Owncast
312c787ea6 Commit screenshots 2024-07-28 04:10:57 +00:00
Owncast
e0d04a75ca Bundle embedded web app 2024-07-27 18:24:37 +00:00
renovate[bot]
e93f5fb7e9 fix(deps): update dependency yaml to v2.5.0 2024-07-27 17:19:55 +00:00
dependabot[bot]
40c3eb1f75 Bump braces and jest in /test/automated/hls (#3834)
Bumps [braces](https://github.com/micromatch/braces) to 3.0.3 and updates ancestor dependency [jest](https://github.com/jestjs/jest/tree/HEAD/packages/jest). These dependencies need to be updated together.


Updates `braces` from 3.0.2 to 3.0.3
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

Updates `jest` from 26.6.3 to 29.7.0
- [Release notes](https://github.com/jestjs/jest/releases)
- [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jestjs/jest/commits/v29.7.0/packages/jest)

---
updated-dependencies:
- dependency-name: braces
  dependency-type: indirect
- dependency-name: jest
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-27 08:00:42 -07:00
Owncast
aafca27c58 Commit screenshots 2024-07-27 04:21:09 +00:00
Owncast
49c956498d Bundle embedded web app 2024-07-27 00:22:37 +00:00
renovate[bot]
9abbf0dfb7 chore(deps): update dependency knip to v5.27.0 2024-07-27 00:16:17 +00:00
Owncast
d0961df566 Bundle embedded web app 2024-07-26 21:57:46 +00:00
renovate[bot]
acc20111c5 chore(deps): update dependency @types/node to v20.14.12 2024-07-26 18:37:44 +00:00
Owncast
0f62d88793 Commit screenshots 2024-07-26 04:11:38 +00:00
Owncast
22521d9b85 Bundle embedded web app 2024-07-26 03:24:09 +00:00
renovate[bot]
bd6c41aed2 chore(deps): update dependency typescript to v5.5.4 2024-07-25 23:54:45 +00:00
dependabot[bot]
f42f6d9890 Bump requirejs from 2.3.6 to 2.3.7 in /test/load (#3849)
Bumps [requirejs](https://github.com/jrburke/r.js) from 2.3.6 to 2.3.7.
- [Commits](https://github.com/jrburke/r.js/compare/2.3.6...2.3.7)

---
updated-dependencies:
- dependency-name: requirejs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-25 16:52:13 -07:00
Owncast
41e36fbaea Bundle embedded web app 2024-07-25 22:08:02 +00:00
renovate[bot]
8f41dc6466 chore(deps): update typescript-eslint monorepo to v7.17.0 2024-07-25 19:12:26 +00:00
Owncast
77a029f9d8 Commit screenshots 2024-07-25 04:12:03 +00:00
renovate[bot]
36f6360a0f chore(deps): update peter-evans/create-or-update-comment digest to e5db2e4 2024-07-24 08:26:23 +00:00
Owncast
e1895d0ad0 Commit screenshots 2024-07-24 04:11:44 +00:00
Owncast
801baf69e4 Bundle embedded web app 2024-07-23 17:06:37 +00:00
renovate[bot]
30ec3e6813 chore(deps): update dependency eslint-plugin-react to v7.35.0 2024-07-23 14:11:17 +00:00
Owncast
825a2225eb Bundle embedded web app 2024-07-23 14:10:18 +00:00
renovate[bot]
b8fe546312 fix(deps): update dependency react-virtuoso to v4.7.13 2024-07-23 09:13:25 +00:00
renovate[bot]
32e6b050ac chore(deps): update alpine docker tag to v3.20.2 2024-07-23 04:58:43 +00:00
Owncast
7709d7b9a6 Commit screenshots 2024-07-23 04:11:06 +00:00
Owncast
d4f52320ee Bundle embedded web app 2024-07-23 00:02:42 +00:00
renovate[bot]
8693c80095 chore(deps): update dependency chromatic to v11.5.6 2024-07-22 19:12:32 +00:00
Owncast
59bdc92689 Bundle embedded web app 2024-07-22 13:18:48 +00:00
renovate[bot]
4b919a7f2f chore(deps): lock file maintenance 2024-07-22 13:12:38 +00:00
Owncast
314d2c5df2 Commit screenshots 2024-07-22 04:21:20 +00:00
Mahlangu
95d1912a92 change twitter label to x (#3846) 2024-07-21 19:54:21 -07:00
Owncast
4c551a0501 Bundle embedded web app 2024-07-21 19:26:07 +00:00
renovate[bot]
0350d11b11 chore(deps): update dependency ts-jest to v29.2.3 2024-07-21 17:24:19 +00:00
Owncast
c67e22c9f7 Commit screenshots 2024-07-21 04:11:27 +00:00
Owncast
eb80b0cf0e Bundle embedded web app 2024-07-20 16:43:34 +00:00
renovate[bot]
fcd0004ffb chore(deps): update dependency eslint-plugin-prettier to v5.2.1 2024-07-20 12:19:09 +00:00
Owncast
ecc2742f70 Commit screenshots 2024-07-20 04:17:03 +00:00
Owncast
49db2e7a0f Bundle embedded web app 2024-07-20 02:42:55 +00:00
renovate[bot]
fa30e08686 chore(deps): update dependency cypress to v13.13.1 2024-07-19 23:07:21 +00:00
Owncast
5f663d5f1b Bundle embedded web app 2024-07-19 23:05:45 +00:00
renovate[bot]
9898fb45b5 chore(deps): update dependency @types/node to v20.14.11 2024-07-19 20:09:16 +00:00
Logan Fick
3fc127ba34 Adjust CleanupDirectory function to support tmpfs mounts. (#3818)
* Refactored directory cleanup function to remove contents instead of recreating directory.

* Fixed regression by ensuring directory cleanup creates directory if it does not exist.

* Modified errors in directory cleanup function to provide more information.

* Resolved use of deprecated package in directory cleanup function.

* Reformatted directory cleanup function.
2024-07-19 13:07:45 -07:00
Owncast
db1f64ee45 Bundle embedded web app 2024-07-19 19:46:58 +00:00
Manish Giri
4579d9074e Initial change for Social Media validation (#3819)
Co-authored-by: Gabe Kangas <gabek@real-ity.com>
2024-07-19 12:41:22 -07:00
Owncast
56d4ac0c62 Bundle embedded web app 2024-07-19 19:32:57 +00:00
renovate[bot]
24719039a3 chore(deps): update typescript-eslint monorepo to v7.16.1 (#3844)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-19 12:24:40 -07:00
Owncast
a67a1be36c Bundle embedded web app 2024-07-19 18:44:27 +00:00
renovate[bot]
81fb47dca4 chore(deps): update dependency @babel/core to v7.24.9 (#3843)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-07-19 11:38:33 -07:00
Owncast
490d7f2e42 Bundle embedded web app 2024-07-19 18:09:15 +00:00
Nirajan
468abb272a little color change in dropdown (#3828)
* little color change in dropdown

* small-lint-fix

* lint fix

* it should fix
2024-07-19 11:03:18 -07:00
Owncast
37bcb67f6b Commit screenshots 2024-07-19 04:12:14 +00:00
Owncast
496fced9b3 Commit screenshots 2024-07-18 04:11:23 +00:00
renovate[bot]
ca9428ba6e chore(deps): update peter-evans/create-or-update-comment digest to 3496b39 2024-07-17 08:26:58 +00:00
Owncast
c12e2a5add Commit screenshots 2024-07-17 04:12:19 +00:00
Owncast
b9503cc9f9 Bundle embedded web app 2024-07-16 23:49:33 +00:00
renovate[bot]
fb244578a3 chore(deps): update dependency eslint-plugin-react to v7.34.4 2024-07-16 18:31:13 +00:00
Owncast
c8b9a058c0 Bundle embedded web app 2024-07-16 15:51:30 +00:00
renovate[bot]
54dd1b7dc2 chore(deps): update dependency prettier to v3.3.3 2024-07-16 13:19:56 +00:00
Owncast
d6265b936f Commit screenshots 2024-07-16 04:11:54 +00:00
Owncast
01d70828ca Bundle embedded web app 2024-07-15 15:41:51 +00:00
renovate[bot]
a0e53a7e51 chore(deps): lock file maintenance 2024-07-15 15:35:33 +00:00
renovate[bot]
16de438ced chore(deps): update dependency stylelint to v16.7.0 2024-07-15 13:43:54 +00:00
Owncast
9207d0a36e Bundle embedded web app 2024-07-15 13:42:20 +00:00
renovate[bot]
b63c82955f fix(deps): update dependency react-virtuoso to v4.7.12 2024-07-15 09:51:54 +00:00
Owncast
dcea496ed5 Bundle embedded web app 2024-07-15 00:52:02 +00:00
renovate[bot]
49a1ef5748 chore(deps): update dependency sass to v1.77.8 2024-07-14 21:36:31 +00:00
Owncast
c60936b124 Bundle embedded web app 2024-07-14 18:37:25 +00:00
renovate[bot]
28eb3e0332 chore(deps): update dependency @babel/core to v7.24.8 2024-07-14 15:45:03 +00:00
Owncast
eb08054596 Bundle embedded web app 2024-07-14 09:31:31 +00:00
renovate[bot]
585fb4d35b chore(deps): update dependency knip to v5.25.2 2024-07-14 06:55:57 +00:00
Owncast
0db6869c6b Commit screenshots 2024-07-14 04:12:57 +00:00
Owncast
f6d8fac3c4 Bundle embedded web app 2024-07-14 02:28:55 +00:00
renovate[bot]
1202487efc chore(deps): update dependency npm to v10.8.2 2024-07-14 02:23:00 +00:00
Owncast
1c0363f9d6 Bundle embedded web app 2024-07-13 23:02:54 +00:00
renovate[bot]
f6ef566496 chore(deps): update dependency ts-jest to v29.2.2 2024-07-13 18:17:54 +00:00
Owncast
bb307c36ad Bundle embedded web app 2024-07-13 18:15:59 +00:00
renovate[bot]
0e724a49ee fix(deps): update nextjs monorepo to v14.2.5 2024-07-13 16:23:27 +00:00
Owncast
2263c79bfa Bundle embedded web app 2024-07-13 13:04:15 +00:00
renovate[bot]
2b60bc701e chore(deps): update dependency ts-jest to v29.2.1 2024-07-13 11:34:25 +00:00
Owncast
8304aba714 Commit screenshots 2024-07-13 04:11:35 +00:00
Owncast
188bb7e0b6 Bundle embedded web app 2024-07-13 01:08:06 +00:00
renovate[bot]
fb760df090 chore(deps): update dependency sass to v1.77.7 2024-07-12 22:48:41 +00:00
Owncast
fc1d281d71 Bundle embedded web app 2024-07-12 14:03:21 +00:00
renovate[bot]
d1f333e89c chore(deps): update typescript-eslint monorepo to v7.16.0 2024-07-12 13:57:27 +00:00
Owncast
dcc838a7e2 Bundle embedded web app 2024-07-12 10:12:11 +00:00
renovate[bot]
cce6a2e523 chore(deps): update dependency knip to v5.25.1 2024-07-12 10:06:21 +00:00
Owncast
fca4a701fe Bundle embedded web app 2024-07-12 06:41:23 +00:00
renovate[bot]
3acce5046b chore(deps): update dependency chromatic to v11.5.5 (#3837)
* chore(deps): update dependency chromatic to v11.5.5

* fix: always checkout repo on chromatic workflow

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Gabe Kangas <gabek@real-ity.com>
2024-07-11 23:33:29 -07:00
Owncast
917299db4a Commit screenshots 2024-07-12 04:11:41 +00:00
Owncast
fd6ab358e0 Bundle embedded web app 2024-07-11 21:18:38 +00:00
Owncast
5e621baf23 Commit updated Storybook stories 2024-07-11 21:14:31 +00:00
Gabe Kangas
57652900f3 Remove documentation that is better suited to exist elsewhere 2024-07-11 14:10:57 -07:00
Owncast
1b746120c7 Bundle embedded web app 2024-07-11 20:59:44 +00:00
samwherever
fdcfb34531 Update config-constants.tsx (#3835)
Fix for #3827. Removed extraneous "to" and rewrote sentence for clarity.
2024-07-11 13:54:01 -07:00
dependabot[bot]
1cecdbbf54 Bump @grpc/grpc-js from 1.10.6 to 1.10.11 in /test/load (#3833)
Bumps [@grpc/grpc-js](https://github.com/grpc/grpc-node) from 1.10.6 to 1.10.11.
- [Release notes](https://github.com/grpc/grpc-node/releases)
- [Commits](https://github.com/grpc/grpc-node/compare/@grpc/grpc-js@1.10.6...@grpc/grpc-js@1.10.11)

---
updated-dependencies:
- dependency-name: "@grpc/grpc-js"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-11 12:22:42 -07:00
Gabe Kangas
bf07c977d7 Fix go test workflow 2024-07-11 11:53:35 -07:00
Gabe Kangas
05c54eaad8 Troubleshoot workflow errors 2024-07-11 11:51:51 -07:00
Gabe Kangas
91b176a8e4 Fix checkouts 2024-07-11 11:47:33 -07:00
Gabe Kangas
c4756a9a45 Reduce CI jobs being run when not needed 2024-07-11 11:44:39 -07:00
Owncast
e7d90d441e Bundle embedded web app 2024-07-11 18:39:29 +00:00
Gabe Kangas
fe5fbea623 Add css linter step (#3832)
* Add css linter step

* Add test css file

* Set working directory

* Only run against changed files

* remove test css file

* only run workflow steps if any css files were changed

* commiting a file with issues

* fixing file with linter warnings
2024-07-11 11:33:07 -07:00
Owncast
8e5454ee7e Bundle embedded web app 2024-07-11 18:09:02 +00:00
renovate[bot]
b04ca2ec1a chore(deps): update dependency ts-jest to v29.2.0 2024-07-11 17:50:13 +00:00
Owncast
430c4e20d7 Bundle embedded web app 2024-07-11 17:49:07 +00:00
renovate[bot]
9ff2677ced chore(deps): update dependency knip to v5.24.4 2024-07-11 15:41:48 +00:00
Owncast
79fc96fde8 Commit screenshots 2024-07-11 04:12:20 +00:00
Owncast
c7d2e4d6fe Commit screenshots 2024-07-10 04:12:58 +00:00
Owncast
60a467071e Bundle embedded web app 2024-07-09 21:30:49 +00:00
renovate[bot]
6fb7d81126 fix(deps): update dependency video.js to v8.16.1 2024-07-09 19:03:32 +00:00
Owncast
161a580f69 Bundle embedded web app 2024-07-09 10:20:39 +00:00
renovate[bot]
d1b5923351 chore(deps): update dependency @types/node to v20.14.10 2024-07-09 10:14:30 +00:00
Owncast
ddd828e00f Commit screenshots 2024-07-09 04:11:56 +00:00
renovate[bot]
4c4bc90460 fix(deps): update module mvdan.cc/xurls to v2 (#3815)
* fix(deps): update module mvdan.cc/xurls to v2

* mvdan/xurls 2.x bump fixes (#3823)

* Bump xurls import to v2

* Change Strict to function calls, v2.0.0 change

* Add go.sum entry for xurls/v2

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: mahmed2000 <mahmad2000@protonmail.com>
2024-07-08 11:24:48 -07:00
Owncast
aa8193bb9e Bundle embedded web app 2024-07-08 13:44:05 +00:00
renovate[bot]
d6d2c94ab9 chore(deps): lock file maintenance 2024-07-08 13:38:20 +00:00
Owncast
6d076ef241 Bundle embedded web app 2024-07-08 10:13:07 +00:00
renovate[bot]
634cf552b9 chore(deps): lock file maintenance 2024-07-08 10:07:22 +00:00
Owncast
2141a6ef04 Commit screenshots 2024-07-08 04:21:39 +00:00
Owncast
b41a6f5873 Bundle embedded web app 2024-07-08 02:10:32 +00:00
renovate[bot]
4c548a1fb6 fix(deps): update dependency @fontsource/inter to v5.0.19 2024-07-07 23:16:10 +00:00
Owncast
a14a0af75c Bundle embedded web app 2024-07-07 15:39:52 +00:00
renovate[bot]
09534aab99 fix(deps): update dependency @uiw/react-codemirror to v4.23.0 2024-07-07 15:34:05 +00:00
Owncast
3236cbbdd2 Bundle embedded web app 2024-07-07 13:57:20 +00:00
renovate[bot]
23982b6cdf chore(deps): update dependency knip to v5.24.1 2024-07-07 10:27:48 +00:00
Owncast
315af47c86 Bundle embedded web app 2024-07-07 07:07:35 +00:00
renovate[bot]
a9a626b507 fix(deps): update dependency @uiw/codemirror-theme-bbedit to v4.23.0 2024-07-07 04:42:19 +00:00
Owncast
8a2374309a Commit screenshots 2024-07-07 04:10:57 +00:00
Owncast
37a4c965f9 Bundle embedded web app 2024-07-06 13:58:31 +00:00
renovate[bot]
d8864a1dc0 chore(deps): update dependency knip to v5.24.0 2024-07-06 10:00:29 +00:00
Owncast
1ba486c72c Commit screenshots 2024-07-06 04:12:08 +00:00
Owncast
89f145ac52 Bundle embedded web app 2024-07-05 11:39:44 +00:00
renovate[bot]
8546dc309e chore(deps): update dependency cypress to v13.13.0 2024-07-05 06:14:40 +00:00
Owncast
6cdcbb3005 Commit screenshots 2024-07-05 04:12:01 +00:00
Gabe Kangas
e864562995 chore: update PR template 2024-07-04 19:57:16 -07:00
Owncast
be498069aa Bundle embedded web app 2024-07-05 01:08:14 +00:00
renovate[bot]
c791be2122 chore(deps): update dependency typescript to v5.5.3 2024-07-04 21:17:06 +00:00
730 changed files with 26565 additions and 29259 deletions

1
.earthlyignore Normal file
View File

@@ -0,0 +1 @@
test/automated/api/node_modules

View File

@@ -1,12 +1,17 @@
# Read first
Please include a summary of the change and which issue number is fixed, including relevant motivation and context. Feel free to mark this as a Draft or WIP and write up some details later. If this is an unsolicited change, or there is no existing issue filed for it, please open a GitHub issue before creating a pull request. This will allow us to discuss the motivations and the big picture behind the change first. It's possible there may be other solutions that should be discussed for what you think should be built. It is possible your change will be rejected unless some discussion around your proposal happens first. While creating this PR means you probably already did the work, it still makes sense to file an issue now, and into the future when you have proposed changes.
If there is no issue filed for this particular change it's highly recommended you file one. While creating this PR means you probably already did the work, in the future make sure an issue is filed beforehand so changes, fixes and features can be discussed ahead of time. ## Description
# Description Please include a summary of the change and which issue number is fixed, including relevant motivation and context. Feel free to mark this as a Draft or WIP and write up some details later and start a conversation, even if your PR is not ready for review.
Fixes # (issue) Fixes # (issue)
## Screenshot Examples or Logs
If this is a frontend change, please include a screenshot of the change. If this is a backend change, please include relevant logs or examples of the change in action if applicable.
--- ---
Some things you might want to mention: Some things you might want to mention:
@@ -16,4 +21,4 @@ Some things you might want to mention:
3. If you're fixing something, what was wrong? How should we stop from having this issue happen again? 3. If you're fixing something, what was wrong? How should we stop from having this issue happen again?
4. If this is a new feature or addition to functionality, why should it be added? What are the use cases? Who was asking for this functionality? 4. If this is a new feature or addition to functionality, why should it be added? What are the use cases? Who was asking for this functionality?
If this is an unsolicited change or have no issue associated please do your best to detail the motivations behind this PR, and think about filing an issue to discuss changes ahead of time in the future. Thank you so much for contributing to Owncast! 🎉

31
.github/stale.yml vendored
View File

@@ -1,31 +0,0 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 60
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- backlog
# Label to use when marking an issue as stale
staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. If this
was a feature request that others have shown no interest in then it's
likely to not get implemented due to lack of interest. If others also
want to see this feature then now is the time to say something!
Thank you for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false
exemptMilestones: true
# Since old PRs are less useful than old issues ping them sooner.
pulls:
daysUntilStale: 30
markComment: >
This pull request has not had any activity in 30 days. Since things move fast it's best
to get PRs merged in. If this PR addresses a previously filed issue that needs to be
resolved please work to get it merged in, or allow somebody else to work on a fix.
This PR will be closed if no further activity occurs. Thank you for your contributions!
exemptLabels:
- bot

View File

@@ -13,7 +13,15 @@ jobs:
name: GitHub actions name: GitHub actions
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - name: Check out pull request code
uses: actions/checkout@v4
if: github.event_name == 'pull_request'
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Check out repository code
uses: actions/checkout@v4
if: github.event_name == 'push'
- uses: docker://rhysd/actionlint:latest - uses: docker://rhysd/actionlint:latest
with: with:

View File

@@ -11,7 +11,7 @@ jobs:
issues: write issues: write
steps: steps:
- name: Add comment - name: Add comment
uses: peter-evans/create-or-update-comment@71ac479718f8aed504782bc920d802da994c05fa uses: peter-evans/create-or-update-comment@7157823c0f1cb7170b464dc3ffb1555a01ce94c3
with: with:
issue-number: ${{ github.event.issue.number }} issue-number: ${{ github.event.issue.number }}
body: | body: |

View File

@@ -18,23 +18,43 @@ jobs:
with: with:
concurrent_skipping: 'same_content_newer' concurrent_skipping: 'same_content_newer'
- name: Check out pull request code
uses: actions/checkout@v4
if: github.event_name == 'pull_request'
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Check out repository code
uses: actions/checkout@v4
if: github.event_name == 'push'
- name: Get changed files
id: changed-files-yaml
uses: tj-actions/changed-files@v45
with:
files_yaml: |
src:
- '**/*.{go,mod,sum}'
- uses: earthly/actions-setup@v1 - uses: earthly/actions-setup@v1
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
with: with:
version: 'latest' # or pin to an specific version, e.g. "v0.6.10" version: 'latest' # or pin to an specific version, e.g. "v0.6.10"
- name: Earthly version - name: Earthly version
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
run: earthly --version run: earthly --version
- name: Set up QEMU - name: Set up QEMU
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
id: qemu id: qemu
uses: docker/setup-qemu-action@v3 uses: docker/setup-qemu-action@v3
with: with:
image: tonistiigi/binfmt:latest image: tonistiigi/binfmt:latest
platforms: all platforms: all
- uses: actions/checkout@v4
- name: Run API tests - name: Run API tests
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
uses: nick-fields/retry@v3 uses: nick-fields/retry@v3
with: with:
timeout_minutes: 10 timeout_minutes: 10

View File

@@ -19,12 +19,19 @@ jobs:
with: with:
concurrent_skipping: 'same_content_newer' concurrent_skipping: 'same_content_newer'
- name: Checkout - name: Check out pull request code
uses: actions/checkout@v4 uses: actions/checkout@v4
if: github.event_name == 'pull_request'
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Check out repository code
uses: actions/checkout@v4
if: github.event_name == 'push'
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version: latest node-version: '22.9.0'
- name: Cache node modules - name: Cache node modules
uses: actions/cache@v4 uses: actions/cache@v4

View File

@@ -11,8 +11,15 @@ jobs:
if: github.repository == 'owncast/owncast' if: github.repository == 'owncast/owncast'
steps: steps:
- name: Checkout - name: Check out pull request code
uses: actions/checkout@v4 uses: actions/checkout@v4
if: github.event_name == 'pull_request'
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Check out repository code
uses: actions/checkout@v4
if: github.event_name == 'push'
- name: Cache node modules - name: Cache node modules
uses: actions/cache@v4 uses: actions/cache@v4

View File

@@ -27,23 +27,37 @@ jobs:
uses: fkirc/skip-duplicate-actions@v5 uses: fkirc/skip-duplicate-actions@v5
with: with:
concurrent_skipping: 'same_content_newer' concurrent_skipping: 'same_content_newer'
- name: Check out code
if: ${{ github.actor != 'renovate[bot]' && github.actor != 'renovate' }} - name: Check out pull request code
uses: actions/checkout@v4 uses: actions/checkout@v4
if: github.event_name == 'pull_request' || github.event_name == 'pull_request_target'
with: with:
# Make sure the actual branch is checked out when running on pull requests
ref: ${{ github.event.pull_request.head.ref }}
repository: ${{ github.event.pull_request.head.repo.full_name }} repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0
- name: Check out repository code
uses: actions/checkout@v4
if: github.event_name == 'push'
- name: Get changed files
id: changed-files-yaml
uses: tj-actions/changed-files@v45
with:
path: 'web'
files_ignore: |
static/**
web/next.config.js
files_yaml: |
src:
- '**/*.{js,ts,tsx,jsx,md}'
- name: Install dependencies - name: Install dependencies
if: ${{ github.actor != 'renovate[bot]' && github.actor != 'renovate' }} if: ${{ github.actor != 'renovate[bot]' && github.actor != 'renovate' && steps.changed-files-yaml.outputs.src_any_changed == 'true'}}
run: npm install run: npm install
- name: Publish to Chromatic - name: Publish to Chromatic
if: ${{ github.actor != 'renovate[bot]' && github.actor != 'renovate' }} if: ${{ github.actor != 'renovate[bot]' && github.actor != 'renovate' && steps.changed-files-yaml.outputs.src_any_changed == 'true' }}
uses: chromaui/action@v11 uses: chromaui/action@v11
# Chromatic GitHub Action options # Chromatic GitHub Action options
with: with:
workingDir: web workingDir: web

View File

@@ -36,8 +36,15 @@ jobs:
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
steps: steps:
- name: Checkout repository - name: Check out pull request code
uses: actions/checkout@v4 uses: actions/checkout@v4
if: github.event_name == 'pull_request'
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Check out repository code
uses: actions/checkout@v4
if: github.event_name == 'push'
- uses: actions/setup-go@v5 - uses: actions/setup-go@v5
with: with:

View File

@@ -19,7 +19,15 @@ jobs:
container: container:
image: aquasec/trivy image: aquasec/trivy
steps: steps:
- uses: actions/checkout@v4 - name: Check out pull request code
uses: actions/checkout@v4
if: github.event_name == 'pull_request'
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Check out repository code
uses: actions/checkout@v4
if: github.event_name == 'push'
- name: Check critical issues - name: Check critical issues
run: trivy config --exit-code 1 --severity "HIGH,CRITICAL" ./Dockerfile run: trivy config --exit-code 1 --severity "HIGH,CRITICAL" ./Dockerfile

View File

@@ -37,10 +37,15 @@ jobs:
image: tonistiigi/binfmt:latest image: tonistiigi/binfmt:latest
platforms: all platforms: all
- name: Checkout repo - name: Check out pull request code
uses: actions/checkout@v4 uses: actions/checkout@v4
if: github.event_name == 'pull_request'
with: with:
fetch-depth: 0 repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Check out repository code
uses: actions/checkout@v4
if: github.event_name == 'push' || github.event_name == 'schedule'
- name: Build and push - name: Build and push
if: ${{ github.event_name == 'schedule' && env.GH_CR_PAT != null }} if: ${{ github.event_name == 'schedule' && env.GH_CR_PAT != null }}

53
.github/workflows/css-lint.yaml vendored Normal file
View File

@@ -0,0 +1,53 @@
name: CSS Lint and Formatting
on:
push:
paths:
- 'web/**'
pull_request:
paths:
- 'web/**'
jobs:
css-lint:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./web
steps:
- name: Check out pull request code
uses: actions/checkout@v4
if: github.event_name == 'pull_request'
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Check out repository code
uses: actions/checkout@v4
if: github.event_name == 'push'
- name: Get changed files
id: changed-files-yaml
uses: tj-actions/changed-files@v45
with:
path: 'web'
files_yaml: |
src:
- '**/*.{css,scss}'
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '22.9.0'
- name: Install dependencies
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
run: npm install
- name: Run Prettier
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
run: npx prettier --check ${{ steps.changed-files-yaml.outputs.src_all_changed_files }}
- name: Run Stylelint
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
run: npx stylelint ${{ steps.changed-files-yaml.outputs.src_all_changed_files }}

View File

@@ -9,8 +9,15 @@ jobs:
name: Generate API Documentation name: Generate API Documentation
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout repo - name: Check out pull request code
uses: actions/checkout@v4 uses: actions/checkout@v4
if: github.event_name == 'pull_request'
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Check out repository code
uses: actions/checkout@v4
if: github.event_name == 'push'
- name: Run redoc on openapi.yaml - name: Run redoc on openapi.yaml
run: | run: |

View File

@@ -18,7 +18,16 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Get changed files
id: changed-files-yaml
uses: tj-actions/changed-files@v45
with:
files_yaml: |
src:
- '**/*.{go,mod,sum}'
- uses: actions/cache@v4 - uses: actions/cache@v4
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
with: with:
path: | path: |
~/.cache/go-build ~/.cache/go-build
@@ -28,12 +37,14 @@ jobs:
go-test- go-test-
- name: Install go - name: Install go
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
uses: actions/setup-go@v5 uses: actions/setup-go@v5
with: with:
go-version: '^1' go-version: '^1'
cache: true cache: true
- name: Run tests - name: Run tests
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
run: go test ./... run: go test ./...
test-bsds: test-bsds:
@@ -49,6 +60,14 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Get changed files
id: changed-files-yaml
uses: tj-actions/changed-files@v45
with:
files_yaml: |
src:
- '**/*.{go,mod,sum}'
- uses: actions/cache@v4 - uses: actions/cache@v4
with: with:
path: | path: |
@@ -59,10 +78,12 @@ jobs:
go-test- go-test-
- name: Install go - name: Install go
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
uses: actions/setup-go@v5 uses: actions/setup-go@v5
with: with:
go-version: '^1' go-version: '^1'
cache: true cache: true
- name: Run tests - name: Run tests
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
run: go test ./... run: go test ./...

View File

@@ -24,8 +24,27 @@ jobs:
uses: fkirc/skip-duplicate-actions@v5 uses: fkirc/skip-duplicate-actions@v5
with: with:
concurrent_skipping: 'same_content_newer' concurrent_skipping: 'same_content_newer'
- uses: actions/checkout@v4
- name: Check out pull request code
uses: actions/checkout@v4
if: github.event_name == 'pull_request'
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Check out repository code
uses: actions/checkout@v4
if: github.event_name == 'push'
- name: Get changed files
id: changed-files-yaml
uses: tj-actions/changed-files@v45
with:
files_yaml: |
src:
- '**/*.{go,mod,sum}'
- uses: actions/setup-go@v5 - uses: actions/setup-go@v5
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
with: with:
go-version: '1.22' go-version: '1.22'
cache: true cache: true
@@ -43,6 +62,7 @@ jobs:
${{ runner.os }}- ${{ runner.os }}-
- name: Local stroage - name: Local stroage
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
uses: nick-fields/retry@v3 uses: nick-fields/retry@v3
with: with:
timeout_minutes: 10 timeout_minutes: 10
@@ -50,6 +70,7 @@ jobs:
command: cd test/automated/hls && ./run.sh command: cd test/automated/hls && ./run.sh
- name: S3 storage - name: S3 storage
if: steps.changed-files-yaml.outputs.src_any_changed == 'true'
uses: nick-fields/retry@v3 uses: nick-fields/retry@v3
with: with:
timeout_minutes: 10 timeout_minutes: 10

View File

@@ -28,18 +28,25 @@ jobs:
cancel_others: 'true' cancel_others: 'true'
skip_after_successful_duplicate: 'true' skip_after_successful_duplicate: 'true'
- name: Checkout - name: Check out pull request code
uses: actions/checkout@v4 uses: actions/checkout@v4
if: github.event_name == 'pull_request'
with: with:
# Make sure the actual branch is checked out when running on pull requests
ref: ${{ github.event.pull_request.head.ref }}
repository: ${{ github.event.pull_request.head.repo.full_name }} repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0 ref: ${{github.event.pull_request.head.ref}}
persist-credentials: true
- name: Setup Nodejs
uses: actions/setup-node@v4
with:
node-version: '22.9.0'
- name: Check out repository code
uses: actions/checkout@v4
if: github.event_name == 'push'
- name: Get changed files - name: Get changed files
id: changed-files-yaml id: changed-files-yaml
uses: tj-actions/changed-files@v44 uses: tj-actions/changed-files@v45
with: with:
path: 'web' path: 'web'
files_ignore: | files_ignore: |
@@ -47,7 +54,7 @@ jobs:
web/next.config.js web/next.config.js
files_yaml: | files_yaml: |
src: src:
- '**/*.{js,ts,tsx,jsx,css,md}' - '**/*.{js,ts,tsx,jsx,md}'
- name: Cache node modules - name: Cache node modules
uses: actions/cache@v4 uses: actions/cache@v4
@@ -64,19 +71,27 @@ jobs:
- name: Install Dependencies - name: Install Dependencies
run: npm install run: npm install
- name: Lint - name: Lint and fix
if: steps.changed-files-yaml.outputs.src_any_changed == 'true' if: steps.changed-files-yaml.outputs.src_any_changed == 'true' && github.event_name != 'pull_request'
run: npx eslint --fix ${{ steps.changed-files-yaml.outputs.src_all_changed_files }} run: npx eslint --fix ${{ steps.changed-files-yaml.outputs.src_all_changed_files }}
- name: Prettier - name: Lint
if: steps.changed-files-yaml.outputs.src_any_changed == 'true' if: steps.changed-files-yaml.outputs.src_any_changed == 'true' && github.event_name == 'pull_request'
run: npx eslint ${{ steps.changed-files-yaml.outputs.src_all_changed_files }}
- name: Prettier formatting
if: steps.changed-files-yaml.outputs.src_any_changed == 'true' && github.event_name == 'pull_request'
run: npx prettier --write ${{ steps.changed-files-yaml.outputs.src_all_changed_files }} run: npx prettier --write ${{ steps.changed-files-yaml.outputs.src_all_changed_files }}
- name: Prettier check
if: steps.changed-files-yaml.outputs.src_any_changed == 'true' && github.event_name != 'pull_request'
run: npx prettier ${{ steps.changed-files-yaml.outputs.src_all_changed_files }}
- name: Debug changed files output - name: Debug changed files output
run: 'pwd && echo "Changed files: ${{ steps.changed-files-yaml.outputs.src_all_changed_files }}"' run: 'pwd && echo "Changed files: ${{ steps.changed-files-yaml.outputs.src_all_changed_files }}"'
- name: Commit changes - name: Commit changes
if: steps.changed-files-yaml.outputs.src_any_changed == 'true' if: steps.changed-files-yaml.outputs.src_any_changed == 'true' && github.event_name != 'pull_request'
uses: EndBug/add-and-commit@v9 uses: EndBug/add-and-commit@v9
with: with:
author_name: Owncast author_name: Owncast
@@ -101,13 +116,20 @@ jobs:
cancel_others: 'true' cancel_others: 'true'
skip_after_successful_duplicate: 'true' skip_after_successful_duplicate: 'true'
- name: Checkout - name: Check out pull request code
uses: actions/checkout@v4 uses: actions/checkout@v4
if: github.event_name == 'pull_request'
with: with:
# Make sure the actual branch is checked out when running on pull requests
ref: ${{ github.event.pull_request.head.ref }}
repository: ${{ github.event.pull_request.head.repo.full_name }} repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0
- name: Check out repository code
uses: actions/checkout@v4
if: github.event_name == 'push'
- name: Setup Nodejs
uses: actions/setup-node@v4
with:
node-version: '22.9.0'
- name: Cache node modules - name: Cache node modules
uses: actions/cache@v4 uses: actions/cache@v4
@@ -127,6 +149,10 @@ jobs:
- name: Check for unused JS code and dependencies - name: Check for unused JS code and dependencies
run: npx knip --include dependencies,files,exports run: npx knip --include dependencies,files,exports
- name: Run tests
working-directory: ./web
run: npm test
# After any formatting and linting is complete we can run the build # After any formatting and linting is complete we can run the build
# and bundle step. This both will verify that the build is successful as # and bundle step. This both will verify that the build is successful as
# well as commiting the updated static files into the repository for use. # well as commiting the updated static files into the repository for use.
@@ -143,6 +169,11 @@ jobs:
cancel_others: 'true' cancel_others: 'true'
skip_after_successful_duplicate: 'true' skip_after_successful_duplicate: 'true'
- name: Setup Nodejs
uses: actions/setup-node@v4
with:
node-version: '22.9.0'
- name: Cache node modules - name: Cache node modules
uses: actions/cache@v4 uses: actions/cache@v4
env: env:
@@ -155,13 +186,15 @@ jobs:
${{ runner.os }}-build- ${{ runner.os }}-build-
${{ runner.os }}- ${{ runner.os }}-
- name: Checkout - name: Check out pull request code
uses: actions/checkout@v4 uses: actions/checkout@v4
if: github.event_name == 'pull_request'
with: with:
# Make sure the actual branch is checked out when running on pull requests
ref: ${{ github.event.pull_request.head.ref }}
repository: ${{ github.event.pull_request.head.repo.full_name }} repository: ${{ github.event.pull_request.head.repo.full_name }}
fetch-depth: 0
- name: Check out repository code
uses: actions/checkout@v4
if: github.event_name == 'push'
- name: Bundle web app (next.js build) - name: Bundle web app (next.js build)
run: build/web/bundleWeb.sh run: build/web/bundleWeb.sh

View File

@@ -1,45 +0,0 @@
name: Javascript Tests
on:
push:
paths:
- 'web/**'
pull_request:
paths:
- 'web/**'
jobs:
jest-run:
runs-on: ubuntu-latest
steps:
- id: skip_check
uses: fkirc/skip-duplicate-actions@v5
with:
concurrent_skipping: 'same_content_newer'
- name: Checkout
uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18.9.0
- name: Cache node modules
uses: actions/cache@v4
env:
cache-name: cache-node-modules-javascript-tests
with:
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('web/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- name: Install Dependencies
working-directory: ./web
run: npm install
- name: Run tests
working-directory: ./web
run: npm test

View File

@@ -14,7 +14,16 @@ jobs:
Screenshots: Screenshots:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - name: Check out pull request code
uses: actions/checkout@v4
if: github.event_name == 'pull_request'
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Check out repository code
uses: actions/checkout@v4
if: github.event_name == 'push'
- uses: actions/setup-go@v5 - uses: actions/setup-go@v5
with: with:
go-version: '1.22' go-version: '1.22'

View File

@@ -20,7 +20,15 @@ jobs:
container: container:
image: docker.io/ubuntu:24.04 image: docker.io/ubuntu:24.04
steps: steps:
- uses: actions/checkout@v4 - name: Check out pull request code
uses: actions/checkout@v4
if: github.event_name == 'pull_request'
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
- name: Check out repository code
uses: actions/checkout@v4
if: github.event_name == 'push'
- name: Install shellcheck - name: Install shellcheck
run: apt update && apt install -y shellcheck bash && shellcheck --version run: apt update && apt install -y shellcheck bash && shellcheck --version

46
.github/workflows/stale.yml vendored Normal file
View File

@@ -0,0 +1,46 @@
name: 'Close stale issues and PRs'
on:
schedule:
- cron: '30 */2 * * *'
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v9
with:
exempt-all-milestones: true
days-before-issue-stale: 60
days-before-issue-close: 67
exempt-issue-labels: backlog,long-lived,bot
stale-issue-message: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. If this
was a feature request that others have shown no interest in, then it's
unlikely to get implemented due to lack of interest. If others also
want to see this feature then now is the time to say something! If this
is a bug report or you have questions that still need answering, please say
something. Feel free to drop by [our chat](https://owncast.rocket.chat) if
you'd like to discuss in real-time with people.
close-issue-message: >
This issue has been automatically closed due to inactivity. This isn't done
to be a jerk, or because the project doesn't care. But simply to keep the focus
on things that are actively discussed, and has continued interest from the community and
Owncast developers. Feel free to to comment if there is still discussion to be
had, or if you plan to work on it. Feel free to drop by [our chat](https://owncast.rocket.chat)
if you'd like to discuss in real-time with people. Thank you for being involved!
days-before-pr-stale: 30
days-before-pr-close: 37
stale-pr-message: >
This pull request has not had any activity in 30 days. If it has been abandoned
no future actions are necessary, it will be automatically closed. If this is a PR
with no clear plan on how to move forward on it getting into the project, then
further discussion is needed. Now is a good time to discuss if this is still
something that should be worked on. If this PR is idle simply because nobody
has reviewed it, then feel free to ping somebody. However, if this PR is not linked to an
existing issue regarding something that was previously determined to be important, then even
more discussion needs to take place before it can get anywhere.
This PR will be closed if no further activity occurs. Thank you for your contributions!
close-pr-message: 'This PR was closed because it has been stalled for 10 days with no activity.'

View File

@@ -28,7 +28,6 @@ linters:
- bodyclose - bodyclose
- dupl - dupl
- errcheck - errcheck
- exportloopref
- goconst - goconst
- godot - godot
- godox - godox
@@ -49,7 +48,7 @@ linters:
- cyclop - cyclop
- gosimple - gosimple
- unused - unused
- exportloopref - copyloopvar
- gocritic - gocritic
- forbidigo - forbidigo
- unparam - unparam
@@ -67,12 +66,6 @@ linters-settings:
# should ignore tests # should ignore tests
skip-tests: true skip-tests: true
gosimple:
# Select the Go version to target. The default is '1.13'.
go: '1.22'
# https://staticcheck.io/docs/options#checks
checks: ['all']
gocritic: gocritic:
disabled-checks: disabled-checks:
- ifElseChain - ifElseChain

View File

@@ -22,7 +22,7 @@ ENV NAME=${NAME}
RUN CGO_ENABLED=1 GOOS=linux go build -a -installsuffix cgo -ldflags "-extldflags \"-static\" -s -w -X github.com/owncast/owncast/config.GitCommit=$GIT_COMMIT -X github.com/owncast/owncast/config.VersionNumber=$VERSION -X github.com/owncast/owncast/config.BuildPlatform=$NAME" -o owncast . RUN CGO_ENABLED=1 GOOS=linux go build -a -installsuffix cgo -ldflags "-extldflags \"-static\" -s -w -X github.com/owncast/owncast/config.GitCommit=$GIT_COMMIT -X github.com/owncast/owncast/config.VersionNumber=$VERSION -X github.com/owncast/owncast/config.BuildPlatform=$NAME" -o owncast .
# Create the image by copying the result of the build into a new alpine image # Create the image by copying the result of the build into a new alpine image
FROM alpine:3.20.1 FROM alpine:3.20.3
RUN apk update && apk add --no-cache ffmpeg ffmpeg-libs ca-certificates && update-ca-certificates RUN apk update && apk add --no-cache ffmpeg ffmpeg-libs ca-certificates && update-ca-certificates
RUN addgroup -g 101 -S owncast && adduser -u 101 -S owncast -G owncast RUN addgroup -g 101 -S owncast && adduser -u 101 -S owncast -G owncast

View File

@@ -1,6 +1,6 @@
VERSION --new-platform 0.6 VERSION --new-platform 0.6
FROM --platform=linux/amd64 alpine:3.15.5 FROM --platform=linux/amd64 alpine:3.20.3
ARG version=develop ARG version=develop
WORKDIR /build WORKDIR /build
@@ -87,7 +87,7 @@ build:
RUN upx -t owncast RUN upx -t owncast
END END
SAVE ARTIFACT owncast owncast SAVE ARTIFACT --keep-ts owncast owncast
package: package:
RUN apk add --update --no-cache zip >> /dev/null RUN apk add --update --no-cache zip >> /dev/null
@@ -109,7 +109,7 @@ package:
ARG NAME=custom ARG NAME=custom
END END
COPY (+build/owncast --platform $TARGETPLATFORM) /build/dist/owncast COPY --keep-ts (+build/owncast --platform $TARGETPLATFORM) /build/dist/owncast
ENV ZIPNAME owncast-$version-$NAME.zip ENV ZIPNAME owncast-$version-$NAME.zip
RUN cd /build/dist && zip -r -q -8 /build/dist/owncast.zip . RUN cd /build/dist && zip -r -q -8 /build/dist/owncast.zip .
SAVE ARTIFACT --keep-ts /build/dist/owncast.zip owncast.zip AS LOCAL dist/$ZIPNAME SAVE ARTIFACT --keep-ts /build/dist/owncast.zip owncast.zip AS LOCAL dist/$ZIPNAME
@@ -119,11 +119,11 @@ docker:
# in as space separated strings using the full account/repo:tag format. # in as space separated strings using the full account/repo:tag format.
# https://github.com/earthly/earthly/blob/aea38448fa9c0064b1b70d61be717ae740689fb9/docs/earthfile/earthfile.md#assigning-multiple-image-names # https://github.com/earthly/earthly/blob/aea38448fa9c0064b1b70d61be717ae740689fb9/docs/earthfile/earthfile.md#assigning-multiple-image-names
ARG TARGETPLATFORM ARG TARGETPLATFORM
FROM --platform=$TARGETPLATFORM alpine:3.15.5 FROM --platform=$TARGETPLATFORM alpine:3.20.3
RUN apk update && apk add --no-cache ffmpeg ffmpeg-libs ca-certificates unzip && update-ca-certificates RUN apk update && apk add --no-cache ffmpeg ffmpeg-libs ca-certificates unzip && update-ca-certificates
RUN addgroup -g 101 -S owncast && adduser -u 101 -S owncast -G owncast RUN addgroup -g 101 -S owncast && adduser -u 101 -S owncast -G owncast
WORKDIR /app WORKDIR /app
COPY --platform=$TARGETPLATFORM +package/owncast.zip /app COPY --keep-ts --platform=$TARGETPLATFORM +package/owncast.zip /app
RUN unzip -x owncast.zip && mkdir data RUN unzip -x owncast.zip && mkdir data
# temporarily disable until we figure out how to move forward # temporarily disable until we figure out how to move forward

View File

@@ -6,6 +6,7 @@ import (
"github.com/owncast/owncast/activitypub/outbox" "github.com/owncast/owncast/activitypub/outbox"
"github.com/owncast/owncast/activitypub/persistence" "github.com/owncast/owncast/activitypub/persistence"
"github.com/owncast/owncast/activitypub/workerpool" "github.com/owncast/owncast/activitypub/workerpool"
"github.com/owncast/owncast/persistence/configrepository"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
@@ -14,15 +15,16 @@ import (
// Start will initialize and start the federation support. // Start will initialize and start the federation support.
func Start(datastore *data.Datastore) { func Start(datastore *data.Datastore) {
configRepository := configrepository.Get()
persistence.Setup(datastore) persistence.Setup(datastore)
workerpool.InitOutboundWorkerPool() workerpool.InitOutboundWorkerPool()
inbox.InitInboxWorkerPool() inbox.InitInboxWorkerPool()
// Generate the keys for signing federated activity if needed. // Generate the keys for signing federated activity if needed.
if data.GetPrivateKey() == "" { if configRepository.GetPrivateKey() == "" {
privateKey, publicKey, err := crypto.GenerateKeys() privateKey, publicKey, err := crypto.GenerateKeys()
_ = data.SetPrivateKey(string(privateKey)) _ = configRepository.SetPrivateKey(string(privateKey))
_ = data.SetPublicKey(string(publicKey)) _ = configRepository.SetPublicKey(string(publicKey))
if err != nil { if err != nil {
log.Errorln("Unable to get private key", err) log.Errorln("Unable to get private key", err)
} }

View File

@@ -6,7 +6,7 @@ import (
"github.com/go-fed/activity/streams" "github.com/go-fed/activity/streams"
"github.com/go-fed/activity/streams/vocab" "github.com/go-fed/activity/streams/vocab"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
) )
// PrivacyAudience represents the audience for an activity. // PrivacyAudience represents the audience for an activity.
@@ -87,8 +87,10 @@ func MakeActivityDirect(activity vocab.ActivityStreamsCreate, toIRI *url.URL) vo
// MakeActivityPublic sets the required properties to make this activity // MakeActivityPublic sets the required properties to make this activity
// seen as public. // seen as public.
func MakeActivityPublic(activity vocab.ActivityStreamsCreate) vocab.ActivityStreamsCreate { func MakeActivityPublic(activity vocab.ActivityStreamsCreate) vocab.ActivityStreamsCreate {
configRepository := configrepository.Get()
// TO the public if we're not treating ActivityPub as "private". // TO the public if we're not treating ActivityPub as "private".
if !data.GetFederationIsPrivate() { if !configRepository.GetFederationIsPrivate() {
public, _ := url.Parse(PUBLIC) public, _ := url.Parse(PUBLIC)
to := streams.NewActivityStreamsToProperty() to := streams.NewActivityStreamsToProperty()
@@ -121,7 +123,9 @@ func MakeUpdateActivity(activityID *url.URL) vocab.ActivityStreamsUpdate {
activity.SetJSONLDId(id) activity.SetJSONLDId(id)
// CC the public if we're not treating ActivityPub as "private". // CC the public if we're not treating ActivityPub as "private".
if !data.GetFederationIsPrivate() { configRepository := configrepository.Get()
if !configRepository.GetFederationIsPrivate() {
public, _ := url.Parse(PUBLIC) public, _ := url.Parse(PUBLIC)
cc := streams.NewActivityStreamsCcProperty() cc := streams.NewActivityStreamsCcProperty()
cc.AppendIRI(public) cc.AppendIRI(public)

View File

@@ -9,8 +9,8 @@ import (
"github.com/go-fed/activity/streams" "github.com/go-fed/activity/streams"
"github.com/go-fed/activity/streams/vocab" "github.com/go-fed/activity/streams/vocab"
"github.com/owncast/owncast/activitypub/crypto" "github.com/owncast/owncast/activitypub/crypto"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/persistence/configrepository"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
@@ -101,11 +101,13 @@ func MakeActorPropertyWithID(idIRI *url.URL) vocab.ActivityStreamsActorProperty
// MakeServiceForAccount will create a new local actor service with the the provided username. // MakeServiceForAccount will create a new local actor service with the the provided username.
func MakeServiceForAccount(accountName string) vocab.ActivityStreamsService { func MakeServiceForAccount(accountName string) vocab.ActivityStreamsService {
configRepository := configrepository.Get()
actorIRI := MakeLocalIRIForAccount(accountName) actorIRI := MakeLocalIRIForAccount(accountName)
person := streams.NewActivityStreamsService() person := streams.NewActivityStreamsService()
nameProperty := streams.NewActivityStreamsNameProperty() nameProperty := streams.NewActivityStreamsNameProperty()
nameProperty.AppendXMLSchemaString(data.GetServerName()) nameProperty.AppendXMLSchemaString(configRepository.GetServerName())
person.SetActivityStreamsName(nameProperty) person.SetActivityStreamsName(nameProperty)
preferredUsernameProperty := streams.NewActivityStreamsPreferredUsernameProperty() preferredUsernameProperty := streams.NewActivityStreamsPreferredUsernameProperty()
@@ -119,7 +121,7 @@ func MakeServiceForAccount(accountName string) vocab.ActivityStreamsService {
person.SetActivityStreamsInbox(inboxProp) person.SetActivityStreamsInbox(inboxProp)
needsFollowApprovalProperty := streams.NewActivityStreamsManuallyApprovesFollowersProperty() needsFollowApprovalProperty := streams.NewActivityStreamsManuallyApprovesFollowersProperty()
needsFollowApprovalProperty.Set(data.GetFederationIsPrivate()) needsFollowApprovalProperty.Set(configRepository.GetFederationIsPrivate())
person.SetActivityStreamsManuallyApprovesFollowers(needsFollowApprovalProperty) person.SetActivityStreamsManuallyApprovesFollowers(needsFollowApprovalProperty)
outboxIRI := MakeLocalIRIForResource("/user/" + accountName + "/outbox") outboxIRI := MakeLocalIRIForResource("/user/" + accountName + "/outbox")
@@ -152,7 +154,7 @@ func MakeServiceForAccount(accountName string) vocab.ActivityStreamsService {
publicKeyProp.AppendW3IDSecurityV1PublicKey(publicKeyType) publicKeyProp.AppendW3IDSecurityV1PublicKey(publicKeyType)
person.SetW3IDSecurityV1PublicKey(publicKeyProp) person.SetW3IDSecurityV1PublicKey(publicKeyProp)
if t, err := data.GetServerInitTime(); t != nil { if t, err := configRepository.GetServerInitTime(); t != nil {
publishedDateProp := streams.NewActivityStreamsPublishedProperty() publishedDateProp := streams.NewActivityStreamsPublishedProperty()
publishedDateProp.Set(t.Time) publishedDateProp.Set(t.Time)
person.SetActivityStreamsPublished(publishedDateProp) person.SetActivityStreamsPublished(publishedDateProp)
@@ -163,8 +165,8 @@ func MakeServiceForAccount(accountName string) vocab.ActivityStreamsService {
// Profile properties // Profile properties
// Avatar // Avatar
uniquenessString := data.GetLogoUniquenessString() uniquenessString := configRepository.GetLogoUniquenessString()
userAvatarURLString := data.GetServerURL() + "/logo/external" userAvatarURLString := configRepository.GetServerURL() + "/logo/external"
userAvatarURL, err := url.Parse(userAvatarURLString) userAvatarURL, err := url.Parse(userAvatarURLString)
userAvatarURL.RawQuery = "uc=" + uniquenessString userAvatarURL.RawQuery = "uc=" + uniquenessString
if err != nil { if err != nil {
@@ -195,14 +197,14 @@ func MakeServiceForAccount(accountName string) vocab.ActivityStreamsService {
// Profile bio // Profile bio
summaryProperty := streams.NewActivityStreamsSummaryProperty() summaryProperty := streams.NewActivityStreamsSummaryProperty()
summaryProperty.AppendXMLSchemaString(data.GetServerSummary()) summaryProperty.AppendXMLSchemaString(configRepository.GetServerSummary())
person.SetActivityStreamsSummary(summaryProperty) person.SetActivityStreamsSummary(summaryProperty)
// Links // Links
if serverURL := data.GetServerURL(); serverURL != "" { if serverURL := configRepository.GetServerURL(); serverURL != "" {
addMetadataLinkToProfile(person, "Stream", serverURL) addMetadataLinkToProfile(person, "Stream", serverURL)
} }
for _, link := range data.GetSocialHandles() { for _, link := range configRepository.GetSocialHandles() {
addMetadataLinkToProfile(person, link.Platform, link.URL) addMetadataLinkToProfile(person, link.Platform, link.URL)
} }
@@ -220,7 +222,7 @@ func MakeServiceForAccount(accountName string) vocab.ActivityStreamsService {
// Tags // Tags
tagProp := streams.NewActivityStreamsTagProperty() tagProp := streams.NewActivityStreamsTagProperty()
for _, tagString := range data.GetServerMetadataTags() { for _, tagString := range configRepository.GetServerMetadataTags() {
hashtag := MakeHashtag(tagString) hashtag := MakeHashtag(tagString)
tagProp.AppendTootHashtag(hashtag) tagProp.AppendTootHashtag(hashtag)
} }
@@ -229,7 +231,7 @@ func MakeServiceForAccount(accountName string) vocab.ActivityStreamsService {
// Work around an issue where a single attachment will not serialize // Work around an issue where a single attachment will not serialize
// as an array, so add another item to the mix. // as an array, so add another item to the mix.
if len(data.GetSocialHandles()) == 1 { if len(configRepository.GetSocialHandles()) == 1 {
addMetadataLinkToProfile(person, "Owncast", "https://owncast.online") addMetadataLinkToProfile(person, "Owncast", "https://owncast.online")
} }

View File

@@ -9,6 +9,7 @@ import (
"github.com/go-fed/activity/streams" "github.com/go-fed/activity/streams"
"github.com/go-fed/activity/streams/vocab" "github.com/go-fed/activity/streams/vocab"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/persistence/configrepository"
) )
func makeFakeService() vocab.ActivityStreamsService { func makeFakeService() vocab.ActivityStreamsService {
@@ -55,9 +56,11 @@ func TestMain(m *testing.M) {
if err != nil { if err != nil {
panic(err) panic(err)
} }
data.SetupPersistence(dbFile.Name()) data.SetupPersistence(dbFile.Name())
data.SetServerURL("https://my.cool.site.biz")
configRepository := configrepository.Get()
configRepository.SetServerURL("https://my.cool.site.biz")
m.Run() m.Run()
} }

View File

@@ -8,7 +8,7 @@ import (
"github.com/go-fed/activity/streams" "github.com/go-fed/activity/streams"
"github.com/go-fed/activity/streams/vocab" "github.com/go-fed/activity/streams/vocab"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
@@ -27,7 +27,9 @@ func MakeRemoteIRIForResource(resourcePath string, host string) (*url.URL, error
// MakeLocalIRIForResource will create an IRI for the local server. // MakeLocalIRIForResource will create an IRI for the local server.
func MakeLocalIRIForResource(resourcePath string) *url.URL { func MakeLocalIRIForResource(resourcePath string) *url.URL {
host := data.GetServerURL() configRepository := configrepository.Get()
host := configRepository.GetServerURL()
u, err := url.Parse(host) u, err := url.Parse(host)
if err != nil { if err != nil {
log.Errorln("unable to parse local IRI url", host, err) log.Errorln("unable to parse local IRI url", host, err)
@@ -41,7 +43,9 @@ func MakeLocalIRIForResource(resourcePath string) *url.URL {
// MakeLocalIRIForAccount will return a full IRI for the local server account username. // MakeLocalIRIForAccount will return a full IRI for the local server account username.
func MakeLocalIRIForAccount(account string) *url.URL { func MakeLocalIRIForAccount(account string) *url.URL {
host := data.GetServerURL() configRepository := configrepository.Get()
host := configRepository.GetServerURL()
u, err := url.Parse(host) u, err := url.Parse(host)
if err != nil { if err != nil {
log.Errorln("unable to parse local IRI account server url", err) log.Errorln("unable to parse local IRI account server url", err)
@@ -64,7 +68,9 @@ func Serialize(obj vocab.Type) ([]byte, error) {
// MakeLocalIRIForStreamURL will return a full IRI for the local server stream url. // MakeLocalIRIForStreamURL will return a full IRI for the local server stream url.
func MakeLocalIRIForStreamURL() *url.URL { func MakeLocalIRIForStreamURL() *url.URL {
host := data.GetServerURL() configRepository := configrepository.Get()
host := configRepository.GetServerURL()
u, err := url.Parse(host) u, err := url.Parse(host)
if err != nil { if err != nil {
log.Errorln("unable to parse local IRI stream url", err) log.Errorln("unable to parse local IRI stream url", err)
@@ -78,7 +84,9 @@ func MakeLocalIRIForStreamURL() *url.URL {
// MakeLocalIRIforLogo will return a full IRI for the local server logo. // MakeLocalIRIforLogo will return a full IRI for the local server logo.
func MakeLocalIRIforLogo() *url.URL { func MakeLocalIRIforLogo() *url.URL {
host := data.GetServerURL() configRepository := configrepository.Get()
host := configRepository.GetServerURL()
u, err := url.Parse(host) u, err := url.Parse(host)
if err != nil { if err != nil {
log.Errorln("unable to parse local IRI stream url", err) log.Errorln("unable to parse local IRI stream url", err)
@@ -93,7 +101,9 @@ func MakeLocalIRIforLogo() *url.URL {
// GetLogoType will return the rel value for the webfinger response and // GetLogoType will return the rel value for the webfinger response and
// the default static image is of type png. // the default static image is of type png.
func GetLogoType() string { func GetLogoType() string {
imageFilename := data.GetLogoPath() configRepository := configrepository.Get()
imageFilename := configRepository.GetLogoPath()
if imageFilename == "" { if imageFilename == "" {
return "image/png" return "image/png"
} }

View File

@@ -9,12 +9,14 @@ import (
"github.com/owncast/owncast/activitypub/apmodels" "github.com/owncast/owncast/activitypub/apmodels"
"github.com/owncast/owncast/activitypub/crypto" "github.com/owncast/owncast/activitypub/crypto"
"github.com/owncast/owncast/activitypub/requests" "github.com/owncast/owncast/activitypub/requests"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
) )
// ActorHandler handles requests for a single actor. // ActorHandler handles requests for a single actor.
func ActorHandler(w http.ResponseWriter, r *http.Request) { func ActorHandler(w http.ResponseWriter, r *http.Request) {
if !data.GetFederationEnabled() { configRepository := configrepository.Get()
if !configRepository.GetFederationEnabled() {
w.WriteHeader(http.StatusMethodNotAllowed) w.WriteHeader(http.StatusMethodNotAllowed)
return return
} }
@@ -22,7 +24,7 @@ func ActorHandler(w http.ResponseWriter, r *http.Request) {
pathComponents := strings.Split(r.URL.Path, "/") pathComponents := strings.Split(r.URL.Path, "/")
accountName := pathComponents[3] accountName := pathComponents[3]
if _, valid := data.GetFederatedInboxMap()[accountName]; !valid { if _, valid := configRepository.GetFederatedInboxMap()[accountName]; !valid {
// User is not valid // User is not valid
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
return return

View File

@@ -16,7 +16,7 @@ import (
"github.com/owncast/owncast/activitypub/crypto" "github.com/owncast/owncast/activitypub/crypto"
"github.com/owncast/owncast/activitypub/persistence" "github.com/owncast/owncast/activitypub/persistence"
"github.com/owncast/owncast/activitypub/requests" "github.com/owncast/owncast/activitypub/requests"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
) )
const ( const (
@@ -145,7 +145,9 @@ func getFollowersPage(page string, r *http.Request) (vocab.ActivityStreamsOrdere
} }
func createPageURL(r *http.Request, page *string) (*url.URL, error) { func createPageURL(r *http.Request, page *string) (*url.URL, error) {
domain := data.GetServerURL() configRepository := configrepository.Get()
domain := configRepository.GetServerURL()
if domain == "" { if domain == "" {
return nil, errors.New("unable to get server URL") return nil, errors.New("unable to get server URL")
} }

View File

@@ -7,7 +7,7 @@ import (
"github.com/owncast/owncast/activitypub/apmodels" "github.com/owncast/owncast/activitypub/apmodels"
"github.com/owncast/owncast/activitypub/inbox" "github.com/owncast/owncast/activitypub/inbox"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
@@ -22,7 +22,9 @@ func InboxHandler(w http.ResponseWriter, r *http.Request) {
} }
func acceptInboxRequest(w http.ResponseWriter, r *http.Request) { func acceptInboxRequest(w http.ResponseWriter, r *http.Request) {
if !data.GetFederationEnabled() { configRepository := configrepository.Get()
if !configRepository.GetFederationEnabled() {
w.WriteHeader(http.StatusMethodNotAllowed) w.WriteHeader(http.StatusMethodNotAllowed)
return return
} }
@@ -39,7 +41,7 @@ func acceptInboxRequest(w http.ResponseWriter, r *http.Request) {
// The account this request is for must match the account name we have set // The account this request is for must match the account name we have set
// for federation. // for federation.
if forLocalAccount != data.GetFederationUsername() { if forLocalAccount != configRepository.GetFederationUsername() {
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
return return
} }

View File

@@ -10,7 +10,7 @@ import (
"github.com/owncast/owncast/activitypub/persistence" "github.com/owncast/owncast/activitypub/persistence"
"github.com/owncast/owncast/activitypub/requests" "github.com/owncast/owncast/activitypub/requests"
"github.com/owncast/owncast/config" "github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
@@ -25,12 +25,14 @@ func NodeInfoController(w http.ResponseWriter, r *http.Request) {
Links []links `json:"links"` Links []links `json:"links"`
} }
if !data.GetFederationEnabled() { configRepository := configrepository.Get()
if !configRepository.GetFederationEnabled() {
w.WriteHeader(http.StatusMethodNotAllowed) w.WriteHeader(http.StatusMethodNotAllowed)
return return
} }
serverURL := data.GetServerURL() serverURL := configRepository.GetServerURL()
if serverURL == "" { if serverURL == "" {
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
return return
@@ -89,7 +91,9 @@ func NodeInfoV2Controller(w http.ResponseWriter, r *http.Request) {
Metadata metadata `json:"metadata"` Metadata metadata `json:"metadata"`
} }
if !data.GetFederationEnabled() { configRepository := configrepository.Get()
if !configRepository.GetFederationEnabled() {
w.WriteHeader(http.StatusMethodNotAllowed) w.WriteHeader(http.StatusMethodNotAllowed)
return return
} }
@@ -117,7 +121,7 @@ func NodeInfoV2Controller(w http.ResponseWriter, r *http.Request) {
OpenRegistrations: false, OpenRegistrations: false,
Protocols: []string{"activitypub"}, Protocols: []string{"activitypub"},
Metadata: metadata{ Metadata: metadata{
ChatEnabled: !data.GetChatDisabled(), ChatEnabled: !configRepository.GetChatDisabled(),
}, },
} }
@@ -163,12 +167,14 @@ func XNodeInfo2Controller(w http.ResponseWriter, r *http.Request) {
OpenRegistrations bool `json:"openRegistrations"` OpenRegistrations bool `json:"openRegistrations"`
} }
if !data.GetFederationEnabled() { configRepository := configrepository.Get()
if !configRepository.GetFederationEnabled() {
w.WriteHeader(http.StatusMethodNotAllowed) w.WriteHeader(http.StatusMethodNotAllowed)
return return
} }
serverURL := data.GetServerURL() serverURL := configRepository.GetServerURL()
if serverURL == "" { if serverURL == "" {
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
return return
@@ -178,7 +184,7 @@ func XNodeInfo2Controller(w http.ResponseWriter, r *http.Request) {
res := &response{ res := &response{
Organization: Organization{ Organization: Organization{
Name: data.GetServerName(), Name: configRepository.GetServerName(),
Contact: serverURL, Contact: serverURL,
}, },
Server: Server{ Server: Server{
@@ -232,12 +238,14 @@ func InstanceV1Controller(w http.ResponseWriter, r *http.Request) {
InvitesEnabled bool `json:"invites_enabled"` InvitesEnabled bool `json:"invites_enabled"`
} }
if !data.GetFederationEnabled() { configRepository := configrepository.Get()
if !configRepository.GetFederationEnabled() {
w.WriteHeader(http.StatusMethodNotAllowed) w.WriteHeader(http.StatusMethodNotAllowed)
return return
} }
serverURL := data.GetServerURL() serverURL := configRepository.GetServerURL()
if serverURL == "" { if serverURL == "" {
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
return return
@@ -254,9 +262,9 @@ func InstanceV1Controller(w http.ResponseWriter, r *http.Request) {
res := response{ res := response{
URI: serverURL, URI: serverURL,
Title: data.GetServerName(), Title: configRepository.GetServerName(),
ShortDescription: data.GetServerSummary(), ShortDescription: configRepository.GetServerSummary(),
Description: data.GetServerSummary(), Description: configRepository.GetServerSummary(),
Version: config.GetReleaseString(), Version: config.GetReleaseString(),
Stats: Stats{ Stats: Stats{
UserCount: 1, UserCount: 1,
@@ -275,7 +283,9 @@ func InstanceV1Controller(w http.ResponseWriter, r *http.Request) {
} }
func writeResponse(payload interface{}, w http.ResponseWriter) error { func writeResponse(payload interface{}, w http.ResponseWriter) error {
accountName := data.GetDefaultFederationUsername() configRepository := configrepository.Get()
accountName := configRepository.GetDefaultFederationUsername()
actorIRI := apmodels.MakeLocalIRIForAccount(accountName) actorIRI := apmodels.MakeLocalIRIForAccount(accountName)
publicKey := crypto.GetPublicKey(actorIRI) publicKey := crypto.GetPublicKey(actorIRI)
@@ -284,7 +294,15 @@ func writeResponse(payload interface{}, w http.ResponseWriter) error {
// HostMetaController points to webfinger. // HostMetaController points to webfinger.
func HostMetaController(w http.ResponseWriter, r *http.Request) { func HostMetaController(w http.ResponseWriter, r *http.Request) {
serverURL := data.GetServerURL() configRepository := configrepository.Get()
if !configRepository.GetFederationEnabled() {
w.WriteHeader(http.StatusMethodNotAllowed)
log.Debugln("host meta request rejected! Federation is not enabled")
return
}
serverURL := configRepository.GetServerURL()
if serverURL == "" { if serverURL == "" {
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
return return

View File

@@ -8,31 +8,33 @@ import (
"github.com/owncast/owncast/activitypub/crypto" "github.com/owncast/owncast/activitypub/crypto"
"github.com/owncast/owncast/activitypub/persistence" "github.com/owncast/owncast/activitypub/persistence"
"github.com/owncast/owncast/activitypub/requests" "github.com/owncast/owncast/activitypub/requests"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
// ObjectHandler handles requests for a single federated ActivityPub object. // ObjectHandler handles requests for a single federated ActivityPub object.
func ObjectHandler(w http.ResponseWriter, r *http.Request) { func ObjectHandler(w http.ResponseWriter, r *http.Request) {
if !data.GetFederationEnabled() { configRepository := configrepository.Get()
if !configRepository.GetFederationEnabled() {
w.WriteHeader(http.StatusMethodNotAllowed) w.WriteHeader(http.StatusMethodNotAllowed)
return return
} }
// If private federation mode is enabled do not allow access to objects. // If private federation mode is enabled do not allow access to objects.
if data.GetFederationIsPrivate() { if configRepository.GetFederationIsPrivate() {
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
return return
} }
iri := strings.Join([]string{strings.TrimSuffix(data.GetServerURL(), "/"), r.URL.Path}, "") iri := strings.Join([]string{strings.TrimSuffix(configRepository.GetServerURL(), "/"), r.URL.Path}, "")
object, _, _, err := persistence.GetObjectByIRI(iri) object, _, _, err := persistence.GetObjectByIRI(iri)
if err != nil { if err != nil {
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
return return
} }
accountName := data.GetDefaultFederationUsername() accountName := configRepository.GetDefaultFederationUsername()
actorIRI := apmodels.MakeLocalIRIForAccount(accountName) actorIRI := apmodels.MakeLocalIRIForAccount(accountName)
publicKey := crypto.GetPublicKey(actorIRI) publicKey := crypto.GetPublicKey(actorIRI)

View File

@@ -6,20 +6,22 @@ import (
"strings" "strings"
"github.com/owncast/owncast/activitypub/apmodels" "github.com/owncast/owncast/activitypub/apmodels"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
"github.com/owncast/owncast/utils" "github.com/owncast/owncast/utils"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
// WebfingerHandler will handle webfinger lookup requests. // WebfingerHandler will handle webfinger lookup requests.
func WebfingerHandler(w http.ResponseWriter, r *http.Request) { func WebfingerHandler(w http.ResponseWriter, r *http.Request) {
if !data.GetFederationEnabled() { configRepository := configrepository.Get()
if !configRepository.GetFederationEnabled() {
w.WriteHeader(http.StatusMethodNotAllowed) w.WriteHeader(http.StatusMethodNotAllowed)
log.Debugln("webfinger request rejected! Federation is not enabled") log.Debugln("webfinger request rejected! Federation is not enabled")
return return
} }
instanceHostURL := data.GetServerURL() instanceHostURL := configRepository.GetServerURL()
if instanceHostURL == "" { if instanceHostURL == "" {
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
log.Warnln("webfinger request rejected! Federation is enabled but server URL is empty.") log.Warnln("webfinger request rejected! Federation is enabled but server URL is empty.")
@@ -29,7 +31,7 @@ func WebfingerHandler(w http.ResponseWriter, r *http.Request) {
instanceHostString := utils.GetHostnameFromURLString(instanceHostURL) instanceHostString := utils.GetHostnameFromURLString(instanceHostURL)
if instanceHostString == "" { if instanceHostString == "" {
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
log.Warnln("webfinger request rejected! Federation is enabled but server URL is not set properly. data.GetServerURL(): " + data.GetServerURL()) log.Warnln("webfinger request rejected! Federation is enabled but server URL is not set properly. data.GetServerURL(): " + configRepository.GetServerURL())
return return
} }
@@ -51,7 +53,7 @@ func WebfingerHandler(w http.ResponseWriter, r *http.Request) {
host := userComponents[1] host := userComponents[1]
user := userComponents[0] user := userComponents[0]
if _, valid := data.GetFederatedInboxMap()[user]; !valid { if _, valid := configRepository.GetFederatedInboxMap()[user]; !valid {
w.WriteHeader(http.StatusNotFound) w.WriteHeader(http.StatusNotFound)
log.Debugln("webfinger request rejected! Invalid user: " + user) log.Debugln("webfinger request rejected! Invalid user: " + user)
return return

View File

@@ -8,13 +8,15 @@ import (
"errors" "errors"
"net/url" "net/url"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
// GetPublicKey will return the public key for the provided actor. // GetPublicKey will return the public key for the provided actor.
func GetPublicKey(actorIRI *url.URL) PublicKey { func GetPublicKey(actorIRI *url.URL) PublicKey {
key := data.GetPublicKey() configRepository := configrepository.Get()
key := configRepository.GetPublicKey()
idURL, err := url.Parse(actorIRI.String() + "#main-key") idURL, err := url.Parse(actorIRI.String() + "#main-key")
if err != nil { if err != nil {
log.Errorln("unable to parse actor iri string", idURL, err) log.Errorln("unable to parse actor iri string", idURL, err)
@@ -29,7 +31,9 @@ func GetPublicKey(actorIRI *url.URL) PublicKey {
// GetPrivateKey will return the internal server private key. // GetPrivateKey will return the internal server private key.
func GetPrivateKey() *rsa.PrivateKey { func GetPrivateKey() *rsa.PrivateKey {
key := data.GetPrivateKey() configRepository := configrepository.Get()
key := configRepository.GetPrivateKey()
block, _ := pem.Decode([]byte(key)) block, _ := pem.Decode([]byte(key))
if block == nil { if block == nil {

View File

@@ -7,17 +7,19 @@ import (
"github.com/owncast/owncast/activitypub/resolvers" "github.com/owncast/owncast/activitypub/resolvers"
"github.com/owncast/owncast/core/chat" "github.com/owncast/owncast/core/chat"
"github.com/owncast/owncast/core/chat/events" "github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
) )
func handleEngagementActivity(eventType events.EventType, isLiveNotification bool, actorReference vocab.ActivityStreamsActorProperty, action string) error { func handleEngagementActivity(eventType events.EventType, isLiveNotification bool, actorReference vocab.ActivityStreamsActorProperty, action string) error {
configRepository := configrepository.Get()
// Do nothing if displaying engagement actions has been turned off. // Do nothing if displaying engagement actions has been turned off.
if !data.GetFederationShowEngagement() { if !configRepository.GetFederationShowEngagement() {
return nil return nil
} }
// Do nothing if chat is disabled // Do nothing if chat is disabled
if data.GetChatDisabled() { if configRepository.GetChatDisabled() {
return nil return nil
} }
@@ -36,11 +38,11 @@ func handleEngagementActivity(eventType events.EventType, isLiveNotification boo
if isLiveNotification && action == events.FediverseEngagementLike { if isLiveNotification && action == events.FediverseEngagementLike {
suffix = "liked that this stream went live." suffix = "liked that this stream went live."
} else if action == events.FediverseEngagementLike { } else if action == events.FediverseEngagementLike {
suffix = fmt.Sprintf("liked a post from %s.", data.GetServerName()) suffix = fmt.Sprintf("liked a post from %s.", configRepository.GetServerName())
} else if isLiveNotification && action == events.FediverseEngagementRepost { } else if isLiveNotification && action == events.FediverseEngagementRepost {
suffix = "shared this stream with their followers." suffix = "shared this stream with their followers."
} else if action == events.FediverseEngagementRepost { } else if action == events.FediverseEngagementRepost {
suffix = fmt.Sprintf("shared a post from %s.", data.GetServerName()) suffix = fmt.Sprintf("shared a post from %s.", configRepository.GetServerName())
} else if action == events.FediverseEngagementFollow { } else if action == events.FediverseEngagementFollow {
suffix = "followed this stream." suffix = "followed this stream."
} else { } else {

View File

@@ -10,13 +10,15 @@ import (
"github.com/owncast/owncast/activitypub/requests" "github.com/owncast/owncast/activitypub/requests"
"github.com/owncast/owncast/activitypub/resolvers" "github.com/owncast/owncast/activitypub/resolvers"
"github.com/owncast/owncast/core/chat/events" "github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
"github.com/pkg/errors" "github.com/pkg/errors"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
func handleFollowInboxRequest(c context.Context, activity vocab.ActivityStreamsFollow) error { func handleFollowInboxRequest(c context.Context, activity vocab.ActivityStreamsFollow) error {
configRepository := configrepository.Get()
follow, err := resolvers.MakeFollowRequest(c, activity) follow, err := resolvers.MakeFollowRequest(c, activity)
if err != nil { if err != nil {
log.Errorln("unable to create follow inbox request", err) log.Errorln("unable to create follow inbox request", err)
@@ -27,7 +29,7 @@ func handleFollowInboxRequest(c context.Context, activity vocab.ActivityStreamsF
return fmt.Errorf("unable to handle request") return fmt.Errorf("unable to handle request")
} }
approved := !data.GetFederationIsPrivate() approved := !configRepository.GetFederationIsPrivate()
followRequest := *follow followRequest := *follow
@@ -36,7 +38,7 @@ func handleFollowInboxRequest(c context.Context, activity vocab.ActivityStreamsF
return err return err
} }
localAccountName := data.GetDefaultFederationUsername() localAccountName := configRepository.GetDefaultFederationUsername()
if approved { if approved {
if err := requests.SendFollowAccept(follow.Inbox, activity, localAccountName); err != nil { if err := requests.SendFollowAccept(follow.Inbox, activity, localAccountName); err != nil {

View File

@@ -15,7 +15,7 @@ import (
"github.com/owncast/owncast/activitypub/apmodels" "github.com/owncast/owncast/activitypub/apmodels"
"github.com/owncast/owncast/activitypub/persistence" "github.com/owncast/owncast/activitypub/persistence"
"github.com/owncast/owncast/activitypub/resolvers" "github.com/owncast/owncast/activitypub/resolvers"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
@@ -131,7 +131,9 @@ func Verify(request *http.Request) (bool, error) {
} }
func isBlockedDomain(domain string) bool { func isBlockedDomain(domain string) bool {
blockedDomains := data.GetBlockedFederatedDomains() configRepository := configrepository.Get()
blockedDomains := configRepository.GetBlockedFederatedDomains()
for _, blockedDomain := range blockedDomains { for _, blockedDomain := range blockedDomains {
if strings.Contains(domain, blockedDomain) { if strings.Contains(domain, blockedDomain) {

View File

@@ -9,6 +9,7 @@ import (
"github.com/owncast/owncast/activitypub/apmodels" "github.com/owncast/owncast/activitypub/apmodels"
"github.com/owncast/owncast/activitypub/persistence" "github.com/owncast/owncast/activitypub/persistence"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/persistence/configrepository"
) )
func makeFakePerson() vocab.ActivityStreamsPerson { func makeFakePerson() vocab.ActivityStreamsPerson {
@@ -49,21 +50,24 @@ func makeFakePerson() vocab.ActivityStreamsPerson {
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
data.SetupPersistence(":memory:") data.SetupPersistence(":memory:")
data.SetServerURL("https://my.cool.site.biz") configRepository := configrepository.Get()
configRepository.SetServerURL("https://my.cool.site.biz")
persistence.Setup(data.GetDatastore()) persistence.Setup(data.GetDatastore())
m.Run() m.Run()
} }
func TestBlockedDomains(t *testing.T) { func TestBlockedDomains(t *testing.T) {
configRepository := configrepository.Get()
person := makeFakePerson() person := makeFakePerson()
data.SetBlockedFederatedDomains([]string{"freedom.eagle", "guns.life"}) configRepository.SetBlockedFederatedDomains([]string{"freedom.eagle", "guns.life"})
if len(data.GetBlockedFederatedDomains()) != 2 { if len(configRepository.GetBlockedFederatedDomains()) != 2 {
t.Error("Blocked federated domains is not set correctly") t.Error("Blocked federated domains is not set correctly")
} }
for _, domain := range data.GetBlockedFederatedDomains() { for _, domain := range configRepository.GetBlockedFederatedDomains() {
if domain == person.GetJSONLDId().GetIRI().Host { if domain == person.GetJSONLDId().GetIRI().Host {
return return
} }

View File

@@ -16,10 +16,10 @@ import (
"github.com/owncast/owncast/activitypub/resolvers" "github.com/owncast/owncast/activitypub/resolvers"
"github.com/owncast/owncast/activitypub/webfinger" "github.com/owncast/owncast/activitypub/webfinger"
"github.com/owncast/owncast/activitypub/workerpool" "github.com/owncast/owncast/activitypub/workerpool"
"github.com/owncast/owncast/persistence/configrepository"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/owncast/owncast/config" "github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/utils" "github.com/owncast/owncast/utils"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/teris-io/shortid" "github.com/teris-io/shortid"
@@ -27,7 +27,9 @@ import (
// SendLive will send all followers the message saying you started a live stream. // SendLive will send all followers the message saying you started a live stream.
func SendLive() error { func SendLive() error {
textContent := data.GetFederationGoLiveMessage() configRepository := configrepository.Get()
textContent := configRepository.GetFederationGoLiveMessage()
// If the message is empty then do not send it. // If the message is empty then do not send it.
if textContent == "" { if textContent == "" {
@@ -38,7 +40,7 @@ func SendLive() error {
reg := regexp.MustCompile("[^a-zA-Z0-9]+") reg := regexp.MustCompile("[^a-zA-Z0-9]+")
tagProp := streams.NewActivityStreamsTagProperty() tagProp := streams.NewActivityStreamsTagProperty()
for _, tagString := range data.GetServerMetadataTags() { for _, tagString := range configRepository.GetServerMetadataTags() {
tagWithoutSpecialCharacters := reg.ReplaceAllString(tagString, "") tagWithoutSpecialCharacters := reg.ReplaceAllString(tagString, "")
hashtag := apmodels.MakeHashtag(tagWithoutSpecialCharacters) hashtag := apmodels.MakeHashtag(tagWithoutSpecialCharacters)
tagProp.AppendTootHashtag(hashtag) tagProp.AppendTootHashtag(hashtag)
@@ -57,15 +59,15 @@ func SendLive() error {
tagsString := strings.Join(tagStrings, " ") tagsString := strings.Join(tagStrings, " ")
var streamTitle string var streamTitle string
if title := data.GetStreamTitle(); title != "" { if title := configRepository.GetStreamTitle(); title != "" {
streamTitle = fmt.Sprintf("<p>%s</p>", title) streamTitle = fmt.Sprintf("<p>%s</p>", title)
} }
textContent = fmt.Sprintf("<p>%s</p>%s<p>%s</p><p><a href=\"%s\">%s</a></p>", textContent, streamTitle, tagsString, data.GetServerURL(), data.GetServerURL()) textContent = fmt.Sprintf("<p>%s</p>%s<p>%s</p><p><a href=\"%s\">%s</a></p>", textContent, streamTitle, tagsString, configRepository.GetServerURL(), configRepository.GetServerURL())
activity, _, note, noteID := createBaseOutboundMessage(textContent) activity, _, note, noteID := createBaseOutboundMessage(textContent)
// To the public if we're not treating ActivityPub as "private". // To the public if we're not treating ActivityPub as "private".
if !data.GetFederationIsPrivate() { if !configRepository.GetFederationIsPrivate() {
note = apmodels.MakeNotePublic(note) note = apmodels.MakeNotePublic(note)
activity = apmodels.MakeActivityPublic(activity) activity = apmodels.MakeActivityPublic(activity)
} }
@@ -73,7 +75,7 @@ func SendLive() error {
note.SetActivityStreamsTag(tagProp) note.SetActivityStreamsTag(tagProp)
// Attach an image along with the Federated message. // Attach an image along with the Federated message.
previewURL, err := url.Parse(data.GetServerURL()) previewURL, err := url.Parse(configRepository.GetServerURL())
if err == nil { if err == nil {
var imageToAttach string var imageToAttach string
var mediaType string var mediaType string
@@ -94,7 +96,7 @@ func SendLive() error {
} }
} }
if data.GetNSFW() { if configRepository.GetNSFW() {
// Mark content as sensitive. // Mark content as sensitive.
sensitive := streams.NewActivityStreamsSensitiveProperty() sensitive := streams.NewActivityStreamsSensitiveProperty()
sensitive.AppendXMLSchemaBoolean(true) sensitive.AppendXMLSchemaBoolean(true)
@@ -151,6 +153,8 @@ func SendDirectMessageToAccount(textContent, account string) error {
// SendPublicMessage will send a public message to all followers. // SendPublicMessage will send a public message to all followers.
func SendPublicMessage(textContent string) error { func SendPublicMessage(textContent string) error {
configRepository := configrepository.Get()
originalContent := textContent originalContent := textContent
textContent = utils.RenderSimpleMarkdown(textContent) textContent = utils.RenderSimpleMarkdown(textContent)
@@ -173,7 +177,7 @@ func SendPublicMessage(textContent string) error {
activity, _, note, noteID := createBaseOutboundMessage(textContent) activity, _, note, noteID := createBaseOutboundMessage(textContent)
note.SetActivityStreamsTag(tagProp) note.SetActivityStreamsTag(tagProp)
if !data.GetFederationIsPrivate() { if !configRepository.GetFederationIsPrivate() {
note = apmodels.MakeNotePublic(note) note = apmodels.MakeNotePublic(note)
activity = apmodels.MakeActivityPublic(activity) activity = apmodels.MakeActivityPublic(activity)
} }
@@ -197,7 +201,8 @@ func SendPublicMessage(textContent string) error {
// nolint: unparam // nolint: unparam
func createBaseOutboundMessage(textContent string) (vocab.ActivityStreamsCreate, string, vocab.ActivityStreamsNote, string) { func createBaseOutboundMessage(textContent string) (vocab.ActivityStreamsCreate, string, vocab.ActivityStreamsNote, string) {
localActor := apmodels.MakeLocalIRIForAccount(data.GetDefaultFederationUsername()) configRepository := configrepository.Get()
localActor := apmodels.MakeLocalIRIForAccount(configRepository.GetDefaultFederationUsername())
noteID := shortid.MustGenerate() noteID := shortid.MustGenerate()
noteIRI := apmodels.MakeLocalIRIForResource(noteID) noteIRI := apmodels.MakeLocalIRIForResource(noteID)
id := shortid.MustGenerate() id := shortid.MustGenerate()
@@ -218,7 +223,8 @@ func getHashtagLinkHTMLFromTagString(baseHashtag string) string {
// SendToFollowers will send an arbitrary payload to all follower inboxes. // SendToFollowers will send an arbitrary payload to all follower inboxes.
func SendToFollowers(payload []byte) error { func SendToFollowers(payload []byte) error {
localActor := apmodels.MakeLocalIRIForAccount(data.GetDefaultFederationUsername()) configRepository := configrepository.Get()
localActor := apmodels.MakeLocalIRIForAccount(configRepository.GetDefaultFederationUsername())
followers, _, err := persistence.GetFederationFollowers(-1, 0) followers, _, err := persistence.GetFederationFollowers(-1, 0)
if err != nil { if err != nil {
@@ -241,7 +247,8 @@ func SendToFollowers(payload []byte) error {
// SendToUser will send a payload to a single specific inbox. // SendToUser will send a payload to a single specific inbox.
func SendToUser(inbox *url.URL, payload []byte) error { func SendToUser(inbox *url.URL, payload []byte) error {
localActor := apmodels.MakeLocalIRIForAccount(data.GetDefaultFederationUsername()) configRepository := configrepository.Get()
localActor := apmodels.MakeLocalIRIForAccount(configRepository.GetDefaultFederationUsername())
req, err := requests.CreateSignedRequest(payload, inbox, localActor) req, err := requests.CreateSignedRequest(payload, inbox, localActor)
if err != nil { if err != nil {
@@ -255,8 +262,10 @@ func SendToUser(inbox *url.URL, payload []byte) error {
// UpdateFollowersWithAccountUpdates will send an update to all followers alerting of a profile update. // UpdateFollowersWithAccountUpdates will send an update to all followers alerting of a profile update.
func UpdateFollowersWithAccountUpdates() error { func UpdateFollowersWithAccountUpdates() error {
configRepository := configrepository.Get()
// Don't do anything if federation is disabled. // Don't do anything if federation is disabled.
if !data.GetFederationEnabled() { if !configRepository.GetFederationEnabled() {
return nil return nil
} }
@@ -265,7 +274,7 @@ func UpdateFollowersWithAccountUpdates() error {
activity := apmodels.MakeUpdateActivity(objectID) activity := apmodels.MakeUpdateActivity(objectID)
actor := streams.NewActivityStreamsPerson() actor := streams.NewActivityStreamsPerson()
actorID := apmodels.MakeLocalIRIForAccount(data.GetDefaultFederationUsername()) actorID := apmodels.MakeLocalIRIForAccount(configRepository.GetDefaultFederationUsername())
actorIDProperty := streams.NewJSONLDIdProperty() actorIDProperty := streams.NewJSONLDIdProperty()
actorIDProperty.Set(actorID) actorIDProperty.Set(actorID)
actor.SetJSONLDId(actorIDProperty) actor.SetJSONLDId(actorIDProperty)

View File

@@ -45,8 +45,8 @@ func GetFederationFollowers(limit int, offset int) ([]models.Follower, int, erro
} }
followersResult, err := _datastore.GetQueries().GetFederationFollowersWithOffset(ctx, db.GetFederationFollowersWithOffsetParams{ followersResult, err := _datastore.GetQueries().GetFederationFollowersWithOffset(ctx, db.GetFederationFollowersWithOffsetParams{
Limit: int32(limit), Limit: limit,
Offset: int32(offset), Offset: offset,
}) })
if err != nil { if err != nil {
return nil, 0, err return nil, 0, err

View File

@@ -237,7 +237,7 @@ func GetOutbox(limit int, offset int) (vocab.ActivityStreamsOrderedCollection, e
orderedItems := streams.NewActivityStreamsOrderedItemsProperty() orderedItems := streams.NewActivityStreamsOrderedItemsProperty()
rows, err := _datastore.GetQueries().GetOutboxWithOffset( rows, err := _datastore.GetQueries().GetOutboxWithOffset(
context.Background(), context.Background(),
db.GetOutboxWithOffsetParams{Limit: int32(limit), Offset: int32(offset)}, db.GetOutboxWithOffsetParams{Limit: limit, Offset: offset},
) )
if err != nil { if err != nil {
return collection, err return collection, err
@@ -309,8 +309,8 @@ func SaveInboundFediverseActivity(objectIRI string, actorIRI string, eventType s
func GetInboundActivities(limit int, offset int) ([]models.FederatedActivity, int, error) { func GetInboundActivities(limit int, offset int) ([]models.FederatedActivity, int, error) {
ctx := context.Background() ctx := context.Background()
rows, err := _datastore.GetQueries().GetInboundActivitiesWithOffset(ctx, db.GetInboundActivitiesWithOffsetParams{ rows, err := _datastore.GetQueries().GetInboundActivitiesWithOffset(ctx, db.GetInboundActivitiesWithOffsetParams{
Limit: int32(limit), Limit: limit,
Offset: int32(offset), Offset: offset,
}) })
if err != nil { if err != nil {
return nil, 0, err return nil, 0, err

View File

@@ -10,7 +10,7 @@ import (
"github.com/go-fed/activity/streams/vocab" "github.com/go-fed/activity/streams/vocab"
"github.com/owncast/owncast/activitypub/apmodels" "github.com/owncast/owncast/activitypub/apmodels"
"github.com/owncast/owncast/activitypub/crypto" "github.com/owncast/owncast/activitypub/crypto"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
"github.com/pkg/errors" "github.com/pkg/errors"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
@@ -47,11 +47,12 @@ func Resolve(c context.Context, data []byte, callbacks ...interface{}) error {
// ResolveIRI will resolve an IRI ahd call the correct callback for the resolved type. // ResolveIRI will resolve an IRI ahd call the correct callback for the resolved type.
func ResolveIRI(c context.Context, iri string, callbacks ...interface{}) error { func ResolveIRI(c context.Context, iri string, callbacks ...interface{}) error {
configRepository := configrepository.Get()
log.Debugln("Resolving", iri) log.Debugln("Resolving", iri)
req, _ := http.NewRequest(http.MethodGet, iri, nil) req, _ := http.NewRequest(http.MethodGet, iri, nil)
actor := apmodels.MakeLocalIRIForAccount(data.GetDefaultFederationUsername()) actor := apmodels.MakeLocalIRIForAccount(configRepository.GetDefaultFederationUsername())
if err := crypto.SignRequest(req, nil, actor); err != nil { if err := crypto.SignRequest(req, nil, actor); err != nil {
return err return err
} }

View File

@@ -11,7 +11,7 @@ import (
"sync" "sync"
"time" "time"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
"github.com/owncast/owncast/utils" "github.com/owncast/owncast/utils"
"github.com/pkg/errors" "github.com/pkg/errors"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
@@ -47,6 +47,8 @@ func setupExpiredRequestPruner() {
// StartAuthFlow will begin the IndieAuth flow by generating an auth request. // StartAuthFlow will begin the IndieAuth flow by generating an auth request.
func StartAuthFlow(authHost, userID, accessToken, displayName string) (*url.URL, error) { func StartAuthFlow(authHost, userID, accessToken, displayName string) (*url.URL, error) {
configRepository := configrepository.Get()
// Limit the number of pending requests // Limit the number of pending requests
if len(pendingAuthRequests) >= maxPendingRequests { if len(pendingAuthRequests) >= maxPendingRequests {
return nil, errors.New("Please try again later. Too many pending requests.") return nil, errors.New("Please try again later. Too many pending requests.")
@@ -68,7 +70,7 @@ func StartAuthFlow(authHost, userID, accessToken, displayName string) (*url.URL,
return nil, errors.New("only servers secured with https are supported") return nil, errors.New("only servers secured with https are supported")
} }
serverURL := data.GetServerURL() serverURL := configRepository.GetServerURL()
if serverURL == "" { if serverURL == "" {
return nil, errors.New("Owncast server URL must be set when using auth") return nil, errors.New("Owncast server URL must be set when using auth")
} }

View File

@@ -4,7 +4,7 @@ import (
"fmt" "fmt"
"time" "time"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/teris-io/shortid" "github.com/teris-io/shortid"
) )
@@ -70,6 +70,8 @@ func StartServerAuth(clientID, redirectURI, codeChallenge, state, me string) (*S
// CompleteServerAuth will verify that the values provided in the final step // CompleteServerAuth will verify that the values provided in the final step
// of the IndieAuth flow are correct, and return some basic profile info. // of the IndieAuth flow are correct, and return some basic profile info.
func CompleteServerAuth(code, redirectURI, clientID string, codeVerifier string) (*ServerProfileResponse, error) { func CompleteServerAuth(code, redirectURI, clientID string, codeVerifier string) (*ServerProfileResponse, error) {
configRepository := configrepository.Get()
request, pending := pendingServerAuthRequests[code] request, pending := pendingServerAuthRequests[code]
if !pending { if !pending {
return nil, errors.New("no pending authentication request") return nil, errors.New("no pending authentication request")
@@ -89,11 +91,11 @@ func CompleteServerAuth(code, redirectURI, clientID string, codeVerifier string)
} }
response := ServerProfileResponse{ response := ServerProfileResponse{
Me: data.GetServerURL(), Me: configRepository.GetServerURL(),
Profile: ServerProfile{ Profile: ServerProfile{
Name: data.GetServerName(), Name: configRepository.GetServerName(),
URL: data.GetServerURL(), URL: configRepository.GetServerURL(),
Photo: fmt.Sprintf("%s/%s", data.GetServerURL(), data.GetLogoPath()), Photo: fmt.Sprintf("%s/%s", configRepository.GetServerURL(), configRepository.GetLogoPath()),
}, },
} }

View File

@@ -8,8 +8,8 @@ folderPath="webserver/handlers/generated"
specPath="openapi.yaml" specPath="openapi.yaml"
# validate scripts are installed # validate scripts are installed
if ! command -v swagger-cli &>/dev/null; then if ! command -v redocly &>/dev/null; then
echo "Please install \`swagger-cli\` before running this script" echo "Please install \`redocly cli\` before running this script: npm install -g @redocly/cli"
exit 1 exit 1
fi fi
@@ -20,7 +20,7 @@ if ! command -v oapi-codegen &>/dev/null; then
fi fi
# validate schema # validate schema
swagger-cli validate $specPath npx redocly lint $specPath
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "Open API specification is not valid" echo "Open API specification is not valid"
exit 1 exit 1

View File

@@ -7,8 +7,8 @@ import (
"github.com/owncast/owncast/config" "github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/chat/events" "github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/persistence/configrepository"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promauto"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
@@ -23,6 +23,8 @@ var (
func Start(getStatusFunc func() models.Status) error { func Start(getStatusFunc func() models.Status) error {
setupPersistence() setupPersistence()
configRepository := configrepository.Get()
getStatus = getStatusFunc getStatus = getStatusFunc
_server = NewChat() _server = NewChat()
@@ -35,7 +37,7 @@ func Start(getStatusFunc func() models.Status) error {
Help: "The number of chat messages incremented over time.", Help: "The number of chat messages incremented over time.",
ConstLabels: map[string]string{ ConstLabels: map[string]string{
"version": config.VersionNumber, "version": config.VersionNumber,
"host": data.GetServerURL(), "host": configRepository.GetServerURL(),
}, },
}) })

View File

@@ -13,8 +13,8 @@ import (
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"github.com/owncast/owncast/config" "github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/chat/events" "github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/persistence/configrepository"
"github.com/owncast/owncast/services/geoip" "github.com/owncast/owncast/services/geoip"
) )
@@ -133,7 +133,9 @@ func (c *Client) readPump() {
} }
// Check if this message passes the optional language filter // Check if this message passes the optional language filter
if data.GetChatSlurFilterEnabled() && !c.messageFilter.Allow(string(message)) { configRepository := configrepository.Get()
if configRepository.GetChatSlurFilterEnabled() && !c.messageFilter.Allow(string(message)) {
c.sendAction("Sorry, that message contained language that is not allowed in this chat.") c.sendAction("Sorry, that message contained language that is not allowed in this chat.")
continue continue
} }
@@ -209,9 +211,11 @@ func (c *Client) close() {
} }
func (c *Client) passesRateLimit() bool { func (c *Client) passesRateLimit() bool {
configRepository := configrepository.Get()
// If spam rate limiting is disabled, or the user is a moderator, always // If spam rate limiting is disabled, or the user is a moderator, always
// allow the message. // allow the message.
if !data.GetChatSpamProtectionEnabled() || c.User.IsModerator() { if !configRepository.GetChatSpamProtectionEnabled() || c.User.IsModerator() {
return true return true
} }

View File

@@ -10,14 +10,14 @@ import (
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
func setSystemConcurrentConnectionLimit(limit int64) { func setSystemConcurrentConnectionLimit(limit uint64) {
var rLimit syscall.Rlimit var rLimit syscall.Rlimit
if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil { if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil {
log.Fatalln(err) log.Fatalln(err)
} }
originalLimit := rLimit.Cur originalLimit := rLimit.Cur
rLimit.Cur = uint64(limit) rLimit.Cur = limit
if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil { if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil {
log.Fatalln(err) log.Fatalln(err)
} }

View File

@@ -9,7 +9,7 @@ import (
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
func setSystemConcurrentConnectionLimit(limit int64) { func setSystemConcurrentConnectionLimit(limit uint64) {
var rLimit syscall.Rlimit var rLimit syscall.Rlimit
if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil { if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil {
log.Fatalln(err) log.Fatalln(err)

View File

@@ -3,4 +3,4 @@
package chat package chat
func setSystemConcurrentConnectionLimit(limit int64) {} func setSystemConcurrentConnectionLimit(limit uint64) {}

View File

@@ -8,8 +8,8 @@ import (
"github.com/owncast/owncast/config" "github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/chat/events" "github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/core/webhooks" "github.com/owncast/owncast/core/webhooks"
"github.com/owncast/owncast/persistence/configrepository"
"github.com/owncast/owncast/persistence/userrepository" "github.com/owncast/owncast/persistence/userrepository"
"github.com/owncast/owncast/utils" "github.com/owncast/owncast/utils"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
@@ -22,10 +22,12 @@ func (s *Server) userNameChanged(eventData chatClientEvent) {
return return
} }
configRepository := configrepository.Get()
proposedUsername := receivedEvent.NewName proposedUsername := receivedEvent.NewName
// Check if name is on the blocklist // Check if name is on the blocklist
blocklist := data.GetForbiddenUsernameList() blocklist := configRepository.GetForbiddenUsernameList()
// Names have a max length // Names have a max length
proposedUsername = utils.MakeSafeStringOfLength(proposedUsername, config.MaxChatDisplayNameLength) proposedUsername = utils.MakeSafeStringOfLength(proposedUsername, config.MaxChatDisplayNameLength)

View File

@@ -17,7 +17,7 @@ import (
"github.com/yuin/goldmark/extension" "github.com/yuin/goldmark/extension"
"github.com/yuin/goldmark/renderer/html" "github.com/yuin/goldmark/renderer/html"
"github.com/yuin/goldmark/util" "github.com/yuin/goldmark/util"
"mvdan.cc/xurls" "mvdan.cc/xurls/v2"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
@@ -220,7 +220,7 @@ func RenderMarkdown(raw string) string {
[]byte("https:"), []byte("https:"),
}), }),
extension.WithLinkifyURLRegexp( extension.WithLinkifyURLRegexp(
xurls.Strict, xurls.Strict(),
), ),
), ),
emoji.New( emoji.New(

View File

@@ -1,6 +1,8 @@
package events package events
import "github.com/owncast/owncast/core/data" import (
"github.com/owncast/owncast/persistence/configrepository"
)
// FediverseEngagementEvent is a message displayed in chat on representing an action on the Fediverse. // FediverseEngagementEvent is a message displayed in chat on representing an action on the Fediverse.
type FediverseEngagementEvent struct { type FediverseEngagementEvent struct {
@@ -13,6 +15,8 @@ type FediverseEngagementEvent struct {
// GetBroadcastPayload will return the object to send to all chat users. // GetBroadcastPayload will return the object to send to all chat users.
func (e *FediverseEngagementEvent) GetBroadcastPayload() EventPayload { func (e *FediverseEngagementEvent) GetBroadcastPayload() EventPayload {
configRepository := configrepository.Get()
return EventPayload{ return EventPayload{
"id": e.ID, "id": e.ID,
"timestamp": e.Timestamp, "timestamp": e.Timestamp,
@@ -22,7 +26,7 @@ func (e *FediverseEngagementEvent) GetBroadcastPayload() EventPayload {
"title": e.UserAccountName, "title": e.UserAccountName,
"link": e.Link, "link": e.Link,
"user": EventPayload{ "user": EventPayload{
"displayName": data.GetServerName(), "displayName": configRepository.GetServerName(),
}, },
} }
} }

View File

@@ -1,6 +1,8 @@
package events package events
import "github.com/owncast/owncast/core/data" import (
"github.com/owncast/owncast/persistence/configrepository"
)
// SystemMessageEvent is a message displayed in chat on behalf of the server. // SystemMessageEvent is a message displayed in chat on behalf of the server.
type SystemMessageEvent struct { type SystemMessageEvent struct {
@@ -10,13 +12,15 @@ type SystemMessageEvent struct {
// GetBroadcastPayload will return the object to send to all chat users. // GetBroadcastPayload will return the object to send to all chat users.
func (e *SystemMessageEvent) GetBroadcastPayload() EventPayload { func (e *SystemMessageEvent) GetBroadcastPayload() EventPayload {
configRepository := configrepository.Get()
return EventPayload{ return EventPayload{
"id": e.ID, "id": e.ID,
"timestamp": e.Timestamp, "timestamp": e.Timestamp,
"body": e.Body, "body": e.Body,
"type": SystemMessageSent, "type": SystemMessageSent,
"user": EventPayload{ "user": EventPayload{
"displayName": data.GetServerName(), "displayName": configRepository.GetServerName(),
}, },
} }
} }

View File

@@ -9,6 +9,7 @@ import (
"github.com/owncast/owncast/core/chat/events" "github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/persistence/authrepository"
"github.com/owncast/owncast/persistence/tables" "github.com/owncast/owncast/persistence/tables"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
@@ -24,7 +25,9 @@ const (
func setupPersistence() { func setupPersistence() {
_datastore = data.GetDatastore() _datastore = data.GetDatastore()
tables.CreateMessagesTable(_datastore.DB) tables.CreateMessagesTable(_datastore.DB)
data.CreateBanIPTable(_datastore.DB)
authRepository := authrepository.Get()
authRepository.CreateBanIPTable(_datastore.DB)
chatDataPruner := time.NewTicker(5 * time.Minute) chatDataPruner := time.NewTicker(5 * time.Minute)
go func() { go func() {

View File

@@ -13,9 +13,10 @@ import (
"github.com/owncast/owncast/config" "github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/chat/events" "github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/core/webhooks" "github.com/owncast/owncast/core/webhooks"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/persistence/authrepository"
"github.com/owncast/owncast/persistence/configrepository"
"github.com/owncast/owncast/persistence/userrepository" "github.com/owncast/owncast/persistence/userrepository"
"github.com/owncast/owncast/services/geoip" "github.com/owncast/owncast/services/geoip"
"github.com/owncast/owncast/utils" "github.com/owncast/owncast/utils"
@@ -41,7 +42,7 @@ type Server struct {
// a map of user IDs and timers that fire for chat part messages. // a map of user IDs and timers that fire for chat part messages.
userPartedTimers map[string]*time.Ticker userPartedTimers map[string]*time.Ticker
seq uint seq uint
maxSocketConnectionLimit int64 maxSocketConnectionLimit uint64
mu sync.RWMutex mu sync.RWMutex
} }
@@ -95,7 +96,9 @@ func (s *Server) Addclient(conn *websocket.Conn, user *models.User, accessToken
ConnectedAt: time.Now(), ConnectedAt: time.Now(),
} }
shouldSendJoinedMessages := data.GetChatJoinPartMessagesEnabled() configRepository := configrepository.Get()
shouldSendJoinedMessages := configRepository.GetChatJoinPartMessagesEnabled()
// If there are existing clients connected for this user do not send // If there are existing clients connected for this user do not send
// a user joined message. Do not put this under a mutex, as // a user joined message. Do not put this under a mutex, as
@@ -186,8 +189,10 @@ func (s *Server) sendUserPartedMessage(c *Client) {
userPartEvent.User = c.User userPartEvent.User = c.User
userPartEvent.ClientID = c.Id userPartEvent.ClientID = c.Id
configRepository := configrepository.Get()
// If part messages are disabled. // If part messages are disabled.
if data.GetChatJoinPartMessagesEnabled() { if configRepository.GetChatJoinPartMessagesEnabled() {
if err := s.Broadcast(userPartEvent.GetBroadcastPayload()); err != nil { if err := s.Broadcast(userPartEvent.GetBroadcastPayload()); err != nil {
log.Errorln("error sending chat part message", err) log.Errorln("error sending chat part message", err)
} }
@@ -198,14 +203,17 @@ func (s *Server) sendUserPartedMessage(c *Client) {
// HandleClientConnection is fired when a single client connects to the websocket. // HandleClientConnection is fired when a single client connects to the websocket.
func (s *Server) HandleClientConnection(w http.ResponseWriter, r *http.Request) { func (s *Server) HandleClientConnection(w http.ResponseWriter, r *http.Request) {
if data.GetChatDisabled() { configRepository := configrepository.Get()
authRepository := authrepository.Get()
if configRepository.GetChatDisabled() {
_, _ = w.Write([]byte(events.ChatDisabled)) _, _ = w.Write([]byte(events.ChatDisabled))
return return
} }
ipAddress := utils.GetIPAddressFromRequest(r) ipAddress := utils.GetIPAddressFromRequest(r)
// Check if this client's IP address is banned. If so send a rejection. // Check if this client's IP address is banned. If so send a rejection.
if blocked, err := data.IsIPAddressBanned(ipAddress); blocked { if blocked, err := authRepository.IsIPAddressBanned(ipAddress); blocked {
log.Debugln("Client ip address has been blocked. Rejecting.") log.Debugln("Client ip address has been blocked. Rejecting.")
w.WriteHeader(http.StatusForbidden) w.WriteHeader(http.StatusForbidden)
@@ -215,7 +223,7 @@ func (s *Server) HandleClientConnection(w http.ResponseWriter, r *http.Request)
} }
// Limit concurrent chat connections // Limit concurrent chat connections
if int64(len(s.clients)) >= s.maxSocketConnectionLimit { if uint64(len(s.clients)) >= s.maxSocketConnectionLimit {
log.Warnln("rejecting incoming client connection as it exceeds the max client count of", s.maxSocketConnectionLimit) log.Warnln("rejecting incoming client connection as it exceeds the max client count of", s.maxSocketConnectionLimit)
_, _ = w.Write([]byte(events.ErrorMaxConnectionsExceeded)) _, _ = w.Write([]byte(events.ErrorMaxConnectionsExceeded))
return return
@@ -377,12 +385,14 @@ func SendActionToUser(userID string, text string) error {
} }
func (s *Server) eventReceived(event chatClientEvent) { func (s *Server) eventReceived(event chatClientEvent) {
configRepository := configrepository.Get()
c := event.client c := event.client
u := c.User u := c.User
// If established chat user only mode is enabled and the user is not old // If established chat user only mode is enabled and the user is not old
// enough then reject this event and send them an informative message. // enough then reject this event and send them an informative message.
if u != nil && data.GetChatEstbalishedUsersOnlyMode() && time.Since(event.client.User.CreatedAt) < config.GetDefaults().ChatEstablishedUserModeTimeDuration && !u.IsModerator() { if u != nil && configRepository.GetChatEstbalishedUsersOnlyMode() && time.Since(event.client.User.CreatedAt) < config.GetDefaults().ChatEstablishedUserModeTimeDuration && !u.IsModerator() {
s.sendActionToClient(c, "You have not been an established chat participant long enough to take part in chat. Please enjoy the stream and try again later.") s.sendActionToClient(c, "You have not been an established chat participant long enough to take part in chat. Please enjoy the stream and try again later.")
return return
} }
@@ -409,10 +419,12 @@ func (s *Server) eventReceived(event chatClientEvent) {
} }
func (s *Server) sendWelcomeMessageToClient(c *Client) { func (s *Server) sendWelcomeMessageToClient(c *Client) {
configRepository := configrepository.Get()
// Add an artificial delay so people notice this message come in. // Add an artificial delay so people notice this message come in.
time.Sleep(7 * time.Second) time.Sleep(7 * time.Second)
welcomeMessage := utils.RenderSimpleMarkdown(data.GetServerWelcomeMessage()) welcomeMessage := utils.RenderSimpleMarkdown(configRepository.GetServerWelcomeMessage())
if welcomeMessage != "" { if welcomeMessage != "" {
s.sendSystemMessageToClient(c, welcomeMessage) s.sendSystemMessageToClient(c, welcomeMessage)
@@ -420,7 +432,9 @@ func (s *Server) sendWelcomeMessageToClient(c *Client) {
} }
func (s *Server) sendAllWelcomeMessage() { func (s *Server) sendAllWelcomeMessage() {
welcomeMessage := utils.RenderSimpleMarkdown(data.GetServerWelcomeMessage()) configRepository := configrepository.Get()
welcomeMessage := utils.RenderSimpleMarkdown(configRepository.GetServerWelcomeMessage())
if welcomeMessage != "" { if welcomeMessage != "" {
clientMessage := events.SystemMessageEvent{ clientMessage := events.SystemMessageEvent{

View File

@@ -9,14 +9,14 @@ import (
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
func getMaximumConcurrentConnectionLimit() int64 { func getMaximumConcurrentConnectionLimit() uint64 {
var rLimit syscall.Rlimit var rLimit syscall.Rlimit
if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil { if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit); err != nil {
log.Fatalln(err) log.Fatalln(err)
} }
// Return the limit to 70% of max so the machine doesn't die even if it's maxed out for some reason. // Return the limit to 70% of max so the machine doesn't die even if it's maxed out for some reason.
proposedLimit := int64(float32(rLimit.Max) * 0.7) proposedLimit := uint64(float32(rLimit.Max) * 0.7)
return proposedLimit return proposedLimit
} }

View File

@@ -3,7 +3,7 @@
package chat package chat
func getMaximumConcurrentConnectionLimit() int64 { func getMaximumConcurrentConnectionLimit() uint64 {
// The maximum limit I can find for windows is 16,777,216 // The maximum limit I can find for windows is 16,777,216
// (essentially unlimited, but add the 0.7 multiplier as well to be // (essentially unlimited, but add the 0.7 multiplier as well to be
// consistent with other systems) // consistent with other systems)

View File

@@ -16,6 +16,7 @@ import (
"github.com/owncast/owncast/core/webhooks" "github.com/owncast/owncast/core/webhooks"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/notifications" "github.com/owncast/owncast/notifications"
"github.com/owncast/owncast/persistence/configrepository"
"github.com/owncast/owncast/persistence/tables" "github.com/owncast/owncast/persistence/tables"
"github.com/owncast/owncast/utils" "github.com/owncast/owncast/utils"
"github.com/owncast/owncast/yp" "github.com/owncast/owncast/yp"
@@ -34,10 +35,10 @@ var (
// Start starts up the core processing. // Start starts up the core processing.
func Start() error { func Start() error {
resetDirectories() resetDirectories()
configRepository := configrepository.Get()
// configRepository.PopulateDefaults()
data.PopulateDefaults() if err := configRepository.VerifySettings(); err != nil {
if err := data.VerifySettings(); err != nil {
log.Error(err) log.Error(err)
return err return err
} }
@@ -75,7 +76,7 @@ func Start() error {
// start the rtmp server // start the rtmp server
go rtmp.Start(setStreamAsConnected, setBroadcaster) go rtmp.Start(setStreamAsConnected, setBroadcaster)
rtmpPort := data.GetRTMPPortNumber() rtmpPort := configRepository.GetRTMPPortNumber()
if rtmpPort != 1935 { if rtmpPort != 1935 {
log.Infof("RTMP is accepting inbound streams on port %d.", rtmpPort) log.Infof("RTMP is accepting inbound streams on port %d.", rtmpPort)
} }
@@ -113,7 +114,8 @@ func transitionToOfflineVideoStreamContent() {
go _transcoder.Start(false) go _transcoder.Start(false)
// Copy the logo to be the thumbnail // Copy the logo to be the thumbnail
logo := data.GetLogoPath() configRepository := configrepository.Get()
logo := configRepository.GetLogoPath()
dst := filepath.Join(config.TempDir, "thumbnail.jpg") dst := filepath.Join(config.TempDir, "thumbnail.jpg")
if err = utils.Copy(filepath.Join("data", logo), dst); err != nil { if err = utils.Copy(filepath.Join("data", logo), dst); err != nil {
log.Warnln(err) log.Warnln(err)
@@ -130,7 +132,8 @@ func resetDirectories() {
utils.CleanupDirectory(config.HLSStoragePath) utils.CleanupDirectory(config.HLSStoragePath)
// Remove the previous thumbnail // Remove the previous thumbnail
logo := data.GetLogoPath() configRepository := configrepository.Get()
logo := configRepository.GetLogoPath()
if utils.DoesFileExists(logo) { if utils.DoesFileExists(logo) {
err := utils.Copy(path.Join("data", logo), filepath.Join(config.DataDirectory, "thumbnail.jpg")) err := utils.Copy(path.Join("data", logo), filepath.Join(config.DataDirectory, "thumbnail.jpg"))
if err != nil { if err != nil {

View File

@@ -1,13 +0,0 @@
package data
// GetFederatedInboxMap is a mapping between account names and their outbox.
func GetFederatedInboxMap() map[string]string {
return map[string]string{
GetDefaultFederationUsername(): GetDefaultFederationUsername(),
}
}
// GetDefaultFederationUsername will return the username used for sending federation activities.
func GetDefaultFederationUsername() string {
return GetFederationUsername()
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,23 +0,0 @@
package data
// GetPublicKey will return the public key.
func GetPublicKey() string {
value, _ := _datastore.GetString(publicKeyKey)
return value
}
// SetPublicKey will save the public key.
func SetPublicKey(key string) error {
return _datastore.SetString(publicKeyKey, key)
}
// GetPrivateKey will return the private key.
func GetPrivateKey() string {
value, _ := _datastore.GetString(privateKeyKey)
return value
}
// SetPrivateKey will save the private key.
func SetPrivateKey(key string) error {
return _datastore.SetString(privateKeyKey, key)
}

View File

@@ -4,6 +4,8 @@ import (
"fmt" "fmt"
"os" "os"
"testing" "testing"
"github.com/owncast/owncast/models"
) )
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
@@ -89,7 +91,7 @@ func TestCustomType(t *testing.T) {
} }
// Save config entry to the database // Save config entry to the database
if err := _datastore.Save(ConfigEntry{&testStruct, testKey}); err != nil { if err := _datastore.Save(models.ConfigEntry{&testStruct, testKey}); err != nil {
t.Error(err) t.Error(err)
} }
@@ -101,7 +103,7 @@ func TestCustomType(t *testing.T) {
// Get a typed struct out of it // Get a typed struct out of it
var testResult TestStruct var testResult TestStruct
if err := entryResult.getObject(&testResult); err != nil { if err := entryResult.GetObject(&testResult); err != nil {
t.Error(err) t.Error(err)
} }
@@ -121,7 +123,7 @@ func TestStringMap(t *testing.T) {
} }
// Save config entry to the database // Save config entry to the database
if err := _datastore.Save(ConfigEntry{&testMap, testKey}); err != nil { if err := _datastore.Save(models.ConfigEntry{Value: &testMap, Key: testKey}); err != nil {
t.Error(err) t.Error(err)
} }
@@ -131,7 +133,7 @@ func TestStringMap(t *testing.T) {
t.Error(err) t.Error(err)
} }
testResult, err := entryResult.getStringMap() testResult, err := entryResult.GetStringMap()
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }

View File

@@ -5,12 +5,11 @@ import (
"database/sql" "database/sql"
"encoding/gob" "encoding/gob"
"sync" "sync"
"time"
// sqlite requires a blank import. // sqlite requires a blank import.
_ "github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3"
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/db" "github.com/owncast/owncast/db"
"github.com/owncast/owncast/models"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
@@ -21,7 +20,8 @@ type Datastore struct {
DbLock *sync.Mutex DbLock *sync.Mutex
} }
func (ds *Datastore) warmCache() { // WarmCache pre-caches all configuration values in memory.
func (ds *Datastore) WarmCache() {
log.Traceln("Warming config value cache") log.Traceln("Warming config value cache")
res, err := ds.DB.Query("SELECT key, value FROM datastore") res, err := ds.DB.Query("SELECT key, value FROM datastore")
@@ -46,10 +46,10 @@ func (ds *Datastore) GetQueries() *db.Queries {
} }
// Get will query the database for the key and return the entry. // Get will query the database for the key and return the entry.
func (ds *Datastore) Get(key string) (ConfigEntry, error) { func (ds *Datastore) Get(key string) (models.ConfigEntry, error) {
cachedValue, err := ds.GetCachedValue(key) cachedValue, err := ds.GetCachedValue(key)
if err == nil { if err == nil {
return ConfigEntry{ return models.ConfigEntry{
Key: key, Key: key,
Value: cachedValue, Value: cachedValue,
}, nil }, nil
@@ -60,10 +60,10 @@ func (ds *Datastore) Get(key string) (ConfigEntry, error) {
row := ds.DB.QueryRow("SELECT key, value FROM datastore WHERE key = ? LIMIT 1", key) row := ds.DB.QueryRow("SELECT key, value FROM datastore WHERE key = ? LIMIT 1", key)
if err := row.Scan(&resultKey, &resultValue); err != nil { if err := row.Scan(&resultKey, &resultValue); err != nil {
return ConfigEntry{}, err return models.ConfigEntry{}, err
} }
result := ConfigEntry{ result := models.ConfigEntry{
Key: resultKey, Key: resultKey,
Value: resultValue, Value: resultValue,
} }
@@ -73,7 +73,7 @@ func (ds *Datastore) Get(key string) (ConfigEntry, error) {
} }
// Save will save the ConfigEntry to the database. // Save will save the ConfigEntry to the database.
func (ds *Datastore) Save(e ConfigEntry) error { func (ds *Datastore) Save(e models.ConfigEntry) error {
ds.DbLock.Lock() ds.DbLock.Lock()
defer ds.DbLock.Unlock() defer ds.DbLock.Unlock()
@@ -93,7 +93,6 @@ func (ds *Datastore) Save(e ConfigEntry) error {
return err return err
} }
_, err = stmt.Exec(e.Key, dataGob.Bytes()) _, err = stmt.Exec(e.Key, dataGob.Bytes())
if err != nil { if err != nil {
return err return err
} }
@@ -121,26 +120,6 @@ func (ds *Datastore) Setup() {
);` );`
ds.MustExec(createTableSQL) ds.MustExec(createTableSQL)
if !HasPopulatedDefaults() {
PopulateDefaults()
}
if !hasPopulatedFederationDefaults() {
if err := SetFederationGoLiveMessage(config.GetDefaults().FederationGoLiveMessage); err != nil {
log.Errorln(err)
}
if err := _datastore.SetBool("HAS_POPULATED_FEDERATION_DEFAULTS", true); err != nil {
log.Errorln(err)
}
}
// Set the server initialization date if needed.
if hasSetInitDate, _ := GetServerInitTime(); hasSetInitDate == nil || !hasSetInitDate.Valid {
_ = SetServerInitTime(time.Now())
}
migrateDatastoreValues(_datastore)
} }
// Reset will delete all config entries in the datastore and start over. // Reset will delete all config entries in the datastore and start over.
@@ -156,8 +135,6 @@ func (ds *Datastore) Reset() {
if _, err = stmt.Exec(); err != nil { if _, err = stmt.Exec(); err != nil {
log.Fatalln(err) log.Fatalln(err)
} }
PopulateDefaults()
} }
// GetDatastore returns the shared instance of the owncast datastore. // GetDatastore returns the shared instance of the owncast datastore.

View File

@@ -1,54 +0,0 @@
package data
import (
"github.com/owncast/owncast/config"
"github.com/owncast/owncast/models"
)
// HasPopulatedDefaults will determine if the defaults have been inserted into the database.
func HasPopulatedDefaults() bool {
hasPopulated, err := _datastore.GetBool("HAS_POPULATED_DEFAULTS")
if err != nil {
return false
}
return hasPopulated
}
func hasPopulatedFederationDefaults() bool {
hasPopulated, err := _datastore.GetBool("HAS_POPULATED_FEDERATION_DEFAULTS")
if err != nil {
return false
}
return hasPopulated
}
// PopulateDefaults will set default values in the database.
func PopulateDefaults() {
_datastore.warmCache()
defaults := config.GetDefaults()
if HasPopulatedDefaults() {
return
}
_ = SetAdminPassword(defaults.AdminPassword)
_ = SetStreamKeys(defaults.StreamKeys)
_ = SetHTTPPortNumber(float64(defaults.WebServerPort))
_ = SetRTMPPortNumber(float64(defaults.RTMPServerPort))
_ = SetLogoPath(defaults.Logo)
_ = SetServerMetadataTags([]string{"owncast", "streaming"})
_ = SetServerSummary(defaults.Summary)
_ = SetServerWelcomeMessage("")
_ = SetServerName(defaults.Name)
_ = SetExtraPageBodyContent(defaults.PageBodyContent)
_ = SetFederationGoLiveMessage(defaults.FederationGoLiveMessage)
_ = SetSocialHandles([]models.SocialHandle{
{
Platform: "github",
URL: "https://github.com/owncast/owncast",
},
})
_ = _datastore.SetBool("HAS_POPULATED_DEFAULTS", true)
}

View File

@@ -1,14 +1,5 @@
package data package data
import (
"context"
"database/sql"
"github.com/owncast/owncast/db"
"github.com/owncast/owncast/models"
log "github.com/sirupsen/logrus"
)
// GetMessagesCount will return the number of messages in the database. // GetMessagesCount will return the number of messages in the database.
func GetMessagesCount() int64 { func GetMessagesCount() int64 {
query := `SELECT COUNT(*) FROM messages` query := `SELECT COUNT(*) FROM messages`
@@ -25,58 +16,3 @@ func GetMessagesCount() int64 {
} }
return count return count
} }
// CreateBanIPTable will create the IP ban table if needed.
func CreateBanIPTable(db *sql.DB) {
createTableSQL := ` CREATE TABLE IF NOT EXISTS ip_bans (
"ip_address" TEXT NOT NULL PRIMARY KEY,
"notes" TEXT,
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);`
stmt, err := db.Prepare(createTableSQL)
if err != nil {
log.Fatal("error creating ip ban table", err)
}
defer stmt.Close()
if _, err := stmt.Exec(); err != nil {
log.Fatal("error creating ip ban table", err)
}
}
// BanIPAddress will persist a new IP address ban to the datastore.
func BanIPAddress(address, note string) error {
return _datastore.GetQueries().BanIPAddress(context.Background(), db.BanIPAddressParams{
IpAddress: address,
Notes: sql.NullString{String: note, Valid: true},
})
}
// IsIPAddressBanned will return if an IP address has been previously blocked.
func IsIPAddressBanned(address string) (bool, error) {
blocked, error := _datastore.GetQueries().IsIPAddressBlocked(context.Background(), address)
return blocked > 0, error
}
// GetIPAddressBans will return all the banned IP addresses.
func GetIPAddressBans() ([]models.IPAddress, error) {
result, err := _datastore.GetQueries().GetIPAddressBans(context.Background())
if err != nil {
return nil, err
}
response := []models.IPAddress{}
for _, ip := range result {
response = append(response, models.IPAddress{
IPAddress: ip.IpAddress,
Notes: ip.Notes.String,
CreatedAt: ip.CreatedAt.Time,
})
}
return response, err
}
// RemoveIPAddressBan will remove a previously banned IP address.
func RemoveIPAddressBan(address string) error {
return _datastore.GetQueries().RemoveIPAddressBan(context.Background(), address)
}

View File

@@ -1,17 +1,19 @@
package data package data
import "github.com/owncast/owncast/models"
// GetStringSlice will return the string slice value for a key. // GetStringSlice will return the string slice value for a key.
func (ds *Datastore) GetStringSlice(key string) ([]string, error) { func (ds *Datastore) GetStringSlice(key string) ([]string, error) {
configEntry, err := ds.Get(key) configEntry, err := ds.Get(key)
if err != nil { if err != nil {
return []string{}, err return []string{}, err
} }
return configEntry.getStringSlice() return configEntry.GetStringSlice()
} }
// SetStringSlice will set the string slice value for a key. // SetStringSlice will set the string slice value for a key.
func (ds *Datastore) SetStringSlice(key string, value []string) error { func (ds *Datastore) SetStringSlice(key string, value []string) error {
configEntry := ConfigEntry{value, key} configEntry := models.ConfigEntry{Value: value, Key: key}
return ds.Save(configEntry) return ds.Save(configEntry)
} }
@@ -21,12 +23,12 @@ func (ds *Datastore) GetString(key string) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
return configEntry.getString() return configEntry.GetString()
} }
// SetString will set the string value for a key. // SetString will set the string value for a key.
func (ds *Datastore) SetString(key string, value string) error { func (ds *Datastore) SetString(key string, value string) error {
configEntry := ConfigEntry{value, key} configEntry := models.ConfigEntry{Value: value, Key: key}
return ds.Save(configEntry) return ds.Save(configEntry)
} }
@@ -36,12 +38,12 @@ func (ds *Datastore) GetNumber(key string) (float64, error) {
if err != nil { if err != nil {
return 0, err return 0, err
} }
return configEntry.getNumber() return configEntry.GetNumber()
} }
// SetNumber will set the numeric value for a key. // SetNumber will set the numeric value for a key.
func (ds *Datastore) SetNumber(key string, value float64) error { func (ds *Datastore) SetNumber(key string, value float64) error {
configEntry := ConfigEntry{value, key} configEntry := models.ConfigEntry{Value: value, Key: key}
return ds.Save(configEntry) return ds.Save(configEntry)
} }
@@ -51,12 +53,12 @@ func (ds *Datastore) GetBool(key string) (bool, error) {
if err != nil { if err != nil {
return false, err return false, err
} }
return configEntry.getBool() return configEntry.GetBool()
} }
// SetBool will set the boolean value for a key. // SetBool will set the boolean value for a key.
func (ds *Datastore) SetBool(key string, value bool) error { func (ds *Datastore) SetBool(key string, value bool) error {
configEntry := ConfigEntry{value, key} configEntry := models.ConfigEntry{Value: value, Key: key}
return ds.Save(configEntry) return ds.Save(configEntry)
} }
@@ -66,11 +68,11 @@ func (ds *Datastore) GetStringMap(key string) (map[string]string, error) {
if err != nil { if err != nil {
return map[string]string{}, err return map[string]string{}, err
} }
return configEntry.getStringMap() return configEntry.GetStringMap()
} }
// SetStringMap will set the string map value for a key. // SetStringMap will set the string map value for a key.
func (ds *Datastore) SetStringMap(key string, value map[string]string) error { func (ds *Datastore) SetStringMap(key string, value map[string]string) error {
configEntry := ConfigEntry{value, key} configEntry := models.ConfigEntry{Value: value, Key: key}
return ds.Save(configEntry) return ds.Save(configEntry)
} }

View File

@@ -12,8 +12,8 @@ import (
"github.com/nareix/joy5/format/rtmp" "github.com/nareix/joy5/format/rtmp"
"github.com/owncast/owncast/config" "github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/persistence/configrepository"
) )
var _hasInboundRTMPConnection = false var _hasInboundRTMPConnection = false
@@ -33,7 +33,9 @@ func Start(setStreamAsConnected func(*io.PipeReader), setBroadcaster func(models
_setStreamAsConnected = setStreamAsConnected _setStreamAsConnected = setStreamAsConnected
_setBroadcaster = setBroadcaster _setBroadcaster = setBroadcaster
port := data.GetRTMPPortNumber() configRepository := configrepository.Get()
port := configRepository.GetRTMPPortNumber()
s := rtmp.NewServer() s := rtmp.NewServer()
var lis net.Listener var lis net.Listener
var err error var err error
@@ -78,8 +80,10 @@ func HandleConn(c *rtmp.Conn, nc net.Conn) {
return return
} }
configRepository := configrepository.Get()
accessGranted := false accessGranted := false
validStreamingKeys := data.GetStreamKeys() validStreamingKeys := configRepository.GetStreamKeys()
// If a stream key override was specified then use that instead. // If a stream key override was specified then use that instead.
if config.TemporaryStreamKey != "" { if config.TemporaryStreamKey != "" {

View File

@@ -7,8 +7,8 @@ import (
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/persistence/configrepository"
"github.com/owncast/owncast/services/geoip" "github.com/owncast/owncast/services/geoip"
) )
@@ -48,7 +48,8 @@ func IsStreamConnected() bool {
// Kind of a hack. It takes a handful of seconds between a RTMP connection and when HLS data is available. // Kind of a hack. It takes a handful of seconds between a RTMP connection and when HLS data is available.
// So account for that with an artificial buffer of four segments. // So account for that with an artificial buffer of four segments.
timeSinceLastConnected := time.Since(_stats.LastConnectTime.Time).Seconds() timeSinceLastConnected := time.Since(_stats.LastConnectTime.Time).Seconds()
waitTime := math.Max(float64(data.GetStreamLatencyLevel().SecondsPerSegment)*3.0, 7) configRepository := configrepository.Get()
waitTime := math.Max(float64(configRepository.GetStreamLatencyLevel().SecondsPerSegment)*3.0, 7)
if timeSinceLastConnected < waitTime { if timeSinceLastConnected < waitTime {
return false return false
} }
@@ -75,7 +76,7 @@ func SetViewerActive(viewer *models.Viewer) {
l.Lock() l.Lock()
defer l.Unlock() defer l.Unlock()
// Asynchronously, optionally, fetch GeoIP data. // Asynchronously, optionally, fetch GeoIP configRepository.
go func(viewer *models.Viewer) { go func(viewer *models.Viewer) {
viewer.Geo = _geoIPClient.GetGeoFromIP(viewer.IPAddress) viewer.Geo = _geoIPClient.GetGeoFromIP(viewer.IPAddress)
}(viewer) }(viewer)
@@ -111,27 +112,29 @@ func pruneViewerCount() {
} }
func saveStats() { func saveStats() {
if err := data.SetPeakOverallViewerCount(_stats.OverallMaxViewerCount); err != nil { configRepository := configrepository.Get()
if err := configRepository.SetPeakOverallViewerCount(_stats.OverallMaxViewerCount); err != nil {
log.Errorln("error saving viewer count", err) log.Errorln("error saving viewer count", err)
} }
if err := data.SetPeakSessionViewerCount(_stats.SessionMaxViewerCount); err != nil { if err := configRepository.SetPeakSessionViewerCount(_stats.SessionMaxViewerCount); err != nil {
log.Errorln("error saving viewer count", err) log.Errorln("error saving viewer count", err)
} }
if _stats.LastDisconnectTime != nil && _stats.LastDisconnectTime.Valid { if _stats.LastDisconnectTime != nil && _stats.LastDisconnectTime.Valid {
if err := data.SetLastDisconnectTime(_stats.LastDisconnectTime.Time); err != nil { if err := configRepository.SetLastDisconnectTime(_stats.LastDisconnectTime.Time); err != nil {
log.Errorln("error saving disconnect time", err) log.Errorln("error saving disconnect time", err)
} }
} }
} }
func getSavedStats() models.Stats { func getSavedStats() models.Stats {
savedLastDisconnectTime, _ := data.GetLastDisconnectTime() configRepository := configrepository.Get()
savedLastDisconnectTime, _ := configRepository.GetLastDisconnectTime()
result := models.Stats{ result := models.Stats{
ChatClients: make(map[string]models.Client), ChatClients: make(map[string]models.Client),
Viewers: make(map[string]*models.Viewer), Viewers: make(map[string]*models.Viewer),
SessionMaxViewerCount: data.GetPeakSessionViewerCount(), SessionMaxViewerCount: configRepository.GetPeakSessionViewerCount(),
OverallMaxViewerCount: data.GetPeakOverallViewerCount(), OverallMaxViewerCount: configRepository.GetPeakOverallViewerCount(),
LastDisconnectTime: savedLastDisconnectTime, LastDisconnectTime: savedLastDisconnectTime,
} }

View File

@@ -2,8 +2,8 @@ package core
import ( import (
"github.com/owncast/owncast/config" "github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/persistence/configrepository"
) )
// GetStatus gets the status of the system. // GetStatus gets the status of the system.
@@ -17,6 +17,7 @@ func GetStatus() models.Status {
viewerCount = len(_stats.Viewers) viewerCount = len(_stats.Viewers)
} }
configRepository := configrepository.Get()
return models.Status{ return models.Status{
Online: IsStreamConnected(), Online: IsStreamConnected(),
ViewerCount: viewerCount, ViewerCount: viewerCount,
@@ -25,7 +26,7 @@ func GetStatus() models.Status {
LastDisconnectTime: _stats.LastDisconnectTime, LastDisconnectTime: _stats.LastDisconnectTime,
LastConnectTime: _stats.LastConnectTime, LastConnectTime: _stats.LastConnectTime,
VersionNumber: config.VersionNumber, VersionNumber: config.VersionNumber,
StreamTitle: data.GetStreamTitle(), StreamTitle: configRepository.GetStreamTitle(),
} }
} }

View File

@@ -1,12 +1,13 @@
package core package core
import ( import (
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/core/storageproviders" "github.com/owncast/owncast/core/storageproviders"
"github.com/owncast/owncast/persistence/configrepository"
) )
func setupStorage() error { func setupStorage() error {
s3Config := data.GetS3Config() configRepository := configrepository.Get()
s3Config := configRepository.GetS3Config()
if s3Config.Enabled { if s3Config.Enabled {
_storage = storageproviders.NewS3Storage() _storage = storageproviders.NewS3Storage()

View File

@@ -5,9 +5,8 @@ import (
"path/filepath" "path/filepath"
"sort" "sort"
"github.com/owncast/owncast/persistence/configrepository"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/owncast/owncast/core/data"
) )
// LocalStorage represents an instance of the local storage provider for HLS video. // LocalStorage represents an instance of the local storage provider for HLS video.
@@ -22,7 +21,8 @@ func NewLocalStorage() *LocalStorage {
// Setup configures this storage provider. // Setup configures this storage provider.
func (s *LocalStorage) Setup() error { func (s *LocalStorage) Setup() error {
s.host = data.GetVideoServingEndpoint() configRepository := configrepository.Get()
s.host = configRepository.GetVideoServingEndpoint()
return nil return nil
} }
@@ -63,7 +63,8 @@ func (s *LocalStorage) Save(filePath string, retryCount int) (string, error) {
// Cleanup will remove old files from the storage provider. // Cleanup will remove old files from the storage provider.
func (s *LocalStorage) Cleanup() error { func (s *LocalStorage) Cleanup() error {
// Determine how many files we should keep on disk // Determine how many files we should keep on disk
maxNumber := data.GetStreamLatencyLevel().SegmentCount configRepository := configrepository.Get()
maxNumber := configRepository.GetStreamLatencyLevel().SegmentCount
buffer := 10 buffer := 10
return localCleanup(maxNumber + buffer) return localCleanup(maxNumber + buffer)
} }

View File

@@ -11,7 +11,7 @@ import (
"sync" "sync"
"time" "time"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
"github.com/owncast/owncast/utils" "github.com/owncast/owncast/utils"
"github.com/pkg/errors" "github.com/pkg/errors"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
@@ -64,9 +64,9 @@ func NewS3Storage() *S3Storage {
// Setup sets up the s3 storage for saving the video to s3. // Setup sets up the s3 storage for saving the video to s3.
func (s *S3Storage) Setup() error { func (s *S3Storage) Setup() error {
log.Trace("Setting up S3 for external storage of video...") log.Trace("Setting up S3 for external storage of video...")
configRepository := configrepository.Get()
s3Config := data.GetS3Config() s3Config := configRepository.GetS3Config()
customVideoServingEndpoint := data.GetVideoServingEndpoint() customVideoServingEndpoint := configRepository.GetVideoServingEndpoint()
if customVideoServingEndpoint != "" { if customVideoServingEndpoint != "" {
s.host = customVideoServingEndpoint s.host = customVideoServingEndpoint
@@ -106,8 +106,9 @@ func (s *S3Storage) SegmentWritten(localFilePath string) {
averagePerformance := utils.GetAveragePerformance(performanceMonitorKey) averagePerformance := utils.GetAveragePerformance(performanceMonitorKey)
// Warn the user about long-running save operations // Warn the user about long-running save operations
configRepository := configrepository.Get()
if averagePerformance != 0 { if averagePerformance != 0 {
if averagePerformance > float64(data.GetStreamLatencyLevel().SecondsPerSegment)*0.9 { if averagePerformance > float64(configRepository.GetStreamLatencyLevel().SecondsPerSegment)*0.9 {
log.Warnln("Possible slow uploads: average upload S3 save duration", averagePerformance, "s. troubleshoot this issue by visiting https://owncast.online/docs/troubleshooting/") log.Warnln("Possible slow uploads: average upload S3 save duration", averagePerformance, "s. troubleshoot this issue by visiting https://owncast.online/docs/troubleshooting/")
} }
} }
@@ -220,7 +221,8 @@ func (s *S3Storage) Cleanup() error {
// RemoteCleanup will remove old files from the remote storage provider. // RemoteCleanup will remove old files from the remote storage provider.
func (s *S3Storage) RemoteCleanup() error { func (s *S3Storage) RemoteCleanup() error {
// Determine how many files we should keep on S3 storage // Determine how many files we should keep on S3 storage
maxNumber := data.GetStreamLatencyLevel().SegmentCount configRepository := configrepository.Get()
maxNumber := configRepository.GetStreamLatencyLevel().SegmentCount
buffer := 20 buffer := 20
keys, err := s.getDeletableVideoSegmentsWithOffset(maxNumber + buffer) keys, err := s.getDeletableVideoSegmentsWithOffset(maxNumber + buffer)

View File

@@ -16,6 +16,7 @@ import (
"github.com/owncast/owncast/core/webhooks" "github.com/owncast/owncast/core/webhooks"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/notifications" "github.com/owncast/owncast/notifications"
"github.com/owncast/owncast/persistence/configrepository"
"github.com/owncast/owncast/utils" "github.com/owncast/owncast/utils"
) )
@@ -39,9 +40,11 @@ func setStreamAsConnected(rtmpOut *io.PipeReader) {
_stats.LastConnectTime = &now _stats.LastConnectTime = &now
_stats.SessionMaxViewerCount = 0 _stats.SessionMaxViewerCount = 0
configRepository := configrepository.Get()
_currentBroadcast = &models.CurrentBroadcast{ _currentBroadcast = &models.CurrentBroadcast{
LatencyLevel: data.GetStreamLatencyLevel(), LatencyLevel: configRepository.GetStreamLatencyLevel(),
OutputSettings: data.GetStreamOutputVariants(), OutputSettings: configRepository.GetStreamOutputVariants(),
} }
StopOfflineCleanupTimer() StopOfflineCleanupTimer()
@@ -69,7 +72,7 @@ func setStreamAsConnected(rtmpOut *io.PipeReader) {
}() }()
go webhooks.SendStreamStatusEvent(models.StreamStarted) go webhooks.SendStreamStatusEvent(models.StreamStarted)
selectedThumbnailVideoQualityIndex, isVideoPassthrough := data.FindHighestVideoQualityIndex(_currentBroadcast.OutputSettings) selectedThumbnailVideoQualityIndex, isVideoPassthrough := configRepository.FindHighestVideoQualityIndex(_currentBroadcast.OutputSettings)
transcoder.StartThumbnailGenerator(segmentPath, selectedThumbnailVideoQualityIndex, isVideoPassthrough) transcoder.StartThumbnailGenerator(segmentPath, selectedThumbnailVideoQualityIndex, isVideoPassthrough)
_ = chat.SendSystemAction("Stay tuned, the stream is **starting**!", true) _ = chat.SendSystemAction("Stay tuned, the stream is **starting**!", true)
@@ -176,8 +179,9 @@ func startLiveStreamNotificationsTimer() context.CancelFunc {
return return
} }
configRepository := configrepository.Get()
// Send Fediverse message. // Send Fediverse message.
if data.GetFederationEnabled() { if configRepository.GetFederationEnabled() {
log.Traceln("Sending Federated Go Live message.") log.Traceln("Sending Federated Go Live message.")
if err := activitypub.SendLive(); err != nil { if err := activitypub.SendLive(); err != nil {
log.Errorln(err) log.Errorln(err)

View File

@@ -11,7 +11,7 @@ import (
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/owncast/owncast/config" "github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
"github.com/owncast/owncast/utils" "github.com/owncast/owncast/utils"
) )
@@ -88,9 +88,9 @@ func fireThumbnailGenerator(segmentPath string, variantIndex int) error {
if len(names) == 0 { if len(names) == 0 {
return nil return nil
} }
configRepository := configrepository.Get()
mostRecentFile := path.Join(framePath, names[0]) mostRecentFile := path.Join(framePath, names[0])
ffmpegPath := utils.ValidatedFfmpegPath(data.GetFfMpegPath()) ffmpegPath := utils.ValidatedFfmpegPath(configRepository.GetFfMpegPath())
outputFileTemp := path.Join(config.TempDir, "tempthumbnail.jpg") outputFileTemp := path.Join(config.TempDir, "tempthumbnail.jpg")
thumbnailCmdFlags := []string{ thumbnailCmdFlags := []string{
@@ -120,7 +120,8 @@ func fireThumbnailGenerator(segmentPath string, variantIndex int) error {
} }
func makeAnimatedGifPreview(sourceFile string, outputFile string) { func makeAnimatedGifPreview(sourceFile string, outputFile string) {
ffmpegPath := utils.ValidatedFfmpegPath(data.GetFfMpegPath()) configRepository := configrepository.Get()
ffmpegPath := utils.ValidatedFfmpegPath(configRepository.GetFfMpegPath())
outputFileTemp := path.Join(config.TempDir, "temppreview.gif") outputFileTemp := path.Join(config.TempDir, "temppreview.gif")
// Filter is pulled from https://engineering.giphy.com/how-to-make-gifs-with-ffmpeg/ // Filter is pulled from https://engineering.giphy.com/how-to-make-gifs-with-ffmpeg/

View File

@@ -12,9 +12,9 @@ import (
"github.com/teris-io/shortid" "github.com/teris-io/shortid"
"github.com/owncast/owncast/config" "github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/logging" "github.com/owncast/owncast/logging"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/persistence/configrepository"
"github.com/owncast/owncast/utils" "github.com/owncast/owncast/utils"
) )
@@ -229,7 +229,9 @@ func (t *Transcoder) getString() string {
"-hls_segment_filename", localListenerAddress + "/%v/stream-" + t.segmentIdentifier + "-%d.ts", // Send HLS segments back to us over HTTP "-hls_segment_filename", localListenerAddress + "/%v/stream-" + t.segmentIdentifier + "-%d.ts", // Send HLS segments back to us over HTTP
"-max_muxing_queue_size", "400", // Workaround for Too many packets error: https://trac.ffmpeg.org/ticket/6375?cversion=0 "-max_muxing_queue_size", "400", // Workaround for Too many packets error: https://trac.ffmpeg.org/ticket/6375?cversion=0
"-method PUT", // HLS results sent back to us will be over PUTs "-method PUT", // HLS results sent back to us will be over PUTs
"-http_persistent", "1", // Ensures persistent HTTP connections
localListenerAddress + "/%v/stream.m3u8", // Send HLS playlists back to us over HTTP localListenerAddress + "/%v/stream.m3u8", // Send HLS playlists back to us over HTTP
} }
@@ -273,15 +275,16 @@ func getVariantFromConfigQuality(quality models.StreamOutputVariant, index int)
// NewTranscoder will return a new Transcoder, populated by the config. // NewTranscoder will return a new Transcoder, populated by the config.
func NewTranscoder() *Transcoder { func NewTranscoder() *Transcoder {
ffmpegPath := utils.ValidatedFfmpegPath(data.GetFfMpegPath()) configRepository := configrepository.Get()
ffmpegPath := utils.ValidatedFfmpegPath(configRepository.GetFfMpegPath())
transcoder := new(Transcoder) transcoder := new(Transcoder)
transcoder.ffmpegPath = ffmpegPath transcoder.ffmpegPath = ffmpegPath
transcoder.internalListenerPort = config.InternalHLSListenerPort transcoder.internalListenerPort = config.InternalHLSListenerPort
transcoder.currentStreamOutputSettings = data.GetStreamOutputVariants() transcoder.currentStreamOutputSettings = configRepository.GetStreamOutputVariants()
transcoder.currentLatencyLevel = data.GetStreamLatencyLevel() transcoder.currentLatencyLevel = configRepository.GetStreamLatencyLevel()
transcoder.codec = getCodec(data.GetVideoCodec()) transcoder.codec = getCodec(configRepository.GetVideoCodec())
transcoder.segmentOutputPath = config.HLSStoragePath transcoder.segmentOutputPath = config.HLSStoragePath
transcoder.playlistOutputPath = config.HLSStoragePath transcoder.playlistOutputPath = config.HLSStoragePath

View File

@@ -42,7 +42,7 @@ func TestFFmpegNvencCommand(t *testing.T) {
cmd := transcoder.getString() cmd := transcoder.getString()
expectedLogPath := filepath.Join("data", "logs", "transcoder.log") expectedLogPath := filepath.Join("data", "logs", "transcoder.log")
expected := `FFREPORT=file="` + expectedLogPath + `":level=32 ` + transcoder.ffmpegPath + ` -hide_banner -loglevel warning -hwaccel cuda -fflags +genpts -flags +cgop -i fakecontent.flv -map v:0 -c:v:0 h264_nvenc -b:v:0 1008k -maxrate:v:0 1088k -g:v:0 90 -keyint_min:v:0 90 -r:v:0 30 -tune:v:0 ll -map a:0? -c:a:0 copy -preset p3 -map v:0 -c:v:1 h264_nvenc -b:v:1 3308k -maxrate:v:1 3572k -g:v:1 72 -keyint_min:v:1 72 -r:v:1 24 -tune:v:1 ll -map a:0? -c:a:1 copy -preset p5 -map v:0 -c:v:2 copy -map a:0? -c:a:2 copy -preset p1 -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2 " -f hls -hls_time 3 -hls_list_size 10 -hls_flags program_date_time+independent_segments+omit_endlist -segment_format_options mpegts_flags=mpegts_copyts=1 -pix_fmt yuv420p -sc_threshold 0 -master_pl_name stream.m3u8 -hls_segment_filename http://127.0.0.1:8123/%v/stream-jdoieGg-%d.ts -max_muxing_queue_size 400 -method PUT http://127.0.0.1:8123/%v/stream.m3u8` expected := `FFREPORT=file="` + expectedLogPath + `":level=32 ` + transcoder.ffmpegPath + ` -hide_banner -loglevel warning -hwaccel cuda -fflags +genpts -flags +cgop -i fakecontent.flv -map v:0 -c:v:0 h264_nvenc -b:v:0 1008k -maxrate:v:0 1088k -g:v:0 90 -keyint_min:v:0 90 -r:v:0 30 -tune:v:0 ll -map a:0? -c:a:0 copy -preset p3 -map v:0 -c:v:1 h264_nvenc -b:v:1 3308k -maxrate:v:1 3572k -g:v:1 72 -keyint_min:v:1 72 -r:v:1 24 -tune:v:1 ll -map a:0? -c:a:1 copy -preset p5 -map v:0 -c:v:2 copy -map a:0? -c:a:2 copy -preset p1 -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2 " -f hls -hls_time 3 -hls_list_size 10 -hls_flags program_date_time+independent_segments+omit_endlist -segment_format_options mpegts_flags=mpegts_copyts=1 -pix_fmt yuv420p -sc_threshold 0 -master_pl_name stream.m3u8 -hls_segment_filename http://127.0.0.1:8123/%v/stream-jdoieGg-%d.ts -max_muxing_queue_size 400 -method PUT -http_persistent 1 http://127.0.0.1:8123/%v/stream.m3u8`
if cmd != expected { if cmd != expected {
t.Errorf("ffmpeg command does not match expected.\nGot %s\n, want: %s", cmd, expected) t.Errorf("ffmpeg command does not match expected.\nGot %s\n, want: %s", cmd, expected)

View File

@@ -42,7 +42,7 @@ func TestFFmpegOmxCommand(t *testing.T) {
cmd := transcoder.getString() cmd := transcoder.getString()
expectedLogPath := filepath.Join("data", "logs", "transcoder.log") expectedLogPath := filepath.Join("data", "logs", "transcoder.log")
expected := `FFREPORT=file="` + expectedLogPath + `":level=32 ` + transcoder.ffmpegPath + ` -hide_banner -loglevel warning -fflags +genpts -flags +cgop -i fakecontent.flv -map v:0 -c:v:0 h264_omx -b:v:0 1008k -maxrate:v:0 1088k -g:v:0 90 -keyint_min:v:0 90 -r:v:0 30 -map a:0? -c:a:0 copy -preset veryfast -map v:0 -c:v:1 h264_omx -b:v:1 3308k -maxrate:v:1 3572k -g:v:1 72 -keyint_min:v:1 72 -r:v:1 24 -map a:0? -c:a:1 copy -preset fast -map v:0 -c:v:2 copy -map a:0? -c:a:2 copy -preset ultrafast -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2 " -f hls -hls_time 3 -hls_list_size 10 -hls_flags program_date_time+independent_segments+omit_endlist -segment_format_options mpegts_flags=mpegts_copyts=1 -tune zerolatency -pix_fmt yuv420p -sc_threshold 0 -master_pl_name stream.m3u8 -hls_segment_filename http://127.0.0.1:8123/%v/stream-jdFsdfzGg-%d.ts -max_muxing_queue_size 400 -method PUT http://127.0.0.1:8123/%v/stream.m3u8` expected := `FFREPORT=file="` + expectedLogPath + `":level=32 ` + transcoder.ffmpegPath + ` -hide_banner -loglevel warning -fflags +genpts -flags +cgop -i fakecontent.flv -map v:0 -c:v:0 h264_omx -b:v:0 1008k -maxrate:v:0 1088k -g:v:0 90 -keyint_min:v:0 90 -r:v:0 30 -map a:0? -c:a:0 copy -preset veryfast -map v:0 -c:v:1 h264_omx -b:v:1 3308k -maxrate:v:1 3572k -g:v:1 72 -keyint_min:v:1 72 -r:v:1 24 -map a:0? -c:a:1 copy -preset fast -map v:0 -c:v:2 copy -map a:0? -c:a:2 copy -preset ultrafast -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2 " -f hls -hls_time 3 -hls_list_size 10 -hls_flags program_date_time+independent_segments+omit_endlist -segment_format_options mpegts_flags=mpegts_copyts=1 -tune zerolatency -pix_fmt yuv420p -sc_threshold 0 -master_pl_name stream.m3u8 -hls_segment_filename http://127.0.0.1:8123/%v/stream-jdFsdfzGg-%d.ts -max_muxing_queue_size 400 -method PUT -http_persistent 1 http://127.0.0.1:8123/%v/stream.m3u8`
if cmd != expected { if cmd != expected {
t.Errorf("ffmpeg command does not match expected.\nGot %s\n, want: %s", cmd, expected) t.Errorf("ffmpeg command does not match expected.\nGot %s\n, want: %s", cmd, expected)

View File

@@ -42,7 +42,7 @@ func TestFFmpegVaapiCommand(t *testing.T) {
cmd := transcoder.getString() cmd := transcoder.getString()
expectedLogPath := filepath.Join("data", "logs", "transcoder.log") expectedLogPath := filepath.Join("data", "logs", "transcoder.log")
expected := `FFREPORT=file="` + expectedLogPath + `":level=32 ` + transcoder.ffmpegPath + ` -hide_banner -loglevel warning -hwaccel vaapi -hwaccel_output_format vaapi -vaapi_device /dev/dri/renderD128 -fflags +genpts -flags +cgop -i fakecontent.flv -map v:0 -c:v:0 h264_vaapi -b:v:0 1008k -maxrate:v:0 1088k -g:v:0 90 -keyint_min:v:0 90 -r:v:0 30 -map a:0? -c:a:0 copy -preset veryfast -map v:0 -c:v:1 h264_vaapi -b:v:1 3308k -maxrate:v:1 3572k -g:v:1 72 -keyint_min:v:1 72 -r:v:1 24 -map a:0? -c:a:1 copy -preset fast -map v:0 -c:v:2 copy -map a:0? -c:a:2 copy -preset ultrafast -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2 " -f hls -hls_time 3 -hls_list_size 10 -hls_flags program_date_time+independent_segments+omit_endlist -segment_format_options mpegts_flags=mpegts_copyts=1 -pix_fmt vaapi_vld -sc_threshold 0 -master_pl_name stream.m3u8 -hls_segment_filename http://127.0.0.1:8123/%v/stream-jdofFGg-%d.ts -max_muxing_queue_size 400 -method PUT http://127.0.0.1:8123/%v/stream.m3u8` expected := `FFREPORT=file="` + expectedLogPath + `":level=32 ` + transcoder.ffmpegPath + ` -hide_banner -loglevel warning -hwaccel vaapi -hwaccel_output_format vaapi -vaapi_device /dev/dri/renderD128 -fflags +genpts -flags +cgop -i fakecontent.flv -map v:0 -c:v:0 h264_vaapi -b:v:0 1008k -maxrate:v:0 1088k -g:v:0 90 -keyint_min:v:0 90 -r:v:0 30 -map a:0? -c:a:0 copy -preset veryfast -map v:0 -c:v:1 h264_vaapi -b:v:1 3308k -maxrate:v:1 3572k -g:v:1 72 -keyint_min:v:1 72 -r:v:1 24 -map a:0? -c:a:1 copy -preset fast -map v:0 -c:v:2 copy -map a:0? -c:a:2 copy -preset ultrafast -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2 " -f hls -hls_time 3 -hls_list_size 10 -hls_flags program_date_time+independent_segments+omit_endlist -segment_format_options mpegts_flags=mpegts_copyts=1 -pix_fmt vaapi_vld -sc_threshold 0 -master_pl_name stream.m3u8 -hls_segment_filename http://127.0.0.1:8123/%v/stream-jdofFGg-%d.ts -max_muxing_queue_size 400 -method PUT -http_persistent 1 http://127.0.0.1:8123/%v/stream.m3u8`
if cmd != expected { if cmd != expected {
t.Errorf("ffmpeg command does not match expected.\nGot %s\n, want: %s", cmd, expected) t.Errorf("ffmpeg command does not match expected.\nGot %s\n, want: %s", cmd, expected)

View File

@@ -42,7 +42,7 @@ func TestFFmpegVideoToolboxCommand(t *testing.T) {
cmd := transcoder.getString() cmd := transcoder.getString()
expectedLogPath := filepath.Join("data", "logs", "transcoder.log") expectedLogPath := filepath.Join("data", "logs", "transcoder.log")
expected := `FFREPORT=file="` + expectedLogPath + `":level=32 ` + transcoder.ffmpegPath + ` -hide_banner -loglevel warning -fflags +genpts -flags +cgop -i fakecontent.flv -map v:0 -c:v:0 h264_videotoolbox -b:v:0 1008k -maxrate:v:0 1088k -g:v:0 90 -keyint_min:v:0 90 -r:v:0 30 -realtime true -map a:0? -c:a:0 copy -preset veryfast -map v:0 -c:v:1 h264_videotoolbox -b:v:1 3308k -maxrate:v:1 3572k -g:v:1 72 -keyint_min:v:1 72 -r:v:1 24 -map a:0? -c:a:1 copy -preset fast -map v:0 -c:v:2 copy -map a:0? -c:a:2 copy -preset ultrafast -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2 " -f hls -hls_time 3 -hls_list_size 10 -hls_flags program_date_time+independent_segments+omit_endlist -segment_format_options mpegts_flags=mpegts_copyts=1 -pix_fmt nv12 -sc_threshold 0 -master_pl_name stream.m3u8 -hls_segment_filename http://127.0.0.1:8123/%v/stream-jdFsdfzGg-%d.ts -max_muxing_queue_size 400 -method PUT http://127.0.0.1:8123/%v/stream.m3u8` expected := `FFREPORT=file="` + expectedLogPath + `":level=32 ` + transcoder.ffmpegPath + ` -hide_banner -loglevel warning -fflags +genpts -flags +cgop -i fakecontent.flv -map v:0 -c:v:0 h264_videotoolbox -b:v:0 1008k -maxrate:v:0 1088k -g:v:0 90 -keyint_min:v:0 90 -r:v:0 30 -realtime true -map a:0? -c:a:0 copy -preset veryfast -map v:0 -c:v:1 h264_videotoolbox -b:v:1 3308k -maxrate:v:1 3572k -g:v:1 72 -keyint_min:v:1 72 -r:v:1 24 -map a:0? -c:a:1 copy -preset fast -map v:0 -c:v:2 copy -map a:0? -c:a:2 copy -preset ultrafast -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2 " -f hls -hls_time 3 -hls_list_size 10 -hls_flags program_date_time+independent_segments+omit_endlist -segment_format_options mpegts_flags=mpegts_copyts=1 -pix_fmt nv12 -sc_threshold 0 -master_pl_name stream.m3u8 -hls_segment_filename http://127.0.0.1:8123/%v/stream-jdFsdfzGg-%d.ts -max_muxing_queue_size 400 -method PUT -http_persistent 1 http://127.0.0.1:8123/%v/stream.m3u8`
if cmd != expected { if cmd != expected {
t.Errorf("ffmpeg command does not match expected.\nGot %s\n, want: %s", cmd, expected) t.Errorf("ffmpeg command does not match expected.\nGot %s\n, want: %s", cmd, expected)

View File

@@ -42,7 +42,7 @@ func TestFFmpegx264Command(t *testing.T) {
cmd := transcoder.getString() cmd := transcoder.getString()
expectedLogPath := filepath.Join("data", "logs", "transcoder.log") expectedLogPath := filepath.Join("data", "logs", "transcoder.log")
expected := `FFREPORT=file="` + expectedLogPath + `":level=32 ` + transcoder.ffmpegPath + ` -hide_banner -loglevel warning -fflags +genpts -flags +cgop -i fakecontent.flv -map v:0 -c:v:0 libx264 -b:v:0 1008k -maxrate:v:0 1088k -g:v:0 90 -keyint_min:v:0 90 -r:v:0 30 -x264-params:v:0 "scenecut=0:open_gop=0" -bufsize:v:0 1088k -profile:v:0 high -map a:0? -c:a:0 copy -preset veryfast -map v:0 -c:v:1 libx264 -b:v:1 3308k -maxrate:v:1 3572k -g:v:1 72 -keyint_min:v:1 72 -r:v:1 24 -x264-params:v:1 "scenecut=0:open_gop=0" -bufsize:v:1 3572k -profile:v:1 high -map a:0? -c:a:1 copy -preset fast -map v:0 -c:v:2 copy -map a:0? -c:a:2 copy -preset ultrafast -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2 " -f hls -hls_time 3 -hls_list_size 10 -hls_flags program_date_time+independent_segments+omit_endlist -segment_format_options mpegts_flags=mpegts_copyts=1 -tune zerolatency -pix_fmt yuv420p -sc_threshold 0 -master_pl_name stream.m3u8 -hls_segment_filename http://127.0.0.1:8123/%v/stream-jdofFGg-%d.ts -max_muxing_queue_size 400 -method PUT http://127.0.0.1:8123/%v/stream.m3u8` expected := `FFREPORT=file="` + expectedLogPath + `":level=32 ` + transcoder.ffmpegPath + ` -hide_banner -loglevel warning -fflags +genpts -flags +cgop -i fakecontent.flv -map v:0 -c:v:0 libx264 -b:v:0 1008k -maxrate:v:0 1088k -g:v:0 90 -keyint_min:v:0 90 -r:v:0 30 -x264-params:v:0 "scenecut=0:open_gop=0" -bufsize:v:0 1088k -profile:v:0 high -map a:0? -c:a:0 copy -preset veryfast -map v:0 -c:v:1 libx264 -b:v:1 3308k -maxrate:v:1 3572k -g:v:1 72 -keyint_min:v:1 72 -r:v:1 24 -x264-params:v:1 "scenecut=0:open_gop=0" -bufsize:v:1 3572k -profile:v:1 high -map a:0? -c:a:1 copy -preset fast -map v:0 -c:v:2 copy -map a:0? -c:a:2 copy -preset ultrafast -var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2 " -f hls -hls_time 3 -hls_list_size 10 -hls_flags program_date_time+independent_segments+omit_endlist -segment_format_options mpegts_flags=mpegts_copyts=1 -tune zerolatency -pix_fmt yuv420p -sc_threshold 0 -master_pl_name stream.m3u8 -hls_segment_filename http://127.0.0.1:8123/%v/stream-jdofFGg-%d.ts -max_muxing_queue_size 400 -method PUT -http_persistent 1 http://127.0.0.1:8123/%v/stream.m3u8`
if cmd != expected { if cmd != expected {
t.Errorf("ffmpeg command does not match expected.\nGot %s\n, want: %s", cmd, expected) t.Errorf("ffmpeg command does not match expected.\nGot %s\n, want: %s", cmd, expected)

View File

@@ -8,7 +8,7 @@ import (
"sync" "sync"
"github.com/owncast/owncast/config" "github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/persistence/configrepository"
"github.com/owncast/owncast/utils" "github.com/owncast/owncast/utils"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
@@ -99,9 +99,9 @@ func handleTranscoderMessage(message string) {
func createVariantDirectories() { func createVariantDirectories() {
// Create private hls data dirs // Create private hls data dirs
utils.CleanupDirectory(config.HLSStoragePath) utils.CleanupDirectory(config.HLSStoragePath)
configRepository := configrepository.Get()
if len(data.GetStreamOutputVariants()) != 0 { if len(configRepository.GetStreamOutputVariants()) != 0 {
for index := range data.GetStreamOutputVariants() { for index := range configRepository.GetStreamOutputVariants() {
if err := os.MkdirAll(path.Join(config.HLSStoragePath, strconv.Itoa(index)), 0o750); err != nil { if err := os.MkdirAll(path.Join(config.HLSStoragePath, strconv.Itoa(index)), 0o750); err != nil {
log.Fatalln(err) log.Fatalln(err)
} }

View File

@@ -3,8 +3,8 @@ package webhooks
import ( import (
"time" "time"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/persistence/configrepository"
"github.com/teris-io/shortid" "github.com/teris-io/shortid"
) )
@@ -14,13 +14,15 @@ func SendStreamStatusEvent(eventType models.EventType) {
} }
func sendStreamStatusEvent(eventType models.EventType, id string, timestamp time.Time) { func sendStreamStatusEvent(eventType models.EventType, id string, timestamp time.Time) {
configRepository := configrepository.Get()
SendEventToWebhooks(WebhookEvent{ SendEventToWebhooks(WebhookEvent{
Type: eventType, Type: eventType,
EventData: map[string]interface{}{ EventData: map[string]interface{}{
"id": id, "id": id,
"name": data.GetServerName(), "name": configRepository.GetServerName(),
"summary": data.GetServerSummary(), "summary": configRepository.GetServerSummary(),
"streamTitle": data.GetStreamTitle(), "streamTitle": configRepository.GetStreamTitle(),
"status": getStatus(), "status": getStatus(),
"timestamp": timestamp, "timestamp": timestamp,
}, },

View File

@@ -5,14 +5,16 @@ import (
"time" "time"
"github.com/owncast/owncast/core/chat/events" "github.com/owncast/owncast/core/chat/events"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/persistence/configrepository"
) )
func TestSendStreamStatusEvent(t *testing.T) { func TestSendStreamStatusEvent(t *testing.T) {
data.SetServerName("my server") configRepository := configrepository.Get()
data.SetServerSummary("my server where I stream")
data.SetStreamTitle("my stream") configRepository.SetServerName("my server")
configRepository.SetServerSummary("my server where I stream")
configRepository.SetStreamTitle("my stream")
checkPayload(t, models.StreamStarted, func() { checkPayload(t, models.StreamStarted, func() {
sendStreamStatusEvent(events.StreamStarted, "id", time.Unix(72, 6).UTC()) sendStreamStatusEvent(events.StreamStarted, "id", time.Unix(72, 6).UTC())

View File

@@ -158,7 +158,7 @@ UPDATE users SET display_color = $1 WHERE id = $2
` `
type ChangeDisplayColorParams struct { type ChangeDisplayColorParams struct {
DisplayColor int32 DisplayColor int
ID string ID string
} }
@@ -253,8 +253,8 @@ SELECT iri, inbox, name, username, image, created_at FROM ap_followers WHERE app
` `
type GetFederationFollowersWithOffsetParams struct { type GetFederationFollowersWithOffsetParams struct {
Limit int32 Limit int
Offset int32 Offset int
} }
type GetFederationFollowersWithOffsetRow struct { type GetFederationFollowersWithOffsetRow struct {
@@ -365,8 +365,8 @@ SELECT iri, actor, type, timestamp FROM ap_accepted_activities ORDER BY timestam
` `
type GetInboundActivitiesWithOffsetParams struct { type GetInboundActivitiesWithOffsetParams struct {
Limit int32 Limit int
Offset int32 Offset int
} }
type GetInboundActivitiesWithOffsetRow struct { type GetInboundActivitiesWithOffsetRow struct {
@@ -514,8 +514,8 @@ SELECT value FROM ap_outbox LIMIT $1 OFFSET $2
` `
type GetOutboxWithOffsetParams struct { type GetOutboxWithOffsetParams struct {
Limit int32 Limit int
Offset int32 Offset int
} }
func (q *Queries) GetOutboxWithOffset(ctx context.Context, arg GetOutboxWithOffsetParams) ([][]byte, error) { func (q *Queries) GetOutboxWithOffset(ctx context.Context, arg GetOutboxWithOffsetParams) ([][]byte, error) {

File diff suppressed because one or more lines are too long

108
go.mod
View File

@@ -1,94 +1,80 @@
module github.com/owncast/owncast module github.com/owncast/owncast
go 1.22 go 1.22.0
toolchain go1.23.1
require ( require (
github.com/aws/aws-sdk-go v1.54.13 github.com/CAFxX/httpcompression v0.0.9
github.com/go-fed/activity v1.0.1-0.20210803212804-d866ba75dd0f github.com/SherClockHolmes/webpush-go v1.3.0
github.com/TwiN/go-away v1.6.14
github.com/andybalholm/cascadia v1.3.2
github.com/aws/aws-sdk-go v1.55.5
github.com/go-chi/chi/v5 v5.1.0
github.com/go-fed/activity v1.0.1-0.20220119073622-b14b50eecad0
github.com/go-fed/httpsig v1.1.0 github.com/go-fed/httpsig v1.1.0
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/gorilla/websocket v1.5.3 github.com/gorilla/websocket v1.5.3
github.com/grafov/m3u8 v0.12.0 github.com/grafov/m3u8 v0.12.0
github.com/jellydator/ttlcache/v3 v3.3.0
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
github.com/mattn/go-sqlite3 v1.14.22 github.com/mattn/go-sqlite3 v1.14.24
github.com/microcosm-cc/bluemonday v1.0.27 github.com/microcosm-cc/bluemonday v1.0.27
github.com/mssola/user_agent v0.6.0
github.com/nakabonne/tstorage v0.3.6
github.com/nareix/joy5 v0.0.0-20210317075623-2c912ca30590 github.com/nareix/joy5 v0.0.0-20210317075623-2c912ca30590
github.com/oapi-codegen/runtime v1.1.1
github.com/oschwald/geoip2-golang v1.11.0 github.com/oschwald/geoip2-golang v1.11.0
github.com/pkg/errors v0.9.1
github.com/prometheus/client_golang v1.20.5
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5
github.com/schollz/sqlite3dump v1.3.1 github.com/schollz/sqlite3dump v1.3.1
github.com/shirou/gopsutil/v4 v4.24.10
github.com/sirupsen/logrus v1.9.3 github.com/sirupsen/logrus v1.9.3
github.com/stretchr/testify v1.10.0
github.com/teris-io/shortid v0.0.0-20220617161101-71ec9f2aa569 github.com/teris-io/shortid v0.0.0-20220617161101-71ec9f2aa569
github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark v1.7.8
golang.org/x/mod v0.18.0 github.com/yuin/goldmark-emoji v1.0.4
golang.org/x/time v0.5.0 golang.org/x/crypto v0.29.0
golang.org/x/mod v0.22.0
golang.org/x/net v0.31.0
golang.org/x/time v0.8.0
gopkg.in/evanphx/json-patch.v5 v5.9.0
mvdan.cc/xurls/v2 v2.5.0
) )
require (
github.com/jonboulle/clockwork v0.2.2 // indirect
github.com/lestrrat-go/strftime v1.0.4 // indirect
github.com/mvdan/xurls v1.1.0 // indirect
github.com/pkg/errors v0.9.1
github.com/tklauser/go-sysconf v0.3.12 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
golang.org/x/crypto v0.24.0
golang.org/x/net v0.26.0
golang.org/x/sys v0.21.0 // indirect
)
require github.com/prometheus/client_golang v1.19.1
require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/klauspost/compress v1.16.7 // indirect
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
github.com/prometheus/client_model v0.5.0 // indirect
github.com/prometheus/common v0.48.0 // indirect
github.com/prometheus/procfs v0.12.0 // indirect
golang.org/x/text v0.16.0 // indirect
google.golang.org/protobuf v1.33.0 // indirect
)
require (
github.com/nakabonne/tstorage v0.3.6
github.com/shirou/gopsutil/v4 v4.24.6
)
require github.com/SherClockHolmes/webpush-go v1.3.0
require ( require (
github.com/andybalholm/brotli v1.0.5 // indirect github.com/andybalholm/brotli v1.0.5 // indirect
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
github.com/aymerick/douceur v0.2.0 // indirect github.com/aymerick/douceur v0.2.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect
github.com/ebitengine/purego v0.8.1 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-test/deep v1.0.4 // indirect github.com/go-test/deep v1.0.4 // indirect
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
github.com/google/uuid v1.5.0 // indirect github.com/google/uuid v1.5.0 // indirect
github.com/gorilla/css v1.0.1 // indirect github.com/gorilla/css v1.0.1 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/jonboulle/clockwork v0.2.2 // indirect
github.com/klauspost/compress v1.17.9 // indirect
github.com/lestrrat-go/strftime v1.0.4 // indirect
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/oschwald/maxminddb-golang v1.13.0 // indirect github.com/oschwald/maxminddb-golang v1.13.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
golang.org/x/sync v0.7.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.55.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/tklauser/go-sysconf v0.3.12 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
golang.org/x/sync v0.9.0 // indirect
golang.org/x/sys v0.27.0 // indirect
golang.org/x/text v0.20.0 // indirect
google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
) )
require (
github.com/CAFxX/httpcompression v0.0.9
github.com/TwiN/go-away v1.6.13
github.com/andybalholm/cascadia v1.3.2
github.com/go-chi/chi/v5 v5.1.0
github.com/jellydator/ttlcache/v3 v3.2.0
github.com/mssola/user_agent v0.6.0
github.com/oapi-codegen/runtime v1.1.1
github.com/shirou/gopsutil/v3 v3.24.5
github.com/stretchr/testify v1.9.0
github.com/yuin/goldmark-emoji v1.0.3
gopkg.in/evanphx/json-patch.v5 v5.9.0
mvdan.cc/xurls v1.1.0
mvdan.cc/xurls/v2 v2.5.0
)
replace github.com/go-fed/activity => github.com/owncast/activity v1.0.1-0.20211229051252-7821289d4026 replace github.com/go-fed/activity => github.com/owncast/activity v1.0.1-0.20211229051252-7821289d4026

144
go.sum
View File

@@ -5,29 +5,29 @@ github.com/SherClockHolmes/webpush-go v1.3.0 h1:CAu3FvEE9QS4drc3iKNgpBWFfGqNthKl
github.com/SherClockHolmes/webpush-go v1.3.0/go.mod h1:AxRHmJuYwKGG1PVgYzToik1lphQvDnqFYDqimHvwhIw= github.com/SherClockHolmes/webpush-go v1.3.0/go.mod h1:AxRHmJuYwKGG1PVgYzToik1lphQvDnqFYDqimHvwhIw=
github.com/TwiN/go-away v1.6.13 h1:aB6l/FPXmA5ds+V7I9zdhxzpsLLUvVtEuS++iU/ZmgE= github.com/TwiN/go-away v1.6.13 h1:aB6l/FPXmA5ds+V7I9zdhxzpsLLUvVtEuS++iU/ZmgE=
github.com/TwiN/go-away v1.6.13/go.mod h1:MpvIC9Li3minq+CGgbgUDvQ9tDaeW35k5IXZrF9MVas= github.com/TwiN/go-away v1.6.13/go.mod h1:MpvIC9Li3minq+CGgbgUDvQ9tDaeW35k5IXZrF9MVas=
github.com/TwiN/go-away v1.6.14 h1:gjFP+6/A36gmj0NpYX0Sz9hrdU0KtHwtNWYnsJgV4fo=
github.com/TwiN/go-away v1.6.14/go.mod h1:d+Gv3XuqjIeFqXYuAIzlyNoDzr1vNsP5B/hRY3u/VLs=
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ= github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ=
github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk= github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk=
github.com/aws/aws-sdk-go v1.53.5 h1:1OcVWMjGlwt7EU5OWmmEEXqaYfmX581EK317QJZXItM= github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
github.com/aws/aws-sdk-go v1.53.5/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
github.com/aws/aws-sdk-go v1.54.13 h1:zpCuiG+/mFdDY/klKJvmSioAZWk45F4rLGq0JWVAAzk=
github.com/aws/aws-sdk-go v1.54.13/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/dave/jennifer v1.3.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/dave/jennifer v1.3.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-chi/chi/v5 v5.0.12 h1:9euLV5sTrTNTRUU9POmDUvfxyj6LAABLUcEWO+JJb4s= github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE=
github.com/go-chi/chi/v5 v5.0.12/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw=
github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
github.com/go-fed/httpsig v0.1.1-0.20190914113940-c2de3672e5b5/go.mod h1:T56HUNYZUQ1AGUzhAYPugZfp36sKApVnGBgKlIY+aIE= github.com/go-fed/httpsig v0.1.1-0.20190914113940-c2de3672e5b5/go.mod h1:T56HUNYZUQ1AGUzhAYPugZfp36sKApVnGBgKlIY+aIE=
@@ -44,23 +44,18 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb
github.com/google/brotli/go/cbrotli v0.0.0-20230829110029-ed738e842d2f h1:jopqB+UTSdJGEJT8tEqYyE29zN91fi2827oLET8tl7k= github.com/google/brotli/go/cbrotli v0.0.0-20230829110029-ed738e842d2f h1:jopqB+UTSdJGEJT8tEqYyE29zN91fi2827oLET8tl7k=
github.com/google/brotli/go/cbrotli v0.0.0-20230829110029-ed738e842d2f/go.mod h1:nOPhAkwVliJdNTkj3gXpljmWhjc4wCaVqbMJcPKWP4s= github.com/google/brotli/go/cbrotli v0.0.0-20230829110029-ed738e842d2f/go.mod h1:nOPhAkwVliJdNTkj3gXpljmWhjc4wCaVqbMJcPKWP4s=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=
github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c=
github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8=
github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0=
github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grafov/m3u8 v0.12.0 h1:T6iTwTsSEtMcwkayef+FJO8kj+Sglr4Lh81Zj8Ked/4= github.com/grafov/m3u8 v0.12.0 h1:T6iTwTsSEtMcwkayef+FJO8kj+Sglr4Lh81Zj8Ked/4=
github.com/grafov/m3u8 v0.12.0/go.mod h1:nqzOkfBiZJENr52zTVd/Dcl03yzphIMbJqkXGu+u080= github.com/grafov/m3u8 v0.12.0/go.mod h1:nqzOkfBiZJENr52zTVd/Dcl03yzphIMbJqkXGu+u080=
github.com/jellydator/ttlcache/v3 v3.2.0 h1:6lqVJ8X3ZaUwvzENqPAobDsXNExfUJd61u++uW8a3LE= github.com/jellydator/ttlcache/v3 v3.3.0 h1:BdoC9cE81qXfrxeb9eoJi9dWrdhSuwXMAnHTbnBm4Wc=
github.com/jellydator/ttlcache/v3 v3.2.0/go.mod h1:hi7MGFdMAwZna5n2tuvh63DvFLzVKySzCVW6+0gA2n4= github.com/jellydator/ttlcache/v3 v3.3.0/go.mod h1:bj2/e0l4jRnQdrnSTaGTsh4GSXvMjQcy41i7th0GVGw=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
@@ -68,13 +63,16 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfC
github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ=
github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE=
github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8= github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8=
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is=
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4= github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible h1:Y6sqxHMyB1D2YSzWkLibYKgg+SwmyFU9dF2hn6MdTj4=
@@ -84,28 +82,22 @@ github.com/lestrrat-go/strftime v1.0.4/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR7
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58=
github.com/microcosm-cc/bluemonday v1.0.26/go.mod h1:JyzOCs9gkyQyjs+6h10UEVSe02CGwkhd72Xdqh78TWs=
github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk=
github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA=
github.com/mssola/user_agent v0.6.0 h1:uwPR4rtWlCHRFyyP9u2KOV0u8iQXmS7Z7feTrstQwk4= github.com/mssola/user_agent v0.6.0 h1:uwPR4rtWlCHRFyyP9u2KOV0u8iQXmS7Z7feTrstQwk4=
github.com/mssola/user_agent v0.6.0/go.mod h1:TTPno8LPY3wAIEKRpAtkdMT0f8SE24pLRGPahjCH4uw= github.com/mssola/user_agent v0.6.0/go.mod h1:TTPno8LPY3wAIEKRpAtkdMT0f8SE24pLRGPahjCH4uw=
github.com/mvdan/xurls v1.1.0 h1:OpuDelGQ1R1ueQ6sSryzi6P+1RtBpfQHM8fJwlE45ww= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/mvdan/xurls v1.1.0/go.mod h1:tQlNn3BED8bE/15hnSL2HLkDeLWpNPAwtw7wkEq44oU= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/nakabonne/tstorage v0.3.6 h1:usp7pTohax8mynnFiUSUQ2QVBCKLCkYx3gmb3+rJo54= github.com/nakabonne/tstorage v0.3.6 h1:usp7pTohax8mynnFiUSUQ2QVBCKLCkYx3gmb3+rJo54=
github.com/nakabonne/tstorage v0.3.6/go.mod h1:1xUrK3s1MXSlU6dn96xHerHx/MdO4BGmsAHEUbsaOxU= github.com/nakabonne/tstorage v0.3.6/go.mod h1:1xUrK3s1MXSlU6dn96xHerHx/MdO4BGmsAHEUbsaOxU=
github.com/nareix/joy5 v0.0.0-20210317075623-2c912ca30590 h1:PnxRU8L8Y2q82vFC2QdNw23Dm2u6WrjecIdpXjiYbXM= github.com/nareix/joy5 v0.0.0-20210317075623-2c912ca30590 h1:PnxRU8L8Y2q82vFC2QdNw23Dm2u6WrjecIdpXjiYbXM=
github.com/nareix/joy5 v0.0.0-20210317075623-2c912ca30590/go.mod h1:XmAOs6UJXpNXRwKk+KY/nv5kL6xXYXyellk+A1pTlko= github.com/nareix/joy5 v0.0.0-20210317075623-2c912ca30590/go.mod h1:XmAOs6UJXpNXRwKk+KY/nv5kL6xXYXyellk+A1pTlko=
github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro= github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro=
github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg=
github.com/oschwald/geoip2-golang v1.9.0 h1:uvD3O6fXAXs+usU+UGExshpdP13GAqp4GBrzN7IgKZc=
github.com/oschwald/geoip2-golang v1.9.0/go.mod h1:BHK6TvDyATVQhKNbQBdrj9eAvuwOMi2zSFXizL3K81Y=
github.com/oschwald/geoip2-golang v1.11.0 h1:hNENhCn1Uyzhf9PTmquXENiWS6AlxAEnBII6r8krA3w= github.com/oschwald/geoip2-golang v1.11.0 h1:hNENhCn1Uyzhf9PTmquXENiWS6AlxAEnBII6r8krA3w=
github.com/oschwald/geoip2-golang v1.11.0/go.mod h1:P9zG+54KPEFOliZ29i7SeYZ/GM6tfEL+rgSn03hYuUo= github.com/oschwald/geoip2-golang v1.11.0/go.mod h1:P9zG+54KPEFOliZ29i7SeYZ/GM6tfEL+rgSn03hYuUo=
github.com/oschwald/maxminddb-golang v1.11.0 h1:aSXMqYR/EPNjGE8epgqwDay+P30hCBZIveY0WZbAWh0=
github.com/oschwald/maxminddb-golang v1.11.0/go.mod h1:YmVI+H0zh3ySFR3w+oz8PCfglAFj3PuCmui13+P9zDg=
github.com/oschwald/maxminddb-golang v1.13.0 h1:R8xBorY71s84yO06NgTmQvqvTvlS/bnYZrrWX1MElnU= github.com/oschwald/maxminddb-golang v1.13.0 h1:R8xBorY71s84yO06NgTmQvqvTvlS/bnYZrrWX1MElnU=
github.com/oschwald/maxminddb-golang v1.13.0/go.mod h1:BU0z8BfFVhi1LQaonTwwGQlsHUEu9pWNdMfmq4ztm0o= github.com/oschwald/maxminddb-golang v1.13.0/go.mod h1:BU0z8BfFVhi1LQaonTwwGQlsHUEu9pWNdMfmq4ztm0o=
github.com/owncast/activity v1.0.1-0.20211229051252-7821289d4026 h1:E1nxiX44BcMQTSSs8MHLm2rXnqXNedYZkFI31gXMsJc= github.com/owncast/activity v1.0.1-0.20211229051252-7821289d4026 h1:E1nxiX44BcMQTSSs8MHLm2rXnqXNedYZkFI31gXMsJc=
@@ -119,29 +111,22 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw=
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo= github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo=
github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM= github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM=
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
github.com/schollz/sqlite3dump v1.3.1 h1:QXizJ7XEJ7hggjqjZ3YRtF3+javm8zKtzNByYtEkPRA= github.com/schollz/sqlite3dump v1.3.1 h1:QXizJ7XEJ7hggjqjZ3YRtF3+javm8zKtzNByYtEkPRA=
github.com/schollz/sqlite3dump v1.3.1/go.mod h1:mzSTjZpJH4zAb1FN3iNlhWPbbdyeBpOaTW0hukyMHyI= github.com/schollz/sqlite3dump v1.3.1/go.mod h1:mzSTjZpJH4zAb1FN3iNlhWPbbdyeBpOaTW0hukyMHyI=
github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= github.com/shirou/gopsutil/v4 v4.24.10 h1:7VOzPtfw/5YDU+jLEoBwXwxJbQetULywoSV4RYY7HkM=
github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= github.com/shirou/gopsutil/v4 v4.24.10/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8=
github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI=
github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk=
github.com/shirou/gopsutil/v4 v4.24.6/go.mod h1:aoebb2vxetJ/yIDZISmduFvVNPHqXQ9SEJwRXxkf0RA=
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spf13/cobra v0.0.4-0.20190109003409-7547e83b2d85/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.4-0.20190109003409-7547e83b2d85/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
@@ -150,7 +135,6 @@ github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKk
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
@@ -159,6 +143,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/teris-io/shortid v0.0.0-20220617161101-71ec9f2aa569 h1:xzABM9let0HLLqFypcxvLmlvEciCHL7+Lv+4vwZqecI= github.com/teris-io/shortid v0.0.0-20220617161101-71ec9f2aa569 h1:xzABM9let0HLLqFypcxvLmlvEciCHL7+Lv+4vwZqecI=
github.com/teris-io/shortid v0.0.0-20220617161101-71ec9f2aa569/go.mod h1:2Ly+NIftZN4de9zRmENdYbvPQeaVIYKWpLFStLFEBgI= github.com/teris-io/shortid v0.0.0-20220617161101-71ec9f2aa569/go.mod h1:2Ly+NIftZN4de9zRmENdYbvPQeaVIYKWpLFStLFEBgI=
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
@@ -168,35 +154,27 @@ github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9f
github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/valyala/gozstd v1.20.1 h1:xPnnnvjmaDDitMFfDxmQ4vpx0+3CdTg2o3lALvXTU/g= github.com/valyala/gozstd v1.20.1 h1:xPnnnvjmaDDitMFfDxmQ4vpx0+3CdTg2o3lALvXTU/g=
github.com/valyala/gozstd v1.20.1/go.mod h1:y5Ew47GLlP37EkTB+B4s7r6A5rdaeB7ftbl9zoYiIPQ= github.com/valyala/gozstd v1.20.1/go.mod h1:y5Ew47GLlP37EkTB+B4s7r6A5rdaeB7ftbl9zoYiIPQ=
github.com/yuin/goldmark v1.3.7/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yuin/goldmark v1.7.1 h1:3bajkSilaCbjdKVsKdZjZCLBNPL9pYzrCakKaf4U49U=
github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E=
github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic=
github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E=
github.com/yuin/goldmark-emoji v1.0.2 h1:c/RgTShNgHTtc6xdz2KKI74jJr6rWi7FPgnP9GAsO5s= github.com/yuin/goldmark-emoji v1.0.4 h1:vCwMkPZSNefSUnOW2ZKRUjBSD5Ok3W78IXhGxxAEF90=
github.com/yuin/goldmark-emoji v1.0.2/go.mod h1:RhP/RWpexdp+KHs7ghKnifRoIs/Bq4nDS7tRbCkOwKY= github.com/yuin/goldmark-emoji v1.0.4/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U=
github.com/yuin/goldmark-emoji v1.0.3 h1:aLRkLHOuBR2czCY4R8olwMjID+tENfhyFDMCRhbIQY4=
github.com/yuin/goldmark-emoji v1.0.3/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
golang.org/x/crypto v0.0.0-20180527072434-ab813273cd59/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180527072434-ab813273cd59/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI=
golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0=
golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -205,17 +183,13 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180525142821-c11f84a56e43/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180525142821-c11f84a56e43/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -230,37 +204,34 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
@@ -272,6 +243,5 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
mvdan.cc/xurls v1.1.0 h1:kj0j2lonKseISJCiq1Tfk+iTv65dDGCl0rTbanXJGGc= mvdan.cc/xurls/v2 v2.5.0 h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8=
mvdan.cc/xurls v1.1.0/go.mod h1:TNWuhvo+IqbUCmtUIb/3LJSQdrzel8loVpgFm0HikbI=
mvdan.cc/xurls/v2 v2.5.0/go.mod h1:yQgaGQ1rFtJUzkmKiHYSSfuQxqfYmd//X6PxvholpeE= mvdan.cc/xurls/v2 v2.5.0/go.mod h1:yQgaGQ1rFtJUzkmKiHYSSfuQxqfYmd//X6PxvholpeE=

15
main.go
View File

@@ -6,6 +6,7 @@ import (
"strconv" "strconv"
"github.com/owncast/owncast/logging" "github.com/owncast/owncast/logging"
"github.com/owncast/owncast/persistence/configrepository"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"github.com/owncast/owncast/config" "github.com/owncast/owncast/config"
@@ -111,8 +112,10 @@ func main() {
} }
func handleCommandLineFlags() { func handleCommandLineFlags() {
configRepository := configrepository.Get()
if *newAdminPassword != "" { if *newAdminPassword != "" {
if err := data.SetAdminPassword(*newAdminPassword); err != nil { if err := configRepository.SetAdminPassword(*newAdminPassword); err != nil {
log.Errorln("Error setting your admin password.", err) log.Errorln("Error setting your admin password.", err)
log.Exit(1) log.Exit(1)
} else { } else {
@@ -134,25 +137,25 @@ func handleCommandLineFlags() {
} }
log.Println("Saving new web server port number to", portNumber) log.Println("Saving new web server port number to", portNumber)
if err := data.SetHTTPPortNumber(float64(portNumber)); err != nil { if err := configRepository.SetHTTPPortNumber(float64(portNumber)); err != nil {
log.Errorln(err) log.Errorln(err)
} }
} }
config.WebServerPort = data.GetHTTPPortNumber() config.WebServerPort = configRepository.GetHTTPPortNumber()
// Set the web server ip // Set the web server ip
if *webServerIPOverride != "" { if *webServerIPOverride != "" {
log.Println("Saving new web server listen IP address to", *webServerIPOverride) log.Println("Saving new web server listen IP address to", *webServerIPOverride)
if err := data.SetHTTPListenAddress(*webServerIPOverride); err != nil { if err := configRepository.SetHTTPListenAddress(*webServerIPOverride); err != nil {
log.Errorln(err) log.Errorln(err)
} }
} }
config.WebServerIP = data.GetHTTPListenAddress() config.WebServerIP = configRepository.GetHTTPListenAddress()
// Set the rtmp server port // Set the rtmp server port
if *rtmpPortOverride > 0 { if *rtmpPortOverride > 0 {
log.Println("Saving new RTMP server port number to", *rtmpPortOverride) log.Println("Saving new RTMP server port number to", *rtmpPortOverride)
if err := data.SetRTMPPortNumber(float64(*rtmpPortOverride)); err != nil { if err := configRepository.SetRTMPPortNumber(float64(*rtmpPortOverride)); err != nil {
log.Errorln(err) log.Errorln(err)
} }
} }

View File

@@ -3,9 +3,9 @@ package metrics
import ( import (
"time" "time"
"github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v4/cpu"
"github.com/shirou/gopsutil/v3/disk" "github.com/shirou/gopsutil/v4/disk"
"github.com/shirou/gopsutil/v3/mem" "github.com/shirou/gopsutil/v4/mem"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )

View File

@@ -5,8 +5,8 @@ import (
"sort" "sort"
"github.com/owncast/owncast/core" "github.com/owncast/owncast/core"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/persistence/configrepository"
"github.com/owncast/owncast/utils" "github.com/owncast/owncast/utils"
) )
@@ -68,8 +68,8 @@ func networkSpeedHealthOverviewMessage() string {
isVideoPassthrough bool isVideoPassthrough bool
bitrate int bitrate int
} }
configRepository := configrepository.Get()
outputVariants := data.GetStreamOutputVariants() outputVariants := configRepository.GetStreamOutputVariants()
streamSortVariants := make([]singleVariant, len(outputVariants)) streamSortVariants := make([]singleVariant, len(outputVariants))
for i, variant := range outputVariants { for i, variant := range outputVariants {
@@ -155,7 +155,8 @@ func wastefulBitrateOverviewMessage() string {
return "" return ""
} }
outputVariants := data.GetStreamOutputVariants() configRepository := configrepository.Get()
outputVariants := configRepository.GetStreamOutputVariants()
type singleVariant struct { type singleVariant struct {
isVideoPassthrough bool isVideoPassthrough bool
@@ -229,7 +230,8 @@ func errorCountHealthOverviewMessage() string {
healthyPercentage := utils.IntPercentage(clientsWithErrors, totalNumberOfClients) healthyPercentage := utils.IntPercentage(clientsWithErrors, totalNumberOfClients)
isUsingPassthrough := false isUsingPassthrough := false
outputVariants := data.GetStreamOutputVariants() configRepository := configrepository.Get()
outputVariants := configRepository.GetStreamOutputVariants()
for _, variant := range outputVariants { for _, variant := range outputVariants {
if variant.IsVideoPassthrough { if variant.IsVideoPassthrough {
isUsingPassthrough = true isUsingPassthrough = true

View File

@@ -5,8 +5,8 @@ import (
"time" "time"
"github.com/owncast/owncast/config" "github.com/owncast/owncast/config"
"github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/persistence/configrepository"
) )
// How often we poll for updates. // How often we poll for updates.
@@ -56,8 +56,9 @@ var _getStatus func() models.Status
// Start will begin the metrics collection and alerting. // Start will begin the metrics collection and alerting.
func Start(getStatus func() models.Status) { func Start(getStatus func() models.Status) {
configRepository := configrepository.Get()
_getStatus = getStatus _getStatus = getStatus
host := data.GetServerURL() host := configRepository.GetServerURL()
if host == "" { if host == "" {
host = "unknown" host = "unknown"
} }

View File

@@ -31,6 +31,7 @@ func startViewerCollectionMetrics() {
func collectViewerCount() { func collectViewerCount() {
// Don't collect metrics for viewers if there's no stream active. // Don't collect metrics for viewers if there's no stream active.
if !core.GetStatus().Online { if !core.GetStatus().Online {
activeViewerCount.Set(0)
return return
} }

View File

@@ -1,4 +1,4 @@
package data package models
import ( import (
"bytes" "bytes"
@@ -12,48 +12,48 @@ type ConfigEntry struct {
Key string Key string
} }
func (c *ConfigEntry) getStringSlice() ([]string, error) { func (c *ConfigEntry) GetStringSlice() ([]string, error) {
decoder := c.getDecoder() decoder := c.GetDecoder()
var result []string var result []string
err := decoder.Decode(&result) err := decoder.Decode(&result)
return result, err return result, err
} }
func (c *ConfigEntry) getStringMap() (map[string]string, error) { func (c *ConfigEntry) GetStringMap() (map[string]string, error) {
decoder := c.getDecoder() decoder := c.GetDecoder()
var result map[string]string var result map[string]string
err := decoder.Decode(&result) err := decoder.Decode(&result)
return result, err return result, err
} }
func (c *ConfigEntry) getString() (string, error) { func (c *ConfigEntry) GetString() (string, error) {
decoder := c.getDecoder() decoder := c.GetDecoder()
var result string var result string
err := decoder.Decode(&result) err := decoder.Decode(&result)
return result, err return result, err
} }
func (c *ConfigEntry) getNumber() (float64, error) { func (c *ConfigEntry) GetNumber() (float64, error) {
decoder := c.getDecoder() decoder := c.GetDecoder()
var result float64 var result float64
err := decoder.Decode(&result) err := decoder.Decode(&result)
return result, err return result, err
} }
func (c *ConfigEntry) getBool() (bool, error) { func (c *ConfigEntry) GetBool() (bool, error) {
decoder := c.getDecoder() decoder := c.GetDecoder()
var result bool var result bool
err := decoder.Decode(&result) err := decoder.Decode(&result)
return result, err return result, err
} }
func (c *ConfigEntry) getObject(result interface{}) error { func (c *ConfigEntry) GetObject(result interface{}) error {
decoder := c.getDecoder() decoder := c.GetDecoder()
err := decoder.Decode(result) err := decoder.Decode(result)
return err return err
} }
func (c *ConfigEntry) getDecoder() *gob.Decoder { func (c *ConfigEntry) GetDecoder() *gob.Decoder {
valueBytes := c.Value.([]byte) valueBytes := c.Value.([]byte)
decoder := gob.NewDecoder(bytes.NewBuffer(valueBytes)) decoder := gob.NewDecoder(bytes.NewBuffer(valueBytes))
return decoder return decoder

View File

@@ -105,7 +105,7 @@ func GetAllSocialHandles() map[string]SocialHandle {
Icon: "/img/platformlogos/twitch.svg", Icon: "/img/platformlogos/twitch.svg",
}, },
"twitter": { "twitter": {
Platform: "Twitter", Platform: "X",
Icon: "/img/platformlogos/twitter.svg", Icon: "/img/platformlogos/twitter.svg",
}, },
"youtube": { "youtube": {

View File

@@ -8,6 +8,7 @@ import (
"github.com/owncast/owncast/core/data" "github.com/owncast/owncast/core/data"
"github.com/owncast/owncast/db" "github.com/owncast/owncast/db"
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/persistence/configrepository"
"github.com/owncast/owncast/persistence/tables" "github.com/owncast/owncast/persistence/tables"
"github.com/owncast/owncast/notifications/browser" "github.com/owncast/owncast/notifications/browser"
@@ -18,9 +19,10 @@ import (
// Notifier is an instance of the live stream notifier. // Notifier is an instance of the live stream notifier.
type Notifier struct { type Notifier struct {
datastore *data.Datastore datastore *data.Datastore
browser *browser.Browser browser *browser.Browser
discord *discord.Discord discord *discord.Discord
configRepository configrepository.ConfigRepository
} }
// Setup will perform any pre-use setup for the notifier. // Setup will perform any pre-use setup for the notifier.
@@ -30,8 +32,10 @@ func Setup(datastore *data.Datastore) {
} }
func initializeBrowserPushIfNeeded() { func initializeBrowserPushIfNeeded() {
pubKey, _ := data.GetBrowserPushPublicKey() configRepository := configrepository.Get()
privKey, _ := data.GetBrowserPushPrivateKey()
pubKey, _ := configRepository.GetBrowserPushPublicKey()
privKey, _ := configRepository.GetBrowserPushPrivateKey()
// We need browser push keys so people can register for pushes. // We need browser push keys so people can register for pushes.
if pubKey == "" || privKey == "" { if pubKey == "" || privKey == "" {
@@ -40,26 +44,27 @@ func initializeBrowserPushIfNeeded() {
log.Errorln("unable to initialize browser push notification keys", err) log.Errorln("unable to initialize browser push notification keys", err)
} }
if err := data.SetBrowserPushPrivateKey(browserPrivateKey); err != nil { if err := configRepository.SetBrowserPushPrivateKey(browserPrivateKey); err != nil {
log.Errorln("unable to set browser push private key", err) log.Errorln("unable to set browser push private key", err)
} }
if err := data.SetBrowserPushPublicKey(browserPublicKey); err != nil { if err := configRepository.SetBrowserPushPublicKey(browserPublicKey); err != nil {
log.Errorln("unable to set browser push public key", err) log.Errorln("unable to set browser push public key", err)
} }
} }
// Enable browser push notifications by default. // Enable browser push notifications by default.
if !data.GetHasPerformedInitialNotificationsConfig() { if !configRepository.GetHasPerformedInitialNotificationsConfig() {
_ = data.SetBrowserPushConfig(models.BrowserNotificationConfiguration{Enabled: true, GoLiveMessage: config.GetDefaults().FederationGoLiveMessage}) _ = configRepository.SetBrowserPushConfig(models.BrowserNotificationConfiguration{Enabled: true, GoLiveMessage: config.GetDefaults().FederationGoLiveMessage})
_ = data.SetHasPerformedInitialNotificationsConfig(true) _ = configRepository.SetHasPerformedInitialNotificationsConfig(true)
} }
} }
// New creates a new instance of the Notifier. // New creates a new instance of the Notifier.
func New(datastore *data.Datastore) (*Notifier, error) { func New(datastore *data.Datastore) (*Notifier, error) {
notifier := Notifier{ notifier := Notifier{
datastore: datastore, datastore: datastore,
configRepository: configrepository.Get(),
} }
if err := notifier.setupBrowserPush(); err != nil { if err := notifier.setupBrowserPush(); err != nil {
@@ -73,13 +78,13 @@ func New(datastore *data.Datastore) (*Notifier, error) {
} }
func (n *Notifier) setupBrowserPush() error { func (n *Notifier) setupBrowserPush() error {
if data.GetBrowserPushConfig().Enabled { if n.configRepository.GetBrowserPushConfig().Enabled {
publicKey, err := data.GetBrowserPushPublicKey() publicKey, err := n.configRepository.GetBrowserPushPublicKey()
if err != nil || publicKey == "" { if err != nil || publicKey == "" {
return errors.Wrap(err, "browser notifier disabled, failed to get browser push public key") return errors.Wrap(err, "browser notifier disabled, failed to get browser push public key")
} }
privateKey, err := data.GetBrowserPushPrivateKey() privateKey, err := n.configRepository.GetBrowserPushPrivateKey()
if err != nil || privateKey == "" { if err != nil || privateKey == "" {
return errors.Wrap(err, "browser notifier disabled, failed to get browser push private key") return errors.Wrap(err, "browser notifier disabled, failed to get browser push private key")
} }
@@ -99,7 +104,7 @@ func (n *Notifier) notifyBrowserPush() {
log.Errorln("error getting browser push notification destinations", err) log.Errorln("error getting browser push notification destinations", err)
} }
for _, destination := range destinations { for _, destination := range destinations {
unsubscribed, err := n.browser.Send(destination, data.GetServerName(), data.GetBrowserPushConfig().GoLiveMessage) unsubscribed, err := n.browser.Send(destination, n.configRepository.GetServerName(), n.configRepository.GetBrowserPushConfig().GoLiveMessage)
if unsubscribed { if unsubscribed {
// If the error is "unsubscribed", then remove the destination from the database. // If the error is "unsubscribed", then remove the destination from the database.
if err := RemoveNotificationForChannel(BrowserPushNotification, destination); err != nil { if err := RemoveNotificationForChannel(BrowserPushNotification, destination); err != nil {
@@ -112,14 +117,14 @@ func (n *Notifier) notifyBrowserPush() {
} }
func (n *Notifier) setupDiscord() error { func (n *Notifier) setupDiscord() error {
discordConfig := data.GetDiscordConfig() discordConfig := n.configRepository.GetDiscordConfig()
if discordConfig.Enabled && discordConfig.Webhook != "" { if discordConfig.Enabled && discordConfig.Webhook != "" {
var image string var image string
if serverURL := data.GetServerURL(); serverURL != "" { if serverURL := n.configRepository.GetServerURL(); serverURL != "" {
image = serverURL + "/logo" image = serverURL + "/logo"
} }
discordNotifier, err := discord.New( discordNotifier, err := discord.New(
data.GetServerName(), n.configRepository.GetServerName(),
image, image,
discordConfig.Webhook, discordConfig.Webhook,
) )
@@ -132,12 +137,12 @@ func (n *Notifier) setupDiscord() error {
} }
func (n *Notifier) notifyDiscord() { func (n *Notifier) notifyDiscord() {
goLiveMessage := data.GetDiscordConfig().GoLiveMessage goLiveMessage := n.configRepository.GetDiscordConfig().GoLiveMessage
streamTitle := data.GetStreamTitle() streamTitle := n.configRepository.GetStreamTitle()
if streamTitle != "" { if streamTitle != "" {
goLiveMessage += "\n" + streamTitle goLiveMessage += "\n" + streamTitle
} }
message := fmt.Sprintf("%s\n\n%s", goLiveMessage, data.GetServerURL()) message := fmt.Sprintf("%s\n\n%s", goLiveMessage, n.configRepository.GetServerURL())
if err := n.discord.Send(message); err != nil { if err := n.discord.Send(message); err != nil {
log.Errorln("error sending discord message", err) log.Errorln("error sending discord message", err)
@@ -158,6 +163,7 @@ func (n *Notifier) Notify() {
// RemoveNotificationForChannel removes a notification destination. // RemoveNotificationForChannel removes a notification destination.
func RemoveNotificationForChannel(channel, destination string) error { func RemoveNotificationForChannel(channel, destination string) error {
log.Debugln("Removing notification for channel", channel) log.Debugln("Removing notification for channel", channel)
return data.GetDatastore().GetQueries().RemoveNotificationDestinationForChannel(context.Background(), db.RemoveNotificationDestinationForChannelParams{ return data.GetDatastore().GetQueries().RemoveNotificationDestinationForChannel(context.Background(), db.RemoveNotificationDestinationForChannelParams{
Channel: channel, Channel: channel,
Destination: destination, Destination: destination,

View File

@@ -2948,7 +2948,7 @@ paths:
content: content:
application/json: application/json:
schema: schema:
$ref: '#/components/schemas/SystemMessage' $ref: '#/components/schemas/MessageEvent'
responses: responses:
'200': '200':
description: Message sent successfully description: Message sent successfully
@@ -3045,7 +3045,7 @@ paths:
content: content:
application/json: application/json:
schema: schema:
$ref: '#/components/schemas/UserMessage' $ref: '#/components/schemas/MessageEvent'
responses: responses:
'200': '200':
description: Message sent successfully description: Message sent successfully
@@ -3079,7 +3079,7 @@ paths:
content: content:
application/json: application/json:
schema: schema:
$ref: '#/components/schemas/SystemActionEvent' $ref: '#/components/schemas/MessageEvent'
responses: responses:
'200': '200':
description: Action sent successfully description: Action sent successfully
@@ -3221,7 +3221,7 @@ paths:
get: get:
summary: Get a user's details summary: Get a user's details
operationId: GetUserDetails operationId: GetUserDetails
tags: ['External', 'Chat'] tags: ['Chat']
parameters: parameters:
- in: path - in: path
name: userId name: userId
@@ -3387,14 +3387,12 @@ components:
Error: Error:
type: object type: object
description: Structure for an error response description: Structure for an error response
tags: ['Objects']
properties: properties:
error: error:
type: string type: string
BaseAPIResponse: BaseAPIResponse:
type: object type: object
description: Simple API response description: Simple API response
tags: ['Objects']
properties: properties:
message: message:
type: string type: string
@@ -3403,7 +3401,6 @@ components:
Status: Status:
type: object type: object
description: Response for status description: Response for status
tags: ['Objects']
properties: properties:
serverTime: serverTime:
type: string type: string
@@ -3417,6 +3414,8 @@ components:
type: integer type: integer
online: online:
type: boolean type: boolean
streamTitle:
type: string
Emojis: Emojis:
type: array type: array
items: items:
@@ -3424,7 +3423,6 @@ components:
Emoji: Emoji:
type: object type: object
description: Name and url for an emoji description: Name and url for an emoji
tags: ['Objects']
properties: properties:
name: name:
type: string type: string
@@ -3434,7 +3432,6 @@ components:
description: URL for the emoji image description: URL for the emoji image
AnonymousUser: AnonymousUser:
type: object type: object
tags: ['Objects']
properties: properties:
id: id:
type: string type: string
@@ -3444,7 +3441,6 @@ components:
type: string type: string
User: User:
type: object type: object
tags: ['Objects']
properties: properties:
createdAt: createdAt:
type: string type: string
@@ -3476,7 +3472,6 @@ components:
$ref: '#/components/schemas/User' $ref: '#/components/schemas/User'
Follower: Follower:
type: object type: object
tags: ['Objects']
properties: properties:
link: link:
type: string type: string
@@ -3498,12 +3493,10 @@ components:
description: When this follower was rejected or disabled. description: When this follower was rejected or disabled.
Followers: Followers:
type: array type: array
tags: ['Objects']
items: items:
$ref: '#/components/schemas/Follower' $ref: '#/components/schemas/Follower'
PaginatedFollowers: PaginatedFollowers:
type: object type: object
tags: ['Objects']
properties: properties:
total: total:
type: integer type: integer
@@ -3511,7 +3504,6 @@ components:
$ref: '#/components/schemas/Followers' $ref: '#/components/schemas/Followers'
Event: Event:
type: object type: object
tags: ['Objects']
properties: properties:
timestamp: timestamp:
type: string type: string
@@ -3521,7 +3513,6 @@ components:
type: string type: string
UserEvent: UserEvent:
type: object type: object
tags: ['Objects']
properties: properties:
user: user:
$ref: '#/components/schemas/User' $ref: '#/components/schemas/User'
@@ -3531,13 +3522,11 @@ components:
type: integer type: integer
MessageEvent: MessageEvent:
type: object type: object
tags: ['Objects']
properties: properties:
body: body:
type: string type: string
ChatMessages: ChatMessages:
type: array type: array
tags: ['Objects']
items: items:
anyOf: anyOf:
- $ref: '#/components/schemas/UserMessage' - $ref: '#/components/schemas/UserMessage'
@@ -3546,32 +3535,27 @@ components:
- $ref: '#/components/schemas/FederatedAction' - $ref: '#/components/schemas/FederatedAction'
UserMessage: UserMessage:
type: object type: object
tags: ['Objects']
allOf: allOf:
- $ref: '#/components/schemas/Event' - $ref: '#/components/schemas/Event'
- $ref: '#/components/schemas/UserEvent' - $ref: '#/components/schemas/UserEvent'
- $ref: '#/components/schemas/MessageEvent' - $ref: '#/components/schemas/MessageEvent'
SystemMessage: SystemMessage:
type: object type: object
tags: ['Objects']
allOf: allOf:
- $ref: '#/components/schemas/Event' - $ref: '#/components/schemas/Event'
- $ref: '#/components/schemas/MessageEvent' - $ref: '#/components/schemas/MessageEvent'
SystemActionEvent: SystemActionEvent:
type: object type: object
tags: ['Objects']
allOf: allOf:
- $ref: '#/components/schemas/Event' - $ref: '#/components/schemas/Event'
- $ref: '#/components/schemas/MessageEvent' - $ref: '#/components/schemas/MessageEvent'
ActionMessage: ActionMessage:
type: object type: object
tags: ['Objects']
allOf: allOf:
- $ref: '#/components/schemas/Event' - $ref: '#/components/schemas/Event'
- $ref: '#/components/schemas/MessageEvent' - $ref: '#/components/schemas/MessageEvent'
FederatedAction: FederatedAction:
type: object type: object
tags: ['Objects']
allOf: allOf:
- $ref: '#/components/schemas/Event' - $ref: '#/components/schemas/Event'
- $ref: '#/components/schemas/MessageEvent' - $ref: '#/components/schemas/MessageEvent'
@@ -3585,7 +3569,6 @@ components:
type: string type: string
WebConfig: WebConfig:
type: object type: object
tags: ['Objects']
properties: properties:
appearanceVariables: appearanceVariables:
type: object type: object
@@ -3637,7 +3620,6 @@ components:
$ref: '#/components/schemas/AuthenticationConfig' $ref: '#/components/schemas/AuthenticationConfig'
SocialHandle: SocialHandle:
type: object type: object
tags: ['Objects']
properties: properties:
platform: platform:
type: string type: string
@@ -3647,7 +3629,6 @@ components:
type: string type: string
ExternalAction: ExternalAction:
type: object type: object
tags: ['Objects']
properties: properties:
url: url:
type: string type: string
@@ -3665,13 +3646,11 @@ components:
type: boolean type: boolean
NotificationConfig: NotificationConfig:
type: object type: object
tags: ['Objects']
properties: properties:
browser: browser:
$ref: '#/components/schemas/BrowserConfig' $ref: '#/components/schemas/BrowserConfig'
BrowserConfig: BrowserConfig:
type: object type: object
tags: ['Objects']
properties: properties:
publicKey: publicKey:
type: string type: string
@@ -3679,7 +3658,6 @@ components:
type: boolean type: boolean
FederationConfig: FederationConfig:
type: object type: object
tags: ['Objects']
properties: properties:
account: account:
type: string type: string
@@ -3689,13 +3667,11 @@ components:
type: boolean type: boolean
AuthenticationConfig: AuthenticationConfig:
type: object type: object
tags: ['Objects']
properties: properties:
indieAuthEnabled: indieAuthEnabled:
type: boolean type: boolean
YPDetails: YPDetails:
type: object type: object
tags: ['Objects']
properties: properties:
lastConnectTime: lastConnectTime:
type: string type: string
@@ -3727,7 +3703,6 @@ components:
type: boolean type: boolean
VideoVariant: VideoVariant:
type: object type: object
tags: ['Objects', 'Video']
properties: properties:
index: index:
type: integer type: integer
@@ -3735,7 +3710,6 @@ components:
type: string type: string
PlaybackMetrics: PlaybackMetrics:
type: object type: object
tags: ['Objects', 'Video']
properties: properties:
bandwidth: bandwidth:
type: number type: number
@@ -3754,7 +3728,6 @@ components:
format: double format: double
Broadcaster: Broadcaster:
type: object type: object
tags: ['Objects', 'Video']
properties: properties:
time: time:
type: string type: string
@@ -3765,7 +3738,6 @@ components:
$ref: '#/components/schemas/InboundStreamDetails' $ref: '#/components/schemas/InboundStreamDetails'
InboundStreamDetails: InboundStreamDetails:
type: object type: object
tags: ['Objects', 'Video']
properties: properties:
videoCodec: videoCodec:
type: string type: string
@@ -3786,7 +3758,6 @@ components:
format: float format: float
CurrentBroadcast: CurrentBroadcast:
type: object type: object
tags: ['Objects', 'Video']
properties: properties:
outputSettings: outputSettings:
type: array type: array
@@ -3796,7 +3767,6 @@ components:
$ref: '#/components/schemas/LatencyLevel' $ref: '#/components/schemas/LatencyLevel'
StreamOutputVariant: StreamOutputVariant:
type: object type: object
tags: ['Objects', 'Video']
properties: properties:
name: name:
type: string type: string
@@ -3823,7 +3793,6 @@ components:
type: integer type: integer
StreamHealthOverview: StreamHealthOverview:
type: object type: object
tags: ['Objects', 'Video']
properties: properties:
message: message:
type: string type: string
@@ -3835,7 +3804,6 @@ components:
type: boolean type: boolean
BrowserNotificationConfiguration: BrowserNotificationConfiguration:
type: object type: object
tags: ['Objects', 'Notifications']
properties: properties:
goLiveMessage: goLiveMessage:
type: string type: string
@@ -3843,7 +3811,6 @@ components:
type: boolean type: boolean
DiscordNotificationConfiguration: DiscordNotificationConfiguration:
type: object type: object
tags: ['Objects', 'Notifications']
properties: properties:
webhook: webhook:
type: string type: string
@@ -3853,7 +3820,6 @@ components:
type: boolean type: boolean
S3Info: S3Info:
type: object type: object
tags: ['Objects']
properties: properties:
endpoint: endpoint:
type: string type: string
@@ -3875,7 +3841,6 @@ components:
type: boolean type: boolean
StreamKey: StreamKey:
type: object type: object
tags: ['Objects']
properties: properties:
key: key:
type: string type: string
@@ -3883,7 +3848,6 @@ components:
type: string type: string
TimestampedValue: TimestampedValue:
type: object type: object
tags: ['Objects']
properties: properties:
time: time:
type: string type: string
@@ -3893,7 +3857,6 @@ components:
format: double format: double
Viewer: Viewer:
type: object type: object
tags: ['Objects', 'Video']
properties: properties:
firstSeen: firstSeen:
type: string type: string
@@ -3908,7 +3871,6 @@ components:
type: string type: string
GeoDetails: GeoDetails:
type: object type: object
tags: ['Objects']
properties: properties:
countryCode: countryCode:
type: string type: string
@@ -3917,7 +3879,6 @@ components:
timeZone: timeZone:
type: string type: string
CollectedMetrics: CollectedMetrics:
tags: ['Objects']
type: object type: object
properties: properties:
disk: disk:
@@ -3934,7 +3895,6 @@ components:
$ref: '#/components/schemas/TimestampedValue' $ref: '#/components/schemas/TimestampedValue'
ChatClient: ChatClient:
type: object type: object
tags: ['Objects', 'Chat']
properties: properties:
connectedAt: connectedAt:
type: string type: string
@@ -3949,12 +3909,10 @@ components:
type: integer type: integer
ChatClients: ChatClients:
type: array type: array
tags: ['Objects', 'Chat']
items: items:
$ref: '#/components/schemas/ChatClient' $ref: '#/components/schemas/ChatClient'
IPAddress: IPAddress:
type: object type: object
tags: ['Objects', 'Chat']
properties: properties:
createdAt: createdAt:
type: string type: string
@@ -3965,7 +3923,6 @@ components:
type: string type: string
Webhook: Webhook:
type: object type: object
tags: ['Objects', 'Notifications']
properties: properties:
timestamp: timestamp:
type: string type: string
@@ -3983,7 +3940,6 @@ components:
type: integer type: integer
WebhookEventType: WebhookEventType:
type: string type: string
tags: ['Objects', 'Notifications']
enum: enum:
- CHAT - CHAT
- USER_JOINED - USER_JOINED
@@ -4024,7 +3980,6 @@ components:
type: boolean type: boolean
MessageVisibilityUpdate: MessageVisibilityUpdate:
type: object type: object
tags: ['Objects', 'Chat']
properties: properties:
idArray: idArray:
type: array type: array
@@ -4034,7 +3989,6 @@ components:
type: boolean type: boolean
ModerationUserDetails: ModerationUserDetails:
type: object type: object
tags: ['Objects', 'Chat']
properties: properties:
user: user:
$ref: '#/components/schemas/User' $ref: '#/components/schemas/User'
@@ -4048,7 +4002,6 @@ components:
$ref: '#/components/schemas/UserMessage' $ref: '#/components/schemas/UserMessage'
ModerationConnectedClient: ModerationConnectedClient:
type: object type: object
tags: ['Objects', 'Chat']
properties: properties:
connectedAt: connectedAt:
type: string type: string
@@ -4064,7 +4017,6 @@ components:
type: integer type: integer
FederatedActivity: FederatedActivity:
type: object type: object
tags: ['Objects', 'Social']
properties: properties:
timestamp: timestamp:
type: string type: string
@@ -4077,7 +4029,6 @@ components:
type: string type: string
PaginatedFederatedActivity: PaginatedFederatedActivity:
type: object type: object
tags: ['Objects', 'Social']
properties: properties:
total: total:
type: integer type: integer
@@ -4085,7 +4036,6 @@ components:
$ref: '#/components/schemas/FederatedActivity' $ref: '#/components/schemas/FederatedActivity'
AdminStatus: AdminStatus:
type: object type: object
tags: ['Objects']
properties: properties:
broadcaster: broadcaster:
$ref: '#/components/schemas/Broadcaster' $ref: '#/components/schemas/Broadcaster'
@@ -4107,7 +4057,6 @@ components:
type: boolean type: boolean
AdminServerConfig: AdminServerConfig:
type: object type: object
tags: ['Objects']
properties: properties:
instanceDetails: instanceDetails:
$ref: '#/components/schemas/AdminWebConfig' $ref: '#/components/schemas/AdminWebConfig'
@@ -4171,7 +4120,6 @@ components:
type: boolean type: boolean
AdminWebConfig: AdminWebConfig:
type: object type: object
tags: ['Objects']
properties: properties:
appearanceVariables: appearanceVariables:
type: object type: object
@@ -4209,7 +4157,6 @@ components:
type: boolean type: boolean
AdminNotificationsConfig: AdminNotificationsConfig:
type: object type: object
tags: ['Objects', 'Notifications']
properties: properties:
browser: browser:
$ref: '#/components/schemas/BrowserNotificationConfiguration' $ref: '#/components/schemas/BrowserNotificationConfiguration'
@@ -4217,14 +4164,12 @@ components:
$ref: '#/components/schemas/DiscordNotificationConfiguration' $ref: '#/components/schemas/DiscordNotificationConfiguration'
AdminYPInfo: AdminYPInfo:
type: object type: object
tags: ['Objects']
properties: properties:
instanceUrl: instanceUrl:
type: string type: string
enabled: enabled:
type: boolean type: boolean
AdminFederationConfig: AdminFederationConfig:
tags: ['Objects', 'Social']
type: object type: object
properties: properties:
username: username:
@@ -4243,7 +4188,6 @@ components:
type: boolean type: boolean
AdminVideoSettings: AdminVideoSettings:
type: object type: object
tags: ['Objects', 'Video']
properties: properties:
videoQualityVariants: videoQualityVariants:
type: array type: array
@@ -4253,7 +4197,6 @@ components:
type: integer type: integer
AdminLog: AdminLog:
type: object type: object
tags: ['Objects']
properties: properties:
time: time:
type: string type: string
@@ -4264,7 +4207,6 @@ components:
type: string type: string
AdminConfigValue: AdminConfigValue:
type: object type: object
tags: ['Objects']
properties: properties:
value: value:
oneOf: oneOf:
@@ -4276,7 +4218,6 @@ components:
- type: number - type: number
IndieAuthResponse: IndieAuthResponse:
type: object type: object
tags: ['Objects', 'Auth']
properties: properties:
me: me:
type: string type: string
@@ -4288,7 +4229,6 @@ components:
type: string type: string
IndieAuthProfile: IndieAuthProfile:
type: object type: object
tags: ['Objects', 'Auth']
properties: properties:
name: name:
type: string type: string
@@ -4298,7 +4238,6 @@ components:
type: string type: string
IndieAuthServerProfileResponse: IndieAuthServerProfileResponse:
type: object type: object
tags: ['Objects', 'Auth']
properties: properties:
me: me:
type: string type: string
@@ -4310,7 +4249,6 @@ components:
type: string type: string
IndieAuthServerProfile: IndieAuthServerProfile:
type: object type: object
tags: ['Objects', 'Auth']
properties: properties:
name: name:
type: string type: string

View File

@@ -0,0 +1,15 @@
package authrepository
import (
"database/sql"
"github.com/owncast/owncast/models"
)
type AuthRepository interface {
CreateBanIPTable(db *sql.DB)
BanIPAddress(address, note string) error
IsIPAddressBanned(address string) (bool, error)
GetIPAddressBans() ([]models.IPAddress, error)
RemoveIPAddressBan(address string) error
}

Some files were not shown because too many files have changed in this diff Show More