pear-prerelease 2.0.5 → 3.0.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 +159 -133
  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('--touch'),
16
+ flag('--storage,-s <storage>')
17
+ ).parse()
18
+
19
+ const exit = global.Bare ? Bare.exit.bind(Bare) : process.exit.bind(process)
20
+ if (!app) exit(0)
21
+
22
+ const DRY_RUN = app.flags.dryRun
23
+ const FROM = app.flags.from ? pearLink.parse(app.flags.from) : null
24
+ const TO = app.flags.to ? pearLink.parse(app.flags.to) : null
25
+ const PROD = app.flags.production ? pearLink.parse(app.flags.production) : null
26
+
27
+ const store = new Corestore(app.flags.storage || './corestore')
28
+
29
+ if (app.flags.touch) {
30
+ const core = store.get({ name: Math.random() + '.' + Date.now() })
31
+ await core.ready()
32
+ console.log('pear://' + core.id)
33
+ await core.close()
34
+ }
7
35
 
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]
13
-
14
- const store = new Corestore('./corestore')
15
- const swarm = new Hyperswarm({
16
- keyPair: await store.createKeyPair('hyperswarm')
17
- })
18
-
19
- const drive = new Hyperdrive(store.namespace('release'), { compat: false })
20
- await drive.ready()
21
-
22
- const prod = PROD_KEY ? new Hyperdrive(store.namespace('prod'), PROD_KEY) : null
23
- if (prod) await prod.ready()
24
-
25
- const stage = new Hyperdrive(store.session(), STAGE_KEY)
26
- await stage.ready()
27
-
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
- })
36
+ if (FROM && TO) {
37
+ const swarm = new Hyperswarm({
38
+ keyPair: await store.createKeyPair('hyperswarm')
39
+ })
40
+
41
+ swarm.on('connection', c => store.replicate(c))
42
+
43
+ const to = new Hyperdrive(store.namespace('release'), TO.drive.key, { compat: false })
44
+ await to.ready()
45
+
46
+ const prod = PROD ? new Hyperdrive(store.namespace('prod'), PROD.drive.key) : null
47
+ if (prod) await prod.ready()
48
+
49
+ const from = new Hyperdrive(store.session(), FROM.drive.key)
50
+ await from.ready()
51
+
52
+ swarm.join(to.discoveryKey, {
53
+ client: true,
54
+ server: true
55
+ })
56
+ swarm.join(from.discoveryKey, {
57
+ client: true,
58
+ server: false
59
+ })
60
+
61
+ if (prod) {
62
+ // hydrate prod target
63
+ if (prod.core.length === 0) {
64
+ await new Promise(resolve => prod.core.once('append', () => resolve()))
65
+ }
66
+
67
+ prod.core.download()
68
+
69
+ console.log('Copying in existing metadata data, might take a bit...')
70
+ while (to.core.length < prod.core.length) {
71
+ await to.core.append(await prod.core.get(to.core.length))
72
+ console.log('Copied blocks', to.core.length, '/', prod.core.length)
73
+ }
74
+ console.log('Done!')
75
+ console.log()
76
+
77
+ await to.getBlobs()
78
+ await prod.getBlobs()
79
+
80
+ prod.blobs.core.download()
81
+
82
+ console.log('Copying in existing blob data, might take a bit...')
83
+ while (to.blobs.core.length < prod.blobs.core.length) {
84
+ await to.blobs.core.append(await prod.blobs.core.get(to.blobs.core.length))
85
+ console.log('Copied blob blocks', to.blobs.core.length, '/', prod.blobs.core.length)
86
+ }
87
+ console.log('Done!')
88
+ console.log()
89
+ }
37
90
 
38
- if (prod) {
39
- // hydrate prod target
40
- if (prod.core.length === 0) await new Promise(resolve => prod.core.once('append', () => resolve()))
91
+ const co = from.checkout(FROM.drive.length || from.core.length)
92
+ await co.ready()
41
93
 
42
- prod.core.download()
94
+ let n = 0
43
95
 
44
- 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)
48
- }
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)')
49
99
  console.log('Done!')
50
100
  console.log()
51
101
 
52
- await drive.getBlobs()
53
- await prod.getBlobs()
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()
54
106
 
55
- prod.blobs.core.download()
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()
56
115
 
57
- 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)
116
+ if (DRY_RUN) {
117
+ console.log('Exiting due to dry run...')
118
+ await swarm.destroy()
119
+ exit(0)
61
120
  }
62
- console.log('Done!')
63
- console.log()
64
- }
65
121
 
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
- }
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)
126
+ }
96
127
 
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
- }
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...')
102
131
 
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...')
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()
106
136
 
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()
137
+ // skipping release as thats non sensical
138
+ const keys = ['manifest', 'metadata', 'channel', 'platformVersion', 'warmup']
111
139
 
112
- // skipping release as thats non sensical
113
- const keys = ['metadata', 'channel', 'platformVersion', 'warmup']
140
+ for (const k of keys) {
141
+ const src = await co.db.get(k)
142
+ const dst = await to.db.get(k)
114
143
 
115
- for (const k of keys) {
116
- const from = await co.db.get(k)
117
- const to = await drive.db.get(k)
144
+ if (!src && !dst) {
145
+ continue
146
+ }
118
147
 
119
- if (!from && !to) {
120
- continue
121
- }
148
+ if (!src && dst) {
149
+ console.log('Dropping pear setting', k)
150
+ await dst.db.del(k)
151
+ continue
152
+ }
122
153
 
123
- if (!from && to) {
124
- console.log('Dropping pear setting', k)
125
- await drive.db.del(k)
126
- continue
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
+ }
127
158
  }
128
159
 
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)
160
+ if (await to.db.get('release')) {
161
+ console.log('Dropping release from target...')
162
+ await to.db.del('release')
132
163
  }
133
- }
134
164
 
135
- if (await drive.db.get('release')) {
136
- console.log('Dropping release from target...')
137
- await drive.db.del('release')
138
- }
139
-
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.5",
3
+ "version": "3.0.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",