pear-prerelease 2.0.6 → 3.1.0

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.
Files changed (2) hide show
  1. package/index.js +144 -118
  2. package/package.json +4 -2
package/index.js CHANGED
@@ -4,164 +4,190 @@ import Hyperdrive from 'hyperdrive'
4
4
  import Corestore from 'corestore'
5
5
  import Hyperswarm from 'hyperswarm'
6
6
  import id from 'hypercore-id-encoding'
7
+ import pearLink from 'pear-link'
8
+ import { flag, command } from 'paparam'
9
+
10
+ const app = command('pear-prerelease',
11
+ flag('--dry-run'),
12
+ flag('--from|-f <link>'),
13
+ flag('--to|-t <link>'),
14
+ flag('--production|-p <link>'),
15
+ flag('--bootstrap'),
16
+ flag('--touch'),
17
+ flag('--storage|-s <storage>')
18
+ ).parse()
19
+
20
+ const exit = global.Bare ? Bare.exit.bind(Bare) : process.exit.bind(process)
21
+ if (!app) exit(0)
22
+
23
+ const DRY_RUN = app.flags.dryRun
24
+ const BOOTSTRAP = app.flags.bootstrap
25
+ const FROM = app.flags.from ? pearLink.parse(app.flags.from) : null
26
+ const TO = app.flags.to ? pearLink.parse(app.flags.to) : null
27
+ const PROD = app.flags.production ? pearLink.parse(app.flags.production) : null
28
+
29
+ const store = new Corestore(app.flags.storage || './corestore')
30
+
31
+ if (app.flags.touch) {
32
+ const core = store.get({ name: Math.random() + '.' + Date.now() })
33
+ await core.ready()
34
+ console.log('pear://' + core.id)
35
+ await core.close()
36
+ }
7
37
 
8
- const DRY_RUN = process.argv.includes('--dry-run')
9
- const STAGE_KEY = process.argv[2]
10
- const STAGE_CHECKOUT = Number(process.argv[3])
11
-
12
- const PROD_KEY = process.argv[4]
38
+ if (FROM && TO && PROD) {
39
+ const swarm = new Hyperswarm({
40
+ keyPair: await store.createKeyPair('hyperswarm')
41
+ })
13
42
 
14
- const store = new Corestore('./corestore')
15
- const swarm = new Hyperswarm({
16
- keyPair: await store.createKeyPair('hyperswarm')
17
- })
43
+ swarm.on('connection', c => store.replicate(c))
18
44
 
19
- const drive = new Hyperdrive(store.namespace('release'), { compat: false })
20
- await drive.ready()
45
+ const to = new Hyperdrive(store.namespace('release'), TO.drive.key, { compat: false })
46
+ await to.ready()
21
47
 
22
- const prod = PROD_KEY ? new Hyperdrive(store.namespace('prod'), PROD_KEY) : null
23
- if (prod) await prod.ready()
48
+ const prod = new Hyperdrive(store.namespace('prod'), PROD.drive.key)
49
+ await prod.ready()
24
50
 
25
- const stage = new Hyperdrive(store.session(), STAGE_KEY)
26
- await stage.ready()
51
+ const from = new Hyperdrive(store.session(), FROM.drive.key)
52
+ await from.ready()
27
53
 
28
- swarm.on('connection', c => store.replicate(c))
29
- swarm.join(drive.discoveryKey, {
30
- client: true,
31
- server: true
32
- })
33
- swarm.join(stage.discoveryKey, {
34
- client: true,
35
- server: false
36
- })
54
+ swarm.join(to.discoveryKey, {
55
+ client: true,
56
+ server: true
57
+ })
58
+ swarm.join(from.discoveryKey, {
59
+ client: true,
60
+ server: false
61
+ })
37
62
 
38
- if (prod) {
39
63
  // hydrate prod target
40
- if (prod.core.length === 0) await new Promise(resolve => prod.core.once('append', () => resolve()))
64
+ if (prod.core.length === 0 && !BOOTSTRAP) {
65
+ await new Promise(resolve => prod.core.once('append', () => resolve()))
66
+ }
41
67
 
42
68
  prod.core.download()
43
69
 
44
70
  console.log('Copying in existing metadata data, might take a bit...')
45
- while (drive.core.length < prod.core.length) {
46
- await drive.core.append(await prod.core.get(drive.core.length))
47
- console.log('Copied blocks', drive.core.length, '/', prod.core.length)
71
+ while (to.core.length < prod.core.length) {
72
+ await to.core.append(await prod.core.get(to.core.length))
73
+ console.log('Copied blocks', to.core.length, '/', prod.core.length)
48
74
  }
49
75
  console.log('Done!')
50
76
  console.log()
51
77
 
52
- await drive.getBlobs()
78
+ await to.getBlobs()
53
79
  await prod.getBlobs()
54
80
 
55
81
  prod.blobs.core.download()
56
82
 
57
83
  console.log('Copying in existing blob data, might take a bit...')
58
- while (drive.blobs.core.length < prod.blobs.core.length) {
59
- await drive.blobs.core.append(await prod.blobs.core.get(drive.blobs.core.length))
60
- console.log('Copied blob blocks', drive.blobs.core.length, '/', prod.blobs.core.length)
84
+ while (to.blobs.core.length < prod.blobs.core.length) {
85
+ await to.blobs.core.append(await prod.blobs.core.get(to.blobs.core.length))
86
+ console.log('Copied blob blocks', to.blobs.core.length, '/', prod.blobs.core.length)
61
87
  }
62
88
  console.log('Done!')
63
89
  console.log()
64
- }
65
90
 
66
- const co = stage.checkout(STAGE_CHECKOUT)
67
- await co.ready()
68
-
69
- let n = 0
70
-
71
- console.log('Checking diff')
72
- for await (const data of co.mirror(drive, { dryRun: true, batch: true })) print(data)
73
- if (!n) console.log('(Empty)')
74
- console.log('Done!')
75
- console.log()
76
-
77
- const pkg = JSON.parse(await co.get('/package.json'))
78
- console.log('Total changes', n)
79
- console.log('Package version:', pkg.version)
80
- console.log()
81
-
82
- console.log('Core:')
83
- console.log(drive.core.id, drive.core.length)
84
- console.log(id.encode(await drive.core.treeHash()))
85
- console.log()
86
- console.log('Blobs:')
87
- console.log(drive.blobs.core.id, drive.blobs.core.length)
88
- console.log(id.encode(await drive.blobs.core.treeHash()))
89
- console.log()
90
-
91
- if (DRY_RUN) {
92
- console.log('Exiting due to dry run...')
93
- await swarm.destroy()
94
- process.exit(0)
95
- }
96
-
97
- if (!/^\d+\.\d+\.\d+$/.test(pkg.version)) {
98
- console.log('Version does not look like a release version to for dry-running...')
99
- await swarm.destroy()
100
- process.exit(0)
101
- }
91
+ const co = from.checkout(FROM.drive.length || from.core.length)
92
+ await co.ready()
102
93
 
103
- console.log('NOT A DRY RUN! Waiting 10s in case you wanna bail...')
104
- await new Promise(resolve => setTimeout(resolve, 10_000))
105
- console.log('OK THEN! Staging...')
94
+ let n = 0
106
95
 
107
- console.log()
108
- for await (const data of co.mirror(drive, { batch: true })) print(data)
109
- if (!n) console.log('(Empty)')
110
- console.log()
96
+ console.log('Checking diff')
97
+ for await (const data of co.mirror(to, { dryRun: true, batch: true })) print(data)
98
+ if (!n) console.log('(Empty)')
99
+ console.log('Done!')
100
+ console.log()
111
101
 
112
- // skipping release as thats non sensical
113
- const keys = ['manifest', 'metadata', 'channel', 'platformVersion', 'warmup']
102
+ const pkg = JSON.parse(await co.get('/package.json'))
103
+ console.log('Total changes', n)
104
+ console.log('Package version:', pkg.version)
105
+ console.log()
114
106
 
115
- for (const k of keys) {
116
- const from = await co.db.get(k)
117
- const to = await drive.db.get(k)
107
+ console.log('Core:')
108
+ console.log(to.core.id, to.core.length)
109
+ console.log(id.encode(await to.core.treeHash()))
110
+ console.log()
111
+ console.log('Blobs:')
112
+ console.log(to.blobs.core.id, to.blobs.core.length)
113
+ console.log(id.encode(await to.blobs.core.treeHash()))
114
+ console.log()
118
115
 
119
- if (!from && !to) {
120
- continue
116
+ if (DRY_RUN) {
117
+ console.log('Exiting due to dry run...')
118
+ await swarm.destroy()
119
+ exit(0)
121
120
  }
122
121
 
123
- if (!from && to) {
124
- console.log('Dropping pear setting', k)
125
- await drive.db.del(k)
126
- continue
122
+ if (!/^\d+\.\d+\.\d+$/.test(pkg.version)) {
123
+ console.log('Version does not look like a release version to for dry-running...')
124
+ await swarm.destroy()
125
+ exit(0)
127
126
  }
128
127
 
129
- if ((from && !to) || (JSON.stringify(from.value) !== JSON.stringify(to.value))) {
130
- console.log('Updating pear setting', k)
131
- await drive.db.put(k, from.value)
128
+ console.log('NOT A DRY RUN! Waiting 10s in case you wanna bail...')
129
+ await new Promise(resolve => setTimeout(resolve, 10_000))
130
+ console.log('OK THEN! Staging...')
131
+
132
+ console.log()
133
+ for await (const data of co.mirror(to, { batch: true })) print(data)
134
+ if (!n) console.log('(Empty)')
135
+ console.log()
136
+
137
+ // skipping release as thats non sensical
138
+ const keys = ['manifest', 'metadata', 'channel', 'platformVersion', 'warmup']
139
+
140
+ for (const k of keys) {
141
+ const src = await co.db.get(k)
142
+ const dst = await to.db.get(k)
143
+
144
+ if (!src && !dst) {
145
+ continue
146
+ }
147
+
148
+ if (!src && dst) {
149
+ console.log('Dropping pear setting', k)
150
+ await dst.db.del(k)
151
+ continue
152
+ }
153
+
154
+ if ((src && !dst) || (JSON.stringify(src.value) !== JSON.stringify(dst.value))) {
155
+ console.log('Updating pear setting', k)
156
+ await to.db.put(k, src.value)
157
+ }
132
158
  }
133
- }
134
159
 
135
- if (await drive.db.get('release')) {
136
- console.log('Dropping release from target...')
137
- await drive.db.del('release')
138
- }
160
+ if (await to.db.get('release')) {
161
+ console.log('Dropping release from target...')
162
+ await to.db.del('release')
163
+ }
139
164
 
140
- console.log('Done!')
141
- console.log(drive.core)
142
- console.log()
143
- console.log('Swarming until you exit...')
165
+ console.log('Done!')
166
+ console.log(to.core)
167
+ console.log()
168
+ console.log('Swarming until you exit...')
144
169
 
145
- let timeout = setTimeout(teardown, 15_000)
146
- const blobs = await drive.getBlobs()
170
+ let timeout = setTimeout(teardown, 15_000)
171
+ const blobs = await to.getBlobs()
147
172
 
148
- drive.core.on('upload', function () {
149
- clearTimeout(timeout)
150
- timeout = setTimeout(teardown, 15_000)
151
- })
173
+ to.core.on('upload', function () {
174
+ clearTimeout(timeout)
175
+ timeout = setTimeout(teardown, 15_000)
176
+ })
152
177
 
153
- blobs.core.on('upload', function () {
154
- clearTimeout(timeout)
155
- timeout = setTimeout(teardown, 15_000)
156
- })
178
+ blobs.core.on('upload', function () {
179
+ clearTimeout(timeout)
180
+ timeout = setTimeout(teardown, 15_000)
181
+ })
157
182
 
158
- function print (data) {
159
- n++
160
- console.log(data.op === 'add' ? '+' : data.op === 'remove' ? '-' : '~', data.key, [data.bytesAdded, -data.bytesRemoved])
161
- }
183
+ function print (data) {
184
+ n++
185
+ console.log(data.op === 'add' ? '+' : data.op === 'remove' ? '-' : '~', data.key, [data.bytesAdded, -data.bytesRemoved])
186
+ }
162
187
 
163
- async function teardown () {
164
- console.log('Shutting down due to inactivity...')
165
- await swarm.destroy()
166
- await drive.close()
188
+ async function teardown () {
189
+ console.log('Shutting down due to inactivity...')
190
+ await swarm.destroy()
191
+ await to.close()
192
+ }
167
193
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pear-prerelease",
3
- "version": "2.0.6",
3
+ "version": "3.1.0",
4
4
  "description": "Proper prerelease flows with pear",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -11,7 +11,9 @@
11
11
  "corestore": "^7.5.0",
12
12
  "hypercore-id-encoding": "^1.3.0",
13
13
  "hyperdrive": "^13.0.2",
14
- "hyperswarm": "^4.14.2"
14
+ "hyperswarm": "^4.14.2",
15
+ "paparam": "^1.9.0",
16
+ "pear-link": "^4.2.1"
15
17
  },
16
18
  "repository": {
17
19
  "type": "git",