Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gather metrics for clouflare vs ovh websockets #16034

Merged
merged 11 commits into from
Sep 19, 2024
1 change: 1 addition & 0 deletions app/Env.scala
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ given ConfigLoader[NetConfig] = ConfigLoader(config =>
siteName = get[String]("site.name"),
socketDomains = get[List[String]]("socket.domains"),
socketAlts = get[List[String]]("socket.alts"),
socketTest = get[Boolean]("socket.test"),
crawlable = get[Boolean]("crawlable"),
rateLimit = get[RateLimit]("ratelimit"),
email = get[EmailAddress]("email"),
Expand Down
13 changes: 13 additions & 0 deletions app/controllers/Dev.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package controllers

import lila.app.*
import play.api.libs.json.*

final class Dev(env: Env) extends LilaController(env):

Expand Down Expand Up @@ -76,3 +77,15 @@ final class Dev(env: Env) extends LilaController(env):
private def runCommand(command: String)(using Me): Fu[String] =
env.mod.logApi.cli(command) >>
env.api.cli(command.split(" ").toList)

def socketTestResult = AuthBody(parse.json) { ctx ?=> me ?=>
ctx.body.body
.validate[JsArray]
.fold(
err => BadRequest(Json.obj("error" -> err.toString)),
results =>
env.api.socketTestResult
.put(Json.obj(me.userId.toString -> results))
.inject(jsonOkResult)
)
}
10 changes: 6 additions & 4 deletions app/views/base/page.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import scalalib.StringUtils.escapeHtmlRaw
import lila.app.UiEnv.{ *, given }
import lila.common.String.html.safeJsonValue
import lila.ui.RenderedPage
import lila.api.SocketTest

object page:

Expand Down Expand Up @@ -110,10 +111,11 @@ object page:
dataDev,
dataVapid := (ctx.isAuth && env.security.lilaCookie.isRememberMe(ctx.req))
.option(env.push.vapidPublicKey),
dataUser := ctx.userId,
dataSoundSet := pref.currentSoundSet.toString,
dataSocketDomains,
pref.isUsingAltSocket.option(dataSocketAlts),
dataUser := ctx.userId,
dataSoundSet := pref.currentSoundSet.toString,
attr("data-socket-domains") := SocketTest.socketEndpoints(netConfig).mkString(","),
attr("data-socket-test-user") := SocketTest.isUserInTestBucket(netConfig),
ornicar marked this conversation as resolved.
Show resolved Hide resolved
attr("data-socket-test-running") := netConfig.socketTest,
dataAssetUrl,
dataAssetVersion := assetVersion,
dataNonce := ctx.nonce.ifTrue(sameAssetDomain).map(_.value),
Expand Down
2 changes: 1 addition & 1 deletion bin/trans-dump.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ function keyListFrom(name: string): KeyList {
};
}

const dbCode = (obj: KeyList) => ` object ${obj.name}:\n${obj.code}`
const dbCode = (obj: KeyList) => ` object ${obj.name}:\n${obj.code}`;

Promise.all(dbs.map(keyListFrom)).then(objs => {
const code = `// Generated with bin/trans-dump.ts
Expand Down
1 change: 1 addition & 0 deletions conf/base.conf
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ net {
domain = "localhost:9663"
socket.domains = ["localhost:9664"]
socket.alts = []
socket.test = false
asset.domain = ${net.domain}
asset.base_url = "http://"${net.asset.domain}
asset.base_url_internal = ${net.asset.base_url}
Expand Down
2 changes: 2 additions & 0 deletions conf/routes
Original file line number Diff line number Diff line change
Expand Up @@ -871,6 +871,8 @@ POST /dev/cli controllers.Dev.cliPost
GET /dev/settings controllers.Dev.settings
POST /dev/settings/:id controllers.Dev.settingsPost(id)

POST /dev/socket-test controllers.Dev.socketTestResult

# Push
POST /mobile/register/:platform/:deviceId controllers.Push.mobileRegister(platform, deviceId)
POST /mobile/unregister controllers.Push.mobileUnregister
Expand Down
7 changes: 6 additions & 1 deletion modules/api/src/main/Env.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package lila.api

import akka.actor.*
import com.softwaremill.macwire.*
import com.softwaremill.tagging.*
import play.api.Mode

import lila.chat.{ GetLinkCheck, IsChatFresh }
Expand Down Expand Up @@ -58,7 +59,8 @@ final class Env(
webConfig: lila.web.WebConfig,
realPlayerApi: lila.web.RealPlayerApi,
bookmarkExists: lila.core.bookmark.BookmarkExists,
manifest: lila.web.AssetManifest
manifest: lila.web.AssetManifest,
yoloDb: lila.db.AsyncDb @@ lila.db.YoloDb // for socket test results
)(using val mode: Mode, scheduler: Scheduler)(using
Executor,
ActorSystem,
Expand Down Expand Up @@ -93,6 +95,9 @@ final class Env(

lazy val cli = wire[Cli]

lazy val socketTestResult =
SocketTestResult(yoloDb(lila.core.config.CollName("socket_test")).failingSilently())

private lazy val linkCheck = wire[LinkCheck]
lazy val chatFreshness = wire[ChatFreshness]

Expand Down
22 changes: 22 additions & 0 deletions modules/api/src/main/SocketTestResult.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package lila.api

import play.api.libs.json.*

import lila.db.JSON
import lila.core.config.NetConfig

final class SocketTestResult(resultsDb: lila.db.AsyncCollFailingSilently)(using Executor):
def put(results: JsObject) = resultsDb: coll =>
coll.insert.one(JSON.bdoc(results)).void

object SocketTest:

def isUserInTestBucket(net: NetConfig)(using ctx: Context) =
net.socketTest && ctx.pref.usingAltSocket.isEmpty && ctx.userId.exists(_.value.toList.sum % 128 == 0)

def socketEndpoints(net: NetConfig)(using ctx: Context): List[String] =
ctx.pref.usingAltSocket.match
case Some(true) => net.socketAlts
case Some(false) => net.socketDomains
case _ if isUserInTestBucket(net) => net.socketDomains.head :: net.socketAlts.headOption.toList
case _ => net.socketDomains
1 change: 1 addition & 0 deletions modules/core/src/main/config.scala
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ object config:
siteName: String,
socketDomains: List[String],
socketAlts: List[String],
socketTest: Boolean,
crawlable: Boolean,
rateLimit: RateLimit,
email: EmailAddress,
Expand Down
3 changes: 1 addition & 2 deletions modules/web/src/main/ui/layout.scala
Original file line number Diff line number Diff line change
Expand Up @@ -189,8 +189,7 @@ final class layout(helpers: Helpers, assetHelper: lila.web.ui.AssetFullHelper)(
)

val dataVapid = attr("data-vapid")
val dataSocketDomains = attr("data-socket-domains") := netConfig.socketDomains.mkString(",")
val dataSocketAlts = attr("data-socket-alts") := netConfig.socketAlts.mkString(",")
def dataSocketDomains = attr("data-socket-domains") := netConfig.socketDomains.mkString(",")
val dataNonce = attr("data-nonce")
val dataAnnounce = attr("data-announce")
val dataSoundSet = attr("data-sound-set")
Expand Down
13 changes: 10 additions & 3 deletions ui/@types/lichess/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ interface Site {
load: Promise<void>; // DOMContentLoaded promise
quantity(n: number): 'zero' | 'one' | 'few' | 'many' | 'other';
siteI18n: I18nDict;
socket: any;
socket: SocketI;
quietMode?: boolean;
analysis?: any; // expose the analysis ctrl
manifest: { css: Record<string, string>; js: Record<string, string>; hashed: Record<string, string> };
Expand Down Expand Up @@ -122,6 +122,15 @@ interface SoundI {
url(name: string): string;
}

interface SocketI {
averageLag: number;
pingInterval(): number;
getVersion(): number|false;
send: SocketSend;
sign(s: string): void;
destroy(): void;
}

interface LichessSpeech {
step(s: { san?: San }, cut: boolean): void;
}
Expand Down Expand Up @@ -154,8 +163,6 @@ interface Trans {
vdomPlural<T>(key: string, count: number, countArg: T, ...args: T[]): Array<string | T>;
}

type PubsubCallback = (...data: any[]) => void;

interface LichessAnnouncement {
msg?: string;
date?: string;
Expand Down
2 changes: 1 addition & 1 deletion ui/bits/src/bits.diagnosticDialog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { domDialog } from 'common/dialog';
import * as licon from 'common/licon';
import { escapeHtml } from 'common';
import { storage } from 'common/storage';
import { log } from 'common/dbLog';
import { log } from 'common/permalog';

export async function initModule(): Promise<void> {
const ops = processQueryParams();
Expand Down
2 changes: 1 addition & 1 deletion ui/ceval/src/engines/stockfishWebEngine.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Work, CevalEngine, CevalState, BrowserEngineInfo, EngineNotifier } from
import { Protocol } from '../protocol';
import { objectStorage, ObjectStorage } from 'common/objectStorage';
import { sharedWasmMemory } from '../util';
import { log } from 'common/dbLog';
import { log } from 'common/permalog';
import type StockfishWeb from 'lila-stockfish-web';

export class StockfishWebEngine implements CevalEngine {
Expand Down
2 changes: 1 addition & 1 deletion ui/chart/src/chart.lag.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ const v = {
};

export async function initModule(): Promise<void> {
pubsub.after('socket.connect').then(() => site.socket.send('moveLat', true));
pubsub.after('socket.hasConnected').then(() => site.socket.send('moveLat', true));
$('.meter canvas').each(function(this: HTMLCanvasElement, index) {
const colors = ['#55bf3b', '#dddf0d', '#df5353'];
const dataset: ChartDataset<'doughnut'>[] = [
Expand Down
2 changes: 1 addition & 1 deletion ui/chat/src/ctrl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import { moderationCtrl } from './moderation';
import { prop } from 'common';
import { trans } from 'common/i18n';
import { storage, type LichessStorage } from 'common/storage';
import { pubsub, PubsubEvent } from 'common/pubsub';
import { pubsub, PubsubEvent, PubsubCallback } from 'common/pubsub';

export default class ChatCtrl {
data: ChatData;
Expand Down
2 changes: 1 addition & 1 deletion ui/common/src/miniBoard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export const initMiniGames = (parent?: HTMLElement): void => {
const nodes = Array.from((parent || document).getElementsByClassName('mini-game--init')),
ids = nodes.map(x => initMiniGame(x)).filter(id => id);
if (ids.length)
pubsub.after('socket.connect').then(() => site.socket.send('startWatching', ids.join(' ')));
pubsub.after('socket.hasConnected').then(() => site.socket.send('startWatching', ids.join(' ')));
};

export const updateMiniGame = (node: HTMLElement, data: MiniGameUpdateData): void => {
Expand Down
8 changes: 8 additions & 0 deletions ui/common/src/objectStorage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,3 +75,11 @@ export async function dbConnect(dbInfo: DbInfo): Promise<IDBDatabase> {
};
});
}

export async function dbExists(dbInfo: DbInfo): Promise<boolean> {
const dbName = dbInfo?.db || `${dbInfo.store}--db`;
const found = (await window.indexedDB.databases()).some(db => db.name === dbName);
if (!found) return false;
const store = await objectStorage(dbInfo);
return await store.count() > 0;
}
1 change: 0 additions & 1 deletion ui/common/src/dbLog.ts → ui/common/src/permalog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ interface LichessLog {
}

function makeLog(): LichessLog {

const dbInfo: DbInfo = {
db: 'log--db',
store: 'log',
Expand Down
12 changes: 9 additions & 3 deletions ui/common/src/pubsub.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,9 @@ export type PubsubEvent =

export type PubsubOneTimeEvent =
| 'dialog.polyfill'
| 'socket.connect';
| 'socket.hasConnected';

export type PubsubCallback = (...data: any[]) => void;

export interface Pubsub {
on(msg: PubsubEvent, f: PubsubCallback): void;
Expand All @@ -69,6 +71,7 @@ export interface Pubsub {

after(event: PubsubOneTimeEvent): Promise<void>;
complete(event: PubsubOneTimeEvent): void;
past(event: PubsubOneTimeEvent): boolean;
}

export const pubsub: Pubsub = {
Expand Down Expand Up @@ -100,10 +103,13 @@ export const pubsub: Pubsub = {
found.resolve = undefined;
} else oneTimeEvents.set(event, { promise: Promise.resolve() });
},
past(event: PubsubOneTimeEvent): boolean {
return oneTimeEvents.has(event) && !oneTimeEvents.get(event)?.resolve;
},
};

const allSubs: Map<string, Set<() => void>> = new Map();
const oneTimeEvents: Map<string, OneTimeHandler> = new Map();
const allSubs: Map<PubsubEvent, Set<() => void>> = new Map();
const oneTimeEvents: Map<PubsubOneTimeEvent, OneTimeHandler> = new Map();

interface OneTimeHandler {
promise: Promise<void>;
Expand Down
Loading
Loading