text:
Remove Multiple: False

It's gotten hard to handle which fields are allowed to be multi-valued
and which aren't. In order to deal with conflicts and make the reasoning
much easier to handle, make everything multi-valued and handle
single-valued display via the forms (SingleValuedForm).

Looks good — there's just a couple of minor things that could be nice to clean up.

Coverage remained the same at 100.0% when pulling 6f61209519ab35bbc6918f07819d09199db3c879 on remove_multiple_false into 94d4ff0fad826e132d8592cd70ead9afcba6c700 on master.

authors: coveralls escowles tpendragon

repo: pulibrary/plum


text:
修改nav bar的形式，叫做bottom navigation

像是Kindle呢？

調整Navigation bar，使其變成可以伸縮的版本？

進度條 通知 時間
Z index 2
長按呼叫
原本的樣板
Z index ?
短按關閉

source: gharchive/issue

repo: pulipulichen/PACOR

license: MIT

license_type: permissive

license_source: github-api


text:
Fix typos

My last PR introduced some minor typos. This fixes that.
(Sorry about that!)

Apologies. I should have caught these the first time.

👍

source: gharchive/pull-request

authors: abinoda mcpengelly


text:
Advanced Search Options (Attempt 2)

This PR adds some advanced search functionality.
Mainly focusing on the ability to sort packages by the different supported criteria, as well as being able to set the direction of them.
I took the feedback from #77 and moved this behavior into the pagination bar, as well as adding everything to the dropdown.
Moving this elements outside of the actual form element used to make the request to the backend, did require some additional JavaScript to do, but also has allowed a better experience ensuring the shown defaults always match with whatever is currently on the page, as well as lets us keep the default values in the form, rather than set by classes on the elements themselves.
But as for some examples of how this functionality looks:

While the menu doesn't look revolutionary, it matches exactly with our existing menu used for theme selection.

I do plan to either add to this PR, or create another, which allows us to use the more fancy advanced search features, such as filtering by extension and such, but there's a couple of technical issues to figure out to do so.

So sorry this has taken so long for me to get to. The main this is that, at least in the dev version using the example yaml, it doesn't actually seem to do anything when you change the options. I assume this isn't an issue if using all the proper setup? Otherwise any idea why it refuses to change the order of anything?
I have a few points about UI, both minor in the sense they don't affect functionality, only how it looks.
The "Sort By" list displays vertically but the "Order" list displays horizontally. I think they should probably share a single UI element here seeing as they are related. This also gives the chance to set the width of the "Order" dropdown to the same width as the "Sort By" which means that clicking between them would give the effect of keeping the dropdown "container" static and only the content and the chevron move. At the moment the box expands and contracts in width (height would be less jarring).
I would submit a screenshot and PR showing what I mean but I'm finding the tailwind styles utterly impossible to comprehend and changes don't seem to be doing anything. From the tailwind docs I want to apply flex-col to the flexbox but it is utterly defeating me...

@Daeraxa One thing to note, this doesn't change any options live. We may be able to enable this behavior, but as of now, it just modifies the parameters that will be used the next time you execute a search. Meaning if you change an option you'll have to hit search again, otherwise this may cause loading everytime you change anything, and may become annoying. But if it's not clear, then we can see about making this happen.
As for the UI, I totally agree it's weird. Worst part is, we are using the exact same styling for both elements. The difference in vertical and horizontal is just Tailwind being Tailwind. But I'll try to see what I can do to make these more similar.
Otherwise I really appreciate you taking a look!

Aah I see, honestly I think that might be a problem. Once you know about it, sure, hitting search again makes sense but that isn't at all intuitive to me. If there isn't the possibility of changing the state of the live set of results, what about adding an onClick to the sort buttons to also make it search again?

@Daeraxa You do make a really good point.
Having these buttons all down by the pagination settings makes it feel that it should be live.
And while it may be technically possible to sort these live client side, I'd rather not duplicate the logic on the frontend, when it already exists on the backend.
So in that case, I'll agree that it shouldn't be the biggest issue to live reload. Thanks a ton for this input, I'll get with these changes as soon as I can

authors: Daeraxa confused-Techie

repo: pulsar-edit/package-frontend


text:
Add info on accessing secrets in structured config

And cleanup/fix various things I noticed while making changes here.

Closing stale PR

repo: pulumi/docs


text:
Fix some broken links

Fixes a Twitter link and removes a couple of no-longer-valid iframes from a blog post.

Thanks @stack72 🍺

Thanks @stack72 🍺


text:
Configurable user-agent

Hello!

Vote on this issue by adding a 👍 reaction
If you want to implement this feature, comment to let us know (we'll work with you on design, scheduling, etc.)

Issue details

The work has been done here:
https://github.com/cloudflare/terraform-provider-cloudflare/pull/2816
Consider adopting this as a patch.
Affected area/feature

Dupe of https://github.com/pulumi/pulumi-cloudflare/issues/179

repo: pulumi/pulumi-cloudflare


text:
Add flag to disable logging stdout and stderr

Resolves #401
This PR adds a flag to both the local and the remote Command resource, allowing the user to opt out of logging the command's output. This is useful when the command may contain secrets, or when it's simply too verbose.
Implementation notes:

The test for the remote Command uses github.com/gliderlabs/ssh to spin up an in-process SSH server to be able to unit test command execution.
I extracted some of the repeated input property definitions into common/inputs.go.

I agree with @flostadler on the API design. Maybe we should make it an enum so we can add "stdout-only" and "stderr-only" variants at need.

Smells like YAGNI to me, but I'll give it a shot.

repo: pulumi/pulumi-command


text:
There's no Import section

File: themes/default/content/registry/packages/libvirt/api-docs/pool/_index.md
There's no explanation of how to import this resource

We generate this provider from github.com/dmacvicar/terraform-provider-libvirt, so our docs only contain what upstream's docs contain, and they don't have an import section either. If they add one, we will pick it up on their next release.

authors: aes iwahbe

repo: pulumi/pulumi-libvirt


text:
Failed to publish to NPM

We failed to publish v0.1.0 to NPM.

NPM did publish, it just marked the package as private. The fix was to go into the UI and mark the package as public.

repo: pulumi/pulumi-meraki


text:
Change references to ofirehose.com

Due https://ofirehose.com is down for a while and is promoting a kind of centralized service we should change the default option and suggestions from https://ofirehose.com to something like https://ofirehose.yourdomain.com, the documentation must be updated to redirect to the ofirehose repo and invite to install an instance.
also in my instance and like others, we live without ofirehose, so we should remove if from sample configuration in order to facilitate initial understanding because currently not exist stable public ofirehose services.
Related: https://github.com/pump-io/pump.io/issues/1698

I see... This helps a lot! Thanks!

authors: prologic vxcamiloxv

license_source: bigquery


text:
Apostrophe 06 : Context Menu

Greetings,
I've noticed when you add a substantial amount of items to the Context Menu,
They seem to fall below the green bar and become visually unnoticeable.
Is it possible to add multiple context menus ?
Is it possible to make a css update that would allow the bar to grow and possibly drop to the next line with the additional context menu items.

Yes, it's a problem.
You can copy and paste the markup and build your own menus; only the data
attributes really matter. But we need to work on a convenient way to merge
some menus of related content.
On Thu, Jul 28, 2016 at 6:20 PM, Ryan Watts notifications@github.com
wrote:

Greetings,
I've noticed when you add a substantial amount of items to the Context
Menu,
They seem to fall below the green bar and become visually unnoticeable.
Is it possible to add multiple context menus ?
Is it possible to make a css update that would allow the bar to grow and
possibly drop to the next line with the additional context menu items.
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/punkave/apostrophe/issues/620, or mute the thread
https://github.com/notifications/unsubscribe-auth/AAB9fXXYd6Qtk67n_yLBWztCWnYwcZN3ks5qaSsugaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330  |  punkave.com

Makes sense. Thank you.

Thank you for the nudge!
Our notes from an internal conversation about how we'd like to implement
this:
yeah… so something like this would be minimum config to merge two items:
'apostrophe-admin-bar': {
  merge: [
    [ ‘apostrophe-users’, ‘apostrophe-groups’ ]
  ]
}

Now these two are a dropdown. The parent item on the admin bar is labeled
“Users,” and there are two choices on the dropdown, “Users” and “Groups.”
Everything else that registers with the admin bar module just shows up as
an admin bar item that directly triggers a “Manage” view.
By convention, the name of an admin bar item would be the name of the
module that registered it, unless it needs to register more than one.
Items show up in the order they are registered; if they are merged, the
combined item shows up where the first one would have been, with its kids
in the order they were registered.
of course, you might want to futz with the order, because stuff like blog
or events is going to register late but be really important to some sites:
'apostrophe-admin-bar’: {
  order: [ 'apostrophe-blog’, ‘apostrophe-events’ ]
}

Anything not specified by order goes to the end of the admin bar, in
registration order.
"what about throwing something arbitrary in? I know of a couple projects
that have like a Sync button that hits a route and does magic project level
stuff"
future... })```

That would register a button with a `data-apos-admin-bar-item=“sync-magic”`
attribute, something like that. Adding a jquery click handler browser side
to power it would be up to you, using apos.ui.link or using jquery directly.

Under the hood, the standard modules would all be calling
`apos.adminBar.add(self.__meta.name)` to register their buttons, and
setting up matching handlers browser-side.

Pieces would do this in the base class so you never had to think about it
when subclassing them

So anything that’s been added via `adminBar.add`, you can order and group.

On Thu, Jul 28, 2016 at 8:23 PM, Ryan Watts <notifications@github.com>
wrote:

> Makes sense. Thank you.
>
> —
> You are receiving this because you commented.
> Reply to this email directly, view it on GitHub
> <https://github.com/punkave/apostrophe/issues/620#issuecomment-236063167>,
> or mute the thread
> <https://github.com/notifications/unsubscribe-auth/AAB9fZPTnSMnuYMVu5GtQNnc8EMWRE06ks5qaUgXgaJpZM4JXs5D>
> .
>

--

*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330  |  punkave.com

That's awesome Tom.
Thank you for sharing this.

On Aug 4, 2016, at 11:12 AM, Tom Boutell notifications@github.com wrote:
Thank you for the nudge!
Our notes from an internal conversation about how we'd like to implement
this:
yeah… so something like this would be minimum config to merge two items:
'apostrophe-admin-bar': {
merge: [
[ ‘apostrophe-users’, ‘apostrophe-groups’ ]
]
}

Now these two are a dropdown. The parent item on the admin bar is labeled
“Users,” and there are two choices on the dropdown, “Users” and “Groups.”
Everything else that registers with the admin bar module just shows up as
an admin bar item that directly triggers a “Manage” view.
By convention, the name of an admin bar item would be the name of the
module that registered it, unless it needs to register more than one.
Items show up in the order they are registered; if they are merged, the
combined item shows up where the first one would have been, with its kids
in the order they were registered.
of course, you might want to futz with the order, because stuff like blog
or events is going to register late but be really important to some sites:
'apostrophe-admin-bar’: {
order: [ 'apostrophe-blog’, ‘apostrophe-events’ ]
}

Anything not specified by order goes to the end of the admin bar, in
registration order.
"what about throwing something arbitrary in? I know of a couple projects
that have like a Sync button that hits a route and does magic project level
stuff"
future... })```

That would register a button with a `data-apos-admin-bar-item=“sync-magic”`
attribute, something like that. Adding a jquery click handler browser side
to power it would be up to you, using apos.ui.link or using jquery directly.

Under the hood, the standard modules would all be calling
`apos.adminBar.add(self.__meta.name)` to register their buttons, and
setting up matching handlers browser-side.

Pieces would do this in the base class so you never had to think about it
when subclassing them

So anything that’s been added via `adminBar.add`, you can order and group.

On Thu, Jul 28, 2016 at 8:23 PM, Ryan Watts <notifications@github.com>
wrote:

> Makes sense. Thank you.
>
> —
> You are receiving this because you commented.
> Reply to this email directly, view it on GitHub
> <https://github.com/punkave/apostrophe/issues/620#issuecomment-236063167>,
> or mute the thread
> <https://github.com/notifications/unsubscribe-auth/AAB9fZPTnSMnuYMVu5GtQNnc8EMWRE06ks5qaUgXgaJpZM4JXs5D>
> .
>

--

*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330 | punkave.com
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub, or mute the thread.

This is currently possible or this discussion is what's to come ?

What's to come. Shouldn't be long!
On Fri, Aug 5, 2016 at 12:27 PM, Ryan Watts notifications@github.com
wrote:

This is currently possible or this discussion is what's to come ?
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/punkave/apostrophe/issues/620#issuecomment-237896997,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AAB9fXl4ZyB7K3mggkD9hNGuMnQmIRKrks5qc2SGgaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330  |  punkave.com

Still working through this...
After discussion with @stuartromanek merge will be changing to dropdowns and addDropdowns will be added as an alternative that doesn't remove existing dropdowns created by modules.
This way you can redo them all at project level or leave some alone.
Also there will be a dropdown method that modules can call to establish a dropdown.
And, the array of dropdowns can contain objects with label and items properties for those cases where the ideal label is not the label of the first item in the dropdown.
Using the word dropdown rather than merge avoids giving the impression that dropdowns are only for merging related functionality under the name of the first item, which is not true (consider the "account" menu, which has "edit account" and "logout").

Tom, can you paste an example of what a possible config might look like with the above change?

This is Awesome nice work guys !
On Thu, Aug 11, 2016, 8:27 AM Tom Boutell notifications@github.com wrote:

Still working through this...
After discussion with @stuartromanek https://github.com/stuartromanek
merge will be changing to dropdowns and addDropdowns will be added as an
alternative that doesn't remove existing dropdowns created by modules.
This way you can redo them all at project level or leave some alone.
Also there will be a dropdown method that modules can call to establish a
dropdown.
And, the array of dropdowns can contain objects with label and items
properties for those cases where the ideal label is not the label of the
first item in the dropdown.
Using the word dropdown rather than merge avoids giving the impression
that dropdowns are only for merging related functionality under the name of
the first item, which is not true (consider the "account" menu, which has
"edit account" and "logout").
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/punkave/apostrophe/issues/620#issuecomment-239196516,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AFFsSaw1JMC55UpCV4DHptkYy1nUPtVlks5qez9_gaJpZM4JXs5D
.

The most common case now would look like:
    'apostrophe-admin-bar': {
      addDropdowns: [
        [ 'apostrophe-users', 'apostrophe-groups' ],
        [ 'apostrophe-files', 'apostrophe-images' ]
      ]
    }

This would also be allowed:
'apostrophe-admin-bar': {
  addDropdowns: [
    [ 'apostrophe-users', 'apostrophe-groups' ],
    [ 'apostrophe-files', 'apostrophe-images' ],
    [ { label: 'Account', items: [ 'apostrophe-login-edit-account',

'apostrophe-login-logout' ] } ]
]
}
And in practice the login module (or whoever) would be able to call
"self.apos.adminBar.dropdown()" to set that last one up for you, so you
wouldn't bother.
However if you really wanted to blow it out and have only exactly the
dropdowns you configure at project level you'd just use the dropdowns
option instead of addDropdowns.
On Thu, Aug 11, 2016 at 11:39 AM, Ryan Watts notifications@github.com
wrote:

This is Awesome nice work guys !
On Thu, Aug 11, 2016, 8:27 AM Tom Boutell notifications@github.com
wrote:

Still working through this...
After discussion with @stuartromanek https://github.com/stuartromanek
merge will be changing to dropdowns and addDropdowns will be added as an
alternative that doesn't remove existing dropdowns created by modules.
This way you can redo them all at project level or leave some alone.
Also there will be a dropdown method that modules can call to establish a
dropdown.
And, the array of dropdowns can contain objects with label and items
properties for those cases where the ideal label is not the label of the
first item in the dropdown.
Using the word dropdown rather than merge avoids giving the impression
that dropdowns are only for merging related functionality under the name
of
the first item, which is not true (consider the "account" menu, which has
"edit account" and "logout").
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<https://github.com/punkave/apostrophe/issues/620#issuecomment-239196516
,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/
AFFsSaw1JMC55UpCV4DHptkYy1nUPtVlks5qez9_gaJpZM4JXs5D>
.

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/punkave/apostrophe/issues/620#issuecomment-239200028,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AAB9ff2mgH9kQqv-ofu-FHCRnipZ_0Cvks5qe0IjgaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330  |  punkave.com

Thsts pretty slick. Definitely looking forward . could you reference this
commit when that logic is in place.  Id love to take a look under the hood
and see what exactly had to be done to make this improvement.
On Thu, Aug 11, 2016, 9:12 AM Tom Boutell notifications@github.com wrote:

The most common case now would look like:
'apostrophe-admin-bar': {
addDropdowns: [
[ 'apostrophe-users', 'apostrophe-groups' ],
[ 'apostrophe-files', 'apostrophe-images' ]
]
}

This would also be allowed:
'apostrophe-admin-bar': {
addDropdowns: [
[ 'apostrophe-users', 'apostrophe-groups' ],
[ 'apostrophe-files', 'apostrophe-images' ],
[ { label: 'Account', items: [ 'apostrophe-login-edit-account',
'apostrophe-login-logout' ] } ]
]
}
And in practice the login module (or whoever) would be able to call
"self.apos.adminBar.dropdown()" to set that last one up for you, so you
wouldn't bother.
However if you really wanted to blow it out and have only exactly the
dropdowns you configure at project level you'd just use the dropdowns
option instead of addDropdowns.
On Thu, Aug 11, 2016 at 11:39 AM, Ryan Watts notifications@github.com
wrote:

This is Awesome nice work guys !
On Thu, Aug 11, 2016, 8:27 AM Tom Boutell notifications@github.com
wrote:

Still working through this...
After discussion with @stuartromanek <https://github.com/stuartromanek

merge will be changing to dropdowns and addDropdowns will be added as
an
alternative that doesn't remove existing dropdowns created by modules.
This way you can redo them all at project level or leave some alone.
Also there will be a dropdown method that modules can call to
establish a
dropdown.
And, the array of dropdowns can contain objects with label and items
properties for those cases where the ideal label is not the label of
the
first item in the dropdown.
Using the word dropdown rather than merge avoids giving the impression
that dropdowns are only for merging related functionality under the
name
of
the first item, which is not true (consider the "account" menu, which
has
"edit account" and "logout").
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<
https://github.com/punkave/apostrophe/issues/620#issuecomment-239196516
,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/
AFFsSaw1JMC55UpCV4DHptkYy1nUPtVlks5qez9_gaJpZM4JXs5D>
.

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<https://github.com/punkave/apostrophe/issues/620#issuecomment-239200028
,
or mute the thread
<
https://github.com/notifications/unsubscribe-auth/AAB9ff2mgH9kQqv-ofu-FHCRnipZ_0Cvks5qe0IjgaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330 | punkave.com
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/punkave/apostrophe/issues/620#issuecomment-239209982,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AFFsSSsZrzS1VUvEhsB_Eo0zCK1mnhl-ks5qe0nWgaJpZM4JXs5D
.

Hey Ryan, I'd like to invite you to join our Apostrophe developer directory:
https://tomboutell1.typeform.com/to/NeqckD
We're going to make a public list of developers who work with Apostrophe
available, to help communicate that there's no "vendor lock-in" when you
work with us (or with others) as a client. Should be a nice source of work
for everyone concerned.
Thanks!
On Thu, Aug 11, 2016 at 12:16 PM, Ryan Watts notifications@github.com
wrote:

Thsts pretty slick. Definitely looking forward . could you reference this
commit when that logic is in place. Id love to take a look under the hood
and see what exactly had to be done to make this improvement.
On Thu, Aug 11, 2016, 9:12 AM Tom Boutell notifications@github.com
wrote:

The most common case now would look like:
'apostrophe-admin-bar': {
addDropdowns: [
[ 'apostrophe-users', 'apostrophe-groups' ],
[ 'apostrophe-files', 'apostrophe-images' ]
]
}

This would also be allowed:
'apostrophe-admin-bar': {
addDropdowns: [
[ 'apostrophe-users', 'apostrophe-groups' ],
[ 'apostrophe-files', 'apostrophe-images' ],
[ { label: 'Account', items: [ 'apostrophe-login-edit-account',
'apostrophe-login-logout' ] } ]
]
}
And in practice the login module (or whoever) would be able to call
"self.apos.adminBar.dropdown()" to set that last one up for you, so you
wouldn't bother.
However if you really wanted to blow it out and have only exactly the
dropdowns you configure at project level you'd just use the dropdowns
option instead of addDropdowns.
On Thu, Aug 11, 2016 at 11:39 AM, Ryan Watts notifications@github.com
wrote:

This is Awesome nice work guys !
On Thu, Aug 11, 2016, 8:27 AM Tom Boutell notifications@github.com
wrote:

Still working through this...
After discussion with @stuartromanek <https://github.com/
stuartromanek

merge will be changing to dropdowns and addDropdowns will be added as
an
alternative that doesn't remove existing dropdowns created by
modules.
This way you can redo them all at project level or leave some alone.
Also there will be a dropdown method that modules can call to
establish a
dropdown.
And, the array of dropdowns can contain objects with label and items
properties for those cases where the ideal label is not the label of
the
first item in the dropdown.
Using the word dropdown rather than merge avoids giving the
impression
that dropdowns are only for merging related functionality under the
name
of
the first item, which is not true (consider the "account" menu, which
has
"edit account" and "logout").
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<
https://github.com/punkave/apostrophe/issues/620#issuecomment-239196516
,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/
AFFsSaw1JMC55UpCV4DHptkYy1nUPtVlks5qez9_gaJpZM4JXs5D>
.

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<https://github.com/punkave/apostrophe/issues/620#
issuecomment-239200028
,
or mute the thread
<
https://github.com/notifications/unsubscribe-auth/AAB9ff2mgH9kQqv-ofu-
FHCRnipZ_0Cvks5qe0IjgaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330 | punkave.com
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<https://github.com/punkave/apostrophe/issues/620#issuecomment-239209982
,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AFFsSSsZrzS1VUvEhsB_
Eo0zCK1mnhl-ks5qe0nWgaJpZM4JXs5D>
.

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/punkave/apostrophe/issues/620#issuecomment-239211166,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AAB9fXvIw4XAUElCxIUQnZsEF2PdIKZQks5qe0rWgaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330  |  punkave.com

Thank you Tom.  Id be honored to join.
On Thu, Aug 11, 2016, 3:31 PM Tom Boutell notifications@github.com wrote:

Hey Ryan, I'd like to invite you to join our Apostrophe developer
directory:
https://tomboutell1.typeform.com/to/NeqckD
We're going to make a public list of developers who work with Apostrophe
available, to help communicate that there's no "vendor lock-in" when you
work with us (or with others) as a client. Should be a nice source of work
for everyone concerned.
Thanks!
On Thu, Aug 11, 2016 at 12:16 PM, Ryan Watts notifications@github.com
wrote:

Thsts pretty slick. Definitely looking forward . could you reference this
commit when that logic is in place. Id love to take a look under the hood
and see what exactly had to be done to make this improvement.
On Thu, Aug 11, 2016, 9:12 AM Tom Boutell notifications@github.com
wrote:

The most common case now would look like:
'apostrophe-admin-bar': {
addDropdowns: [
[ 'apostrophe-users', 'apostrophe-groups' ],
[ 'apostrophe-files', 'apostrophe-images' ]
]
}

This would also be allowed:
'apostrophe-admin-bar': {
addDropdowns: [
[ 'apostrophe-users', 'apostrophe-groups' ],
[ 'apostrophe-files', 'apostrophe-images' ],
[ { label: 'Account', items: [ 'apostrophe-login-edit-account',
'apostrophe-login-logout' ] } ]
]
}
And in practice the login module (or whoever) would be able to call
"self.apos.adminBar.dropdown()" to set that last one up for you, so you
wouldn't bother.
However if you really wanted to blow it out and have only exactly the
dropdowns you configure at project level you'd just use the dropdowns
option instead of addDropdowns.
On Thu, Aug 11, 2016 at 11:39 AM, Ryan Watts <notifications@github.com

wrote:

This is Awesome nice work guys !
On Thu, Aug 11, 2016, 8:27 AM Tom Boutell notifications@github.com
wrote:

Still working through this...
After discussion with @stuartromanek <https://github.com/
stuartromanek

merge will be changing to dropdowns and addDropdowns will be added
as
an
alternative that doesn't remove existing dropdowns created by
modules.
This way you can redo them all at project level or leave some
alone.
Also there will be a dropdown method that modules can call to
establish a
dropdown.
And, the array of dropdowns can contain objects with label and
items
properties for those cases where the ideal label is not the label
of
the
first item in the dropdown.
Using the word dropdown rather than merge avoids giving the
impression
that dropdowns are only for merging related functionality under the
name
of
the first item, which is not true (consider the "account" menu,
which
has
"edit account" and "logout").
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<

https://github.com/punkave/apostrophe/issues/620#issuecomment-239196516

,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/
AFFsSaw1JMC55UpCV4DHptkYy1nUPtVlks5qez9_gaJpZM4JXs5D>
.

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<https://github.com/punkave/apostrophe/issues/620#
issuecomment-239200028
,
or mute the thread
<
https://github.com/notifications/unsubscribe-auth/AAB9ff2mgH9kQqv-ofu-
FHCRnipZ_0Cvks5qe0IjgaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330 | punkave.com
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<
https://github.com/punkave/apostrophe/issues/620#issuecomment-239209982
,
or mute the thread
<
https://github.com/notifications/unsubscribe-auth/AFFsSSsZrzS1VUvEhsB_
Eo0zCK1mnhl-ks5qe0nWgaJpZM4JXs5D>
.

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<https://github.com/punkave/apostrophe/issues/620#issuecomment-239211166
,
or mute the thread
<
https://github.com/notifications/unsubscribe-auth/AAB9fXvIw4XAUElCxIUQnZsEF2PdIKZQks5qe0rWgaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330 | punkave.com
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/punkave/apostrophe/issues/620#issuecomment-239313386,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AFFsSQIhTew1vx4Mn-Dwkfj309_Znt8_ks5qe6K_gaJpZM4JXs5D
.

Thanks for the listing!
On Thu, Aug 11, 2016 at 6:33 PM, Ryan Watts notifications@github.com
wrote:

Thank you Tom. Id be honored to join.
On Thu, Aug 11, 2016, 3:31 PM Tom Boutell notifications@github.com
wrote:

Hey Ryan, I'd like to invite you to join our Apostrophe developer
directory:
https://tomboutell1.typeform.com/to/NeqckD
We're going to make a public list of developers who work with Apostrophe
available, to help communicate that there's no "vendor lock-in" when you
work with us (or with others) as a client. Should be a nice source of
work
for everyone concerned.
Thanks!
On Thu, Aug 11, 2016 at 12:16 PM, Ryan Watts notifications@github.com
wrote:

Thsts pretty slick. Definitely looking forward . could you reference
this
commit when that logic is in place. Id love to take a look under the
hood
and see what exactly had to be done to make this improvement.
On Thu, Aug 11, 2016, 9:12 AM Tom Boutell notifications@github.com
wrote:

The most common case now would look like:
'apostrophe-admin-bar': {
addDropdowns: [
[ 'apostrophe-users', 'apostrophe-groups' ],
[ 'apostrophe-files', 'apostrophe-images' ]
]
}

This would also be allowed:
'apostrophe-admin-bar': {
addDropdowns: [
[ 'apostrophe-users', 'apostrophe-groups' ],
[ 'apostrophe-files', 'apostrophe-images' ],
[ { label: 'Account', items: [ 'apostrophe-login-edit-account',
'apostrophe-login-logout' ] } ]
]
}
And in practice the login module (or whoever) would be able to call
"self.apos.adminBar.dropdown()" to set that last one up for you, so
you
wouldn't bother.
However if you really wanted to blow it out and have only exactly the
dropdowns you configure at project level you'd just use the
dropdowns
option instead of addDropdowns.
On Thu, Aug 11, 2016 at 11:39 AM, Ryan Watts <
notifications@github.com

wrote:

This is Awesome nice work guys !
On Thu, Aug 11, 2016, 8:27 AM Tom Boutell <
notifications@github.com>
wrote:

Still working through this...
After discussion with @stuartromanek <https://github.com/
stuartromanek

merge will be changing to dropdowns and addDropdowns will be
added
as
an
alternative that doesn't remove existing dropdowns created by
modules.
This way you can redo them all at project level or leave some
alone.
Also there will be a dropdown method that modules can call to
establish a
dropdown.
And, the array of dropdowns can contain objects with label and
items
properties for those cases where the ideal label is not the label
of
the
first item in the dropdown.
Using the word dropdown rather than merge avoids giving the
impression
that dropdowns are only for merging related functionality under
the
name
of
the first item, which is not true (consider the "account" menu,
which
has
"edit account" and "logout").
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<

https://github.com/punkave/apostrophe/issues/620#issuecomment-239196516

,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/
AFFsSaw1JMC55UpCV4DHptkYy1nUPtVlks5qez9_gaJpZM4JXs5D>
.

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<https://github.com/punkave/apostrophe/issues/620#
issuecomment-239200028
,
or mute the thread
<
https://github.com/notifications/unsubscribe-
auth/AAB9ff2mgH9kQqv-ofu-
FHCRnipZ_0Cvks5qe0IjgaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330 | punkave.com
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<
https://github.com/punkave/apostrophe/issues/620#issuecomment-239209982
,
or mute the thread
<
https://github.com/notifications/unsubscribe-auth/AFFsSSsZrzS1VUvEhsB_
Eo0zCK1mnhl-ks5qe0nWgaJpZM4JXs5D>
.

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<https://github.com/punkave/apostrophe/issues/620#
issuecomment-239211166
,
or mute the thread
<
https://github.com/notifications/unsubscribe-auth/
AAB9fXvIw4XAUElCxIUQnZsEF2PdIKZQks5qe0rWgaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330 | punkave.com
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<https://github.com/punkave/apostrophe/issues/620#issuecomment-239313386
,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AFFsSQIhTew1vx4Mn-
Dwkfj309_Znt8_ks5qe6K_gaJpZM4JXs5D>
.

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/punkave/apostrophe/issues/620#issuecomment-239313830,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AAB9fUTBjHvPWCT4-JO1f7tE3GmN_Y_Fks5qe6M5gaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330  |  punkave.com

Tom would you be willing to shoot me an email directly I have an internal
question is prefer to keep out of the repo .
On Thu, Aug 11, 2016, 3:40 PM Tom Boutell notifications@github.com wrote:

Thanks for the listing!
On Thu, Aug 11, 2016 at 6:33 PM, Ryan Watts notifications@github.com
wrote:

Thank you Tom. Id be honored to join.
On Thu, Aug 11, 2016, 3:31 PM Tom Boutell notifications@github.com
wrote:

Hey Ryan, I'd like to invite you to join our Apostrophe developer
directory:
https://tomboutell1.typeform.com/to/NeqckD
We're going to make a public list of developers who work with
Apostrophe
available, to help communicate that there's no "vendor lock-in" when
you
work with us (or with others) as a client. Should be a nice source of
work
for everyone concerned.
Thanks!
On Thu, Aug 11, 2016 at 12:16 PM, Ryan Watts <notifications@github.com

wrote:

Thsts pretty slick. Definitely looking forward . could you reference
this
commit when that logic is in place. Id love to take a look under the
hood
and see what exactly had to be done to make this improvement.
On Thu, Aug 11, 2016, 9:12 AM Tom Boutell notifications@github.com
wrote:

The most common case now would look like:
'apostrophe-admin-bar': {
addDropdowns: [
[ 'apostrophe-users', 'apostrophe-groups' ],
[ 'apostrophe-files', 'apostrophe-images' ]
]
}

This would also be allowed:
'apostrophe-admin-bar': {
addDropdowns: [
[ 'apostrophe-users', 'apostrophe-groups' ],
[ 'apostrophe-files', 'apostrophe-images' ],
[ { label: 'Account', items: [ 'apostrophe-login-edit-account',
'apostrophe-login-logout' ] } ]
]
}
And in practice the login module (or whoever) would be able to call
"self.apos.adminBar.dropdown()" to set that last one up for you, so
you
wouldn't bother.
However if you really wanted to blow it out and have only exactly
the
dropdowns you configure at project level you'd just use the
dropdowns
option instead of addDropdowns.
On Thu, Aug 11, 2016 at 11:39 AM, Ryan Watts <
notifications@github.com

wrote:

This is Awesome nice work guys !
On Thu, Aug 11, 2016, 8:27 AM Tom Boutell <
notifications@github.com>
wrote:

Still working through this...
After discussion with @stuartromanek <https://github.com/
stuartromanek

merge will be changing to dropdowns and addDropdowns will be
added
as
an
alternative that doesn't remove existing dropdowns created by
modules.
This way you can redo them all at project level or leave some
alone.
Also there will be a dropdown method that modules can call to
establish a
dropdown.
And, the array of dropdowns can contain objects with label and
items
properties for those cases where the ideal label is not the
label
of
the
first item in the dropdown.
Using the word dropdown rather than merge avoids giving the
impression
that dropdowns are only for merging related functionality under
the
name
of
the first item, which is not true (consider the "account" menu,
which
has
"edit account" and "logout").
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<

https://github.com/punkave/apostrophe/issues/620#issuecomment-239196516

,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/
AFFsSaw1JMC55UpCV4DHptkYy1nUPtVlks5qez9_gaJpZM4JXs5D>
.

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<https://github.com/punkave/apostrophe/issues/620#
issuecomment-239200028
,
or mute the thread
<
https://github.com/notifications/unsubscribe-
auth/AAB9ff2mgH9kQqv-ofu-
FHCRnipZ_0Cvks5qe0IjgaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330 | punkave.com
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<

https://github.com/punkave/apostrophe/issues/620#issuecomment-239209982

,
or mute the thread
<
https://github.com/notifications/unsubscribe-auth/AFFsSSsZrzS1VUvEhsB_
Eo0zCK1mnhl-ks5qe0nWgaJpZM4JXs5D>
.

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<https://github.com/punkave/apostrophe/issues/620#
issuecomment-239211166
,
or mute the thread
<
https://github.com/notifications/unsubscribe-auth/
AAB9fXvIw4XAUElCxIUQnZsEF2PdIKZQks5qe0rWgaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330 | punkave.com
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<
https://github.com/punkave/apostrophe/issues/620#issuecomment-239313386
,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AFFsSQIhTew1vx4Mn-
Dwkfj309_Znt8_ks5qe6K_gaJpZM4JXs5D>
.

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<https://github.com/punkave/apostrophe/issues/620#issuecomment-239313830
,
or mute the thread
<
https://github.com/notifications/unsubscribe-auth/AAB9fUTBjHvPWCT4-JO1f7tE3GmN_Y_Fks5qe6M5gaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330 | punkave.com
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/punkave/apostrophe/issues/620#issuecomment-239315037,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AFFsSRkTnGvonqlcGIEdzNZi-AbMqtZbks5qe6TCgaJpZM4JXs5D
.

ryandwatts@gmail.com
On Thu, Aug 11, 2016, 3:52 PM Ryan Watts ryandwatts@gmail.com wrote:

Tom would you be willing to shoot me an email directly I have an internal
question is prefer to keep out of the repo .
On Thu, Aug 11, 2016, 3:40 PM Tom Boutell notifications@github.com
wrote:

Thanks for the listing!
On Thu, Aug 11, 2016 at 6:33 PM, Ryan Watts notifications@github.com
wrote:

Thank you Tom. Id be honored to join.
On Thu, Aug 11, 2016, 3:31 PM Tom Boutell notifications@github.com
wrote:

Hey Ryan, I'd like to invite you to join our Apostrophe developer
directory:
https://tomboutell1.typeform.com/to/NeqckD
We're going to make a public list of developers who work with
Apostrophe
available, to help communicate that there's no "vendor lock-in" when
you
work with us (or with others) as a client. Should be a nice source of
work
for everyone concerned.
Thanks!
On Thu, Aug 11, 2016 at 12:16 PM, Ryan Watts <
notifications@github.com>
wrote:

Thsts pretty slick. Definitely looking forward . could you reference
this
commit when that logic is in place. Id love to take a look under the
hood
and see what exactly had to be done to make this improvement.
On Thu, Aug 11, 2016, 9:12 AM Tom Boutell <notifications@github.com

wrote:

The most common case now would look like:
'apostrophe-admin-bar': {
addDropdowns: [
[ 'apostrophe-users', 'apostrophe-groups' ],
[ 'apostrophe-files', 'apostrophe-images' ]
]
}

This would also be allowed:
'apostrophe-admin-bar': {
addDropdowns: [
[ 'apostrophe-users', 'apostrophe-groups' ],
[ 'apostrophe-files', 'apostrophe-images' ],
[ { label: 'Account', items: [ 'apostrophe-login-edit-account',
'apostrophe-login-logout' ] } ]
]
}
And in practice the login module (or whoever) would be able to
call
"self.apos.adminBar.dropdown()" to set that last one up for you,
so
you
wouldn't bother.
However if you really wanted to blow it out and have only exactly
the
dropdowns you configure at project level you'd just use the
dropdowns
option instead of addDropdowns.
On Thu, Aug 11, 2016 at 11:39 AM, Ryan Watts <
notifications@github.com

wrote:

This is Awesome nice work guys !
On Thu, Aug 11, 2016, 8:27 AM Tom Boutell <
notifications@github.com>
wrote:

Still working through this...
After discussion with @stuartromanek <https://github.com/
stuartromanek

merge will be changing to dropdowns and addDropdowns will be
added
as
an
alternative that doesn't remove existing dropdowns created by
modules.
This way you can redo them all at project level or leave some
alone.
Also there will be a dropdown method that modules can call to
establish a
dropdown.
And, the array of dropdowns can contain objects with label and
items
properties for those cases where the ideal label is not the
label
of
the
first item in the dropdown.
Using the word dropdown rather than merge avoids giving the
impression
that dropdowns are only for merging related functionality
under
the
name
of
the first item, which is not true (consider the "account"
menu,
which
has
"edit account" and "logout").
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<

https://github.com/punkave/apostrophe/issues/620#issuecomment-239196516

,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/
AFFsSaw1JMC55UpCV4DHptkYy1nUPtVlks5qez9_gaJpZM4JXs5D>
.

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<https://github.com/punkave/apostrophe/issues/620#
issuecomment-239200028
,
or mute the thread
<
https://github.com/notifications/unsubscribe-
auth/AAB9ff2mgH9kQqv-ofu-
FHCRnipZ_0Cvks5qe0IjgaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330 | punkave.com
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<

https://github.com/punkave/apostrophe/issues/620#issuecomment-239209982

,
or mute the thread
<

https://github.com/notifications/unsubscribe-auth/AFFsSSsZrzS1VUvEhsB_

Eo0zCK1mnhl-ks5qe0nWgaJpZM4JXs5D>

.

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<https://github.com/punkave/apostrophe/issues/620#
issuecomment-239211166
,
or mute the thread
<
https://github.com/notifications/unsubscribe-auth/
AAB9fXvIw4XAUElCxIUQnZsEF2PdIKZQks5qe0rWgaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330 | punkave.com
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<
https://github.com/punkave/apostrophe/issues/620#issuecomment-239313386
,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AFFsSQIhTew1vx4Mn-
Dwkfj309_Znt8_ks5qe6K_gaJpZM4JXs5D>
.

—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<
https://github.com/punkave/apostrophe/issues/620#issuecomment-239313830>,
or mute the thread
<
https://github.com/notifications/unsubscribe-auth/AAB9fUTBjHvPWCT4-JO1f7tE3GmN_Y_Fks5qe6M5gaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330 | punkave.com
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/punkave/apostrophe/issues/620#issuecomment-239315037,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AFFsSRkTnGvonqlcGIEdzNZi-AbMqtZbks5qe6TCgaJpZM4JXs5D
.

Tom, I'd like to discuss further whether dropdown is the best name. I'm specifically wondering if it's a best practice for the parameters in our configuration files to imply specific UI elements.

I kind of thought you might say that (:
While I never liked not calling the tabs tabs... that is a settled argument.
I think "groups" and "addGroups" would be suitably neutral and still clear
in its intent. OK with you?
On Fri, Aug 12, 2016 at 10:17 AM, Alex Gilbert notifications@github.com
wrote:

Tom, I'd like to discuss further whether dropdown is the best name. I'm
specifically wondering if it's a best practice for the parameters in our
configuration files to imply specific UI elements.
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
https://github.com/punkave/apostrophe/issues/620#issuecomment-239458231,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AAB9fce-fYal8R60Q46lAh9GwCEVp6rVks5qfIBdgaJpZM4JXs5D
.

--
*THOMAS BOUTELL, *SUPPORT LEAD
P'UNK AVENUE | (215) 755-1330  |  punkave.com

authors: agilbert boutell rwatts3

repo: punkave/apostrophe

license: mit


text:
[Feature]: Is there way to validate margins for different page formats & custom page dimensions

Feature description
Puppeteer throws error ProtocolError: Protocol error (Page.printToPDF): invalid print parameters: content area is empty ... when we use invalid margins, is there way to validate margins gracefully?? @OrKoN @jrandolf @Lightning00Blade
Error message:
ProtocolError: Protocol error (Page.printToPDF): invalid print parameters: content area is empty
    at <instance_members_initializer> (.../node_modules/puppeteer-core/lib/esm/puppeteer/common/CallbackRegistry.js:92:14)
    at new Callback (.../node_modules/puppeteer-core/lib/esm/puppeteer/common/CallbackRegistry.js:96:16)
    at CallbackRegistry.create (.../node_modules/puppeteer-core/lib/esm/puppeteer/common/CallbackRegistry.js:29:26)
    at Connection._rawSend (.../node_modules/puppeteer-core/lib/esm/puppeteer/cdp/Connection.js:88:26)
    at CdpCDPSession.send (.../node_modules/puppeteer-core/lib/esm/puppeteer/cdp/CDPSession.js:75:33)
    at CdpPage.createPDFStream (.../node_modules/puppeteer-core/lib/esm/puppeteer/cdp/Page.js:820:63)
    at CdpPage.pdf (.../node_modules/puppeteer-core/lib/esm/puppeteer/cdp/Page.js:847:37)
    at .../t.js:20:14
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

Example code:
 // const puppeteer = require('puppeteer');
import puppeteer from 'puppeteer';
puppeteer.PDFOptions;
try {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  const htmlContent = `<html><body><h1>Margin Test for a4</h1></body></html>`;
  await page.setContent(htmlContent);
  const pdfOptions = {
    margin: {
      top: '10in',
      right: '10in',
      bottom: '10in',
      left: '10in',
    },
    printBackground: true,
    format: 'a4',
  };

  await page.pdf(pdfOptions);
} catch (error) {
  console.log(error);
}

is there way to validate margins gracefully?

Not at the moment. It would require use to get the computation from the PDF generator. try-catchinging page.pdf is actually more graceful than you'd expect since you can analyze the error message for all problems related to generation.
After all, since the goal is to generate a PDF, wouldn't all errors need to be addressed anyway?

authors: jrandolf satyajitnayk

repo: puppeteer/puppeteer


text:
TimeoutError: Timed out after 30000 ms while trying to connect to Chrome!

Hello
I try to implement/deploy puppeteer on Google Cloud but I have some issues. What I don't understand, it worked well 2 days ago.
Since then, I have this error:
TimeoutError: Timed out after 30000 ms while trying to connect to Chrome! The only Chrome revision guaranteed to work is r674921 at Timeout.onTimeout
I ran this command and everything seems fine : DEBUG=* node app.js
Version puppeteer : ^1.19.0
Version Node : v8.11.3
And here the code:
`async function main_screenshot(project_id) {
try {
const browser =  await puppeteer.launch({
headless: true,
args: ["--window-size=1440,1000", "--no-sandbox", "--disable-setuid-sandbox", "--disable-gpu"]
});
// const browser = await puppeteer.launch({dumpio: true});
const page = await browser.newPage()
page.setUserAgent('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36')
page.setViewport({ width: 1440, height: 721 })
console.log('entering in screenshot zone')
page.setDefaultNavigationTimeout(30000)
await page.goto('https://app.slack.com/client/TLW4JE7AA/CLTFQT9GC')
await page.waitFor(3000)
await page.type('#email', process.env.SLACK_EMAIL)
await page.type('#password', process.env.SLACK_PWD)
await page.waitFor(3000)
await page.click('#signin_btn')
console.log('credentials done')
await page.waitFor(3000)
console.log('so?')
await page.goto('https://app.slack.com/client/TLW4JE7AA/CLTFQT9GC')
await page.waitFor(3000)
console.log('connected to the right environment')
const div = await page.$$('.c-message.c-message--light')
var nuwwmber_loop= 0
for (var i = div.length ; i > 0; i--) {
var text = await (await div[i - 1].getProperty('textContent')).jsonValue();
  if(text.includes(project_id)) {
    number_loop = i
    break
  }
}
// const text = await (await div.getProperty('textContent')).jsonValue();

 const shotResult = await div[number_loop-1].screenshot();
console.log(shotResult)
cloudinaryOptions = {
  public_id: `${project_id}`
}

const results = await uploadToCloudinary(shotResult, cloudinaryOptions)
console.log(results)
browser.close()
return results

} catch (e) {
console.log(e)
}
}`

Quick update I downloaded the previous code, no really big changes...

Did you get it to work? Same problem here ):

not yet :/

Same here. Cannot get it to work

I use "puppeteer-core": "^1.19.0", when I use headless: false, it can work. But when I use headless:true, it will be TimeoutError: Navigation Timeout Exceeded: 30000ms exceeded

I also have this issue,
Node v10.15.3
Puppeteer v1.19.0

I use "puppeteer-core": "^1.19.0",
when I use headless: false, it can work.
But when I use headless:true, it will be TimeoutError: Navigation Timeout Exceeded: 30000ms exceeded

Yes, but it's a different kind of error :)

bumping because I also get this error and can't seem to find a solution. I get both TimeoutError: Navigation Timeout Exceeded: 30000ms exceeded and TimeoutError while connecting to Chrome :(

I'm getting the similar error:
(node:11400) UnhandledPromiseRejectionWarning: TimeoutError: Timed out after 40000 ms whil e trying to connect to Chrome! The only Chrome revision guaranteed to work is r686378     at Timeout.onTimeout (H:\node_modules\puppeteer\lib\Launcher.js:359:14)     at ontimeout (timers.js:436:11)     at tryOnTimeout (timers.js:300:5)     at listOnTimeout (timers.js:263:5)     at Timer.processTimers (timers.js:223:10) (node:11400) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error ori ginated either by throwing inside of an async function without a catch block, or by reject ing a promise which was not handled with .catch(). (rejection id: 1) (node:11400) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In  the future, promise rejections that are not handled will terminate the Node.js process wi th a non-zero exit code.
I've tried numerous 'fixes' and nothing seems to work.
Node v10.16.3
Puppeteer v10.16.3

Having the same problem was anybody able to fix this?

If it helps anyone my issue with was due to the usage of Puppeteer in Google Cloud Function and have it running in the background. I changed the function to respond only after Puppeteer is done and it worked just fine.

If it helps anyone my issue with was due to the usage of Puppeteer in Google Cloud Function and have it running in the background. I changed the function to respond only after Puppeteer is done and it worked just fine.

That's exactly my problem. What exactly do you mean by changing it to respond only after Puppeteer is done?

@bruriah1999 your entry function will have a response call. Once invoked the functions technically terminated which means all other tasks are considered background tasks and won’t execute.
Check the Function Execution Timeline in this article https://cloud.google.com/functions/docs/concepts/exec

@tbadlov thank you man, you saved my day, i was struggling here for hours.

Unfortunately i'm having this issue with 2.1.1
Maybe something that could help is that i'm running it like
ip netns exec bet365 node foobar
Without using the namespace it's working as expected...

I had the same problem.
I noticed that if you deploy it using the PUB/SUB trigger, this would happen. If you use HTTP as trigger instead, it runs just fine.
node.js 10 (beta)
"puppeteer": "^2.1.1",
"puppeteer-extra": "^3.1.9",

I'm having this issue with "puppeteer": "^3.0.1"  happens randomly after several hundreds of browsers have been launched and closed previously.
I'm using GCE instances.
Timed out after 30000 ms while trying to connect to the browser! Only Chrome at revision r737027 is guaranteed to work
I'm also using these extensions
 "puppeteer-extra": "^3.1.9",
   "puppeteer-extra-plugin-adblocker": "^2.11.3",
   "puppeteer-extra-plugin-anonymize-ua": "^2.2.8",
   "puppeteer-extra-plugin-block-resources": "^2.2.4",
   "puppeteer-extra-plugin-stealth": "^2.4.9"

I am also having this issue
using puppeteer 3.1.0
Uncaught (in promise) TimeoutError: Timed out after 30000 ms while trying to connect to the browser! Only Chrome at revision r756035 is guaranteed to work.

@mathiasbynens #6011 meant to fix **** Exception caught: TimeoutError: Timed out after 30000 ms while trying to connect to the browser! Only Chrome at revision r756035 is guaranteed to work.. ? I updated puppeteer to v4 and still seeing this from time to time.

Seeing this error
"puppeteer": "^3.0.2"

i'm obtaining this error randomly after upgrading to puppeteer 3.1
using puppeteer 2 on the same test i never got this error.

moving to puppeteer 5 even i'm not able to understand if this fix https://github.com/puppeteer/puppeteer/pull/6011 is inside puppeteer 5

testing puppeteer 5.2.1.

I'm getting this too;
TimeoutError: Timed out after 30000 ms while trying to connect to the browser! Only Chrome at revision r782078 is guaranteed to work

having the same issue. Using puppeteer 4.0.1.

same! @dcts

@westonwatson  @dcts  @CalebDelbridge  which version of puppeteer are you using?

My setup is

Puppeteer 4.0.1
Node 10.18.1 runtime on firebase.
I run the cloud function also with 1GB memory:

functions.runWith({ memory: "1GB" }).firestore.document(...).onCreate(...)

Still working on this so if anyone has same issue or suggestions I am very open :)

@dcts try upgrading to puppeteer 5.2.1

@andreabisello just upgraded but still I get the same error. Which is really weird, i have now puppeteer 5.2.1 running, and during install it even logged installing chromium r782078

Agreed with @dcts, I am getting the same error with puppeteer 5.2.1

I'm facing the same error for any puppeteer version > 2.0.0
I upgraded recently to 5.2.1 to see if the error is fixed, but the problem persists.
I'm surprised there are not more people facing the same problem.

@shubhams You summoned me my Lord? :)
I'm getting this issue atm here's my details. I'm going to try with previous versions
Node V10.x
"chrome-aws-lambda": "^5.1.0",
"puppeteer-core": "^5.1.0"

I do see chrome responding to Browser.getVersion
2020-08-08T22:12:22.434Z puppeteer:protocol:RECV ◀
{
    "id": 17,
    "result": {
        "protocolVersion": "1.3",
        "product": "HeadlessChrome/84.0.4147.0",
        "revision": "@926b5cca60c2451e9d55b4556fc2c328030736d7",
        "userAgent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/84.0.4147.0 Safari/537.36",
        "jsVersion": "8.4.379"
    }
}

@shubhams  i think there is something that spawn the problem in our test cases. for example, i get the problem only in continous integration Atlassian Bamboo windows 10 server, even it simply call the same command of the same project i will call in my windows 10 machine, and i never found the problem calling the same command from my pc.
i confirm problem started upgrading from version 2.0.0,
but in my case, maybe it only luck for now, 5.2.1 solved the issue. i never go the issue in the latest 7 days of test.
are you able to crete a repository that reproduce the issue in a minimal configuration?

@andersonaguiar I could try to setup a repo to recreate the bug, but Im not sure how i would do that, since it only occurs on google cloud. On my local machine it works without error. Would it be usefull to provide the whole google cloud function code without credentials to google cloud? (then the person looking into it would need a google account themself and create a cloud function, enable billing etc...).

@dcts, Can you reproduce the issue in a docker container? I am getting the same error in my docker.

Getting the same issue, puppeteer 3.3.0 with codeceptjs

This needs to be opened, getting same issue with puppeteer latest running from CI server, only headless: true works.

instead in my use case puppeteer 5.2.1 seems to have solved the issue.
i'm using atlassian bamboo as continous integration,
i have 4 task running every day but from about one months i never got the timeout issue.
maybe there is something different we are missing

Finally I solved it (at least for my condition).
I'm using Cloud Functions as a Background Function (Triggers when a Firestore Document is created. Though should work for PUB/SUB I imagine).
I needed to make my exported function asynchronous.

And then you need to await the result.

Otherwise, if you look at the Cloud Function logs, you'll see that your function starts and finishes very quickly (like 200ms). After I made my function asynchronous, it took around 13000ms and stopped giving errors.
Here's my logs:
BEFORE

AFTER

Bump, tried 5.2.1, 2.1.0. Both get the same timeout error.

Hello
I have this issue on and off. It seems that if you initialise the browser object wrong (because your code is wrong) you can get this error
Also, if your lambda does not have internet access
For me 5.2.1 works, with the right code
Also, I use https://github.com/Seikho/node-http-ping to confirm that I can connect to sites over http or https
Sorry I don't have anymore advice

@WinstonN Thanks for your reply and the tips. But I don't get what you mean with

It seems that if you initialise the browser object wrong (because your code is wrong) you can get this error

Can you provide an example of code that correctly initialized the browser object? I have my example fully working on my local environment and also on https://try-puppeteer.appspot.com/.
Heres example code (running a search on amazon):
const puppeteer = require('puppeteer'); // not needed on https://try-puppeteer.appspot.com/
const browser = await puppeteer.launch({args: [ '--no-sandbox']});
const context = await browser.createIncognitoBrowserContext();
const page = await context.newPage();
const searchQuery = "laptop";
const url = `https://www.amazon.com/s?k=${searchQuery}`;

await page.goto(url);
console.log(await page.content());
await page.screenshot({path: 'screenshot.png'});
await context.close();
await browser.close();

@mathiasbynens I belive this should be reopened, still a lot of people seem to have this error.

@dcts is that your entire code? You can't use "await" outside of an asynchronous function

@dcts is that your entire code? You can't use "await" outside of an asynchronous function

No that is code that you can insert to try-puppeteer. But to run it locally you can simply use a node in experimental mode where await is enabled
node --experimental-repl-await

Gotcha. Where are you deploying? Is this for Google Cloud?

Yes google-cloud but I also tried using firebase cloud-functions. Error occurs on both.

It took me forever to get it working on Google Cloud. Can you post your code that you're deploying to Google Cloud?

I am also experiencing this issue in puppeteer 2.1.1 used with AWS batch jobs.  What's strange is the code base in our dev and prod environments is identical and had been running for a while.  This week, it quit working in prod, but still runs in dev.

I got this same error (Timed out after 30000 ms while trying to connect to the browser! Only Chrome at revision r818858 is guaranteed to work.) when trying to deploy Puppeteer 5.5.0 to Google Cloud Functions.
I found that it was hanging at await browser.newPage();
This is similar to this issue
Upgrading to Node 12 made no difference.  I got it running by downgrading to Puppeteer 2.1.1, and increasing the function memory to 512 MB.
I increased the function memory because I got an out of memory error with 2.1.1.  I did check if there was some kind of silent memory issue with 5.5.0, but no.  Even with 4GB this didn’t run.

Same error. Puppeteer 5.5.0 running Google Cloud. Our applications is running about 1 year and now in our dev environments works but stopped working in prod in this week.  Somebody can help?

Has this problem been solved？How to solve this problem？

I'm experiencing same thing using lighthouse-puppeteer on an Unbuntu 20 VM on GCP.
Workaround I found, is running killall chrome and giving it 5 seconds before retrying.
I know that's unlikely to help many of you, cause my use-case is weird.  🤞

How do you handle it？

@bruriah1999 your entry function will have a response call. Once invoked the functions technically terminated which means all other tasks are considered background tasks and won’t execute.
Check the Function Execution Timeline in this article https://cloud.google.com/functions/docs/concepts/exec

How did you solve it?What is the version of puppeter used?I had this problem with CentOS

I am experiencing the same issue. It works in local environment but doesn't work on Google Cloud Functions.
Tried with both options: puppeteer only or puppeteer-core, chrome-aws-lambda.

I am experiencing the same issue. It works in local environment but doesn't work on Google Cloud Functions.
Tried with both options: puppeteer only or puppeteer-core, chrome-aws-lambda.

El lun., 7 de diciembre de 2020 4:51 a. m., 乔纯美 notifications@github.com
escribió:

Has this problem been solved？How to solve this problem？
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/puppeteer/puppeteer/issues/4796#issuecomment-739838836,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ARXQAMYPPWR6JH4SDKF3ZALSTSXTZANCNFSM4IJBDN5Q
.

El lun., 7 de diciembre de 2020 4:51 a. m., 乔纯美 notifications@github.com
escribió:

Has this problem been solved？How to solve this problem？
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/puppeteer/puppeteer/issues/4796#issuecomment-739838836,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ARXQAMYPPWR6JH4SDKF3ZALSTSXTZANCNFSM4IJBDN5Q
.

seems like a live issue. Funnily enough never had it before with Puppeteer

seems like a live issue. Funnily enough never had it before with Puppeteer

The issue got resolved when I updated the chrome binary to the latest version

The issue got resolved when I updated the chrome binary to the latest version

me daba el mismo error soluciono agregando read_timeout y cambiar el tiempo
puppeteer.launch ({ read_timeout: 30000
});

me daba el mismo error soluciono agregando read_timeout y cambiar el tiempo
puppeteer.launch ({ read_timeout: 30000
});

The issue got resolved when I updated the chrome binary to the latest version

what is the "latest version" you upgraded to ?

The issue got resolved when I updated the chrome binary to the latest version

what is the "latest version" you upgraded to ?

Same issue on google cloud functions. It works with a HTTP request trigger, but not with a pubsub function.

Same issue on google cloud functions. It works with a HTTP request trigger, but not with a pubsub function.

Hi everyone! I had a similar error: TimeoutError: Timed out after 30000 ms while trying to connect to the browser! Only Chrome at revision r818858 is guaranteed to work.
I fixed it by specifying that particular revision number when launching my puppeteer browser. Note that the revision number on the second line was simply copied and pasted from the error message I received.
  const myFunc = async () => {
    const revisionInfo = await browserFetcher.download('818858');

    puppeteer.launch({ executablePath: revisionInfo.executablePath })
      .then(async browser => {
        const page = await browser.newPage();
        ...
      }
  }

Read more about browserFetcher here.

@mpstanford Does that work inside Firebase/Cloud Functions? Also, after downloading the latest Puppeteer, I get type error saying the method doesn't exist.

Finally I solved it (at least for my condition).
I'm using Cloud Functions as a Background Function (Triggers when a Firestore Document is created. Though should work for PUB/SUB I imagine).
I needed to make my exported function asynchronous.

And then you need to await the result.

Otherwise, if you look at the Cloud Function logs, you'll see that your function starts and finishes very quickly (like 200ms). After I made my function asynchronous, it took around 13000ms and stopped giving errors.
Here's my logs:
BEFORE

AFTER

This gave me the answer.  My scenario was falling due to async calls. The Cloud Function turned off the proccess before puppeteer can generate an instance of the browser.
That because my code was executing everything async . I did not consider that after response.send  on a fire base function is called the thread is killed or shutted down, so when it invoques the browser instance , there is not an instance ready

Because all task is asynchronous, you must set response return after brower.close(). That work perfect for me
await browser.close();
res.status(200).send("ok");

I solved this issue uninstalling and reinstalling puppeteer.
Old version: 9.1
Current version: 10.0

Same problem here ):

Issue still persists. Worked on my Windows but on WSL2 Ubuntu 20.04, doesn't work.
Error:
30000 ms while trying to connect to the browser! Only Chrome at revision r901912 is guaranteed to work.

package.json:
  "dependencies": {
    "axios": "^0.23.0",
    "axios-rate-limit": "^1.3.0",
    "canvas": "^2.8.0",
    "discord.js": "^12.5.3",
    "dotenv": "^10.0.0",
    "fuse.js": "^6.4.6",
    "glob": "^7.1.7",
    "memory-cache": "^0.2.0",
    "puppeteer": "^10.4.0",
    "turndown": "^7.1.1"
  }

npm install output:
> puppeteer@10.4.0 install /home/putte/dev/discord-spaghetti-bot/node_modules/puppeteer
> node install.js

Downloading Chromium r901912 - 140.9 Mb [====================] 99% 0.0s
Chromium (901912) downloaded to /home/putte/dev/discord-spaghetti-bot/node_modules/puppeteer/.local-chromium/linux-901912

Chromium version number matches the "guaranteed to work" version

I had the issue on firebase/gcloud, but only once, so I just re-run the function and worked fine, couldn't replicate it again...

For those facing a similar issue, note that this error can come from your process being starved by out of memory.
For us, we faced this issue because our kubernetes pod did not have enough memory to answer multiple concurrent requests. Increasing your allocated memory could solve your issue. I suspect too little cpu can also affect the performance as well.

This Error started happening to me, once the cloud function had more invokations then usually. I added more memory to the cloud function and it worked again.

I'm having the same issue. For about 8 or 9 months my function worked flawless every week. But this week I started to face this error too. It is a azure function and it was on puppeteer 9. Changed to puppeteer 13 and the same is happening.
The chromium version in node_modules is exactly the same stated in the error message. I out of ideas on how to solve it.

I got this today after running Chrome in a newly started container, so I don't think it's the remaining Chrome processes issue covered in #6011.

same here. got this issue yesterday two times. not sure if the solution is released in the mentioned PR

I am facing the same issue since last 1 week. Anyone got fix for this.

Same issue here, using xvfb
Node v16

For me both (cli and node pkg) is is working...
I'm just using to test:
{
  "dependencies": {
    "puppeteer": "^13.0.1",
    "wappalyzer": "^6.9.12"
  }
}

but i will implement using a Docker image in the next days, after then i come back again to say if works o not.

Same issue here

Same here, working in dev mode, not working in prod mode.
"puppeteer": "^13.1.1",
node: v12.15.0

Same here, working in dev mode, not working in prod mode.
"puppeteer": "^13.1.1", node: v12.15.0

Is it in  headless: false mode ?

@alexsunday  yes, headless = false.

I'm also having this issue, but only with headless: false.
Unfortunately, I need headless: true for extensions.

I am also having the same problem. However, when I turn on the x server, the problem goes away. Would it be the case that the browser dependency (depending on the version) actually depends on something from X? This thing about "30000" ms really sounds like X11 waiting sh!t (I am being naive here).

Hi everyone! I had a similar error: TimeoutError: Timed out after 30000 ms while trying to connect to the browser! Only Chrome at revision r818858 is guaranteed to work.
I fixed it by specifying that particular revision number when launching my puppeteer browser. Note that the revision number on the second line was simply copied and pasted from the error message I received.
  const myFunc = async () => {
    const revisionInfo = await browserFetcher.download('818858');

    puppeteer.launch({ executablePath: revisionInfo.executablePath })
      .then(async browser => {
        const page = await browser.newPage();
        ...
      });
  }

Read more about browserFetcher here.
I'm getting Cannot read property 'executablePath' of undefined, any idea what i missed out?
https://stackoverflow.com/questions/71555962/puppeteer-cannot-read-property-executablepath-of-undefined

hey @rainbowhat i followed what you suggested and it removed the X display error for me but i got this error now for browser fetcher -
BrowserFetcher {
_product: 'chrome',
_downloadsFolder: '/root/node_modules/puppeteer/.local-chromium',
_downloadHost: 'https://storage.googleapis.com',
_platform: 'linux'
}
/root/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserFetcher.js:367
const error = new Error(Download failed: server returned code ${response.statusCode}. URL: ${url});
^
Error: Download failed: server returned code 404. URL: https://storage.googleapis.com/chromium-browser-snapshots/Linux_x64/NaN/chrome-linux.zip
at /root/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserFetcher.js:367:27
at ClientRequest.requestCallback (/root/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserFetcher.js:493:13)
at Object.onceWrapper (node:events:642:26)
at ClientRequest.emit (node:events:527:28)
at HTTPParser.parserOnIncomingClient (node:_http_client:618:27)
at HTTPParser.parserOnHeadersComplete (node:_http_common:128:17)
at TLSSocket.socketOnData (node:_http_client:482:22)
at TLSSocket.emit (node:events:527:28)
at addChunk (node:internal/streams/readable:324:12)
at readableAddChunk (node:internal/streams/readable:297:9)
Not sure how do we fix that , can you please help

"puppeteer": "^13.0.0"
AND
node: v17.4.0

Issue is still there.

Also still happening to me with error:
TimeoutError: Timed out after 30000 ms while trying to connect to the browser! Only Chrome at revision r991974 is guaranteed to work.     at Timeout.onTimeout (/Users/..../Documents/startups/docvox/tech/git/app-backend/node_modules/puppeteer-core/lib/cjs/puppeteer/node/BrowserRunner.js:252:20)     at listOnTimeout (internal/timers.js:557:17)     at processTimers (internal/timers.js:500:7)
FYI:
headless:true
and deps:
"puppeteer-core": "^14.0.0",
"puppeteer-extra": "^3.2.3",
"puppeteer-extra-plugin-stealth": "^2.9.0",
"puppeteer-screen-recorder": "^2.0.2",
using:
chrome headless

I also sometimes get this error:
C:\node_modules\puppeteer\lib\cjs\puppeteer\node\BrowserRunner.js:252
            reject(new Errors_js_1.TimeoutError(`Timed out after ${timeout} ms while trying to connect to the browser! Only Chrome at revision r${preferredRevision} is guaranteed to work.`));
                   ^
TimeoutError: Timed out after 30000 ms while trying to connect to the browser! Only Chrome at revision r982053 is guaranteed to work.
    at Timeout.onTimeout (C:\node_modules\puppeteer\lib\cjs\puppeteer\node\BrowserRunner.js:252:20)
    at listOnTimeout (node:internal/timers:559:17)
    at processTimers (node:internal/timers:502:7)

It is strange that I set the value to 120,000 for setDefaultTimeout and setDefaultNavigationTimeout, but the error message indicates 30,000!
More code:
async function get_page() {
	if (extra) {
		var pup = puppeteerExtra.use(StealthPlugin());
	} else {
		var pup = puppeteer;
	}
	let options = {
		headless: headless,
		devtools: devtools,
		args: [
			'--no-sandbox',
			'--disable-setuid-sandbox',
			'--proxy-server=' + browser_proxy,
		],
	};
	browser = await pup.launch(options);
	const page = await browser.newPage();
	page.setDefaultTimeout(120*1000);
	page.setDefaultNavigationTimeout(120*1000);
	await page.goto('https://example.com');
	return page;
}

Versions:
node v16.14.0
chromium win64-982053
windows 10
headless: true
proxy: yes
puppeteer-extra-plugin-stealth@2.9.0
puppeteer-page-proxy@1.2.8
puppeteer-proxy@2.1.2
puppeteer@13.7.0

getting the same error as @NabiKAZ

same
node 16
puppeteer 14.1

Im getting this issue in Google Compute Engine using Pm2. Two processes in parallel it works fine, as soon as I added a third process it fails with
e: Error: TimeoutError: Timed out after 30000 ms while trying to connect     │
│                                       ││ gpu-renderer >       at /home/michael/packages/cloudtest/dist/index.js:176:23

Using 1 x NVIDIA Tesla T4 GPU and 16 vCPUs (n1-standard-16 - Intel Haswell)

I had the issue on firebase/gcloud, but only once, so I just re-run the function and worked fine, couldn't replicate it again...

This worked for me as well

Google Cloud Functions
Node 16
Puppeteer 15.3.2
@tbadlov's suggestions solved this for me.
https://github.com/puppeteer/puppeteer/issues/4796#issuecomment-535612842

If it helps anyone my issue with was due to the usage of Puppeteer in Google Cloud Function and have it running in the background. I changed the function to respond only after Puppeteer is done and it worked just fine.

https://github.com/puppeteer/puppeteer/issues/4796#issuecomment-535719728

...your entry function will have a response call. Once invoked the functions technically terminated which means all other tasks are considered background tasks and won’t execute.

I changed my main function to return a promise (via return browser.close()), with an async entry point function that awaits the completion of my main function.

I am having this issue too, on Firebase Functions. Can’t figure it out. Works fine ~20% of the time and fails all others with timeout.

I have this issue only on Firebase pubsub scheduled function. @Greyson-Sawyer can you provide the code including the Trigger function definition ? Thanks

I am getting the same error using Cloud functions triggered by pubsub
Error: TimeoutError: Timed out after 30000 ms while trying to connect to the browser! Only Chrome at revision r1036745 is guaranteed to work.
Node 16
puppeteer: "17.1.3"

It's magic.
I have used my simpliest script last week - it's work.
Today, no updates, but it's not work.
It is a normal?
Node: 18.9.0
Pptr: ^18.0.5

@paveltretyakovru are you invoking it a lot? I found Firebase Cloud was getting throttled by the website I was connecting to due to the volume of requests. For me it was ~ 5 times a second.

@paveltretyakovru are you invoking it a lot? I found Firebase Cloud was getting throttled by the website I was connecting to due to the volume of requests. For me it was ~ 5 times a second. I put the function in multiple regions and had the clients randomly pick one as a way to load balance a little to fix it.

@saldous , aloha! Thanks for your attention.
console.log('Launch browser');
const browser = await pup.launch({ headless: false });

console.log('Opening page');
const page = await browser.newPage();

console.log('Go to page');
await page.goto('https://google.com');

My script stoping on "Launch browser", and I can't see  log with "Opening page".
And after some time I see the issue message.

@paveltretyakovru did you allocate enough memory?

@paveltretyakovru did you allocate enough memory?

@saldous Sorry, memory for what?

I got this error only when running on my Apple Silicon (with --platform linux/amd64 ) but it works perfectly on Intel CPU or cloud providers.

puppeteer-cluster randomly crashes

lib puppeteer-extra helped me to resolve this issue
example -> https://github.com/cobalt-intelligence/log-into-google-with-puppeteer/blob/master/src/index.ts

@bruriah1999 your entry function will have a response call. Once invoked the functions technically terminated which means all other tasks are considered background tasks and won’t execute.
Check the Function Execution Timeline in this article https://cloud.google.com/functions/docs/concepts/exec

Do you have a code example for this?

I encounter the same issue on MacOS, after switch to {headless: false} then switch back to {headless: true}, it works. I think the computer need us to allow the chromium first with headless false, after that, it can work in headless mode silently.

Had the same problem. There's a recent stackoverflow post about running puppeteer on WSL2 and the problem was that my firewall prevented access to my x-server.
I followed the instruction and got it to work!
https://stackoverflow.com/questions/73561240/running-puppeteer-on-wsl2

So what seemed to fix it for me is to simply make sure I'm spawning only one instance of the browser instead of many.
In case of both AWS Lambda/Google Cloud Functions the instance managing the function spins up, the first execution is totally fine, but the next execution (in a short timeframe) will fail, because the chrome instance is already up. A simple solution is to create separate function ala prepareBrowser and make sure to cache the returned browser and check inside the main handler whether it's there already or not. If it's there then just re-use it.
For example:
let browserPromise: Promise<puppeteer.Browser>;;
const prepareBrowser = async () => {
  // function responsible for launching chrome
}

const handler = () => {
  ...
  if (!browserPromise) {
    browserPromise = prepareBrowser();
  }
  const browser = await browserPromise;
  ...

In GPC i had problem with timeout, when i instantiate de puppeteer out of the function.
This is my source code working
const puppeter = require('puppeteer');
//when instantiate out of the function report, a had a problem
/let browserPromise = puppeter.launch({
headless: true,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--font-render-hinting=medium'
]
});/
exports.report = async (req, res) => {
res.set("Access-Control-Allow-Origin", "http://localhost");
const url = req.query.url || '';
let content;
//https://cloud.google.com/functions/docs/samples/functions-http-content?hl=pt-br#functions_http_content-nodejs
switch (req.get('content-type')) {
    case 'application/json':
        content = req.body;
        break;

    case 'application/octet-stream':
        content = req.body.toString();
        break;

    case 'text/plain':
        content = req.body;
        break;

    case 'application/x-www-form-urlencoded':
        content = req.body;
        break;
}

const type = req.query.type || 'image';//pdf
const browser = await puppeter.launch({
    headless: true,
    args: [
        '--no-sandbox',
        '--disable-setuid-sandbox',
        '--font-render-hinting=medium'
    ]
});
const context = await browser.createIncognitoBrowserContext();
const page = await context.newPage();
await page.setDefaultNavigationTimeout(0);
if (url) {
    await page.goto(url);
} else {
    await page.setContent(content, {
        timeout: 0,
        waitUntil: 'domcontentloaded'
    });
}

setTimeout(async() => {
    if (type == 'image') {
        const image = await page.screenshot({
            fullPage: true
        });
        //await context.close();
        res.setHeader('Content-Type', 'image/png');
        res.send(image);
    } else if (type == 'pdf') {
        let displayHeaderFooter = false;
        let footerTemplate = req.query.footerTemplate || '';
        if (footerTemplate) {
            displayHeaderFooter = true;
        }
        let landscape = req.query.orientation == 'landscape';
        const pdf = await page.pdf({
            landscape: landscape,
            displayHeaderFooter: displayHeaderFooter,
            footerTemplate: footerTemplate
        });
        res.setHeader('Content-Type', 'application/pdf');
        res.send(pdf);
    }
    await browser.close();
}, 1000);

}

@bruriah1999 your entry function will have a response call. Once invoked the functions technically terminated which means all other tasks are considered background tasks and won’t execute.
Check the Function Execution Timeline in this article https://cloud.google.com/functions/docs/concepts/exec

Expanding upon this answer by @tbadlov
In my case I was using https cloud functions and all I had to do was call res.send("OK"); from the finally statement of innermost (or last) async function.
I have 1st async function to generate a file and 2nd async (inner) function to email the generated file.
Upon correctly signaling the end of 2nd func, my entire cloud function ran smoothly.
Example Code Snippet:

exports.sendOrderConfirmationEmail = functions.https.onRequest((req, res) => {
  return cors()(req, res, async () => {

    nodeHtmlToImage({
      output: "./outputs/Order-Confirmation.png",
      html: emailBody,
    })
      .then(() => {
        console.log("The image was created successfully!");

        const emailPayload = {}; // w/attachment

        sgMail
          .send(emailPayload)
          .then(() => console.log("Email sent"))
          .catch((error) =>
            console.error("Error @sendOrderConfirmationEmail", error)
          )
          .finally(() => {
            // Send an HTTP response To mark end of function execution - EXTREMELY IMPORTANT
            // https://cloud.google.com/functions/docs/concepts/execution-environment#execution-timeline
            res.send("OK");
          });
      })
      .catch((error) => console.error("Error generating PNG:", error));
  });
});

I had a similar problem, asked GPT-4. Reply:

The error message you're seeing is raised by Puppeteer when it tries to launch a new instance of Chromium but doesn't receive the WebSocket endpoint within 30 seconds. This endpoint is required for Puppeteer to control the Chromium instance.
This error can happen due to several reasons:

The Chromium instance isn't starting correctly: Puppeteer relies on being able to start a new Chromium instance and establish a WebSocket connection to it. If there's an issue with the Chromium executable itself, this error could occur.
System resources: If your system is heavily loaded or has very limited resources, it might take more than 30 seconds for Chromium to start and the WebSocket connection to be established.
Network issues: If you're using a proxy server, there could be issues with the network configuration or the proxy server itself that are preventing Puppeteer from starting the Chromium instance and establishing the WebSocket connection within the 30-second timeframe.

Your crawl script appears to be trying to use Puppeteer to crawl a webpage and follow its links. Each time it follows a link, it starts a new Puppeteer instance. This is likely to be resource-intensive, especially if there are many links on each page. You may want to reconsider this approach.

Solution
It was correct, the issue came from an absence of resources. I fixed the issue by launching the browser only once and then reusing the same instance for all my navigation.

Adding to thread, just in case this opens again.
On puppeteer v 21.1.1. Using google cloud function gen2 onObjectFinalized trigger with 16GiB memory, 4 cpu, and 120 second timeout.
When I first launched my Cloud Storage trigger function, I was getting TimeoutError: Timed out after 30000 ms while waiting for the WS endpoint URL to appear in stdout!. However, upon subsequent runs, so far, this error does not appear.
In package.json I had to add:
"scripts": {
  "gcp-build": "node node_modules/puppeteer/install.js"
}

And then at root of project I added the .puppeteerrc.cjs config file:
const {join} = require('path');

/**
 * @type {import("puppeteer").Configuration}
 */
module.exports = {
    // Changes the cache location for Puppeteer.
    cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
};

Puppeteer code:
const browser = await puppeteer.launch({
    headless: 'new',
})

const page = await browser.newPage()

// Load the html file that triggered onObjectFinalized as string and pass to setContent
// So, in my use case I'm not even loading a website with puppeteer, just passing html.

await page.setContent(html, { waitUntil: 'domcontentloaded' })
await page.emulateMediaType('screen')

const PDF = await page.pdf({
    path: `/tmp/${pdfFilename}`,
    margin: { top: '.5in', right: '.5in', bottom: '.5in', left: '.5in' },
    printBackground: true,
    format: 'A4',
})

await browser.close()

For anyone still struggling with this, I managed to fix it in Cloud Run by increasing the Request timeout setting and res.send it when everything is completely finished.

I have exactly the same error with the latest version of puppeteer (21.5.0). Approximately one time out of 2, the error is impossible to catch with the try catch block, and the script ends by crashing.

/home/.../node_modules/puppeteer-core/lib/cjs/puppeteer/common/WaitTask.js:59
void this.terminate(new Errors_js_1.TimeoutError(Waiting failed: ${options.timeout}ms exceeded));
^
TimeoutError: Waiting failed: 15000ms exceeded
at Timeout. (/home/.../node_modules/puppeteer-core/lib/cjs/puppeteer/common/WaitTask.js:59:37)
at listOnTimeout (node:internal/timers:564:17)
at process.processTimers (node:internal/timers:507:7)

try {
  const pages = await currentBrowserInstance.browser.pages();
  const page = pages[0];
  await page.setViewport({ width: 100, height: 100 });
  const watchDog = page.waitForFunction('!!window.DRAW_FINISH', {timeout: timeout});
  await page.goto(backendURL, {timeout: timeout});
  await watchDog;
}
catch(e) {
  console.error(e);
}

I removed the launch options:--single-process,it's work.🤡

@tbadlov Thank you, your suggestion worked for me.
I had this which was NOT working:
(async () => {
        const browser = await puppeteer.launch({headless: true, args: ['--no-sandbox']});
        const page = await browser.newPage();
        await page.setContent(htmlWithStyles);
        const pdfBuffer = await page.pdf({
            format: "A4",
            margin: { top: 0, bottom: 0, right: 0, left: 0 },
            printBackground: true,
        });
        await browser.close();
    })(outputFile);
 res.send(outputFile);
 return

Which returned immediately and stopped the puppeteer execution.

In my case I run node run.js and one day mention error started. It was enough to add some useless console.log(111) to script and suddenly it started works again including removed console.log() later.

I experienced this on my chromium, this happened because I gave chromium permission to push notifications to my mac, after I turned off the permission, it went back to normal.
Thank you for the disable google cloud functions suggestion above.

I have a timeout problem with puppeteer 12.0.0, using a dockerfile with aws

I experienced the same problem running Puppeteer in Google Cloud Run, the issue was not enough memory allocated to Chromium was crashing

Maybe you just forgot to set headless to true

I experienced the same problem running Puppeteer in Google Cloud Run, the issue was not enough memory allocated to Chromium was crashing

how much memory did you add? I have 2G and i'm running into this issue

If any of you are having a hard time debugging Puppeteer, I'm creating a new service to make it easier: Buglesstack. It's currently in beta, so I'd be glad if any of you try it out!

authors: AllanOricil Arnoldnuo BiTeleperformance CalebDelbridge DanHelfman DerekHill FelipeLujan FranzTscharf Fredericco72 GaL3n Greyson-Sawyer Jhon-Idrovo Jonas-360ty KKCHEE Keshavdulal Kevjinx NabiKAZ PawelK2012 QqChip RadianSmile SZharkov SuWilliam Umeshunp WinstonN Zelfapp alexsunday andreabisello anita18 antoni-24 blocka bluematter bruriah1999 carbonemys code-by-gijs cr05s19xx danielfoxp2 dcts diogobd doteric ealanisg easrng erv2 flexeo guilhermebentomarques heinosasshallik hidaviddong independents-service ivanalemunioz jeremiascBTS jnmclarty jnt0009 jonataswilliam klren0312 knandraina koaladlt letrape lutherjohnrichards metamas michaelpaco mikelam14 milishalabh moises138 mpstanford mr-magnus nolimitdev ostappartyka p30arena pankhiprasher partiid paveltretyakovru pcktlwyrcode philippefutureboy phureewat29 puttehi qiaochunmei rainbowhat rajivsubra1981 rasoul707 robsongajunior rodrigoreal saldous shreyanshdwivedi shubhams sparker-sagrad sudheej surxme taboca tasoss tbadlov tolmasky walidsa3d westonwatson yadavamit9 ydmitry yogastama


text:
Page.setCookie() not working when value is mixed with characters of different types

Steps to reproduce
Tell us about your environment:

Puppeteer version: puppeteer-core@1.20.0, as well as puppeteer@5.2.1
Platform / OS version: macOS
URLs (if applicable): Not necessary
Node.js version: v10.18.0

What steps will reproduce the problem?

Initialize puppeteer and get page object;
Set cookie with following codes:

const fakeCookieObjectThatWouldRaiseError = [{
	domain: '.google.com',
	name: 'nickname',
	value: ' 你好'
}];

const fakeCookieObjectThatWouldPass = [{
	domain: '.google.com',
	name: 'nickname',
	value: ' 你好'
}];

const fakeCookieObjectThatWouldPassToo = [{
	domain: '.google.com',
	name: 'nickname',
	value: 'English'
}];

try {
	await page.setCookie(...[fakeCookieObjectThatWouldRaiseError]);
} catch (e) {
	console.log(e);
}

API with https://pptr.dev/#?product=Puppeteer&version=v5.2.1&show=api-pagesetcookiecookies

What is the expected result?
setCookie could work and set Cookie correctly.
What happens instead?
The calling failed with following message:
Protocol error (Network.setCookies): Invalid cookie fields

Discussion
I could give several examples to explain the bug. Besides the example described above, we can see that the following value property with pure Chinese characters or pure English characters can both got the expected result.
So it's just a situation that when value is characters with space and Chinese characters mixed together.
const fakeCookieObjectThatWouldPass = {
	domain: '.google.com',
	name: 'nickname',
	value: ' 你好'
};

const fakeCookieObjectThatWouldPassToo = {
	domain: '.google.com',
	name: 'nickname',
	value: 'English'
};

try {
	// This is OK.
	await page.setCookie(fakeCookieObjectThatWouldPass, fakeCookieObjectThatWouldPassToo);
} catch (e) {
	console.log(e);
}

If it's designed to raise error at this situation, I think it should be added to unit test cases https://github.com/puppeteer/puppeteer/blob/main/test/cookies.spec.ts
Or we should make some judgements with user input parameters in value property, to forbid throw invalid error to users directly.
Otherwise, I can just guarantee expected result with encodeURIComponent operation once I test value property contains Chinese characters:
const getSafeCookieValue = (rawString: string): string => {
    if (/.*[\u4e00-\u9fa5]+.*/.test(rawString)) {
        return encodeURIComponent(rawString);
    } else {
        return rawString;
    }
};

I have a similar issue when trying to set a cookie containing binary data.
await page.setCookie({
  name: cookieName,
  value: new Buffer(cookieValueBase64, 'base64').toString()
});

Any suggestions how to supply this kind of cookies to the browser?

@dimatomp As I said in the issue, maybe you could try encodeURIComponent API to see if your code works.

Did not work for me - the buffer could be sent but was not parsed on the recipient side.
I ended up converting the buffer into hex representation and then just putting '%' in between - it worked :)
let urlEncodedCookie = '';
for (let i = 0; i < cookieHex.length; i += 2)
  urlEncodedCookie += `%${cookieHex.substr(i, 2)}`;
await browser.setCookies({
  name: cookieName,
  value: urlEncodedCookie,
});

I have the same issue when trying to set a PEM public key as a cookie value. It seems to not like the \ns

I have the same issue, latest npm install version, the cookie looks like this:
output of
        console.log(cookies, 'cookies');

is:
[
  {
    name: 'app_opened',
    value: 'j��@�W\rmWh�\x15\x100�[censored]$\x16\x00�\n�\x19�J2r\x0F�\t���',
    expires: 0,
    domain: 'app.[censored].com',
    path: '/'
  }
] cookies

@arthurwolf  try to add secure: true to the cookie object

@arthurwolf try to add secure: true to the cookie object

This works for me, Thanks .

authors: AlfieGoat akash-k-fst arthurwolf dimatomp hijiangtao outOFFspace