roster-server 2.3.12 → 2.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -258,17 +258,14 @@ class Roster {
258
258
  this.maxLocalPort = options.maxLocalPort || 9999;
259
259
  this.tlsMinVersion = options.tlsMinVersion ?? 'TLSv1.2';
260
260
  this.tlsMaxVersion = options.tlsMaxVersion ?? 'TLSv1.3';
261
- this.disableWildcard = options.disableWildcard !== undefined
262
- ? parseBooleanFlag(options.disableWildcard, false)
263
- : parseBooleanFlag(process.env.ROSTER_DISABLE_WILDCARD, false);
264
- const combineDefault = false;
265
- this.combineWildcardCerts = options.combineWildcardCerts !== undefined
266
- ? parseBooleanFlag(options.combineWildcardCerts, combineDefault)
267
- : parseBooleanFlag(process.env.ROSTER_COMBINE_WILDCARD_CERTS, combineDefault);
261
+ this.disableWildcard = parseBooleanFlag(options.disableWildcard, false);
262
+ this.combineWildcardCerts = parseBooleanFlag(options.combineWildcardCerts, false);
268
263
  if (isBunRuntime && this.combineWildcardCerts) {
269
264
  log.info('Bun runtime detected: combined wildcard certificates enabled (SNI bypass)');
270
265
  }
271
266
 
267
+ this.skipLocalCheck = parseBooleanFlag(options.skipLocalCheck, true);
268
+
272
269
  const port = options.port === undefined ? 443 : options.port;
273
270
  if (port === 80 && !this.local) {
274
271
  throw new Error('⚠️ Port 80 is reserved for ACME challenge. Please use a different port.');
@@ -749,6 +746,8 @@ class Roster {
749
746
  maintainerEmail: this.email,
750
747
  cluster: this.cluster,
751
748
  staging: this.staging,
749
+ skipDryRun: this.skipLocalCheck,
750
+ skipChallengeTest: this.skipLocalCheck,
752
751
  notify: (event, details) => {
753
752
  const eventDomain = (() => {
754
753
  if (!details || typeof details !== 'object') return null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "roster-server",
3
- "version": "2.3.12",
3
+ "version": "2.3.16",
4
4
  "description": "👾 RosterServer - A domain host router to host multiple HTTPS.",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -302,27 +302,13 @@ describe('Roster', () => {
302
302
  const roster = new Roster({ local: true, disableWildcard: true });
303
303
  assert.strictEqual(roster.disableWildcard, true);
304
304
  });
305
- it('reads disableWildcard from env var', () => {
306
- const previous = process.env.ROSTER_DISABLE_WILDCARD;
307
- process.env.ROSTER_DISABLE_WILDCARD = '1';
308
- try {
309
- const roster = new Roster({ local: true });
310
- assert.strictEqual(roster.disableWildcard, true);
311
- } finally {
312
- if (previous === undefined) delete process.env.ROSTER_DISABLE_WILDCARD;
313
- else process.env.ROSTER_DISABLE_WILDCARD = previous;
314
- }
305
+ it('enables disableWildcard from constructor option (truthy string)', () => {
306
+ const roster = new Roster({ local: true, disableWildcard: '1' });
307
+ assert.strictEqual(roster.disableWildcard, true);
315
308
  });
316
- it('enables combined wildcard certs from env var', () => {
317
- const previous = process.env.ROSTER_COMBINE_WILDCARD_CERTS;
318
- process.env.ROSTER_COMBINE_WILDCARD_CERTS = '1';
319
- try {
320
- const roster = new Roster({ local: false });
321
- assert.strictEqual(roster.combineWildcardCerts, true);
322
- } finally {
323
- if (previous === undefined) delete process.env.ROSTER_COMBINE_WILDCARD_CERTS;
324
- else process.env.ROSTER_COMBINE_WILDCARD_CERTS = previous;
325
- }
309
+ it('enables combined wildcard certs from constructor option', () => {
310
+ const roster = new Roster({ local: false, combineWildcardCerts: true });
311
+ assert.strictEqual(roster.combineWildcardCerts, true);
326
312
  });
327
313
  it('defaults combineWildcardCerts to false', () => {
328
314
  const roster = new Roster({ local: false });
@@ -373,7 +373,9 @@ G.create = function(gconf) {
373
373
  maintainerEmail: gconf.maintainerEmail,
374
374
  packageAgent: packageAgent,
375
375
  notify: greenlock._notify,
376
- debug: greenlock._defaults.debug || args.debug
376
+ debug: greenlock._defaults.debug || args.debug,
377
+ skipDryRun: gconf.skipDryRun || false,
378
+ skipChallengeTest: gconf.skipChallengeTest || false
377
379
  });
378
380
 
379
381
  var dir = caches[dirUrl];
@@ -382,13 +384,34 @@ G.create = function(gconf) {
382
384
  return dir.promise;
383
385
  }
384
386
 
385
- await acme.init(dirUrl).catch(function(err) {
386
- log.error(
387
- "ACME init failed (directory may be down or directoryUrl wrong):",
388
- err.message
389
- );
390
- throw err;
391
- });
387
+ var maxRetries = 3;
388
+ var lastErr;
389
+ for (var attempt = 1; attempt <= maxRetries; attempt++) {
390
+ try {
391
+ await acme.init(dirUrl);
392
+ lastErr = null;
393
+ break;
394
+ } catch (err) {
395
+ lastErr = err;
396
+ log.error(
397
+ "ACME init attempt " +
398
+ attempt +
399
+ "/" +
400
+ maxRetries +
401
+ " failed (directory may be down or directoryUrl wrong):",
402
+ err.message
403
+ );
404
+ if (attempt < maxRetries) {
405
+ await new Promise(function(resolve) {
406
+ setTimeout(resolve, 1000 * attempt);
407
+ });
408
+ }
409
+ }
410
+ }
411
+ if (lastErr) {
412
+ delete caches[dirUrl];
413
+ throw lastErr;
414
+ }
392
415
 
393
416
  caches[dirUrl] = {
394
417
  promise: Promise.resolve(acme),
@@ -1,7 +0,0 @@
1
- ---
2
- id: ac8ba0ra21
3
- type: decision
4
- title: Roster default IPv6 bind
5
- created: '2026-03-16 21:57:18'
6
- ---
7
- Changed Roster default bind hostname from 0.0.0.0 to :: in index.js constructor (`this.hostname = options.hostname ?? '::'`). This makes default listen IPv6-first. Existing explicit hostname option still overrides. Verified with full test suite: 74 passing.