More efficient than the current one where instance is not fast enough to
send all viewers if a video becomes popular
The new protocol can be enabled by setting env
USE_VIEWERS_FEDERATION_V2='true'
Introduce a result field in View activity that contains the number of
viewers. This field is used by the origin instance to send the total
viewers on the video to remote instances. The difference with the
current protocol is that we don't have to send viewers individually to
remote instances.
There are 4 cases:
* View activity from federation on Remote Video -> instance replaces
all current viewers by a new viewer that contains the result counter
* View activity from federation on Local Video -> instance adds the
viewer without considering the result counter
* Local view on Remote Video -> instance adds the viewer and send it to
the origin instance
* Local view on Local Video -> instance adds the viewer
Periodically PeerTube cleanups expired viewers. On local videos, the
instance sends to remote instances a View activity with the result
counter so they can update their viewers counter for that particular
video
* Split methods in multiple classes
* Add JSONLD tags in embed too
* Index embeds but use a canonical URL tag (targeting the watch page)
* Remote objects don't include a canonical URL tag anymore. Instead we
forbid indexation
* Canonical URLs now use the official short URL (/w/, /w/p, /a, /c
etc.)
Sorry for the very big commit that may lead to git log issues and merge
conflicts, but it's a major step forward:
* Server can be faster at startup because imports() are async and we can
easily lazy import big modules
* Angular doesn't seem to support ES import (with .js extension), so we
had to correctly organize peertube into a monorepo:
* Use yarn workspace feature
* Use typescript reference projects for dependencies
* Shared projects have been moved into "packages", each one is now a
node module (with a dedicated package.json/tsconfig.json)
* server/tools have been moved into apps/ and is now a dedicated app
bundled and published on NPM so users don't have to build peertube
cli tools manually
* server/tests have been moved into packages/ so we don't compile
them every time we want to run the server
* Use isolatedModule option:
* Had to move from const enum to const
(https://www.typescriptlang.org/docs/handbook/enums.html#objects-vs-enums)
* Had to explictely specify "type" imports when used in decorators
* Prefer tsx (that uses esbuild under the hood) instead of ts-node to
load typescript files (tests with mocha or scripts):
* To reduce test complexity as esbuild doesn't support decorator
metadata, we only test server files that do not import server
models
* We still build tests files into js files for a faster CI
* Remove unmaintained peertube CLI import script
* Removed some barrels to speed up execution (less imports)