fix Hide video playback controls on auto-playing videos

Details

Fixed Issues

$ https://github.com/Expensify/App/issues/42323
PROPOSAL: https://github.com/Expensify/App/issues/42323#issuecomment-2116490326
Tests

On a new account, tap green (+) button
Tap "Track Expense"
Observe bottom sheet w/video about how to Track expense playing with controls does not display by default

[x] Verify that no errors appear in the JS console

Offline tests

QA Steps

[x] Verify that no errors appear in the JS console

PR Author Checklist

[x] I linked the correct issue in the ### Fixed Issues section above
[x] I wrote clear testing steps that cover the changes made in this PR

[x] I added steps for local testing in the Tests section
[x] I added steps for the expected offline behavior in the Offline steps section
[x] I added steps for Staging and/or Production testing in the QA steps section
[x] I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
[x] I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
[x] I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).

[x] I included screenshots or videos for tests on all platforms
[x] I ran the tests on all platforms & verified they passed on:

[x] Android: Native
[x] Android: mWeb Chrome
[x] iOS: Native
[x] iOS: mWeb Safari
[x] MacOS: Chrome / Safari
[x] MacOS: Desktop

[x] I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
[x] I followed proper code patterns (see Reviewing the code)

[x] I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
[x] I verified that the left part of a conditional rendering a React component is a boolean and NOT a string, e.g. myBool && <MyComponent />.
[x] I verified that comments were added to code that is not self explanatory
[x] I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
[x] I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method

[x] If any non-english text was added/modified, I verified the translation was requested/reviewed in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:

[x] I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
[x] I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
[x] I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
[x] I verified the JSDocs style guidelines (in STYLE.md) were followed

[x] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
[x] I followed the guidelines as stated in the Review Guidelines
[x] I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
[x] I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
[x] I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
[x] I verified that if a function's arguments changed that all usages have also been updated correctly
[x] If any new file was added I verified that:

[x] The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory

[x] If a new CSS style is added I verified that:

[x] A similar style doesn't already exist
[x] The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))

[x] If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
[x] If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
[x] If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
[x] If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
[x] If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:

[x] I verified that all the inputs inside a form are aligned with each other.
[x] I added Design label and/or tagged @Expensify/design so the design team can review the changes.

[x] If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
[x] If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
https://github.com/Expensify/App/assets/113963320/06d5f853-54d7-4538-8fa2-da828a822e9e

Android: mWeb Chrome

iOS: Native

https://github.com/Expensify/App/assets/113963320/3de4a577-4cf6-415c-bbff-8b7b932d5aa7

iOS: mWeb Safari

MacOS: Chrome / Safari

https://github.com/Expensify/App/assets/113963320/a793a107-23d0-40d4-8ea3-4a70117e57c3

MacOS: Desktop

The video on iOS don't seem to be autoplaying is that correct?
Can you do some recordings of how this looks for a in a chat thread?
Checked out the PR locally and the desktop versions feels good to me. A bit harder to get a feel for native, but it looks alright at first glance.
cc @Expensify/design

Going OOO for the next 7 days, so @shawnborton and @dannymcclain will be able to assist with the last few details :)

Reviewing today

Can you do some recordings of how this looks for a in a chat thread?

Please find recordings below.
I have also left some follow-up queries here

iOS Native
https://github.com/Expensify/App/assets/3004659/e9cdd8f0-eef2-43be-a4ad-fb7fc301f9b4

mWeb Chrome
https://github.com/Expensify/App/assets/3004659/c2cd84ab-c713-4a95-a001-914b79559119

But when a video Attachment is played (I.e. either via tap or on the play button on playback controls), the playback controls do not fade away as per OP expectations. Did we miss implementing this?

Perhaps we did not implement this, and we probably should implement it?

Currently, the fading away feature will get triggered when played and paused. Curious to know if the playback controls should remain shown when paused on mobile. Or is it fine for the playback controls to fade away when paused?

I think I would expect the controls to remain there even if the video is paused? But if you tap the video outside of the pause button, I would expect the video to remain paused but the controls to fade away.

Also, when popover is visible, shouldn’t the playback controls remain displayed and not fade away?

Popover as in the training modal? I think we'd want to fade those away too.

Also, when popover is visible, shouldn’t the playback controls remain displayed and not fade away?

Popover as in the training modal?

I meant the popover menu with menu options Download and Playback speed as shown below. Suppose the user makes the popover menu visible while the playback controls are shown (i.e. before it fades away). In that case, the menu options remain displayed even after the playback controls fade.

But when a video Attachment is played (I.e. either via tap or on the play button on playback controls), the playback controls do not fade away as per OP expectations. Did we miss implementing this?

Perhaps we did not implement this, and we probably should implement it?

Currently, the fading away feature will get triggered when played and paused. Curious to know if the playback controls should remain shown when paused on mobile. Or is it fine for the playback controls to fade away when paused?

I think I would expect the controls to remain there even if the video is paused? But if you tap the video outside of the pause button, I would expect the video to remain paused but the controls to fade away.

So, if I understand correctly,
On mobile devices,

When the video is tapped outside of the playback controls (whether play or pause), we show the playback controls and fade them after the agreed interval.
When the playback controls are interacted upon by clicking any of the button, we keep showing the playback controls without fading them.
Video attachment also behaves as mentioned in 1. and 2.  But, unlike feature training videos, the playback controls is shown initially by default and fades away.

Is this understanding correct?

I think that sounds right to me, yup.

Therefore, fixing the attachment video would expand the scope of this issue. What are your thoughts?

This seems okay to me though. Or maybe, what exactly are you asking me here? Anything else you need me to clear up?

Ah, I think maybe the idea is that as long as the video is playing, the controls will eventually fade out. Then you tap to get them to come back. But if you tap and pause, the controls stay in place. Does that sound right @Expensify/design ?

Going to create an adhoc build for testing

Then, tap on the video. The video is paused, the control is displayed without fading.

Hmm, I'm not sure if we want tapping on the video to pause it. I would think tapping on the video just shows the controls. Thoughts @Expensify/design ?

So I think we're close, but I think tapping on the video shouldn't pause or play it. Only tapping on the pause/play icon would do that.

Hmm, I'm not sure if we want tapping on the video to pause it. I would think tapping on the video just shows the controls.

Yeah I agree with you Shawn.

Understood, I suggest that we change that though to what we are all agreeing on above.

Yeah I think that's a fair concern. It seems like this pattern of tapping the video to show/hide controls is mostly just for mobile. So I would think on desktop, we would keep the behavior of tapping anywhere to play/pause.

That sounds right to me, mind sharing a screen recording too?

Awesome, that looks pretty good to me!

I believe this falls outside the scope of the current issue. Our current focus is on the feature training video, where we aim to hide the controls while still allowing user interaction if necessary. Extending this behavior to other elements like attachments or receipts requires further discussion regarding their specific behavior. Therefore, I suggest creating a separate issue for those cases. cc @shawnborton, your thoughts?

Hmm I disagree with that. The behaviors we are implementing here should be used globally for all video playback on mobile devices.

2. When play is going on for feature training videos and the popover menu is displayed, I think the controls should stay visible. Does this make sense?

I don't think so. Our expected behavior in this issue is "The controls on the video shouldn't have the controls showing by default".

Hmm.. Not quite sure but may be and am fine with it also. But, let us check with Design to be doubly sure.
@shawnborton Can you please confirm the expected behavior on point (2)?
The video here from around 19 sec onwards demonstrates this.

In terms of functionality I agree with everything on what's done so far.
I think the playback controls should show when the 3 dots are pressed because if not, I assume desktop would feel weird with the playback controls not showing underneath but the popover still shows.

When play is going on for feature training videos and the popover menu is displayed, I think the controls should stay visible. Does this make sense?

Yeah I agree that in this case, where there is an active popover situation, we want the popover & controls to continue showing even after a few seconds pass.

Nice, that feels pretty good to me!

Looks great!

@tienifr Can you please merge with the latest main? Will take this up for re-review today.

@tienifr Thanks for the merge. (1) and (2) as mentioned here is fixed but I think we missed implementing (3). For mobile devices, since we are hiding the controls after 2 sec for feature training videos, it would look awkward for non feature training videos to keep showing the controls without hiding after 2 sec.
Can we please also get this done and we are through with this issue? Thanks
Also, there is a lint error that needs to be addressed.

3. For non feature training videos, the playback controls are not hidden after 2 seconds. Did we agree to leave this as it is?

I believe this falls outside the scope of the current issue. Our current focus is on the feature training video, where we aim to hide the controls while still allowing user interaction if necessary. Extending this behavior to other elements like attachments or receipts requires further discussion regarding their specific behavior. Therefore, I suggest creating a separate issue for those cases. cc @shawnborton, your thoughts?

Hmm I disagree with that. The behaviors we are implementing here should be used globally for all video playback on mobile devices.

@tienifr Thanks for the changes. The mobile devices works awesome. But I think we have broken the web/desktop versions as the video controls fades away here. Isn’t the fading away UI experience only for mobile devices?
The test video here demonstrates this.

@shawnborton Just wanted to confirm if it is expected for the video controls to be initially hidden for feature training videos on large screen devices as mentioned in step C-3 here

I kind of think that if a video autoplays on desktop, then we wouldn't show the controls by default until the video is hovered. Thoughts on that @Expensify/design ?

@shawnborton Just wanted to confirm if it is expected for the video controls to be initially hidden for feature training videos on large screen devices as mentioned in step C-3 https://github.com/Expensify/App/pull/43349#issuecomment-2235701370

Not Shawn, but I think that's what we should do. Happy to have @shawnborton confirm/deny :)

Jinx. Agreed Shawn.

I kind of think that if a video autoplays on desktop, then we wouldn't show the controls by default until the video is hovered.

Thanks. So, that would mean C-4 steps would be:
4	Hover inside the video player and verify that video controls are displayed (#Test 10)

@tienifr This means we have only two remaining issues to nail this down. 1) here and 2) here

In your mobile video it looks like it's correct where the controls aren't showing, but given your cursor is above the video when it pops up it's hard to tell. Can you do a recording where you tap track submit and your cursor goes off to see if the controls never show?

In your mobile video it looks like it's correct where the controls aren't showing, but given your cursor is above the video when it pops up it's hard to tell. Can you do a recording where you tap track submit and your cursor goes off to see if the controls never show?

@dubielzyk-expensify From the code perspective, there is only one pending issue left. As soon as it is addressed, I suggest that we trigger a build (via Ready to Build) so that @Expensify/Design can have the final review on ux before we wrap-up on this.

Yeah. Reviewing in parallel maybe even better. Just one thing to note. There is one pending issue as mentioned here

Ohh this is looking good. I got two notes:

Can we made the delay before the controls fade starts slightly shorter? What's it at the moment? Felt like is was more than 2 seconds.
It would be awesome if we could get the controls to disappear when you tap on the video as well (when the controls are showing). The auto fade is mostly for when you don't do anything and to make sure the controls disappear automatically when the video is playing.

Currently, the controls stay visible fully for 2000ms, and fade out for 500ms. I made it disappear at once.

I think keep everything as it was, just reduce the 2000ms down to 1500ms.

2. It would be awesome if we could get the controls to disappear when you tap on the video as well (when the controls are showing).

@dubielzyk-expensify The commits after the above statements has impacted test step A-9 as mentioned here. As per step A-9, if we keep continually tapping on the video player within the timeout interval, the video controls remain shown. However, the controls will auto hide if timeout interval is exhausted after the most recent tap inside video player. The recent commits though forcefully hides the controls on every tap thereby impacting step A-9. Here is a test video after recent commits and I think it’s jittery. Can you confirm if it was intentional to change step A-9 or were you just concerned about reducing the time interval from 2 sec to 1.5 sec?
https://github.com/user-attachments/assets/6bedb3c6-6aa3-434e-a6f5-06992f09adc1

The recent commits though forcefully hides the controls on every tap thereby impacting step A-9.

The goal was that if the controls aren't showing, tapping the screen should show them. And reversely, if the controls aren't showing, tapping them show reveal them. So tapping many times on the screen should show, hide, repeat, multiple times. Tapping the screen should reset the timer for auto-hiding the controls so if a user interacts with it, it should override that behaviour anyways.
Basically the list of interactions are as follow:

Auto-hide controls on startup
Tapping the video canvas should reveal the controls
If nothing is tapped again, then the controls should fade away after 1.5 seconds.
But if a user taps the video canvas again with the controls showing, we should hide the controls

Does that make sense?

Thanks @dubielzyk-expensify for the clarification.
Accordingly, Step A-9 is changed from
9. Tap again inside the video player repeatedly within 2 seconds and verify that the video controls do not fade away (#Test 5)
to the following
9. Tap again inside the video playerwithin 1.5 seconds and verify that thevideo controls fade away (#Test 5)

@tienifr Can you please merge with the latest main? And I can complete the checklist. Thanks.

Reviewer Checklist

[x] I have verified the author checklist is complete (all boxes are checked off).
[x] I verified the correct issue is linked in the ### Fixed Issues section above
[x] I verified testing steps are clear and they cover the changes made in this PR

[x] I verified the steps for local testing are in the Tests section
[x] I verified the steps for Staging and/or Production testing are in the QA steps section
[x] I verified the steps cover any possible failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
[x] I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)

[x] I checked that screenshots or videos are included for tests on all platforms
[x] I included screenshots or videos for tests on all platforms
[x] I verified tests pass on all platforms & I tested again on:

[x] Android: Native
[x] Android: mWeb Chrome
[x] iOS: Native
[x] iOS: mWeb Safari
[x] MacOS: Chrome / Safari
[x] MacOS: Desktop

[x] If there are any errors in the console that are unrelated to this PR, I either fixed them (preferred) or linked to where I reported them in Slack
[x] I verified proper code patterns were followed (see Reviewing the code)

[x] I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick).
[x] I verified that the left part of a conditional rendering a React component is a boolean and NOT a string, e.g. myBool && <MyComponent />.
[x] I verified that comments were added to code that is not self explanatory
[x] I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
[x] I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
[x] I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
[x] I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
[x] I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
[x] I verified the JSDocs style guidelines (in STYLE.md) were followed

[x] If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
[x] I verified that this PR follows the guidelines as stated in the Review Guidelines
[x] I verified other components that can be impacted by these changes have been tested, and I retested again (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar have been tested & I retested again)
[x] I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
[x] I verified any variables that can be defined as constants (ie. in CONST.js or at the top of the file that uses the constant) are defined as such
[x] If a new component is created I verified that:

[x] A similar component doesn't exist in the codebase
[x] All props are defined accurately and each prop has a /** comment above it */
[x] The file is named correctly
[x] The component has a clear name that is non-ambiguous and the purpose of the component can be inferred from the name alone
[x] The only data being stored in the state is data necessary for rendering and nothing else
[x] For Class Components, any internal methods passed to components event handlers are bound to this properly so there are no scoping issues (i.e. for onClick={this.submit} the method this.submit should be bound to this in the constructor)
[x] Any internal methods bound to this are necessary to be bound (i.e. avoid this.submit = this.submit.bind(this); if this.submit is never passed to a component event handler like onClick)
[x] All JSX used for rendering exists in the render method
[x] The component has the minimum amount of code necessary for its purpose, and it is broken down into smaller components in order to separate concerns and functions

[x] If any new file was added I verified that:

[x] The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory

[x] If a new CSS style is added I verified that:

[x] A similar style doesn't already exist
[x] The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG)

[x] If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
[x] If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
[x] If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
[x] If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
[x] If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:

[x] I verified that all the inputs inside a form are aligned with each other.
[x] I added Design label and/or tagged @Expensify/design so the design team can review the changes.

[x] If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
[x] If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.
[x] I have checked off every checkbox in the PR reviewer checklist, including those that don't apply to this PR.

Screenshots/Videos

MacOS: Chrome / Safari
https://github.com/user-attachments/assets/1f49c363-4206-437d-ab45-cb7fefcca8a2

MacOS: Desktop
https://github.com/user-attachments/assets/bf71c022-056b-40f0-906c-66355bf394ce

iOS: mWeb Safari
https://github.com/user-attachments/assets/580af561-aadf-4d57-a736-c4c531a512c2

Android: Native
https://github.com/user-attachments/assets/b13bc0e8-6366-476d-aae5-b33b5137cd02

Android: mWeb Chrome
https://github.com/user-attachments/assets/b0ed8b7c-f37b-418e-b757-38f28a6a432b

iOS: Native
https://github.com/user-attachments/assets/4e321833-8b90-45fc-a360-b86231a86d35

Those test steps look good to me 👍

@tienifr @rojiphil let's update the test steps for QA in the OP?

@tienifr @rojiphil let's update the test steps for QA in the OP?

Oh! I do not have privileges to update the OP.
@tienifr Can you please update the QA steps as mentioned here? Thanks

:hand: This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release.

FYI I believe this was deployed to prod yesterday, from this checklist - https://github.com/Expensify/App/issues/47219


RSDK-4395 - Update RC UI to show compass heading of robot

https://viam.atlassian.net/browse/RSDK-4395
We change the robot-marker icon.
To do this, we add the following properties to the MapMarkerLibre class:

(property) icon: HTMLElement. With this we can define what icon we want the marker to use with an SVG url.
(property) rotation?: number. With this we can define the rotation of the marker. Here 0 is north and 90 is east.

I believe before this ticket can be complete, there will be to be an accompanying PR in RDK which passes the desired rotation in.

@raybjork


[enhancement] Add hash images blacklist

Some spammers only post images, while our Telegram chat has specific topics for users to share images. Why not implement a simple check that computes the MD5 hash of each image and compares it against an existing blacklist?

It doesn't sound too hard to implement; however, I'm not aware of "an existing blacklist." Do you have some examples of those lists publicly available?

We use our own list for moderation in Discord. Unfortunately, I cannot provide the list of hashes, and I don't think it would be useful for Telegram either, due to the specific nature of spam images we handle. However, it would be great to have the ability to add these images dynamically via the web UI as well


Fixed default adapter and test of pouchdb generator

PR is added to the queue for testing as 1. task. (75e6d2e)

Hi @andrew-aladev, I'm your friendly neighborhood Microsoft Pull Request Bot (You can call me MSBOT). Thanks for your contribution!

In order for us to evaluate and accept your PR, we ask that you sign a contribution license agreement. It's all electronic and will take just minutes. I promise there's no faxing. https://cla.microsoft.com.

TTYL, MSBOT;

Test (Fail) 78838688 build is completed (75e6d2e)
See https://github.com/ThaliTester/TestResults/tree/7883868875e6d2e_Fixed_default_adapter_and_test_of_pouchdb_generator_andrew-aladev/ for the logs

PR is added to the queue for testing as 2. task. (18f64ad)

Test (Fail) 78838688 build is completed (18f64ad)
See https://github.com/ThaliTester/TestResults/tree/7883868818f64ad_Fixed_default_adapter_and_test_of_pouchdb_generator_andrew-aladev/ for the logs

PR is added to the queue for testing as 2. task. (b2c39a0)

Test (Fail) 78838688 build is completed (b2c39a0)
See https://github.com/ThaliTester/TestResults/tree/78838688b2c39a0_Fixed_default_adapter_and_test_of_pouchdb_generator_andrew-aladev/ for the logs

Reviewed 3 of 4 files at r1, 2 of 2 files at r3.
Review status: all files reviewed at latest revision, 4 unresolved discussions, some commit checks failed.

test/www/jxcore/bv_tests/testPouchDBGenerator.js, line 25 [r3] (raw file):

  teardown: function (t) {
    if (fs.existsSync(defaultDirectory)) {
      del(defaultDirectory).then(function () {

Why introduce a whole new dependency when we already support fs-extra-promise which has remove dir capability via fs and fs-extra?

test/www/jxcore/bv_tests/testPouchDBGenerator.js, line 26 [r3] (raw file):

    if (fs.existsSync(defaultDirectory)) {
      del(defaultDirectory).then(function () {
        t.end();

Why do you need the t.end() here and the else below? Why not just remove this t.end() and the else and just stick a t.end() at the bottom?

thali/NextGeneration/utils/pouchDBGenerator.js, line 4 [r3] (raw file):

var inherits = require('inherits');
var objectAssign = require('object-assign');

NB: I'm curious, why did you change from js-extend to object-assign?

thali/NextGeneration/utils/pouchDBGenerator.js, line 79 [r3] (raw file):

}

PouchDBGenerator.defaults = {

Is there really any point in even having this anymore since we don't have any defaults?

Comments from Reviewable

PR is added to the queue for testing as 1. task. (67d86c3)

Test (Fail) 78838688 build is completed (67d86c3)
See https://github.com/ThaliTester/TestResults/tree/7883868867d86c3_Fixed_default_adapter_and_test_of_pouchdb_generator_andrew-aladev/ for the logs

Reviewed 3 of 4 files at r4.
Review status: all files reviewed at latest revision, 2 unresolved discussions, some commit checks failed.

thali/NextGeneration/utils/pouchDBGenerator.js, line 4 [r3] (raw file):
Previously, yaronyg (Yaron Y Goland) wrote…
> NB: I'm curious, why did you change from js-extend to object-assign?

NB: Curious didn't meant the decision was wrong. I was just curious. :(

Comments from Reviewable

Object.assign is available in ES6. I was using it later with babel. It is a habit.


reverse DNS broken in erlang docker image

Running weave 1.8.2, Docker 1.13.1, centos 7.2, aws, elastic container service
I noticed a problem while trying to cluster two rabbitmqs using an autocluster plugin and DNS. That plugin requires reverse-dns and I was able to isolate down to weave/erlang combination.
Forward DNS works fine in both docker/weave erlang consoles (only reverse DNS has a problem).
A docker-only (no weave) container will correctly resolve reverse dns from the erlang console:
Eshell V8.2.2  (abort with ^G)
1>  inet_res:gethostbyaddr({216,58,217,174}).
{ok,{hostent,"iad23s44-in-f14.1e100.net",[],inet,4,
             [{216,58,217,174}]}}

A container started through the weave proxy will not resolve reverse DNS.
Eshell V8.2.2  (abort with ^G)
1> inet_res:gethostbyaddr({216,58,217,174}).
{error,nxdomain}

However, bash on the container started through weave proxy can do the reverse DNS.
[root@ip-myip ~]# echo $DOCKER_HOST
unix:///var/run/weave/weave.sock
[root@ip-myip ~]# docker run -it --rm erlang /bin/bash -l
root@8974630db404:/# getent hosts <IP_ADDRESS>
<IP_ADDRESS>  iad23s44-in-f174.1e100.net

I'm not familiar enough with weave/erlang internals to give this a proper diagnosis.

@tobowers can you give the command-line used to start the container in the second example?
Since that doesn't look like a Weave address, the issue is in the recursive call to the upstream DNS.  weave status should say what the upstream DNS is set to; if that looks right then run Weave in debug mode, re-do the reverse DNS test and upload the logs (docker logs weave) please.
I.e. weave stop; weave launch --log-level=debug

@bboreham thanks for looking. I discovered the problem using weave addresses but I thought the above google ip was going to be easier to diagnose. Here's an example using just weave addresses. It'll take me a sec to launch in debug mode... it's not as trivial as that command in my ECS-backed-by-systemd setup.
[root@ip-172-16-2-244 ~]# eval "$(weave env)"
[root@ip-172-16-2-244 ~]# docker run -it --rm erlang
Erlang/OTP 19 [erts-8.2.2] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V8.2.2  (abort with ^G)
1> inet_res:lookup("elastic-master.weave.local", in, a).
[{10,32,0,2},{10,40,0,3},{10,40,0,2}]
2> inet_res:gethostbyaddr({10,32,0,2}).
{error,nxdomain}
3> inet_res:gethostbyaddr({10,40,0,3}).
{error,nxdomain}
4> inet_res:gethostbyaddr({10,40,0,2}).
{error,nxdomain}

and here's the relevant logging around the DNS lookups from log-level debug
DEBU: 2017/02/27 10:46:08.736718 [nameserver 5a:4d:4f:c1:6d:56] lookup elastic-master.weave.local. -> &[<IP_ADDRESS> <IP_ADDRESS> <IP_ADDRESS>]
DEBU: 2017/02/27 10:46:08.736799 [nameserver 5a:4d:4f:c1:6d:56] response: ;; opcode: QUERY, status: NOERROR, id: 1
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;elastic-master.weave.local.
DEBU: 2017/02/27 10:48:20.162098 [nameserver 5a:4d:4f:c1:6d:56] response: ;; opcode: QUERY, status: NOERROR, id: 5031
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;<IP_ADDRESS>.in-addr.arpa.	IN	 PTR

;; ANSWER SECTION:
<IP_ADDRESS>.in-addr.arpa.	1	IN	PTR	elastic-master.weave.local.

Thanks; can you run weave status dns on that same host where the failing lookup was run?

# weave status dns
elastic-data <IP_ADDRESS>       e4610530777e fa:e6:95:d9:5e:ca
elastic-master <IP_ADDRESS>       8d657d1006b3 62:43:6c:0b:9a:1d
elastic-master <IP_ADDRESS>       140f6966a10a fa:e6:95:d9:5e:ca
elastic-master <IP_ADDRESS>       8a640f075a6b fa:e6:95:d9:5e:ca
servicequeue <IP_ADDRESS>       83e06ade8956 5a:4d:4f:c1:6d:56
servicequeue <IP_ADDRESS>       25307d54da0e 62:43:6c:0b:9a:1d

huh... I'm just noticing the case difference in the question...
failing:
Question:[{Name:<IP_ADDRESS>.IN-ADDR.ARPA. Qtype:12 Qclass:1}] Answer:[] Ns:[] Extra:[]}

passing:
Question:[{Name:<IP_ADDRESS>.in-addr.arpa. Qtype:12 Qclass:1}]

Thanks; with enough logs all bugs are shallow :-)
The most obvious thing is the case of the request:
DEBU: 2017/02/27 10:46:13.792245 [nameserver 5a:4d:4f:c1:6d:56] reverse request: {MsgHdr:{Id:2 Response:false Opcode:0 Authoritative:false Truncated:false RecursionDesired:true RecursionAvailable:false Zero:false AuthenticatedData:false CheckingDisabled:false Rcode:0} Compress:false Question:[{Name:<IP_ADDRESS>.IN-ADDR.ARPA. Qtype:12 Qclass:1}] Answer:[] Ns:[] Extra:[]}

vs
DEBU: 2017/02/27 10:48:20.161992 [nameserver 5a:4d:4f:c1:6d:56] reverse request: {MsgHdr:{Id:5031 Response:false Opcode:0 Authoritative:false Truncated:false RecursionDesired:true RecursionAvailable:false Zero:false AuthenticatedData:false CheckingDisabled:false Rcode:0} Compress:false Question:[{Name:<IP_ADDRESS>.in-addr.arpa. Qtype:12 Qclass:1}] Answer:[] Ns:[] Extra:[]}

jinx. Right... but this is just generic erlang doing its thing.

Yeah, it's a bug in WeaveDNS.  Probably here https://github.com/weaveworks/weave/blob/master/nameserver/dns.go#L225

Ah ha... yeah that's definitely a problem.

Fixed via 242b8907bfbc60cf358fe386e89801e8af4662fc


Location data and forecasts not correct

Hello- I'm trying to figure out how and were this chart/card pulls the forecast data from.  I'm seeing very wrong data and I'd like to see if I can correct it.  Looking at the entity- i see attribution: Weather forecast from met.no, delivered by the Norwegian Meteorological Institu but I dont know what its using to gather my local data.  Thanks in advance for your help
Dusty

Hello,
the weather cart card only displays the data provided by the weather integration you selected. If you have wrong data, it is caused by the weather integration and not by the card.
You can check your weather integration output via:
Developer tools - services - Get weather forecast.
More information can be found here: https://www.home-assistant.io/integrations/weather/

Ok I understand now, thanks for pointing me to that. I scoured the readme  and all the python code and found nothing to indicate that I had to have preexisting entities for forecasting.  Plus the fact it was presenting data on the card led me to believe something was built in that I couldnt see.  I already pull in my local data but i was looking to add forecasting, I see new I need to add a forecasting service and associated entities.
Thanks again


Containers disappearing from scaled service

I have a service with a scale of 35, but only instances 15-35 are showing up in the various Rancher UI views for that service and the service is marked as "Degraded". But, if I look at the list of all containers on all hosts, I can see instances 1-14 running. The service configuration in the UI still shows a scale of 35.
If I run rancher-compose up -d <badservice> with a rancher-compose.xml file setting the scale to 35, the 1-14 containers suddenly reappear in the service views in the UI and the service is marked as "Active". However, some time later they disappear again.
I destroyed and recreated the service and the problem went away for a bit, but then started happening for another similarly scaled service some time later.

Do you have a few hundred or more containers total?  There are weird pagination issues in the UI as you cross ~200-1000 resources, depending on the resource and what else is included with it, https://github.com/rancher/rancher/issues/1606.  I should have time to look at that after DockerCon.

I have over 1500 containers in total. Although I've seen the issue in the individual service pages as well, where there should be 35 containers displayed, but it's missing 15 containers.

I have not recreated a similarly sized environment since I upgraded to the new Rancher UI. I'll see if I can reproduce it.

Using Rancher v0.50.1 I've been able to create 10 services with 50 containers each and all the containers are displayed in the services' containers pages. I'll leave it running to see if the problem reoccurs.

Everything still looks good.

Still working. I'd say this is fixed.


Drag-scrolling in mod info is broken

Geode Issue

[x] I confirm that this bug is NOT related to a mod but directly to Geode Loader itself.

Platform
Windows
SDK commit
No response
Geode Version
v2.0.0-beta.8
Mods Installed
No response
Expected Behavior
Appropriate drag-scrolling behavior.
Actual Behavior
Drag-scrolling is cancelled if your mouse moves too fast (the bar is very low).
Steps to Reproduce

Click "View" on a mod listing.
Click and drag inside the mod info box to scroll it.
Observe

Additional Information
No response

can't recreate on android at least, lets see windows

Whar

this was already fixed in https://github.com/geode-sdk/bindings/commit/f7388c97c9064a0b4df205ab5be99c95f7dcfe41
and again in https://github.com/geode-sdk/bindings/commit/7d7b9260575497363ce302de4a8665461911ae56
are you compiling geode yourself? we cant recreate this.

No, I got it from the website.


LCD display

a LCD to debug how show processed result !
https://www.locoduino.org/spip.php?article78

I'll add a 7-segment display in the near future.

e877256c2b8999c24f1d1caff735a326122f9c6c


Dagger should enable network resilience everywhere

My current build system often fails when a remote network / service behaves badly. 502's, host hangs up, services being down... Today, I have to add custom logic at all of these points as we discover them, or we move to replicating these remotes internally.

git clone
go mod download
docker pull
apt update
the list goes on and on...

It would be great if there was retry / expo decay options across the building blocks for these situations. Detecting which are network errors vs which are not could be difficult. Maybe some sort of retry / decay wrapper that could support rerunning an #up after checks defined in CUE (like string processing). Either way, having a consistent and reusable solution would be Grrrreat!

Also requested by @evalsocket & others in https://github.com/dagger/dagger/discussions/2052#discussioncomment-2536712

Just as another example of this, @jpadams hit a remote cache import error (failed to compute cache key: failed to copy: invalid status response 503 Egress is over the account limit) due to a 503 from GHA that failed the entire run. In general Buildkit tries to treat these errors as cache misses, but due to the way this failed Buildkit didn't. Have an issue open there now, though it's actually a pretty hard problem: https://github.com/moby/buildkit/issues/2836


The official document is [api.sandbox.push.apple.com]

The official document is api.sandbox.push.apple.com,
but the code is different
https://github.com/relayrides/pushy/blob/1254c1a2091a44fe3f89c034fc98af268c5841f8/pushy/src/main/java/com/turo/pushy/apns/ApnsClientBuilder.java#L102

Thanks for the heads-up. I wonder when this changed.


Add sriov install from subscription instead of quay

There was an issue where the CI wasn't building sr-iov to quay, which make deploy gets sr-iov from. This broke some sr-iov deployments.
This commit adds the option to install sr-iov from a subscription.

Add ExtraConfigSriovSubscription following the ocp directions
Add check_sriov_installed to confirm sr iov is installed

LGTM


Is there a way to pass types to transport function props?

Firstly, I would like to thank for such a nice much-needed library in the react-native world. Has been a breeze to set up and use.
The only thing I am not clear about is if there is a way to pass types to the custom transport function props. Currently, the props has the following type:

This means I lose the type for the log levels, the type for the msg and raw msg etc. Some transports need data filtration before sending, and doing it with anys feels a bit risky.
Is there something obvious that I am missing in the documentation?
Thank you.

You can define your own transportFunctionType interface:
interface transportFunctionType {
  (props: {
    msg: string; // set the type you have for msg
    rawMsg: Object; // set the type you have for rawMsg
    level: {
        severity: number;
        text: string;
    };
    extension: string;
    options: {
      filePath: string;
      fileName: string;
      colors: {
        info: string;
        warn: string;
        error: string;
      };
      //other typed options
    };
  }): void;
}

const myTransport: transportFunctionType = (props) => {
  consoleTransport(props);
  // other stuff
};


Add extensionScanningEnabled option to @WireMockTest.

When using extensions that utilize service loading (e.g. wiremock/wiremock-graphql-extension) it would be preferable to use the declarative option to enable extension scanning, rather than being forced to use the programmatic approach to manually define extensions.
References

https://github.com/wiremock/wiremock/pull/2561

Submitter checklist

[x] The PR request is well described and justified, including the body and the references
[x] The PR title represents the desired changelog entry
[ ] If the change against WireMock 2 functionality (incompatible with WireMock 3),
it is submitted against the 2.x branch
[x] The repository's code style is followed (see the contributing guide)

Details: Contributor Guide

Thanks!


Simplify page chooser views with class-based views

Some standalone cleanup work on the page chooser that can be reviewed independently of the generic chooser rewrites.
(After getting this far I'm not sure if it's realistic to port this to the generic chooser framework, or whether it's just too custom, but at least this is some useful refactoring while I ponder further...)

Just rebased, added changelog and pushed to branch. Will check CI runs ok and merge.


Unable to orchestrate start VM instance on fresh 4.20

I had a 4.18.x installation that worked perfectly with Linstor. VMs were created without any issues, and everything functioned flawlessly. Since this was a test environment, I decided to upgrade to 4.20. The upgrade completed successfully, with no errors encountered.
However, when I attempted to create a VM, I encountered the following error:
Unable to orchestrate start VM instance.
I assumed there might be an issue in the integration with Linstor, so I decided to perform a clean installation of 4.20. The installation went smoothly, and the configuration and settings were identical to those in 4.18. Despite this, VMs still fail to create.
When creating a VM, I see the following in the logs:
2024-12-11 17:11:19,788 DEBUG [c.c.v.ClusteredVirtualMachineManagerImpl] (Work-Job-Executor-85:[ctx-9a91bf59, job-975/job-976, ctx-e5509a97]) (logid:01094d38) Cleaning up resources for the vm VM instance {"id":267,"instanceName":"i-2-267
-VM","type":"User","uuid":"aea7fd99-a309-4599-9003-facbca54a849"} in Starting state
2024-12-11 17:11:19,801 DEBUG [c.c.v.ClusteredVirtualMachineManagerImpl] (Work-Job-Executor-85:[ctx-9a91bf59, job-975/job-976, ctx-e5509a97]) (logid:01094d38) VM instance {"id":267,"instanceName":"i-2-267-VM","type":"User","uuid":"aea7fd
99-a309-4599-9003-facbca54a849"} is a [User], returning null for control Nic IP.

Then the status changes:
2024-12-11 17:11:20,234 DEBUG [c.c.c.CapacityManagerImpl] (Work-Job-Executor-85:[ctx-9a91bf59, job-975/job-976, ctx-e5509a97]) (logid:01094d38) VM instance {"id":267,"instanceName":"i-2-267-VM","type":"User","uuid":"aea7fd99-a309-4599-90
03-facbca54a849"} state transited from [Starting] to [Stopped] with event [OperationFailed]. VM's original host: null, new host: null, host before state transition: Host {"id":2,"name":"cloud-node02","type":"Routing","uuid":"f8b0e878-2f8
2-490c-9dd1-2ba5f2dea128"}

It feels like the issue might be network-related:
2024-12-11 17:11:20,275 ERROR [c.c.v.ClusteredVirtualMachineManagerImpl] (Work-Job-Executor-85:[ctx-9a91bf59, job-975/job-976, ctx-e5509a97]) (logid:01094d38) Unable to orchestrate start VM instance {"id":267,"instanceName":"i-2-267-VM",
"type":"User","uuid":"aea7fd99-a309-4599-9003-facbca54a849"} due to [Failed to implement network id=206 as a part preparing nic id=765]

The installation was performed on AlmaLinux 9.5.
I checked the network settings, and everything appears to be in order.

can you share the full log of job job-975 ?

job-1058.txt
Hi,
I have already cleaned the log. Here is the log from the repeated VM creation attempt .Logs attached

@happyalexkg, from what I see the offering (probably that for the router) has a Host tag but the host itself doesn't
2024-12-12 14:06:03,268 DEBUG [c.c.a.m.a.i.FirstFitRoutingAllocator] (API-Job-Executor-49:[ctx-7f941ae5, job-1058, ctx-290c1bdb, FirstFitRoutingAllocator]) (logid:82bc6300) Looking for hosts having tag specified on SvcOffering:cloud

2024-12-12 14:06:05,660 ERROR [c.c.a.m.a.i.FirstFitRoutingAllocator] (Work-Job-Executor-127:[ctx-cf554c81, job-1058/job-1059, ctx-c3a2aead, FirstFitRoutingAllocator]) (logid:82bc6300) No suitable host found for vm [VM instance {"id":276,"instanceName":"r-276-VM","type":"DomainRouter","uuid":"7fd53f56-7297-4077-b121-5b2ea53659ad"}] with tags [null].

that's why it fails with the error that there are no suitable hosts

Hi,
I removed Storage tag for Software Router and seems, it's works now :)
Thank you for you support
Big Thanks

@happyalexkg, I'm unfamiliar with the host's tags and the new functionality introduced for them. But from what I saw in the code you need to set the host tag as a Rule for the host when you use it with offerings. Probably @weizhouapache could correct me if I'm wrong

yes, host tags was in offerings and hosts... but seems issue was in storage tag in Router Offering
Removing Storage Tag resolves issue with creating VM


⚠ Server02 Status has degraded performance

In a097d92, Server02 Status (https://server02.jonathanbout.dev) experienced degraded performance:

HTTP code: 403
Response time: 20880 ms

Resolved: Server02 Status performance has improved in e0a3911 after 45 minutes.


Clarify CoW library docs for Linux and Mac

For #526

Also https://github.com/microsoft/CopyOnWrite/pull/37


Remove gem's lockfile

Following the general principle of keeping lockfiles out of gem repos and clearing a security alert.

we've ripped jeweler out of several others in the past, and that's probably appropriate here. but, short of that, do you have any idea if Gemfile.lock is significant to jeweler or not?

builds for me locally. ship it. (and thank you!)


Add the new kmm.node.kubernetes.io/gc-delay finalizer to all new jobs.
Only clear the finalizer after deletionTimestamp+gcDelay.
Fixes #572
/cc @yevgeny-shnaidman @mresvanis @ybettan

/hold

@qbarrand Why is it being held?

/unhold

/lgtm